From b449e0827b26671409f5cd5173041f66ecd48bab Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 11 Feb 2016 18:21:56 +0100 Subject: [PATCH 001/232] Init new process gain with curve --- rtdata/languages/default | 6 +++- rtengine/curves.cc | 33 ++++++++++++++++++ rtengine/curves.h | 24 +++++++++++++ rtengine/imagesource.h | 6 ++-- rtengine/improccoordinator.cc | 7 ++-- rtengine/improccoordinator.h | 1 + rtengine/ipretinex.cc | 63 +++++++++++++++++++++++++++++---- rtengine/procevents.h | 1 + rtengine/procparams.cc | 38 +++++++++++++++++++- rtengine/procparams.h | 6 +++- rtengine/rawimagesource.cc | 10 +++--- rtengine/rawimagesource.h | 6 ++-- rtengine/refreshmap.cc | 4 ++- rtengine/simpleprocess.cc | 5 +-- rtgui/paramsedited.cc | 6 ++++ rtgui/paramsedited.h | 1 + rtgui/retinex.cc | 66 +++++++++++++++++++++++++++-------- rtgui/retinex.h | 3 ++ 18 files changed, 244 insertions(+), 42 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 6bedd3443..ae3a81050 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -670,6 +670,7 @@ HISTORY_MSG_436;Retinex - M - Radius HISTORY_MSG_437;Retinex - M - Method HISTORY_MSG_438;Retinex - M - Equalizer HISTORY_MSG_439;Retinex - Preview +HISTORY_MSG_440;Retinex - Gain transmission HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1667,6 +1668,7 @@ TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gau TP_RETINEX_FREEGAMMA;Free gamma TP_RETINEX_GAIN;Gain TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. +TP_RETINEX_GAINOFFS;Gain and Brightness (offset) TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free TP_RETINEX_GAMMA_HIGH;High @@ -1705,7 +1707,7 @@ TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Reset TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -TP_RETINEX_OFFSET;Brightness +TP_RETINEX_OFFSET;Brightness (offset) TP_RETINEX_SCALES;Gaussian gradient TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. TP_RETINEX_SETTINGS;Settings @@ -1717,6 +1719,8 @@ TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. TP_RETINEX_TRANSMISSION;Transmission map +TP_RETINEX_GAINTRANSMISSION;Gain transmission +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplfy or reduce transmission-map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate : gain TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. TP_RETINEX_UNIFORM;Uniform TP_RETINEX_VARIANCE;Contrast diff --git a/rtengine/curves.cc b/rtengine/curves.cc index d0b4c026f..a0ac2c381 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1429,6 +1429,39 @@ void RetinextransmissionCurve::Set(const std::vector &curvePoints) } } + +RetinexgaintransmissionCurve::RetinexgaintransmissionCurve() {}; + +void RetinexgaintransmissionCurve::Reset() +{ + lutgaintransmission.reset(); +} + +void RetinexgaintransmissionCurve::Set(const Curve &pCurve) +{ + if (pCurve.isIdentity()) { + lutgaintransmission.reset(); // raise this value if the quality suffers from this number of samples + return; + } + + lutgaintransmission(501); // raise this value if the quality suffers from this number of samples + + for (int i = 0; i < 501; i++) { + lutgaintransmission[i] = pCurve.getVal(double(i) / 500.); + } +} + +void RetinexgaintransmissionCurve::Set(const std::vector &curvePoints) +{ + if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { + FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve.setIdentityValue(0.); + Set(tcurve); + } else { + Reset(); + } +} + void ToneCurve::Reset() { lutToneCurve.reset(); diff --git a/rtengine/curves.h b/rtengine/curves.h index e55d7bc2a..330b5c5ce 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -454,6 +454,30 @@ public: } }; +class RetinexgaintransmissionCurve +{ +private: + LUTf lutgaintransmission; // 0xffff range + void Set(const Curve &pCurve); + +public: + virtual ~RetinexgaintransmissionCurve() {}; + RetinexgaintransmissionCurve(); + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutgaintransmission[index]; + } + + operator bool (void) const + { + return lutgaintransmission; + } +}; + class ToneCurve diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 80fc53f23..905c8c50e 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -69,14 +69,14 @@ public: virtual int load (Glib::ustring fname, bool batch = false) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) {}; virtual void demosaic (const RAWParams &raw) {}; - virtual void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, 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 (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; + virtual void retinex (ColorManagementParams cmp, RetinexParams deh, 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 (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; virtual void HLRecovery_Global (ToneCurveParams hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; - virtual void MSR(LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; + virtual void MSR(LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; virtual bool IsrgbSourceModified() = 0; // tracks whether cached rgb output of demosaic has been modified diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ee75e831a..d24427be9 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -242,16 +242,16 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } } - if ((todo & (M_RETINEX|M_INIT)) && params.retinex.enabled) { + if ((todo & (M_RETINEX | M_INIT)) && params.retinex.enabled) { bool dehacontlutili = false; bool mapcontlutili = false; bool useHsl = false; LUTf cdcurve (65536, 0); LUTf mapcurve (65536, 0); - imgsrc->retinexPrepareCurves(params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehacontlutili, mapcontlutili, useHsl, lhist16RETI, histLRETI); + imgsrc->retinexPrepareCurves(params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, lhist16RETI, histLRETI); float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; - imgsrc->retinex( params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, histLRETI);//enabled Retinex + imgsrc->retinex( params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, histLRETI);//enabled Retinex if(dehaListener) { dehaListener->minmaxChanged(maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); @@ -782,6 +782,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } } } + // Update the monitor color transform if necessary if (todo & M_MONITOR) { ipf.updateColorProfiles(params.icm, monitorProfile, monitorIntent); diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 4d442482e..6a6c203d2 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -136,6 +136,7 @@ protected: WavOpacityCurveW waOpacityCurveW; WavOpacityCurveWL waOpacityCurveWL; RetinextransmissionCurve dehatransmissionCurve; + RetinexgaintransmissionCurve dehagaintransmissionCurve; ColorAppearance customColCurve1; ColorAppearance customColCurve2; diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 090841a9e..d3d276c43 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -45,7 +45,6 @@ #include "rawimagesource.h" #include "improcfun.h" #include "opthelper.h" -#define BENCHMARK #include "StopWatch.h" #define MAX_RETINEX_SCALES 8 @@ -207,9 +206,8 @@ void mean_stddv( float **dst, float &mean, float &stddv, int W_L, int H_L, const stddv = (float)sqrt(stddv); } -void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) +void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { - BENCHFUN if (deh.enabled) {//enabled float mean, stddv, maxtr, mintr; @@ -733,7 +731,8 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e delta = 1.0f; } - float cdfactor = gain2 * 32768.f / delta; + // float cdfactor = gain2 * 32768.f / delta; + float cdfactor = 32768.f / delta; maxCD = -9999999.f; minCD = 9999999.f; // coeff for auto "transmission" with 2 sigma #95% datas @@ -742,22 +741,72 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float bza = 16300.f / (2.f * stddv); float bzb = 16300.f - bza * (mean); +//prepare work for curve gain +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < H_L; i++) { + for (int j = 0; j < W_L; j++) { + luminance[i][j] = luminance[i][j] - mini; + } + } + + mean = 0.f; + stddv = 0.f; + // I call mean_stddv2 instead of mean_stddv ==> logBetaGain + + mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr); + float asig, bsig, amax, bmax, amin, bmin; + + if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve + asig = 0.166666f / stddv; + bsig = 0.5f - asig * mean; + amax = 0.333333f / (maxtr - mean - stddv); + bmax = 1.f - amax * maxtr; + amin = 0.333333f / (mean - stddv - mintr); + bmin = -amin * mintr; + + asig *= 500.f; + bsig *= 500.f; + amax *= 500.f; + bmax *= 500.f; + amin *= 500.f; + bmin *= 500.f; + } #ifdef _OPENMP #pragma omp parallel #endif { + float absciss; float cdmax = -999999.f, cdmin = 999999.f; - #ifdef _OPENMP #pragma omp for #endif for ( int i = 0; i < H_L; i ++ ) for (int j = 0; j < W_L; j++) { - //float cd = cdfactor * ( luminance[i][j] * logBetaGain - mini ) + offse; - float cd = cdfactor * ( luminance[i][j] - mini ) + offse; + float gan; + + if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { + + if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { + absciss = asig * luminance[i][j] + bsig; + } else if (luminance[i][j] >= mean) { + absciss = amax * luminance[i][j] + bmax; + } else { /*if(luminance[i][j] <= mean - stddv)*/ + absciss = amin * luminance[i][j] + bmin; + } + + + // float cd = cdfactor * ( luminance[i][j] - mini ) + offse; + gan = 2.f * (dehagaintransmissionCurve[absciss]); //new gain function transmission + } else { + gan = 0.5f; + } + + float cd = gan * cdfactor * ( luminance[i][j] ) + offse; if(cd > cdmax) { cdmax = cd; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 558f509c2..cd6fc2cb2 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -466,6 +466,7 @@ enum ProcEvent { EvmapMethod = 436, EvRetinexmapcurve = 437, EvviewMethod = 438, + EvRetinexgaintransmission = 439, NUMOFEVENTS }; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f79f51c91..988bd20dc 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -136,6 +136,23 @@ void RetinexParams::getDefaulttransmissionCurve(std::vector &curve) curve.at(i) = v[i - 1]; } } +void RetinexParams::getDefaultgaintransmissionCurve(std::vector &curve) +{ + double v[16] = { 0.00, 0.1, 0.35, 0.00, + 0.25, 0.25, 0.35, 0.35, + 0.70, 0.25, 0.35, 0.35, + 1.00, 0.1, 0.00, 0.00 + }; + + + curve.resize(17); + curve.at(0 ) = double(FCT_MinMaxCPoints); + + for (size_t i = 1; i < curve.size(); ++i) { + curve.at(i) = v[i - 1]; + } +} + void RetinexParams::setDefaults() { @@ -175,13 +192,16 @@ void RetinexParams::setDefaults() lhcurve.push_back(DCT_Linear); mapcurve.clear(); mapcurve.push_back(DCT_Linear); + getDefaultgaintransmissionCurve(gaintransmissionCurve); getDefaulttransmissionCurve(transmissionCurve); } -void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT) const +void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const { transmissionCurveLUT.Set(this->transmissionCurve); + gaintransmissionCurveLUT.Set(this->gaintransmissionCurve); + } @@ -1585,6 +1605,11 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol keyFile.set_double_list("Retinex", "TransmissionCurve", transmissionCurve); } + if (!pedited || pedited->retinex.gaintransmissionCurve) { + Glib::ArrayHandle gaintransmissionCurve = retinex.gaintransmissionCurve; + keyFile.set_double_list("Retinex", "GainTransmissionCurve", gaintransmissionCurve); + } + // save channel mixer if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); @@ -4129,6 +4154,16 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) pedited->retinex.transmissionCurve = true; } } + + + if (keyFile.has_key ("Retinex", "GainTransmissionCurve")) { + retinex.gaintransmissionCurve = keyFile.get_double_list ("Retinex", "GainTransmissionCurve"); + + if (pedited) { + pedited->retinex.gaintransmissionCurve = true; + } + } + } @@ -7514,6 +7549,7 @@ bool ProcParams::operator== (const ProcParams& other) && retinex.cdHcurve == other.retinex.cdHcurve && retinex.lhcurve == other.retinex.lhcurve && retinex.transmissionCurve == other.retinex.transmissionCurve + && retinex.gaintransmissionCurve == other.retinex.gaintransmissionCurve && retinex.str == other.retinex.str && retinex.scal == other.retinex.scal && retinex.iter == other.retinex.iter diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 47b8f1cf1..0b45e7d7a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -41,6 +41,7 @@ class WavOpacityCurveBY; class WavOpacityCurveW; class WavOpacityCurveWL; class RetinextransmissionCurve; +class RetinexgaintransmissionCurve; enum RenderingIntent { RI_PERCEPTUAL = INTENT_PERCEPTUAL, @@ -282,6 +283,7 @@ public: std::vector cdHcurve; std::vector lhcurve; std::vector transmissionCurve; + std::vector gaintransmissionCurve; std::vector mapcurve; int str; int scal; @@ -312,7 +314,9 @@ public: bool medianmap; RetinexParams (); void setDefaults(); - void getCurves(RetinextransmissionCurve &transmissionCurveLUT) const; + void getCurves(RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const; + + static void getDefaultgaintransmissionCurve(std::vector &curve); static void getDefaulttransmissionCurve(std::vector &curve); }; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d1d4da54f..2251c15dd 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1422,6 +1422,7 @@ SSEFUNCTION int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thres } #else + // 25 fabs function calls and 25 float additions without SSE for (int mm = rr - 2; mm <= rr + 2; mm++) { for (int nn = cc - 2; nn <= cc + 2; nn++) { @@ -2216,7 +2217,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar } -void RawImageSource::retinexPrepareCurves(RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) +void RawImageSource::retinexPrepareCurves(RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) { useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); @@ -2228,11 +2229,10 @@ void RawImageSource::retinexPrepareCurves(RetinexParams retinexParams, LUTf &cdc CurveFactory::mapcurve (mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); - retinexParams.getCurves(retinextransmissionCurve); + retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } -//void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, const RetinextransmissionCurve & dehatransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) -void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, 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) +void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, 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) { MyTime t4, t5; @@ -2384,7 +2384,7 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC } } - MSR(LBuffer, conversionBuffer[2], conversionBuffer[3], mapcurve, mapcontlutili, WNew, HNew, deh, dehatransmissionCurve, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); + 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) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index bef4ad4e2..0f4ca2402 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -118,8 +118,8 @@ public: int load (Glib::ustring fname, bool batch = false); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse); void demosaic (const RAWParams &raw); - void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, 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); - void retinexPrepareCurves (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); + void retinex (ColorManagementParams cmp, RetinexParams deh, 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); + void retinexPrepareCurves (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); void retinexPrepareBuffers (ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); void flushRGB (); @@ -196,7 +196,7 @@ public: void boxblur2(float** src, float** dst, float** temp, int H, int W, int box ); void boxblur_resamp(float **src, float **dst, float** temp, int H, int W, int box, int samp ); - void MSR(float** luminance, float **originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); + void MSR(float** luminance, float **originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); void HLRecovery_inpaint (float** red, float** green, float** blue); static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); static void HLRecovery_CIELab (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval, double cam[3][3], double icam[3][3]); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 6a2925be9..10f911529 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -465,6 +465,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RETINEX, // EvLradius RETINEX, // EvmapMethod DEMOSAIC, // EvRetinexmapcurve - DEMOSAIC // EvviewMethod + DEMOSAIC, // EvviewMethod + RETINEX // EvRetinexgaintransmission + }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 9ae940980..9916c9f38 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -129,15 +129,16 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p LUTf mapcurve (65536, 0); LUTu dummy; RetinextransmissionCurve dehatransmissionCurve; + RetinexgaintransmissionCurve dehagaintransmissionCurve; bool dehacontlutili = false; 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, dehacontlutili, mapcontlutili, useHsl, dummy, 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, 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) { diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 062c61ba2..1183b8260 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -76,6 +76,7 @@ void ParamsEdited::set (bool v) // retinex.grbl = v; retinex.medianmap = v; retinex.transmissionCurve = v; + retinex.gaintransmissionCurve = v; retinex.highlights = v; retinex.htonalwidth = v; retinex.shadows = v; @@ -544,6 +545,7 @@ void ParamsEdited::initFrom (const std::vector retinex.cdHcurve = retinex.cdHcurve && p.retinex.cdHcurve == other.retinex.cdHcurve; retinex.lhcurve = retinex.lhcurve && p.retinex.lhcurve == other.retinex.lhcurve; retinex.transmissionCurve = retinex.transmissionCurve && p.retinex.transmissionCurve == other.retinex.transmissionCurve; + retinex.gaintransmissionCurve = retinex.gaintransmissionCurve && p.retinex.gaintransmissionCurve == other.retinex.gaintransmissionCurve; retinex.retinexMethod = retinex.retinexMethod && p.retinex.retinexMethod == other.retinex.retinexMethod; retinex.mapMethod = retinex.mapMethod && p.retinex.mapMethod == other.retinex.mapMethod; retinex.viewMethod = retinex.viewMethod && p.retinex.viewMethod == other.retinex.viewMethod; @@ -1088,6 +1090,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.retinex.transmissionCurve = mods.retinex.transmissionCurve; } + if (retinex.gaintransmissionCurve) { + toEdit.retinex.gaintransmissionCurve = mods.retinex.gaintransmissionCurve; + } + if (retinex.retinexMethod) { toEdit.retinex.retinexMethod = mods.retinex.retinexMethod; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 261da1753..8e21ef5ad 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -81,6 +81,7 @@ public: // bool grbl; bool method; bool transmissionCurve; + bool gaintransmissionCurve; bool cdcurve; bool mapcurve; bool cdHcurve; diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index 561a28edf..bad21cfe7 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -161,7 +161,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), grad = Gtk::manage (new Adjuster (M("TP_RETINEX_GRAD"), -2., 2., 1., 1.)); grads = Gtk::manage (new Adjuster (M("TP_RETINEX_GRADS"), -2., 2., 1., 1.)); gain = Gtk::manage (new Adjuster (M("TP_RETINEX_GAIN"), 20, 200, 1, 50)); - offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -10000, 10000, 1, 0)); + offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -1000, 5000, 1, 0)); // vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125)); limd = Gtk::manage (new Adjuster (M("TP_RETINEX_THRESHOLD"), 2, 100, 1, 8)); baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1.1, 100., 0.001, 2.718)); @@ -175,6 +175,21 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), limd->set_tooltip_markup (M("TP_RETINEX_THRESHOLD_TOOLTIP")); baselog->set_tooltip_markup (M("TP_RETINEX_BASELOG_TOOLTIP")); + // Gain Transmission map curve + gaintransmissionCurve = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_GAINTRANSMISSION")); + gaintransmissionCurve->setCurveListener (this); + +// std::vector defaultCurve; + rtengine::RetinexParams::getDefaultgaintransmissionCurve(defaultCurve); + gaintransmissionShape = static_cast(gaintransmissionCurve->addCurve(CT_Flat, "", NULL, false)); + gaintransmissionShape->setIdentityValue(0.); + gaintransmissionShape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + gaintransmissionShape->setBottomBarBgGradient(milestones); + gaintransmissionCurve->set_tooltip_markup (M("TP_RETINEX_GAINTRANSMISSION_TOOLTIP")); + + gaintransmissionCurve->curveListComplete(); + + Gtk::Frame *p1Frame; p1Frame = Gtk::manage (new Gtk::Frame(M("TP_RETINEX_LABEL_MASK")) ); p1Frame->set_border_width(0); @@ -285,19 +300,34 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), settingsVBox->pack_start (*grads); grads->show (); - settingsVBox->pack_start (*gain); - gain->show (); - - settingsVBox->pack_start (*offs); - offs->show (); - -// settingsVBox->pack_start (*vart); -// vart->show (); - settingsVBox->pack_start (*limd); limd->show (); - // settingsVBox->pack_start (*Gtk::manage (new Gtk::HSeparator())); + settingsVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2); + transmissionCurveEditorG->show(); + + settingsVBox->pack_start (*medianmap); + medianmap->show (); + + // settingsVBox->pack_start (*gain); + // gain->show (); + + +// settingsVBox->pack_start (*vart); +// vart->show (); + Gtk::VBox *gainBox = Gtk::manage (new Gtk::VBox()); + + Gtk::HSeparator *separator = Gtk::manage (new Gtk::HSeparator()); + settingsVBox->pack_start(*separator, Gtk::PACK_SHRINK, 2); + gainFrame = Gtk::manage (new Gtk::Frame(M("TP_RETINEX_GAINOFFS"))); + + gainBox->pack_start( *gaintransmissionCurve, Gtk::PACK_SHRINK, 2); + gaintransmissionCurve->show(); + + gainBox->pack_start (*offs); + offs->show (); + gainFrame->add(*gainBox); + settingsVBox->pack_start (*gainFrame); viewbox->pack_start(*viewMethod); // settingsVBox->pack_start(*viewbox); @@ -334,11 +364,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), // grbl->show (); // settingsVBox->pack_start (*Gtk::manage (new Gtk::HSeparator())); - settingsVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2); - transmissionCurveEditorG->show(); - settingsVBox->pack_start (*medianmap); - medianmap->show (); expsettings->add(*settingsVBox); neutrHBox = Gtk::manage (new Gtk::HBox ()); @@ -495,6 +521,7 @@ Retinex::~Retinex() delete curveEditorGD; delete curveEditorGDH; delete transmissionCurveEditorG; + delete gaintransmissionCurve; delete curveEditorGH; delete curveEditormap; @@ -526,6 +553,7 @@ void Retinex::neutral_pressed () retinexcolorspace->set_active(0); gammaretinex->set_active(0); transmissionShape->reset(); + gaintransmissionShape->reset(); cdshape->reset(); cdshapeH->reset(); lhshape->reset(); @@ -690,6 +718,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) cdshape->setUnChanged (!pedited->retinex.cdcurve); cdshapeH->setUnChanged (!pedited->retinex.cdHcurve); transmissionShape->setUnChanged (!pedited->retinex.transmissionCurve); + gaintransmissionShape->setUnChanged (!pedited->retinex.gaintransmissionCurve); lhshape->setUnChanged (!pedited->retinex.lhcurve); mapshape->setUnChanged (!pedited->retinex.mapcurve); @@ -810,6 +839,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) mapMethodConn.block(false); viewMethodConn.block(false); transmissionShape->setCurve (pp->retinex.transmissionCurve); + gaintransmissionShape->setCurve (pp->retinex.gaintransmissionCurve); enableListener (); @@ -840,6 +870,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) pp->retinex.cdHcurve = cdshapeH->getCurve (); pp->retinex.mapcurve = mapshape->getCurve (); pp->retinex.transmissionCurve = transmissionShape->getCurve (); + pp->retinex.gaintransmissionCurve = gaintransmissionShape->getCurve (); pp->retinex.enabled = getEnabled(); pp->retinex.medianmap = medianmap->get_active(); @@ -875,6 +906,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) pedited->retinex.cdcurve = !cdshape->isUnChanged (); pedited->retinex.cdHcurve = !cdshapeH->isUnChanged (); pedited->retinex.transmissionCurve = !transmissionShape->isUnChanged (); + pedited->retinex.gaintransmissionCurve = !gaintransmissionShape->isUnChanged (); pedited->retinex.mapcurve = !mapshape->isUnChanged (); pedited->retinex.enabled = !get_inconsistent(); pedited->retinex.medianmap = !medianmap->get_inconsistent(); @@ -1275,6 +1307,7 @@ void Retinex::autoOpenCurve () cdshape->openIfNonlinear(); cdshapeH->openIfNonlinear(); transmissionShape->openIfNonlinear(); + gaintransmissionShape->openIfNonlinear(); lhshape->openIfNonlinear(); mapshape->openIfNonlinear(); @@ -1290,6 +1323,8 @@ void Retinex::curveChanged (CurveEditor* ce) listener->panelChanged (EvLCDHCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == transmissionShape) { listener->panelChanged (EvRetinextransmission, M("HISTORY_CUSTOMCURVE")); + } else if (ce == gaintransmissionShape) { + listener->panelChanged (EvRetinexgaintransmission, M("HISTORY_CUSTOMCURVE")); } else if (ce == lhshape) { listener->panelChanged (EvRetinexlhcurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == mapshape) { @@ -1415,6 +1450,7 @@ void Retinex::setBatchMode (bool batchMode) curveEditorGD->setBatchMode (batchMode); curveEditorGDH->setBatchMode (batchMode); transmissionCurveEditorG->setBatchMode (batchMode); + gaintransmissionCurve->setBatchMode (batchMode); curveEditorGH->setBatchMode (batchMode); curveEditormap->setBatchMode (batchMode); diff --git a/rtgui/retinex.h b/rtgui/retinex.h index d24254757..b8034ccb9 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -76,15 +76,18 @@ protected: Gtk::Label* mMLabels; Gtk::Label* transLabels; Gtk::Label* transLabels2; + Gtk::Frame *gainFrame; DiagonalCurveEditor* cdshape; DiagonalCurveEditor* cdshapeH; DiagonalCurveEditor* mapshape; CurveEditorGroup* transmissionCurveEditorG; + CurveEditorGroup* gaintransmissionCurve; sigc::connection retinexMethodConn, neutralconn, mapMethodConn, viewMethodConn; sigc::connection retinexColorSpaceConn; sigc::connection gammaretinexConn; FlatCurveEditor* transmissionShape; + FlatCurveEditor* gaintransmissionShape; FlatCurveEditor* lhshape; bool lastmedianmap; sigc::connection medianmapConn; From a21deef3deda7af52ca9546e0872bc4cd172ae2a Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 12 Feb 2016 12:51:46 +0100 Subject: [PATCH 002/232] GUI improvment and re-introduce scale --- rtdata/languages/default | 9 +++- rtengine/ipretinex.cc | 11 +++-- rtengine/procevents.h | 1 + rtengine/procparams.cc | 26 +++++------ rtengine/procparams.h | 2 +- rtengine/refreshmap.cc | 3 +- rtgui/paramsedited.cc | 10 ++--- rtgui/paramsedited.h | 2 +- rtgui/retinex.cc | 96 +++++++++++++++++++++++----------------- rtgui/retinex.h | 5 ++- 10 files changed, 98 insertions(+), 67 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ae3a81050..6c3561efb 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -671,6 +671,7 @@ HISTORY_MSG_437;Retinex - M - Method HISTORY_MSG_438;Retinex - M - Equalizer HISTORY_MSG_439;Retinex - Preview HISTORY_MSG_440;Retinex - Gain transmission +HISTORY_MSG_441;Retinex - Scale HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1665,10 +1666,11 @@ TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. TP_RETINEX_CURVEEDITOR_MAP;L=f(L) TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +TP_RETINEX_EQUAL;Equalizer TP_RETINEX_FREEGAMMA;Free gamma TP_RETINEX_GAIN;Gain TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. -TP_RETINEX_GAINOFFS;Gain and Brightness (offset) +TP_RETINEX_GAINOFFS;Gain and Offset (brightness) TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free TP_RETINEX_GAMMA_HIGH;High @@ -1686,6 +1688,7 @@ TP_RETINEX_HIGHLIGHT;Highlight threshold TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. TP_RETINEX_HSLSPACE_LIN;HSL-Linear TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic +TP_RETINEX_ITERF;Tone mapping TP_RETINEX_ITER;Iterations (Tone-mapping) TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. TP_RETINEX_LABEL;Retinex @@ -1707,17 +1710,19 @@ TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Reset TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -TP_RETINEX_OFFSET;Brightness (offset) +TP_RETINEX_OFFSET;Offset (brightness) TP_RETINEX_SCALES;Gaussian gradient TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. TP_RETINEX_SETTINGS;Settings TP_RETINEX_SLOPE;Free gamma slope +TP_RETINEX_SKAL;Scale TP_RETINEX_STRENGTH;Strength TP_RETINEX_THRESHOLD;Threshold TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +TP_RETINEX_TRANF;Transmission TP_RETINEX_TRANSMISSION;Transmission map TP_RETINEX_GAINTRANSMISSION;Gain transmission TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplfy or reduce transmission-map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate : gain diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index d3d276c43..bab98ef0c 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -236,6 +236,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e bool higplus = false ; float elogt; float hl = deh.baselog; + scal = deh.skal; if(hl >= 2.71828f) { elogt = 2.71828f + SQR(SQR(hl - 2.71828f)); @@ -292,11 +293,11 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float grads; float grad = 1.f; - float sc = 3.f; + float sc = scal; if(gradient == 0) { grad = 1.f; - sc = 3.f; + sc = scal;//3.f } else if(gradient == 1) { grad = 0.25f * it + 0.75f; sc = -0.5f * it + 4.5f; @@ -336,6 +337,10 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e sc = 3.f; } + if(iter == 1) { + sc = scal; + } + float varx; float limdx, ilimdx; @@ -396,7 +401,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } strengthx = ks * strength; - + //printf("scale=%d\n", scal); retinex_scales( RetinexScales, scal, moderetinex, nei / grad, high ); float *src[H_L] ALIGNED16; diff --git a/rtengine/procevents.h b/rtengine/procevents.h index cd6fc2cb2..2a12516ce 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -467,6 +467,7 @@ enum ProcEvent { EvRetinexmapcurve = 437, EvviewMethod = 438, EvRetinexgaintransmission = 439, + EvLskal = 440, NUMOFEVENTS }; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 988bd20dc..1252fc0b4 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -158,7 +158,7 @@ void RetinexParams::setDefaults() { enabled = false; str = 20; - scal = 3; + scal = 0; iter = 1; grad = 1; grads = 1; @@ -177,7 +177,7 @@ void RetinexParams::setDefaults() radius = 40; baselog = 2.71828; -// grbl = 50; + skal = 3; retinexMethod = "high"; mapMethod = "none"; viewMethod = "none"; @@ -1536,9 +1536,9 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol keyFile.set_double ("Retinex", "baselog", retinex.baselog); } -// if (!pedited || pedited->retinex.grbl) { -// keyFile.set_integer ("Retinex", "grbl", retinex.grbl); -// } + if (!pedited || pedited->retinex.skal) { + keyFile.set_integer ("Retinex", "skal", retinex.skal); + } if (!pedited || pedited->retinex.retinexMethod) { keyFile.set_string ("Retinex", "RetinexMethod", retinex.retinexMethod); @@ -4065,14 +4065,14 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) } } - /* if (keyFile.has_key ("Retinex", "grbl")) { - retinex.grbl = keyFile.get_integer ("Retinex", "grbl"); + if (keyFile.has_key ("Retinex", "skal")) { + retinex.skal = keyFile.get_integer ("Retinex", "skal"); + + if (pedited) { + pedited->retinex.skal = true; + } + } - if (pedited) { - pedited->retinex.grbl = true; - } - } - */ if (keyFile.has_key ("Retinex", "CDCurve")) { retinex.cdcurve = keyFile.get_double_list ("Retinex", "CDCurve"); @@ -7568,7 +7568,7 @@ bool ProcParams::operator== (const ProcParams& other) && retinex.radius == other.retinex.radius && retinex.baselog == other.retinex.baselog -// && retinex.grbl == other.retinex.grbl + && retinex.skal == other.retinex.skal && retinex.offs == other.retinex.offs && retinex.retinexMethod == other.retinex.retinexMethod && retinex.mapMethod == other.retinex.mapMethod diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 0b45e7d7a..f07de9523 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -310,7 +310,7 @@ public: int limd; int highl; double baselog; -// int grbl; + int skal; bool medianmap; RetinexParams (); void setDefaults(); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 10f911529..240c871b5 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -466,7 +466,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { RETINEX, // EvmapMethod DEMOSAIC, // EvRetinexmapcurve DEMOSAIC, // EvviewMethod - RETINEX // EvRetinexgaintransmission + RETINEX, // EvRetinexgaintransmission + RETINEX //EvLskal }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 1183b8260..5608590ca 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -73,7 +73,7 @@ void ParamsEdited::set (bool v) retinex.limd = v; retinex.highl = v; retinex.baselog = v; -// retinex.grbl = v; + retinex.skal = v; retinex.medianmap = v; retinex.transmissionCurve = v; retinex.gaintransmissionCurve = v; @@ -565,7 +565,7 @@ void ParamsEdited::initFrom (const std::vector retinex.limd = retinex.limd && p.retinex.limd == other.retinex.limd; retinex.highl = retinex.highl && p.retinex.highl == other.retinex.highl; retinex.baselog = retinex.baselog && p.retinex.baselog == other.retinex.baselog; -// retinex.grbl = retinex.grbl && p.retinex.grbl == other.retinex.grbl; + retinex.skal = retinex.skal && p.retinex.skal == other.retinex.skal; retinex.medianmap = retinex.medianmap && p.retinex.medianmap == other.retinex.medianmap; retinex.highlights = retinex.highlights && p.retinex.highlights == other.retinex.highlights; retinex.htonalwidth = retinex.htonalwidth && p.retinex.htonalwidth == other.retinex.htonalwidth; @@ -1166,9 +1166,9 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.retinex.baselog = mods.retinex.baselog; } -// if (retinex.grbl) { -// toEdit.retinex.grbl = mods.retinex.grbl; -// } + if (retinex.skal) { + toEdit.retinex.skal = mods.retinex.skal; + } if (retinex.gain) { toEdit.retinex.gain = dontforceSet && options.baBehav[ADDSET_RETI_GAIN] ? toEdit.retinex.gain + mods.retinex.gain : mods.retinex.gain; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 8e21ef5ad..3e2583bf2 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -78,7 +78,7 @@ public: bool limd; bool highl; bool baselog; -// bool grbl; + bool skal; bool method; bool transmissionCurve; bool gaintransmissionCurve; diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index bad21cfe7..b0db92448 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -54,6 +54,9 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), dhbox->pack_start(*retinexcolorspace); retinexVBox->pack_start(*dhbox); + Gtk::VBox *equalVBox = Gtk::manage (new Gtk::VBox()); + + equalFrame = Gtk::manage (new Gtk::Frame(M("TP_RETINEX_EQUAL"))); // Histogram equalizer Lab curve curveEditorGD = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_CONTEDIT_LAB")); @@ -164,8 +167,8 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -1000, 5000, 1, 0)); // vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125)); limd = Gtk::manage (new Adjuster (M("TP_RETINEX_THRESHOLD"), 2, 100, 1, 8)); - baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1.1, 100., 0.001, 2.718)); -// grbl = Gtk::manage (new Adjuster (M("TP_RETINEX_HIGHLIGHT3"), 1, 100, 1, 50)); + baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1., 10., 1., 3.)); + skal = Gtk::manage (new Adjuster (M("TP_RETINEX_SKAL"), 1, 10, 1, 3)); gain->set_tooltip_markup (M("TP_RETINEX_GAIN_TOOLTIP")); scal->set_tooltip_markup (M("TP_RETINEX_SCALES_TOOLTIP")); iter->set_tooltip_markup (M("TP_RETINEX_ITER_TOOLTIP")); @@ -267,54 +270,68 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), settingsVBox->pack_start (*transLabels2); transLabels2->show (); - settingsVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); + equalVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); curveEditorGD->show(); - settingsVBox->pack_start (*curveEditorGDH, Gtk::PACK_SHRINK, 4); + equalVBox->pack_start (*curveEditorGDH, Gtk::PACK_SHRINK, 4); curveEditorGDH->show(); - settingsVBox->pack_start (*curveEditorGH, Gtk::PACK_SHRINK, 4); + equalVBox->pack_start (*curveEditorGH, Gtk::PACK_SHRINK, 4); curveEditorGH->show(); gambox->pack_start(*gammaretinex); - settingsVBox->pack_start(*gambox); + equalVBox->pack_start(*gambox); gammaretinex->show(); - settingsVBox->pack_start (*gam); + equalVBox->pack_start (*gam); gam->show (); - settingsVBox->pack_start (*slope); + equalVBox->pack_start (*slope); slope->show (); + equalFrame->add(*equalVBox); + settingsVBox->pack_start (*equalFrame); - settingsVBox->pack_start (*iter); + + Gtk::VBox *iterVBox = Gtk::manage (new Gtk::VBox()); + + iterFrame = Gtk::manage (new Gtk::Frame(M("TP_RETINEX_ITERF"))); + + iterVBox->pack_start (*iter); iter->show (); - settingsVBox->pack_start (*scal); + iterVBox->pack_start (*scal); scal->show (); - settingsVBox->pack_start (*grad); + iterVBox->pack_start (*grad); grad->show (); - settingsVBox->pack_start (*grads); + iterVBox->pack_start (*grads); grads->show (); - settingsVBox->pack_start (*limd); - limd->show (); + iterFrame->add(*iterVBox); + settingsVBox->pack_start (*iterFrame); - settingsVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2); + Gtk::VBox *tranVBox = Gtk::manage (new Gtk::VBox()); + + tranFrame = Gtk::manage (new Gtk::Frame(M("TP_RETINEX_TRANF"))); + + tranVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2); transmissionCurveEditorG->show(); - settingsVBox->pack_start (*medianmap); + tranVBox->pack_start (*skal); + skal->show (); + + tranVBox->pack_start (*limd); + limd->show (); + + tranVBox->pack_start (*medianmap); medianmap->show (); - // settingsVBox->pack_start (*gain); - // gain->show (); + tranFrame->add(*tranVBox); + settingsVBox->pack_start (*tranFrame); - -// settingsVBox->pack_start (*vart); -// vart->show (); Gtk::VBox *gainBox = Gtk::manage (new Gtk::VBox()); Gtk::HSeparator *separator = Gtk::manage (new Gtk::HSeparator()); @@ -357,11 +374,9 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), // settingsVBox->pack_start (*highl); // highl->show (); -// settingsVBox->pack_start (*baselog); -// baselog->show (); +// settingsVBox->pack_start (*baselog); +// baselog->show (); -// settingsVBox->pack_start (*grbl); -// grbl->show (); // settingsVBox->pack_start (*Gtk::manage (new Gtk::HSeparator())); @@ -495,12 +510,12 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), s_tonalwidth->delay = 200; } - /* grbl->setAdjusterListener (this); + skal->setAdjusterListener (this); + + if (skal->delay < 200) { + skal->delay = 200; + } - if (grbl->delay < 200) { - grbl->delay = 200; - } - */ pack_start (*retinexVBox); p1Frame->add(*p1VBox); pack_start (*p1Frame, Gtk::PACK_EXPAND_WIDGET, 4); @@ -685,7 +700,7 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) limd->setEditedState (pedited->retinex.limd ? Edited : UnEdited); highl->setEditedState (pedited->retinex.highl ? Edited : UnEdited); baselog->setEditedState (pedited->retinex.baselog ? Edited : UnEdited); -// grbl->setEditedState (pedited->retinex.grbl ? Edited : UnEdited); + skal->setEditedState (pedited->retinex.skal ? Edited : UnEdited); set_inconsistent (multiImage && !pedited->retinex.enabled); medianmap->set_inconsistent (!pedited->retinex.medianmap); radius->setEditedState (pedited->retinex.radius ? Edited : UnEdited); @@ -745,7 +760,8 @@ void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited) shadows->setValue (pp->retinex.shadows); s_tonalwidth->setValue (pp->retinex.stonalwidth); -// grbl->setValue (pp->retinex.grbl); + skal->setValue (pp->retinex.skal); + if(pp->retinex.iter == 1) { grad->set_sensitive(false); scal->set_sensitive(false); @@ -864,7 +880,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) pp->retinex.limd = (int)limd->getValue (); pp->retinex.highl = (int)highl->getValue (); pp->retinex.baselog = baselog->getValue (); -// pp->retinex.grbl = (int)grbl->getValue (); + pp->retinex.skal = (int)skal->getValue (); pp->retinex.cdcurve = cdshape->getCurve (); pp->retinex.lhcurve = lhshape->getCurve (); pp->retinex.cdHcurve = cdshapeH->getCurve (); @@ -902,7 +918,7 @@ void Retinex::write (ProcParams* pp, ParamsEdited* pedited) pedited->retinex.limd = limd->getEditedState (); pedited->retinex.highl = highl->getEditedState (); pedited->retinex.baselog = baselog->getEditedState (); -// pedited->retinex.grbl = grbl->getEditedState (); + pedited->retinex.skal = skal->getEditedState (); pedited->retinex.cdcurve = !cdshape->isUnChanged (); pedited->retinex.cdHcurve = !cdshapeH->isUnChanged (); pedited->retinex.transmissionCurve = !transmissionShape->isUnChanged (); @@ -1164,7 +1180,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi limd->setDefault (defParams->retinex.limd); highl->setDefault (defParams->retinex.highl); baselog->setDefault (defParams->retinex.baselog); -// grbl->setDefault (defParams->retinex.grbl); + skal->setDefault (defParams->retinex.skal); gam->setDefault (defParams->retinex.gam); slope->setDefault (defParams->retinex.slope); @@ -1187,7 +1203,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi limd->setDefaultEditedState (pedited->retinex.limd ? Edited : UnEdited); highl->setDefaultEditedState (pedited->retinex.highl ? Edited : UnEdited); baselog->setDefaultEditedState (pedited->retinex.baselog ? Edited : UnEdited); -// grbl->setDefaultEditedState (pedited->retinex.grbl ? Edited : UnEdited); + skal->setDefaultEditedState (pedited->retinex.skal ? Edited : UnEdited); gam->setDefaultEditedState (pedited->retinex.gam ? Edited : UnEdited); slope->setDefaultEditedState (pedited->retinex.slope ? Edited : UnEdited); @@ -1205,7 +1221,7 @@ void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi limd->setDefaultEditedState (Irrelevant); highl->setDefaultEditedState (Irrelevant); baselog->setDefaultEditedState (Irrelevant); -// grbl->setDefaultEditedState (Irrelevant); + skal->setDefaultEditedState (Irrelevant); str->setDefaultEditedState (Irrelevant); scal->setDefaultEditedState (Irrelevant); iter->setDefaultEditedState (Irrelevant); @@ -1278,8 +1294,8 @@ void Retinex::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvLhighl, highl->getTextValue()); } else if (a == baselog) { listener->panelChanged (EvLbaselog, baselog->getTextValue()); -// } else if (a == grbl) { -// listener->panelChanged (EvLgrbl, grbl->getTextValue()); + } else if (a == skal) { + listener->panelChanged (EvLskal, skal->getTextValue()); } else if (a == gam) { listener->panelChanged (EvLgam, gam->getTextValue()); } else if (a == slope) { @@ -1446,7 +1462,7 @@ void Retinex::setBatchMode (bool batchMode) shadows->showEditedCB (); s_tonalwidth->showEditedCB (); -// grbl->showEditedCB (); + skal->showEditedCB (); curveEditorGD->setBatchMode (batchMode); curveEditorGDH->setBatchMode (batchMode); transmissionCurveEditorG->setBatchMode (batchMode); diff --git a/rtgui/retinex.h b/rtgui/retinex.h index b8034ccb9..064756a7b 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -35,7 +35,7 @@ protected: Adjuster* limd; Adjuster* highl; Adjuster* baselog; - Adjuster* grbl; + Adjuster* skal; Adjuster* gam; Adjuster* slope; Adjuster* highlights; @@ -77,6 +77,9 @@ protected: Gtk::Label* transLabels; Gtk::Label* transLabels2; Gtk::Frame *gainFrame; + Gtk::Frame *tranFrame; + Gtk::Frame *iterFrame; + Gtk::Frame *equalFrame; DiagonalCurveEditor* cdshape; DiagonalCurveEditor* cdshapeH; From ba5161d446bee8d3273963faa3fe295a5c1f431d Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 12 Feb 2016 13:36:32 +0100 Subject: [PATCH 003/232] change default Tansmission curve --- rtengine/procparams.cc | 2 +- rtgui/retinex.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 1252fc0b4..96f8be01f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -123,7 +123,7 @@ RetinexParams::RetinexParams () void RetinexParams::getDefaulttransmissionCurve(std::vector &curve) { - double v[12] = { 0.00, 0.34, 0.35, 0.35, + double v[12] = { 0.00, 0.50, 0.35, 0.35, 0.60, 0.75, 0.35, 0.35, 1.00, 0.50, 0.35, 0.35, }; diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index b0db92448..167e8efeb 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -168,7 +168,7 @@ Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), // vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125)); limd = Gtk::manage (new Adjuster (M("TP_RETINEX_THRESHOLD"), 2, 100, 1, 8)); baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1., 10., 1., 3.)); - skal = Gtk::manage (new Adjuster (M("TP_RETINEX_SKAL"), 1, 10, 1, 3)); + skal = Gtk::manage (new Adjuster (M("TP_RETINEX_SKAL"), 1, 8, 1, 3)); gain->set_tooltip_markup (M("TP_RETINEX_GAIN_TOOLTIP")); scal->set_tooltip_markup (M("TP_RETINEX_SCALES_TOOLTIP")); iter->set_tooltip_markup (M("TP_RETINEX_ITER_TOOLTIP")); From 73b0bb14c0fd6b621b3e61bfbf6bced3b6fd6d4c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 12 Feb 2016 18:42:08 +0100 Subject: [PATCH 004/232] Retinex, precalculate some expensive stuff (sin, cos, atan2) using SSE and line buffers --- rtengine/rawimagesource.cc | 119 +++++++++++++++++++++++++++++-------- 1 file changed, 93 insertions(+), 26 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 2251c15dd..5b5ad6a99 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2447,46 +2447,113 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC // gamut control only in Lab mode const bool highlight = Tc.hrenabled; #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel +#endif + { +#ifdef __SSE2__ + // we need some line buffers to precalculate some expensive stuff using SSE + float atan2Buffer[W] ALIGNED16; + float sqrtBuffer[W] ALIGNED16; + float sincosxBuffer[W] ALIGNED16; + float sincosyBuffer[W] ALIGNED16; + const vfloat c327d68v = F2V(327.68); + const vfloat onev = F2V(1.f); +#endif // __SSE2__ +#ifdef _OPENMP + #pragma omp 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++ ) { +#ifdef __SSE2__ + // vectorized precalculation + { + int j = border; - float Lprov1 = (LBuffer[i - border][j - border]) / 327.68f; - float Chprov1 = sqrt(SQR(conversionBuffer[0][i - border][j - border]) + SQR(conversionBuffer[1][i - border][j - border])) / 327.68f; - float HH = xatan2f(conversionBuffer[1][i - border][j - border], conversionBuffer[0][i - border][j - border]); - float2 sincosval; - float valp; - float chr; - - if(chutili) { // c=f(H) + for (; j < W - border - 3; j += 4) { - valp = float((chcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f)); - Chprov1 *= (1.f + 2.f * valp); + vfloat av = LVFU(conversionBuffer[0][i - border][j - border]); + vfloat bv = LVFU(conversionBuffer[1][i - border][j - border]); + vfloat chprovv = vsqrtf(SQRV(av) + SQRV(bv)); + STVF(sqrtBuffer[j - border], chprovv / c327d68v); + vfloat HHv = xatan2f(bv, av); + STVF(atan2Buffer[j - border], HHv); + av /= chprovv; + bv /= chprovv; + vmask selMask = vmaskf_eq(chprovv, ZEROV); + STVF(sincosyBuffer[j - border], vself(selMask, onev, av)); + STVF(sincosxBuffer[j - border], vselfnotzero(selMask, bv)); + } + + for (; j < W - border; j++) + { + 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; + sqrtBuffer[j - border] = Chprov1; + float HH = xatan2f(bb, aa); + atan2Buffer[j - border] = HH; + + if(Chprov1 == 0.0f) { + sincosyBuffer[j - border] = 1.f; + sincosxBuffer[j - border] = 0.0f; + } else { + sincosyBuffer[j - border] = aa / (Chprov1 * 327.68f); + sincosxBuffer[j - border] = bb / (Chprov1 * 327.68f); + } } } +#endif // __SSE2__ + + for (int j = border; j < W - border; j++) { + float Lprov1 = (LBuffer[i - border][j - border]) / 327.68f; +#ifdef __SSE2__ + float Chprov1 = sqrtBuffer[j - border]; + float HH = atan2Buffer[j - border]; + float2 sincosval; + sincosval.x = sincosxBuffer[j - border]; + sincosval.y = sincosyBuffer[j - border]; - sincosval = xsincosf(HH); - float R, G, B; -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else - //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); + 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 HH = xatan2f(bb, aa); + float2 sincosval;// = xsincosf(HH); + + if(Chprov1 == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = aa / (Chprov1 * 327.68f); + sincosval.x = bb / (Chprov1 * 327.68f); + } + +#endif + + if(chutili) { // c=f(H) + float valp = float((chcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f)); + Chprov1 *= (1.f + 2.f * valp); + } + + float R, G, B; +#ifdef _DEBUG + bool neg = false; + bool more_rgb = false; + //gamut control : Lab values are in gamut + Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f, neg, more_rgb); +#else + //gamut control : Lab values are in gamut + Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); #endif - conversionBuffer[0][i - border][j - border] = 327.68f * Chprov1 * sincosval.y; - conversionBuffer[1][i - border][j - border] = 327.68f * Chprov1 * sincosval.x; - LBuffer[i - border][j - border] = Lprov1 * 327.68f; + conversionBuffer[0][i - border][j - border] = 327.68f * Chprov1 * sincosval.y; + conversionBuffer[1][i - border][j - border] = 327.68f * Chprov1 * sincosval.x; + LBuffer[i - border][j - border] = Lprov1 * 327.68f; + } } } - //end gamut control #ifdef __SSE2__ vfloat wipv[3][3]; From 67a19d0cc97fbb289e2cc5db91f2211c1d3255fc Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 13 Feb 2016 08:02:04 +0100 Subject: [PATCH 005/232] small change to take into account new scale with iterations --- rtengine/ipretinex.cc | 15 ++++++++++++++- rtengine/procparams.cc | 2 +- rtengine/rawimagesource.cc | 1 - 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index bab98ef0c..f66fb39af 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -297,7 +297,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e if(gradient == 0) { grad = 1.f; - sc = scal;//3.f + sc = 3.f; } else if(gradient == 1) { grad = 0.25f * it + 0.75f; sc = -0.5f * it + 4.5f; @@ -339,6 +339,19 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e if(iter == 1) { sc = scal; + } else { + //adjust sc in function of choice of scale by user if iterations + if(scal < 3) { + sc -= 1; + + if(sc < 1.f) {//avoid 0 + sc = 1.f; + } + } + + if(scal > 4) { + sc += 1; + } } float varx; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 96f8be01f..7575564c5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -158,7 +158,7 @@ void RetinexParams::setDefaults() { enabled = false; str = 20; - scal = 0; + scal = 3; iter = 1; grad = 1; grads = 1; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5b5ad6a99..b29348c9f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2234,7 +2234,6 @@ void RawImageSource::retinexPrepareCurves(RetinexParams retinexParams, LUTf &cdc void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, 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) { - MyTime t4, t5; t4.set(); From 296919eb2b872e644185bf29ad7af059d3e89099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 20 Apr 2016 20:29:51 +0200 Subject: [PATCH 006/232] Fix #3259, RT fails with ASan When compiling RT with `-fsanitize=address` it fails early in `Options::setDefaults()`. To fix it, initialize `baBehav` directly as permitted with C++11. As a bonus, I converted `addsetids.h` from defines to an enum. --- rtgui/addsetids.h | 226 +++++++++++++++++++++++----------------------- rtgui/options.cc | 216 ++++++++++++++++++++++---------------------- 2 files changed, 220 insertions(+), 222 deletions(-) diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 244c22946..580874e5a 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -4,119 +4,119 @@ // UPDATE THE DEFAULT VALUE IN OPTIONS.CC int babehav[] TOO !!! +enum { + ADDSET_TC_EXPCOMP, + ADDSET_TC_BRIGHTNESS, + ADDSET_TC_BLACKLEVEL, + ADDSET_TC_CONTRAST, + ADDSET_SH_HIGHLIGHTS, + ADDSET_SH_SHADOWS, + ADDSET_SH_LOCALCONTRAST, + ADDSET_LC_BRIGHTNESS, + ADDSET_LC_CONTRAST, + ADDSET_SHARP_AMOUNT, + ADDSET_WB_TEMPERATURE, + ADDSET_WB_GREEN, + ADDSET_ROTATE_DEGREE, + ADDSET_DIST_AMOUNT, + ADDSET_PERSPECTIVE, + ADDSET_CA, + ADDSET_VIGN_AMOUNT, + ADDSET_VIGN_RADIUS, + ADDSET_VIGN_STRENGTH, + ADDSET_VIGN_CENTER, + ADDSET_LC_CHROMATICITY, + ADDSET_TC_SATURATION, + ADDSET_TC_HLCOMPAMOUNT, + ADDSET_TC_HLCOMPTHRESH, + ADDSET_TC_SHCOMP, + ADDSET_DIRPYREQ, + ADDSET_DIRPYRDN_LUMA, + ADDSET_DIRPYRDN_LUMDET, + ADDSET_DIRPYRDN_CHROMA, + ADDSET_DIRPYRDN_CHROMARED, + ADDSET_DIRPYRDN_CHROMABLUE, + ADDSET_DIRPYRDN_GAMMA, + ADDSET_CHMIXER, + ADDSET_PREPROCESS_GREENEQUIL, + ADDSET_PREPROCESS_LINEDENOISE, + ADDSET_RAWCACORR, + ADDSET_RAWEXPOS_LINEAR, + ADDSET_RAWEXPOS_PRESER, + ADDSET_RAWEXPOS_BLACKS, + ADDSET_SHARPENEDGE_AMOUNT, + ADDSET_SHARPENMICRO_AMOUNT, + ADDSET_SHARPENEDGE_PASS, + ADDSET_SHARPENMICRO_UNIFORMITY, + ADDSET_VIBRANCE_PASTELS, + ADDSET_VIBRANCE_SATURATED, + ADDSET_FREE_OUPUT_GAMMA, + ADDSET_FREE_OUTPUT_SLOPE, + ADDSET_CAT_DEGREE, + ADDSET_CAT_ADAPTSCENE, + ADDSET_CAT_ADAPTVIEWING, + ADDSET_CAT_LIGHT, + ADDSET_CAT_CHROMA, + ADDSET_CAT_CONTRAST, + ADDSET_CAT_RSTPRO, + ADDSET_CAT_BRIGHT, + ADDSET_CAT_CONTRAST_Q, + ADDSET_CAT_CHROMA_S, + ADDSET_CAT_CHROMA_M, + ADDSET_CAT_HUE, + ADDSET_CAT_BADPIX, + ADDSET_WB_EQUAL, + ADDSET_GRADIENT_DEGREE, + ADDSET_GRADIENT_FEATHER, + ADDSET_GRADIENT_STRENGTH, + ADDSET_GRADIENT_CENTER, + ADDSET_PCVIGNETTE_STRENGTH, + ADDSET_PCVIGNETTE_FEATHER, + ADDSET_PCVIGNETTE_ROUNDNESS, + ADDSET_BLACKWHITE_HUES, + ADDSET_BLACKWHITE_GAMMA, + ADDSET_DIRPYREQ_THRESHOLD, + ADDSET_DIRPYREQ_SKINPROTECT, + ADDSET_COLORTONING_SPLIT, + ADDSET_COLORTONING_SATTHRESHOLD, + ADDSET_COLORTONING_SATOPACITY, + ADDSET_COLORTONING_BALANCE, + ADDSET_COLORTONING_STRENGTH, + ADDSET_DIRPYRDN_PASSES, + ADDSET_RAWFFCLIPCONTROL, + ADDSET_FILMSIMULATION_STRENGTH, + ADDSET_WA, + ADDSET_WA_SKINPROTECT, + ADDSET_WA_THRR, + ADDSET_WA_THRRH, + ADDSET_WA_THRES, + ADDSET_WA_THRESHOLD, + ADDSET_WA_THRESHOLD2, + ADDSET_WA_CHRO, + ADDSET_WA_CHROMA, + ADDSET_WA_CONTRAST, + ADDSET_WA_RESCON, + ADDSET_WA_RESCONH, + ADDSET_WA_RESCHRO, + ADDSET_WA_SKYPROTECT, + ADDSET_WA_EDGRAD, + ADDSET_WA_EDGVAL, + ADDSET_WA_STRENGTH, + ADDSET_WA_EDGEDETECT, + ADDSET_WA_EDGEDETECTTHR, + ADDSET_WA_EDGEDETECTTHR2, + ADDSET_WA_TMRS, + ADDSET_WA_GAMMA, + ADDSET_RETI_STR, + ADDSET_RETI_NEIGH, + ADDSET_RETI_LIMD, + ADDSET_RETI_GAIN, + ADDSET_RETI_OFFS, + ADDSET_RETI_VART, + ADDSET_RETI_GAM, + ADDSET_RETI_SLO, -#define ADDSET_TC_EXPCOMP 0 -#define ADDSET_TC_BRIGHTNESS 1 -#define ADDSET_TC_BLACKLEVEL 2 -#define ADDSET_TC_CONTRAST 3 -#define ADDSET_SH_HIGHLIGHTS 4 -#define ADDSET_SH_SHADOWS 5 -#define ADDSET_SH_LOCALCONTRAST 6 -#define ADDSET_LC_BRIGHTNESS 7 -#define ADDSET_LC_CONTRAST 8 -#define ADDSET_SHARP_AMOUNT 9 -#define ADDSET_WB_TEMPERATURE 10 -#define ADDSET_WB_GREEN 11 -#define ADDSET_ROTATE_DEGREE 12 -#define ADDSET_DIST_AMOUNT 13 -#define ADDSET_PERSPECTIVE 14 -#define ADDSET_CA 15 -#define ADDSET_VIGN_AMOUNT 16 -#define ADDSET_VIGN_RADIUS 17 -#define ADDSET_VIGN_STRENGTH 18 -#define ADDSET_VIGN_CENTER 19 -#define ADDSET_LC_CHROMATICITY 20 -#define ADDSET_TC_SATURATION 21 -#define ADDSET_TC_HLCOMPAMOUNT 22 -#define ADDSET_TC_HLCOMPTHRESH 23 -#define ADDSET_TC_SHCOMP 24 -#define ADDSET_DIRPYREQ 25 -#define ADDSET_DIRPYRDN_LUMA 26 -#define ADDSET_DIRPYRDN_LUMDET 27 -#define ADDSET_DIRPYRDN_CHROMA 28 -#define ADDSET_DIRPYRDN_CHROMARED 29 -#define ADDSET_DIRPYRDN_CHROMABLUE 30 -#define ADDSET_DIRPYRDN_GAMMA 31 -#define ADDSET_CHMIXER 32 -#define ADDSET_PREPROCESS_GREENEQUIL 33 -#define ADDSET_PREPROCESS_LINEDENOISE 34 -#define ADDSET_RAWCACORR 35 -#define ADDSET_RAWEXPOS_LINEAR 36 -#define ADDSET_RAWEXPOS_PRESER 37 -#define ADDSET_RAWEXPOS_BLACKS 38 -#define ADDSET_SHARPENEDGE_AMOUNT 39 -#define ADDSET_SHARPENMICRO_AMOUNT 40 -#define ADDSET_SHARPENEDGE_PASS 41 -#define ADDSET_SHARPENMICRO_UNIFORMITY 42 -#define ADDSET_VIBRANCE_PASTELS 43 -#define ADDSET_VIBRANCE_SATURATED 44 -#define ADDSET_FREE_OUPUT_GAMMA 45 -#define ADDSET_FREE_OUTPUT_SLOPE 46 -#define ADDSET_CAT_DEGREE 47 -#define ADDSET_CAT_ADAPTSCENE 48 -#define ADDSET_CAT_ADAPTVIEWING 49 -#define ADDSET_CAT_LIGHT 50 -#define ADDSET_CAT_CHROMA 51 -#define ADDSET_CAT_CONTRAST 52 -#define ADDSET_CAT_RSTPRO 53 -#define ADDSET_CAT_BRIGHT 54 -#define ADDSET_CAT_CONTRAST_Q 55 -#define ADDSET_CAT_CHROMA_S 56 -#define ADDSET_CAT_CHROMA_M 57 -#define ADDSET_CAT_HUE 58 -#define ADDSET_CAT_BADPIX 59 -#define ADDSET_WB_EQUAL 60 -#define ADDSET_GRADIENT_DEGREE 61 -#define ADDSET_GRADIENT_FEATHER 62 -#define ADDSET_GRADIENT_STRENGTH 63 -#define ADDSET_GRADIENT_CENTER 64 -#define ADDSET_PCVIGNETTE_STRENGTH 65 -#define ADDSET_PCVIGNETTE_FEATHER 66 -#define ADDSET_PCVIGNETTE_ROUNDNESS 67 -#define ADDSET_BLACKWHITE_HUES 68 -#define ADDSET_BLACKWHITE_GAMMA 69 -#define ADDSET_DIRPYREQ_THRESHOLD 70 -#define ADDSET_DIRPYREQ_SKINPROTECT 71 -#define ADDSET_COLORTONING_SPLIT 72 -#define ADDSET_COLORTONING_SATTHRESHOLD 73 -#define ADDSET_COLORTONING_SATOPACITY 74 -#define ADDSET_COLORTONING_BALANCE 75 -#define ADDSET_COLORTONING_STRENGTH 76 -#define ADDSET_DIRPYRDN_PASSES 77 -#define ADDSET_RAWFFCLIPCONTROL 78 -#define ADDSET_FILMSIMULATION_STRENGTH 79 -#define ADDSET_WA 80 -#define ADDSET_WA_SKINPROTECT 81 -#define ADDSET_WA_THRR 82 -#define ADDSET_WA_THRRH 83 -#define ADDSET_WA_THRES 84 -#define ADDSET_WA_THRESHOLD 85 -#define ADDSET_WA_THRESHOLD2 86 -#define ADDSET_WA_CHRO 87 -#define ADDSET_WA_CHROMA 88 -#define ADDSET_WA_CONTRAST 89 -#define ADDSET_WA_RESCON 90 -#define ADDSET_WA_RESCONH 91 -#define ADDSET_WA_RESCHRO 92 -#define ADDSET_WA_SKYPROTECT 93 -#define ADDSET_WA_EDGRAD 94 -#define ADDSET_WA_EDGVAL 95 -#define ADDSET_WA_STRENGTH 96 -#define ADDSET_WA_EDGEDETECT 97 -#define ADDSET_WA_EDGEDETECTTHR 98 -#define ADDSET_WA_EDGEDETECTTHR2 99 -#define ADDSET_WA_TMRS 100 -#define ADDSET_WA_GAMMA 101 -#define ADDSET_RETI_STR 102 -#define ADDSET_RETI_NEIGH 103 -#define ADDSET_RETI_LIMD 104 -#define ADDSET_RETI_GAIN 105 -#define ADDSET_RETI_OFFS 106 -#define ADDSET_RETI_VART 107 -#define ADDSET_RETI_GAM 108 -#define ADDSET_RETI_SLO 109 - -// When adding items, make sure to update ADDSET_PARAM_NUM -#define ADDSET_PARAM_NUM 110 // THIS IS USED AS A DELIMITER!! + ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! +}; #endif diff --git a/rtgui/options.cc b/rtgui/options.cc index ff5cf9676..88b795687 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -498,116 +498,114 @@ void Options::setDefaults () #endif // Reminder: 0 = SET mode, 1 = ADD mode - int babehav[] = { - 0, // ADDSET_TC_EXPCOMP - 0, // ADDSET_TC_BRIGHTNESS - 0, // ADDSET_TC_BLACKLEVEL - 0, // ADDSET_TC_CONTRAST - 0, // ADDSET_SH_HIGHLIGHTS - 0, // ADDSET_SH_SHADOWS - 0, // ADDSET_SH_LOCALCONTRAST - 0, // ADDSET_LC_BRIGHTNESS - 0, // ADDSET_LC_CONTRAST - 0, // ADDSET_SHARP_AMOUNT - 0, // ADDSET_WB_TEMPERATURE - 0, // ADDSET_WB_GREEN - 0, // ADDSET_ROTATE_DEGREE - 0, // ADDSET_DIST_AMOUNT - 0, // ADDSET_PERSPECTIVE - 0, // ADDSET_CA - 0, // ADDSET_VIGN_AMOUNT - 0, // ADDSET_VIGN_RADIUS - 0, // ADDSET_VIGN_STRENGTH - 0, // ADDSET_VIGN_CENTER - 0, // ADDSET_LC_CHROMATICITY - 0, // ADDSET_TC_SATURATION - 0, // ADDSET_TC_HLCOMPAMOUNT - 0, // ADDSET_TC_HLCOMPTHRESH - 0, // ADDSET_TC_SHCOMP - 0, // ADDSET_DIRPYREQ - 0, // ADDSET_DIRPYRDN_LUMA - 0, // ADDSET_DIRPYRDN_LUDET - 0, // ADDSET_DIRPYRDN_CHROMA - 0, // ADDSET_DIRPYRDN_CHROMARED - 0, // ADDSET_DIRPYRDN_CHROMABLUE - 0, // ADDSET_DIRPYRDN_GAMMA - 0, // ADDSET_CHMIXER - 0, // ADDSET_PREPROCESS_GREENEQUIL - 0, // ADDSET_PREPROCESS_LINEDENOISE - 0, // ADDSET_RAWCACORR - 0, // ADDSET_RAWEXPOS_LINEAR - 0, // ADDSET_RAWEXPOS_PRESER - 0, // ADDSET_RAWEXPOS_BLACKS - 0, // ADDSET_SHARPENEDGE_AMOUNT - 0, // ADDSET_SHARPENMICRO_AMOUNT - 0, // ADDSET_SHARPENEDGE_PASS - 0, // ADDSET_SHARPENMICRO_UNIFORMITY - 0, // ADDSET_VIBRANCE_PASTELS - 0, // ADDSET_VIBRANCE_SATURATED - 0, // ADDSET_FREE_OUPUT_GAMMA - 0, // ADDSET_FREE_OUTPUT_SLOPE - 0, // ADDSET_CAT_DEGREE - 0, // ADDSET_CAT_ADAPSCEN - 0, // ADDSET_CAT_ADAPLUM - 0, // ADDSET_CAT_LIGHT - 0, // ADDSET_CAT_RSTPRO - 0, // ADDSET_CAT_BADPIX - 0, // ADDSET_CAT_JLIGHT - 0, // ADDSET_CAT_CHROMA - 0, // ADDSET_CAT_CONTRAST - 0, // ADDSET_CAT_CHROMA_S - 0, // ADDSET_CAT_CHROMA_M - 0, // ADDSET_CAT_HUE - 0, // ADDSET_CAT_BADPIX - 0, // ADDSET_WB_EQUAL - 0, // ADDSET_GRADIENT_DEGREE - 0, // ADDSET_GRADIENT_FEATHER - 0, // ADDSET_GRADIENT_STRENGTH - 0, // ADDSET_GRADIENT_CENTER - 0, // ADDSET_PCVIGNETTE_STRENGTH - 0, // ADDSET_PCVIGNETTE_FEATHER - 0, // ADDSET_PCVIGNETTE_ROUNDNESS - 0, // ADDSET_BLACKWHITE_HUES - 0, // ADDSET_BLACKWHITE_GAMMA - 0, // ADDSET_DIRPYREQ_THRESHOLD - 0, // ADDSET_DIRPYREQ_SKINPROTECT - 0, // ADDSET_COLORTONING_SPLIT - 0, //ADDSET_DIRPYRDN_PASSES - 0, // ADDSET_RAWFFCLIPCONTROL - 0, // ADDSET_FILMSIMULATION_STRENGTH - 0, //ADDSET_WA - 0, //ADDSET_WA_THRESHOLD - 0, //ADDSET_WA_THRESHOLD2 - 0, //ADDSET_WA_THRES - 0, //ADDSET_WA_CHRO - 0, //ADDSET_WA_CHROMA - 0, //ADDSET_WA_CONTRAST - 0, //ADDSET_WA_SKINPROTECT - 0, //ADDSET_WA_RESCHRO - 0, //ADDSET_WA_RESCON - 0, //ADDSET_WA_RESCONH - 0, //ADDSET_WA_THRR - 0, //ADDSET_WA_THRRH - 0, //ADDSET_WA_SKYPROTECT - 0, //ADDSET_WA_EDGRAD - 0, //ADDSET_WA_EDGVAL - 0, //ADDSET_WA_STRENGTH - 0, //ADDSET_WA_EDGEDETECT - 0, //ADDSET_WA_EDGEDETECTTHR - 0, //ADDSET_WA_EDGEDETECTTHR2 - 0, //ADDSET_WA_TMRS - 0, //ADDSET_WA_GAMMA - 0, //ADDSET_RETI_STR - 0, //ADDSET_RETI_NEIGH - 0, //ADDSET_RETI_LIMD - 0, //ADDSET_RETI_GAIN - 0, //ADDSET_RETI_OFFS - 0, //ADDSET_RETI_VART - 0, //ADDSET_RETI_GAM - 0, //ADDSET_RETI_SLO - + baBehav = { + 0, // ADDSET_TC_EXPCOMP + 0, // ADDSET_TC_BRIGHTNESS + 0, // ADDSET_TC_BLACKLEVEL + 0, // ADDSET_TC_CONTRAST + 0, // ADDSET_SH_HIGHLIGHTS + 0, // ADDSET_SH_SHADOWS + 0, // ADDSET_SH_LOCALCONTRAST + 0, // ADDSET_LC_BRIGHTNESS + 0, // ADDSET_LC_CONTRAST + 0, // ADDSET_SHARP_AMOUNT + 0, // ADDSET_WB_TEMPERATURE + 0, // ADDSET_WB_GREEN + 0, // ADDSET_ROTATE_DEGREE + 0, // ADDSET_DIST_AMOUNT + 0, // ADDSET_PERSPECTIVE + 0, // ADDSET_CA + 0, // ADDSET_VIGN_AMOUNT + 0, // ADDSET_VIGN_RADIUS + 0, // ADDSET_VIGN_STRENGTH + 0, // ADDSET_VIGN_CENTER + 0, // ADDSET_LC_CHROMATICITY + 0, // ADDSET_TC_SATURATION + 0, // ADDSET_TC_HLCOMPAMOUNT + 0, // ADDSET_TC_HLCOMPTHRESH + 0, // ADDSET_TC_SHCOMP + 0, // ADDSET_DIRPYREQ + 0, // ADDSET_DIRPYRDN_LUMA + 0, // ADDSET_DIRPYRDN_LUDET + 0, // ADDSET_DIRPYRDN_CHROMA + 0, // ADDSET_DIRPYRDN_CHROMARED + 0, // ADDSET_DIRPYRDN_CHROMABLUE + 0, // ADDSET_DIRPYRDN_GAMMA + 0, // ADDSET_CHMIXER + 0, // ADDSET_PREPROCESS_GREENEQUIL + 0, // ADDSET_PREPROCESS_LINEDENOISE + 0, // ADDSET_RAWCACORR + 0, // ADDSET_RAWEXPOS_LINEAR + 0, // ADDSET_RAWEXPOS_PRESER + 0, // ADDSET_RAWEXPOS_BLACKS + 0, // ADDSET_SHARPENEDGE_AMOUNT + 0, // ADDSET_SHARPENMICRO_AMOUNT + 0, // ADDSET_SHARPENEDGE_PASS + 0, // ADDSET_SHARPENMICRO_UNIFORMITY + 0, // ADDSET_VIBRANCE_PASTELS + 0, // ADDSET_VIBRANCE_SATURATED + 0, // ADDSET_FREE_OUPUT_GAMMA + 0, // ADDSET_FREE_OUTPUT_SLOPE + 0, // ADDSET_CAT_DEGREE + 0, // ADDSET_CAT_ADAPSCEN + 0, // ADDSET_CAT_ADAPLUM + 0, // ADDSET_CAT_LIGHT + 0, // ADDSET_CAT_RSTPRO + 0, // ADDSET_CAT_BADPIX + 0, // ADDSET_CAT_JLIGHT + 0, // ADDSET_CAT_CHROMA + 0, // ADDSET_CAT_CONTRAST + 0, // ADDSET_CAT_CHROMA_S + 0, // ADDSET_CAT_CHROMA_M + 0, // ADDSET_CAT_HUE + 0, // ADDSET_CAT_BADPIX + 0, // ADDSET_WB_EQUAL + 0, // ADDSET_GRADIENT_DEGREE + 0, // ADDSET_GRADIENT_FEATHER + 0, // ADDSET_GRADIENT_STRENGTH + 0, // ADDSET_GRADIENT_CENTER + 0, // ADDSET_PCVIGNETTE_STRENGTH + 0, // ADDSET_PCVIGNETTE_FEATHER + 0, // ADDSET_PCVIGNETTE_ROUNDNESS + 0, // ADDSET_BLACKWHITE_HUES + 0, // ADDSET_BLACKWHITE_GAMMA + 0, // ADDSET_DIRPYREQ_THRESHOLD + 0, // ADDSET_DIRPYREQ_SKINPROTECT + 0, // ADDSET_COLORTONING_SPLIT + 0, // ADDSET_DIRPYRDN_PASSES + 0, // ADDSET_RAWFFCLIPCONTROL + 0, // ADDSET_FILMSIMULATION_STRENGTH + 0, // ADDSET_WA + 0, // ADDSET_WA_THRESHOLD + 0, // ADDSET_WA_THRESHOLD2 + 0, // ADDSET_WA_THRES + 0, // ADDSET_WA_CHRO + 0, // ADDSET_WA_CHROMA + 0, // ADDSET_WA_CONTRAST + 0, // ADDSET_WA_SKINPROTECT + 0, // ADDSET_WA_RESCHRO + 0, // ADDSET_WA_RESCON + 0, // ADDSET_WA_RESCONH + 0, // ADDSET_WA_THRR + 0, // ADDSET_WA_THRRH + 0, // ADDSET_WA_SKYPROTECT + 0, // ADDSET_WA_EDGRAD + 0, // ADDSET_WA_EDGVAL + 0, // ADDSET_WA_STRENGTH + 0, // ADDSET_WA_EDGEDETECT + 0, // ADDSET_WA_EDGEDETECTTHR + 0, // ADDSET_WA_EDGEDETECTTHR2 + 0, // ADDSET_WA_TMRS + 0, // ADDSET_WA_GAMMA + 0, // ADDSET_RETI_STR + 0, // ADDSET_RETI_NEIGH + 0, // ADDSET_RETI_LIMD + 0, // ADDSET_RETI_GAIN + 0, // ADDSET_RETI_OFFS + 0, // ADDSET_RETI_VART + 0, // ADDSET_RETI_GAM + 0, // ADDSET_RETI_SLO }; - baBehav = std::vector (babehav, babehav + ADDSET_PARAM_NUM); rtSettings.darkFramesPath = ""; rtSettings.flatFieldsPath = ""; From 35267fe8fd51ac19056f4fdf626dcd9e53cc10c0 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Sat, 23 Apr 2016 02:50:49 +0200 Subject: [PATCH 007/232] Added DCPs: Sony ILCE-6000 #3220, Nikon D7200 #3236, Fujifilm X-T1 #3243. --- rtdata/dcpprofiles/Fujifilm X-T1.dcp | Bin 1038202 -> 1045602 bytes rtdata/dcpprofiles/Nikon D7200.dcp | Bin 0 -> 1045594 bytes rtdata/dcpprofiles/Sony ILCE-6000.dcp | Bin 0 -> 1045602 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/dcpprofiles/Nikon D7200.dcp create mode 100644 rtdata/dcpprofiles/Sony ILCE-6000.dcp diff --git a/rtdata/dcpprofiles/Fujifilm X-T1.dcp b/rtdata/dcpprofiles/Fujifilm X-T1.dcp index 494941e2233482e9f088aaee1d0cff16db99bb42..5d6c48b28c7479dfd831ae4fbcb4d13d26f76587 100644 GIT binary patch literal 1045602 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¹UNYl_C~h$BQ5hIl^U{#lYV} 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%0A~BI9J%f%B8*3d9tsl4$fIH^pPP4vT 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

&)TsW;ad&+*3WAx5m-O-OPWydJE<#ekzdPsG4 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%0DfnMISIqx;=VF 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

0(np2mHxD$ZxxLx8lpYNazR7lCMn%{z(e7qa#(c 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

m=`q$k5^}C7Gv~&s}$v(`B}Y~;lNyOPXs!o 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

X41$ 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�hD8ofA^3I{@X@h_-4TCH)%Yd5ams~!L79~?5LW& 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

SJUS!*K9MxQtN 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

0CL=7ea?PL;=lba3r^t#n6e3snpJO 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 literal 1038202 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≀-YCfiU9k7Mu|fqSeMuilS-_FhkVhnoEFyl(QAZp;XMqzEZ){MaEBjD!|6aIP|GhOm2E6!^B# ziE`>Ju{c{*PNxxNU7BO8g*-q z?hej#PGe~MoEWD|e&kKlzzdyy!AQ3UoM*{@Wq<7i?WXabq}~unDR-@M7W!kKf_(LU z^lh>|Y488wtbSw7WNalYPSVJ!I1myvIM?YmG|fqY{daNc-8z+N!4)ZiO6#b%3a z7W$&Isu%Y;&x{{>-ef(KR zaX0j47PSk9-|#?D(u!U@E}Vv)9wVlL>$ny1dD(9l@&4KX?0({Vk1iBdjs2+95a;>A zH1Q^O21CO`sps*|VxFZJWovMLqBC_8Ppo1~AiN(G+OdIN^kR^&-jCiO-xG6~f6p^| zeyr}Dcp8X3)>9dEnes>+9RTmwr1-wzd?c0%ZbDy{XJPADK z=Q+X=%xEqRR8qSwjfHl-A}A3xoypH(x?58sDC-A$bbW@1i&NDU=NCbaPHROEXB8Rj zj-(CWvqk@-&^4V0O`;)p#8A}Mw=}rd`@a*Lj18q9Q#CZp@Td6a0Djj3^dING6Wz_B z|D6*7KF~377`PvaP1WSTK@eM5`O*9r;7&Oh>MqRng~lGVYbI^B-jwe}bI{NEJ8opw z@MA-s#nV{a2MZJ}*rePz`WOyPjBPbp_NiD}R)GD@Tmx3^b`1Tfj-2_k5o?ORQyn3M zc+ak^MZ;)XwHh&YAY-vTqM&6h@xdmsKzJfMUqxOwWGOoo7)jj_6Q-&|*q%(>mFQh8 zcGNIQXFdYE!(AG$W5bNpv}l%`-g|9fsRO|$4~Cbn=mZ6x@Ro!BDm89f`Tq2C`43l+nmX%Mb~?sl=Q!2|f!1ZilDWwPiDUf!g> z*f*QqmbZKrNWL-95!gAGFE9##_i+RzZA|1@t^C0ahi;CSk|%u(qCv}$r|SQ!oWl+~ z9l%aMkEbEH4~F;Xz>M5bCEwr!J4-_!FcaJvpT>LU*qfaVg;`F4@b=^sjWJ3w;;^Iv!5n+D4@lvHs`ID8gfMhXqx zTInQS-yTG?Mg#8JTrM|(Hx@jJ6-_t~!2aw|YxqNCt5BOa--A9z=55vT?!K27%yqe$?L zleT_(*;ed_x}y(Ok^OlI)(V z;Dc)d4ITydbR(d@U_u8mPcZ2nNgq`P)UF7e!8ehZyPsgu=Wt)yLYH}lHJeZfzi&4@ zC+^p!I|fou#2=9G`JmnbbmtEEh3z8w@{_=MW5ho=+g}f6R*&Mzpg(enKmA$asW>V{ z56iuSjP)*v)qAkch<0WpfpZalUg%GM7XB@oia$Ynq)sCH*(MruOmJhmXR?hfioOrU zOpx+e#sUpAQPA@=yT?ir5I1nnoByg{_rO__`b*-Z>eTnEnmQg1L5*FXy7f>~1H`nj z)lD!TQepNa)iOrp0G#*WT|7x@f%yh!Lv z_2{J{dvF@N`lK+Yu`2LamDI9MA=|qh`CTw_7j1o7_81zEa%g=2upq~bP`Y?lMXAdK zip8vT5qM(3Hw7B713L;0Bk5^EC$c<(-4Xa)-W*cFE*uR4XC8hV2@!1W$UtbnYshSW zfpEtvfW91vqXd86i|31&|>q1z&d-0gdL*MK(V*^jb(OnnpdRvcTsd=%K zpuw)hG&gqsZVZh-3T~3Snq5ZRID@l&^?WKjVg!xBYUm?v&1SC9^LOrm9?R!zYzbxo zLk8nK-+0M<(F55y9rgH@swDYSSRtO58`r1q@6?n7{Lk!cM(eWFSzplH=IpA8i&{wOb*p1vZU--+K5?sfKk^h{?&x%%T_2~RI>z82vCr(GPbB&o z;4f{dMULQx*$)TrQEW_0?x<<#MC=S+Y)RVsYO3b~|J>Rpv}BlyR^YQRac4VPff=df zgEo0yTS_|-MhVODj{3Hshjr113k7G=vN~;V7Dl6SZ*|^tgmpx{6TJ_5#pW&9OU$Os z;MF~Pdpp4r{L6X+CoXS;*=SB`rWYrcs zG}xu_Sv!-q&H`t-7Wmx##!-D)5aod%nb5`>IavUiCV?xtwg+9l4ZRNVDpvnArR7U- z5B~T!K0h2GXBu5RZS4#^bL`p7opE~o_VNKU*w>x0@KJ=$!}DNPD#l=5j6HYldRF@? z^mW1OsP1)u)q531j<_clJw3;s)Q{5d-AuE3#8y~o$nP`eUk*Rm&x!Cntpk7O19j*` zU=G62vp}!oPg@$)3^_LT1ukAPp#q0+V2SwS+=dLG zTa|(5>Ia*W@)Eo<2ZF0J>=&B{Zc9^t)HpMDv9?~&>g#|z^uR^I%MEvEk5GDACtFP2 z8BQs#3hHAtMqFqYrq|~;&z;QDTf)y5y{e+N)u4$brwet%X;q<&E`h7k1iWF}ffFgI z3wmt0Ll-xlfEof`nY+~#`FkYwjt-#Kr`4pqJeHnp@+TeUpofLAlK%?T9r-WLGyBV# z(YAQn zArFiq%0#YTae*zqhr90t>R9%KHT)JyAyzY)DO!sF5rjN27hEPbh2O*b zx`mzm9m&JAufpM(wFmDkKaH((k)xj%Mxl8vXi*`4C-8V?o7j+VX%Hn3fM-U`AXKlMPdd%Q!Izbn}pWYn8dnuR!epV3p2H<)BmDgoI2w^Sc@p|u=pOKD? zR>z@#i`p>JmF-;;OOcM)!5b9D5|+o%+=ZwO>!mPb=qa`I#|*LY5mu-|tcXSrs@6qj zpRA#8De(Ln@R^FFjH9E5FQ55kvIv=do-gj z0(zUd_>8a?L;H@mWBfbOkl!%6rT>3!ZX8h)u!GFdqm)y^fiSRa>&IA4sziTXY`n>FQ;Fno|bd zo+ugRHSniCC&TGe4=1YKIfx#v`**Jm`~cQ=T0C`Y5lq$%oY*LbIK3bD!{i05D~r{8 zl;1^WdCrw_4S@K{L(NA1SuLbhNOygv}nCoL*vK2xD- z5C(3<(vR%c3fv*MPpkZ@Mp+T49b$2ZcBo5cdsOrRwWm|hMkMiw^6~YFyA8<#b)Q8P zc*36>Q)l!yhM{gMomU^eanLghMsK{JIz0Ro9MQVS z)om8aK6l0}=0pgsO^U#7HS)XTsDtL5;XiS2KH3>dK4wvT;SqTIpud{>`;e{8bU8T! z^QK)Q*uo%iIS(i)f?a0KUI&udROq`dDq&wE11KpQJb2RzW<1Luo&(@k?r%Z0vf-O> z7(G?$O--@CCHe0BeV&Ks1hJf+@p=!G>nF#-*C`JB0jRql&S#khvDk?O*RH9O-Tn^l zE@~OOX&YJ6d*sRJ+j`g>U`yY?FAw+Th{O4;Hu#P9GjR^y-G#ST1Z|xQ%$;7bhq$*d zy8>sMpDY=1u6O}F$b4(iADm(7>)-Cy!5jkj9sc~bvvt9B2Co)>&wv60lAnWjn=?Km z{cBQ`0rU}_P){BI##&8M(AV+k0d>B~Mi`(EjeF#0-#|7k2RntxKR?7JY8@`1pR^df z_uCtIUlIGu$h|Ax7xR-0`k7|X<=(!JCqP4KH}=HyALWV{a1T08R6x(=w;<(T=gupr z`n6fC>D)j{aKfCoo;!2>gZnNK`hllnnMs)+CG5h_aJbHNGyNzz4!p{^+O*?+AbkI@ zkM~#HVC2sh)sCk&4WLsLJ(~4=7pwP2E?zX7+24pEbw_YewDDC}t} z@xGD^zq8U?;gl&r)77XdEyEno%^Et}LDi@`dd`xk^T8ffsqRAf9pUFDjr_*U_9*lk z-COHCXXW5=4DXH^@vAee&R%Hj41*5a(S>Y?i-Nwy!%J&if$l;eJVB5*Y%xpcI|9RK z5^|E*X3zP)3MIH;sP~78{Plb23$}q5#Wf3VfIiI@?EU#XeWJaxF$i}p_5})C2_*#q zWZnxstA%6XgWyk3rzt4C-x=W~wB@@khM&m$h3q5rNDtuMPi%XTJ-!o2f1pAAH_i#p zUd*>Fj(XJrkFK>Hdx_fQQzP`8%i!g=Er#Y81=EA&KCG$|^++4c(rjYD;fLpDJLJ_h zwlWL!F~ZEC)7ADcdpt5yuctly#%VTfWCS=$l3ww3_P|N4_XBF&u9S73uc8@kap&%O z&a}vNU0dN^-}aX60zW^o88pNeR9tuw;s~PY^$9%&FoZYfdqWp9q86T4)7CjT~+6G{U4&31A z+oItaKiby-nm%dXVzW!W6l4Uw%~rv}$pl}LR||y>A^gko0_ppk%AK$Oc;?SLuVS93 zl^jzPq!wxdBL>M7_ZwLHqsVt+yM-@H&ij}_y-lYCL*axOCWPN==0i}7>&P1a~AbWY$q zzjbgC>w&(@hw>oG`clLmZ^P`mB#6#5zs-K4c3X2RhzhbVvSED{WPbyDl;1`6B_@>2 zi-Ra-WGWlj8~Y;Pf@sry3pVV2s9v-5Nb7j<8F)0#$dN2c_i<^Kb@CbJo0IPG#Sawd z^P>*xw4ZNT4bHhE^clOl^A!%@z9DZv8tTN`gVXp;8A27ert&WH{Aqa_^b?#X@UN}> zsBACteDAKj^8jCJwI8{S@ibA{2|fM|m>(r96zcB{q#N>o`*p4MEMhfm!HY}py)v-(dX|B{ zTw`E6sAL;cg@8L+6ZOlree6KATJIx&VDB*&l&+!)`0N<|7TL92?1tbS?Xx?@oL{1L z#`(Nra0(thmA(!=*gmvo+&f<2+3*vDLPj5}0OQ2TMvs@)#XSFQ!`3^8rR z+(mrIv>@pw5V6d&AuMzRiB*gZNg%b~*nv-NM_fVp*j zPo_Sori;LQS4=Q7yQo6VC*{=&`1*lo4$K$ml+3X$__V-$%@zgood{2!x>6k!%H;lZq9T0-TTXDJ;cOLB9;qlgY4Pr!V5Oi+ri$HBTXU0kqf55YrCc630!4 zZYyH@24xtpy-um;5DqPi=5@}7QUUJq+AfQDDrVQ#h%@(x4&iehg6QK)+^1@LJ^=~x z?*MS4PmhOhnjgi6LMt_K9KYi4OX1lnjN?9ZNrQiL+BLD>O&{947Ij?3Tir!y z9{jgo{~yjx?0c|6;Cv1EC(VB>46Pcce-{t7-w;BJVyFi2%vIeN(!^-Jf4cLbH$v5& zQIwCb%lcGhU6PEuKF<=z;vQ@?4>@P>VD7j>34K23 zZH^ej2c5#7&q96lt2dYCZ1b+d3$?5hAEXSTTJNzV`KUKPpb4OQ4WUur$Cmf}ETg3{EHh}*E%#RHX6#~l?&?Li-f7~45V}Iyb;tq{8G8Nu| z+gQyCUR@h4ZCfC=Ncv7Aw@(qDqRtz;2^wG7SH!U0(AX}6mzC{9aXE75a3kc^cDKb# zOTmjrzh%y;`(lb1L^fWSNlo}DTAf3D-U=RU_bOc58GG}`FeBbug@>2;(!|r453YSD zKCSLc$1kCm<&cAYe_#Es%|`zOn=+l&t?y?_0xy`DD1nycslFgL7PJ4ZJNyC=XLJ_|W!p5TWA zbJ505+wm}FbijFHq)OZTw?eNq4L+x~d_4R8jtYYAu0y77ANu7ZQOmS{bX6z)t}no6 zxN_sAPOKUT4F@^h%l)96>gW&88aY|*tI!!Be+ylLox9L--NB~5R3G_?-J>fyhZ?># z4Ktvi&)ale!0{iT`8VG%-+oe150BTM;i3UwWc|$Js55?EiP>=5dJSUrF*)rMctNOB zq%+*E@iU#&JCfqFYpeER{v(avTXxF8QDO|VizQ#qhyIJjb+01y-Z$=DLPfhjYD&g= zZaXDfOlYMh8(@1hWt|B9Bl>~onBB?ZtcBnh0_T{PDdO-=VdRYS+3p zB|&W55xF$-%pbBa(HR<;-WG_54JV6h5v$Wtv(&ST)umzwD-8Ai^6*+hEpTj}bPb_v ze^v{#S0k50ueE66OyR)}-j(KHv#BiZr7kti=z_revB=`>r1ZPl= z9j-Y-h1?(f2t0ew5zd+VVJ852_1U39LrY(>><~)+vkPPujeV(OS7=PbkN%iTAgxA? z|9Ad8xJ!)C%_&}g-(9?L0p2=s`uGra_=c`)hgki&t(EN{N?KJ?e3-o^TC}boP0R3n zG&@UNR~y_gJcENFuB)rjpWAglFU4U-=#c~4dG)ID7TqE!40!G_hCGhmVKWE6(ta`ai|K zo8jqZ18=eqr$r4kAtYU|j#o-`x7^X6c!J%rw;@9KQtVElzwLTDU)YIU+6-rP;qb$P z2`~r-_r~65uTUi#`Q0UG&{WY0FVR`+vZV$?bPr7<0m(=54}$%EDX1 z04G1%aV!))mTcjOqc43q7fKZ)Wr9m*U+e^jN?ttH+M$7zgc|d2oMo0ItaFK{`Z%9Y ztIKtlN5zpG&m;Rx7U$c<>SMySm>uG)UNL%~`e&nyaDFQNgNm(c@Y3$sTLGT8GF$T1 zec zB0h}%GoFWo3*7?u-OdYRc$p3MMOq?OpBe&>b?DR~f9Po5hqs20L?Lpsq5-w}4)8{; zlc8gr_+0k}v0@nRBj1Pnz+nK#06fVBy4ONCob%eg&@$@sR5&By{8o-U@T+hy7c&ZQ z6!+%VVvj?RL){96heQ+B)Qn#qT3b{Jq!!?o{Ef5afdbjb7 z2yeb3j6Qe7dpYmH+r#_g_#ot9N9OaSJLvr^g^yckdroZ-TW&#P;p{%%d_Ya*}Y9x5&cz?SWrU}*~d{I}y z^AvvcA>czwUbKJX+&^Zht!ZF95zcU0(QGkiNt`}DTwhoq2G5Vx$AshM2E25Bj6P@J zC%f~xZrBw9wjME~`Og)Vz6p&5H$FK4ng%$l+5JNJP0U`80b8e{Nd9y$bVre!{Th|X zm6xE0iF|lo*Ny!AC+wNw+*UM5;VV0;sBTkWuGz#t&%|un1mDXy@Low_WP)DGsf>6& zCr?QZQ>Fa^HGlC6J)T7LLx%U}J)oc6u^TiVYc126flp!327GDa!eqqxHJ|0QCZryV zvVa!HHpJ2#3pQat;xly8O(F%ht3PJE`8c;7$FkUByk}@Gz43QpgRxuOWGrf=l*KH_ zEr6l|@cmyFpmy`4kEmDAcOSymq@f1HjNw+GB=4wF??=DBbpYLi4)xzScTb7Y zIcnnd_uYB>1o5O#9A;MFUUz#V+Iht4>+zo}P5BpZczgrfDQ8CT=fU7hBPR4~u$ae0 zz&8QdzWk%$+KrWdD?-Brel@GoPxi^%&Aj842)Y7nFHPLVlip*ljofVd)qUKpjau&s z((7#&pEX8Bj;)c0FV5nN!6mrU4R~tyakB&9Y>YxYubRPc<%4_cjef=E6rO;-$LR}r zu4m1q9Vx{oa8q4I>ux)Rlg9!0i}lYD_MC>l=sL{*Y}zqncy~RUAg_)+$t|G0BlW#Iy~^Wmt5nns@gYHT znvciqb(<~f@$5W)V4tKbfWK3g%Ny^7_QPi6z+Rbro*#INX4n;7%J{(B;CN!@Bp(=~ zGsJu<0lQK4D$WWGP-Bi7t)L<6d$MUaaK2ijKQ(76tASX14u6+lzrwga!k{TDLVUy)1|{a?DoTVp)$<@CiB&PbEt=bNd6oywWggJ;9NMZpV%xc!7JD zZV_fW`O*-4mLxy=7Nh*=Cb)cmx`IpIq*Nye|J1Z?plkkFl7) z$nNqgaqz1O3MTdNVt(8U`yv;C`O3pw(vCQU-o&g%Be?qva6j|pwChopZYgy1`}__i zd*3_4+5pVH!O7Qo6MNqY?+Y`W-VIB24UXX1AM%i5h}Lqw;w#>pjXq`hV6oGOh13@#C`P?){OQge|Vco ze)P&C@RLpb7w0|?*NY{4<4FY0vQN*z<%`qjy`KX+@c6`7S_hn4O&!k{ro@os1@*>1 zh*M^?zK^PTpU79_MA1^5;qk7!5Fa#p--=h;v$^^e{3&pTe~mfI?=*^}Nr=5CUtZ_w z&<~XSYeG5}^EHd0>)uJ4#guVvkcw)c)=1Gk<0rkaA2bj5TG?BkjnCrwt>8gTeaE|m z!0!t)+|sRD?xukT5;%MPlAQQ_@Tg5^hmz-nLY)S=;&Jq;#ov#GH0-}jJ`Qb^uMX_s zqA=*qAl47?XSNv%ns6R@j6%b%{gBf(a1P8atYsgt^YIC@+o8Xc*g3p^yA1dT|4C#C zj{`{BSz=~>tW~)mIC|mKuWNI*cbPAVzi=iVHWuy-^QFdk$9g~dJzkWKoteMSa}zhM z`1?pacv3jGaeu^m$(23Qf!{2-e^M-XAh;i0XY!+4WAwd1UAJe=;$-L&N zC=&4Qrxx$$Yj1<6hMeL4=Pxtw@vqQymF6`=YQ5mDXVmlyaihKF3m*+kBp=+W>D5k1 zdKksP`RE6O6DvZn%cFrdb@N6iYbWQ4ol0}(< zziyy{wy}a*UiB1TAA>d~&hVLgg+eaw)*8E^4bg8jlepwlCV}^L)0g!HFU$kn>wH-# z>llcAMC=KOy8_q{^eX0qSGr~IJf_0k8>&*lgQgF=1RaC*8R#?C`XZEFfd3=%QE27} zbD%fKz#o(FJn!HO-hrAVKYGtctLVp!e|ZISR+Ncp^DEEudgCu*>ppRMk35rQ#(b7x zEHr=cSq>S@7l7*})f%@yFW@?8_-{jeHjGg6P;d#x0^77j>v%ix%lhGLKi|BaHz~p1 z1hBO@caR&uQPXe4kay`KuMQ2L)rcF-R~GO^1}duPD%FfvxjXKY?e>@>^uEVGoWY)} zGMKvUDC08Z$uMb^zWrwPPmO-`YP!MeCo~vZHrG z=vTOkw8z@BS7R_|JE;PH?2|CG9C_V471cSnRWQHfNAtj)QeN#YM6LIwnoF@0GIqS| zS`74iuKXXiN$3mzeV&E)&|_H;PvtnzE&;`2^Zs%A+IfMhI!|qm{24e$Og7=Rf3PPD zoL|Unxc8eV8iF$%>^g~$djc`+A^RXg!{?yC;fEaK z&Fn;ez!*3qe_Lmo%=crq^4bEL-XUpxH~ONI@6z}ByZ8yr@4RvMz3H@4H-U>Ot(Cy0$8l{Yv!(H(w2Jn;J4@68O*N|A(#k`~RM$9<+nW zTXCRUJbeMq9@hDyd|(`{LN2FqEfULH#$ulUdh+(a#N*W~|p`t-X@*k z-=U#;IKyd{1GxX|NIHl!e0-W6uZem0W%MOFKx^n>eR!#(zO%mJ!sm8}{wn4U37LyH zp^xO>4V;jpD|rv_#FOlTX~rIJ-mPgE>3q;b?i|Ej>Z7-L12uRjPu}bTdiyHy%Ek}k zS35|1^VnM{EEi8FgkyHApzcS{={D^IZzT)+Ddhu&H$LEmJVbn{$Py;?fiFOEI92_2 zO}L1j(oDpP9JlL2o0L%a`N9iCeo{!s-uZ2uVVmbE!l==}xr&;?9?utg<2;9f?|Z#> z6T!FCkJc#FwACO{mX5rxK?yjoHFn#M+3X8%&Hux8JUklzKF`<_6hoK9>-!k5Q?kTW zHgOaIoEHr_Bo1v8tM5@LF&}ZxFV#-sYmE8*W;DP;}_)&Wmtp&~{lP$R9 zm$!8|_=0Dx_~33~dS4+2@7{c<3A7!~pl;H2=jemeOw3Z{r)%+PjiF(ZhJJ-_n%Eb+ z@|Q7x?cf@zJGuoshN+n;JC^nMgT(vHpfyIR@u2YwWn1br4L+=bHWh#n~~kDu1vnUSDfFeMu8v+Q#X7m^&KAi?@tp$qwha z+t{_@g*q|R4>%{;ZxKI!kD^7u`Te>~an>gdeFn}8J0A!Bl|J>=kLHQdH6!ULV#S=5 z7sa7%BcQDTJ=lyJU@xk{ImSG?Mv?e-qKd46b8L8t_|q{Qb7#bp!)4+J^o}IGhOHJ) z#h$2_OLH*8{ZJw{J^<~F2_dxn{$BCbcO^U;4nMuH{P#(`l--MfG*y*Ho_0^%(v`?cG8Ic!b#LPlAe#UV;|u%aF+BO*##3J2X}0D@I@Wk z|By*u;-$FP;BzW_hWyzVx&EmsF0$+Q{HQ8)TQ(oLXDihyeSSjM?7~YMzQvdFpV=s6l;(?B-%*bsCV#rUM2xS4{d(lgHJ7axyP82;1~|i~Ky)99 zxB;AH_kG07Y2bw-KF^T(i>;L}D6J5^*;pB#yO5eukwFbbfh9_c8*B-JL$hllDg^|C-P8kF5 z>%e~Obi3!u)c#7kY>D>~Ey`qDFk8g;Sk~JiTY){@M%VuzS62ZQ)!MbO6;V`Fuodi9 z3}oh<4R&E*C)kaJA`LUt49pBOB3Kv*Scr|lobzI!Ac$aNV_;!mi}^nX?*0DH&$aGa zBNvH1@7eE;C&H-7>Ogr->{_G1)&J_zPwsr(mr9&fWT^T`cJGEa8DmxCl0QY3g84?{ zuc~rC`c1K3w0ZIW$9W5d~5s-A!rD+JQ3&3Kl6pmnZN^f!d~EHu3!(H?GqgG{K9Nu<&Y4%G#B^m zw)4Uv#Cc8va4%MZ(04QVf}I2D-5R}MyaHXjahMlP=_V*puXWE-5@uY+j=&F2alwq@ zj;pK|?!j0F%i}<3+GwiIgAdx`zbR5mm3=deNy=yS==??h;zaJ zJd!ArFouDsjRv|dke$E|YY6b4A1Bt333=Ywo8eAezR?arQ)<%X&Q%Ug11TbNIx- zor3J2I7@v0!HBaX;@o6aV__WPES+bMPZ>rj&eD0_UN*^SZ=){vsh7M{za!3)UyQ|; zv;hqf=TjXp|9n$mKMLo01?KkJBOPTU(G%aFiGAy#8M3-vpHIVTC*?XgZevcpPG``d+Lt70!uB&R=0nMC53q>7 zql{+A&-K7XOz1tt7>zkouvZxE7}(vYy#&3A3}Dmum>ErbB35P4`)G9|y_E?4z6lpN3Q~B^}o-veH9z#yTL%c5$D-= zBE>7DFQ0#2S=UBXAkKk^^MYon!r_17Z0sTv#2*!Tqu%p5#uVrnv__nJ?(8a)@`mK= zUCZ)=Y#`#CkNn)syq`P|=UJK;t;?G)m(Fv1bIdwyg5)!&;q0`-+%I1*?>`}wN`Rf{ z8MIw~2Ko8HWX!Y=#LIabc()l)doPQZ`zwRsy9T^U6@|R-F>vJDLvzNxvD~X)1>eow zd$;|{xnX2&3;bJ?M57TsoCb5%dL?y)=XRlF6%CwiRBJ&7JmfA*_=n^ z47cP*uh3$?0c=p-;b-ONIWYR~IG;`I&Wzp$XkWmyW9b&LhNGTt;5^UQw-?_b&T7P& zb2IPb}ACWIr-Qs4LC#Lu+xi1QoVgWv3~$>fN00qTwS+Xl)rk)KB(&fblKxKZ=d%d?HY4hXihG(c2=2 z{P%fYdPc@3`y0x4srEM#r$+QZZ+>;J{8bxx!lO4V(H)VS10$LofLz_}usp;)2wHaV1Ye|* zr=WJ*TV3*QY$0EQ`Dc1O+_Zc*MEOxNxD>w+LE=IG;V&2k{Rt zpCf(Azh>NEiW(1bejU#n8@2^k0zbF({%$~=zoG9=++0O=4KaCubF+E(YS~mg*HVp_ zupnOcv_3f5gYkUbIWM~lj&?R?`_l`r$#mGoeRz#I+Qfab!tKFS4Lc``k6mR^7NO(> zEMs*0cIo#W(SP9Iw5>bMD8)}T8#)O4cNmYf#y)+PG}k+1v_juK>ml@!z~wjK{VC`G z4TU|C#zXPYs74Ls{9&naD1JZbeteYD&$w!XFAY2beo$x)>LB4Hl-(POw1zfLa@B(E7aS23Bj+RyT2N|iD6p>#mXQW^$dI4!sWt&ZNZcQUUS08hC+62XlYDUO8Z=6`vGAz z_9gPmUY)(93&=(SLpIDscDFHRa>GKY`odt@h4HvUvG;v!?IDwPg$HXv<0j2fHWE0* z?%+qvIrGc@39y#EW`^rBjt@}hTXahjY27dHs7kkkL zQ+O`^<46C${FK_;m$Q@DTS@!Y{J5`TEb#m_G1G9keL|ev5qN&Y+3VqEv93i$oZDUr z7spns@S%&YI8^qd!!0862$Rc%}mcL$^ z5t#6CkAT-L=pqK;Jnwl0Zjo1k(7ZZk7o(N*r{tbd3I1Ru%t3m7{wS08#9R}60PdED zytx_jbN5i%zgr_8GBlVL><^_!Ec0{wW=RC)Vw_;Hzsfg9UGKIoA@rK6W& zUoOe2kMgA#=w08GPLYjt#eQ%pX0HjW><4g3Idb;Bd~#S7pQTh0UC%>A;M508`!cX3C{ zc8adRH(my|Dtd#181@x>1qUTfTgnN0tTCUsh`J=zPd)=*zZk;At3xnd;Dg{OEsUHuc~4V6UTrOjW8c#|EfM ztXQ3&k+cKnbH^(aw(6~p&LKX_u6+|f6=|sha;%*F5?f!_&}%&Vr%S4^0nk~mkN6DO zUW-YdHAhezXI!bve!>&saVxx!4;rw+;Jv=Wedji&5%WhrJB%8`jx}cOn_?a&oneh7 z8wE~^dpqwK~nYtcCMKvTbL0<4<_Q{uI9|!Hi!yR@b!J~i+3?|dm)0?X$TT8 z{6szVbHA_cmv4 zKXtSdal3KEoSl0QFLlIW{OQIlwOB(PyCEl6Y0bI=_thWuSZn`ItVuC6it)UEtlGQW z>q^o{kG*BbK7ix6n9%#o;h1k*)cB6rXWb@trXTeE@VZ(PN4BXeJjNZcLz(W#4q%5e zc?iybngbhK0^R26*t68JXM1hH9odCvr&oQ}7tg*5IE^ZFK>YSy;uQj$7`6@i3}NKa z4f@d?f60GuhlW!9P-r5!bJ@p3Nsqtx3D$CVnqeQ9tfJ%Z)Li@iLHJ$NG(2n#C;1Mo zfp5Zvb29GACSdyDneE=LGM7BmkETvkQ>{kZ<+mF8P!D`g^|adZQ^1ZUj8>EBtv&X& zw|dbga2Wpeqjy5C{O|KT!b!=7{n1k*>M?u1Gn>>9xLm|`ic1R?S38oDQ3GVZwPp({ z>F67JQJ<9VtVfv!drb6k)8*y?DA?bR`Z^LyzTb7XBUdG;m|FmU3 zc44&^vQ^f&-!$+P?A@P5Sp?H~U_FyATopGK0}t~H-b`0d2-uGa&8@w^R}gZt`t z2WWh?h~=h1Pt^2t7~R>Q#*J|W{}nnN9y?Mw7xePm?84y-kibsHG^`;jL*2J~k4ZS>%Upto<+g?V9K_h10H1VUey+dxM>QPU0`G?b-4b3-u| zc*0pzS+S{xjv)>+O_s9S@JBd7^~q3eZK&3 z4~K`dP1twzR3ImKMX=E;F(38~pt?&USkVIP=hp#uY9G#a0ju(LE%MljFlLYe^BfF3 zWRxo_yA7^9W=hLG{t;iF38AzsXrVmF67ndFs$fp-UOJjP58ct%z>p0tJIlG<#Z2@k z^upS_q|*BadPX<-r25L9w*qy6ay zuvWj8*l_(W`B2;T@D^W$x0`KTi@tUb zdJz9OW`P;J^g8Wv9NUOp_Npk+JBv%alnhX-ou7tU3e}RiLsB!OM4>Z$(>QqW@kHMOx01wrmAYyw)aaAb#RopHxEUW+Qm6(7L&YyoFl9V~GuaBgU8F zB=1HCdv0qCyv2HJ{^LjAZ|2`|wm%ZYeB}oEgL~h-)-ZNymcD$ik-lpT8#+6(oJV=N z*&>z*eBDYV&Z@V9MJ&)#Q7pJBAN4F99JkXauvdDqi`9qzidnXVZBAy})Tm=Os9Xzj9dB!_YH99`u`ZnVm*$)vW|LoQ-+R26b90`VkY8 zY<8|AyagZOy}m23TEJ&bc!6h1eURm42fKkOlc~mBMN2mKdq6WxO?RCPG~~Ji1$4sfZRI9f zezHGykI+ZgMAOb`4ao62v`N22LG$Y{FZmU83DeV` zu>HEuc4lMG)&QCh1MaiC55RE)e_`~6N9-D~C*F;)*Dra*W}?n5Glzy}!9A7^{DoDG zK-^DP*i-QSgv!thYLLNZz^jenJYO=6Wy1{E)vlND;_$32gBNEFB}Lr($Vq+BCTPOG z87}e@BjLa41f2or9KI9Y(LFcvjUU+^#>|t$h zXlV9(@B{~?u!j#L$g&Q8_n}$rIPR7&;LFTje3LD}%zHs!Xk%JEVMA-HsUGf_c1K^c z^VlID8yZLtR)1g%>@cUq>#_Qe?CRuDTIB%Enf;|~jJR`1}fti2R zAiDFUn%F%H*#720@V0nrJOSLj4m=i{I4h&%e>l{!BF?w-QO{1Tz|gjS<6m9}O3(Y5 zReqF({h;((15doY`4urgdm6fSs9&XzGv)<7wu*ROzTib3OaDK%-!lLIwbXYnOATO; zjzRqw{YCV^am@Cio>r_1pyJedY-SZb%}T_X(JC3&HIfo;Lqp(R3>!a6M~Std$s;7O zYRk0X7Jz@$_6$o* zae>7H_jM0CV7taoN4E}(qD`D0rrkk+^WJ;x^AzEv;F#^FNJ=qz#?*+eV`Li5%bd?-oQy! z#5oqb*G|A6OaHdA5x$z1@HK}YeQKl!l?i{x`A-{P_UM|Soa5Q*s}tK%-2i_`^dnv7 zG6&Rn0jE$`n=9EgXmLzNe%QD#hAofQ(Oc+>w0xArx@6$Koeu4<<7e1{C(xErAy3Y@ z!RA*1F8UaFxC5WFsx2eP=Q?y63%;Qms6}$dH4=ZK@4I~>h+d1|j4hrjf&U7ke$`tT+q?{<{Ld9}Hb+gm2YE({ z)q8V)@;*~>wu^$H-!-Bl&h>a7c!yQwlNUX`sl>kGZ1?i=BGU#HaW>I=QHL|oXx?=v zZMOLu8k6>SoSSBPFrQNB_6$OQyZ#sE^we_#*iG=h=iv-L zJRQZvA|16F2LG?C`&rY*ItmH|K0AsrcX$_W0?&>cag}vh0WI_w@MW0(lqE&NYYyIB z*Lr?p4U@y6-vDmN4wH;DXn(zSQs9}Xo?(s|`O^`=)+5e7o#1QS6uy}gEiy)7PXG2q zAh|f!&G>o|vwb`Z&o<<-?eJiF+6&$U)fO?yKjr)d@UKqZ6JwC)S7MIe*0-tnbSbdm z=+9?GR1&Pvv#&e_ErT_!jAxplrvZ0Jimff4S9Nj4Yv+#s$XgY07T5UFhqe`Q-d*2^ z-T|Lo{`tSa6U5Idz0Lu)d^@y7*4WNW+xKK09e@|3eN)BZ{EwzR)i^QN||r4+q`~ zS^-OtdriP$0jF&K6w{2wo?*~YQIL;WgN#Y>zy;v^58Ps!f&PS~7#+#YW}Aj%o}aFy zGfx*X7wqenxxzCn{=T>-0X2*zwEnBN5cvW;3zeaBXIou(0WFit!1NERWNq95KG0_L znNqBZ-+}vbq~dj+yFaZ2c31lNu^?acCKYiG0w1x|UpI5vd32)fzZ=u`L z^iEpdjMczD0~c#GHr>y83AC;Lj&tU*CG1**jTAKo9FWxm*y@P}GDmGZwZ#awc9)*A zaR(KST+Bv2i=>DBaIT_5*vih4bPxF0Q>I&4(PAAuAfTbW+)0!|yVp~Hn@ zeJl7-08?juuo*Bpz=T|Zk6YDR!Zq}L;j4iG^J{Cob_d)b+lqKLY==7;`*kU{OLYG5 zT&Q@RG{Ki{zo>X!N8?S_{VQUgpzxxXn72xP^mjwxrH-ATD!)a#*Mt?&6qN3J@AOq2 z7SKEFJfyGr@BF#W>d`E2EBbE4`P1^otn?S^4a7OMS~FI8q@Gmh9o80hV@Fkyw8Rcv z=yyX{lM6aZz&%y}rwe=X13L5A#~+yM#hkl93k5os?<%R;`iUB7hyu@9Et(1IpiiYz zkmlMhw%hsbFZYqYB(Q#nND*^Auppk3HWD3Oj`dkG$ zcgM2Q8ZVU(Q*>|N|FVNwt51A!;M z`TMeQ`j;RIaR*;zOH<<^e9uhBiWt6ZA4qSY|0PA_iCAAd6)cK?iIy{F2)6%r6O=^Llu5EFQ@c3&JV>0?umKL?-#K#(q%HeV19R z>3tRbsD@c^)&kZt4En>+R~-Cs1-tbPJ~hzJO}MuL{CDW(Lo4cjjh<{OG>tpe#60?g zAZBb;(WN@@m^j!^eDMvqfUA#vpV!HcW^b>!EB`&uH?u6*%M=5hM4TtZC5fXg4djS8>-I&8uNUbl5OI!g9wB}` z6iFv=o^#_O#e(-b+K)Kb>c2(&+(QQ*DEw2R_lR8LYj&!b@f0!bI^!9Iyny@Ta8p5}h}zplJ|7kzWr8$LeB_06xy( ze)WVps1N-c0IM{4qVa|Uyj1D|V+Wu5oW4r<`c=f_2x=LnWyR~be1Ce1o?nVpf`u=B zkBZkecf9C_p(3{5y*-J6Cn$Z6WgSnFW7aLb-gV!Tnzya^{57Gz^dP$;hyNSr%g!G} z577W$S>RaY3&r704Y->yLw;i}x-F^5&+?EgL7N;&I`mGwjb2Dboa-WQ$ahZ>b|cRA z$Q!NFTMKg+X=yy_ihG5xjrX^p#+#^s4)T8EXmIV5BJsQrU1YREoS)-7Hw`g2Hba~x z&%3i$`t%|7)nr*;NpfLP+Q=)|^Vfo(lvv$<9q?c__n;R&Rcr703fcv@Hzgm9>sz3c zje7XY&~E7sH$fv8=h@iBn4SbY%Y5vpMiswF*Mp`)r!g;KN8gVKkgCfwXRj9Pm>PcMc3hGt&HdHeAkamEft3W;qW z?26x4#3x|{F#NbrrH@D51!pa~BF=>)JV_rIL;=@~=~gE;kmNi2vg`5mt^uCVN3W>K zKgxY*!Rm_7|MxtPsHYX9pnKT?aXxVKtkJQafs(gDujczb`GYCYSi^j5cJM?ldQ)V1 zPi^sb6L%0=qrH6L`}1Ak+<^ycni)tpor}1c_F4*r?}@XS3BPQihTMlLXhglb{AK8c zAMl6I;GZVE0rhjQW4IH&ZTMc$5B!9)s;bqQ4}1Zw?BA%_T6g2m!|SJ(m6GCoyYj=a zLtNS&o=0yw@{_Ef(IHb}mt@V4M4sph{pU#*Pr2>AL+L^L?*GR7=-Hv^36*1rA?n{Z_ z07xH~JjEtls)*Z5#5osnZoDit-41?C77A!HEk2ZiJT;?!$ z%*JQ$)EV%_KHbc`PaL`Xnh&-xz`r{L{=zO1^2A^@hE8YK}Qij zDDA_;`N3mDs9iF&y*{qwTeO6RKW6`7j@cb2#Xr`K5t{LJ9Lbxu56 z_cq2S7^n~8+~?zbF77RKFR>p9oPLSB1kIB+PqD-Dtjj;1f}JepIr$Cx@Ug)kXeZyl6f7wk3eX>BB z;JA)AL~F?xbGGFtBB1rHq0G0?9PS&-SH2!WZ`;E={{BH;|2CYyPF0Y0N-FPJ6*Yzu z`ZnFq@}cl_vrWXAZ+Vd~><+)z^9sspaG75O9LoA4Xyc5!!oL76zzuiesHa!?-=)~6 zSR;o_Plpa6ump9WIdE?l9{{dHi6(?RFF9}>?yJGG$4tLbjA;55`>C1{bnH%Zro9Xt zT&jk;4jay#z?1Fe107HM>Fh-?^u*9#8LG`>w*BGB)>H%D=2&*8IdrEsK{vZscXrSd zI%(*Ia`rwKuT1qOo5q-7#VrtZt39Eo9Yj(0M+>&gJkf6|%Khk_T|G%V^Y1vnYSWZk zY%ow1;_Q0yBo|burz(i^n(wB3v8le?v%BYQJAP81NZbp!`-J&?!x=g%U5?nc59J*L zwBV$}!%@4HH^u@3hFRF6AxS*E?ddD#8{!WmueuUWXUC&A8Gn%vd8Ve?-U_;tbB(X{ zQ$@3PD4@G{m%ma2o}0)a*(Hzo9$$e0Kn{sz&-m)N^XuS#++p*Ie}Fl}U0Wqtc0JDr zoRsoq5CzX%!e0c2B@A`4tMzQI82HKaRp4oHF;?u=KAfzjUD}im?9(@RE;rQD&jFLz zNYoTV(zH}Zy^uB12gB0@`U|-WSl@w4a>TyXe%&Nyjy`b!daBuryR&mjKjLnv;G6zf zoITH*?kxh|diHej6l&>lkKm(R+*cUx=1CU#T_ivHIgd8bTI5*i4*fSjx2m_8vsD?u z>o3Q5af|cyG!Of!r|C`jiGLz-u7KU@GJ+4p?C1l&cl}Bp{I!ufQZ5CCaD<+(<))=@ z)Swp<6W}WW&68s6=?0|oc6%b|Ni+1$`?L9g^l;ig3U{35Cf^D3^3LuGvQa$Z6;D;v zaf^bM1-#;GJr1J?^y9{kANZV1=$zbDP~F?#_(hvBpQx?`2ki&nHWu0#vydxa>1+U$Z)f!+{CbMM3DXupB|9W?3D|FC@Zw(I~yF&5f zT5swNKKb(KQKBxwlXin!J2kh3FlD_bwR@>3_oFXehB~Cf-*L|L*}|m+80gn1^nK2+ zxs6$Rx)crUQ2X|L?&nBa^ANk&`IGqt;J7Wu%;ozD1^7m6;U@5x{eJXS8J5!UK*>=p#mZ3%oinV4w+x%$sDm590=8BVm%e4lM z>RYD07!`-U8{FNL(ba`53Qt;yT1cARmHzOcp#%Spb8Byr`vKmBgejU7Qi*R2zX=|3 zZa=Xn-|=lE`9HwUY_}_))gY4o*Z^;A9>%xqqoZXDu`4;Z1Ny*P>`Vg5@Aq+jjhlv= zKE%FbbQT{Kf*J$fqkV@I@>$!%X#hM1KKMN2h2!A3Ek~W4`~luWsO8{?V)_0TFY(c; z<2?U%txD~HQ?BU^H{qoz>VD2A`h=*k~WNY zkd{8jEo6Dqq&{8)ef3eSH!wKPe&C>*HDTlS`(bCNMt>rRJ$HFi(*7{)i93mX1W$59 z-Lv~nk#VoVlh)-Z%l+tm4Ia>o_&d&{6CQFyp;r)ryur7r&1ah#Xan+d_uT$`eP?|+ z=hw=55kCl89Mb-1P^EC*HWS)1YvISedN=R%RZEX>x0=pR;UBct(&lfNGtR!qn-9^z z$5KJV%Wm`6=SR?X%sGF3dd`o525GZh$R~%Ozr7Y7Sl8eavC4#g4~7mHW*Yq?;FW;q z+7vy=gj`da{sr?o%$d7Su1d>rC(6Oq47z!ZU%L~yZ#BF+Y6tW4frFcx6NWvCfjbHR zWy@jVw8nC`DEYROU~c$a1Kq0L@Lxte3qQHC&L&~xd09(c`YvO);)CgsT1yWTU05J; zQf2IwFSZ%T0&yPaL$`&Etjpe<@}s*A!)frDByoD0H@HFYrX6T0jxY42PesuAbxJeN zNyL0(W<_t(poa%FzxH>Wa~C|}YUW~Ihd58*%DACz4fGaq_FvJ0AHGUYy`{Qt`ar(Q z@ksiGz4MX-i}*etbkq>_b4p<_zq^}`3bEtk(xRbnuO%7$O;%S)(cg`~$NvJ(zZ$SXWkJxN zZv|Y(5hayAxXm92_n{hgd7maE@zXNHXd>pE%dIEyt9;?znF>s}+=(+~mwq4zpQd8F&XAdTYWTS;o1@S zE6gSrMbOUTGSM;C4_J6;-*?z7_DlArpWvz_?5HLVxakRRRp=du#u+>B^`wu}D&qXj z&V#bA{vGFr&tGtK!2sN20Ihd^$UVdyX)EIVVRkkC`&`r;Pr$o5-kRSXhdu@8`N(9B z@A6Pb2JEbl1x({Zt>DL$h8)t*oiBo?UKF?tCKE#VvF@0Q4p5NNLeD#6C;I?3kF)7k z-Ue|vidt@d$!^{nd#hyBoW(Kwd5O#W1vsLmyN>dXBf)obga)V~mG22ogaKUlcZMT; zjaty<#x5_Tb~tYaUes^Y&_fiRcyC~eq*G`D9fRv&ep;H9C$?sb?G&QuwEe>UyB zE~X~=(Kh(bcve%CpXUixfZg>d7HVNeSA0E$LRW+v>m2Z;7TEtv6~_I69_0Q%alVoJ zjysDvk`i(L*e08sY;K^wh_grV1Fq48iu(DmZzX<#E|Ly(fv(N{Mtq}-I!Z#H($=># z?`ncs2lB?tc|6~$hn5B-Z)~|fj#p39P!IHjf&3hP8FV>Xu7Hf|u`u;sNp4St9ccdxnyiB6-#p;ZO!&eTltaj}Xl>uKqZ z;j?IG422Fc&U3%YtUvD3k1e#+B=VQ|&Q1x8jD|AiKM_NLk0?T%EzOcej||is=y$Rj zOoqq3Hw~?>LVTF;?wKd8ya}$O<8tGTWKU@71LF%n`eUO#sK)=q`Jm%BZo?@9%|)E6 zH#os1RWg+0j$YnM;W8ccWU&9NuF zb>ED)YoLXe9{TRhP56&8;AeWGziZl#KQP{~+9N+L*N}JpL*jXRXm2BLO#2xkTHN#__t$EgAJsujx#LZ7 zHBl$Mj1eL~dD6>UA;4dbG`__Ae>LJP`O(Kr_MlZ){>~d4?JM!F&_|Md4Zf-NaHb!i zA&>fb`HUzow~HS66FaO8n>m#$u%qZx!q4pCGB=_hT!EZidXzhP0W&)A!TK~f!!?6H z!YS-br+v-mx;N9%rOudXT)odpJDe}B$Q$ooa+dSMX^>t4Eu>Fe739^%r{Rb0@|$Y_ zFBMPBNOP4{c{%2nvoNpgXlBX_IKw6rp^0>2649kB&-A;X(;$U@Usw7 zt9yaR6GD4z1{f=y#{3y^mi*|Kxq5&@^LLz=ji|vZcN^$4>bgg-qq&wv*a@Ppvskc_ z8w||(G}O<@^Ja28(05y*Px)y#opW{9L8k}W>A5c4lX&PtCt=rbvxE!2tRdG|;9oa& z=S;yzp3)YYWz+n*5@^e>n1+2*Nf5Wk0kuFFb}lLvw{^CfGEZWkHDAj;nW&=e*xNbX z+Q@yd0iO(W{<5!IxEJ?v*AeQFqK#Z=BKFtMl~m)T3-{6`j81BTDRIazxeh%@iU>S; z@-~@thSMy8=i9Ve7*dFwioI{{$0ET4bEhh@@E9&RMSS|M_7dsSSy}EoI$kl;{{KNYa zKgEhW)ehV%)Xx(xRf0dJjw&yLx7xH9@IkWWQEe!md@(FZK$eSz5v*Mv$O_5rWJ zKMDfQDeFeIapFET?M5$Z{ji;I1#_x7c*Yb{MhWq2z$3h>p~FX91s$|u)0u|Mhb|Wy zqVGQ17nskN%Z0~N!6SzsjLdGT5Nhj>`7m-^i_XHQK0c&EoYlGSjlJbwGy=F%x4z4a z>mPc8-vF%@_|aE|H~q-Vf5$n0XJdXT_*Rk!z{Fo_t^mHJUxD!+zq2jZ_r0)bDJ)^?X5wKCI79p>7U~w;O_-} z+IJDgcNfFyJNm)cosW&h@8CbURzdCB)E9E#S)Uw>n1^%__BB_*s|TKgEBgs&W) z1K))XvLf_h>;J*d4V>*yb?|j_`p+;H&haVF&xgHE8#Cr$_l-FBKO1Kp^2HOFfB5CV zk3QSi0~)k{$Jw`CYkt&v_yHl#<02wB|J{0UzrY{7*N8g_Kh531$;3Fv$UkDoJ+mcv zU)wTeRyCk`;)0!Ey~W1&s6C6e19RzUC(IeIq1c;&)S!2ypj|KV>lL)Wp;0J8KX?(f zwE5Qi!Y9;nrohFWtMg58d5wJ&_J;54RTpdhfLCb>;#^cmw0;7t(H-P!r-owELHIml zpVeY&U2zHek}U+@x#Mz>rh5hzW zc&6w49cSk{UHE+HBfSUrBs_5=w+=pHAsd0YO||6KB}LK*U>6&IQ_Gj2mg|gJVT+an zWvMT;^mYcYbEcJqkr_2ql3s>wH3 z4euMR{1yv?7ce|t2c43)27gxaeYb9wEq~D+dc_?z@MJqHcW_eD1MKFjWyZ?~hrzq4 zN(B6%CdlK@`P0NK>}C9Z*+=L3&{g>5862tzZ-8B#g*exq+ggb2;ze%}=Zv8Z>~H8j z=x6rdao)V5KmTVo`a#5*+rEpNtU%rX?rU6&F5IfEk<_&ioRP+d6WfTo+;{1E;^^ z3cdW)RDY6!K3mikN5fxko)`AlRho+H&tbNMxnkm68*#@ecypbBue41U@e^YE>^X9X z(pppla}l9bQhe4sq1qC7WtxI-$p;8_h;tM053i?L8&9rO)1vobs4=R_7Xd4@BvMV# z|C7((7)J8j;q-pQUim@PFwN1U)^|Q7Uv3Qz*Dn!t`NBeKU*-Z`sStF{hdhEgkE= zZ)7)tL)?YAp?qO$xe+*;2t@>RA-l?-;F%bUUPfQgST4g(EGP(myKY8VDej!Lcd(zh zWJqgUThd@qmunhKY3EBD5$BOEVM3CLH$8cPdZ?DCum-xsGZ5$RbE?|+PxPRe3xCJi z@zX@UF0hMh5oeRNd7RQskA4^DxnD4M9lKZkO>hH)25}l-aV3Aopu#5Hx@0X4n}nHj z?_Y907xktN`g%QX$z7jE&@Sx0yX-c~cT`7j@;Q*2&D$$?M6IQ5qab( z$hL`Az6`xdrRB)mn?vP6v0=0T7?{ZWzy@qae|;45kn3Uc_G{6n6iV2|Rq_R>>l_1> zblj_k{3QD9VzXfS^nIf}{ZY~WAE-s1M;Nz^l6JeOzirEmHanpm1z+Q`h0TOi@CtiJ zhGXB?M;Htq+-}UauKQ0G&f#k`0bc57W}vVOaSmSr{W6d3g5N>Zs(Ij0G)obzv8#G} z9M4JTOhGfqm#(1i4)n|xZZ-0zHNZP{HPZ`IrUToLIPVU4Gho#b4|;e0?>HBYT*#jr zW}xwibK5#^IptzK=7*AxOcIyv6-gF|vr`W}w?M0-CyfIsbX+jkBSA~n6M-#162R?0 ztsyTBwAb(WbL?&etv?$`P9p=kTHoR39Xw4^MjOPrCphf6yUz;;W1#5`uGh-W4aAMk!20UYE85$N zzfVE027ExLFJr~Wz^-qIhBwKRMWO@rjNM(p8GF1QJtJ^!@JTPVTq_Q>25<7DnrzBO ziZ`bD()U`>q4IA4Uj}b714p#@!%pF)ix;_IURT>SXFzT`^2Yzfd0~%mKBZn1<_6$B zxmoe`voIIMzWZI)8*bu$J=MZ~uzq+Uw*|ZRIL!GYKVRoo#_DMD0&q`u-sY-9qj>2q z^ek&1bHkFbf4haeJ@pMY_za%KTA1f|F5_C^`J?{8H%3b zZ0oD*@cazug)jwmUTeYg9$|C~c(9UvO?fL1)Vi1{{kYtUPfbS51tqzi{RJIhaF)?y zq>qf@x}ZL^20mbgNs9a;>gS2s;IOgn!n{&7&S^L;O&BLy_feB-gNEkM+AfCG!yX*_ zl=J#5am~I^dj42PX>PAXC*TwA?2Du)2|vUJanKg4p(pvCH{umw999-aQnkDLL=W^0 z1#fil7_$-=SHYZqg_d>?i!chU{lHTLPZfUjZwoe19$$e8`FC$s_jV-zxJ?vY2mZO9 zp)bGemVu^5f}2^XGe4W@$^9De&(3}M<0m8Ge~CP>z=;n_*U{54fmA1AIUkR{yGJPI z8$H7KEw@m6Vn#aX(KcSv54>Fh?L_;d{QCyT)mE7Emt^sxeK<7sfhE}efWNj>O<@ax zh2Hd;uak)S88zOWebu4O3Vn;S3h)Fhz$pnM|1t%gPi{khpv7uLFA+VkE1m2UN{Jo7 z8>DXN`GG-h8A2Q8cBd*c)f5PR=00s-io^b@hqIcBuR74#1l*NXBWTF&QFI9UCFe0u z44F){p#$cDQQ#!JwxaO!(DU)t(XPY?ye%|U`V52aXJjbvi{0-Q#Q8*}RL<@mawoie z9LA@KO%5Q}!ryM|tNko@Bx*nS2tJ=AQxwyLwb;av! z{?9Aa�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 z�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 z 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
8+joR@3#!%t&S=P2l7{hI01I%&9l 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 diff --git a/rtdata/dcpprofiles/Nikon D7200.dcp b/rtdata/dcpprofiles/Nikon D7200.dcp new file mode 100644 index 0000000000000000000000000000000000000000..01e5cfa13cb15f3a4fc9ceb39d344dcbc836e4ff GIT binary patch literal 1045594 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 z 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
    <9N5BvHfsx$NQX0GbaEpcTd&StjZgU?x5) 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%0A|6F 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ΝUwX;Mr(*em`Q%9Mm4S9)IJk;Zbwh2Rw#u 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

    O)(dkDgtJuDyi) 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

    Jd- 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


    HzZ}19@ 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 z
      )hE&Fo?U>0_H_(@Mr9d+TJHsQ(zzszGxuJb1z10bzWTSX;t-p{oL4hU*RHqUOCQ>>R*J; z&-C7G_xd1OtsO`XvOj+GE1Ulv=QG8I?8qeCM~BgCM+dSFt_tet_?v69pN$f+Xa5Kc zmE~&|swJas%dq#fY0DkTu~S1nG&^j~J@jO>@I3IVU!D03;OoXhPh<0$1THa?Q+nqZ zV!&h?SIg<#LwMu`9pGiq-`=`6n)-xY;*Q|^Ojr(#t3x%P(AJ%FlcJ#q+koayfJSS2 zG`zXn(6H&AbPw;J`K=4JM_uQAIU0P}fpk0oxbdgaG-Bs4T7A!p-nD_&H=j&qbG&IT zuyc<$&Y}~E-ZV8QhURsdMeDUND@KkQbZ9Ik7Qx&4C;o=2&eS&>^+^VFl4D;lFem&qJmVEG#xtYIKB9t;Yoww)==0R*)p2j`PJO#UE2dp@`k9FQJT#g%O|~Ev zIA!6E(BPdmn4F|uMChI0q)Mn|IJ9%SMAM+bgX#GO^p(medb+n0S?K};fL(TF;7>mG z4)kr(!+{$-#uqMfp*)i?@*9xAM{aP2UoO0?>N)UH<6LM(4YZqw`0$qF-ROsRDD;>j z`4m4ny}BGqJy!(tP~aa*;W2r5+GM`lAM-BE`DIf+u@v|jU2qJdhkEVV)_vcQ)WZuN{p7C}Wf8Gf5kkn|3smbM)uTf)T@BF+| zG2g4Bq`YrYRMrew+5X@=Uxn^yM_n=whyFlu6v=+Ir{Yo%x^WlthqwL6?gzA&^`i0o zkEZ0Dse` zGhXn(C|9aOtX^jA=G6`^@KOk&XPZ*_o+B>6eW2D|xtb@#oAtLQ&+5zBd=9WHXI6$n zD>92W17=lmDwIwy3E77(xzq zf5&;us;|8Pv6vS@l*xSNm1+|U0JFvB$$_y+K* zg!NJIWq-q8;r?wK053dk18Cy7(@I4YjcU@F3VM4|QXKT7mP*Ld-HWC`Kj(h)>Ci&+ zrhDKc94K+6SHM<{E{Y;*=t3L8LDsE}1omJm4UPe}>L|2}^ZL{NTzuDh;k2%~J|$tF zvS?T+nS8y;AH8%T^9CW*&}cvZ(9V?%)&#?5vVhkUq5lRygR6tj@cEeY*IL56I;4<) z*pGVzxPtuZBp&z`v+hKAUB546Daqbs`VhWx@S|63oJU@J186$@==Z@NN9+IjN)NJp zB0XpX9jf)%b?T^C9cCIG&4G)H*~i-U0$)BomeyZ+#~8G{RP|%YFxZ6KPjsV$z*$uv zAIXobhn67n(eSf)2!TpdMw zx$X#w>v7@Pv4GN`&sN#p^z-W*|6mLI7r(4U1+Oc#(3MKP`eE{o=1~v~}9w=ec~xIcc%J zif*h1rpsm)8}S1BnwHQ+YMH~H;*M*Mp6-|G8Iz52Bfq=g6jZk6^)XAlOEH+MNcr{^ zZj_Q6O=eR(xIXq5^V-8>)OsnOh}!!rW;Gjn?c`aQOE>QwMg7iQ;H`kIeF(i)$5*v{ z9e8R_x5KZBH=`}9;emx6^xTC#X_gs03Qt7RY_BntILn(9h`(JSW^dKrbQ61!s%`${ z314}~>yhMwde;7x2VDRbaU#y+X>dStSU3fa$9;#L$WpsddK%f4&dhV8^T1=t>nk=26E-I`rs`8*PjaqVe8_)O-zc9WXFSx%KIqk&+I`y6MB54Hp%Ca4P zG`|)eOrK;_JKTo?v*7WuekN$*o)mC1ls@NiI*2-IJa%>`JuPU;bIim_=Fui+Lkb4g zv|)H4Jv3-Y;rGB1YZgcs2e+hs;R>=71HsEMqxIOY4K;xt=8}e#13&u5SN-7`{D@sC z#x8Y@C;7mS{tNg!$(=o@O=*uJ<&3%Hjq_~-Kl%^V)2Xw`-*w%P@G;W*?VuaEA`ZM_ z9ac|IK_44pXJkB+`63VKy2sMDqSfruN;i6R95vhQ(`?%|H*!K9o9q6C72vywh>WI2 zr;YgGmYBmJ51%TQaK&&1_7_p$ugUp|J(!a}1kP$(GXFXqS|y3l;a|0tU+?4zU7|=5 zTA$+CX5MrHaejWjicgn<|2Qj>E>t$8{qS>sf^**EyfHZk2hf$uNP4xiC)FVT<(+}2 z81GBB@A{GSSp;dUdQsLQABsr}r@>n0^y!%=b%I}SyEV<|>`-@FP#a9Ls-HYU1uf$7 zL9~1Q6TTC;`d%I8QNq45-Vrmj)?R^>GUoxm2QKy&gFyOd^^A|6`I|rPPj9-H@>|dX z8alz3CU*(oqNy*4xb`Grhr zUtj}--@WRH`t0Q}8QlXYSg z9MTR<6kEbT#ZKbvcN^FVb{E(piXHGh_d37%{$6LC*~2gj>%4otE1o!8z|Z`sq(pcy z?c8{rr@4`|8(apq{5Jo6P!#Pp(oo*Tmfwm`ho?<{t56b(CUSR8@b5JSj~9OQ zV==So6c+N=yzb^IztV9nL+A-+M{k>yO8hW)on;Q}#F^33>Jiu%$EKne+aR5l>rbDs zcgsk+AXu!p&?@hg#*J45 z(~O21dewg|w+Eb>UfYuBn88tQ)PXR%>YGFlR^H)mg0K1pIV9vx1O6m*8~O}OqWi0D zc&A-Tnw18vCr>Bdb6O;Hgpz3FDi40LUliR$-fq9vlmGrZlCn#Zs3>tV@8hYWx0j$} zX+D9k^H5L;@I`}q4B`73!+Z2I@Brs~@sq0Isbn8VnpbW4tev6MFD!;OuC?UX1LJpe zOB7XZZpcqf4y6M#Rn)23Pi}J|JU&j#X?4^sE-yaAb4zv6r)(Yw|H0pLO6xj8S8XT!4r~{eJ^~Nrg)Q_XFD);fYk+=a z1u))UHB zIl1F`(*8zTuj$Z^!}nb8Wv8uf6iLAaN%Y>uQG3-oiY8qJhPlX9TX-^(+QJ89A@8oO zb5v1d?5tne_0#(FP*C2$MEdOPtZk?VANkyPnqkyV8;4zt?SWXT$gtLK1SjrwMKtAU z8*95c0|#<8lGgRo(O%97rD*ikr^nQk4%q=biHD3j>XnzS$&R2Vi-6&9Utand=lM=& z@D{$?mAb+QJok(r)xeKlJfBQw9R2@_^DWgv?fLfL!)7B_^jVcnP3mv2A@e1eX;vu(+dG-odIOh*q^{|xgqeP~3V z^@85CGEY&vc5<`X-z8KkJmqVxxQdNzuNXQP*) zPi*4__|-__scGN4%-BIi$}Z9LHE|dFHC92tOXM`9UjSPHj@8}8A?S;434LmyF{p!` zy7ZbhTN+F8jy_ZjKYAndRR*H>Uvbtu^-@~^{pz=Cu>&=1A`D009o`a}7`X!kTlC$@ zOEE_>(+HnW`I9f^^B!3nh05dp6dew1)xhJz!Y<(4fkS!=4m0ObBaI)MOnJSHS@qpO zT60N5lb*I`uE11xLG6*j4`jPl&@x5umRuXi7XE+_LM}X0rq5yVhrlxpO#*gyJv6ap zWHSo7!PW;^4Q6g7Jn}~0^Q@IpN%38=`)K))g*8yoxmq=Owy9>n8>#5PGBp+2HxT#2 zOVHCpO~3U_#8gM{p8BZi$1ev_dNPWtz(a|7;Vj0kj3MV|*qam$61m24WQ2S^+;+U^ zSrJDcH^P(U$OLgLW*B9dd&t)DVl&J>`?*EYxV1)NnSC?`7~tJ2&Sbxgqo_-E0Lhon z6qf2@mvzsZ^x#K-u**OG_A~y9bBUdi@X0BJ!q;O4e$7d^(i^%E=m!nGR6?6{=m}@T zC;ioWVI6ddEexTPU|J?@IR~s%dC?!*)-id*?nfekXXoKcE#nS5Mqgtsu5eO{O#8kJ(O16}{B7Ah@|W>bR0l zRl{$1U{|r&G?Fg7Po#idBp$em8Gb7@tzI)ltlkkrKcs4ER4*3`OybD%L?SpiN#e7T zIGXR6KqhaKMCYyWha3Yx*#!aO>vgffz^drTfp%j2;Ao0{g86vM-OMF2ibPZJcFq+D z%`n4zGtrxz;YVMZ1D@RC>3_v}!*6@R5p$$h=(~&Wjud8K_aS1x@3Co-AS?`^tPQCo z4m~1R-uI^>bLevpsS+|OP8`c?Oq% zey)POtpx5481K+2i&(H5?py~Aoh!;`-Ear_olc^zJ_6I91aHAPNz|+5U3Rq+UeBoa z2JHXBcC?n$9Xr&7&)}PRMox{P=lM9KsrdGXoOS@m!p5}}eWDcPUzZv|j2KF5iBkH(O&4toA0=86+A=ja4o(D6?*MX$AS zRPZp4-o9BV>iWddwhPhJy$4hgn}dU5t|YHi=yGq4f)62l-4^a+#RgGSC-Em?ey*U` zERMRKnL$4Aqp!9~BGuKueGs-Z?=I+o!yCE@7&iAHVF~usfn6}K6E_HHcqgnjL-X^@ zMd9=de|XBL(uLv%tP^6sekuHR^INb+uF&vlguUJhjtxVcwR7MP+rgiG!hUeKQ8Lxf zoz3pw2%@?009t0co;kG*p-Omp>|TF}wSeCH;k&4f2b8n7EyL*wYT&I_@7WIQq_mz% zH9UI7Lt+>}g!r{a^+{1npA;znHU|?Fy37PYdXQK5}Mbt|`d2oiDvAZ7wVy z6iZK9&!Br}N0*po!c%Ve-*FzDA{DYEAyfq{=<_COp=3l5>2^<}eq9QMnmqK>*xldC zd?c`1f4bNfJN;l2mi649x^KXo`G6zaBZc>|4RUq6G0gG~-l5f)+fR;Vk1&Th-6EMj zWGrPIcDwbvFzZMyU~#7Kw;HOU?rTo4Q!(%!f1gBytRFMY<1l)Fp1SDtZ}!$Sf+{8^ zQB5Bc@!+utYVk=;Cx6?B9akEHgxwxS0( z#a7VIJyO<0v_2S4=jLEGG~_$`4=ep88kbXxMjz@C+PDe_#pT@N)!R%zV~kF6vc#M9|qCfZ2H} z{TDQGD~O|*h0G|y32HC44&gL%tfPfGnh{iG}$o2 zPkFbR6*72uoj`uB+{ctZgXtaSZ+9(5_C2c-Nf8OKssX z-7!iSB;ic0(ppW$CnXd-%mxA^9^lEM@g;;&|5 zv=P42J`0S+5a8GsKR1oPx&r`;xQs1?@Vc zSlT~+23>!Ar&#(nfeOn1j8lMp|%K~VTHkC>e zbXZ>pXb$kHbo@md)}t{nRL4`OrKtxqog6?K?53xWmNC=km?>StUTOV8wi|Iao|a5a zwRw!+2Mz6Ncp3Yavc3;616Zh`kg}U>Ca?s}y8*A#@FRN%+*%U)mmU)h#2zc)J?fnV z-i3v@0l%*o{4|Gdwi5%K!)fFMHIoo-$L9x-~+Nyy#w;K3i%u0N+8;X;$gBI5+sdAl(=zJlR zRtL(d$9H|PSqbKFo8f(U^BPmYOYSmeANy+Ovj$xw$mm4?rOl`p1ak%TJm5=%`|Z?z z{Srfb{tVg=KY9%?cLTru9q0Yu!i8-kz*XN0UX`#)$PB~$M*`gbf(t^6a%c`io_97p^wVOBC}80!fggOw9gsO>2wYyB<&nibevd1tbx#erm_OeVQ} zGh4bVh|YtvaPY8}X)i)QEmuQR>~Eny!T(E$`KlV$aeFAe#aw!Ots7 z+J0xg)5A!A1u&GBC)kP;;3WmX7x`-f3&VSKy7MRgMT!4JJ2AT}twiXU!UflJp^TNZ;RPuHdg- za0!R5Wg(;dFv_wFp+`fevmU^#S_2PM@ZhXaQUzVdZ@yHoR%?G^4{*!iPn^eN{{5c+ zJI>uAc)=X|lnaP+`_YpHC(P^e5a(IJi-dbV$j^xL$5;D>2J8GO4S8d3@_qQ7`BMr@ zp5XV=6n{^*som##^lAgCT!$l%v1+r?$N0;+dmz;mlrVe-#d^^nt{AD6*?F$zRU%@ z55rg3O&`^;$Q~gyC=T=d+Y4Fx9_S~0R#Ug&)oh4eDA}OKh~AXTTDF9@*C}8sj&5O- za-!Ss1in%W@NrBcGT2$n8>Of*97EO25m>dVw$XHF+DvvM z6Ph-Gz{+f2%7z5OQ+2VDa$;7qr-<`>;F-=_uV87eVbD3~{*&1!ivHH}OsleZ~twfE{q90oe zEs^ZVBr;cwWF|{P=morxrgrvWYRsz_hO6m#h@9mbfjf`$Y`Zarh2cEE`~r-(j)Lhb zgQ@w0cruwWi8;(hoWrn>Zrz_v9tS;^yD`+eTR+woXU2C}G`-C0&*pbGhd*UE~$yB|Wy!I%rdhcWhJ2vwgE#y|+w`qrwro>;}%s)sN7l4E`pBUE}raoJG>vIf!N1RXq z0`K4_xV?8e6>Hb|07HT}*PXkjwQY%*m!#1Bx=-4>;44|X!LRM5snBk3r&kIMz)$~O8%cLY7YI3y!F0N} zibgd#EPVb7@7m@Ha4rrBeS?4}&xoMHv+ISeLE)4$4*LK$M%W$!{q2q5jodq-l|oy7 zS2I64ze8E7|09Op7*=wQnE z5l{9;-?ci3vkkn}7I@v)PC_jjY7-?w<;yi4tMM`<-6VoAVeU>XN&=pc7Q@;V0^ZWT$?VAf+v)vRFPVw2FL z=}R-Qe{T-Y?pL2|q-U^q?llGaMIK$GG0;_LhFM&2V^^ue^bned^BiUECN&BQrW1AX zbiGw~=|u3PLV@YhYu-Y7#u7RY?P5vC&00DZ*h}}_(KNYrD`}r^0aV*BirzfxBXzC| zqU~8KU`2;XZL6SzX8SmoDBKPC<|0-O@l;>RlK?eNdBq37;() zI2C)V!G5INo#w6wEPo>t?|=R1mrCI$`JXu3%sHjCszq&sIHw=5(%u7x=Q83v`JJ@X z5dFv?#989F)%~CRPzHSd{Iu1QMm6wYFG``}&p#!1uunLJoor(_Cu!?RIM0WYso!;f zX%%Ko%X=r&)RT*(c^d*~dlB$R&$ml6W(8900MvLV&Pvy&1d+{U%@gby#9`L}JHrx_mx(tgF$!&L6&VUc0F~8uG?cvBdf_GL| zA5U(E(2>&wlK=KNx>aYwE&bw8=3QgyaBl<7=Ab{c7ozF(XA^G9bznBeM$zf8wp?@- z@DD{QimB?&Eks`OJ*uFHZ4z#&CXBXWukGRL$h|v`J{0;v=ge!QQ!e2i91}#JNGY8l zSCCaO{Ns1KN}eJ=xtn^^)B2|FhlgXn@}D@{R*2f9nqbOBoR{{{(`G^oq6BfCbS|&N z)Esyu#5p!2P|_H8Um)UKbEj4^^Qj;7sem!i=__6F!H@3t2A{fDtaK6TkVXfw8#7)f zHN{@w3^0dFCu^l+pc^p!2zD!vpGcbp2hwyNcVeyqcN#Tb;Q1s9@VDnq;67@K*-^(R zXU_F5a>y+;#Z?aC7Gc+OY?PWtot(rGdgMt5fz6m2z%_Be{r@e2LL&pYi%!AR0q426 zYCQJ_`1ZMo^X4<|Tw%FC1v|!)PakK_3E0agLNx8}BH`E`+>bLb3(cF#jl2N8DPUl{ z%3`_p=R+t5+SxU;)49p1VRQ^LP@_FcE)%_p)p+bO*LUU8Y9eS!S`hWwwo@7je>Vwu zwx{CLC8nmawA9S|UqAYflQC=gPn;{J9Md)fu6`rp-0Gu|cIzGRixKCR8|q88HVmL= zCBWtWXf4t0fY}k^yh(jl@&f$F;fV9}Z}w6T#JnNmY@_m&_Qz*&e}6JfTRK5nXShe>6KyNYDqM-dCgm?7YE-Z%=yc88*|3crt5&&ex;-ZHxD@2 z4ZtB+ee1yuM{S=m6d0H!;v%q*sNJ1NlSYo@ERgHWY7?l#xl!DRM({rV7EeE%InK5h zc<9I*4%0hxr{Mt_)iIW;nzrH^cmq3E8ckF5yKEHL@JNq$}PqhY(*Bbq!p{7 z4*+lUu-Ns|K~I9AAET!J?+c|{(6>GT|97Ngk#r^MliP2gLsC^DU3fEyTGhnU`n=uJ zY2O3r!0I@9n6X~EQRYvh>|%-ko+WLIJ^$0a(G+(oN7^?C_YU;9*0d9(CRssba#KYo zM%)?W^*g1UR7UwbgD4}lr_^RQys_5# zk?Vmbl1$rJ=ql=Bl|UE%6X(#mH?&o+f@vM%e0gQKwn;hkmk{Sc`F*sxxTDu2 z&OvuNXvgEeOGlg?FLcoE5TS{RIA40zL#qeOLOwVV#tL5h-VC(|u=joXdTOt)1YWlX zFa{sx+R0o1a84gMYN)Bkj&d$ivv1j9B|h`(YJ+=BEjC?d=Qg)iv;gei~053@Wr+ zkQ2TGH``lTq}|-fpEerA(v3-bw2eOb(UY~&6kg1+4?GGH?>`Lt*aIEfvBUJZQ zUwDF={5$*|N6xYkl!@@~o-U(L7UsfZa255v!f4^32ik}b_=A9hn)@Y4TXkANQs5w$ z_HJF;qZK@RExoA?d*{|UHG$UtC(d`?zSg#Q`Nt<+b~#@ga0z;Jh;x}|zSaP`3h9XR zMUTVUGGpwm5NF@&a;-V^g$xmA-250?0_ah14LxWxTUd?SCV~N{v2C@`7udwyp-D9F_)ekgc;M4c ztLapzR%pBe97%Bc!rosLp6rFr(%M97?{iz&HywQcn+Y`R(Jet76-04Yd^DwBD;A{f(I?tO(Z}JBh0w`}bFzxchw8KL z=&e_0D5z|jCA*3|k=H~+Pe|$G|$Lk2oqZ282IlM)l zIS6-3<0#JqIvcHdp$J+)gDO*L_^d!-e@rB;lEFh{$XsCq-njwy;8VY1gHU=*MoGZ# z9z1+V@aqp8ett6LU%4zCatf!Ny2;=Ryb)G_^Vl4Ghgo$7>_vBA*l;JF-)6%)ScFlU zOA=jq&>7yxp>%LDa9l+$tl_5+8hkX7UQBalkv)TH>zV}W^2v_XM*}xy1x$Euy>Q*$ zkIt!LX>j#Z!Ev-N>As4l)acJbfQuicgE#f_Y%}(_23in0k@U{el}*JQH3VK_6`!ZG z({;ggcc7g7o~N?4b0-;bw{6@Tx$zv(p+zMg~^ZZ-DZhxLS=HX7nCL9^v&8^Jd=kv^@1 zF30N;!nd+GdO8VuTyNCEeQ-Z7{RRi~dbTiRaU?Zb4(!3B1H!?EO7g)@yhrnLq0dtp z&72Kx)cOxXOTP$;{*GD4@WyNhymfkEE`7Rf3l@_ZMt+qV(lK;lUr;w$_<;K$9nRK$ z0_N=@^p+z6SOYv8_yg}@mBi+p$Nb^8nhX!lVoCMTzH6g~=Gsi=o{oB{Ya-3+9m)o~ z0*8Myo+j-h_OlzX*Y=+3O%F>lNQ4nubw8&?xR_w1u6>2fkl zc@jjyK`Ij4uV=%J;XfOTo<%HW3j)D~87iaYUiVmJSIk1+h0)_7?^zk{&jsjLFB?2z zkM!bc>&T#gcY@I$(rD~FzrXf_!=4!noiMX^s{yC@v9-_yc<}sk?7l+=3a?frk^%Cz zWm2Lrr#6l@2BUvTTqh_3V`wU{VT;C<3TF2r>DeK0RC6B+HrN$g4*-72O_#kMA&2iI zYV0^`cD@{*&LdMOt#von@oYF%RN$_hF^F|G52sXcd;$Vyup`(H&VQ+)R%VIJF(QmU zYoK#GauIuvzAV&AL(MDJv!7Ye3_J`RwOb+Uj^~V#&|>X-h}qWzb6c#Y>^29PMR^FF zdYed1Hs!OCH9>UeQUbkLH;32fsYyW?G{1o3TDYYfahH3hcFW7DsN(9{)?BsD+9JO%(OwMj{rk9=Y+Cd;8Q224o>^mBhp4&%e)kuDq4IDd zUD}1%`mYcwTgOvHY#Qa*92KHB#egdUZH@I0h4~$#$n6%i`y%w&WMEX*fX}|-wH;f# zS59{N&}px9VN&=2s@Gx$5)H(eK%Z0{Ql2SvTnq6Ra(44u{RYQX|K4e|f!bu5S^yN#h z*$>BXx*ZKIuhnl@1n_&u%GI=``YyYSc~p}s#J{A7DZ!CR*pWcnZ*E`>W1)L91A0fv z%h~n!@J9R+OP6}*GhsKpEkZC;WhdB8BkU-F+eqB;j(ygZQzUq>&5O)LE9*!aJQ}-L z?}p-hQ)qyhA*bL^_`!eT^e5*3i*tEdQ{nVuaQbWE`!GZzxK7fL^l zVQ{@83xv_5;wfbow2%5%2#asU(B8q=zvwhzqZLtP^(~cpPqJm(ZB=w@V=4{nnS*l#wMSp?XKpM` znU6i`5)Gxav=qCkpu;>+L%}u8#Qsm9oq}3@Zx>TB;RZOidccyoeq=xWpbzsjkt#wi zu*&_=I9-uIhq@hRmx0sX&@i4_>N1uLt-J@LVks;785;<%y&;(UWm)Tqw+d9W%OR3p z4SvPU65{C4ovn@A*YAnzDdx;Pi555uZMBm^y!T_^aN}mP~9i=(@y+4Z5ZJ-la*p(T}!5cjb9l4~TEEqfY z=kcjD`cp7_1fTJXop8=u%woK)jC$hUwUWZmG&+LJR;5sDEU|)y&{KK|itPoy5wu|5|uQV1X=0uQ5R5A@NYA$YV z2OlfnWZGrjS)7|Iqs7qN;Jdhp3rb}qvrDEmWBQ1Tl``svcf|c@cX0wf_p_$>osU?H zchke^2KEbycfPaWH^4anJ1y+H#m)nhcJo9$^(?*3PUnG(bS)NsSk>(LI2BFK2M(n2 zBy00Img;-{;r={P0N30ZJn(=2{K*?HtZamnwJD_i4D6!&G+{pSVy~y@2h-LGeofSL z_!MRxnHPm7Iq~EVEY0ZO4Oly1Z<1Bei{M+Z^4cg`)CU@j#uC=1R7EeqwI2{OjY&{j z-Yf)`X@!Q3h`>xYJe58TUdo(OWmMcHmF!RCu`KXd$Giu|#_KQ}jTz(=%%)y-IL{7% zyS))-{=|sKEO>kbE%XH*`2APr7zzJk>~7xYHWF$T9_U8nnDBH_7P`72m32{G>#e%@j#iJ>P%AT$Ln$83hY68zkxS&$BCj6^JWilZ@p9_ z#KA-08;f_uIl8-eb{P1x2b0J<&_w)Iiy57vnldV0va!e;a%e$sID3a}wNg>VjacHm zwz2%x=uHH@U^w$Rww62Z>fDe2n- z)ZSm`va9g2jNFz=?H8?OCXa#LicY0ht#>oiK{6USD3wghk2CHKywz+mr#gCzJrjYs z`jkTEpR1Ysi3n(efY*FmPjq+|K^EAT^)}l>e9uR@Snr~w!<$p6Eifk1+dS_w6(ma7`;qR2VMdXyueWWeOylZz*jFXy}-`?RML<$@$_iZ z66OwH^a&+@G&dTe{@vyAw=TrWPBua$?yITakQ1gv3Z1d@fAmrP^%7|BMR@QGt_$_vAmukW!jd&;$=z-HiZwu z$R+GZ3;0ex1~zYR9xIZ{q0Iw5fu={;oy{`JLrwU8(FOK$tc+ga4(;dql-YHX(G~FY zO?&=e5_qdU$DV!fRU@%xjEoLCBQH(05w~W^ppyxYq>CLyr!O)p!1I9-eZ=9w+C}$- zCe?QjakvpYUI#+IqOq4~UxFQzS1RpUClmM00#08E@8?8~7-*)VZm9o*i_=A0cu5;M zK|7^5Uff*{3@~z9=WS!fALt7Typw66vz7Q-hQ54$64?wn%{l=O+<8GFB|0QAs~)km z_t+n;9%tYahcEwIPv%)uE1{uDD&>7gKhiisc)edk+us3?wD6Fy278RK`_POU^Fi2a zj&}t)BxaEjC!S$R9F#18twGw_U`S-g02-@L9yWiO=rgy@oc((Doz5 zX7KBA6jMpwZieXET1jK?q>^TjO6>7QNrun|7|=LFY4P9p57c$Jt~qC!%(l{>-)ch z17rdHjcPAZatHfE?CdfPEkp%8+Lj}?|2nsqjWtnG)0LRp>BUQ) z1H*M({ntHsa*MH$?2tjSNKkQ zx)b|)yvyP65xXKX)eiXK&cOb6^$m6iXOi=TM{3Ah7LMGqaWr_)j=JK-q0n9!3H{6y zX5xG$YVt97FN__;-ba9)znhe_r#BYwkzr#u(F@*QPoQTa`#wyp>Y}9j1<=tl zpC1t)P%rlyED5L^2@r~&da#Hi>N|D>2h@04_UrKVhg*s=B3tRXNIA5zjo`bfixvt}$`@i+Z zmM40`&$h_Vzu`x4B32msL___Nt5=pD5%w3VsSVDy--6FVt5|4izCax^+Mb=56h~_j zbI+er<^=zWlq=9Wc;Jg18$|`j(&&-yOty7_iZln(sQ%PSc4dN+O1442&SN{P!)#o+ z5#PT|%N)PT={@p1UsTS*cFU<-7T%rm7c6p#oHm2cxbagRYl^$9?J9U_Z88?`o{*CS zyaRcVt(awuT{GfV@wkI1RVnBP{;%y_dy5m^Du_;{(H5UUqEo7p^zd^o&-E0agNL>6 z3*Im5VDaKd6SWMFkDT&uppRP4tl}>7*fiy2)KUe@RIN7Vu104i`5ksi;}Ybn-sz zB@XNsNn+P@(h2Yr^SvTT;hauqZ%-9}URTkG&gry0P9pYEC@Bz0%Y$fJ`Y~CO5-37SYzheIIf6ueM`mS~&?(l!& z-hR;x;l^)hFd*hVtG5Y#FtfRZbDpCAM5x)9KqrrlYSf*87i zJ2Y$0C^jD4XeHi-eq$9Z8F}w6KBLHtd2Gc^CGE!7%igbHVU3ma6?Z{>-A-0F2QkP0 z#R&pSM$8>_)2YzCoaF%*aljy*elDnDd%y$g&^Vob9s9xdcq?dyIegob8;OGoz=47X z{e#ZUL~G=w`7P3EWk-6(+~^M>@{#nt?^kDonl8X@DYnriSoe8Xj-E#@&!dg*jutINvH#L+qZbaH#tl8pc!Q^fh{c}Bw8 zp=Yti`}lg!RQ8gOq;kB21G^`(T=3Cq;nhCn874#K)P<4&VnF{#&gbw)Ktt;7xEee|Di1SeQm5m1vsEZ3c?iGe& z6Xc~hw{+SOY9U5lR#Mb}bSlPOdD}-t-ACZ(aq29-N4|CROsCtX-NhS~Drz@1oqltj z#B(iGG!)N$f#DB|L;W^39h`(~ENrTbPT+G1*sz?{ZH}N3IR9hc$=M|v;LzKp(}MaT ztOWR)Yj{WU`kWH#ZekXJGw@HG3;h3_+kc+_7v~{Vkd%)JF25j=Af zrV96R)HD~*ceZ2+4a5JbQ}F*rlnO(k1+oF>@UwHJuz64n&BHmDn>A$3k)I#oY|FMe zux9g77a<>}ymw)5Mk+}kcWcD=;j9ex|98v=6*v4@hi7tni5l`ub`nd=l2a+}+`=vk zSw8N&`M3)lR;*@5n2kACLQg(xD+>T7>mu^TO#To%{s?^>a+K}%lk6$pg*|t`Eq!^7 z-P0;a7x{{{tYTfq;-0EVqgIKZ*@b&bGDBVpG5*D@@qGInJh`TRWMjb9YJM8JF5|AS z<;$V#f&0-gBAc}+0*~MXW;+wdv2Q~o$PZ_Dg|Y{G0d4KHV$41BEm@lvO0qeKnqf_r zFt#EFUT=TS@Kqn^8Xo!kJdgZ!vGfA!jSq<7j*$i0sv8<2oZ+&2hCkQ@jY8I;I``_Kb$Q)Efgak*4EiK-n%f;H`j z`xkxIj8Pky-$5m1UIT_OEQf8zeQ^RYZ?bkZYt9tlZev!tJB1B3kW(+j@PScZraLBr ztheJ%vC&}@tk9EYqmMIsD&)Sxd}A(Ztrf?FR?n4mAr5h<8z6+^y}lRmC$^ub0FRHF z_Wz#efSo(t?GWeDi08zbU!}6^8oGezif%G(ueIPl;yI|%cI^S51gb=wD^A|gHlR2% ztw%gR83e|eTCP3fIZJa`_&G{W0^(Vncv{ejl+#DV z({1E!q30nviHPTNlQ%;5X4vE4+5di>&|#^9=HOXgW5gz*H<^I%pVO%+3rtXw0lt27 zlqEC6&(j|F@|Z{?X3|DMZH}Yo`tU$F2>pyDsEa~B<_Mn{G;I*iFAKtj6L-Stc_=sz zQzlu>uomJuD?gwd6_7tjmb>#NnqT#upKc7I~qYCNxhreqhsrxs^&*2T3F_l|u12p*d!c(boaaRJvx^U=yG@kB<7NBb^+u3etn{57F#Cw-m_CtG3Gm<# z@O&d=m6Tf!J{g|Vvr47y(5GxioWuG)mzp}k-wAPk_t}VR=72bV$2_E2TQ0mMX5px} z8+l8(nlUPx{R(@o3zN9-s0R`e+Y3Qa9CcUF6x6gQ?dNfC!MPcS-#yzgo8vs>Gz@Xe ztlr9%I>;#j=dEw-5$-N{n!E6h2VObDWekK~1fKU;-{nG)LrhS&2M537I)cA23w2;% zbpyVEkAlMSxoik%%&$VdXNL2$MjtwKAQz3^#}GAK zBb`&ytCwSl!~NG`c&?iS@!T!>JI+3L3Z)a8gM)&2I-WiwJ$DfrQK&1@!}Yn3na~`< z^MvfKT-B%q(!uu}eeTIEf)=kc;+(Q7jdQYyp_bq9`|i!=jG#gItr~u9YxZz`2|Rb? z+t~}xa1lSCyMl9Dzw`+=$PTqG&fDeUU);Xga$19UZd+o)pLdc|3)IqsBJ6n%GdE}4 zQ&Z}@@(bW?lzj$g)lb69yUJ-No=Z26;tNs7#^HM|JoDktAy-d9P43$unwR2z$-~_@ zvR@jn9;=`b#CF@;H2x5B)PWP=-7p337$>9TT%2>EKVODDf?XgqKeNsGOlVLqY5_dw zuLsVKH@U8{@NmJ5H{0$8=Xpv-cF-gV>r%umM18))1-*xvJEu4sL&aa< zj}AZjh;J#>@6_LYN@VFB=~5eT8-G?tjL${}D~AKI1*jGUOM3iX;_s#ThpT{!t4R8Q=`3U31|V-Tmz$q@Nd9b?!Orri518B(3d#3 zQK%JF8~8yRLMZ~VHG8GtIq-9Tm8H__?Na{1LwJS9V5Vm5&X0wreR^Na_gW9;dyEdJ ziC>}3JANR~ZNS_caU4Id1OIS~l5S0b_UxP-u6!r@2p!-I;YZ&WdNRI6e`X#3tDn`~ zthfk#J~G5vnKhUzDTC%5Vmom0JkA9^v^VhF-FH9NuOE10i1U+%54p$CQrL?)&!26` ze|i^9?NJ-|Xx)lmUxgm_IckjC{rFJKvVxHtHy`!nKV!z#3ppY4ii&Uc0Daa!XLbEt z-W(jVIjEzC>t*xluVus^g#N$tHhzyFBh6ks_c_WtFd4nxjk>z?IX)kE&?J0a((FE; zW-q7P_b4=;Bnm;t|S^(?VBv24I;YS}Uz`LyV-*KM5r6U(@3C%^s z`RY7x?$L1#C86i#x~}CqCE+~ddDD)w+#%-#>VfY$6!4R)ZV*Sli1YanTiyYBgiAl7 z_6Y3Ff5Kd}FY2_f&@B)9p`=B)*TP3c@^^qkyLAfr({Vm;aRzg?65wq+?SGuzg z_vwnAd|tT>xOmK0Z3O-b=Krhlj`v-AmG6z`XE>7=T&j4Tr=E}`I#c{gm@mW z-+T@m)ZgcK=fVdEwbldZOCJGl|Kl#ywR`9Cui-mz%OjQY zJp%ZS_u!NA2D--wWc-gI;E&*}cAk*R8$eIy3if5~`^@H#nub%~M%Y(QNartk%BbIN z>?=Et<1bFcet%ptjY{3e?Tw7V{#rvlcnkNq@96cg|NFo7^RGZxF2MpixHz||dNEuf zgZDCGyRXA`?sBY}F5y`x>^|qvB>{V}bm*Kl=5w%n|MeSn#j;Mk!S!f*T7$VtQi{MvR-y|5&4-&d9O*OtSfC+ZjU&(1GZ}H z82%CJsMLcR@;JJY+dl+)u062Ng&+MCU%5JnIf(P&CcSwze5-BVLn~~`B)-?- zNE(5ftwNH>&%CZAOXT6K&?S8EEMOdvSGQ&7@j7eect7AfuRYB7$4;cdCgkLI=lSG~ zGO|Q{wRF%EzL!Eq+NEjqbip@XCkXLhjJar>KGiIZL+ z*s7YKzYe;>J0K5qT$f5Q;d%Ul)Bwss4_54u!JB6K)3ZYOnSP7pn*(ngjotc9=UIHi zxIijxm_qBmFXks1!ygLxz}-Do@kPg=fixzWOct!-N9BMM^d4B^CG+^Yvk}yL9%3}3 zAK$VNb1+>Ea3--_Q`;B{icNx!jEnnA4e%I^|BiG0yK&qL^HeHFoOk_P!1X^0%{j!@ zeSzF-QS@H?C#H-Z;7N8$jQ&) zpPO?GvmMj}`{J^BeP9gEAwP_}zLP(njyXmy_PKP7ABdgoX}s?{uH58bW?*iE^Lb)Z zHNSowa`kNF3V$6cei=bRBEJ4bpVk}+r{5Ei^JmuaTcAOA#0>p~>JFcM2HIk4fkVsQ z!N0bEw;g_;CNJjj>-YH4pe$(7UsUqKAwSCPodCR#H%O4qj?T; zY28Y`;XQa0Ag`Wly_UC03!!o?u<<4<`Od?`Xf1FpH7;u27`kLT!Kry#VabmefPSBc zSB1=+>-RjG!gi?t^`oDmA4grdzxOFt*QRqnO@Z4&ewbapl>3PHAh{vVw$W)$6R4){ zcy6;*hj#^6%K)E6>xFH35&J=3#JOgg2Y(0q!4~MLlk_6^-oQ!yGaG;EF`xfYsHBww z`m#A2_;!;O)EsB{+1360=}{aM}lS4Bo*Fy55MsF4S~Uk z#a)RwKl>0)4?U4LCjRCZeS;>p1?t1{NBl|)Xa(m2?=*Wazx)|AIUA=^eA5Nc<^_%p zS~tbRWqkkDzVxU`3Vaz7_y_a+pq&Pt@(FYKCZ~Wu2gW05z*7E=Z6G!Mf*sP9RlLd4 zAli>T$ekV8ynSbA8Fhe0S@#9}5$FqzC`h6+?ML!+&%^u4G>Nv1xXjhx!tN|WO|2&O zl~!q^Y2}T?fBoqDKxc1##NU2E)xU$dtYN7%6LEf2lf`ZNrJ9DbvejKssiZ)?v*yZMoji@X0?BCq2KFLf@NiZ*8OGoi0#3VyEQ!c4vlyrfkVHMC)RGVk{c zp4tzRh+iDQ9|3p31U!z47#H3IHTHK=O!T^Y!&xPo2JvOn>>hV#}; zA9_LXqo;KdG+^c5d)T8MW4Vi?Q)xEh9Q#7UeSw~$A@&H@TJ7NUuY+5LI6tts$92g| zpc#nsfrX9uhwxSIgYztP>cGpuQ{VCm-b_;l@zo2XD7+kJST~TLaY;pEk&^>k%;Y88 zl=K#HezP!(-|_~%;S%hmZf)h)r76e_XLx4QV!jCbky^yL#`Y{9eHoY*^uM7`FYwn! z$-rGkja@JDrO^TH#BD^f3QeFqta08&RWhNU9SLs4L*;fHt{`L)=C%UpnY zxV3?w1x(#z^un1}=JDRKz~#c5#`f7{eno5O5A1~xMTjH61soX_Fk>ZAmVEjaKe~_H zJEnOvK0@hFUvY-E1zGb$l7W|wg?99(ru=~A(Am3~M6Jpi@-7FVm*oI$x7#L?-FSm2fV?t?eCiF8Kcyn1{z(j9Lz^>`+`UOFFf)>n7uoPa@dK%BGMP2;k_v3`R%k9S$XjXsk=C5ZD3zwKPhqwwlP zy>XhI;~pM~q1MRH-+sL1ZowmCFly!-KO6Cbn?noqpE}vgf$xibWxy8n;H#ba*fGE< zEyEo6ga;pnoyarP48jeeHXx|a(fajCXwrq6GW47wx$l;$Q>yQ{(oG3bzD^I_P*E( zDk?UhU?7T^7|h;#*{G;kVA5Sf!wfT|APRP(A{HhF3I@#H?_i*)s94x2*1-bB2IKd5 z?)m=i_55)^pZRdOii^G9cdchVL0vm2X`_=TpNN@d;V|fM2O03`vwW$`m?#Qvwvl^& z0z3zJp7;KqC$q;Kp}z3nXZTb8pZO_jRR_Ka=Al&7xg<}QZ-d^@40Rs3rWb$ehmsoM z^VG4E`J;ED=q2iGJ28sCR|1?Lbv{|OnlC5~qqnGYi#^%=`Bxz{8TVlP-XdO)!`=$> z@9pQ0`FlNr=qqN5g-$w+jp0Kr%a1Fj?3nKAeoa`$Uf5lG9 z7w6CD!9v$=ffO?qXG_)qq22=E9zT)OUD!=<+=cA0RP_BZ4FpS>C-r%OOq>4&TYqMcJ-!94HQ(>LCdut4=&bGd!`-Xw#zD<#RD%ap-;tvZrU)I5{b1OKG;jRvSGW)e9q3has?zXj>#-X+$DR$h4ZqYOypWWMy;dGlQC<5Q3eLs$y*ZB9niu>{QG_JH= zI4!HfS$)ujduts^FK%P+P!+~0)8U0!7)J(AlDJ39z>hkBdGOv!&ZtIC@tCOxh+DYM zc(#L=Vy+C%<~Htt&us#Fyw@kWup@GshS_9Nm6q$;NlvEdJq|3FIQgCcGVF%^zWrhD z)NDVB6=SLQx7FP8?%tGuER5ur-kkX~4+>BrhiIV{cWDLY!7FNNo@~J7)ItAc3=bAX z6Rueb@^*t%WaC>W+Y#wbJ@!K%ntDf;i@dWP=rQU(?2?tmKoj&pLBo4{$$tERU*(S| zY9lq16+y?e5L`pk9wFABad*rD7yb9$*B*7wxQu7+pFH};z5l!i4N9(a2f>$Ii5jZ6 zjNz`1!u^ce78pI3@qOX-g3tGi(quUX3d+Lw40Y%tv+D4lI_EqIvA$^ze>}|H+b*up zcbE}MBkyAVy>O&pS}r_nfvcDG>7?;G5Jbxkf!kMNuTdHVp@#+T)NZk6`X%hwa3`+Y zoTd3xBL928+3}TDbH5z-Ci*=Sqnny^@DQfCVYk@xq2|Q{V4=OiyPJJm6S@}pDd&L~ zm}oUyJ-sOwJznJNt(s@>~zR5$vO ztfF>5#%SU(cbA-vrpRv=nnT_m3Mit4=}d`rj%T^398mc304fzzU=G}_!Z&v+3ywwWTK!O_?}I}RGKHfA}I*ZbJ>|Ynvmaqyzjto%x*6l zLQin;9(Z&_;<%Dv3Ox(HO+#-n7u+P_2=>lnQbad+U5rLA-LLItQL2)Y0nX~VZ4Zl$ zKgwwdp6yMt)8g}n@FY(HuX6eo@q!;}jyrK#`%=;C8~o%4V2^*`tXOlvkJgpqtQfve z6yZtP1R9OO?U#tI8<5YQ9z)lAAVd5-vZ89#)Vge_SZ(A+CnlOA)^_)!mQC^qpxHUVb6gt9A|3iu|On=9$p+Vz@-@a1SYPeFA(Y%~Jud@m`A zF6Tcjn7A{5dZMq}UtnLb4|QI;HG(St$)jI8@4sir-+YXoXSl}bk5;3GC)(Y0akfBsRiVtNo6qW3uQ`Jx!w3g-#V5dZs6MH6s` zD$s{anOi5uBU|lx8aRhX8%kGjR!<5BUZmehy88os^`+@In>nc$5N9Fr>g!=JLUK@51{o}#WXycgWmH0`*ZxO=r54FoS1QGa51 z6mlx{F{haI5LdWiPJ!yNcHu8gNU$d@1@2H8lCKFyo!@7|WAkvhW;o7`Yxlr`YpAD5 z#rb?gFNy+tCKnjv+=%WIN%T)1{S@fA{;!w*UFYsy&vG}h?^=U8TS{%XM>CO=hT0xJ z+*fuSp5i(994wR;EJ6P`5Ow~hvr}^&nW*islU=#1zF6uQjvNQnCv|{WygZb|hjDO% zULYR)ioUKmj_UN2#7=cVG!irTt!*2{XW$!*#GRPS9TpS&1yL-pP_9vtIDSMBUEPQs zxA9$3gU{x`msS)!6aC}l(2-$hdf=J33tTJ<9yy7Xx5P0D`1#+DCEI$(#S6W?sn?`f zDs^5XTFuA151xPK&OmWrmK$}!%rd*9jTqMs*+yz;7?)Xzt<&M_`xpG0YI=!dqupsU zK~L1OmG}vD)+*sUef*I|!t<;KE>znwOJi2+MJK`Gw}bi$n2{k7^p>wMPl66YNiOKVZ*Y@;FE>p93nLv20HBw3Fs(R2=< zce)RdxsFnh3+k*tuxdn4yGZg!o!_0#Er<^Yr;Q(Q-xZG5lx+UQ zQjm(2I{OTHRlSI@Dce4yvSq_$HNbxQw4gw**y2jD1;7Q2A@B3 z5*OYxnDo%&4OY$NY%{Q*J&GA8)0cbU8br&paCv}pz-l+cv)I5G! z5|;~axyOmXtX8Nvts35PyD=oy%?){83*+x9)eSs-8lfq?=@LlP0Kt;)xB%9}p+{XsU z@_zQsI#T6HhVZG#S{Z9y(HLGb(1HFw2j)VvnP~|R7PEQtav>@at;`_(D@W;VPFhR{Xnz-|8!GC*{ zg70ZOm!Dt~@OPedz-Z!2hx*c%2eI^`rXwF#>Pd3c+2-_Ht{Z$#6ySl+yHUVxZwU{* z$?%F?yM<$w@VB|ArdFw|xf|K=eF^}MCtJup#oTT6Qbo@eI&eLMkPl_2qUGgXI1~5? z*&jhhfa;>m5Oa#L1#sr4vt)L*$elci9HKlwYZHdu&@?6Wln*R830;Fzt%98Y$)it# z|J(o8InBBe-vBu7W7IkDh^xRwP7_ zcKqoP@TK@`NBH!UKI96l!}8fOegOOizk#EYZRNz*Hbb5rbf;Z419?w)2h9#bX5akI zeEC~fvIqA&c2aA;V_aU&zL9O2?Mtc14ru z1Rq_Ml3XWE;O0(+rXIRVhqS%2Q+S?-o>I_;=-ngaPw;QwprAAV{A(!zU*3o}+lV;ib^W(Y#Q>g=1d1M9eU>HePDuHLV&F1CE z!8wEHaC*vl{^X=kTAYJ<`PDQ2$KGIiunIe=^*Vz8cJyqR??QUE78K3V%X#6?F)NASD`stNCe+ zu-Mn1yuoLiZPQmUhL5oV9^gN>H4_djK^CeUci+N0{7TH!^$XOL*Y+Tv4+3#Bh|86H(E;YVb+(+kWgS+T+V#|#f@RWF*1PFwRCz>$u^m;TXP9sV?Mq-aM4 z-F3*|3UF>rx*0`h?DV)7`2n;$A&Q!H-(|f6b>`fnXv05w^w+okc|KR!wdAwo!PiBd z8@}qvj~=O}kJtmIG@Zv^>GXS-h_73x@kQ^W=rQKLsT;C+Z{SGJFke54y3AKRLUser z+qzBf_^sfXXRZW)CbYRA9~VqY%oko}Mnc8FAPSiPU54KPA!;SKnwG#fXslqu%c;2` z{M`1=5po90X>6M~`gR~tP%MyB4L&!x5hwI_my?k`&Y$Xq!Yt^gH{-1E^GXoPz>|s0 z0*}ouQ1}2n^3<-sIfUbc$~rHq4;*Q7ouMFL4^@eC@b;N6{NaA?bpE7@_H``b`AT^C z)&7EMd%@8)%}!!4VqB<;RM{O~eQ>W133EEjl_VcvAdIf~jEzvgbv z^re+sB1ymF0#2?$7Qm=TI{CS;%;8xm*;>G>@Si;T1Iz#HHwNC+=Wj)V$AsE0)EUO# z1YS1;=R^B7QT%4~HJx!jq;}oLe>@vS+%wen#5w-wo(SYb0LQ3b&A;0aMyBY21rI&p za7GBV4Z=>O&P2FS0gO(Fqod=83lmPusoDTs0vkJFW_vl=*2I!?18>0wIRC;su{1t0 zPB^$TkX~bsPV-tSM1faRgJ(6Q@kZg9Qe}p;QCDMZbUY=$9`1vwz+ow&7=C?!JfG2D}>2t2-di z2hZ@lqf7X2ca`+zJ$Sa2xqL->6b-+Fy2U@{i?AOw%>(Z}zKKw6hdL*NADh`#I5rNv zTwCb%)(scTVuR>l>o|(@nIYuQkW*juU{8%;qJ+JP)luvfoRfs{gOMe-0vfRF)xzwy zfz%&;{Lbj@!mpm-NCR`px{)KO`~t~60Gj28lCV4)Tzx-qFdm)}y1Wj6k9sU6tSl53 z9|V`CDu!HV9uYpA@TCXS;N^RJtq>1?-CIs-3d{=<&cIKst%r(4i;+TNXAe3Q1+P4r ziBQkXgNndEHh9ujQ1-@dce{dqKBzDJ^n!n{Jc`62=lN4P-n1NeQOgeT{J=H;$y1;o zKe@si0aOM2-7xvP?0Quw9W4Ua@Si;TRk450-Ak^w<@G&d$r^S3Jj9+4YKY9nAGphW z*7I))l(Zc?sis}e@lEh|-bJ4 z-u)>%jtQGn1L!QCPb=^9f(`gfry9pnd53#~+!A#LN3C=ITS4b^AWaw^OB$R&&oGY`>KaV*O|Uzt>rN+9e)~>g7wpiFE_#PjuVdIR3>`@8?}XAf zC9qk;e&lmHlrq=ElJ6lSverdrIxtmQ`CVwSHJBnAMw9X9ETPyMo(wl4Y0U|9As)C* zDRQmc3r6zO;NxoZGn8`w$)kUl^e2uq{83vz4f~W0m^%W3UHJphwK?Ogn7)2H9}3+> zyQk=fr6WJKaLg) z4qyFg;x6Q^k9sJy9vVO+H^ZZ&q(-<7zH~ai?tY>nt?CYck8|)eDAA`rWr1|25oTIu z1pbzsY|!H^UeuR#(5su>iX{^(Ys$JBObmCcQRqaf-!zosD!~6AHH$`Je|jEzrSugJ zbRAmAwb{^U{II3x$V_OB9_FX5C7J7lQraT;+bpOSw)q8<`>`mxc2yzpEI)C@WwNtWygOT(AS^uR<5FDm^-qb?B|!oDrwez z_#=IL%6IG>Ma4(JFRE!JRG$mSE)mbk(Eh@zXk=~m$Nsw5PPjM{UP-`qxZDuo^K@{c zqVaqtr3y)n0%>^Cs5_Wg;?D`od4ly%Cjnf^K2}JXr>}Aq&)8ni@m>s=CrSXpN69i=pgVOFG>~ z4(tK`INgZsnnKqW3vRc38cj9|rinc<@0)|WVID$9(YG5Shh`@WA$QCOO~Cp3v;c)90rFgZceCI8hVAKLW4ew}(&J$0NM1o07b-SGC+*#m{>W zZ}aeX@o53o1TxI=>+G+bymB$Vpo93E;mUwB#>L`L8WF7SvGhP}ludo@w#AD=SO!wz{fb^wJ@qZd>%^Ro7AfT zO?L99Bbb+4)#%fUfaz1=<(hO_48RCj*!f&lO)a3^U)xd#_Q>G7i= zO1^gY?>Zl=`O|-6&Td`4FFY`~U%+Q(M)1i6D$06`xghj7|9%{N5OF3OKK#V502cKP zv%~FyhQj8#;j{~9#kik>aPe&j9eRgn)y-Y_wGy*lTr6$VBngd{1d?$Rcr_eM7xK&k zXa)EccXAF2Y=l1ro5Ne<=vm=mfgf$gzGKy>a-n>SA3aP_(^^%nuo)b-^m)J{@^$GX zbPcDi)ztS^TN*II5B}sT@(XHBy&{m^(-P0bE*VBXk^qQ-{P(&aDs!3TZF{6{FgO<2rJQv#@CM`RbOGCA9#P`m=lSjXA#-DXw?%9afk-=X9ci*(T;r#x+zzbi(t4HS~Z_`If<)^{_?D&npwGCO6 zz!^3kH5R7A>-W%5a95&73y=4}-}egcwOVf>aX9=V?Jx`POA&6NXV_ni^LA#2V13db zJXmnE4;&TzO8uxOGFEo&x+Dy8^&=l|H5p&{OK58EM~aSWYM;@799H|$*cU3wn{NOP zjvqZOM(&ulE6on`qtBS#^u4+PtMDN^Tm~{Y5*3 zZo8dH?H@skLz9J;jh(1_C3ePfO@;3*ohYPl81nw~g%&5B>ArUu88tH#GS0eE;KMN5 zc*#nb^W2?I!&76%#6g0r8?qo{b#c1KUYY1g!$I@p%A7RpC=x~kU)dQaM>r>E@EP`+Uf-S-t zc$mcCOfas^69nW1uMAYvPVH6UWk)|M1J5klp-MMyZFdW$R!&ZW1pmoR^`U>5 z5F+$z;z9co!bmsKTR79*i$am>ZK`iBi0~_3f$uM|@Zzt%@u#MPkt>Nj`gkW`mC#?= zBac46z90Sd>d*Xc<+f+s1I(=En5pApy!c+=oSNV+4tbEnn|)G{AMU;sm46n$#!>rNs(&gPxJEBpv> zq2b{1Ea|>Q7<%1_geqhip9m7dk2}$?x?oCmjS`;saG`2sI2wWHya<^`<)4wGoR}dr z2aeruG0t40wZbv@#}4-lr55jo2npSMXwk-C^7eShE!pc&E&{k#$fI{0i0rMafs~3o z`U?1b8bXu*zj)oo_7}PD=moUs<(3|r%@;b zfV*|9tstT|415Ef7dKQ;lm(Ly_#cA~&J)51$Z1A$M zNzwG`m?cF(qne9-v`v>mv}-YZg5gmdI?0?e8+y^WCQ%f-x;6Dh7VwwT;q-aLQ$Y?M zqt+pmDtaCgcHMPCW?wKhX}D78^wfzytqY=K@tXwinJ(1(F|>{;dBRs@3V3b_rY}v; z3GR5FKk0HB#?>*JpEtP3(tgL(;#!L=S@8c5N|qj#+jo;Ez2vXDn_yBj>HQeZB~ zqrX>wKF!hl^V|@t_HpxZZp`}ndyXE%&)kGuFU);iJU8-Lz@_vsQ_s!5!GD97p&l@b zkN!=CG4QWDcMbkUyL$_bt)Q{Oyl^{rk|5uN-E=hkxMG5Yd8-0w3iJhOIvRj#b+f|z3W7pdGLqX zucR(|y{IKTfAStFDCMLXd8I*f9Ti2)+L#7mUdw@3#rf?`=*9>SvVmqMxZeZe`a)!m z1Cz~MkS7f555HLnoQB6cg$3|lb$9_!%j5Y%G@ju!Jd+-??g%rwd%%YlxIo8uf+wEg zHA*>M%eWwmpbqr+bQW`Cb;+g*6}@XK3h+OKK)H0 zKkP{u$HnRm`#%5!Ifq%EXK|~S5#9*QybxYlt0ab-$Vxo zUm;w_pTdBppD9}`F!XhI#Aq6Me49`O?a2Y)x|Wkg;nk4^EC`sUtSg*C{3{QdWxEa@)<--31w*<%^Vqc_|gNJWFd8&>LTbd=B& zwfxg3FmLW6*(LZw=%LQDEz-GLnee?V!#%hZcwi^!yHRI5?_vCgc=-NK!tSqi5O4oB zjM9Psq-|KsTh9uCZV5b_j=B6CV4K%hB1>IygO32tV~8Hu^xYS}Zz5)mR%&wAYb^|_ z=TE6_Dyqyi7bc)jPJ%!GU)u4)Aj~Wk*x!8G?IUF4U2wsEzq(I~Fk)>WZFq>>r6n5$ z2jF|(_aMKx?Jl7WGz;o_c+S7?5poX@&axdsW*K}hheuNE=GDSY@DHspuXVAD z7L2cX(5=c4`gF@dIKRf7)^`Y|y1}D_*2sh^6Xmo9SM>cj5Ar^NndI_x;q3x1+63Iw zZ}bA8=`<}F8r(Yu+R6tm<`!Mn>b zbj{TJkMlXA(pfVI@4e4wa1qaHWJ|$oFhiX$&6vtO9URg9}|8Nh(|TH9fw@ ziC@F$C3ejf;SKpg9wFp58U3??3BMaU+;fFqcr|u5H*@(6_~rKShCbO%!|w>dnP2Qr zo!Xq`Q(e(B<6fC#eu%I5eMb-Vrju#*{C4<3ph_m+x_1)eslFEVmgUMk>*#*o4E zKYd(p?Cc}99|2t(X6;Y4MVf>x0r<{mE(waNxo$ zO*?2J%#lAhsrra!Z3BO5@(Fj`w9}d~Vg7Uwci(--GEFvS+ZiU&)bz?*&DAmBpFag| z=+!`+*b)53!%F&It|#i_d>vz^B**9aVuvlzc$z3^{e)KHsQu6i?FY_d*hJK^@u7hd zd|8LpXs+Kx1{U%Mn^)e^EDi9W7&mC}=AGBr<4jgBms7_cg_`mAJZL|5Bz3FLYJU28 z(TU%^PF=BPhYK>rPWe#vvph{L^aaC!O)qeZ*NhSZY0?ekm%nbM37i9+rqY$FkVoHc z8}u3Ai~MiD5uThXcC(J9uBh`kw>x62=OuFlhlFEJ0QK4MP!dPl6-4?i|w8i!097OYQZ|ZnOskPc9~y=I zd6m;2bzb$OQp^JWcMDvXsFC_oe_$=WQRfAptN{U9EQ+ui;_uucL9rh*(8Pb{G z+{H?8#k?eG59V$;@aw$3kEKS~Pi-i|&M2Thn}y%?+>Y3RHfYc0LoZw}Kur&uSgjN0pq`4l{akWh8x>%xP^=`z{~CXrYan zw#U3MItowBp{B1`?!{n=#6B{xyBnKS8U!x~H@eVrq_h)0CytU6P3*O{py#t_a=GOA zN1aCr&7}4Mw0EfUWy1l|p(B`UuftE{LXh-hgpvlK&KV6er1;!OS~v}Rs~4xGpTM@G zUPA-W^^L><|NFiBu)n0sbS4B*+SM3J%Qj_WCL!+yT%dPXA@=k z{7^-G;=);9U4LqCtD=FY(pa-`{xsnN^b6CrGP5h_Pv%9_5VJg%=?Tw`kI0+IDrUdH z7rm9Lgr&>{{+r|iGr5dH`Si`ftqJ1kY(0M+rvJXOqVDqr?-VR z`c?>Cf)Bp!@ljgaP@JWLf=*W3Yy0E;Hua05Ex{hz!=Vvmdlo&Rp0`$Xg~tfy^y|_L zZA05|a?MAEth|#p^(%IuTYP9`>zz#dIhdM10~e<Wc+` z)H%@1P}+$)C)WU59xz#QI0g*t8hD0}(#J$5yuvph2tDRH|08FTgr} z)~KlUh~=yk`np%Hz%+hsXQzN+c6kI({xc`oucQ97-andp2VP;z`vlO1I{5ZpdB#4% zKkz2JDjM(j&UB!ITWN$`!sdF~-VgBZ6odbF%us8GJ7U911ufdrU+X+Sn2unVdeeBE zw&o#nB$cogrhZjIZH?6~h5K<+2(=OR=Rs%oPpF`Ye!k~0144Biy22Svz2`HGtaGzNJ zS?96|{iK~E!IOFa8^`dFO!A>qECoi?e2Zj19zKDnb9s}?QY5lvC(VH8l2tv%fFllj z4@|?M3)_sJ|10*mb$5rc+{hq$^aNhgXY83(LLdq7pqSJvg5|@*Bxfi5+A`Bvyf<*s zrfO=+GMP>fWVHWW6?^fSX5CP)cJLEwsd7O^xdd)^5aL69r8)K&4hOQgDzVE-0#PSSehJX z&OF|Q&{}mY?Tw$np5xvb{{~(k-+kEpErC=wEe6`>WcJt&bJKA(73XhY9~0nnYlK{t z#s}EtA^yaz#I9d?n#G|$8}wAP*z+D+wg|WZG$VfJYuG9H80eyx?(wFfHdqIq#;Eg7 zqZZnI@Ec)e(2rcy*Y0?O+z@2)M){w|ykV9Dyl81c zDCxty`wjALj?M}u-7k-rml9n4zQBT7ykQ0v-qgK$02OVlX3e4Z8M_gG){>h{Jp?oU zW-mHyxQ5LKZeTgnoyuL?vAeE;v~)0XdXm116Orq2&E1hAkw<@MH8?V=KkGb8K1upH z7Q3}~;21|GOS21AH1R4h|4An##Y|ufo8if6S}l3qgH8^0zUA4DWe0{+?q~1;ZVX`! z8-$WxB5LWivBPmm`EBS%Qxx@ah`*L<5IDmADu@kZ0&P=!Z(;V=u)=xan z&P?#9-RL7%**eQ5hKeW(D%H`ZBOkffl?ZYj|ANgzCTRlhr`As2A749 z&i$*bU!ez`y%t0>=ig^}$hfR|hHRR&*KBd7H)Y?!&lLHZ#eMK0Cuoi0E?#11ulrK6 z8rfHxR8}hak<#6rP8v05=EDN%K5(e+S8j`w$A!^}SVtOzJo@XZ`ij6^US?{ zCvFdX z>Zw)Hw0gJLI`~?Y0ADJf{g$Og!}D1iP3cc`v?}ZhcMgXB_h?h?u)BVg9Im95ie}ng zD|~5dAULdrI$C)WvM%c*yUXe++fWNkqi+Ol-G70-MQ{9MBK&+$F?MYjc2eHJJhz`^ z-oQN1t;bH{%pEqS$djsoXYT9pf{mWzO*QaU$(#Cwz0L5UJ=5SnwU@Cufxcu9?A3Z^ zJmbN;wuF~N&qKA+otA-Aumbs3i6_Lo!C}PZJJJ;7(Kj0%MbAC{taE^=tE4*-**>WA z;U=r47wEZ;U50+d_q^l*pY36&^XFqatQWLga(ndEg(j?ZS~$I}i>2@3W0*moP&%>{ ze*4G0*xWloG!eV1)~Ax$oR5LDQGr~Rnsnxy3lB8RhBiMAupbq;2f_W#UwxV_SNl_+ z+t@=D-enG+z|5gF)8xKqQ{dUs`3`!cjXGKn;4zL?xWBJ8)FxN@(l-Ysb(~U9JFm{0 zK0z~5viK>p;5w#b%rgy{Qzgi2Jn?|_YUNFN8uOJ^}t>D-6K7|d!-q{A&U6+}gnKN*$opoxuk#v};nt)3Xrl#;uXIWAPcHGtQ zp?Gwky@*9^gH^Ps|9jSUHqMGl%q$zevp_#QKbAPFr`ED1**?_E5}dcq&)Ey)BY(sm zkcv*RMy=eDJA(|AbGupPG*@cr4-MGn&8+V?7up3*2A7e=K7DtkcSAxjTb^Xf!|vq2 z3%k5w7g+0Q$djup;e2+|SS z&2Dt~CiZ}p%UQb$7s?wDPLIwmWHE6r^c>jHNJT1hjc}!*--5|JB7?O9-qYVHh?*v6 zGtF&eAf^P8OYdBE(bbC`O^I(%6}mKIFL?*|Z%-FzJmiovU)E z>vs-Gn^5Pg(35ZP?JU-751+uW|J3(SPI#uiUI6Bw zl_mwfR#5(0=;DQ=Qu+KyN(5ea!t;R?aUc7^x41jEH)K;?Lg<+?mfF}DveM7kTUCQ= z(bSeo=efi=`>A;ju$Pcm!$iun{Plgu953x&6!E?hrGGoV1=5!Dlc}t?Gb>}p8_Ldt3 zS4B|wK>@7#y9*U#u1JcU&9t#DQ~-^^p0h6SHFYIBWbb+njbj#uz%&+uS9E_Va{^v^ z^)UE+ZfjWtxL#4|{xr;LB{Kt_VQuY8hwcS3S&k1lgkCh+#h5+A?l18(xaltIrL=3% ze+_n}?z=~d-#fw|Df~ZmZl)JW)BaWG+@^h{#r5C|fjYY=2S_8lRk+iTvvSl?npLhK z2h@3{dz!Rl65dPT&;H%ArT*t|w_9bG>vUkhLFWA042?TdV4?6}{k**@Iw zH^QRfU7x~INBh!Z)VaCY64v{RHx=GMcFz6;b_5=17Mr8!QK=&<*LA1a(2jnZEMtl7 zUFo_IU3pA%bdy02$&rf8W-&RPC%i-@d%$4@v z=_+=CFJ&R>ycK!$oxoc*`B$AM+INy>e20%9>b&x63+cQQ`dQSuaE-Zi`x-EqHQ?AU zm?rhIj-;-r^V|n&sr(4~eazkJgX^W%{X-}NbIP;y9BDa&pEmZeQEf`3KEQ-cXT^|p zyO+|vdBB#jTlsji0n70BqhmePba{4rP{&_y9>~1DGe2t+<)VW=4xp)S5{vy31&`~EWi^ni~x78zg+5=1t0ZFcoFI?kve4n{{cT%r+bEE zhCQGsctno#b0o|0z{$J8k7)2YDfFZ-9bclNHTvb!=U89bh#hxx_b-wcW{vM&(Z~jF z#A>?vQb!T<_2g!(s0p|+4;5tnxB+Y51N%Gh+;$W^lP-88AHIJit(v5j&XFsf1YhdF zg?*AN%7sq+3Z)O<4oIJRxRR+lglfl}m*)QEM$!l9j`AN%Nyj`Wt{*($Ue`!9z?>(- z7w?1DN9ic;K`GaldVjqsb!_8{EL!+dtz9XlP4Xif{oi<!P57R zco#7bKK(LLiZ=D5R)%W&W#=Y&ukxi0N#M$Mi;~E1%ojMcs9m+5?;ahOD)g;R%xYJ`Z?Az|YrWnbZ;IhV2As zPWG*kl0Lzs0PmaEU$IiJ0m#_u>`h-TT1tWkcs^Y`Xw#^DVs>MAM~}n%({HB6sTVMl zC?`rq9{t40z&8I?=i{bN#HQ#G{7~mE!{SBV3DB3L&JT{-i9LZYHbb5JuOBNO1Si4~ zb#5|dqS#&)Mi+sLUQcikE8c?35DM?IiN2z57O)9l-;C zcNE%?{LP|YJwGx9?`VO+0r9QBFBO6Ny>c-Vd;Qi;zXFaCdtKC;`_gjk3QM$4#priF zl!aZ@aP2G67#WwtfPZE_c_PZjdck`TUJa(_#7?{2scK3jH6FQBoP!MUeuu+pis5oG z%iD#NJ;Uft`f~9#aNx~?fMdIC9KbqeUd&B`cVpu!i&y!rqd|z6DNgwc&QRfE8 zqo2GWl05!Z=Q90k;z@90y-??GFG!p{N<|i^^U~)JH2rrgsAx5E#KZ)RZ@ow=w}Jm{ zKqF1AAG8vG0pF-@RuFM7m<9o_t2|?4eHD5Kv!}@BjQ(!DdlIzIlfb!cIbJp$d0|bF zv$o+@vdj?Jj?zF){dVk?jhz4tK?S@nx@*Gx3Zo&xWili5dkcy}Xnf9BnH{(m1v7)`z^|6vK4^cYZI#pD^Tu4Yvlj(!#-9FF zPi`vCs0P+}_a1lR8hXJiPY(ZFdAZDUlOIKogRen_uk1#T-x<`d6zU_lZf}X2pntBg zZDrjrAd;;9Rp&vmMdA+JU2dpzpY`oT1DT2pP-i3JG!KB|E=HZtH{N6Y19_UhsI%^u z4YKL;F=L|6r51Iv!NtMUJ{TP1Hx}Fl>`Av&#L$<+^SP1m%5F0uh8jmCa}}rjXfC)M zPxox$RM1zpX|1N@t|z##UcS^8yN6dxuXFvL_#n>{ci-}AuKrzU)}Y0m7~Y6qbIgYZ zA5>yqXu&5w^rm+>pD!%a;~S2|Ua2ICT3P(yIE_1Log!)ImmAz-^c5b3;pAPN&+VPy zLcy{y@=h(_(k{5rn;XzHR^R1bFLNVz@R%p||G{mD_MkHw?7J&l@G*1HyGh9KxY&+2 zZs9}jE`HSQpdNoR#+OEeAH#Jo;a(p1qlGRWBnzI#eH?<_CElN1+Mcqp_t<8EJic-fnVnzZC?;A?sjIxan{wcMfEI5*r~sY!~jYzN+(RJ9ZB zOlV>KY;z=K|EtaygU*Zjz~<+n&IU1k#rJ*S8;?5I-?>k7Hc3HWRzV+esJ_MkbM180 zneR|MVk)qyK-BqUfT3&(d}ExTH<{8nRTi!&#gO`{Ee^xB31su3ZT--vd-MMLC<}xT6&qbZT@9-5PdO;hCI=kmviOpl-ZGt*~`r1?MehK-^sB;Uq zo}wN+X}&xIrqQ^ccrO)RmjSVKr=GQVxSpIYB9k<*dXhNyG4cVy7tJG}%IsKhS zzg~mi`M>JCs`iz*4)6LL)VbfA9iqRfiq4_VR*5^rZ&3<5jyfMrIwrO{6G5fp;EliM znt0bJ3^~TJ)M)z$aaU|GwLzWh+O?4UY69uwee7O6O{G0o{V8N5@+*&wkhUXxbOH8O ziyF?9MvVcM+Yo+G20;?r=tILW=XY~Rk!r^yANX=KS*=W$9-y|bfQ5Ed@00G~-ru@L zNykU!N>&!$RB=i{4<{Xwd=osWc0Y7y?Y2l49>HgLF!Gp%1j!*1T-=q|t!{Rctkaw+ zMK6qIx0XxuCc2O}_I-(wE2N*gxCi-Q8s-<$uYj9PnYwJa)!IfP1?3J_< ze{U*gs^ppv(pKOA-#2>GwZcnMi}~>NMP~H#S1wZN`ap_QyOR3VV6nkea61#6{?4Oc zeF@m+zv^6kG)a7VE`>6Yg=AZ~UmTN~Lhrl7pa0S`vHJcZ>NNoV8;1;}Rwc<)F*u%j zds<6_qmyW!1w6MC-J}*j66t1#c;xvlk`8+&Q2t9~I$Y0?wx-0Z=L9({c9N1nY0N8$rGG~Iqam4@ND`hp$Sh*vkn0nqntndI_! z9(|HIu$I(6c?A_)(!>{6QfLKo&2sB5iCdPW&<&G#a(2|0{<^b>6#d{kS~^mCeLk7I z2g0L(i;x;cCQ%pUOr0LGUaI_-NNqdCQ=D$D6zY*c-N3gglV6iYr9u}A?7H~-d&z78 zylKr)=eXuf%PDC{I`lzvjaU!NO%E|6<>m}zPoTeBW(#kDqc*Indnm2Mc^>HG#7uVt zlVJljU2zUzbHJI^LEqWtt{>ZG7(n*JuxAOG!A4y2q1l*UG*P{n*&I(2Cq+^7hYi_> z={UFVM9?FhkCHFyycD~_&F%D<(K&ZogXTw~ByeQfkTD8Za z?Bqb?vx9##C2%#nF#s7%i?KH>*w3D(LIazM4Dv4pY&vp>^Apg6&OOR1;6c?}-|KHK z!71zjcYFWI`+8WnLbOGlXX?k()r+siGSpdx3@`It{iG%j7QyoezQhIrQbB1lEwhAA zpn8MkoSXzL4|2XD3Z$+23+XcI9CM{y(pi{5y?($?Kwh6!fD5TUgr59pd-m5!HC>tj zY{cDy6@klq>msz7yT-64CE)Chh^1yb7qB-8;j|E*?e~{Ov3l_FC^iINeR?X>a}J>r zXr|T}Y-D#a!>vT`tvh}P>%31+cjYSRe73XRNyxi_2i=52Ygnr2OQV!ZdSEYSVzw8x zZ>ON**#gVE-;G2(s#<3vm zQ^dp&YJPVUD*>hva3Y8%NQ^Z@-?#M!ylDMjvqIls>TDiBt%kp6>#jynG;(f!bLz(5 z#NIFKKQ;fYWBdKT_6^pGvrAIQ09j*u?HfreP-hb(=;+%_lK4lcvspY%X^18rH8k0NIkk^fjuSC7EG%&_%Yi>osuKo=AoDo|}SvWLR1y4d~oa=Gs4PK3C_#drA zGVZ21rT?k<|JAum;YM-&g%sMT7f%=FnMlQp{~uLf9T3&peXW3jg$kkwDtc863~ZS5 zJX^#82Z>kD7J4ML7(;|QP1mj;#thD zyGDbPoBE?8>;0Bx&-+v0FPT5kbc(6wFDV35GGlk#hxq&}8q3Eyue*Qn4oiDCbH#)7v z{R>}-p?x&pluBv~@5P_pvoyUPD`-Z?R2qExm`46eP9a@VX{=DES#uE2RZxp_WR=E*m-YJ<* zlsDEIzX+#o?~`b%pRx8HW|WUFCQ+POH|<~W<}(zNNR>HAd!f)R-{BU?w?5%XgG-p~^4cR{Sg zjK2R}#QeS`B7w6pE)BXddZIYJVHiBGz#FN*Pz;Bs`SCgbXhD3N1YfE1f9}yg|++H-&OD8Gb3)gyq;n61P0+`ldm6MZ zhqTi6$DUad_T`1yowORna1k^6^Go__Z(?7&FW!X*4M-b*D4br6hVI1eN!nxR)%iOo z)6L{r+6+ZF&2vho;;VDC!|wyDe$XxQoUB!rhf?L~B+5$bt9?2cdTzCew39W|j-P-z zZDj)OZht|vKN(CDv*RgOq7pSd!^nqYhbJ;kT)P^c=ICqvKEV|P-WE7fzn}l_Jl`zI zSI3qr=`r4S?b-M z62}aQqeW4`x$>-N(JO`yq7E7=s}Wb{MNwUQ@K@8niS68^^x_lp?eF?p_t;1Z2mUdN zwp#Zq5u`l?tBxT z=|}vu&e*A3j_=vSGF*EG8Uxq9U}j+*qC4AlwdHXo z?Sl5y&Ubd2NSTuKkt-Z{wO+FdI5&XT?b@mb8q+#CEeGb!jv0xgu4d2&JYRIfEN`KV zw&QC|b7qUtebULdMJla1oGP|E@jI7ErN<|ih^5+O8v7Kzk;1LwhZc#Hd;&flE7W2T zxSvYo*ozii7P~{U^B6E6wB;Fiwo!D(316>MU)ugFxYN+)6-HQU7YXo?os0Ly z`lUDvJ7sSplW4>4{bHt17_D2Kh(7on(HuO}=_eBYKEw6vLznCQZ_T6so#$ce=c}h2 zRZ=8$y~ej4t+7l4=6Lt#=oe^)0q5H|+cQd^YBGPxsXy@iVc1R#yPH8@@tl(^h!rbk z^Z;>Yx3{}!Iy{~B0q2F`GO^1|#4`@)N<{N08heKNov3+@;4%#0Z z!2dz6xL|p2t^3eOlKVk3_M?rqHRgfq!l8fVF<$%iV+3U=z$I=mM?0`hB;{^}SBNrH z`@}Jl$}Zzx4o}d!qtDdmJ@o%?#%WvNb7}Z4h1S`-YaOw#XSyHzIM;e;-+PDBS3~Gm z-?}F@0}onf4)i^aZxd(7KyTz!5)JM-R`f&-ly8yrw;%o4d(iI9#0>O5IDZUJQ+E@U zWQ~06$k&mY^~tDN5UcCO6lh!!pAQ1J_79$E%ykr01k8oU?ZnlOGw25D^mi#t)Y&Sd zoA`5Rv5Ucz(`g>QKKh4DOnjG0R}qV*49yoW_d_obIx1O1cZxo_iF5_rr_)A9Mb{4T zlyp6XoNB7Y``u${RT=!S4!sl~AfH-)1RMq@9c^iB6!tJtOTKQQ4F(Tt{7%FiYcuWA zALxPOdD6IE+KMHSG!mHfmRM^8FoTE_F~{s}uiXtipI4{Qyb&|CYr%Q8`~pw0gMr%j z8zcXYjn>L2ZEkQR_FACvvM)?qus(vkkY9CbIaRA?7*6kiNe`i&c3A6BdN&{U^}5sI z3hY@FG{*aNdX3m7E$na4tg@d2#POK@cDKeIec1U(;&EtV9sAQ4um1=?wTDVczwnMf z8#`R{DM3kJ5JQfB+Mw}5zM()Ka`Nh9jjNu5`T@hKKaItXuQF&QV$1E064Cj9jF#d# zINMdsbWf)*h|h+7(?!>YY2bjP_W8L~^!C7c!Pzd5Z4;}{<32}y^rBKNzQ(Ne^9Sr4 z)xRtr!|p;qmobtq%DzDhj+91(o}8XiAd-(!4I^?Lp%0* zB;7&ZMiJ(xwepLk`V2phYL2$2Lj?V@fp2)dVOlBXS{-ojPkZ!BtQQnQ+1SPIWxiW< zgMLd3ylamnIpQJgG54McFFE^;VyAhiXB+(E3ERH_bB|rgf1KxD<)hV_BT6bm9cOuH zsKzNyN$c=Anv7emF@L0>DL9jMU6kahY01&4F!G zTNg1hES>7%`NysV@w`bI8Q^Q))hrTYaxg!~-;G|hQ8aCkgggpbZ6AunFYDrIJN_+2 zhcn`qqFC~Sw%dr#cf}Z+7z)9&hheRlWgJb<@ih(&8)`oZQFH@;SGP@TZSh7a1>oQ6 zU)E6@WFw_2#IDm;mfF8`q@)i#V?%7T)yP$%&>zTG+H222*TL30l`i#}rk!~Y-j`$G zHLsqkz0^9AR1;H4J=IpbK^9I=@#oohjI^7(hSF@*zu%gi6Aib4GmoENs97eOfP=96 z1$4J8W#Tm8EJ2OE{IR}Rfxdw>?;o5m&WFy%)PJ7;FW*@7po98)v62?!y$*lhOY=5b zNuzMK_Y7E~dGSC&9q>C&cyd{z*H}ScexFJ6CZfxi3@XO&tM1lYY$r$#KP zjr}|R1f^aQcPGbCnNcbgRX!5u&55Q%xN|4B_%1e8MA05#__m<2_8Yv+&isYXZi zWL1`zZ!hU0vGwboV)lv0xksnqT^*A4;y*iXv69#WDE-Zit`CYrlaCB4LR zRJcO(rA9#yfq#b6G0k*+#ozdUi2I?j`jJ7#z<-#22eG6=Mw1a|7SEN47qimo4YY>Z zotPm832F2ZIM2?C70n()FAzUZkm&-^*AMjpFq{^@S{%^|IVmt~3m%;>c3X4tyR6gG zijBa_&;^FyCR`Hp)`2g8GkIn9L-9#@6m9GWUyLzd#HItH=-H4|TEC>BcIO!>IDojv zvs-De=16H9&g7=AX4-Q}*e9Kg_hL*}?erE>I_rYp>wOn(%$EpSHY=45yBleXOu|V3 z&W9I15#0hq$Z`}uug9B3>$Tt-4MfkuK3f6npm|N5toG+{w#Ng48uk-+ogtxM{hC?(k;h6tvlak-+P zHaOc8_GD?wUZRhL=k&>kG=>*4s2b0~ZE7@{MKaoe=ibj7itB}R(#5lQ%S=qVkNAP_ z*>T`Naf%uC!tw7Nvl}O#UI-0l^z?>w_YjYEhyMRpa3f#Ei}}N#QB(`9c$X}3z>#RG zM7-^HB3~?B97O>yaqpknEN(q0r6-8VTv{kP7=!DM7=G~X39IvmS~euE;T<3E<@LMjY}UJZQY*Uz1*nqp;`gQ<*|P7FLU|JB3j?{ybG)ATsRi zPr$wGA`29Upzmsr?|FXCV9{|Dv>)+r>2B{UrZx_tS9s2UYA8B*V$TTAZeN#ZI-}?J z3+L%KvVCVI(;)oJzn}jP=P8HsB?{!vw!l{5@2?&aqoj$5jk-;rtG}TC+y}A3d43;F z?>Fcp;oNq7=&jMYl<{{TBS&wMrfH6hE+B@q`n5yTnx&IBo;{nCY3|&EXD_~fWZnbK ziFVN4$N6WO^+X%wJJax4964_w&hHpc+kn6Ewoc-)KC#rT4mC@+{-WKkXp&&Bzihg# z*a-clRd^q39jA(Uo1`=XxylaomZk}1pXFbO0g|`%~Bts_WYG2 z)*l&3t?~TV-h8p88oHFwlT684Du(BROI(9F#8a90t00sf0#Ca`;5R~7V?XY@5qk_o zTg-#v@LZw)L=!OtTrl)%?5EXebb<5KJJ{uUc~sNI8+jc*mv>1cG%G@+N z6STVgC(dJsn+uOlC`p3fyI&|`xxiLWGeW%%^ORAD16>xbQXhUNr!9!R>kKQ^ zKQCv{aKzj2^?I67xib2W=R?k&G;YB81fG9>w$?nn`@83d`?0>0=8O?Mx)H;-J`B^e zPlp!)@E=&C(Clo3ybhn~hue9YVO?S=80SAtx>=LDHkyXx%*zfHX*Ob~Zzl4wxRc%`{|Nu$1=lnm-lGP`nJ=02LNi$jFL>Y|*ZG%51EK=J2}3D%k}s8eQ@W3F*ft-c>Bgh(*1w z=}8=y$jAbBeS>!Tl0e|x0nd#}TT8TeQt2AL=FG)Tl94Te8UF6Mx&0*55)!E|zGrnK zTZvgS?7!mQ`muPLxzy>4Vlu;!k0}17~$eOo$|Y6S$&h;5A@3SW;Xcd%L*HraShOjOhVCn$i@a zVcjJwbwX&;F>pK2H_ifqbaz{ zHvjC*W&!6&Jj*vg)A;u9ybpe49h}*~roahzU%ob+{ld;fBJRXt6O`$&#i!YUxU*u5WmYeVD3BP1{-(|IWsUkxZ@QY zhd8W@KR>jm9v=c;{bR(U8<`Dxq+bLn@OL}4YQVRf;|wD%#aq2&gF1#n#|dY(NX_yi z;GG0)Ej;J58Q@L5K8W+#+m(r%1BmT{{$a5Pi!_Ih=sv_gdv`XiE|_}nKs;YRg5|h^ z1F{5PBReTn21sdr2xu(7AFt-|rvsAC7R%nZU-6rI><7;~|EA%%?(8sX%@nXHv zM^XdZ6{fjNb|ZtjnIqqrbdZ$+=gnPEPYKm*GH^EhE0rRuKC`FSQ^~(G>h7b>x$rBQ zJ^=qWGt7Aybb>G8%(p8W$S1vsqm}p^joXdoaWCOpjo2RQHis{FMLmdkGPyXCyI4li zAiQg)tL1#xX!P!Y+q3$)d>d-#UwD2iUCTxDNa}~Lu_)Zk=M9RW33wNp=oj!|`@(22 z&V0n!Jl+agN7lI4=DrT%Uf5wYLeH=`X#oEKj`Qnu_^mfF;J-Z%9z~+wKirBZ`(yVr z0bb!>P5AmIK~x)u8PFgT?h4(HzTSw{Pjq>%eHis(DP*`Kovn0%?jU~8F-PxP55f#T z^!%Uo;2y(I!jtn#>W|-R{M&tHyEj znc!~VoTr6)^6z(`!Gq7y(jkd=z`U*qXFF!_0)7=7+YLC|1EN;)b?vY>jI-??vz?!? z!fq=t%o}}#H(G!?8rY^dpX8r*N6|UnVZU&%Nj1C&W+-iuSD5&&<8$Ca z7K=C_7bAJMGw>dbLaq`f@YYNHXxw!4K-Tr;MX$gFfxlk=*1P zv^w$U6LLoI`k28sAA%aZsvEC?cAZ8S{@^dyv8H3OgLWAGaQM*|p@$lQx##cP-zi}RCY~H|FcI=gce&7thyRwb7uCJggIIEqFuQS)%8MFqq z!|JRCJOMb@S|YZz?8JxIq|?Sei0vJ%c|bLC6VzyqO{VdV@6bobXYrv|7`K40_!+zl zy5|-A#-%uVjL&hr^)mh(J@TgbcU_=CY9Waxcf>B^$YS0G-ofK=1|IsC^JQjIYKix* zdBt^JBY@Wo`~!O2=ZmrDIuP+>(XSg^2Yapt$YXCUKE@MTLpvJx)T+Vx+`M@Jl?3A6 z9OuW+W7m5M2R}2~j!(PlOTYT!3-u1U< zpEutEZSeke$z*$LI9G$KeoMseB|E^Xa0Z$|ALASR=r0|BK3~T_an1>D%`RL5&Nx4= zwzllk0wp~}{QUZTK3n@%0ly%;|DQ$HRaZd|fYr~7wQS3s44Ty!{Uyh?f8%UA0O#3h z5WhPtogU)Z>ic9~dHJ^o3qHGTVO$^F|GU6E$u*P9MSg?FwGj`w>09)FfcY8do^{HA1~B4qM%rs$ zoD@cno&kqeH~0wXLdO)rlgMK)Zyy#wN*|nIBPDk<^rHto(VN{rlP_-P3$I1!Gl(v{ zb%8JTY0xiz6v!ulYwg_*yE)m(yeoFWoSNZIoRPtIoeCr!?Bi@oO69$wi)CMoeanT8 zyfZWxUj{*YSS2>p{UI?()tAN|hf31n9EXTL71rx_bi37m27&ptDSealwTH{=pM zQ&zCL_X-+|_kFYG66?}HK_7rsnQ))IBd^iiVQ4ya8HOHR zM_>Nn0%iq+@!4f$@HF&ey@C0h(aZQ~8~8dQwgf)j#@)fw-;ViL+ZZ+P01nqc{JW!D zT;lGA(G-LjqFM8pmt2vO1ZP`0=@Yk}gB=i@;hLde`M$B><|9vTS@VpqlS5|=x$9J; z<9rnIF=t?F(PbHr=?E@jd*syvLinYX*k{Fib@SXDK54ZNy?mKWl@r2wT^{&}n60#S zlksCG{OA<+BF~Rnz`vLT(6Xvz8g_CKcUu!kKhT4dhGg=tZow4gg`9I<`ND)2j#YAGim7gjCu%(TS%IPN!Kcl~Py7@>A#Fk%b=P z&2`y)4m6=}4MJXBy@A_dcd(Tu`mXg3@%NjdFO9qM)zGutFF%HUA)k>fxz8HqbOMMgRYB+6Ep5&8W4= z*GDx;;=5+R@8bsc@4CA2aOhC&It$I@hT(i>whtY<0-vVIGH#~urD2uO;p&jh2k-Es z9V+;dP0!;i-uP3KMah(MD38za45W6Glj-_#CHFuq>I|OAW6dyr9==8K;5_igQS8ZK z)JHAh&jLSsi4}I0RDbsQbsqL+o2r2`-qVR;!EERfCH4Ltleg|>`JWZE0%z}F&MOv+ zew{I}sx>v?miIGg6|lW^P~eM!^I}`*fm^uq^#ju>e?%&|jg;}Z<#-PW_vZd(d=2hi zJM<(M8t>!_G0*?q3zBCZ<>&IiTS3eZ>v)w5Uchs9WgNHN7DOjx*bOl?;)@?bQ}8F|a4G|~0X6BOq{P4d=o{Td zPpQYBI3K9BVue?f)EBv2`JrgmCl7s5b_diOzg=H#xi> z(4*TkhM#x~Ucq>r$*mzgtsot|74#3M&gau7q)~`{D!h)?^9Sg|J;&$L=}ZwHiN0vk z5cJ#koa65Gv73VTCCdCh&(+4FM~HlQ%v0Xva1<5P$9?+rCf6?vr=jQ-c(@huooj+9 zzCZNUA7*h=7eA^w4!*~MIehagZ?avOOx(zsHVI&qTC$vtHv)eKID0*-V7g2}dx7)kTY7wMe>oim&Kmh&eAX}Y z>wt5k26p`Tp>%Sa0DkFsPu|Ki4LY}|DJG}$#i-YxBA!e*xrCSE_gIS9UfgyI4`a|7 zMSeJRVKKMw5l0>I9$$v32x-Ts(43R8yfO4Q z(k~>VcWuW5u@fwnLxVc156@ZWP0s^xujLHm{pw?18{F)I$0N9&(uXFXkJjFHEboq8 zz!s+9Dl8n$W7NLX_5`@`O(py-IAEW#!`rl87v6X{yl*aGza!`)tIq@IXMgy9b==76 zR|V2$SpxiFEmrQqxvi4?f%8hoE$on;f-V5({4rH*fsLGW5i6SgrNcWn&mfL7Y<;FZ|5=t! z4JM{iw}yjwd`ud30sbla6ZyGbi1&7=%?J2%!^=seLHrRfr}N&>zkG)OukiU|z9a?u zb9j%k_bulR&@B0^kMBQY8Bf^n8sU_Kuh&5_%PeM^MRSz z!^%h|v+8F2%nxsxIRiRxmCbop3-CWDB4=_n<4i& z;ES1g50pq|h+Y|-w% zFn?AE%|vf^-+o;|f;n&6qyJ%h>*Sw2nR2}!LKSfS2%KeoTCs?AO8Sc5SMReO^D+hB z061?PnZ~}`E9eby_FcM(wHzs@QNX!jMj88Vl0mzHvsvs*W`8Z6b^+&If9Z2oRvP^R z&R3V4@dLy0{c!%Jcl+}=on-ojJMnp|(Y$150!>2hv1`FBo?9MADX3pomHP42q!_YC zeC~JGmv2RXrr{0r)qhUq2GQ89j7Cqas5h@Z8%X_-r?Cc&_?q7_1hFEp@g0^G;X{oa zlPN6o67w|ip~S)1a~yJ=IYRS%EzWT0tQ)KlaU&FaG{cWvX6K>*@G};(v}7$?YmZ&U z_t2>}S;KU{L$_)|BBiK2*@N%sdn|-UVQedQ1UcT#qIf#txJ0lUA40~5;wal{n`E3X z_EX&chqG6YKXFc2a$C3yoZkcIlA}+A73=@Oc~s{%Y)MBYB>`vGZo}ENNeXI#9OJEC z7;8E~PIBPfUXsIlc1JFaSg~H%$>u*vC&x*M19wicd#lsv9`N_JyU#qG;E#&0e}C!+ z`_d0u)A+oCPc`RO;BwySlS-TxYmY2pt^<5%Ojqc? z#Vuopm;2Cw#^9sA&tt5uFP$k*qRkeInDu(>UxLpXGdz{K4fBKNB>Y5sPGoxb{pbpG z6;6FHWVavt(*UmoI&!^4IJ7X3CTAd4%(oH3hlfyPd>m#Wj*>i&NV;nFKb-Hp{L^1+oanTbZJn7+BEHXt9wkiP zJdqY4$D4TZJR6KXww|aHOZ{)MaYJLt95LP9_BL~miK2cl;U|)Ffz>_-FE+^Dv)EniLv>k+J8|e-rgieA3~=rC*$rob$e$OsPbRnPoE4%rQGZLKD}@3x zGKQa^CW#tH4PZZ(`_e&Y@J{b^U~hXuBfSioZ~MLqozDAF4|q_`-?3jvgl5GZ?7dHK zHCL!khh9?%?zos6l3ME!`r#EvZ{|L?aljnMy!rod7C!%p^BV2ezt8g<;N0hwQpn%< z56&OP=L&XRF$V|ErwX?Vu`?Ak4*2wHStigN#Ao34VEz-Kvyed_foH-eJ!Y*dLo83F z?N^N1Wlb9GnTWj3yC=I75A4U{U8oe;ru1Zz@KoAwHJM$qhPSd6`q)lB>?wHBw%t*O z4vu196R>xJ{!)2l3=6D`BG(V7@A~_*_nr~dbv0&BZAY_WL)?iSpk)!!feEOQ$8H3t zwECM6vB#I9ah^3zs)UF%ANtV-HDLSmf?_>%e!wqXFgFKwTa z1YM`if-UOD_N9rmaC@pSQbbS5Fp*l!87x$s^QWYV*n8i0SJD%jPF~^g3y5%*ynsIU z^iXJIf16d-&q#)dmN!WEq7*T7l+b+iz%=^vb%hYS?TyMq@EoOO~1 z2_sz<hBatEIA=Us&Z1~M8x8F_LGsj&838m+|Hu4gD0 z%I4#)LymX4RgTbfTQZ$P{UZ6gMleH6{AU(@aAtqTJL^=n_+g1ONZ zA44HzqYoJY=f<{8g@xE-SoAiDG7mHoP6KD>!?^FNzDvd|g2y_}^NY%Bl5TB~Kc7jY zhWVQ%`wsd+2Q-mRUiXxAJOwY>InY7%ZYVK<=3Co&@pLiI%cdMSuU-02j?u=iC&b95}xO&R!7)f_1?^I2)C#B^`PyX(Mpn+9pO)b=i;F=fmkh7tMtLwZElJ=?$vTt7&zTGe!@4W zN4ZK5{KEn08`nZ5xcxzR!1ck5&w8b*Q7Q7S-S8%HNmD&H@*^MIgY(?oRN;qx=nZBY ztq(Y<-f#0E$p`FqnM_u_L)^F^V&`uBNY#@C*hzFxBJZJnRM{>3=;d$yx64gc<-7do zqg5hxGO8*$c-)_E#v{i#lUMR7HjpF-;9u`NqU6i45c+iiTHhUCA4&BD$4rgc+rNJF zT?hW@^H^EqA(Q~;7r=R`QI+J)zc|wtGs%eFO4=g*QL^<)$uBMxSUFW zbIaLRRTa}SXeiF@n=oT_lkPHFI0dr+j06ThNuzjR-aXY<-D?Nt-nbLp<|);KUSKx` zIiBdYO3im8-$yR}%XY82CHR%axDzio6V+vP*xyGky};~*dImHWR-X%0jdW2T?CeKgQiMkDN&I9K>BveoB(geGT?-D8ET7{~~c0bCQoJgqkHQ-k&(@oSP`@ z0?yBYv*p&kl4YCGuR~tvu_)SRcpoJl1kM)U9$6L7A$VWwW= znnCMP!2ImcmFn%qz#cK&?$81CS8xDdqaN=w>#Vvz zJeOV}$7}KVfjX`={A$pr@=U2!4>dsF1O3=Yk8kR!n5~RQf8*JW*XlFyR-3U0JkmE6 z>iHW{g9GQFfNko%U>;3}r{MyNOm%WwKU&}nUiwOJ^^Rk}wllb@anseaQOiW2xAw4= zquR*~dR8~FTXBfg7lHG-dDt@w?W&&M*bn=O@G?98OQpZfk2G)Uc-bB^a4*sgK(BzcJO6mt9e}=C*``3@YXzl-E_3t_*aHXBF4mdvp z&U!}=N(OHE2j`hSr)*67DM<~Sbw0c=c^jgjYrt80d7~;bQBGF4*S=k^uRiXRK}`@J za)$R;H@241UEqA6(H!;TA88bb=i$>c)U8VqHzuO*^mc`MDf;E*$W`X&?NzUMnMkhq zp6+i;)s6ck&{)K3udS8pTSjrDgB(ftd^Pk zf|Gz)Ay}vl5TBcE0iW5yKs^*VM-5IQZHs#S;!Zrg7Z;Ws{LM!l7*FQ^`q8)a{a&NiO$S(kb9vdP84g9HF3(zt8h+rS-HlIRyddWjjhrrUqwFByj$<%T6`U zRz{iA(1*W~qXNN&{P1iPp;ZN4Kn{+tS>XFZRf>7qLHyk*)=kwh*b8}$+(Y)glY05^ z1Zsx9#}R{m>I>L^`rXGHb7PR&x_dNz2hJ;8`l_GAM359S({}w$)RovJSK}TuGq10f zj|m_b#0`ff*Hz!n`OisHJH(&76lBuDl zKvkIQ3w^;PdVXw?>Y2VD^>)Rs`#OKsTEyo@cj0+@cChNod4Gz;yiNYTp=vtv=LguK zIN0fENzjxKDs@PpT_fj}sHKtMiN}-Wzkc)$fcby#!8XtBg=N6`F>rp-sFN^btCH$~ zbACY^!GC~~E&yl!i^jrtse%m9b6fSxOemJiX)Cbmt=nA~8JR)1fno1={e_CLG8%xI zV8lewA``0Q-zzQGQG7?$}6PHTnm7z8qo=j7>&6m{m#(r^ka1C9eBs=qc zX*hbGd>=_1n)}gd_!u_Z@y#X;JN`Z5THyQ$I3F18B|HPpKY(-gAcgQ? zppvcw=Lu2kg>^9s>J6N|E@^~a^W;$yU^f!N0%4V+~%p?VE+JVWG~b&O>kqB`m8FE?J|$(GT^7Q)6~Y zrl8q)#}7L7V7*q$=_Ssj{UCeRA}51<5FZ|f1hB|p8BLvuGyGW2oH6@Onhid{?q$qh zKaKj&LVxe@RyIiuE)Vc`>UV@$Vb1di@4}%MWy~%!f%5U$9n+p;QfS6ZK&;ljDP^yH zqUbz+w&s{S42GU!CgSt=qAd0;2^#6$;C<;flNt2&r_-2+E^OSN?dj)BRj7r==bN#! z=xK~a-@eOw6Q+0q%+YJ=yrLDe8;e>y8oCzqb=cLtn5UqA40gF9jD$y6^3Npd^>B@_ ztQ2$b^+{xMc#2@~%%7B_k|^WAONo33bbZkSc^=sq@FD?gRavE(c6@Cs55emrw!PYVM@}&?_2PxKTAyl&m6tY zx8vrrt&8Mjj~t`-1O;Q~n=D04 zDCz6QE^2(>-H-(D!|7~4K8vl;w_hGVihYGf%}d;aR^2R^V=q4%KlW3%AQmM&u;L$|#M4K7rZLYrS9FhqJ_%;8-$w9|j@1Vqb$~Ug)i-WgF9||7<<$QwMiEIJsaDw^OyWcr(PnBcu|j4 zL!&GuGJ!fQSShqdd{+O2$NG>a!nbMAaoh~^D)>hijSw2|N7Cl-T7yHjwqB1 zW@nYO74x`V1HTF9cPL4V*mxwKv5$k4)D5%LcFAdMZn%P)1E0;uH!}(H=gZS^Kkhrj zhB#+X46v=c^M-XpJ?P+`N*z`<;bxc8=snK%WoZYlP+|s!T-xS%e{Q-Una-e2S-*ZH zUq1lzA1ma9Ml-mN7c@@r`L%;G^4!pz*QM@JyeyP~WYEb71 zf9i1h2tI)SVB+7~22+W>wskxo^{3`2 zGeQh`9f%q!shBmFL&vLEBE>Z>VErxqDDO}LH993@$#?t^x1qr@+M4aXgFY2@XBhx4a&I(MP(a^oYj7M@ICqgO4~wMaao8XG*N=V+X3YPM8@rBY3Q6E2Ju^hk z7TuJU?^Mzl%s58axv-E;#eL@z?FFc?!gP7QE+iN_WM3J=5f$(9t^#p#lPM&uJxfd=zUw% zJ!e+~ed)Gq0u3s?%Jy{kqhq(Q=dUPam6+{jcZ#Pim1*oLreU>E%7clQ`1Fq)1cFbV6k}jgp zuykoS8;HDaD)O#{l5I@aNAY*vA*{X5VqE3e@5dSa(16?Y&mdhN?5a%a#MO_|X|5M| zqPK?e`Sa6g6Yj+9%TxF_oY_?Lksjv-bC=^uq{M&cZOq^uvA?dwzias^m%Gmb*AC}4 z&Z(lN4kU)_-?fJe_K2(CdtFd`&9zW5S zB38vy_A7n<0{uE_g5I*}Tb5JjM?(g~kMHL}_UR+^Md4G{cZ(Mr4n1(QK`|tKcwf-7 z3Zb*`?+I7kmeisDyb(Jdwg39jn+E+^cY9RN7d(*Hg&3pO_}Z2E?@`ihiL5g?O?_I&jM#})F8$a`EdU< zT8;bBDI$>n=G#UhR*Zj|!6WA+Q7qz8(6*)A@-nnq_0UJs+009-V`;V2M;`y^< z$a5oRuRF?k1Jr|q<=Dq>d4vC45=Aa?(D7ie`0L(L^fDc_<%W6`r5i;fw?gZ~q$zl; z$WNYtJJ-UPS_ei^L)_`|Ii1NI`g@hgIY(XWN#FZK(-SH3_G(M)L`G9JV%=-Q9&|cB ziduvBXz$vN`plNnT7UQ?)%(ELErU1rw*<=Wy_QR_hSBWSakNj`h37pBqwD9PC3S6m zpMfhBB7k#yEr+MV%k-xSKCi${{P3)Jl44de{csUqHYt|e)}V$tcbeyxMbl)j6q;Fl zi(lLxg}?io`}&Uecp#-<)PTV|bSVP+AR6$v8nrVZ{~=P!8v`!8i78FMj#V#wF0-^2 z)GkFzsn|EHH+V2j{v@SXOYDGH+EIQ!w97)k|EY2y*LP8*%tAk5^hDYTO_;ej8_#Cj z(TGk_DckPU;Uu&cUqKsu=>vWaT)rUzaWp$Dh`*T=PPd0dQ-zV76=Dy)ANCCn z{Od<=IQ-8(zxlyT;c^vvp}2R(mJDTi`;`=rd;gbxKD*pkN#>|2EMl&(F3t)%jr%Ul zv>7jDaykZVcWm#&OTWs<1wZqQt&{k-{B#U^UUr@@2LG#ZCd{@iD>)gyLnof5_ZhZ0$cZWCTn&;rV z#_G}s=)sqwuexuG0qx%nz2(wmdXZ>G;n=mjd^4Fw^zKF5(Kj0cUdN$Z!)WGu>{BFy zYnMERbUs3l>l5@mCpr=Y2FM)0Z^`FLlx`PEyD_g>`Hj)-qv2#ykW3%Px1k=;rt*9T zf7O&jeCD|zYJ>fmvrgt*a~D1W7ooEhXvTyU!PLDdf`%mPNYWZb(x(LMjsNRMKXQ!p zkMk`3E)&jxCo{Y~cEQ##w&9=>yi?=@PuH-qz*&X6Z^OfT%xg0GNS?^?CK>V>1LYJQ zirMSiA$;;v8SM^3jofw?zl8n4UpUVn@2BvldTF!>ci)Vcxm*p-^%%tbnqyn|iayX< z_=35fT*Z$E#gQs2h5Q^YaSw{2b~vlyy`S<`E23z|C2%r3)+0+-DT&~;I94>H+{8$# za!;nNt|st^h#*gJFfts>q4x}~K6=abB^{~FrcjcONut&p4anskys=CYv3GHo9whd?dij=f|7<$D+HZon{JRN!R*CtO{%Lxj)hgfmPtsS4*6Zc>wYQtQ{ zM_-lEsR;BXyga$SPdYgR=chk2`1KmpbGZBbelF+PM==XE$BesnH=kRUKo!-{!K*vL zZ+?g+UA&u#y>IeZcwn}!Nv7lBA9(S1DeVBKCF@9ix_%>qZrq3N&$D_I3x702^ma_Z zr3twTZ>-4)bk=SUAAcTsT1&*tiIcc=v^!;jFw^Nkfr$4ZgjJ-9Z2OE$R!);1|pqyn?%k6%OCq^Ld@*lobtrmxV3gj(ynG zxKnmE^W$qKq+>1&p2iy`uRVqtH}24gt*iOoV9flHSIme!z#F(H(1^XzB?u|!p>fbc z>j3^?(S5!fns2f^Bw_^KB%=D6*Q4j@p@loXyOV@^$2J&*|KYm z-OxuwFMC8hi(cnWdzM1KR2`l zu7D2h8tm9_ug|oG!KCqpUUvgi$qn?zpVeUR1%C9)+ra{}5%f}<%+QZN-zF+@Q+=9oKzD%)!o;%$9^xZh1Z%XXr-v`-W4? zD_Zt`zdN1u45x(~pR!X4p46@g7`p3l126blV7~4j{EKZsj=d6pUb&-$6&Au%Kodqv z(>KDpC_M}Kb*_}IfjX*&Gq_qqqr*Gu7loM*$iJp`k>*cn9csA|t3c1W!x zU-TK0s@E_J#Ep(~(QA7Ee$EI59Y(BpAK8{ub2*tNA>WfSzH^I=qGM2xO!wkHI;2B0 z8GX4S3eM7Sei7%Z*ed>{4D;lV*zb_<=eoI=w>n|pzkfOJlNLiQR-lLJSHovEMP5;p zL_Y(5@&l4c+C|X*{??RE#f4MULU^zAZ$)q3h0p?M)@5{WN*7iJ(qR?))Y&ii*C3oX zhZuSlzL_63^rSpzDNSB5k$0TxMzz>yYc{@??VsvOTkXQgWBM)DwzC^a5Q98(^!bcZ zck*r-M$HPlah-*pbUG}IWK*oUy`ML&-4RCp{~EykrutI*iD9&?{#7<7#GelQ3ZbA| zA%eO%h`tuVUmSk)r5^*x#uhsN@S}g&%#+OFWB1>0V zx+#%)%m+B{aZjaLZ?CicTtSO~C)?1H&)1Vv-&FMX#tr6^^JNqoi{3@eOkUD3oi@(_ z$G#?&2jTA-AP-M)&EpTG$eF94L)Bv^f6^nK_MmS(-1|7ch??3Kb)0PbP5weArRzya zw6NJ%e(zKSEj^bAO%;6#co;@UKA~Q_*POxzhCqKWp6aq2k%tNzT$qb1PCn!{4-pRjv&J*^FYZ0kyH&}-f5X3TR3y3v_QA@u!?4fm~d zr?Jq~7~<&8CoJ+Li@V@tY)a&#CwUXU9YUsB&V+`si-r0aWQS!oMTG5iMT4g zqGZDuW-G`svbUD8DRUHb4zXgRSp%*+NKWf;UiXDr@R}{u{>@ac9gb4}MOfIery<;SSUqZIkHL zz!!Xe4`^piMDNkF9@+Pdpg19cOdWKoj}`V5@}VLB{S(ibjGd8@F?2WcEMJ6v{&Wi| z$!qiYz$G5!Ru@K@F3x=TcxbmKhv4_=#c!3vyY+n#Ip^E*n?~-mvj9HpO~bj#V-MPP z3ePr+`7N~j8ZSh7S3 zzayMy-vw+S>Xfu7^ddT{*?<9Z+LVYr9g|n=Rke&tk#EFpGvFJ5^X+Na4_eZbKT&}T zgYUWX^hkaQ{Fw(jV6(bb<5;#Tn?Oz^Ma^Hg+0Ft zZOkecc!$^c@@&kNi=NKL>@Luiao+aVw?T> zwGqgt4kS?8q9lH82fT+4$5U0SbiM;#v|~rbk$zqrkFkQb>gX5>&z->!f|Gx08?=g+ z_2wt^y{QhG&$IUHag$mPYU~qA-#=BeczX{zxH_0-jXTd;*Yl)VY48$I)v`C|yr}bo zK8vt!x)mk6wdgZ9#hdL!0 zo^Fk@u9dt~7EJ|gLT@&aWJQQ}<=CBr>W2v|ibkSRHW(Jp{Fq?*^Vt|UJp;w^vfp5a8Dt5{x zk}Aan>Z|*V?fn@}oA07e{p20%_%M{*zy+FV{*pPh3nnkrlZSs+vYbQylea! zTOS`1^RZjlR?gyYc#^J37(MMhjct11K~b0!6rCi7+YmnWn9Vp&XIUq_phFW#MNgC2 zPRs>vj0~VlcJr7mG%z>q^P|y;(QL^9_?;Dkd-~Rp)eDE8USn_Q+;tH~G=(l!suxX# zAH7uv%!#`HspD$rkg4uisifT}ckB!hTnzT~&b1rs7 z(7RCAFHjZ1XCVkUuQA)JItk54{&un~)q(w9bU+t;(9ij* zTL-}RSm#gO>(;1x?C_&Ym*ID1ouew-6+o8@yx|$?q^b)Frnu9dWFpZ~J%ongh|3=I z5`OfHF~2gx=lb7!a7ffnwf!X}ZO1!qYCcaLdI+;B8}KXktXEs2FY1SSQ17pD^@BC`zzt3Y=$n zV>m=dXtpCB2!`-_DNfUTTJ8tkLSGuW%Tu#qc>wh}??tuBCYk{3xHSc~mv{D8Ki9+D zO5slZ;78x>KJFmhKlPvE7M@inq5r%Yb$71c8FkY_<=;DNOQm|6ndsLUIijXEg5MDM z&kb-V?m9VJ^AdIU1)Sj(W=hR%;C$2tdIHDRYhKJuCnvlMG*YGcdJg=8X5giNzoIF_ zEOf+D^yJ5U)U=qDKr-O`c#FPxG$58Hwgn%+ti3oJHJr`ZB%EnWQ4uYrbLolny@9QG z82l4CJU4@MUBqS=BWN{v9-~xY;?CFz+NS|u!c{JYPJ|wyJ?fv4i$xjoR-c{dr_Ik7 zYg<5*2Y!XO>XwV2Pr(}z{nkM-x#A6Il`NJ-QU8!su>$^?Q}rUqcl%WF(k*}b=@>#Y z410;E_2K35+m9r&f#?sd`^cfb6zp?U^Fk3o3W*n4m%3~2Ko4_#I}aLJB3C>9gvMZ| z8_k9vy>es%#V&CB<2?KBc&gT`P*OpA#DpLn%^39Sb`M70TQfi-vsBUv2b^c0P|alr z1&Oo3`P5yZnb!ln0@N?ZnhtZ);gyHFa;J{ydI`Od#^@cjG#1Mg z$dZMNKNty()kLDHPniaq`8}^C(9i)5HLfP8pY2H?j}bZ= z9@^s9wLfs~Ed7yk`G_GZ)cNx^f1! zqb{(?sRmN$E)`{3LDS))yL7ORilR{qy6n3`N_2$gwku|heVF9dTS0Y*lUGlADFp%N zc+}MQrO+c>^Lx2Iw#Vxqd(Zdib#6?J%RRjXsywAjiLp>*7#vJO^s_V!EU_|-;rIi z$GxC}9xT8!gC2tq(31(w><)Bd8X&fNHiI2TO*aL#_a4ddENvxvg4OWX7Z$KrYV3vX zl|mz}*Ra7^*rV$wrzML^nEXmKo!kL_tm+7Rx-E*f|3W|1;~LxYI+9v?CQ&MMK5M}- zczzu?H)*W#U4S`R^huB8>1e#5AyZO|x$({>nwH+!y@*{E2_FY*-uH*5gb{ROFO1cE zLJj|EL_D-tW@_G4#L)YZapZQuPxAsb|2m%-vX1xFT#bpLW2k@19!=1!Zx&5WGD2xd zm%r*X#j1wwvtUN52ukgyh!2~N!3-@BbGCpGO>^TmIt1d>mGmL9GKQg3IuR8!?j#?ROh+lHA!6gRmUYq$%n!=ow`1FOWm^$H zk3{~cIy#K``(#j;KHy-Oxv;p0=xfzM<6>hBJG4KAGSX1ra9Y5o?MkAuzc61`yoLqc zj3)!|47sPf*sU$G(EF5Ap7AlZ0CmxZnA`1k6DMm z=sPs}rYBNM>yPXeG>+<8VpjZMHJf7}Outa;uxVb!+-C&PR$b^T_1MEG!;ebtVoy4r zk75nJ#l*Gdx{>1syd}Ar@q>5JS zffqE?RcZk~QhV6swDQ%Gi;0Q~34HHfSEW}D$h#36UrKDwlsy&XH4Zh;HfAgjdG}y^ zrpuf$Y_op`O+~Kl<{!X1Jw?Cz1NtZ@6m0YfXbEFRIB;V=dw|%X0(Ismv$nHR@aQ}& zF_+qku_4fZUY-d4&ymaQ74~w(fLAYbdB$umMUk(5GCkG*%$jzGmK0_VkA;3^XP_lc zouTJA|269k?d$c(4fp32d5cRBWOu~+~;H%&}dWW&c zn456J?q0XDIw@=y_IFp!r87USi~UgN*KaVJ+F>7kzn^gw*X>W73!TiQ>EL}8c0_LS z##<@|&-{%!&P2m4Qg37AgNPqKdOwzG?GQi1ha|7nVK;jyCE0`R4wnGFoUeb!$%a7m^JWQdMO(bSD2)u0Y zW&=_#vycwxTY;;&V$(Br-6e)TJcd2%d}4{%o1_8H$~gKXGk1bM?bAfM^8692yMi3f zCxJHjNi6q-KZRn)bjPV{*vZR2bO<{mRv*k}rS903sRoBBJDVl>dehymk(BLSz(Q3% zR9+BH!O`28P~}T5sLPGszK?Cz@~4##gX#PC-K?TV0PWutNat?nvbe7SRBYf+lMYN^ zo0|vG16v>3EnJX32ZhinJ5Q_zC=_QtjYLi{n^rxzbvP+E7P-TpI5)N%EX_ZLbFc$& zF^-pJVt#P9DdtzZ?U&*(r}+jLnhg3Z`J*m67Ww$-%xiAcWlr% z>2Z@4+Qd;+o}7k#e8Ik%#8B!(>{73O%Z@;I?(&-?vc39*b$k^{Gq+){cR(c@iM*`f z8~D5D)-xw?o5ysCqaITfEZ5VUG;TP{9>lQItGuY!ktkYasbob{>fZ+zE_v){IPS%j zaO{KG%qD`T6ad}f%%eNlq4Su-!j8<1J+`o3m>*pFG>|SdoX0df1E>}DZ>_JeVIQsq zl5dU=9Y`vZ;wOcW?Plz`&&v?Y(O(-@HJkEM^A6iTiouTGKXD$DW-W_;8bpg)y)~Gpm9La9q%_M6J@M--6 z*_yZv^3Xxw$|9Qu{6QhPdCGsL0+CPLkdL`0o-EFLM6811+ zHbHKvVjIyjm0rYB+j3vT(q2?HJ%(Ji__MDbUgTAWeVXkvnZZPF8n`)lJd;rRe3+-q_=Q@ujn!V>#@9dlThH;L3aAM+#Ho7upg@wEJ@oE#?}WDBs@ zLw~58+RZ)28Y@uOL>c^Fb*&zx#Jfe(5!9y8haJ6@DHCz8UC$1uA$-V}H)oP-4m z*15AUX&Q#nh&S_D$Y?*h)gXj!BgeG#!#@5l789#2j`K{5BV3)zq@yk>MB(GVS4Cfda}hUI%7e~H8StFG zJWJAn-q&W}yjH$d`dpPoP4Irfr!$h=CzA|;vrX80>G6|v62XzHt82;XInk-$-p_4i z%q*Y| z1eU)(96L9#6ImU^W}?455nA(K7mQ@eWB#O@7*E1`eO7JZL$2U3C8jrE`z^dkH7o|Z zWYS8&B#;*0^q~oR$4Z4`LWsljQC3~T<=lRr#c1s z0B4JZaZ7d27h9l-hy`%9kT_#^0NB)=Pbj!LIiw76(1nRb{E?6JUX(ztpcd`eAN2})JPgvAM90(rI}5RNJnhF=mR)cFF);< zR-Zu4>?YVrOS3?F8OxhpZ>XhafRpvoEHJ-Gd~WAOLGuo0O$Rk9*C9D`k;=i{N{q^OCRw9Ful){P65E}lxKp5Pj>aq}b%>Pf>;3tblk{dvswzBK@= zr)0NeIfm9+if5Bow(tJQg_(WC%+iTcmmvl}FjR3GB*W8d-j4C(V|FVtjWh)a)>?A4y6 z`zVSYPoF2fT8TRG@<=+}rBLdIdVZu{1Z~_{DxGf%9Wb{rGS-tMfAC>$xrERa3nr=7 z`ja_!l=|y#k*vWbScjdI(tR%}7%@ogGargP`AA&g5kh7iyr4mrtIk8N8OhJV-uA0D zOBFG6^j|pV#%~w<0O!TP`CN|$qSG?W#scTQH}b^dw@Qiy&YiB5ire2}HghogR&6hc zE~Qzt6TNIn^Ij}+x+dP?8N#8JUX>;PVpB(2mzZUUZ$=hb=A6;t$3CSjNQz$H@2o^X1Jn#Q=e z`BFuC2z?!pNHYV%B`;+FO(=?|6=OJQ(gq(o{VbNsI(L$sr-18%onOm#X-n0+v7ht> z_K9j4NJ^y_ZCx8lK}A+l_5p8dVirNoeH^8YzkO(4SQu@-=`Qtg^&``8=;v;mEoEYU zu&a3xRXiLe8Dfq;969;h)h(ppxKjb=i~d);=3YGN_!hc zqfgHfv!cCd%C<-v@1G%_-r`LItRrYVsuS&MeaKLOKKinaq8#>YHZKI)HCx5@n4^!e z4?>KcFP4L6z6kp@0q!Rmr1*arlh3wQo3PhFoy zZ&3p|b)|86!vUF82u#;L8EfmdIi2iK)9AeXr|k;V_$|P_A5l6=X8Z*@7VV*zI6x`; z3%vd9(U=iFSS+gnSAP(Cmd}&U$d+rMtKUdYSI@qdZF(L_>qaC~#;-!wS|UN+R8AxxAVJfEd2Ab^*Gxc8gqJT z#C0=*sJiPX+56f6QdId<=g7UXO+AAst`U5VhrKL4ErgnM_af^}uC{u}2OlARuHQ#r za3F?;{R`)&7ktF0z?W4uesx4P=`M0nS6EhB7zZ7yF zM-%8-IQB5LF5^bui6v#3oDRw^aq|nX+x!RSan9Fp;m{UtM$oyd{lS$i#2yp$U^wUt z4O|sM3xKmHID|bh(|6`@JiVJ<#&yQ|fBS1Jr5{_)t#a~J|9{oF~GOm|vg2T;2!+>T8N z6ail2ub_`y3SwT{eb6S_tIaQqiKZj9$t3S*z@I9Lq#PUU3Ov)BKL$;t@vfL18)(Mc zE)4;XCXpWGcjgaZHs@wJ`na7waf#QUJ@pOq3kQyKQ^tW?>mEb);%@G6k|!+!&aE{k zxD)7W*GSOlU;C81AK^`*t`VfT(1h=J)rThT3!|VTdc2<_^n8woP={J$ejREiO)`VX zTGo~K=@v*iZ?Fee?-HGoB zt)4QRgTpSg;G-`E(2+y&;EdnpvQGGr@=Gjvw%x-W8s&(MUgxL?-;Kj*g0X>MXxm~%J zm;;OP!=A0H!?;1Iv2<~VoNf+s;j{*0X6+67@p&;^AoO{H`X^)0nvzQrz$KiBS+k$n zoHP2%mn;&=oUSa8bQ%Ys2I$A-z{Xoy`jVa1FWHf@5Gt|uqR)f>vOV}2*F0j*-}~sFd`2DY zUpPl-PZ1vj=Xzant!~hu0M4&~b7nJWfIL9$2snpb=pvrEq@Z8u8|Gd#7Efek(I((* zc*{au&>Vd$;QXw$t@tb|oxE$Xd(Uc|_yzNndsV1~hRqfa#wXLTrqHr3h!wv(C(svf z)cHqei>cnRw7pnPUfc7;Xg%=gUnWy+pDkjvLnJ*mPlg6=srX(Wn#15Cta2_9A6bVW zuS}%wj|xOF3+LdrczUoPL=24ep@-G66h75jy!gSB`izc&UW2JvXp5fzvnXtqme`nJ+y^Hx_&0o^&7XMU@*~lq>2Y>CMPFfA6DT-4ydR|H669 z1wXMGIIjWD1~Fk`)%<_*lw%Q##L#<6=s$tS_-(s*^t=MT5&YZk=fvSDS(FHz)j=P` zj7FKH1DwTyt)<9dXvmvozb}%Lo~u%_{vL&WztDifPH>-|&?PWUru@C@rMOSn>*|n1rCrubDNRDChe0Bx za7(0x!!f_G8vgm#Y{}KihZM4r<7vgP0rvy8*a>&?x7Za4RPJLTN|Wwa5Mtob6adKlhB2uTYf>*-BKgzV6OS( zXMg(oX1(+VJcMUseKEf?R62S)1pBhRXsl%?v3~>TF^--?AFNN?sG;f9<6k(pvUlOV z(1(g_2hOKMIk&%wf=rDOla=-4QsyY=P%V(W2f7XkhwdXWZQz zVs$jQyYtg%XyQOgy9PS{CFo}<6D0=;&&V<4l?yjWyP((o8n5fxoRIQ&AwJv=-@fXZ zlm?B#S#g;AW?HN(xOp#-+pxp!*%tI_j)!5ct$8OlaB~uw4}+e-%U0|txQe;^l4;k3 zhmvat)Pe3K(yx?l($TCS`hlK7NvB29R6O6BXK}RgNWQeo$Day5z@IqpltLV#!*er+ z5-cmF*{S{%og7W`kyG1i2T&z=`@8yTvkl;HIDl*Fy}KLRUX9xG{ZQg=_hwhX!`+e- zOgE!Cvdzf-9q_rs=KH1oKSOETQD5xbEf$Z=!EU%h>}Bu1)}{yMwwmw%r>0aNch&!I zj;||!7IQs`ZBZAs7rEUX6*LNUp|Zzaxu#JHY6yGo@>)<2=%S<}`27P)mx}q3na~&Q9WH%&t0JS#(DEuOmU1u`(Bd%s_V=3-Jy%jiIli;27PH-`pg~*E zFKDRGR$?YDEdev&-UHdNF&VT3{{P*((QIlY;!5y%&5urJ_qDO#7&@Y&dKN3W8&3-8 zHe`03%v>#^>3DcDb#H3MJ~l$Ua4V5sKWV_qje=-T5cpulS0yW)UHd1+lT>$4ID+}Z8a;H2h5v9D=OVUk`_ku+ez*RH z>HJ>snP;}a4C6@+_d^#mn5b9eH0{Vagek}y{=sz-7M@X(l{@rg z7FbIgqEO$92S@b83Te(?=*#3o@2JBi$q#cbop)lMWmQww7WN!k3jPf0)h7-p=+Ro# zn1YA10*fqqhQC!B&1B1>Gbo0K?!oOiW(s@HK`+KSWIk)$E`=VMVb|4(TxRz?k){Vj zhupG&eGQC5&LyYYc}rP$XpB5bz#a=(7+c;VjC^|~(F!wL=8JgY{i_7hp4o}jq84OW z7f-%J^;j)@&VdQ>$Y@Wu9H-Hlz z9z|0-uVO#4Luoj6{eB*#X1B*;t^ykUp@ED=f^T!W?jJ6$@0C>gCI53z`h=VA{P-aX z;#*^fTaJICeypve4>I(-%^rw#N0hW_Dr~QpyJYGM zZPHM1KYo--8Q}L$TY%bKLaj7?A9f6_!>oOP5sO3J@5v@;U4oG}v=V+k53%=4FIF)I z^;P(d=Z+a{Qeg%S9RZtPki+Oc_1i?>$o~s_+22@fm!oYbn&NVFh!B z&FVTplYHzcc57KIzEe(Sw~jEIsZn(PICkNz+RXHphEc`=@PMDDvq8SW6t@dA8y6v5zD3H#M1K;D63$sN}>KZr!AD4x*jo=S7IS@x?PqSGwoD1$jn4#^l zj&(Q_N++tLiCoIq4#ePnoulYk&^Go3wWGYqe`X~*l%~?|{Lnw_*|o(i{t4{apcVKS zX(zdH9l+J^ggCjCHuuR-K@Pou$rK%N9sKha^i$?VH#<2vwwsE&`@j$M zKP5$+!VG>Y_+E=zGY{~Z{Bm$#B8IY(vg zK8cbSEnv?t2GP~pMA};#!|sFyk!@TewN+=apANxv7<`-9tQE`&pH~~AXMAictLYm? z*P(y) zLj{j_SUGdCO{aL|@+$2MtQ7OdbRw0E?4GcU=gCy&kxDbW|73UIL;5zxTxW1g&5LQ+ zU8qT+H*@tgeb2xLK=Wk$Gks0Uw-{QA{^R2wT{Ll5F*Ey6PA+Y15s$yq((*nG6`GBPRc){K~dN1G@^f*7@(6Ywn}wkvk52r=@zD0cR7a zSqJRkpkA8hi1iMC1RwRIGTap`s}gRn&od}NKt|F)OLtw95{`m@~~H8Uk{BA zX4jq*=16lJYXX7cvmI6c=L1nE9g*j_{RPhx!4v8szr<^RW{&G zOvBDW*wwcZ7x5wLb+xA8i|#R(?k-Z22YkryYa6BKW-5xo^S*0;L*~9pMa^g8eC$1p zb<4-RXE0)##9+4Tx03F|&RzR0WrbfAv?K!gP8;;BH)m0fH+r~_kFZqZOz^cZ8{X+A zYo47>^UyK zsp$+&wt1sd>0WEn*z}4g8Scdu%ki4C*u#F(4SOVyI%#750zYInI6Q9SG=Us;%Q|63 zsp}xk>TclEp?=$~LR+)c2=T??6ng#p8v8aYj4sT@z0;A{1oLnj2F`X$w3^xUjiezf z<@D-UI-9dBhWc&zM-yo%fro|O@&DShpVF6)Fjr7+Gw8i2uW%C^DM*5Ev`T2mEgFkC zLHO#pHJ;)z_|?*)?bt1g zcyjlJIyTiB@jG&;Nj4Ps`%z`I=PfKHF8({1I^0z_;gkYQ`a^zVih8RyZ%s@uC@KYR!D_L0{%kU8yqAu%@W^l)Hxx7JSIStZBj#)0Vb-^Q zBs0##y|emf2T)EA=%L!m|G;_hB7gp*iGm`U!mob4&INtVqRdvZ>w}9Q(%u_^%Q6w zTu)_Ju^;6A3}|qetzkx5N@@X{Pc|)MEskgXt%;$zevt{#u$qGBqN4Bx>xTYUJH*mc z`!v+(&q8dD{^N=^Z8TcY!{`YAc0{eOF;=1<{vJCS$C_&tjgn|Q;=sw*Z8XzvB#<6v z727EtHTIuS|ENx-=aDlt>CW-w2wMu=5vW;F0KIe*};{L!d{jWVQjt}JbbXCw~{O$3u+g!%0ESiKf(JN7#8w5Kyf)9DB_7;~Q zkE`dD#@`<%Wsg(RK-hLXw_E!02>Mig@%huOSiFmh8sVBN&Bw4EL72fuUUNd7&UPSv z9y$@vMaEiI)D*kdVe{3shgm!9nVkZkJh;hKcE7%Fj z*iQ%iK*2*(uqU22_eT707OZ*JB%a)052GH2YrccmH)JkyC8f7UYhny$)-YdsL#A=~ z5=n1yMn8yZswrp|L0@1e9s6onM{seUI>PV$E@pGF-*6_7M7*$)in%@AV@)Ph#|p?jPWb}E@PM~vsvp0n$OcmuyB^7{<&Z60Q<@ca(H zIatabfIUH7(JS=XCABz-c?#f=e6S@m;8fHF{^W=4XcjshGx#>BN6k!UU(hd5*nu}Q zWG#yZ52OvQZRPI6tlKT@*8{fwORq34K9kN0xK70@*8X=o%>>T+NsTn>_3%mN@GYI& zYJUEL_6F{6mbZb%+e}X9_0#BUthr`zNfKov=I!Wm;VEuaNu3_t%X zbcV*INdkG=<5{cr(~KB{SqeNSdM<&Q)$QZ{KCcfY&(I{>p`JMpXVC6`n(3vH&`SY- zyWk_MtO}=uSm=s>-p!h!|9&6m%hkqfS@(cQ+Kc@e*ixAamL{cZw(n4r(OX(`Ab&*|JY6l{kKU&5#uG`_v%_SXJ5OkC<&O`pR{L}N2%ygKRhG;ayI`yY#x4~(qJ{y1ec)2M$Od z@KDvAHSfaY)EB<%hOMdQ&etTW!TW<%gEc#^CQ{@;bfcJng@?#sW<8dEoO|=j695<&O$s3d`Hdhj}erch1aGR*v$#p z5s4VdZN?_{dQ&*1r{nr#maz=fZ&%=N18Z&8I4p)H;@qjnIdcj6MTmRrU;np`q-qkz8-B~8ng+OEWB%fz z)!5hFc#B{o9Hpa$^y4O%~C*WZC#ZHen~{?57`NTm;h;Ga)7*95$g(G41B;~Gw#WhD+bf5?l6GO{q8ym79nyt)!H3_$ z>&ee-*+tZm2(NE#pTWMbM!gPyJIyPe89_Vx0lpv8zibq=9P6+1{F{81lY-f!I_&TG zQp84_h29MKAs34FGn>ZHX?}wqdWQ;@u`G!kULa?2xyp>dD;tB@IB51`c6e$6>buA% zO`ftf$Kz-kUQcdwn^}R&7mUw*u{y{`;=HRwPcwABf(>{Uh8>lulyrCmn^_P_{cvs1 zmJDJu^}?tzeCEvimMjswr1#Qf8 zMh6{v|1Jt@13ZTxE$94iX3(GoLpv*pgWqtz z|4l63sw6|$?X|2)(osFsk>Iy4B<4yJ%vEH7Gk0jhG3nMG)I)R-3+23)hN3UyhPdUE zZcFwJJdlNWzedN9MU2S&`#Sxa4PYgg!PCR_S1+++yXEj1h=2Akn#!6~Vs|C(W1^og zGx?rOpKzTyHi_)4sy_F^JY$ZE`T8VM9%_9j?kr(isQuT!Kfcd0_7Z#ds_{DJs*2Ux zp!R^@Wt!~4R`!l058U@T$GWo+CG?kY{ZH?GkSarA&+vOUr#zLOb`2wE#4uM@K9;nC z!s%KMob|#{DaI_4F5ouM;Ub3lqpMy!YLe8bfSbF`&FDB^~hdwN+H()f8yM(s~PWW0KWm8-KXbs`S-KP8TWd{-~pT^YNVH8 zKO+u3k~Pdx&{8}*Po@^gru9+McKBOahgmYF#-2^w_wNM*WEU|%%K@tigN$VN1=LG% zPa}(rWlN7MsUyy~N!R+ymVgJMfq(mSQIHMafx0MOvz=3AC61YN6Q9X`6(Box6mz@W6&;i<0*}TE z_vqOxCTqDWo`&M{_hyQ+=W(&r4`*?|+G3evYZN8m{nGK7vRKRm-2t|T*a+EMzfj79 zP5wOHQnl9FKq6X)k~E~hYug=;=E`35JUc2^B-n@?!ZcNhmftG>`_Y-r0X z&M9d+;^7v$b9rObMccs!+K+a3<-4%$ReUqln{9FKSmfX4XF*?WATas$@-@H554xdvz5CoxKJ`NaMdBX){M100 zh`i4ppYJyE6R%Q2-vie+BkC;w7v{lF;yG$Bu7v(!7`fo}$2NYv%f%3K#J{DP=E_gk z4yA*@?a3=o{w#3rF%5RRa4w%89ZtG9PtD)k^9(pQaK(A_^#s=wvl@rTAfLiM`kwlj z3laXrdFr~R{7B4Q1_I}%$Ah`znk;$^ zpfL#B=&~X(x^@X#*c|Qkjw_pq5b}W1|@V|9MCXCpD zxU@fNECv&V;FNfbKpC!yiZMYDzL0-7Ouq+OH4Dp$CxsPB7o}?u{^LySTAqMlX zLwiFD?uCiad0#jsc7v~;|BHKD&H4;KsYNKUiO6}EUFX*s zh0%L2#OiCW@%gADJq^T}aq19%tA8Z*or`m@)|S8J3>~cr;J;xX{eiD?8uc%nwT`{w ztWn3P0L~X4PvDLrH`xJSQTwtgKpUfcY}NWMT7U?2ClWAH$JwrCS*G zAj3DlYcJS?E3Smi`v)`?+`;9~gAHG}sw4D-ra|B=A!=i$Ttk zfb*Bl?#mswR?tECiuPK0-0mZ&BOz89JfH=iFzR?>Ia@Qzix_%uK8 zPJu(aJ0JLn2%Lk!cABIwbO68itTWF2p1dGpE+Bg*&QNU+p^9Zu1b&OtxqK~Le>-e7PI z@SN_k5c->iP$usC1vgt^ZqrbD7m9NyV}$S?^D90nu!pnug4^71icZ95x|j+xI!DqC zf8?8E*Yi6F+OY7|JoeEuXXuFh>m1|{mT=9jz$*aG78M=12gt$e>xbFh%{i4FV%^qh zH0az`&hLzZhQU{yzhJ}<3szDlY-69bihtM`^`e3B;n&ae$7A3(;1hb+wG|5F(BK7D zqxV@07jQ4+c)pf9&k;^x&ZU0<@{z8YLJf>7A_#LaopS|emrU}xY--83O8FOQwZ$e?ci0R2j=7R;D2A=oS?S%=ugQ*dGU7QIo1T7Ax{kTWL`4fcY(6N;H z;C?-rCHOT8C4FFf<9>i}2t9NiCB9$JS5QF5u5A)xzkYUtPebT-c%#3(c`yIFFJ|+R z<9x?HdhSp%jRHP@AA=3*{~x_7oh97fp$fVNoU7-)lNo|1qYs}vvBs2pI7UII+TfXL zSH^WmJa!xQuywu_Uk9!JE$|hcWCi@ocIbEGTyt+#1KoZV-5rO#X;%+n$UN|xV5?z2 zorE^%r;G@}8QLyYNNkRnFb25k<_Z-jvnV|txozGy;fO2dYVrQ|*^=M{oNokUhl}wg zp(XxK3%^}Q^H2ygNujqmgF=Qq5q39CqE1s#>sx| zk+5n8v`t_qrv`WknGHi|nlADw%Q1qNZ7_D`;``sa2^*F}OJ+LkL@!v_ZjSjET+f`U z6k+){%qq@a6z9^t=Ta+do9~e#pab`@cnJnDC6G5x+w>p#d@J-srP%E7K z{jrbU{b>@t!@v8#IG=bjmwRLLPhE7yrE-}oa+4b1%odq&lO`!>D&ox0eaE@{d)Uzi z+xRwZ1h2|a(nUOvn$5-hM*|f#5pd0G8w$FZ1u%jQS1cJUj98(<+&}tRMSjASX6O$l zp#HOap>PIsh~*iGE99F6htpY9i0k*WPzz7oGU-D)`ZZlH35|hsQ#_k@GOLA5`0|(G zm^E;EEljY--WX44^QxX=e|iFyPC%}B@09SW0ra==?ElrWP^efDPN!iT?YStSY8~e5 z;rFTrI0?>NFa`9i=lpmGZ^3)Xz_XC9h!8?n2Gh<6#1HaJp#|*OARFhd-$KFnSqM#9 zh?(n}B|_=dPPWfY&|9wHtyHAMVrF@^uS zKuN#xyY%A@@UMHT$OO;q`?8iohczmShwq(LWG@t9uC^!&@nl(oU;vx%06d45+O zAMk`vyJH_AjCTyCmhe~Y!ZU^DtApt*u1#n7V&R5C2;Ex@y^)k$A?IWW9m&G=Jj@lI zYzn0!oP(=BsDwjD!srfc=~PD>Vaj-Da`r;}lODs*JsM4u9;N=hkN$f9cnaP0C(avU zZpump1w9AOXGivyt!k^F1=_H^Hyyd&(-H6C>>Ks^DmMi2*g5z#a~%&pWCi*u@PW_E zG`t10svI404&LY>xNlX_LvQddzD^JpfLCA)|JK1cOBmc4`&pKOpP*PTEbpqMy=$;n zovDR=7qh76dc@Vot_e5XGihrfa{oQg1+OLP1&p|>&}&sx`l*4+A;h{52~;)t8AH$xq%oe$q^jgkW3ljnq2@14D5{=D}+;nL+~Isjkod-brOh1s>$h}k|iUo3Rk z8bPDr19Lmi7T!(>r73vbq2pv>*`;8_@~B@4UP8aXe4Oew9)P z9ve&_VYe|0mI&4%!L%1=T&Fj=f-y8NLxF96(|n=PxDX1NjaX;lJfYQRFsTryO}H{n zXbJt%F2Jhl`+43XCmi!bsMX#a#)XE0BV(TW_dfb-IuWD~Zo~ijjR_Ae%E$FV?ts6& z=((bN$P45Sz&Y~GRoO)&1?k~=bbNk{`w0G_FK`|(-E3+QWX!F8_I z9VOgx1-B6A^6_ad!ea23@4Fy3mj?)GUf|m&gE#1%Aei)oCdmR|{xn@!{u90$m>adv z6eeO%mLd@6+Jj`FR5yh7jK^m&)K7>1-;*f>Wfya~Ip%LTG#< z1ody^n5V4;1!e(f0K@a$9fS$cIyeVEW|%xi2-m_43gU{alcR+B&~}YQ3=>B(;Ui*_ zGWeM}eNBWgs}O3fjToln6F;aB^K|PlYcqNyzh!+WZ85^mxQTuFL#S7uUY02@2FR5)-mogNp!<_D^TZ6C4s(jWMo zoheL3ZF5B*_>%+XLJ#zeHZ(#E|FDH%tRF^|@Xs#GwS>#(La1*)2&3aeurn6V zezLC68rlMC#4Wa!dV*225DE{2kDAg!_*fH6mGJpbx-=IiK{xv)zW>boYW@@E>5HDD z)*V>P_e+MZrcWxhikiV!Dnh9@xRh=#kGSN-aPaWa8@|?<8;9K%x^DlEv)}1Ic``5B z7>M1VW0?Y+C+<_JhoHW(88~+-zHD1zsDRG{SHIm5F0oKS0&q52e1VJRlz;c*y4YIt z8}CAI4LDnOT*BKU*LDHUA6-uKH*gM41J12SHx|6WDP0eoXI2>tj{B5U3!Hyj@qz=m z3cJctvpPRb80nCO8MpcxxQDRC2s;035!+v!B6K|k4P#(p(`TUY4H`)E2O_U&q%BP8 zjd?ZTto88@{{?(4LVdp6xRO8j2$;aPc%8q*UjRNuqft9ey~S^WhSE<@oC}+8^Z8A2 zFMLru{dJk|_yqB@BVs&J!}q-(OoI(^?vE?veZN32y$X9+8hP{m;eQ@;sia?|!w-)H zA8aFZ59Q0b(BN=-{aQ|CUd6J@anUrl;s4{D>HH_oU9=~Oj>x;yfwOOBiFylguJ?QO z_W!yYYHPsxaI4R;?8U(S8A#(X{O*?EE%zY%q$k-%9$U;@8o4)hy=bGHu5 zc-L(zvIEX8%|yN#{PsuS9PslAZwyZFnSJmNrp<)Q$mJiYaaOu_7QTCD(Q?@Kj7vts z1-A@pjL*BD=pxiaVrDA_F|D(fpa-teU2DYin=bHy52HxcxIR|j%qMjW$F4@~{YqjGrHRLo!F^A4qXybQA~@{<`{7UY_VDj6p-v^?IW4Q?Ez`3o6_{VOzs!$UW{_?XVwg*3c=iQ5XA+RV zJM87H%`lrHApShJkS|P(rt^qJTdHUAPMPR&Jivajha7)R7D}P8^L@W;`P-ORU1N^i z(}?(L*t6L<^dP=*d?)zfx6^R%4h-U7+z7_rd&Eec40$hTs&P7~u{5vao}GanRS`4+ zp6}tV*oBY)-rc5Ivp5s*8;@b0cl+_%vVI=n6j%;^-Ts%h77@{uck2If*0%Z+=cU`% zi0%UvqyWzH!Um!i_(;XTdCy^Mbt&r4^)>v3`NwQ^!INnQoCoNhm#rSCBv;^EF?J+3 z@gjPE$gQ5tS;gst8?zEPf3&&9Rl{%S1Lr}Q%li?Bcmp_FeD1@K$IM0O0mNeqNAcS+ zW4nsMKl{(-FRnz-7nldz1o3;fWzf2)O<)V4n!$cm?i z(%u;C^Q~}^2{WLv1b*oymx;Dd!lSACo&U$V#P?5}t^5y(V+Sfog==29r_s;Di0bIbIeLSRS|>v9t+l-HxAaANB*!960~Z%aa*{Gq4rc?ECejY`imc*nsoJ z8|It|aMlLSkI%Vr5y{~00_Tj9bneOnCD|QBj^mrl^+ZgreFWHAY~hl2W|6T5`P$?X zPQN094k5-a9=w$c!gudYK@OtM;cov-B-atZ!O)NU3hvNpT=Q|S!CV9V2<)&;C1bk| zobJ3(TJaY+ify&Iu*?v$(nG8m-;%owEu$TXfpeZW<6OQ6)6cP}HCg|V&BLyrWFB?h zKDT6hb_P>%JLE4ni)05;$5X(b7Z3H8ISvS++4`w;XKhp2cj)@h1HYPY>SMcgdN|Fw z@sCe7h>V6_BX(r`XCHkqxYPgjA@y}6kMCE-e&9dP!!_588z9!gZ`9*_%xtf^Bl?E5 zz`5fs8+GMU1w8=H_s5?s=ggJV4miJxOfA={Qc@hSSg<~$e1#KujKF#0IkCJC;*DSP z@Qkc$qjpMDk+2#5Ry9T~$4pQsoOiD6puG&fjr=J7tz+xe*&=dqV7^cLpnB-_44Sh8 zTC$%+^&n5wp;O`K-S?`WnkCV7;M^`}r8)(gt9RiyRF!G!E(3p%lA(Vr6FrlXj=;Q(ZilYf5>Uu;5Uc; zqNA|`2YZG8vyc9i$^YASJMN#7dW&l|f03s)0XM@DILFMrq;5SCJA4Dvs7Xb8Q4jHREpVRR)f`Tn3Vqjo*V1AqDeSY8n^>wXht$ADs!#?+1_Z9ovI|MzYkRr^`9V^8~(6;(= z2KSoXOYy{`Sel%R*%^B#)-1t2jPu;4_>!n-5kZ!SvD3VALG@;E6^8mIH4H_oaZbC_hVFmX8APKL{FgiJF%Ij0zLol z&bSk&#})cU1d{u8_*4JuM{nKv|K)gf@AG*pL+K^7Cq)7=>A2_Ff`L6jj9y;^D`Hk3D)X#)I z8{+ejg^R>=^r9DK;U4e4LVWWJemBV9_Aks9BfBP$&ROscjF{N)W;~54M!gezUaYN* zrC{K^?$lY)7T>!f3Ud(dkeFQpO*X{RDUa8Pv%3V*(XTPs4N!=k+W65!aKbe1wqlDF z-tb+Ep##;tSdhGwMgixECcLQ6p+|wqp*khNi486h`Gcq-6(3kd%#XWdwf#&5*><;2id}r2BlL?Jdn;n>0?pRfr zhdN~pG--SO>qqah?Qfh5hWC~}S%5PDoDUvM5#xdLKHzL|u$x%N2YU#dAI6;2TuxNc z4&WRbpw#>UKD&T(XWbbZL+}b}CSy+VW}YTzteUcc^Ao!S%{=rs+5zVl@AhkkKm*|t zaDM4?M^iU{*^Szy+M=1Bl>(4yzC?S$qHdTulD zyZi|}uF;~8=Z!lhUngJF1NWdOa#6n@nVMI?`91nGj^8Wpja+jWINxlD z9I3%@&5!=*muACTxm^>@xVhfo5`(ie>SUo2>XdnpqG`wE<%LG^f#ig|`v3gsH+KKK zzw!OyNXcjfbXkFO%=DdNzt{1Ui}!Z($^g+DI6nZ+31oa88ZARH*KfK|AWj9Yew|K5 z4RmIfxdc)+xcWz@oRO7)Tj;qDe%0=qWtPZqi*TO1*{ql8L4Rfp?!hBF(qytR$bn^e z&)-(aJ|VAjnuYr7MUZT85$f(a@Kf$PO6Cik9T2NqIsLHm--Y`TzkAH|Wmb;JH})Xr z*X0jm9la?f7}`Xa|D34y10T;MhSp2og(-=FRCzm^hWzVCe+RS7|IRlWwx1w5W8S(B zI2S!VEcOD2^B`~@J=aRC`S(0u2wJJRqgGKmaJKVrBD>HzfmQ?O@{pF?(Bp`=z=6oP#F+7;lMsXWRKY&dGTG zHSR%2;M~`20zW7{mWp!_qgGn+m%)p_>j#d_OGEyyWf+a_jc4Tln%e>0qb=B#@cvTB zRbys1ZV&W$$8O^cM|;y{#OLC+TR795OQ{xEHSU+e1=}qpIbyrHNh()~I;9fz;Ifi9 zZa2JuZsQJky3~OyN8Fe{3Ew}tGxq`aU@v3vUH!{sJBPuK=5q{`cI%#)7k*qBNV0*rBiwfs)}4(Rt^V#mx2|3w>Gl6l-M#BpiTDc~(Kz7T z*TYt{ZHW2>?^C&w*KmHwpK(VF`*v6Msv&sh!w_Rr*KjU76X5B9n7QC9H*hd|`(F5* zPq5(cZN%QhO7udFeE5;;(J#gM{9Zqm?+$KQG44CbV?Y0TassWtj{e?qiT6X?n0^)K z%|*-mtc)dB)aG0FAK*I z&r>gS;&pAj>GNIqP`B&M|I{oc6JT}cRYzW2w3HenK74xAmQP0i(@TMQ&Bgk>V+DMB z{gHE)-r#1!i)ol6>V=V8xtj+NTM(m)2F&0_A-2b(PTVm1wJhD!o1Ch!6WwUA>}!-S z86n5sHRJG!HYxB_#ja4dfBonS1OCSO@|i`_rIspc-xxE;&~kA=MLhLriJGF{IME-w zR~`na3x;PE9t}lrtrvO=Bg{Eb4?Fev490m};C2)w(5Knp44m!9j~oZRL11#$IGoqZ zMedP-_!gAOcgGAX3}^UJr}O;UPQbYW_s;Uy`~_=p^PZxI`Kh6>^HV&He}-QDWBFXv-4~E=1V)+h zL4}AF_N<B}*##~<~Xb^ak&VC^cG}O|9r31FZ=z}a zw{(6PdPf7A#!%6wbiNw>x1um;un1{eT>ccoCn_W<$VyV*T0Q{ zUb+?k3-x&4j2OxtT941QMedC_EI!%9HFCvyJ|0aolbdnpynSgu_6iS=*us~28B~5-xRsW*>N%SvUNN^_mP6S zevPIr2QB%B@JZ?F5AFM&)!f!a*rP`;bmNK{+*S1JJ|{#`!pokrO6YlX#=frfuOGdB z(%*UAnJw;;1~|{wMbEj_9WnAwJh|zk{?a9JGiHVJ5R(fQhRVXyFcZh!XQt3{SJ8jA zn}%~fZ5)5RvA_NC;3^F<@Y2l?L;T^c6A>i@vYM3JIa8#1t6~u~VtA&OO zqUq=|#E~4OaLPZ7e(9mc={8e110TIT?Xa`Crnew7@Fm?*s2$)ze+Ye~_hnJY*FW&{ z7lN|^zsYX4ANVdyP^a{criS4!`O^ssy5Wnn$KB%J9#&8_dPEc76!2ePqrcHFno_#Q z@~>u~FS-%lU3tg&`5+dpv#S!{Rzh>QJ4*{lN<4Lh*ZD z`ODampNo2}yuF6s4_?94TyTRgHWp$&B0k?kUZHO;Y(AzY(?-Dam4omQ`SY@Fm`fEz z38kOVN9u=N?({XnfSh>x)=No2op%VGE#k;bUrF5KeS#RGB#&y`Uo2OM{}oNT>(NV; zG6l!9aH{BwIA60$@Z1nYD~Dk>bGwspw5cDo%c5!XIt$?i=BIn6qUT`SQ7D_DphMuM zPhG4pWVTRH0JM3Ny!8Y#%)ZA5Mv;lEnV{IDpn>oRQ0#igAAhHyCg@ifk0{_<;112( z3ax~7F8rC<-qiG21Wn0*$kkv^_9^yZem}Y=J0=gL3q#<+^RFL$Zu#GRq)~PX>8>97 z8_kh34}By?BHuWOyU)|YN<4&lN?jgxTIY#uz+Q0sM?oKHiw=KdK6=QD(c8bRy%yef ziJ`5?RrcT4p}=!dWQ1orYXSV|!Phnag&f1719gX2AC3P>Nr*wc`%-8Y z_TX+SX}-w-?A3(R?`E;YQExh397a`Nl@vAGkXm*KrMw^|9o_Ijm|qe^L%h&$ISd{S z{E7DI!^7xB55XGosx9VIR`DZw-H}0L>mN?%|MjESRQzYBzAneB`|t8}Zz%(La!w2M z#|}Ob?XhF^v?Jp4{t=>$nTl@X?z^LI#x*{M9>`eqZML`Oy_SOah5pX4s${;XH+H($ zfrFuWjypw7H_oGeylp0ww@)OYo|0OgnI~8jsmUMb_CS*aVZpZqnmJZUwxL^uTNhMh zF-b|6(hduK-QuC-r=)wEN`<&Pu~dLFKh)@+@N5w{y0|NE{(dhU=#QS$O`L%j4Ja!l znmQvtj9J(kyBg3qIgK;#(uoRMMpB2{xMy4SrjFU#S@V&r8VV z+GW*x^et-$JxUUwY*r)TiOyxvXLpaTAeOTXf;GmLiS%3Iu{T|cW}2>ts70Rf7I#3 z;4I~jp!&apXd&{((H9M=ks-9fX2y`+hf={d#fLH`LEG)Lov>iSQgX#kQPqbK{<`i` z+70c4(;GL-0qr0S=HI#ymD~IzE5wH{t+X-xS=9b+zCUIt9*D`gSDFaf zztuQv=;_TLExfl(qzJ^@##bYSA=ls!GDAt-%Qgu&!O)8^>L zw{vu(>dWpG$!U>o5Jkiq$~@o08{q@? zX7A`)oq6O<-N5%c`b1NB<_`RT-2b1pi7_0Ls+;CNR}PVP$5ayx~Q;MM$!Qj#K@3C5Vw>&rE`?V4`Rg#_`&=)&I8W}NUwW?7upv6mXg<^9cpbm z)T*D72Z)Z~*ZIhBh8?GH{y$adW#Y40K9b)D{kl#ok-xP+%Ku3Qj}f)RymjD03{RxN z$k{$Fm@c$&N~DvMm1MszQSho()5!=WE$+KpI1hb;>@`a20Iu@x7|ao%X%e>Vfe?KU zx{l6xUHeUV@d;lGPSVM*Iu!6Fn!+Q{dyn}nD8`4;*xoTT?njv*l=xGl^^p`XI9}*_ z$BQbbhEZC-27+#x8@WKUtM|`VeCQWvG6GL%_?M|NUg1o$phy2hsmnPUxzMXNsN0|U zab^0@fc@c574r{qr)Rj)Blu!kU8>?{UU#Sbjsf(t#Vc;!1~~=8@26|e6I`RyUgWeL zerElfb9Q;~b6EmT|3#-l2l!ez!RxWkk3M=Na*u%Ezi@6F6eu}>SD->J+HU$A@dRq{ zGp4w2w)YojdY~6d*ePx`gDY!;{bCo)WY@^}A(-)9!rga&-*JB9et2Wy-nTf|UU)ns zkVea*t%~w@8)7df5=NIO1slA=)U^95d<{#sl)i{&+2|r?S zO?k(6E_5T)j|Pk#!T;dhXprPbIlt!e$wlteI_}S!|Nt4{!d}Z=OXueiS-;rK`?pW+Pa$w-C~XRlrufR6!lkc%bbeI?SszLj zURZlk+%5P4{WKP)&vqkE6@2VAsrdP;ox#uar$3ipaJg@t$ap`zmLkk~8?7^0P4}fE zy@L2|*IlSS=S%koZsnyuZZvt8FS#~8&QCl5t$q*8S(oJV!eTjHAL>h&pH1d-T%l`M z0R8iu2V{}xkt)~uPz(6c2ZQT-0&|^}@T1R+bs;~Szj5wUKS&Bf|M_`4)P3FGh<>;e z>-PI}S`QXyV%NBvEqL99qqzga6KE6eoh~Pb@C&hDoQJ+;t2T%DaKr@bci^1dY%N%> zN+kW!$T{sM3AvjS=_vBmH1OdY{DfcR2_;1j*$Mym1R7PMq)*r@DHsC{%mauIMRx>k zU>vpZR?-OT4?;`i9Yf!P1Mup*(8?IKEZ&>%^0&er(-0aXM$x6@bHYsU7$<|zZFDnH zaOmJk&k};k?N=wkaJehV@p(T~n!+1HJHPo#U)oLM`E}48O&aM#-71s$q1&9v_J%iY zA99MAZvS}JpAuULtK;Dt1}@#Gb~=JpXE}wB1fSsO9KIp^t)?u2 zt~&hadlzAjkO%G~{OFG)L+2kFD8ZIf3!_FklFpF7<8zysAgLPsjkl-)+2Z%&Q}m98 zBTsc|H9_2n^R^UyjG~Oj+&t{>^zuiaVNnNuaXIF&dyt2G+{o`npSj{S=2Nx5c)fXv z)Lu|hrsoL3COwhrEmu;^L0_SdNg`zfXZ4XZVIOo1j7ybt(EFfZuR%VUt0d2eGNEY` z%yDp6%7@+;mf&kAm1ADXRSSdAKQM`grnL2S!MSk=P2U+wCnoO`QY(Fc4Rm21It#}+ z=z>Cb-X*c2F!8AiHJ#>%-b*Uq?wk`1zYU(jvvvHXCr;Gh5c*0duka4Z_h~ z0Dklz{NT5O{?tVH(U;{dqU`m4v}9~Vq3Ycn>Vo~}|Go!5HFK5<^;MJwob#2HqWdq@ zW&N;sP-!Pd0%vQSXS-^-Y`;zd)%qYO*?W#NxROAo$XA!#n9b{A4tNy(H{%wEdClxZ zDjlYz*V=l*!<0mL)}u!x?<;KWoJgsA5jR#%7ZhEfM|w<2Z})}?DFx8<*sP?-50Zu1 z_2cQtY$ZK2+aWxz7fVx6Yt+8a5pH~_>wAH-bbYt*#1sC;(A{XfG+mhD3H@y7D=LtOgcwPC#PY8U!#2`}l0Al}&CnR*Qd2k~+epY#IS*x+(K zC=~gM!LGEp1~bC<@A&6C-RM??g1)A<6w1s!$g|dqHh8xa7DJ9`M zw{c`u5I@k#n^NC-(l7YYZ^N#=KK?DikKU}8JH3wf`wM5+EA~vmUJl>=k{2}y zL%jAF!{;c#<$zz#*7lP)0UD>zMLBuGk6sU+1Mkou`S0^=*a&O#hAPql&T{F9xD~y9 zQ{Y@RYl7H+p^6l!wIfMqU?&_?)?m|5Y1D zITlJf-Qon_u}3ToECqk>TPfe8ex1%MW`bT9`S$49grT=K&ai|xUJ^`8I!Drn$p?6g zT4=oV3ZpWgSiS<-d`DmDN7KRlj+yRc;NnkfRy^b`|8Sw|^YE~b-o_1tp855ch#T(5 zIlnHhG#|Zw)9_ku!CL5NfAPXzl@YJsA93TQC+XJj$3J@tt=Ii>qK_T<@{3+{+#SA~ zg#}zMa2n4nbEhTy56K$9E9zXNJ4L~deySe)NlyGnJNN(U?%^8-NaulbChnSHNxQ@v zoaZTh(39V8Cw`r$!d@flFTdvE@85{w?wD~exS}~*3Qd@F)Y>t7HRDp@J9ZWL=cj9? z%MxjK2PJhfO4W1;OeF0r^l(zrHQ9gEbRIF}OP3v*ng-Cy2)YXog&xCiXqv}Dj~^P9 za)V;cawFtrwqay8JWF#j1~@~1d7Pz6b8(S7&DiZvJ8#d{^aReq>Enj(TCGCZDZYN3UJIB=Bl~Z#RL5@PrBaTM>7C%O9E(Ju`9iRAH6kdRku;@f1T%%QJtmj=zrP(=Ti?; zL{sc(dh|vQK{Z}f%|_le8a=T&qeR_r=qVw8E;H~K$7r$3vlep=tG%L!8Z)Uf^wIvj z6E_b?q~54gs-Ena+7QK$q zk9I@z2l)n`5eP5Rc%0{m{os=IJ1@;cFTakHwz<^>>E@saO16ex<;hdhvyVX}yo#VC zlT2wj^0JrEs%zL?AvI0*#Cs2-l6FRtX}TMwMEO&f8Irh54*%zdnAb+G5_^1gCY_;m zzNbe-LmgM_nka~W`d&Ql?M5dHy{J09y;Rx^J_zGIDYev8T2~I=rClC$I;Wk~<}iFc zez{>+{e&2Ai+wjwS1PFfqLHARYZ2%|t>8!Bt1N=XO#WN{xol5!iJ@P2ANg}x<}z_A z>h4H0)Pu)t#EJIk^Na%T{o_*6=`ChhOE8O!JR%+kS3G4E=G37rrF~&)x{bb>@A&Bw z-!+leqDOaAo+9};B+^?e^vaGGN}kWaM_Q<)yxrAO`g`nIAf7lJYsB_qcAy!rq_eLK zS@wrGy4hGs1_k}tWV2Wjw1>9T^uM`WO&h@ zR5xmNuY)vbgg5z?xX{f)OEGpr040VvlNtQz_kaf&i#q?ml$3g<9@}{b`mR&ZmrLo&ENc=d5&a@kSg~fw$Q#ig&f{jW zHU4eadCIc8%K6W52)!D&%+_SbE8zCP;ocad~2@&lWBF_ePP4_Ps$k#D-&<+G4w4nmQqrjvV>TeBsNW#tzkxH6^TesUKC$^r71?+}O*H z-gIlXoUYZ^NU;V!^aAI0;G9%(FKYT*x169ukp>IXaFQj$EAF2^|LKb^S5%0lm|N)s z=X@VQJoz48Kd8IM+#4=>T7y5sA+LV9Q8d4+qVe;=qp)c%4ce4I_HoDoDm|pK`D)56 zK;NlfzI5^z{BB->Z(Ld{Z5f$JuH8}7&F#T{UBDb1eNo9~EaOqLyW1$~_IGzy1C5#` zX6UQ$j%QxLdD3${uj^?nYasN#@ErO2Szss)4q}{hRgo0lLlcxSa?SofA6bsL-W-op* zC;I@J60npm?^d()Cw|mzw#Bcea%t^4#) zJGbmAJ_PUU06wSL?FWi_R+w8^Ay$WEi@mO(r-xZpY;6~5&#DBP9F6>Wa)MNgowZ@; zi}t#GQObXfxfN>g+Mu@VbDu4tVCOp~y)b)htM*qMZgx z^r1GfW5D^%9psAeqdzn>mL{S{=WcV7eP4swehci|7F}agz&ma?5ng+-HS8d~LJqBk z4(8L}tmI`lsi3p=u5k-({rm9tb%sx>t&z4+2qSmwYn@K+s}21bN^Sfi>3$Ta)q#Jn z;e`mwshp_2P#j8Cd!X%aFiYFbDwM{Qhtk?T)3vtdA@u2Y5KXs`Y2|L{l{SHQj(bC` z`iwtq#!S&RJc%t?>qi@!xYGi+Wzx8&fz$?`yw!UZg>M^%(cGHFf8o5(W}O&-o$hhK zx$B*unwikla6*T6)qhrUNWOPuG{2gQ{o(43it8gTLesX&P{iT?A1&g&#mfUiv! zW{U@&O6FDQ`QO5fdt*=bt5YJ?X`-2>PG>bo)TD!c{jVF#Sl~tUNsN`$N|nw&D{=oe zMeoQwmu*0NzKk01j=^d6+A@|_pvD(>UuPLn;9CBG=V_DsY_wezrGr})KctF%v<@SC zw;We|aB#=z1{8)UN zoYuhaWS*;v)f#%zmBoJKKQx6^zz??Bav$<`S;rn_dC_7=c#1(c-eIwVw!weGuXr3Y zZ@rYVAG%YYyA@KqE7)C?t27jsgQqlc1o)pHj*8U`en8W~#|X8QRKW?fH4yxbW;>*@;2@pf z3U1;1T4~%RH93N((JjiH?L@5h{SI!G=)&~CE6Bsy_V}@aeFfiRLpvq;WMs1M(JJa$ z3m#4fk?A7e_{dP>2VG?op%d61Ipp|mkJ$Ywc;;7Q$RhhGOOi)YU!39Elu9Z?egkEp@B*zA>3P1JNP9lHj8 z4Ou(Hhr>na`A?Ryb@dX-`VDfk$NsD#YR0|jzkSb1V@tr7-i+59&L3dQBcbo{0)4{W zB}_p6TzCk(5;O0yR?xjX?topk1~n|M7Q1EOtB9K)vj&(aN1-0HczKbny${`H==GH$8++drD!Jyi5_C~#XUiHGtq3z&plqPv~6%_)Igyf7Pmb5Pof9r^kx;1oU7W$MG2 zeQTDH&M+Hh`dLl3h}F*4Q7kMS`}N2rY8qs)I*qjlU%&&gf{tsriqh_aKlbwyv-lQA zJrRFQhCgCCwaS0^PB+Y-vVq_e)jD9Oti^2>yE%-akXMX!JIXGn22kmX2r6o_hOsDb zs`wE`Z(=;y^R8ZGH$Ifw_M6G_mGHqt+&DSfo#ii)Qy#Riw;4t=gY|N1&^3_K4VSab zS~-10ufDorGTR;JNfW^xpPIIU74`Ij*M>J)H&d`a$eD*GdePIAp6ot!Q5@EJP|nv( zDKg2MZmvX~Gd)Js8x=q$+nnfP)$J3vhQb4?&)+x~tL!x{Ix0Gixs~^wMuqpmld3AZ=6l8ys*?o4d@D->#s|<@`vtaJo*Xp zQ>B_9%)u+nQHzbzh#tFCbPYWv^Vw6R3)8?4cS0U8=$O<5b@V0Vc%=rdSu5!CU)uvs zm?sn1p?lcrK93%CK^&`4VNbIXTvf{*Or8f067q`K{t`E5k9>?gEReZNB=aC{t#E%KqS*g4(!9`#EX1v%Fb zr>yffEMuW3eft9c^@thF^Rb+)-@@nqh6_7^@E&B zCkD_FPbKR)$CFZQ{pg9>pAEj@Nhce^e}x;(A|1TwjEjOc8P{jEGZZ8w$?5l$D9Het zjVUQ^G(_H4RE-EA`?UYmCjF`dsr|9PasFX3OO}Ira2s%b@wUq9IWVu&NH1!BTytrL ziuU3>FPgYl)PIdVAe`q%yWs%@F76bZ=XFhYN^w(Br>K#8RDGA)RHzYy!5beuhz)sy zJOr_N#*@X&85(OJkV|w}oyh#{q5XyX?n1&gmiP{wN$`uLY58nGpE!!bopnZrZWCcxR|!!UMs zGR{1DAlAF)GbeCyyQ6*_XS0mW1IO&jTFh__*RUPk;^^!|#Q%)-Z0b>9zcYsFm91fG z;O8^iKAKkhhA=-5Xr;pI#A6#$&0HT!hAw|`b_bS-`QW!L;8z@I#4>NlX%TZh z)eoZN|G~N6+fLjR@V?dqXPvSHnfhlu_H~e(wQH!c2hLl8v(G+T(dvzg?gHn7FRR7w zsJjz^^P(4alHpA3x&mj9eVe7YTWXpIoNZ^{k=7w@46DPrra2231MOVIkgmu2uwz3o zhb=@cZ#s@WDvhT@$w7nprP`Ubw!K&SKVKnjA*^t*%JXC35mdFM9E-dy=&!=BMr<*!BA; zz33t**CD}VxT_&EMeea1J?fn=S~9y-IhlXL{JKgHy11Tn{+%!V7}JVv#N1@Wac?R& zc_XRekH-yFkbB||Nyk+|{p4~=9@kA85#degN;k?Fa6>bk3!tDBXUc;geJ?$D*8C67 z0|wc1SHWXk3!Gm^ zqc5e-R#Q1}jy&rsjX)n`6>v_d+$O!et)@q3uoIMCE;-87lz$F!fwRH$0;!XZf+oaJ6P(B%K-}C&R;mBwv0_8oF9e5J^apPv=Y=R)r* z5$CVQNP2QtO{akK{ZI)Cll1q4ermCjDYQSE`(N3@Ri~}c~Cp}FCNi36}hmz3y60ePMp2jq2WYn>?ue)OS(F=sgPcYF?7v4tDm3Vc!E95A## zw-9=a1Aue$kLEIS#EmV$c}Ze@P1Sq!eays1$zG9EQh)q6t(DdFRf^EJb7f z{cE;(DAk*0uXH2#!%Z|RM+eY|RCwOQkKU+m_xyiw?(*X}H=rf<=z(*=Dnsrzd}{gt z=dhtF*-7BM6FA3Q?r4?$5w#3(ZYT86WFR-|_5JH zuZNuz{qxatPK%+2ol3>p8Q{m^Jg>f3ASN9TrV{8IMT^B#2cXAm8VpDz|Sk<-0hft2InFB)Oi z_x+bY(Ql;~jPsn<+>aWaiW430Bd@!JSwMG%s3`EF2;6_4hnR@9*ek45$*HIP4$Wrl zlDn-zeD2q+@HY53HNaUHe)Q*|ZNA}ua8Cbnog0aMT|97pcySPy3Y^V=bFSF|**fHP zIlwu6>>ye0XY~Am^X^SYtRnMKYXIk&FCwfSEJ1$*I2ZKYWYq#Wh7WL#$^C5A4ZYBJ zr=eY`w2~zo!Rrb*2O245E%3S6cnEREBwKdPFP_qoGk5%QURJ1$CGAM)1qD2pu^h}N zlcAZT_f7V54tkl0&x_*T$|k`B_87E83U8c~UA*i|8-cUqo1HQz0iWrGVRY|zl1z84 zoSHTXrPCKz$xfg3pw@%({kdP3_SJ*tZ$*w<#bl2VYuEh24DrYX z*$xBXtmj92M_!Yyd*Vrsx4h};lhd*a%&IOyqwR-5vTPr84B8^5&%fAJ_8<$|#cAMt z{1B|hqVC><{P_X==oO2D$o+qCZoKk6x3D?-8^HONo-G#-oa_8y&$PZK%bcmg?mIk0 z!jfc9zpBUqID6#B$s&(ne-Jp=dzmY%?+OjT<>;xk(cvy)S0WEMYg6E#eqK#wz`2U| z<(BBHNnMPbt?PPjE9M232T@<2ILzfZ#Z%xiO9k<=3ThJ)2ZuH;EDb%h>rn9gx-(-U7Z0nR0PtGTV#z$g6b%aIY6|KJ7edi=iKl zchGQaUU<@n2Z+zl4sb88dC^sO1!ZJNQ=6C^VKHYPVnnyZFD2=}D1L=Y|vC$a;FHX(4dllQxK31OD>|;M`+VF!!(om;>i}2X}DmFypR4j@RaJ zDR=sgioP8{TI*9DSr1p{g24DgD;u}oCCV;m2JRI zcP(%ZiMlNt>V+OYaDLOFGiUP@wIOP`$}4lZq+;l7181sO&5dk~X91ksZau`UzYJeg z%mq&9UFXh>i>JIulL*nElCD1=8!JGOpfaIXyvq{;qh$rRbuM+SQK)gZEr(@L%#?L;HZ9 zb5?KAuM2_SZqt139ym33bL4bVcNDk3$eZ@ zrM;}TH+o0FIk-WL>cvF+uIPwwM=G;A@5r zvf%Wr;=$oTK2tJ_3yFj#(m?PQhWm5(Ly+G^!Pj1j;Vxs2_uV#{BG(6V9QGH=$|Gs) zz$si$#OJDS;n45v!O0C2^kH-uS$j6-B2fdrfd`&$8(r?RvhEBAQ_r6U+yh?^dUqv= z%;)ywUL5qGDcHyE8eqd66y)?Ad7XUJd@d3_(vDsHh!!ch-oQEJEi|Y4$vJ!Ql8mAi z(4`r{ZT_jChypq38I{Sn%igpi$BkaR6s?X=51`}?&j0w)TW$-Yt^b2_a-0S4-Bd+& zzE@u}H*vzhI2%6g#BBio`5th7<(44(2Hw{N;9NIaG&_|*i-2>IYObadJA)&V5R*^b z&sWU)g71$~cKz@yz=+};+NftY{G zj{MM^tMrCWf*X|#D=3^j8=lJ>ovA0LL3a~;bJZFqGl~kV-XaI0_&$E?UV_skZoHH(YN($q6l80i4t8s#)za*As^@Rp?d8#yN z4&rwp^17xQq`fyIpo@#W8(J-`_Qni~Mbe-X&QfD=X16{Ir&kgEqyyl7+l>e#Z@m_h ze>d>39)wVJg1$6N;X&n(gX#OnUedN%9+Y|&UI;BmNuJ3bbP;+P2MZQUaj3_KzwoD! z!LgFnOF6Y`0WRY56logn!4Xg4IWc;@6yIDy#VZsv_d}#4Li61Cf}G~uYb~{U=}jfa z;FI3{on|NI-ODqa|M85 z4H`%LoA9PP(4#|4o*(m(^D+eQ3+J%?qdQ#r8WmNl5w~NGaJ81;C8GaU1)c)lPxJ7@k|DTu&yPk^vf&CT4W5{un7vM0t(IK% z0;mc(_L$ssDfb{a(kmkA{ev8-2{c#Jzo4$kW|DTF4_(CUw)VmeDYuaixnswtdgXiR zDEda#Q&B&jY{+WB)m{9xZdXE=xwrJ8a|`_`=jb~rbej(u!0)R4#bn9!JbF&3MSEo= zi1n~z(dU@QKYsLG5T7zv{mqlP`|>=0aT0bMI$@p?u$ZqdRMR-*SF6$n@sT6o4Lu2c zq(hx}f8=t-ixDd(wB{EMh7OfKa^{Kk`8k-gypKUIwA&3XaS?L1)#&ZhT+S{Z+9`XH zOT2F+y178_t^zUN4<5d#!S^)BzSZmPl1(M%iQ|;yIOLb)t(!=3;3-9q=)-oS*SZON zE5qxLXZuoBGMRyIQKO>`QTZe0s>QVst z42Yt8vJ#19`OyR9CyNGEN!L-=R9uLpx&6LLJwEx+l!!>`_q7?zQ$T0jZ!j}!ld6q+$V449hAr8z9Mr;8OFn0-Ry*Tt#7ld$Gd%=O(jM%bv zusD7ub}kS%2BnRaK6ip9)hB%a6U9<7&hz%Z;6G<~Vkc_VWRLy6p(CcT6X;Ft!`|S< zFEQ*p;#IUY_;@W=vsI6w5&a7Dg{)P~3%n2QBFrBzgtC?6ab}@|QSX*Dt2`J?dF{Yk z+Hb(-KK2LSHHzxnHf2%oeQAq96q(QKz;duJJaQ6zjZ@9os-HeI%`%EA++@t=rVq6i zBdOz->Fnr79}){AXqViZsS%?Z3E5RG%bX8l++|2fO;X$o^Qls7v37$7cFggPv{^` zosK;eJ4?PmhB++GwioNmua{I*tN>5udJF!GGyK*OZ=bzRQA$oK6WWyK$msgcwe@6 zxi96ug~zw4nn^AFNN*504Urq!+CMnI=+(CTwwE1-2FOxAoHn%C!0yKf)6dqS|6qG4 zFNU%{|G(Xd(^^zmhroQb9f*0F^(_dO~K7rBtswX+f4q6Hi7ge zqBhZ+#9L7UIpeOH>dx_pPJ_qmjQVkWCw{MsiUux4&3HJC8=C=+lM>(a)H1PXSOP8B zj``r0cq!{0bk#~Ra~#%yZA$^C7r1S_HibRE35}F)N}3V6f=!){eszC%iFMk~9zrY6 z$OwBwlh3iq8S&H>=lMB%$hM>JbaOxAmF-*R)l5k%@E(#nzGXxDL{ou2&cNbIHeLt2 zuE<+jzdg)09>WZlMbm;yt60=Ve=2o}reDrpEClnDk*lIfeb$>@-04e~F!x<>HJ
      -OztCei-1_Yic|434nK58#MGmtf$SbQX62n#uoa=mhT%C(IB_w{iKnANL1fwi~lXbnFSOOZ4;mEnX{C z-%6m*xF7rbwqZ9z(CfR0{ls_9Y)lbmiw&@EsJn^jWBw8XzQ<{Sv3Yn#cfq$QTv5fk z9f~K1`|#z7{=q5@;%Efoe|Ata?fH#L=ubmuX1t#EcPnrlCZX5eM_;R79ZBWgkn`Wv z)$US+(S`@WE%OO$a3qM{LgT2t)e)v!?N1vWp`q=N$|}H@5s$=>+&-E8wDS9>55H#J zHnyzF4|;)^2QAHKWq16^a3i5cDw@8 z8PJKfMNhR9b)wFaAf|IbO%0#pIof5j4r8Hj0FF)d)(fmYVpPQk@EkV3W9jfz-Fpq^ z`AHM)<>7HO20Vo7xDMJrmvHv+{e35xXe-w&qbyf^*31WJlhZK2oq?LjaiF%i3Oy&h z=S`)?T7zeyG!4JYpUkFOqa8tX3~@5>Nd?oX*6#O~?o-B*p`AXb_ z*<%qm1`Bv1pybNxPlSQBU{iRk+!wQr++KO>H^ z5Q}bmbklbEsHAl<=(|20s7)wA4T{*sui&+g*dH>(>*h1YXTuu$5LIKQEvzBa}ph}s;$-JSW6^&b#G4v&z>emTbcV&G#1-r9Tg zpkAKX#oMc4P1J#uh}WH)$Ff$~j~UnydkXmTb#x59!S7r5`v3U+8#dnH&kar_&z6{t z7Nqd5&|l5z2)*l6HJ@vWI@$#1**by$nuS<_=Wg66j?X|Ghyvyp8V2xTnV6L$hTm^A zfzKTdorh7-ORPA@rA<;%GB7{7dV?5s9(CnH*~jem`^9DsNgIZnF^9Cbw)w7jOy)E+a2hF>ybNRxTmecd8yL>_dH zcTLxRJs(DyH;^k19j*=0f$!LF)TA4lX_sR!xhHtVdPlCXoVEe<*;Pq@@+20#7<;dK zmDHs9ai*6J4#-I*jX&Yfj^D)&uHS!fZi<~<6P^FO{y&^+C*R~fv3ItxIqod`H2%d# zcr~`i+{$eQpN)Q|*cI>lK@u;n0q40F;($RSKd@N>9qNxW;2XtzEyt`DdEl+AnS6Wf z1!Mw$%TZNads7v;Qdt>+J_)pQoIdPBF> z{O+I7(8k$rIe9go5QMmaJH@v7O8)l?=x^hkH)BUAJ#hy6o_o_b$ET|81W?<6mV2rLoX@S#**)BYUo#Mg=jm!W^b&2;QTy|qw4*k~QT%euCKmP6j-D1vUQsynyiD5! zoL}n*%zD^F?ZYwf#7IQ`6ShFR>l^$EvQdi#xoNw}qUh&k)Va5uwd=ZI7o)zC_C!t6 zo(c)2cHq5l@$97S?iobtCCJf}s+ik~04l>ClfKze)+Hc-S`}g6e?$(eN)06QDkU`Y z?O5+(@XPiq|M8>GfbQ2m?1}t$+$fxMlOJ6_ktQ_(&ezuS_0X?)(h|DC%aZvekD$G; zkJxCjhEJZIKrIasheKEMY3R9Sb;5noK7lub_sUG1`L=W1_~%9OfBWQZ`?ZKACCs4;3s2@AVv%~1=9g;%_W6p7Q^Ev)L z68Lk^*tz}*G){$Ht3^|7M{rAqF^kuvk(7YxkUTJHHw;ELyzV50kolOXCnSxF1}m$Opro@_=;*w^v^EAt8TE{esXMk@xPXWC_ zlXk`3!4v!KgP!>YcyOy!^jwa)Pr6yL26mS(AtqmYYE^6>gV_aezO-dZF`J3}cL#D# z`HbRR>{aYIhkPk|VzKkt5K2Q#-}|Ls@x$amx{RKH&FosKGxWPoU?0J3!2v1ZtAZHz zeCNh&lG@JkrIFYXd$v7YYQM}6^H1y}{O&5X+7LjU|BV&qdy$VLw*MFBD%Eusin-pr z#^Ajy$z;E6u}9ey_sFMYR*re=87-Wdq802%C+O4x|8*hBtR^Owz9F8=jAPj#e9JFe zfIo2Cm7NQSp)L3pk_}t4QSQ*cZG{>$ahduhv_ty%s+S1sh0P6JpPmVEebp-Xj|98HTufD<#gBK@ni2U|K8k@_3 zgV6|g4fNRPJY%T{&yEixnZbQw zalYm2_0n|kZ~}0j)@h%Syb#aZjY6JN_DV8A|2E7P^9bFh#pf%cX&=u2Om&-L5qkd3 z=OPZDFf2C49j?vM?-JJJ?#&+x!42igm3D<=eaEP0$bZOfkGM}{~W!XwV8=tC7x&7Dp>{Q z+R1oUnMSeW?c-<%o+ow=WA5R|-|#$M--}sepXCXj2USdF?u%pS1D>g`7HeZ2L+9~a z|7Y2)26r9LM;#`JLpbac;k_)icqP8YeR>G^cN4}*9wG4DL@Zi%Jw^JK6-U<)^RL(( zmb{VMjOYj4N^VFKF^{PC>YXn8C@s7nO}>`kxPEFOrejB=e9DA z9ms{xDb9Svpn+_LK0HD2tiM8^dFRB?b3C{0w~yNiY!BmG=;xfFKG+z0;=uN0mw{sC z##owybH1aOAV#n_%E0}5IjNJhau@pBh*2TK9VPRmII6<0A5D*wo*?&bik~m4T`yhR z7(>nRd%C~bFC{qP9>m|dPt+-?+C)VX>R+aFT{6aAQKK)B*mt-qv73>ki5z;P(H-fQ zemHSoQ4e=KE%hx6Mx6wm?cy9M|BXK#Ylb_qrIXa4jW6}r$31R8MDnVT)6Fi3rAJMr z?(l&<(-UV{XOQ&ep5h;UlDSU$(#0RXbOJahtBBZ3&8Wlvz>cq_6zf=p1>{YwhlWAkBL$|C+am}z1Bbn2LIlc{XcNq zz!~cX3~S9Ua7n9hw(;EUY!Eji8yrR8v+=|8qFacorTDjW_;OQNwH>=Kh~Yhqyu=FR z(h04>D>zsprXR(f+a7+e-J3}pR>e^n^2z8d6Y17<NOGi8}@=KQHqE}IcZ)8$XqO<~i=oR>H&rI}_<~jvq z-j4ZiFAK>a+Mk94tEcZYrK{I4k2Qx5q4Ryw_%i0+R)Eu6@2}x})PwUuzVRN| zMhEJ1H**n_fvv{f#umL>#nO2l)SK@)fjb;a+wgtO{dGqOoeo_ZoSB^iM~FS^bDLhM zyKhH{2AkktZ-RSpNxpdQKKPS3Cl0Gcaq0o&Ft|5g@2U`;-JE`XEYM^1+Z=9)`aui2CpmNX??9!meCblQ+(sYZmyEmZUtuy*lO-uEPGNAL!EJM zuf8{vO~#%}E1W%zq|UMm4FU;hT zOZ4%SCA^F!lhKIV4H9HYMc5%7g}XImwd}KJG?d_RW^}j9w6Jezf#-8hhh&pJB1gc_ ztQmMr7StFT=VK7hTkVyNg9f9S4fL!sR>}-F2a=~fYS^yxWg~m|Q5T#;{|FP=Ttfxb z;{F=t+d~$0S5CTX(QC@>E3=rYpt(o!?s9s`)@u7gyB)m|OC8yR?tawz6uzS+%Pm?f zfU}4>6#VE*#zoN4qQB4clHU{9BCQ0v0-SBEb2!&!m|p|i?>R4Iy(*wn2W*{VVl3`i z$B`+pUGLXj-5R~43&6I_JwaVI5S%e!d#pB5U3)BsvXJlDc@oc4z~PA6#42lJ zX)nIn)yiVl?odf*NAU;1uj(T<>(`gHS7v80gg%#V@&yOtMBcEJ!n(N~qKvp&2xxtTK2Ycuv z9{!DUT3|0$gI&K)IK%nb1G$U-;C2G%56R_43m-xg2{B=Bo|aICnj#d~MwE^brr}J6 z0$ZQkGllD;FgF3V1&ytQI{3YgKzyhjzgyk1GKQAp3@7C_=Bg$`m%bbBwd7}9Ds&G% z;O=(#zKAVc9Y;Pmd&P?mv5`%%s|DN+^r&S$u0u<3G3LTC9idZ-*}4bb-I<|$-Fd_f z&-$2Y%Nqqn(|SCc&>TKOUquOC$P=`k_}9QJ8_(N2PUi!$*SQGKn(fW_PA!9}4}N~; zElvI*_SvTzvzc`;XsXFWePm1TBTw zTNSLRvoFm-{gSCu$ZX(o|Jy)Gb+crQ1z`83rIPCX=;ay_l#5>afAftE;~KFJ?XZgt zoSW)TkvT{5R>vOxnazH^jzn;Tu_3#D{)% zz*7tQ+nwX-)ROu>+hD%vNgQns#Jkp>!^i7kR<4B4#gHi88CvTQU7h|kbhP}woOJ5^KO1b5$ZoX^C!dVDo>!aDR+(nIRRpYl_X?HJ&k+>xJ*{JG9X zN$VzS@cn@^Z-x097tKD(5jUW9R_{k2c{rTD8U2m(>1z__)FpxT17}ZNU-k9`Xxrip z+l);RT7chDAA4`iJ}rDuK&K12?skJG!jI>%)CJgDe|ai&c7^8};)B`B)4~?ihQD#Y zH#j{+@Ye<(rZYT_qujX%s2``|KHBhf8j~Y$$;BD=J#>j>pU3Yx2l-N5PyQQv-32&f zcCk+U$l5rPFGr84?{dB!=7T%3QR5%q$lIYNTAB;4$maw62>WO{h35-9j_`r#*(B#6 z|8d#Hk6a!>iMWF{=C0sXhl42y@8xs4BY!L#+?6Ec%)R>X0pRa{-h=l$sw=^*X@+Jp&i*ANoe{1@E*zH+$M_iZIbI zmX;XdY)7SX_t(MeZ76*4dPK2B$mJGKK#$_i*MB@ucevsnNgc!Yx54gPJmT%8SpJ$; zJn3w}yV$dZcfxylwHLYf=3>6)Y7Di;*;}ny&X4-0qQFD-wa;mO_i=m&+o31fcQEjCY2dpOY&8+?C#Wuv2w}bh7^zB`$fUOPVHE^C!ArAB`p2SDi z$%&h*B;6JZ_;cOhRgD_{tG+v*6Re=o8A{5Vv6Odh?@P1Nm2@s}6o0>?9~}eFq)Wqt ztPc5e=wj$Q!H>Qnb`E|`{u^i0JuhXJ{Ss&rVzSd@l~9`v-9N;NJDRVAIy+N#INWI*fWD zP~feGp~rF-@2<^t-W7A$1DC+N4!g+@S*)VU66Dp;+SQ4Tq_;SqP1oh{ky;_7h2Lj@ zhX=3u!JkaF;Afmh^FKm-Df&8a7RT|inF_j(+3uAtv-sww3JRUCBnRtde5j6svY}BZ z`xU|e=m`$#9wj|q8^ceND=6pybR*A2@mHGo(xCz+wY8kW-~Z`L$~8(d*}k7CtOMvZ z_$T##^g~~QFYNR;&i&%<6>b@n08caI?cMhX0qf)GH*miBL|ZJ-hu1k`#l3ze;(!dq zY8~WYQ$~t?bx{}N3_l1p6HC&;8N(S4d)iJs)(1Ll$k`NI!-WoGP$%}oz4k-mDoep# zw8V^0cMJ1D{E0wrpZTRL|GQN@S>d~mz8B0-MnAUMZp@r!@8GFF?&1s3QK>8Ew|54w z?-BBC)4TlazVJ%GvvJfFJ|#p+9_2WbO?L7-Z&Py z4dz+@jT?b$f2jwUCD2RYtmt$@_>~WA5tCi0i`W|Hs@@~-ct0k_<;2l%#EPH$ZN=T~ zphJaRB4_d#aUg2L+a1y8pVUKak25^o5P3_Fc;O0mh}sVVw%%8{m>b}ojzf>`&OtUm z7M>t(h(Cq>`DvJo`6ACh9v07+V!rUY7=8K9NBCib;brp_nCn;YUr`Tg)**M=ag)E| z0_}*`s3S^`@I{FC{$+?WhROUU=*d_d#640sht~v8<}l8D(V+=^<|;qR&_x_LK93)| z4(AZq3ZZiT5@y_+^YOi}h~`f&1()Wck~ExB_~`mraUZche-&@uQbEHWE6H9ni{E0Q zAPfAuan}TXLIE^N@$;RRjO4XreaRRztYdHd*|8=8v>_7jE5_7fhjS2Vqd)s!oTJ@+ zg&XDxG*Sb-lm*{}y3O%44l%i?-vDu67jU#%;I46*C~D@$(Ng3RqejgV%h0P_(GET5 zl~cs;d9gGY_nqnC0b+?oEY0nKnwn1$YUW}-i(jVeXpbc23;mQ|7HAx3%>LX zbEQ#Fqxk!cd}#)9l!%GRe2F)3d!r;T`6_;q9{O^h@ayYycpK!;RhaLN&w?L)0|gy@ zrlh5IA^fLV3R()Bm#^063x@hq9^Th}t5&SZ1AlrSsQkx|J|oGWT6_GB^G0#MP-OvL z0dW4B*ixLg4c?c)Iaag~%?)w35tBW>%@i+gK(83F!lvUA@p0EU?6Bhgnmt!s3*J#+ zSDZ=NaIqU^D-ONzGmA2XD@$UjKk~P_hx!x1>oZ!P)l6XGdt zKkm34S$rCJ1s`!%xAc;D?`zP?L!Y8a(-ZvJg)wwQ2m9Xl*6`hLV-|t9G32xduLrGy z>-gVR71n$YK8RePmojAZWPYD(0R5b$q?Mu0e3MrG*y)B=yh9K___HtFeW0XrbsXQQ z1@s!fVOF&}l~>GE(1r#ox~!AMPkAb*#*I{zKPa1Dv|mn@-_a{MoXG#$E~n{FmGr*L zM1F3KoL)-ElgD3TXCC2xOatb|BRG@e{`3X?|Hnn6E$X1>GyeaJ&*$5|5KbfC*bAHu z+jJGZ6R{_SyRYLx8*w4>D-k$%aB>s1p}DaFIGb$=5~tk-X9F>Lt%sjzhy3|H&hwj9 zj$%0S+wa}$y*0lJab@sr9D*}kVZo(BFXb(Aj59OWFz*MkWT8N8*=Ef96(EN}4zT56 zB2S+9bKjtcaAY_C88M0nr!>MMmk-TEpBXuSkMRnACSt|5=is+1M)Rqup)^ku=coA? z{#C1BT02!q9n)vncg5LgCQp1kn{44?w8fUn~)S0&_mD7*AN>Y9@s(=Ww6? z;^7BzbPqVIw5-J8Q*rMD=aOEN#FHhl*gZmT{M0z8OUF_a?!NS!1I0I}i}xaKY&daV z2o>Pl2%KBr)92K{x%))quCam45%1`_9C@{=2LEtl9Cb!MusL=vpS=_u24JW=FNJ@1 z6aI$4+3`Ulf2bdH&Rf*$gE{iWcqb#DVP12h58t;rxB<18k^Sn-Z)y=t3rAueYH7k7 z2M5w2oUt#zNAQ=R!F=o%xV$s1c z=ScQ;Ho;a-kC9g_-!+@nZ3Q=*a$8CHpt};HEJmO&4pJWYQ3GRM&g>wv6K#+ zT}x|)r{EyXM|@T_uMm!)jyMUNza$3>7f!@b4sdq5ktciGHlU7jP)H;T|k3 ztp>K?q>nRmApJP=n;uN>5W`RAlrk|SkT#-Tn4x!-X`2Mlm}98vN^Y}(-~7lGF=2g8 zC2RT6m(Ib<<0`wxs%sQ96mg@`=VBISprE{$IIBVHSq5}es?TB8XtkKVhko|s4NB6# zsK+!`gAe8lKHruMu1kdiTool9PTwvw#g38Lum53tCF+0A^}W$ss%~NrXmgza&ew(8 zLR5G>IRNKtDdj@n7vRJK=cxPVh06=#XgqNKa-vMA$EplCk9%1tbeoE~DsVpeX}!?> zRt)tt#tbnD9yjRM9S6>RzmJ#c_l8y&aL(I*hI6_E9d93;;rWhieIoe1dB}~O53*+C z@g3d6Ja^P5)*g9?3v%7w6^;0O?Bv>`SJQQ66>C(3yaO>jvtSo<+8Pf1RrE||tzcVL zLVE-M##U8HtbZW-81~Sd-@KAd!FjIUiX8Ys7MlZ{osctFIc72SBVYQ6xUnTJm6apM zTks3Ne`XZxsS6#B=g@~Nuw#S3a~^XV`pHxD*=J)p`gzDb?A2UivYa$g=l5(NvBN@eWW?Sc_8f)dcKMy zbKrd6Bv)`-1THRc*1MP?^t=T=25=se8Y}e2T=fNTZq{poFs~|xyn%DE&_q}XoG$`r zyWb}*7WRmxTet^s{DSaDX@5!98e_$HK4NaGwOo3ne6ot6&-$C&sTS4#ck1hyaI0^Eymhh45nQC`tT*D?3*HxKFh$V zAQ=;kF@w$mr`L&C%dg-7R3XK4S$C%^SKAnatcFUVb|=Atif3Yl@5h>N#mCm?XfFi{qBF* zJ_!8Zb3M+Mn>g_)`bcMi^VIZGVN?`6IDoS_KV8`VI*zP>bHiNNQZwFy@ zWi08SHnAxlCYa5J-dZ=@k5}3VE79lK44fU?9Z_#Y+$aOi_3u=-8}{^p^T$(7xx$n1 z^YzBh@5$zdVfK1pJ^F!nesRsr<4K7;t*ggib^?17vs$C~bz>B(*ahxW7o0Jn4>NO9 zkqrNqQ;!<6tsadW>3cuuOZ%PU78(UmCVCVv_g~=V zeDWiWE2xVzp}zM%2{>bXA(StPqZr_<@@OqMgHzNUI3I9-rglR;G8i}~ znIBSre+X=WbLm)jb*JO-nFY>bZa|Skr&t;QoZatsmAzCWh5+Y^)N8VxsKHOH!*i@T zXNnr|8sb2>VH9TtKL5{F@E5zE%U?oDCh+YfWV@g5+d_8f2O0 z5{vmI3i^sXr~WKe17`(dSLVNd^ks;L^}k+^asB^04{{Qh8)BXUoF{BJBMer>L%$7Y zY_f+Syai{Y{yaD9AUs`){24g+bH1P!k(&(!&ep?H)VlN0(*VvcOKsHG(0{H1&Q42P zt4B-leFM%XVqX>cwZ$CP7X852Z;N_kJ}CFX*;BPwFY!P>3iFGW4X3I1gCm*(thRBf z>Key*x`=wYec#P${|m9y5%Kww85WxA|KSiBV0dJXi$Q5smQGdUzpzGhU z&$V}ey8Tl*^#aZs16!!4n#ySvaQ4rVHR*s zd8H-XbU_~pICoi)udc%E$qYD;P;qM41<-H?&d%R!iWY-6`?Nl8C@_mb{yYmfx9M-B zF2Njj7I1E8wn|;F2fYqY^dbs=t3|}3A;8(*X1pL^m#qMG_xhSdfo4LZ2KmE4%Qb=- zaQ@K&y8RcEgnKzEI*0t(;G&aY0Guyi2Ddb2q|g*N-#m$#)ZyO31e|A~33|dc{e(|# z1F+M9-kQ6KVE)XHoDX3yV?-~(^olPzAg_4ww4>0k9CbHp!{lokf;o8m4S=)S=aTw( zKRL}n+z{qwseOO=&~w~_g2GyT$QLoh4|rDIFEYn@_MQMwhn-W3Qm*-vH{#oqfBonO z-TND7)5utHW{(8A1)LRS=-~tBK;V4%X|SMpA4l_n^X=if!d1*nvw`#b?2YPQ_pu)V zoOQaGsnt&4?E~kw`PYlyJOzIPIG=OBRCE$E)84@O<4aP+9lcos=aSty4i5Ox(Q@GzIfMVz19rc_kba~=Oh3IF# zI67G{Mz15`De4Y8OChUFK~8nxD8A__7~YiAZS;-;M>i01d&;Qcn$(*jk{OX^B$t^0M6CM(Q2DTe{epZI#7KC z8nE>^XJ71~-dFf zI4^+$)IsFZ1Ay~lwnJFI8$M9D6Sp+a5`vsnXJOwTW0u+!HRi({%$V+%tG6R=ECSBq9kACqF`hgS>%JH0 z37eOLI}OZdS2Px!z#o`@9p_~1ef6yY5v1CR{&VdKb+ZS-WWEPlnjMd-+q(r)$wzRU z9u%q@<2;iCJaLX3Q=2~Yql=qS`&b@Oi>G}lE_aCP-ZAN16fbakkvdK+*alz_R({NqI{@hv#uPHZqEv1s6J>=uD9 zI#}1asQ%t-A^RKW{`Li8T%QE02F}f<^c1^eJ{S+2)2yxtcRt6FH*ntbdX;d^6aHVo z*|f-6*!~1}A8>9QG(>3Uf?Z?aY&1Yy(1geO8=U9s56aX$;zj{*&Ur9T?G8TD`|+5E z`sEb%0>|c&2e3V9C;RLO?hSAr=>Jr<$RwUR;2t~|+=tV!il_AExcdqRbAh;LUC}S{ zy3m5N#<`2YeK)z+McMPpaLUU=eEys(TY@>@wH=sU+O3q;0%y+;=;fwm$xP8lnlKsf z=xwGf`GFtBY(#xwl`NZD0uQ^p&`FjD$hN5!bp8|k9M@RNPMnrg0dV$e@xx*(_UXGI zKWTL~%0dS_ZasJW!OagiFIfT4ozcGwube?_N35Q<)2pbc(w}ZFK%W1vAN^-w{@?R_ zvO*BIV{Y{vIA6NPiB?It_klB;+)!NfHI9OSvs=I!LGnRw4LJ8Xwn_N-46y<@*EWh5 zj=RIF7dR)*nkoE%7Wy~f+-ZMXVKVN)b->wivx9moa6So~2R_Y~X<}Bm2{;!TEaTh| zH`*a?IQO{8ox>c~0(o7Cc3YM-4E=v?^cgfev0BtP?|y^N@ZlThgL_N^_gzHqlUz+i zICaH4@@u$((@#R(jk7&)@EWefE08AQJb#)DZJNg@6-0@ET^`kd){u^iAZWl#s%^u&i?SB+Ii`1Ob`v|`Cm#a;mW`R$2?b^1 zJ1H4-lWSWhCuh`y+VQ#Ebe!ik=g{9+GnM;@o#pL&pbdWJwX6;9!PcwbM;SLn=5h}F zrAWjX*@42tRsQh*LjC@)AH9ft^1tW#dHH3rNliRmZGzcQ#8PqIV$7ObV5aXnM4V6w zPHb!RB^q@U%fXYG4{RTF(-KD@*IEy3txvrXF51D%9%tCtJN95?(tler*= zH&s$XQWbl<6MZDy<7SfumOV~IO4NO?A~M)n#OFHTJb14+b3PeNp34zWQs=Oh7J+md z?;?EkLbmg(KN<8#uA;S&#oYCy^(m+^H_l`mZ~9U)&huBxv1|)^^#SO0q+ROGG=Ipc z27PIR9Y45Mqo8+!*fQCEH+K+P5#x^_e{;9tmPN^F-%2F~1niLcTvC9ag?h8s&XMnd zb89Emt?P>aiO()`{>Hh$=$e=ZoQpNV4HFdNb>MtJ7o7Rqqs6(v*`Yl+T{Q#5}lLR*2Eb;u80-o-usx_q!6<42Ct??Hq-4C2+tqXSxvLpk&Va! z?qNp!D4VTG8_)ke z&#M9EjYhO&`AY7&xnldzPVN`Nx|v)4{!SvUW5t{~b-0 zHt@ko>c)?8$9I5p+iBruu^!<^lNo?>Wi(P4}Zd zxF6FaPq63E=nhzl9+B)AdxAbvKI+6#M>n&>;26w6f1}lm7}haOPP?usDODesqXxf| z3Y<4Q<}5PgbYcqnQCibD!g*FBe+v%mA$y6wXdUhm>0dv3Tdluw&JVpQu6c#sz2@Mb zSjURF_-5<5F3x64M2D(4_>3UNraAs|o`Vq+!WT>w52NRngLB*Cf=s0G(35BAo%S^n z3&DT$wg&!ht_TZ}Z%B^VQ;<@M^agcsSIY!P_B(s#rb_m=zz z+zXeH8$5hw%Lm>8&d9+Id;0UQkn^-HR+8t^a6WJwbl750Cw`y9&)}4_0zIXSMg#c< zhGCQkoYyyN&O3k`(-3#c<-YHj19}?sTH!9xddHF;_!5)jemVYub+q=SAD_?@{_v9N z9#v2>@`Q(bZZZD>;LqgZ&z*9ZUB)~m1o!3^Hx-MVA}6bbxCi~Zv!EO~MYmQ`iorUr z(Rsx7YtU+rTP~~bZ(QGpx!%8i^p)tn{P#SY&AcrR$G%lwOXSR@NusMecCI@iRy+EO zI``w~c`y9DlZTi!J&rU?k+05PBz8sI=!bLr*vdgX0h~jDt;V%sVl3t)8HDSkf;5Tsw`K8He_VFcpCLNSCa$PSzyC9z024J_Otrx%k zM?CeuggNQhmHd9h?eq`mmF2DDozTagf}X>vS805|mMV%u+z$NV#p||DkG^#t0Uj*wI6lxj-*4gb@_hK)#+0fNj^K;@OifsbY&stl0~igKwkyTLTnio zr_DQI-o4%w{rvv#*~5c!>NF8GOa37?7%{}CGu~_0CCq7qoR$_Nr{y1Usi+5KiuxYQ zJ(BJL<7iBO%vH<7 z#ly3(H-UR?+UEfA5x)H|R(N;eE@Cy}b0=V%GTTPndKoze&am#}2BI16#9v}v2G>+Ea2lrL`3Dd{kD~CRL<{RSI;S3*GkJ(&!0)G>I+I~N<+k0;} z9|GRa6LS^Ws>}Hh?Bss7SJ51uXZ(+`_(rDT*Qz;@P4$)0RCng@C%O`KqHX*IO5LUw!RNd`T@OI$2G)Sr{(SI9ep?*JxFV55I$3u7_N-bEX)IJ!`k_z;<7PxCHZ*Q^uU5JGukg8*gTd{OuSzg>!OXM>BB+YVcd3=YjNjZZpepOBSsO!R2V7#>ci8pc8! zr3bA^3Za3}Ci}7VCSMAV^e7h+>U@f$W#+ic+N6j^sJm~CMIDisEcQZwBWD`s zeaW$+9r9RW#W8}`Np4@$B|~f ziZV8|q-o&&nkTAgt6gWhk{nG7eO1&kz8^);SJ8QY6*Vp#MvS2khaFDdc_ehFA}K9I zMPrtmQcYbLJ+@U*^6$gxW;7?VEw+6FA!LOE6o_!>x%sRo+RzRyN z9GXj4UARd*ylG-;7`<~@J<=RLr8UW6)XHIb(ZOl{)DymgxBm5`Z@uG>7RUefpQRgB zVogi@Sr&fxe-a$uq9_Hik zmWvsl;4yk2kGkR~-v0(2k|5OAj{4#vL+GcW2FcUACtHAfQ$X(`<5L>jcodv5(GC8EBsGw;HP!=r)vLj>NIvR?|U5hoDZS= z*@5g4{C$r62qJbQ$zl|IK)j~^(c2jdooAD)f1Z6@m(k*wKbkPrsh-qa_mAJ}RA^Os z!6&T#j$1QNPX4$4Jm0p!-0A>4iT?RNaBLqzhvMJodaNrKREg=}71XpxzM)<#mLqqK z9*8=k<0{b#JVPgZSD9MbV$yPWhs{7PeJ@L#0=}rF3+l3=Y2teoe6Nr@rECcm_v*)z zWh`RUW_@vsHGX|3_(I+W+)(g%SHD7!^m8ujfEmrkN#GBgoA7;}Va9zHm=`4TCOZ;>;eCwv;;EwcMIs-Hvs#Iqs`_{suYLkvXroBFyr=-8IC#}@_gTGYaMfXDfJP+$Dhi>+tcQL&OwBl|4U|x@F z74($qfB*kG&k5Fd#5(k!TO!98)_k2<03Kt#cI%DaS>g#JXb9MVcei@ASOnhJI^<4v zMXN>6F3{mYj`Xe5O0g3CiWVyL*sq6+)6Bqm&H#@^p(kqjfL|vd$NMpX>x5nSK=j_f zC+uQ*edDQ@H*(jqVf<@j=;k3-EHKIBqwgnB7~;UDS7rR2xCDxQf^R(cA%7dZ>y6v7 z=M#0A*E_1B?B(DST4nHw@P=(UHj-WrG30+mL9;G0lssF{WkYK{!MXl}!vQ@H3R(3B zH(k!1a>322|Ci5s53ScR{?xL%nYtCUh;;S2a^i*;HhG`CV--+lowq~Hhu%TzP~ zeX|j`_am>v=MgyXHa6v*Bfvw3w_;*aEIVK3NgJ==-#&euOxWp8X=%8tzI0aS6vN{c z`U2W^!;1DmkDPxDtuB+kG6VRkOvv-4E`x8&BJADi`9AnweK6uQ$9Yg;LukD^^ybd4 zf_|y1A6-e4WEZD-(W}RPv?+9d;pwwJ@Z|ERL-3<-cnSKBMS=7-s!#nYZ+;2I4c z#n0NAK-p8#Q~th&7wi)0@>do0>2i@@Qk+2AQ=%#K$5UPki=)9`RMaK(27e4OI~={u zTOn)tBeGD^ejGuz8iRRn>`ppHhS1s%G0b|8t@L;j{?mLf`+I}`4^b{|v4dEnZe#~qh0q>A0$;;6?;%w)SI ziUYv~ZM_4%-!eCG31Z0plj!Z(eh}6oCbvedXYQHD&AJx%4~MfXOkn9x;%WDN%%H1? zzw$DHnqU_7;=*daHYSn!4#m!i?-_n~NdgUxjHbhSRs3r3`4|6C(Zgw{c@Ol}W~29* zJvoWjsR$;qaRez(wC9JQ&z9#MO!In9XCX_M(XFHY)V5=`%n|y*GR~Jq{qD}i!3SX~ z_!*Z1c5_p2x}wgIlWkfHwtWD+x$pasSzBwy!Ee{S!UtXw?yNub`6cxCH%*(&9(Gzr z!=VeE@g$q;1#huV;LzlM`dJjM??X4BMR*W?^!s1BkSnwy>iy`u?Qo*y0e{EmALVZKRY~F!?DTbuKu$7oxmYnOjuvJk52=U~ zZ%E)LBR782!ABf95xiXB98l6$>>PqQ;0MH?OSv)^#OI~sl$3TmiA~|+$>bDx^+yf( zR?`!xmy?RF6s!1M=D=Amnw$^r_vtk>OP7ovQ~<`Xo`B~5nM--CD?a6?V|bMHqXK0w!R=Gs$Sspv{sq7Nl_ z^kL6RT}kJ)H_a7;*&uk?Ypc8|t9ldL^BewRv%D!|rJ9{?;6X-C-k1}tWS`*cq_^0c zmW(vwer9@7*OSo4gdhE0V|TK}?utG9=)d|c!tWpWk01T?{d4G5$G_{8fXjtqIrax< z1LuW<#p8HddUDoy}*! zId$4VG2b>8{wA3F*W3`EBM(^voc-T;%fhU{v$e*2r~7o6vDf|9Cs-evueCqIMc z&OZH-yvKk<`dJG*PIoEm*0%&vAXjbjBlp41;Tu-U}|j{S5aL-g_YXF7AU&bU$ue7@K0yUu+p zbES6hm^Sa)n;jhCM$?15sr4QgX8sNLV=MUIz*~I54|n<@dC|O=nQY+bWz-?wi#qjH zF!7lujo$4=zs$?I)>b|wi-q=Rd2JEp`;e`sf~?_3Z;ju7b={x)@&ED-{|=i)jkXEY z6*v#NFh)$+9#2ugd7-wk*bVn!Bj6mC(@}h`1_ul{H+rKd+Mz#xB@5gnQB&Mm7E6nO zbEg3in?}v@=_LAf5i5nH49utAq26g)V6oaBvqekn%bfqnb%jq;(E)gs9!O;CXTXPg zl#0T4w8Ki@J! z|H{Qcl<$tGm!l9XvR()+p(EGb3A5DTGr|jK7qmo7pzO=p(x5^$eHlVk2)X6X}8CpDr;e13$Ly2IrRdIylC(3eOwTHLmUk~ zX?=D+=ZN^Mf*)$*4dz_e);?ri=|OP=8q1o__rneoJl)_&Ptc1sAOA-?_y5jwRhIy9 zcqi;l0OvcY&xL!ySq7XVAFdQy0B4N_*lQ@U1J4${Xv{&n+~_2{93MyHkSC{=zE}4E z&TViH4sCKuy~i2-01^9oSM$~LaGrP8V85(rh1v)^gBgP{Yr7Puo`CqgXf(%<76X?el6?L^gsMfATe*@U+y(?8W$K1gVTB1dJ&Z|p3(We4eeD^&` z9f$(erVBWEYRT5PtOf_`4LOF8k{|f3UI_ zAA|oq1UO#_$QM@bj3<9f@MN+zgbA339>c#UW9plt8v?x1k#DFIUt5GDZWN>;hV=E6 zZAIKTxCL{8T7_&BIE`9`;HWHVV_={^FCd;9_Nv!tT_sF4hGr@5GrQf* z#nJe4y};X?c6^R#ek%b!UDyrTy-G9|P#Zo#-934~=nsD5L)0h39v>Eyd%+v=0=O<- zxzM7CqxuhIX``|ot&!Mkj zcUo<$2mg~T@EMdk3k#`gb@t`&0NQ&afWla97ID%|O|jG84a zqh+DHg|-Jh!KL>gy*o}q!b@-BuE1NJHmctb^CPX^ZuB{2Us3y$$nD+T|H65t&{s@q zpFr0P5uaT+L1Qa=(a7sQO!v2VHW2$zbD_iI+nBRIgqjZZb$459PJ0A2PgbDM`D8v9 z1YRO^G3n^YN!&{GNVN}vqf#iyHY%XAeH;1nIZdH`XXt5kf)?DtTEVXwv|EF~32fyr z9{q;*_!2Yvvn68AG5D&xLr+RiORC-vo#az08o8pM)CfLV8kH)_jkS@kqTV@-di=vp zC#kU_hSE({;ODzb$NS=&0FUCf&Qd9JQY03SIxg`LUvj zSOlFwIdE=0HB7Cs0sHJc`XGDSajU^yshkbWpC@r`cE*vdA7XFJ9?sJQyyYb9JwgBE zIru_v)}yDCx1F0{0nd&-cwbqAxKne%2e^Ws-o*C8!G>`Zt&9GzTTgKudi#P4X7Q%m z#HE$+xT(ObZI!09Jv)I~O;XVs1t%3`;k~0TH|5|m$r@VRPjH^^eOfM!L{D{68qRjl zJjoc^R-Y|^?}dHRBg_p?gLlz1_@q>a*=faECCP_YNSf%qX<|Ngb4-oobUBh#h+S*O zev-Ca3#V;}Z?4-vORF71>3C8k{3fd=m3+LK`62V0m z{SDyE1x%N1%7F(5L(d;t*$ukF!x4AQpz3n2OCIuP1?JH^KX9F~*CwJK^c?YnJB0fB zR}SW?Zq-~&A842$R_ja%3cDvs}mxtSAow5_@p zH-Y}=5A>rIANv*edlyb8%FxgGZd%+YB8)CSj-;j?O^cHbhR~<3;WYY*Vez6xLGJdW7L}yK`(o+Rzi_rKiW0VK zC(sVWI^+IEoG1Eq&4F`j%5iRLTjbJ?!1*C~4w-S($OpZn)b>oF2Od!jJi_t}m~|?+ zcF6H^Dq1k9J@$*y_qJS_&zTQ_MgekZdtC$J5O@fMb*K|R%@eg6E@*|8}%ywHWB-g5y-u#4lA~@ zi=>M(CGEK~s<`A?I63UZJt7}pYyt0~z&X%uoIa-5Y)%Me!NY8p`G8`vI*{U#55GM2 zQL4M>NABRGYuAQLN1+iBikNbzorl=qnjbawbfIPNqwiT6M5(*~_Cfev{aszsB!R{O z=f_qm&S3>SeK_Q7Q$KK_E#qkw`Wvgxbz%3D;;4ZaW>W8mu>MVPuc;6Nt%fll)Fb;) zgNHZi$!=@KlI;d?^5>l3zIOT3uZuCz7tB%1?0Jj1;aPAPpT)O$n%&8Y)E9kQep=-9urM$H1fB=*cIM%bX!Q^mDziT(N`sAUYbgEPQX zk}-Byr3RDVlGKv@O$*xk9@vC zjugj*(iGiD+Pc+O8vPsn$syrnF~v^uS&JR{)1frzo}Fa)#)tOigpg1-Upn0Yyu?w# zG$PqkdNjwIl9t1(R~9H$)_GBMfIrFh`bnd1!h2B1mv((|lpfsmq8-*gG<8P@=|yjN zAh-3T!>0M-&H#9C-iJ@>m=vK0Gy?-(FQxYIqo0L$9sXkRUvXn|-dEYpAK)$m=P#3Q zbECk2&a*)NKf60?)-awLV?H%XHje!QK6dUntFk$4&nN6kghPkn#$49GJC+tEqvx=B z9Mi`vY4mEu>Ng*`{l739-G{w+`=9ENlvwh(i+cZ3tk?nj7tO(Wa4Xc4wvEI7xEFZ) zO%#$YW@i)8^B?NALpp>$fWD53egvP9%nm^F1m|3P`&sGSt!UC-glEScQvQ43IvI7S zW31G}FPK^uM9?YQnUbC+boimy^Q^0lG$C3+Q|-g3X@^--GTI){=?OBd;dCHic& z!Sth-LUIf9CQJB2#%2XdS--tV{>2~rBR0HtCAM4Kcy@>_a8nfC;cjo8{J?%tjXy{I3 zJ;BR8nu++(u`xRa%$K50bO?Q-?i_*L2h6Sd)g*|Ss0}^ADayBOCtV&CPxt168xQaD zWgp@x^RSY{!UAb6dU{_z;Qo44D%lT)SH&6hpe`Mgp2G_=u@!i6gI7u|ZiUl=7RaAz zsgw$wdSt*uRykH$i2BbMJ8w4{*-JOTfmzTZoEk zppd@9cSg4i|9z&fG)c>w?nVU=|7NMwr^t)^u@hd1G3}%Ez`T{5B9)D#-#GKr(Bp_` z6(jQSuJ5|noi=r}6Uva+ZAy0`E%?#T#@=H2o4;{h(D@*z{{_C!UFu_UE0z)lZG7N- zEW?rwuS4H>3hI>E&g?RFb{e=q_et%~EMGu>05!{){{Cz$YQVQ~=r8@8%e=r>^iD_3 z@~|1ZjCr@mR`9Z#UsRvQnU`I_j;DE&_!SzAOE6m*fN!vGr+D%MN5U#GN;>}nbCxaW zd-U8R?Ze#g1!mP1uhi0QWh^T=jYsY9tdUmIIG4tUR{kPUlnp@5QinNLX-Da53-}}RIIDwHQUh?$hGVCR$#zN= z^H3ih1J`cSPN~^?#QdpBY9T^HbsPR1ywja&QzfgPA+);~-g%xQq;hcTvJ4|>QI?go zySqQWn+WQ$ZK~8L7aXL(2zpezP?}`}ZM2+ldZ2Qbs^Cr9u6G!%JM1ovdJiA)b|JKX z@*?S!u{Z5K0uQno6QwBh_M-5P=v5`yiYnl|>6r(O z_@E_B>hDJtd;ZiWf#9ZoPWv0@%fff=8S3AUz`1ITF8i-j9rn6?612-5vx>!Y~Gz#K5=h}rM3yYKf~_rHF4*l{^? zyKdE~Q>P>yVy(-;NE&?8O)6aDPae796yLAERCV8vawmk+lVRPZNwI#EbS8wpy*858 zc!LxD5J+bqA7iI0{jk5rkJ@(Z$<|B?pxG6^BrAWXeGZ&Q?fDz$m|D1t|AVv2w?6*_ zb@xl)yvDT-{|>s8?7r~rX>QI3bU~~}e0E7`$8SFXEi`Zr^tI;`x??sLIQuK@_yY%! zGegsL05pg;3x%6_KTsBm+DA0`wRBMr_Zpqsni{OMy?c151d*`4*LRW_QxnnGHNT8 zrh_Y9A4%@M?WFH3{OQ7O_=4HkNFS=O*U>AK-sLrwGBkd4^Bi*Gey>@-06%K?9r3wE zHXDH7>HNu$#@(@C?Y#rY;+ik{_bJzoN4|03ADk^s|wxn-UaO_aCW3eT!Mfe z3UJ|He=b_KbwDX|%Ccy^PU@yRMXs*UBW7pw9%_l$~%QL1zFW~AD^aA)2_8fUj zS(iBaR=SJzH3OdtUaRT*#q5-EBt=NE_u*w54SXTR9;BelL+Ui7G$PuY+Zkn*F(;|IaTZ&gdO7dd}&Z?XYFgeM@@2kC=2`O zH^`u6_z%t%EJ!8&`g{$CQgS;-%)s7XwQ+;$i<|CXYvSB0OC5u=cY&4$@`mUzlj&Zcz(T&~c ziN4}w_`a@g#`2-pX!b6KTB}})C9c?cBu0~);{(wU`isLZ(Pa4IvnU?{-x7H7zsso0 z+`0zR-C@~0(H;S}=10&@+h2N5??!kV(4yRpj{vqSC| ze~BA&{V3Kdh-zEph^bBdNrqbG>YC2t!LR_@`w+UZ;tK^?y^z-d=cCw1A301;N&mt5 z(f$$qb?|jH`Sbkwr@5#2+xr7&{aq^Vk_B>U;B2#c5O;qy^!&j28nfc$O`%%`&TseB z;+`(W>=kex^0Y+O*%7`%@ik&j-#-txQnZ% zi%t7QlDZ1_T>}U4Vjl(7SszXEW;Wu)BzT9`jmF-kZel?vyloVD zJ{}{UL|;#17D<N;Cp_|_OynDZ;uO&U*xJGyx_56^@jLpld)o(5 zr|R0`Kx=3k&Hc&cW|TG~Hh{)I@x_kL8~Ib6@Vm(CjIod2eWIMk{s-s1xzqV9-1Viv z`J{U(H$4-1EO4G$;m4h8j+r3f-0n_GZYKQDs*pcFw7n<`0bl0{oEN=LmxZQ6+YFrb zSGmb_4)Elu!MR>TS+|Aof&k7#dVg>^h3`cI&bMBf$mTx==1s8UBz&066?ZN-65dTg zD`b1YWz7W6eO!xVx$e*gqvvAx`?k!c3H&_}H%hymmubOUKb^Li)K)uW9mYq}o5~pC z3N*5djtcTnM$@`$N?F@E!KAzqMOQAS$|C9qk=xQJaw%COv%(DEksp|^h}kZ)h3?`@ zbp%BSxiY^=*z-6ooO=H}EPI8#?$X#$8ZhvXtn?5#jVI`>I&GFMIO|90(E0~v`pTjl z{OP-;KMlTIM|LD3fVdaFv}c69OCRSDx&xeR_R)9rk(1?raL%0)%m+g+dI~tNUwoPC zz7qNh;H)a1$Bl0W{l*yZ7(ev6Rp8l9*VKciD`ak_*p~#HHx6ztdz}n#nIy~(8?JQW zfb$~YeC^qG7d_N~7l3oymIGwZEfW6n^DM4^QI`G^JT~HNN(&ix5Za{iqYx9iE#uOF z^DyANe}Il#KMe5-cj6&qQ% zr=Z}4(d2A9iF-9Tn06eAq7DQ6IPd3}0rZWc7#k&b5B*vBtw?e*OyhFV*R#7DLEeas zZX^7u%jj_WJtLco24AEdiSxW5n_F@WdEN66N_dsdJ-qHmoq7k6?b1Yt3HeG^6Q=M#V0SsFp@x|DJEz>C@q zgg5l(D_lq5`F0rQ;?`W}x`R8~jJb=CZO?Fnku%G=AWFZQ!KI*&t?uGa-FCI&tTO}X zHFjFp;_Jy=IQU%U`p|dmqyHH%r`-SGe7EIN-UYd9P2Ju6!Z$7xJbz2zyx^{eTi+Bt zP~bet)|$)6fCd9N+y2axoi#=-9gbeJr;F@EB78`I^Sy(TOSdlI<$&{(MOR#&%i}2q zI43|S^RZn5T>{Rk)ZgX)b zI!yn?6+!De9Qm{S(^Kw(67@H5E{Z(FwV4`8FHgjfd~7OrtG)t0@X<7?wUSd>1d~%r z6iv-ecDS?Y3yU2B1@a_OoL!WGXW)Ih)0-UoLL5nUFaI1UxLn8-YHf=Fi_Y(GT z4+*8H6J^|C(T~hAM|Aa=j$82>^~-=DYFnMoE%EfHEGOg}aV@!!>;O9d#g}FesweXo z&>uYDLmRP={>lnDMg9lp?HAYaX6UEX>?64K!I-Z`u4M+CpIq9?H3iOBfU{%eSnlVt z1WE_ax-&*x6X1LcIN!tOLPOv@5jdZf7RzjK4~78eeue{NF_?S34xFp!xXH$JMt|@Q z_>ET@S)Y1D)XZsgF}gV58+xc zKN=05;%R?Zt^)jj-(f+Rm2Jw6o99onUH$3asI4;Z9hm$6{ zzF2d3iI~6Ab{5g^9*22S$Dv|2a83cvraR)rV|@~-J8*7)GedO3{KcS-@Ud*C6niaz zC*LIKDm5hb=^RO8^JD0HEmP6_j+`0;=lI)o#HV$F$sjF?3~!r>sn8BI>=%Vyz3oNk zWdSt&a3q=Da~A6zg?2z2L5pjR6l=Bgr<;A@W3_RHXj|k*rZ~_0fBA`{aGoc^Q|YDS z0bbjj^lRN`E2kT&gLE9S}m12YtvE`{?8I_g82!UO>6uE+TG1^zPK;WE%M|YAwm4)mDtM$o%!D9^LVE>*zt`x@NAqre+aQ< z9%_%9kG^rO;ZalJ10F+rP-}`lPQXoY{)c8Uy?#k_EL2I;r*2}eFfXG?RFbEDI@?xT zO)bsP+j<+yYP1_I3*q^2IFa4i9!u4?;3;}-725*+Rig$>A@feq zY?$TplYS+WfPRp7pXI#e%w%$xL-(>Jm3JxAP#J3KOBd7m3*9s%9EEp;=L-I2CU~~X z$gw?F^WDC|i{=GlNbR-!w<*x8|3>{TuHw^lh&c_BC%;eU!`h%<&;oh##ZZ3iQOtX` z!`*h(n16uWF9$K?%GB;+HSi4H2k%zZS~diC^d0nE9}cT8ncPP`4xCfR7)shc@#Kl0 z*Rj9DdO=GtXCvy$+xe_9cxa$J5*M z_K5i#akj_sW5tQ*(R0C_*OxoYo*YOdXJ}w1W%iV2!8bAqbDDmRGbO7{(Cp#4o5u)g zc(97vmtju!v$b>%byfag=oXsPk)|u41?vvqlCkxqO_L(1JPTTp=w{OXM`4rzJ>=D6 z9i%-wLus}@W;s)3();xak}xyy%n{I*%Cm zro}ob=YyO&9gU@2j}?;ltx)Rn`fm;Y`3mf#M=z`f^Z)4>^DJ8mR{K(@mMwhbOpACK za2_xa-c#~CzW(%NikgL9>cAuXIN+>U3~iE8Auj^w{I#e@+)DX?tR!lHyu#tyMSf?k zB&t`8dF{;=*k_tZv#w(HbN2=QOBwuc5nG@;yzQQY=F6)eL7l(EI}19}Zo?cI1KA$4MFJ%MU~x*gSZp6pvaa6=%}+>=ubN zi>I&9>pCAxlg_?IEfW<-M(d_Y+^`tp5wEti=!u=|5%5R=Rt}DmQy%=H58^u=-cKsn zgZ>G=FXJ|z5_ere+!@T)1qDdMoZy*R2Rp)D5+!+soT{Hx7bBpF{#Bn5i1Pg>29Egln2vuERM-}aK`EeoZBAMnur z=qH_efZd~cnDcz5mdY0>sCIu9DG#iWD$!RxoTj2xg*&9PJYp|)>pT;k$gjV4e`jQzt#1G+^ z&oTyXvwpJ>^su~#V+TZhoTP#0xqMk1UG_XFIflY_y*Q3S@;^&n(1Vp+hQ7|afo}W~ zHQmpN9RgP_Cts(UBhc@|607a{(9&`GX~BPqcT^93VUNiURP)UX1++;h~D z!Ak}0!_2I~{B-G8w1S54Dsb5wqy*^L2VBN1K~kQyHx`^#Q#E~jRUjo}9&y!G6}?-( zOxo`iMhxFeO{DmN*?oOzdupEl7dO&}S_yYIq|jXpoaYm_d55>jG^z*s787sqQ%5D! zt0C}*4|v9}%-2vBY6Pz0JD=88LmdN9vwSrWDm6(o4e=zZuaS`W7C8oH-0m$l7Q8$Y z$#e}o0e03GB5)7NaOO9f{p6q9fyYK4yaVh zu|jOw+oqm$y-Q*vG1^SRg|i#e?KuUhF^ zK&w*+cjATO_PU=k6&bIAuBN=L&SwZTIIF=;MKsdQof|_8vFOqHDk%VSTHL)jdYzjm z72gk~X^WKf@!eYK(sBj4TB*pyey8*TJHk%gQqivTd`a4*Ah{=e8SaYGaTDa)!_=fJ zPL{4u3nLT!P7SiQ6JzN>yT70Rhja64E1}cM6uR6D`j&_)-m@y1MmyjxyI#e&>z_=` zU7So2VFhCVpc zT`9Rw41-@{&EC*jwUUO#Qst^YaWYB!Iu0@xk};=~I}VuVn+tg!(9=#w-JRb`SOg!K**?I$wUyx93SJYy zzrEB#=n@AU5Zj;nn+Vq)$J44%+^rVxdEEqfE1}-G+Bls*317#uL}(zJg^G%o*af)* zIe8~TX-zhIG0@mdb6qBFMZfY@ee}os-j`~%!{;MEX+Nxq?#*cI-a?Kse_$7#L5FyX z2RHROw7)J0yG`%TfuHd2k-BbjC2dTOLr-LsuGurpg`7klXyK~!hTou#xstN_x72M1 zx8$kB-MasY)Lb9;S_2i$d7m#?Y*moMCKWxp!lZM%74*$nO z+{0)~>%Vahfp5X$fi_4=+dUTxdRdNt>Gye)J?apGxprZZ0(40G~{p^Qs(cq52cFwa8B%Ew>ZCj0RsZ0N>Z%jzaKWc4gPcjQvvZTSeX6B_M?tS7oZDkh}^@(cb8OnOF^l-;C~WWytbQp}V2J+auy_0$RWfaD3ccvIZ+r!EW*K-7-RTBGVoMEa+M)MU z(o8V)O`^q}ksD}jgd19%E8u^kRwrQ(_>c(Pp$!x4g+mK)H}ygs?$J@uE5+P*Z}h(3 zSP8G}<0%u*vqu>Tu`99r8^3eKT+7>N)Ko4*|HZKZ_u3Sk$tc{dSyjy9BDmH?$lDJj zNO@71sb7wMZoo}Rkq-{A0C`(kV_jAU>_0`WK6;d+t~)puyVuA?>kZPaGF8Ke7P(4- zhps~<@(B2GwCy!XSB6|eju_tT&InzTRk37(7^2^{qs}-#k}{ydt~=|4lsh4ej!(xv z)ab)f2C!{+SV_UX_enb@A+I)8(KX*}Y5rjab;VuzqC+of+^(R4HL?_}JEYK=deCw0d&9@gNv3xVaaQ|%<@asZVEza(!J>gs_!8cj$VtYwX(lx6 zgI*r+AJEQ5n4?Ur@y3R3p`#FlUiRR&(0a|b7Yywa$R4$iSA0jIxdvXWc>emLwb1MZ z@Wk(!j5iU!j7L1f^O&JUe9HmYmDvHg<#ZJ%m8j{e6LOWQ=h)M9_>qo=M^Hhu^mGvR zLIxr)9ePQchCZ5ICVqa=SoZ>b;bw>6@%5ym?l*A0bRK-;M?qK7TuoMQ@lHK**KL3X zavWx4?9PnPjTr$Ca`b=0Msd3Lbx~6!Ku5i)iB44&L6b#rwz^Bw#zUdB>pk`<9N#KA zb%pO8&0&#EdcDI&dZimtwd@nWkV2(D1j=27b^ULoR z!c)@}y04G-J?aI2d1x|CX#i}yeB{e9bN#^>Gk}fj3NKD3(LPh0+g(irZ)h#nG)AnL zY$Ys2tT@>OJ&w(Y56~VAz>}mT|Vx#l3?r4EL#n+Z$=4Hk@waJNQtPBUQappw5Qoq5CSS2X;>9^S75;{#Ixzk>}T7{=d8~t9f%F1hsbE z+SuDQw~F7;GnpRMfwuhfbN=vrp{^gP8?&csd-yi?mAY-G>S3me-S?^^5xDeHAS-9nr>sXihdn21?s zU_LFmTKe=Iy)E3K9$n3Kr|@q*iHDYNQ+r+T7ZqJvkJw(?NtZVZUI=-Jjn=Jo_5t{w zk3(0V^;0@NB8sd}qlbR~m{bol;}gqp9&A#jkRI3zb{(ALHH~y1TwLUP?8SJPC>df# zf6#CI_aA+v8`cWCitlVh?bqyFChGSmf7gItQ)8&dg+J@T&ectXv;ir!tQNT9(n_9z z)5ySc)csq0uM7F>Z7O7lO&Jw8gFy>Dm>pJ4RD2K&k=Woa95g%JTQ6ya-=T? zx`Jl$bQd|#URh(^wWHY8I|Dq-kA}Jecq9bRMjx~6i*(c}mgY|aulS=tDpN&}8S>Sw zk2F$kGF9VwTHU?;qD>kah`-k$ z?-1{LAG1PuwjEf=Uqvow3rvE7O8FBC^q%lsxAFqt`D_9aaP#( zjh@R~oNfJTi4S`D_bzpV(jEMe$!Z#oGrUJJgMT*~JACnuJZoMe+jL${yK!ImmMYmg z^b6ht=W{(;Nk5yx(*`lkX?K+Ls2@Bz@jNJOhvd5tJL~Z~9_Gaow-2!b|84yA3dzn{ zMOX2h^Z2}EH3hkb5zfh`1JXkG7D)pWvCx-8(+482+y8CjHBacdau!1S!S8s~Dy9Qe+1bujX z*Z;a$<#Wpegj4Tb6Z65qO?F zIGKOwp$5kbOe~x7pGV;gBj;IlAX8R)NezDj{9BvbvlB`2r9Yxp$-0O2VSLrl=K|$ix#=i_MQpS^e*6(fLngUILTCiuNrbuX{eW^ zd=gD{2O(EEY%Q(M3`b7`y?g)H?4+ciJU{FaD7?j9Zk5x~c+|)TAG6Yha+NiBO3CXp>MaPM+1c#<0a zQSh#@?=8!@r>3RNP*wIR#dx^a6I(C4HS-|th zsEM*Anej9oc)pg~$Wnh|79QvJd)9lGOh5P)8>7B6D02CP=M7D8CZkTc*i@_OIPSjN z5g%NtbK_|$uw6T&vn*(20>ur$yHK=1Ha|3hy5byqTv#p}bsgFRAN;$$(f{47rcoi- zE&Fw!tm-E6*%;)Ctv1ONo4~Im!`~(|RyGAa!}Bj;a=^M zuYd0hx>Pk(bQ_XH-+`^4JWZUwI*|mN)kSUgh_Bfr|vkhO^TXs;2tSzyw_zsG#ke|pm#9n5Lb8( z`>=S-I8PqLpPLVj-$caH^mTm8bnL2-*Z3-w@dwdc+?@h`#^o`8d9j+(*CJ=gsN&O9 z=tpgXF8%aLJ`V3nW-i`+yXCyq3}~53z{gfj<$t%pE>4_Dt5I%z1-Q^`)a)0tJ^Ack zayl^=b^7pGd=C1m`%VX?4z&a z6hjU0{O|L;KsKBoIxvL_f%DD>`rO5+WHJJ_hpn7MD{#)U5EJSf7K!cQk5L9}Z)VnK z&!=Io6WB)UwP#ztr`?`zZFGzPQTE zZ_26U4)&UvT;=D(hd=fiJh$ERd0XgIkGw!0o+slk=D@Y!0eXwrM}HN&w^|{;`8Up6 zo;BfXjYPj2IGRMsBcJ%}hPOr{S(YRz8;< zI<2PW$kW(f6ZQ!?Mp!$<^C25$1`{zOfY>{-S0uj;TGOm)co&-06RdZE>qtgU)p49~ zi-9{mhJRP35`N$w>~p?g!SFLv=c=0mG`2_^6g&Hah{#mi9m zxE6Dvg=j-6kI?&Nkcm!`Zr=9RlnG`Q9!JJEfaCcRu z*@9&#v`?rVZfMpBUt6hY6S&jMcY}l^d{?PPm?xU(EL^J{h5i`k>qoZ`+S`TGr%-Sm z-mQhR7eeXr1^C0iwHK5h6?7Xj<8{`%2;SZb`U(HX>(>Sfd+I8vE_l4&JqHN)FvsZ( z?)2$0J7I;pg3>VW|MAI2K4@PkwM0Lcu#bLmR5b0I`zOxxbhg~t87UMBoS&!O60dJW zdO|aZj#9o1~s0Oy{%6GDJ`rz)`B3_jbVmBItFGBuL zt%q`@=(F_oK%H2AhM(sJkIf|Ts1DB4?+`-{M(?i{>8FvI?)-Z~`(Et@O6|1PK3=+!0`^b?K_QPA2` zN}4qOAa8)a`3L;|Pwb=Tp$qP~^-rAFT`|$FS&%|Ufb;Od&DiMO$z+K$EGr3TpMPj* zAL4MA4%=AbI1L5j4ELOWie1Z1B7fXv;U{jh3}|}yA>Q5ye#OoN!1D(&p?Kp5=2VeD z9f57+uh)#@6Obe0ZfbOg+3v(1F&mt-1jdxDaev{yTP&N%`h)*D558_!VFLG1hq?RN zc&8Mv_#p`i#BV{23YQCq?D3s`1UJQY2+rsoC~-bD!P|t-El|r3faltErSP>a_DdiK zC|W#RD8l=@3BC|{^PL4JqevQf8G5ECZbEDvY7=;OTpcn|_zLeC*A>`<5U@}f4lPn~ z1%BQ&R#>@AL66=+V{l9@6k94t5B=5^FBS_8v0I^*5%_{7V}!HNx6i}R=X^Q9pIjA6 zCm$>S+DGqzcc<6wKXFdmI8)?ijb)^rFz$vvt{kXV}WQUr< ztqtzPq7UpBV(I(#h~XyX%n0)=?YrR2U-n`9hGKqs5axUa?B#Ahj3=*9)S(v|2n$bO zFKrR(dh96Yp+A3TTT?%86V#~dw@<_j(d2ZYw3&)LX5rp3n=X7pj2W1O-+4*GzUk3) z_G%o>oartoXGYT5eoC?#Jx%aF8&0mhqxnbT_Rk` zhTlvN6(x3CDokmqAV>6A6JI0=>c?_gG8lJ2$ta-+d!6?5QPIpV+5FMCPzr6XqVA8{ zy0pj4T{n2~{X0HyHaRDjho$_*IXDDPX5Ee@lLKM}v)af;oBYk)?OR;Ny3B(wCF1aO z>o;uQ=_Fc-Gn{2PS8p_tq-hCMZ3~=D z>qzs;;Ca#+aiH=xOTfJ0=N@=pGUP082Kc=(i032jad*JWg{Gq}*lHy_K@KClfkxCc zRd9F090&AxEOD7ojoj~QIP$9tiv+`wN*b~ny0Q_21Z%u2QMchaUou?ia4?#lxGAaW zhpECIDU$9%GZ2~^DD-Ip%?x@{-*%{kv~6LeL|VjBt&G`mvut-B65i2_1{>A2>Poicx z!(l-t5(f{5jX1+^XEl>#nb@n2Gt8D)NVY%GbUf*MBUkil%I}6hkKTUNK0mq%=`*m45NG(Dhe~LV9HVy( z_E1Cz3Z8@2G-n4mi;F{q801h-AHz@V{a^tOj#STGNg0hN3hr%UCnwwPdDB zp`*arI7!0}>XNA^V)C8q`D~auI3?gb#o{qrhyI``V#TpN2GZ(FNtmNS?5*8YdeJk9 zzDDWWo^4e>qOWZh8lAp$vTf(%r}ty1EHV zkE37r3YyO7A%5oL8Sm4Z!?}hIuTJ_gHdT)4+)=T;m=TPNbmf@E|<-ob; zo0aU<=4ALc;ytZ@ikZFA&>i3$*YQ2u%xP#T@(MoJSn8IML+A|@0%NKG&Y=Vgu0S!pjtgCCv@%m>|VE1g8|Z!z*Wo7HC0okQqh;ylwj zk)6VvV10jZr{YB}WDIz@7nqkfY$XgFiy0Xu>e-MUf*WFv_z<%yw(uu^uA<|J31@x` z5c1*cGp0~Uch5`^GMm639sE&l^?V_2bu2ZFQqlE$;n)rlP5v8H&{Ze}Glxiea7;x; zBUQo+XbBXh@G>0{Eo4`QQgi5G^u1>Zhtm{PbU{V=&3X#XNzm7wKztBC^IOg3WR?fa z$IRvzPeN^u&#Z~V!{7m#u~PNdKKjm>Cz^r&_`l8O;yc%k^u@hlMa;56WT z>-rAXOVp4d?!IY`rR-yE4LtzPF|(ht4P)S|1DwYWtRgDFGmP8a>rW=mkf|AB4?QLxQTG^w~A7ckG;NQDg1zL*J+26 zI{DiR4WX^hN6*fodtc#DZY;$B=j`MG!X@nf7zI5?&#ECpXUxPMDOTa0a1*RC({}K> zih|e5gmc$JDf~Wq+2L)4rqCVTyMq{R^@(2+gq=#4R5UbwGrzK~oOWXOM7vcE{DMF^ z-4?;U8ja;t(4F@FmzKaN|4*EUb`NCshuDaiYYiV}1?dAAvIx_U!JlkQC7-+#lLK5EYD*gAYIM! z`k_D44V?e(c=iCC{72wC=TdJLi5(^-xChgmQe{q;v18~YI1}s(OBsb8nHRjLzLxS2 z@tF|?m?gB9_|CWo=RrGa9(jb1U!wfzU3j;>Z_Lkm7ea?BpiL@W&Q;BkQ(MICQQDod`_n?n4YB=yv104C|9h^% zIs0@X>*kR{&w=x_gnn#2bOmX^`9?=qHoX`cB;fq>!3dVnNJGiM*?0F;)^1i3)j}@E zZZ2T!G0SrkIDa}G#H=v~*9E!Ulg+{GnmmC_5tI2lzN|6$v}L#lQ$J5+Bi-ZaOn3C- z7W3@27CbX*;ue0Mo6fHchM)0E6+G4#^RG{alHmtzj4YXnnTGZP=fp{E*u1$()C)L&y4jB9Lch_$0{xWF zcFeqGBCQ6_E!wqbXW(142{?DMZq2?u!oDPX^!qM1VuQ!WQvvdg%(Y*|@Kb7f1DwD2 z$`O}jsmWn7xW2w?`lfD%E;9dJ}NA-u#X8;R`5ulfwRiMj>!|ClL5|p+iS7o&^)ID zXU{Q@#fwcfR0NzuX519F`6Q7ia8A2)MT~*}`9$FCn0P^4Y?Vm2fpb9q8S!H*<|9z| zP4f}Os^{@^4mcZ{>=yMVA@}GBP0PcjqUBlebv(Y);$h#P8-Bx(u9Wcr6hv z79`O^;H+OI7e`@cN)DWR+e{IU!$+bva=C4t28#@Scin;Wrh;yw3>>nl1M0y&7UC=9 z%z40hP}Xm4&;|8h-jCMyhqb*{V2|De^tPHWESQEqSNaabw68~GDVS9$0Kb{&WyvLi zuN$^1jz)zx<67@l)8uoguLJZsFYx)x!LuE-G~l+QKecHic%DE*t|exI9<*1H|4k!q zF#Pf@GF6l^q(1iuGs|0WuZ?>4LuNKFoSNa><`q`T9&HPyac>Z}-M7mkFw1O*dvI~( zY}uDia%yoKc>QVwo^twG@;9EJ;B&A8IR9@S{h|NdgZqE)W9_D- zke)tzA49B}ZÐ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

      )Ek?jpG~~9 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∾{i|*W|oV7Okit6W5&Sf19MFrlJv$bKl`TVtibI#i0%}3SLz=R!PGvC6ECA*$9m3qcTndJ%s5?L2oSD6kavnLwj!8iL4ERc6J@y8kNS%H zDk`w!BDG;#mEX)1j&h!4`IOO#JrbL&KiaO%3rlO7Wckv@pSerf9ZkJhj{`kAzYL>YbZ&QzcgB1fv+R3vM zs=+A&YeSmmh|cY(!n_p;3|D$C+AyOMI)qB0=sSwd46T3;$k}q>TIRA&IdD3DFl)I# z>Ux)fy>S3!T~20nJWC-iG6*c1ivU>L+#n8?z$+2jhyB@Z*I4WdtA;g4 zJW*q}Sv1nF3JO%PuUt1vW{N>2bVkl$bEHh>H)MY|Px| zs$eDN|5WssGW*+CLN)r0`;g7NDKCeC7Cx}~;!WmJQWB)fsVEwu$ z*cFt(71U0uygdTCOro5BGy^m(q?~6Cv_XyIQ?1X^-pL8trBcq}rS6c^lXBJx^M~^G zl=Drq2q>FIW4Z0J1dypy&M)3%Ko`_`Q7}0ebQU@erJM~7WiS-;k`&iFSe8KQe9ChZ zewPzwQ-(Xv<-q<0)NVC?SwWPXjz1m@vuI@LJx)t(`1@@+NSpgyk-J)Ww*Jjwli$j0 zHc)#e?F)*M+U)rT>e0_{KG1s4zvGRKeTEm!Nvwe%$oUno%oJ^^hBwIh-5Cdl8CnG` z$a#KZ3M0LT8qdi2f$BBJ;Yc|cV7!r>ri|L@Wv~I`I-9k9v3Er&bm$oXe=Ntr5!(`& zw>}8wE}jV|bSUSdkhQSih;r`ob|1K&qnyu-$2H_^%Gqpp1O!JMYyF);1;^m-f}^eD z{%=mfx_vapNNy^CJE)_sVEEJ(=iUJ7lTXgO42O16pWJf)7Hs`OZ8$6cA& zfANiSPCYhDzPyy$b3E$N>m2=?vsud)(GCf&Q>KVv*{HG1x_Q-*6@`7r(gK+q9joAE z2khf%CNOhl6%d1*m)Cw|e4WZ6bCM72y4@YdjVgn+Sm$5WZZs@WDg_hFJzl(i1`KOo zf;}yQU|Y*N*snx6Yse2`AHCex-<*d%L@XRA=SSCL;5(sfz@wTc;QFb=)_c}=D1_6> zG-eJNS&Vh_G{z7^9gNvV=RRrG9f)qAK6y*bdl)%|`sB3GpHOy>+OTs~3&gjrqpyyC z4`o*=H>2;lK-yEg?Ka;Ky64kzb+I7oVn)ZkcWCibrSx4an%N|uwt(96kl_w;6L-qF zxudnr)}L}-gnIN-=l{()tm=(O-M$8rk#k7Pa^~lxYB&&$x?m%c7|r*UAW@S*zfL!q zp!f>-h@4Z`tHI@||p;W6fSDQwJm$XDp@L48Hw7iHGEi2913k!oxc>NzUz(J<)3x?50gb8A&u*S7OM zyKi-nwTv?Fk~S9-R?>Syc6Mi0j;7-WfgSl9VU%;|^(XS=<&^V&B|G{1wp!!(sR zKsj@$NAIlmH|Jf?#xaRAYv31h{xV3+c<5JyZ4Bn6{LE#}+^GbqI%>2`c*VSwRzM2Q zgRUXk@Mvf`_HFZl)nQ{`)%8-?rs@YhzgffOh!U9EE&%SFZ~{%-M^)j1AaAw=&dDg} zg3VYX6+}6^j7^3S=_gw`h@YN?dxuh6$AcovpuRoj9Q^n?$S2ad??BJz5V(l?WVbF~ zfSW=&`}b|f-hWGdMOvUbI}7`lDA=Zr(qwNwr@lf+(PlebqCC~lc4cEXQf^gM&)`0u zNhCyc&s9qY%60}* z&XZA(KJdc+*1z*_|9tYY6T^kL3j#^#kY=oWZhS24z-RiCccHy zvD7DvGJnI`bn26B)^=cv+$iVirCr#FThu2PP1R;q#FX=PpI+>M&6Hu-xL)kI%hbn~ zJ^BXy+Rn8u=O2 ze?F_sRvWa=9 z_{}qP;-Mvga{gA71v~znXuZB&M}S@9l3T~UD=tG<4;o__>OKG~tlw1pTid;Fpw^jk ze$@Ua)(z6RFV8}S-B(NJzKInbS*OvI^N97D?6O8`lV%sRSlMODN@ZJj7L+O5i_Y!X zn@^~H);&lDhokhKH&%JfhR2k%`UQWv#szx4`F@ss7xs5m{GM6HedSHD)Shdzi;Bj? zQ_cz-zV~}y>plOrXAS$)%%l7oxH(-6278m3*QM3immBrFrG#;NTm>BmNT9O*Iis(F zXNbAje|%{t=scd>}If!Qk!<&T7 zQ0G87KjuB57C zs{U=yKIQq$z~0rc6!$m&xp0WtJFyBJaergR$RwtNO(mSfb$3vWoC){G9>IsCsKa}Y zIYY{!VwMkhZB>TJ9m`=U#=pK+J)q*UjEbs%3Cxg%teaGMJzxrEsGi=4u8M zGh?z#VBk$(T(dMXCx?~5CDhf+H~-GShhoTF76h|ib%x*!%K7T%{%`~+=Zv8vVd`(n zS#V@vg>y>lb3Gis0D6Z}&e~ts!MqyES-g1%JivTW#j{%_pvIdH_0I{t{6Jlq`sd-V zLtw=!%GnwBnLImF|7;|VfqQ=_E5lB4Fmf_wt6A*_z|gVb!x5nNnBFsZvk7y$ZGU60 ztChTG8NKcwxkkRLjkAZSTviuPIhP%BEc%j6IZsDD`plkxbJnmZV+N#_fRY~eKJ{^C z7M?4{{0mR0&0N3?eRu(y61=dV&r-%{-37RhS{m~{Y-W1j7N7=e?F0)6Q#V@x)g`|0 zzDER8bA>>Vl|S4mPiH)R35@ay1n2ujOk)G(Y{baLe(VQ2|++{T0n7%?8#x_&V zwzgfNLznngo}r%xz(~~dRj`f7Fod(qDQD>`6BxLHavpw;gF&dXqqyg5o;A$zq@0t( zmcTgd3#hmrxp5Ut)1~(LYwtR^vw^aWO`Zzt#B@A6>J1axhu%|Z+$;)Jq2EGLpqbpZ z&7QAcHJ9hL`HdW(RN1Qp%6ZK_^CB*Tavp?w^reIT=6ufoBGVGj!}88zn7YV@sh7*4 z{V-2>VWz|UY?6WDVlVLd)R}p5R0jIE&VT*06SE!j8+ChPkMfb-nd?`IpyVXxz-$}L z#Jd!M?Jhq^R-3?F8dwBcZUK<+XC~uiT?Fn*!Kh2Mj`0>K=l*)`I4@AnA76wpUe2kl zO!i2Un8PuY^JZ}#({hq>uCA_NR`8VbGq+nz?J3H6j7l@J5c}RMcoskT!N}3iD#n&q zRbkLd%2{V(7g#=rG92BzE3C?-Y%A}7WP+d4adTuKvvU)@=h5AzA_+d9;_rwpCds$A z&4Zh3b>%K?^PtAP0Ga+V%6Zk7?nV1gQ_go$kN)N8zd8RjzQ*(vpNEf_AO7$vFk8Ix zpShyRSIbd!$ecfvBnVR_4bQ; zi(cW`-?<&w^RT(U=wMnNYDoFRXrr;BZ8*NXF%Sm3ED%j@Pxm)s$~oe;2cw2(6pH)1J4+Z3oZA)S{5i{*T|4P`SXrIuM?Jk~Uem{-21Cj@ z-E5}Z5Nr1p_m|$)l6Uu^{@H50tIQ*ba!zu5U05!soFAYby$$y_=VMFnFs=hngI=8n zYI*)opoP-N_(X*N2p0&2fh!!&=I%cBhLh!;D@x@imrrTSnPJ zlc)R^L&u+&?2zwoTQlA??IXYHPB~8>f6ONx3UQuZHFE@SE>4HHqkSNFFvq)irNf;hU$|nqm`^QFhuK^G zq2Tv=eo69iXt|B~w0m9nZ;vTwxqKh*87%$h0rSIiSXES-$PRcniBwqF`m2#e8@Vbz^q?{Fc^y?4& z&3R4B1IDl+5f0;8J!DmXM*mwpRAN8yYnmFOC6YKe?k$GYtUhv$uW@i|IQC}vB#N z@!~mj%@TiA;NdRi>{3#~J4~W6p8dd5-mb0hpH0#QzW-awx#x8mZ<|Ja$XQV~uY}sv z3g)MtMerXabexpuz^_7$62^(M*w@>$J-;dY2&l)QHbdx0e%bXSz~cU_F1L_3evSS8 zaE>`+wTrh@j)WQLXG(th^QmJZ;cguAH;>_e#Y95mZEwh5d7K}zHwx|^L0#}UdA#Mw z7_c%AfVgi0{{Z`gDSp5Ddh9RMo5pz41F!MD^Jy#{`t%OJ`7`BQz3e_eX(aX4E+KdL z!3U^q+poFChqj$n)#jJ*j)v5St7ISNznrJ>`qu=t_ zA)yd$>E)V$A`kO9GqKc z`|=MrhQStGgDKrU%xgu4!zdZ*A}1&E$Ab^UI&aj1^33EJHWH$OF*nRHkDu&7V~=^a zpl z-{wF$2dvq`*Poz%+jHVbe(!x6lRU1jmrox;IiE0RdpPq=WR;@Ao!&hY<_6UUnmTOsSNh@>NSIZKQS2M z7$3O3dKv$sYbdmQ^g|tSd%hm)WXE7%#q_J&`OEF74^b8E1ND@BEqCaOl3Fyp;pxY&`m^ zyzwnPAN>4@lQ*5Eoac#;7p;0sIV<$&ts?&B9Qp7(6ObPWTH~;8z45c?_DsxmosL=? z_a}*R)_cQt9LJau3sZM*IE?j`7f&f!h=aVr%?tIRMjR=65skf|($MDj9gu0oqc-tH z)L!|1Nj4=J``mx=0213p{x-uK)*E8|TEtj+|4MJT;v$BQHjCslaJ{B=2es-3?vk(e z_kk3g%O`#HmxpZd1zU+1XkLktA4>Iu9U4-Iu*;MS_%7Bh^MQ$;M1E>%C^#iy9`F4I zxzLIFkbt+Z3&p!r=+W=H^EYSB z;2g$4(Kj9I3=e#`E4n|(2ab(hee8V{Tv_Dw zK?*$D|4;YsGBZ1@fxvmzX0WA9xuXxfzpk*V{5BQO`)Rzl{6Do42X1eX?@FRJ z?6z}(+}xVlu$1mzqa zut45TPTBq%rY~y+rBn^X}I&+ZLkNJ`rwOH=cO1+T?mRURcfqlFs8HJ*@q zqDWSJ)*nWhNovfz?_H}T;eywiPFfH+o2-Ld$D;n3@=DaFR9yFd zT_Yc9?cX}Cw|XFd?Bd%xzPYbnzF@a^>)7N#s65v}(mJ+VIaA*4p=axOz%nPfCFa*F z{*DF{D(^Igj_nub%XKkMR$R|del1t%D=Nl|(_hJ-p2vReIR2IRT2`=&j{l=aKMt?| zdtdaH<74JrcOS4qyN_$BWn9r$Ji$E3aQ|MAyUrWFqiyRNPJ#68SWh<71Jt^1gGo|v z_=)w}hd&3wmtb$W?uJ@j6I0+xqBo@D-pY~t1+W==p5+u{4cCOrP*vd#qF1QnvgkP& z;o5O=e=+p=^b2Y~dPCv@)c(BHiJde7^T^Usqf5CrTQC`WmV|mjMamG?;HDpBcb7nY z!&uhpP5|sR_J$!-S$2d~Nb57YH7sYxjSgxZzwzA3N|pz-j%N??VNJ?#zZRc&Mf72I z?j*|m+_EHA2%*di9%Zv01(bREVxE0833ZL}{&nXsvEy-%M=@re++o9WD0B1a4_Mn? zbo}#7HGA$bWuB{*%)XyW$9_X*v9Z{LU-57M%^9-0!9^z@XhC}xWM*(~Df-fZ7<=Sk ze?zQ?I5h^fN}JBWep_$YYKb~f%w6CV_O%=}V)nOV7htVV3)aHh2)$Tcw0Xx6)IxeT zf?X{32Eh5aN*~y6_%7J19*`8Wi0yn7_11sldmQG#K109#euNk@Cmdw0io8K(tr(ma z__1%Ru+|4_miO*E%znW+P#Eh8I^Pr6h+>TUWL{v}oXNHv^oPdFQg~69&;Iy8Is5C@ zu{CArneLnzpGCpsAq?bVaUVl5KL5ag z%bG%&cgq^jS+AnZtCvjXZnQDKIntCf?L(O_T|As)q?9uj#cT!C;WJNdv2yz0HitMKJCJ8+_c`*woe!hMu9-EBd;e70%6V=10#11rWnNfj$LT$yoNb?P;?%V1c=QB&E^i~{+|6n= zmyc@}#XIU$J(EkoUKfh-zwLPtzW@?CVK2k(9$J6&` zJm9>29D5VTo*0vi_C3XJ!f|~m`k7!kTRYqv_B=-|u1lBLVfgoFp%0(b=N>!H2;&ya zd+%KEhV6pArZTqR-gx#Ob_0&oWn)qUXy}J*tiwk8hqD^@!oz8 z+;>&Ve3RWyF4T_NwtuV}w*vDw6!*m6_TZFpPE?GaYb7r}4de|e4#qqy6 zU%O?8IuO24rH%TnSaa6n18N7OZQoRG$9~qu=N;k!2R|FI+p%tMC&nHFZ0E6^G`yi5 zhcVvto$PH@Z}7oB67EL>*|~qDkc6>!#Nl}M1@4pY#n@Z6C5QdvC)bYHQyYL%(%~+#WUjJzl6aXg;1hrt1R{E~pK> zTEw;V^o6%Pay)6po&8NYuQXl4^=R`U0k76`dIgkoPL2zw>O?u4Ww>%tm}jnFI49hT z>x{iX6yu~PQf}f|%K465%1J9JXG0S)=N<4j=NljPLQc3Zq-ddE#hkQbgQV~oIe%Et zna$KfThhgNILw5NM@^Dy^da2FRjl!QDXhj^cJ*7H>{r|e6QONePdLIpzbyqL?0?d4 zeg>;rCk55bsL%JTh+S5Odhs|{u5+wqo$xHTeFSO|9(%yroW;G>Qyy@x`~&+0d*f8% zZ@uHxj?+7aF(lggB-hT|`bc~)ov?mCz6aL_zqJkH#PGFNhg0>CLisAxhSnX{tT$Egyfl43x8M=woNVgJUBetA#r61y5^i7x<(wWT z9`Xf)%e0B>>n|$8hbIGk-{mAJ>Kr@%9>zK)F<@SNxvqu zo1RHw(J*}WFB@3T1}XeO+x{Kq&DLI!f{ejla}dK?VVqoPjk=kBr7DQv_TJ7bl= zszpiR%NFb_b@>WA%^!8W-BH)|%@fwwRSGvT-gapJm5s$crzqSrbaztWULh<05}YIE zYH%MGVa~_{)CM)~#W_!t!ZIbS)$Oaxc}~Fhu8;d&Y6e`Xo)m`9!+QTtvkf1zoo3*-a{%9+%LlgiBz#}Ns7ZQSnVUXLihCQV zrK{VCQ|gHtc7?d#vRj+G(OwE$uHpAp){irMFM(AbP ztiu`*8;ldCpT<3M>?!c^hdH-7S^|N`Q7>=$RBni-6auh*c)><%u4u6oo>*h9rqN>V zvY`}0$Km%jVI^lGkwADQvM#Xa_MY^F&3Ja`8Q{WoED)m>y#!7y-O0IFi6N^KzE@!n z_ZH&~OWZ3n*t?tCjy)7V&iQX$JjWy#(82z^63f>TbexqMrdv;wN=Hw!C z+1YVyF@C>q(Y6Z)ENAoayVlqD0HfXR>?W)YY8r{!lr3TGI%g@ko8o#+PUfMGFE3a*4CqMsS0mk2jF?!=1s_1{FJRlhGTbOpP#;;S@UT#k|DTol(2D)Phqk#r#3s4G&(4P}T+iLIc87NOZvH(F#>Q-hx2zwOcf$CgG8t0Me4qm7#H2s3;U)S*2ejwM zFp%xNRRUQ!9;7~l?S%E**K}~5Qsu{R-z108@Na)<2JL)chUJ2Nb<)4n6t&;@a=3$Sf^If^eizP6% z-UIZW_T+3q0;y>87GL{w-wbem$MuoJgTY+DXtZDSElUE2bF3XQU+W3qu8rglPL#l# z$DVK_-fg1m zVb2{z+g^kF;a?lr7<&o)^N$BeG9IvL3nb9vAig85X7-*1_NBn}(HibEdv!SKQ)3Ki zsrQGKXk(r91^iyts&GwMH|FpZW1e5?T&Hhnk7(z07{eH9VITU7Vz@p}i|dN}h2bMG zhjVZ*?&xSQ7&H@oaf=RjCJ1|vC8J*FB0a7U_rrdm|2gtTpBsD+wTLgEA30#aCE@ov zdl8=Z)f;k)&9R4HGu`J=^h#3v@7{Noa1zg`p#%1d^W6@kd-y_a7Z2FunFbbj(U+rb z|8i-72#lSwkol3`D(tuW5~xGY@)1g)BX7qnJ zw{G5)#O}0_KsDO`?5Y#20gF9p(EgpDoMB@|p#87L-&|VA?(Hc7A7_l=mld;&vIO+S z=tGjK*!Hizzy*EIz=X@}=38E{`y9?AhBw$)-2aYyhZ^NZjqJ1rFA$bs?WFG`_Q)yh zEp$u_^8QV1?gLNo$9-M>n_t*pwy04*1lLgYKiL`G#qfDN>XmL#;=0u0{>@Y|>_~0T z^~ZI0pS$?pXRC5QvES;Tz5mTQZ`g3S9_j}r?XmA%;AH5(&lfV$w#T@+z=VH%puGnA zz_3W@326ZVop+6a_^c}Lc;~a#{2NiZ<7rw!7uCE7_ z`VL^t@ci}?@;A3PVk0qca3cB~zi(!&rTPB-rXZ}vvAap{-`^veTY%!px) zJW#(L>s2RQPhj(Kk8TyNm4ZSu*gn`drsNXp1^+q8da8)Q=^4hcC$d=^jEO8hqIUV3 zJk}5GVsse#+u!HeyJJv`7~`>j`{%;ts&F934~8gvfVas9MufU8WypNVC{0Mk^WrIJ z=gUhB;XLM?976u=vl(FO>J0_x&$YVSg9paU8EF4ay->q^o>b8%8+-U;@6XE;_}Ufs zv1_n@$vR1^Huo3I5xs=puLQplH*+4kAlq|ulNZgRi}=v9Gd1^A8%_+L%SK`FRU7-!tPMV{#EFg_FY$JH)5_)28(ue zy9?WOJ=!q(pNr<**yRVjAae`$;=8EL&hzzx&~S{SruJa#rCzvx!TZPeWLs8Y|DjLF zZuS7y)7}%hyuw(t+K^S!#rZDU18(#f$?p4s>j3;N`tqaM3K_23aIfs^rb+BbeE+gd z9*~j^Y`GEYJfMC4n{$5Ga^`EXKPYt4cQ|p(k7IuD9+`)XS78oU`NDM^+h<=D{l@+_ zRX9Ghu~1~X#s@Cqc&sE#6ohNuhd7@8F+=nbV?uTOJL&})qFSt}nS$f>{Z5Jw%tGCB z#kg~hXzBwAe8X{vTe+fjcxJmB->FMWf#|yq#tbU>zB&-mF|=m^$G784M8CIrL5M2) ze5VT0ay`^E$M-%(y;@Y&;0eBJ=!?{9MC}7TTff0h4yB^SxX+f<5&J#9$`Gxz^n?N& z`^|R{*;`|N1lq}x=IIuy$j}b|yBo|7%2l%PY-b=cd}zskAMOPj$ZGMQo&42PsFM@u z0X<(b{3TrL*X+jl_`5xSYnd2);?PfKI`GS$c|a$O`E!*T@ct#okqw(1v zf9pc#4fSt*_KgpX$nEdG@CTp$q~AfC4#c;g4{Yg-@7>;$R4vCnQhe8L zDq-YUmK03U=Gz-3kX^l{uuBVl>G)H`GE@Tn(YCX87m?at5}1y2!RO#A@&UhbRg5jW zp1naDF}8}qwQ7gW&qzOv5h~EOP18RUSqj=Y`v1iv+6&>S_%24{{VTf&=Sw|7WjxNO z8+r-8O<3=1f^&NIU}3T*>g?ehq55UCz>UHlZ|KL?4>u7~SK>J*`n`jTO@(aq&kgt; z$?QaeCHCs+kKf~|=dAD&?b!>z<-T1lg!Pk?;z53_te?B-57$!4Blsb9Ndr@eTk-{Qb?ni^-i2eo%+D zv}Ef&Vi@NOR_LEsy#GN=cKU$pDC}#>Xb4W&>#GFglZ=i!f&-q>_)o>}X!$6i6WvCvd9B2ZN@$1kR0I$a^B_j-<%f=YGV8~Yhck2chDVX z!-&HLnEwGaYb-B|dY{P$4cxP4duLdjUXcRJ&66?NYKacB5lHSvNhr`sNlP}^x2I(!Cpq5 z7{jExCXz=(Lck7fQt4wUnfxITBFylN;M*(W-8}%F2-w$rP;(Flb5aFhd zFN9>FZ^=X(d+QDE&oNfCwiPZv#CRU#XBYB`yT2&eX0`1ZAG2>M`CbUe?yqF-V-KPB46jn zLOGrfuF4Wa)V(Ib5Z5U>3AmTI;gw*Hzj0Ou_5!{6La0XnY>#^^|MnZwlyb&!(-kQE zj9N(PlNrDIN@#rM4*BB8qI=N-oW11^8f5{ZjNJt=s1`M7(tlVi8*vsau%5D^WR&b^ z*eTd9LmfBm1M-<6$6--E{#*Os@~)aG&?67EWnJd;U0V{s=$t!*+s5$ytd7F1LhM~! za)Z}<69tV`*gL(S7WwoFH5~DsX5JAIBlZv!_rkb(`wp`GK`0EFjq8yM(b$7D7#_x= zP4*E;j#3b0b;I2FFR#eXEdij0@z_YAtB~;B5Bi#TLeB4z!Y9;Xl3qc({4rO!Il~8X zR(nBq^-f{TOI%Ok`Co?v!NToG3FtO^!6uy)LHZu!A2SJ0CTe@F& z(k)ToaUVvpM;EX}ChWuYreb{b+$G@+*6}FDUauO24vlobZd-?XVaCM2_xb%cZed2d zT!Fc7u=l>5xhSEz5{BM(hZ%Rr$?aMMXemd{?#z4g0*gXW%SA1lH3q!y?p)}LZ1etE z$!~GUh6!Qrkj;DZ13#PqUk`UEn;y@HyiEfEd5-Op#~)pg3~N@q12ejYFIG#0*$dDw z6+YlAwc=o-4dy+Z{LD|oo(}~F-J$(&71A&us#Ooss790gGw=w!n~Q$$Kp$dndl>G$ z#q-}xJ@UIe9GE85{+KzA7-B!|b+|@;W;&hR@(%%LSF92Hww73F2SZV3Z|L9Mi=592 zgtb^Ff5s_>6fX*Z^|pR+AnrOj(wCmIyhzm$((%k)!A;j`yzpuwWqZnCtzh|_vfY&@ z5qjV{OL0$6=P*I^lybIy6Derlpqw2)gbPc%{>^#aAYJBZ7}k5Bk3F_mD(i!FC|$3i zHvPkAaG7my8}$@LR2g;9)!7jurUxjvB7Q;M5R*@6zT2|0SU>u_gqv$ zQAEHNFi|luP_f@Vv*)|sXZ?KmYp=7;T<-nMo_+T@XNRzQK)j+y;TF#p%-<;*CeOBk zKb5M?XL!FzmOTSzukGg0 z1ta%kd`8|$#!sd5@y*LKSyT?4XW0hdWhr}!^Yr{*%m-sb{T zY!eE{i3aybejYSgoZW%;rSm6C#FA3t+$HxPaq~@U#dZE|H!4OYNcM^q;PV21%dG>^-4zK?@?8nMHPsL!*o zAKbwWtcy-C^uyoC_yY%6JM}=wM_()6(4JXhtXEzNNKK&D0nN6J2 zezg}@?jp{;4ycP`mlNj&x+BEV2Z*!lSuL?PlGy4_=_fkhA-VdDniz%aBl-6dS<_S8 zifbLY{Oo!^ae>d@oR_bks6YKv1z0@8-Y8rPVV>j)=$2p)$F_TgOL_$`;vCx8{)xhA zuRKuq#(mYFcZH1=nc!=QoPV`ohs#nS6>UP$n7(Wn*6bQP#|HKe)@Gv*#lv9iLvi!= z9A;P-4LkZ_uiiQ9*%2WEk_XygeOq&u{wow1_DnbNbzve0*W zn;6VyR{KK{?jg)y8qfC4_k(%%=qqo_U?IE@X#GT65ihXOPT0%)suS*0l(5@=-XO(w z?C4n!+3epG@1b^7MYLAx^C=HCF*K7nm;4?odTk}nU8ib`ofi`4-3AhI;x^)ZGD2T0 zjVHDTj|~!~_^y-lyfmh}=-xhiL3?rCu!bkIaM5sKYD#e+Y}8W`fBM>_hsb7u)|l70xWg zURQS}u=ln}z$PK*qdw?xhJo8b z8%R46!0P*lfCSgqUW;PcfWbkqj@g1*PC7ei9sn;Yv8MN3k*zNGgH7YGx2AU)n~L=S zQg747SjcjLJJalV=eS#hy zXY0quK-q6=u>Rt~UQCL_9*=0xUj{LQEbQZkHa~nwB3ow{0<#w3TKH!+s}Br9dYb+!8AeFz7kv>*nrnH zSK*Px73ht=?l(6<*s}@k2HFbyW=+DTvw84i5B5HG@54SeW`flM8`yth3ftI}3iHRH zZ(OvDy$(o%4xO>L;P6ANLwY=1_-GAhX1KApMltZ>t2GSU6TsFTiiB@q1J5tUGjo-2 zh;Bf8!e_Hw%*~vMzHz(M61Ji#2qq-ifsWaI7A^?{*WdP#viLRY&>;Zy@i*K#^E=C# z?hljWFm_>BOL3Q-AH2XEjTJ_!qE!QNR=+hwWY38+FVPm?4UyU*f#v**vU4 zN}M;iFBJ!kB+k!LR*Ert#M$7nL{!Towj-wgU_-)49+q~Ct&b+oMe821O~;Az5TiFt zw)U9f`}(&&-`Z*?$Pz0d^e+0zcSD5Fc2}S=742|Qx!__}0At! z#|@rEvbM>QFxC|NwVg|6w{*gxC9btq_FiW9RYPH86Q0R#y~9if27~7yJS*y5&&pB* zVTdor>w5fPVc4&*zyxz)qFRXqu*diG6)vz@vy-@NlE31)z8&f(rq&W?%h{-h&P1$U<_ zke6r!YI`3Eoi-Ohk`4Au-`a`INBjI7eO=>|T5Q(KOi&qX1E;UdXLnwv!qe9HTR69y zZE{V5N60qA7V8q{#X~RbX|>BJfN7kJ0kJvu_;yKT-*BIFk1zIs)cY5*#*KVj5l4ks-rk7Gyuda zE>M!uLo6IdobQ|(B2K_wD)MK~Nf|4ai^O?EqORERm14u5D} zWWwfNxVHScgxQ};g$bAgqbHcNNh2_^hPQ_4-96Zajq%{0Weq+7p=>@E17m(!!`N@B z?4W5RtV_o=QP?H6XlAYKe0-N^W8RExurY#ME zbC!5cU5LNUs{vpr-(L=@WP6+Z!PgGY4(C2$!_g*>GsHN^#qZe>D?f+=SFk$vgO!{4 zD4y$Qm5O+-4fY&FKDmQhi9SulR%dJ*(P;v)y}YUo`WwVH?pjOHXcw`alK+!k-cAhP z>pf*VaDPvJ9oL-`S^4XezTa z@rUPYoWWp9E<2Fm2Zb2-pRJwG-fkhzmWf#`MBdvGIhc8#XA6E3=g%z@nCm~p`Pz$M zwmz3Q8{R#^wjL$UJ$sw6sd(lq|Ey`(!L0jLV(8nvfZMs9*sfZb3x$m&cX7M}>!;D2 z{V(sr5@TX(JhJ*fIcu)15w=HGfDLkiNW>nk6^*4j)C+r_6MAkEbM!e z13PgIvU*3MVE!c?9Q&e=-Tbkjb14~~yt9S~=ih?2b|U0nv<9QV&g{aZSeTk*4HYv7 zun9Gha39yAS%G7j4%XHBh5H*dFMypI9|AQKu>XR|Vz#+i5SXAZmzlDK-LeaSU9R@v z&CJ=6Jb(By+Y#E?+q2PY{J{p}gF9Kev8>B}aPGJ(9JRG)fg6eQniE^tE~P%d_{V@v z`$e2}cl2SeFn>$V@a6p5f;}V7>fek73rFHyv0|O%C+^Y7=bXE9iMx2080tU@Y&t}2 zKdN?@W-2*{x(t>+1)Ag5eW>&+>Wlodw`3a9|I+7Fs28rrRX{az{-JtC*f6^U>X7s0 zdCtO#M-1*DXOsRO!t}`{^u}Iz(W`$7_F@=(nvDC>TS$K|?JT7DZdbLx&LI&N<@-tF<0bBgV0eO`_W)L z?$&PKg$m@HaT<9o3KJ?;5a$j#93=n(p0R?D8J6_C}(MtKF#^o$5nc1 z0qOI(X72yV`H8GKJC#)dvB)`XoSSfGS_wQv&RIV5gfo>4ijeb)o)ZM?@*D`3>$AS5 z5M7lHQ<3w|VVZ(jXfpgkyRqT5mN374B50u97#TBBIQ}OF`uoeF=^V%YGGYN$7Y+INuIVk+8@`u#6=s&Nt6+|_EI9BQa z?*=;yyI%OgON;{^(A8b&QRD~rP@fC-jpUavCeC4FyR^fggHPu zO8b0&p#Td+;_UUP5xm`q^N?k|q^FdeA8SmJZc^@fLgq1PrIPcF+92s+JPVLtGr%NL zI!npfUM*UhqU0Q9826u?Ep6JfKe%7l08b7zCpJ|8$q}@9l%ZJ_&v4Ed{(;|3Jv|v4y5F#e6Wvi)^U1 zgZq1~@!e5xi?Ies--L2L4s&l~YcMAGXC+^h=m)M=uJFxVi_={|oS(l|N8KmRpD+$I z1#>nPy0=_}iI}S>mmP(l&`luD!(R87Hdoq>ZgrgWD4zey=Zs6(ByCjc^WsK7X=f$p z{NI_uVnNgB@8;(5=)>f0Lsh6s^Y|^sQpJ zL59TnR=XvT^ocmn$U6%G?}+m{^S6+Xb$sOv+iUlc4wez;$nW}67iZGv$%8jZ4VCt} zqOFruOUb!TFGYG=X`i#A%A{5e#Cg=`Thg{lea`rBM+!>&e8TX-e{y!v=*Pa_uYd;R zy!NK25Q&@(;&I=&qo%O&B7@7wxr0|Fe=H*hd-vIZ{xS!?A|)MS(XU&6QI)sZmkdVe zKfipjQI>co0ZQ|&VQ-qd-k8fVFygc|IINA(KRg5XG*03>@my<(dN=H0T5JuY_DzwT z!}ay~%{Fj%%NEI9JVVdIHPyLJE|Pcc{GrxI9`_R{F<;~dJurr5=IXPOVOaI&ikB0F zY|4@BT;&I*=s$njT*W2NBF-bDjzZ`M;{5C%tRMM?IQQw(PU@!gpT&Z4(pmY$d0g=d z=_e=Ryf(;ITINamyzYvh^ftyS$iJ6V-OJLmM~H2`@IqRLaaQv2ekl!7Qzhrt=^vz( zO3p(cHvT8)M}sxk;ra?Ny^Z_)_xyy==_QblocraB74iiJ-HxE$IB<)vO3DFqtFu&?yz_L8e(BH^B+ zHRKx2m3X}kgD&;6H8imo?S>FZyHx>Dg0Ut^T`x#RUhxB;Lw2xpTB*dm zmmlb0+^mLWjYOj(`WRU6ZyWzkvVW`}c;K10chn2+n38kC;S(SzIe#yB02{FmmYhlG zx?a+mN_{pNJx!{q)aR1@d!!9YeO@!zQ<|aF=aRTMsfSXZ4}Q2SeP&5)KMieWkfh}7 zVcF84t%Sad<_B9DcrT>);DhScivHd5|JzLQCyy_{v-=O@*~uRjP>Y{EoFZ zhu3gwO1m-0&kOt;NuOPgzl447iF2pu!BPvQeRgp(mKrPlXAgHkMnKINF1s92f&p4%U!jmM_z3i+dV}tl_u~$a*D*!Y;Ji{nx4G z-#Z-yC%f3dYmG~Ks?Yr4CB|}8Ijq*tSnCIqrrAN5U$p-FJYQ(Uy^iB1mHNgqU*N|% zf%d_l`fVQhLeza1cww5uJu)J@@pK9HdQ|T1zw~|!c3+6|gXWr2Yvnp6`SWV&utKsM z=U=)=J-vvty-Bq6AjTLd^za29n_$e6T-H4OTWYVg8@FY>3|1@c^N2V73{;itlx}=~ z0~_2sm(TBUYQTST_RuqAxoxg^Y7ivC6-u8S>fgHo=L}eBDCA4ErcWU(cgG(4J)%=@N3Q`z>o9RP;XSh=Xl3Jg$=G>R$SsY;u(t8 zZflr*BA3s_nrRDMtsx{hgSR&ef-6@5isf}yuaadp7FNr^l zd-xMDH(38t0^dH$7kha-VPC3PUgx4OEa6>X(Zk&ww~{!o!x-Cc%5};ajo0w*4{`o; zdXzM62E7M8TsKPJ;9j+yN$T2@(p&z-S!H~Zv`o3TtYuOvz5Sjz8!oJqPB=<-1?IHk%)cgw@GPE0?M(<{f+h?<1hr%o+msFBHxk359eV5AV5LsFMVN1%5}K!`2BO9R0!ZBgQ0L zFck{a{Gfga#v7~b5)xf~;TXng6=m%c^iTT&*TxCT<{lCbp7jNjD2(9?SS;CQN}T-; znSnt!TBnTN^%!1sq&??R+eS)fEF#WEtG7sR-6PJY+L%f|L=oqkLrtYc38c@t^Gu~5 zn~0%Ssj2kIapIgm*Gw9y^q-HLnn@cCXpX!e{p%&9&;RR3|9?53Ic&;Yq?M43oXu}F z3bpG>Kyuawt_{i&dZ51{=dA4(DM-R|;1%v~Y<(9fTy;-}pFJ=(z&B8MCrySHkF7CY zHdGiDngIRJT0{5SQNjn?7-)Ie8ZLcG6l7Hquxc&76L+Tzu12A-beA>UYAzG1TLr8O)ycLuCLeI`sPeb4>t!+MezJjfe2H+my$HJ-FdoArM`$n2g^cGIW1x{O6fezy zi|7Y-d?*wC^h*JE0nf_k6$$$-5+OU>21<%<3Npi3$U)m4wZ2AZ@`{9=8*D&j+#6wq zN*Hu9MLR#>hfo+FgufL$E3|IKdZznB`c%Bv)}2`Y@4jGeU@N7jCLKz|(KN zne@3Y>xnD&5x}!rPug>S*|v?ia}K=+XK$G(4p>HZL)+d!Y?ny+ zutVk;h{os-%DH7;mx|8aiSyMKQn3=_A?4!(qBv1KoESFG(G|C0Jf3_!On7O?&(M-CBw2)!vF{ z>|`-TG_j*P1~n%(h=$>mQ?G93B>rqpoUd;T7CXh$`BaDRY2q7KIyZT}I!$zmC5Gc# zpBD$LC5HD7CW&7#r%KMvIVfJ#NhLY;Vw@Q9p7J#BhsTMA1Bvth`qBSi&d(dRuuZEf z;Efi>PH$_&w5_hf?oF6q@aTo`TIUkT&LB^t=fb7yGB_?`FUb1$LhQh7$bE@%t#K+$ zqgguKYHtT!{X4Q2Ym-4!1M9|^_h#q&C&E$8JCO0i*dN>@eLTw!wi``g-TWfq0p^3K z?%~*uPGL}qF>*@=%x6CegCOIA9n8~Q&AO`wK+EOW`$=;vD}3b#;muOI#Y<-BLZX4YwXCHTz7*y-UN*ti>|@X{aa!(96!SUkN9ho52o!q@M@=xhP) zDAu8JYt6Q4<-(gi*u&(VDw{hz6P)mDx^w5jY^hr+1^;EAyZCKn$7fZ6+GbnGaPQ2T#$JabWwx-^ ztT|g5Qv?&I*uiSnhW)rGf*zjVReVunZMNit{|`GTwjIhQAI<{TrS{OeWFq_cEDZ`{ z?4eL)HcN<12A$XTV0>;Bdk~Tc*N0(_(}7*g_C_ou8RI%S*oM7Si-K7PG56+z8>`WvyRZJERq?|2!ZHguo%9B zI3LzuCC1wmXNY$aw<*^qi*^KvUS7m`yIQ>18P8sIM(=_TGf1va=w0yWFmZO&=w48YKAL>~-pl{ZnYUig&gTB>SYg^-?iDp zpLouKac0E}XS0honGl9+rya3tS=5a4;DLRiYL6aZ2~*BtZn7f)=g2;;WmF3*JjBH-;3v*cH^4e)#3O=DO$mLg;IuwkrqB#N6 zTNS*(^@n`Col}$eU;4bPoe6uccN;W=Fdv~@jm^<7hpk`-&!n9hZ+jKopV`6alYLm& zv_epGvxj?UMzj8FL=dn}RPiS%3n|Qpg(VIUF>)n4y(1gOtiv2<^L^~SUIv)Ha)jIG z9GRg`D&(7DY`4K_R*$ic->ze=hufh{hB0^+gRqXn+_UW2=V(}Cg|%!PvRKTQ2zb-d z1#H(}WVuOUV5#B?En=#e_r(y!v&0NmSBIh7%jujKm66Y1>sp5`s;;dDjBObp*JiiXF5GN|%gKt`X6Far1Ia$+x zi09f9=j_T4Vrehp9MPptoPj>C{QAv?R{kgFNR8D@YvmoV&ceLo-91?5qnluN1lM9Y zs%&@oH8_K7OYYPl7Ftpaqfl>m_ngGMbT2_T`Zq(HEnpV40$AgEbw!mKGfmHf-58&p z@y3=7j?IESs?K0q>d6)*r-LrmzBpGM!U_sf0F@51nIe zuHe|ZnDyYJ;oT)yNbhxrt>q(#?X^!#-IX}+Fz+C$Y$MLI#UWyZ0del6X&~12B)`sZ z)kg93Oyb<+X(y(AA-i!d{Is}Rk2p8X2opDtCx$&8FNoNU$9P`39@-905_6R2-Me?@i*_$)Jg0lU z_+E?TRblDkYHQ+L?i?>JEF{jw@qr@iM4TV0IsPYS{Wpu5P5nLi@g8$PRC=;D=C|O| zM?0{))QdH3xCw7DXUXEoNVeSmI!sh|gmG65SU~v|=m1!oAjpLEoLvOhu-=V{>rs|o zc@b-9VBM}mC)v3j4BEbPg@{Se3)t8B=?eL-|1Gv~{W*oarSCJQq8G1_ zN7OX1$e1XF>=ONp_3#OUZB`gB@v*JA`fZS6+@i6&xcw+`UgI)Ubn8v}{BXx)ac44d z9(iYh*kb{$Q;z$YiOY4#e~w>kBjz0^zphuLrxgn=Feb@xX)Q2hV!F+lydoIaV$getAut_%O6>`_db!^tHvkJLe4b|o6zjjq=cqpM6yy4l?9$autj8X$^6|4z zj);=}#Ce+TCeg&0I2#S0E6&Iy&TfgL#J9MADW9*_x|29x+e#rfQ~c5XGx!;@*;WtX z68gqw3sqUd!F!mSgMDgDd$Kbbx8WDs;X$`Xvcd^f;EQ{|N3Tt1_AhUO>MN|3wqYY1 zbMFSIWw=7^uM@2CV6o!*E;+HR`2b!azp55kNrwvxxzFL-%-xf0#mU>RSrNt|$nUMG z>mT;#M2tdC@M$X!J078s#|=~!{V;D)KF9rVKe4SCsF3$Yju7XSkY9J}l8*TM3E7Q) z=?0?RH{#sw#3C`E7x{RejT^LY4mjJEvV5^LWx_YuUoxZpNR2|277|2O9iJ!Y`X z+G;pB4|C%DJF~i@4s=@iIJ=_}EiAgLU!i-c$u<;ql=F~g@l?be*xcwhCwdeup*SNyP6Q;}~ zxJ+@)Aqmdx%h3Xbd~94Wdw8B~#U9Cd_GARvif#pktoazS6)Ca@tkQ^V#kN@=*%}Gi zif+j*#quJu6>~Rr6@yF3R@h7WiEoD!=l44_#UZJ_ivP9apGo3|*~Iy($28GMd7jdq z8Htnb6X#crE5w|y#QAgP8nLZ%FM9j<6{1xd>Gq+HbHuwC7b)l5p;SlQF`0Dx=&1qX zQ`9y2xJr)>V#y)mtg7>hNk0(h3D+O6BUsN%K1Z`OjqTFhuaN)ExoO4}X1x3n1iIqd zzpuJ#X9#WRmk_o z9%Cz}3UvL*Q*2abrb52bKZXt3nXHfphvu*jnWV$_r7 zk}o~jb(;9(KH2JgqgkTCaALmn?F_MDGwHU`9!`8~L!3M1PZUQTC(ic`M~b_ZKAzh2 ze&RBW`;*_>_KtP}Pp46mp!89_!s& zrjXzB%b4pDvK3x-`&mXc>9E-@7iRaJ?6BG&Kh{i_?C@>Jc(!vsu~jY1VSkzt+tz)q zuzC7qAHJQu%ffFE&$u2h*j!)YdHdxjW_Fx-?&$fO<(wj(<2p7MuU;pc9CNg}_+}FE z)GbsIH}S;NcKUC&eLmR=-{*}iwv24WE7Mo37V~1|JU3a@u_?dzvy?BpZT;T<~X z+0u!`x$h@u*2$CXMz-%7*7-l|M%9}R?9SO5JomSQy9MWj_Z~HH1lREUnu3Is3pH?6 z#|bLW@bYsFj5&q1g0&n3D6WB1b1;YB*I4-HV-1X$iZ!k?rwOmZYT@h=7tAf) zDO?>yoO|k92& ztyp}aNVxqZSTX+E?yhjhggC!ddo8S+OPmMw{Vn`-@K(%GztfhTd`3Dv)xH}W?oK+q zeMwLD2K&XyuV1pEC+j+jblCE3S0=U~&USxVvF?3|^Vy;X!L&bd&K+GLEO3~d56|(t)$tp9)Iv*KkC-Nh^LGksF$UHJT(+I%r7FbP?3@!H zmQI{wrx^2VFA(Pr^#k}BZHRNTxvykZ-o#nOF9NP2!Hwmv^U>5Y~A%~^F!kkB}<7LK36`U%@=_<<_5 z5NhNA8=POrqK4qR57$L=g(Ce;<+bp^(FNSn=SV6Z-BBw|t0mSMyffnjqqQ za;+Ap_cl#2C)H#z*JMeYFVQ%ULL6W~SMm=9($@@m!8Na8E`M=a>V_xsFQC zlfJa#ntvd+(?8VeCsiC%T=U=h{HDZIc)p?*5-`rnyys|sWUE@Zj{C#yy3CQ-4622_ zGqDb)UxVasQ7x3Ce|bM?G}j~$=j^2I+!J%+eCxM2XMCJEPboaly(}lrxu#`Y+*;xs z*ZK|jc@J@(^}Hp-yAtQ*w`$OL1#zBzVkitfL!6g&n+WSV5a$hVX2KaivdNdSR)S

      Wt%CYb#M3Q86ZE>!xcBKs zu1g$^Ck;#EqLnc-yRUn2JFq^#{QAe=9_3<36X(Yk^SNn0q|fbo|CX$NMVt>GZql#X z{Ws_K_I-rqOKQR2*A8o#BWD?+XQSz5$BCx_Q5_cdiTwoZ4dFCiLJJ4hFAcuu0`OPt+9mr6pP5N9)&4f=&0|K_|aD~#_wtrph!*+EED zq~znf8jvi-IM^sXZfY~MA%^Etiv^^(I#$dR^EcT z3}UsX^dWpQBK^#LdkaP>&qQ8e56NTuX}qZOZf@cn;v8w9D%4>9qWt<#>dy01?TGV` zpi2rOq_@99}4+>i1S1h30&PzoExt$ zhY?MQivR0!b07FVrL~Fb3EbgUf z6V)M`Y%;tARDP4KDCut$1qikIPZ#j11`?Qs&d^IXwi{aX?^_#kWQ?| zmp7A^A0vPGuGc-Nh$Pu|!V>IFulz2q>IgrT`_eV3H-%BBX#8@@1|id)=2t$L%P*Nk zzFZ{sqp#oaH|K;U$0SeM)j}+CUUEZ^TUuBHb5=OO!sotR@a-DdfqBj|?_A>=m)F9B zlP+NPLIu7IC(fIE`$NsEV#PD=u+xQvuXzf2+l6ItVG(goA9Db9lo4kEYm3i{BhH`R z`9kS>;@rzV21?^-ZK5?Q3$`eIjO^9L*k74!#W?qJ$el?xnZNJ?isq6I-#PvTWb*pi z$oZXqbE$R}v7M^kLi+3_v5nB_EY-b5Y+FWjl)h9WdH>mZFe@f`aQO*{-%s<)EQ7cy zo9Q}T9%S>{9yD%pqMr9UOY^($*v98!%_sT)y*YipOywKt^HS_bKepT7oKJYR;J&`B zf$0HQLv!y=&MdtKUaWM0#e0&uQOMkGA=X)rsN(_*YN6801@`Xj3M2pABc7kfz|tb( z{O-X#ICY0OhxOS3-rB^u)YuVrMG)uCvNOhAOVJI3N?=isZ|U4=)1y zt7MbE=ikLxG_n<$o$FzgCE1Dyo$qjdE9r1)WlL$c3UO}Uy`yv&orm!E9~j?=D%iQX;{Vc8F^+#}A7OZC7bhB)s^SPfCR#Ch2|D`>Au zoQ=ny1fxB~xz(OfFmF$sO?IR}k0r#pXrBmA8tC1peV`I<O8Q78y@{LM%7M}=ImG1E^C8lAn2R9i zGw^sf=|-$uBbQAyML5xy=Buo1;&yi+&aw5t&j_V!PU!T2uf+Hr`TVLCMtpEr`YdxE zAoFcTc4G?mqrZRjZ_YKz4xB8$2D}69;9Y4r=XRzBHm${ac`8-hh?E-8$2!y@tJ*-& zh+25);{ua4HDE#(ao$oj6I7gtvvwCVm>Nc$H{+mba<6n zSLsIO8IyB*FKOTiViKh@K)MHO1IwAb^cpJNIGvantsWr_SFVe1q^e6*juM~Dpj$9? zAI-N-Q3H!xO19G?WfjpR@A!6|U#qk~!g2}!us2=P*`bZBxHVnJ3H#AUO!}MicGGC? zgj)?52H8Q~xO8rbYYlK%XLF{(Q!X{32JT_K?6=XKVfo-%5d2->?3po`i$$Eb`YeF& zTZ!|JfA&C}6LDS>kG<-z66cIH0btOSpm^RXiHQ(0kvKPg&4)hUf)(R$_uhb%CVKa2 zBtC%wnPii*t~J7(o#emeJZmo9-Ii?fdDRZmPX~x|cB!h=;xOsnh5A0yp}C}!Z^jOi zPS7E4#oTadg-q##C22}OZ=>J%i(`YN#i}H47wTYr32_@cb`<;yAhy?T^wuAgNb>mB zj2~7<*SxxYG%vyWi}LTWdBW3t_s+z*4Exb*e>|cX|F_*3pq(0q=b5zgnQcI=Hjn z`uQsPw=OICN#{MHcUE=5Ybey9`BNhFVVW|h`;5&%Nta~e9QiVZ|MitPZ{5&`zk;!H za?ZN1^7E^D5obBuzG;7R_S$&3Zo~YhlQ+1GagV@y57y0J z{f%3*=P|6i>H=ZX?jTX>^VJDs;NEWH{OS2Dc!xEVqgMNL7c~7kGM;3iSuLZ zuXevJ>GS?AL7*B;oWoSkLd7o9=Y*lTP&9({xoAQ$3~eCJ=gh0%SqO3Fv>wA^%v+QH zujGMmAwU`D`M7Hn#_^Cozq;N`y8ktCco^JL>ZD7Ya|g7Mo^B-0C1+Ylf_f4Gpc8tLD2C^GhyC*?U?293Pu7&&ss2oe2)5;mdX_G!r>3;?dG9~0-U#W%TC>BRY`-8=5wRpR``vNfDk`Wrq* zJ+aOKabEOA0}}j*bM=RR;MT&RQtsS}1cR)RHyy%am(L>!gkRekJGTzl&w>l$@Vj+LK?}mpB_@Kl()_ ze{-(B{EYiNqY9jMV(&|B7j8y$70mr*4+}MRaFN!xz^u>_JS}!}1F~*oETl8m(Xi$2 z`rQS~1#U2<%8Q%aK%8UqBRLUcq~$u0n00}BJ)8Wx1%{>EVteB3x8e!6s-8F>PyfNi zKO)X=UUYzE?a8kjSfvh`9^`L4S~L>sRmk6%`fV~4m=R~wWiv3hn>e%4i@;8~S3GvI z2^`~zb610HFytTNJV@9NU9S=6(@mCe#hy4jH0^_hT}du6(S}@%JC@)7lL{AZsz2$l zW%aWB{0k&wi6Q=a6J677(^*;faWwy3tzo|QK;k?Y`_a2s{>{02asyZ9a~-BGz_{)s z=A6ch>!2>P2W?9oF6~1ZxUR?E7&iU6bKT3KUg`{c?yGYZsW(ByoZpIOL%ErHC5n5S z)KZ%>nVGMUr~IDDnVcZb`)-?X{jLz_i+3!!vgy%^Ig6jUb1h6l74nkwP;Ms1^UI&H zN=W10>yZCEv279e+mkpi@Vv)8zfGJyOW$y7Fg{m4f289duD3w?oE6v>oKZ*Q<3Yc= zDsm9za{H6Lp=JOvSzkB+uDv6+-#7M#lge|D{pTNW4~7%NpXYmVNsQRWct*?KWRa|+ zK9YaaNONTS{bdv*Ax;iEAI)M{4DMSYj4NoI}R=NOE?P=V%(B)!GTogQyr7YsAFb7M{vv1-y?$*%=SAGrkbE%fjJ3Z@vn44HWZ*I1 z0jB%j)K~8>z^+`ZpuG_~(Q59TxBb9Uy}yYqwL{Y zsk3ZnK{{yRGmPEq%isE)0g3&cph>5Jj~jmhcE@3ly8C^FoTFLL=ddf}T+$UbxhOeD zFBZBL6K6ZgR$<$U7{xtY>TD^fGU99;XfJ#UC(e5hy9hZ^2}BY&jc%Fo|Km76XE$DV&1059U&HLw#oT7 z{t|>!PQ-Ba^8jJFGOtbd$Od8ddE&gWO;4;fM{_O&W%896ODq4ZRm%zd%fZAsZA~-T zfz8DE0rsOGu<>usdP`b^AO^z{%$d5L!*SNhL7{0iVKA(tWVLudXA8QH6OOFa|E{$=ECK)Fqpi~33@en z3fGM@aSTsP&GRO3^ni_IzB^?nG$Dh-Ah7^1#$MheN$LhO`NkEYJ?qeJ%YjbA6s1CI{Y;mU2X_lZCDVt8sR**)|OG;g#8+t)2* zhf>bKgSFTL{iY57Si=YQRNy(+^cw8D?F048>|yDWK0&Lnx{U18UG`YmWnFA0;Cc7Dp}IKgr{adxh=5h|~f{u@MU2o30$ z$v>+;Jc-}bkvKoO;3&H+5NCNm`pvD5D(3v#J_owp;nH891pUd_=draqH}#7<)MJgr z;G`20>x~|;4Vl+mJ)s|sz0@b+et}x&WZ6^nY2ycBJYI`c{BFrfknXpGnJIC+>A{mA zDaBsK<`4Nb0VkpRSbNx)+(z)bdJ-CAvB!hjAYqb*Cs<(|&g!@+g7lgv)MAWa+CC$p zyuk}ZbL>lZVvA7Sa2g)t9&GaUBf|Uz#QFU^GE66RZx4e53&Ko~lNm>*G# z5{6}vp6Aa=6odgJA9|fCXfxtm>X#wRQ~E01zoiS)l<|srl5;|>GKV7LT!>JFXVG$= zANSb`1N#x@5#i&6*Qj^$@#v}9{KO{mRSu8$lw~(3S>BIc{lMRxAL^xWd+e}}*ic)5 zS5GCKF}Lo%4)z~$wvfEq>H;H|Vo$FAfAnqfxvMR(2aU}r{pNWt&@93hj4ZC?AH3xP z(reiNYe2kg=sOqK@XHn|X0+wk{dR#FxL>BbNtbuTIvKqzF@CSdHvZ}+SCHPfgE0;# z_~d783ubqmxH%65?sOZ8d{(qQ7uh57P>Fi%>}T+4p5EDcB=hW+SA zUHhB!B5e=O@Gbs!aW8e4p@Sstmm_>cpZ;UiK*_a^PB3bMEiA~msXrTS+RvG`AVj$9 zf5jN3@2KQ_ISP@_Ou#vbL!7S*poB|b3ctbU}~XcPu-^yAO3$$kR1W@~)T%BcHRYEQ0sz=cJI+GP3y( zZ5$PHLqY|AL(M@UAOG=~&r-8j$l8%5{8`N3k$-lq#G0Qz$wndXTV~An#aI{l`10O% zyrm7vy)Bo_{H#gA^O1^ZJ zs?KwPp9kzf!@0loTod*yXl{@Dfg`2cE8QXO6XwHe8A#9XcURnh@R&8ymT_(hxnH`u z^ivyR9+B-LmE!%#pRu9tjC3{TYs=-ndm^OGqlo$Njww>DJH-4_giLy+Ey+OvrP7A> z#Q)Ed`_gf^mXUup-mYFcc_7Iqjo+omU(t8*F0Z-4t2~m`k2Ff7-AIn}E|ID##{PY;2DP8y4b?W`n@3R!JgXqKdPJJVG!!fJG2{VI(J~_ZfEeGh5e2_ zT1cBLoc|wNXC7D6*FAof%u*Byi6~Jri@JB6lX(_0rp#oPA)$NgHjzx3B577KrG(Ty zdsi}K77gYxnWxO;x9(l{`Mo~h=lS&4dY#wq-gDn)owe6qd+oJgl_#E&e_3D?n&h|R(C^}xrxl<8#-ry0W2;IKPOP&-~n2Y*v%xvIdr7(iq}Db-$hX3D0h8 z#y9-kLu43((#RifgBXT+a2ok!onhibJXfWWdoCC!E?G}<^}#XX%84YaQu~W}9Z8-C z?L-Gg{Qs%XeRqnm3Hg*Y#6C?665#a|>=)lM0QL`g4h^xE=N4SU$38a|N=Juc9dguR zo1TKl*icxF^(HP&8Ycu{Uoh82*bDN5kC20F@%Lfa2XOLwVKzROhX(?nwc&1|Xf^8g zMeGrloGhrZzEdIDuP&YeY;8<^Dwj1_d^}QjC$_xd6^iwm(JrdsK zhhm-PK!{uaUij@D2KCmdpw0+AapHI4{MyG@^uYSJ8V<`wwiX9&Cg$yiJBZ_V5cBSz z`-q<}5NG40fnvF-j(N#gaoJL0o?|dwoR~+VKI9UpJvmKwogdk38r-BoscO z|6RDdf#Bd83Ipr{;CZ_q!h&9*a0+ep3g0P$w*%_)aO{y+5+KY+dC+w1v0fA@lfus4q2PTS&nLop!9gAh7RA`_)v-(n$IpND9eZn9zZAv} z4TVwd0>Q5HPoW&2sS(yR_>*8LR!#_ov@O{8XM&L!GZp*pA#-cTX5x$Kq0qcFp6~e8 zT3l>`earoV!KQ9k@laD@{y0Vy?OG7?#P6fU{QksTSnVk)HxXy+uM5Oh&xv!Vb$;S5 z^qDoR#&io3y;l>(dyhAZsTgb3j49~8O?>l&*w*{LMeL0Ee46WB#0}!l zUH{9u;r>;y4{h?&`sm9wy9eILQ)q_0V!yT$QaXl$2?kxizQ$(Bg6ZE7*pBtnn|?bj48(QW+W=fwe!V2D_<=qKuIsIz zJP@4F-B$h`N#!aejqnKRmrfziT-dm#`y3~hB#x^Ve=2z>Cs z{@nu$1t+wPUg(p|^ePu_sY75!2-ZOO`bL71HK8fLV#r=n| zw^RxC{(Rn8v`P+vif`DL(4nQcBPImzFA&mJwilQ02!Xppux3JGXE8hiziV9}Fk2@P z0`Y$_rupQMDAq)O^2u+sKMuphr8sw=TOR})*(9;JfH<#9@fK6@S!{Y&J7cnekIOXB@vjc2{qhFz!c__#m2f%34F2ZQkr6{!33${!bT%LtM(+>Dq*VYRo z(AJst2mn?TD>$COJQ^_o_{1!s5Ax|Y8td)56bZ4ru+H4H0FWKK9*woaEuGS!~WFW zZAAwN0q4enQ0dS`%!}i#8<8AsA11cVC(fTg zZxl_@C)ND#nwy)&2s@IW7;hEl1rz7nn>LG^=Kt?JcqW?@1BPVlMaSJwtWBu_S-M$Z4Ci+Z}gwnW(xK3 zoc9^DCtH4<7v9Xpci#!U(>`|Z1oxU&>rJ`F6bnxFfMdbFAyfC zcNYg-4~A{HPhtGVSsbUvUUuUG;Z3{#;^Kj82;RL>e8=V3mEl(0mokE}!GOw(0Lnv(< z0%J#^uXyN*z>JU~+Lk@Zp9TM)!4QJ>e3pT}_yTi^MyJ# zdg9_0*t2^Z*0AbiB39vfs1)=YQ&u(;&m+T$4CCkVt;9k+k9O={0QelY79;U@3pH@A z+-oQ1nFPZDhd}HB?I=c$#Xjt~&&OZ)5N8AgL--x+1=*~xSb#CzD@%f4*Ju#?zYT&t zXrt5e2Z?%E!)FGbsrT|~>&JH%JbW;giFVs& znVZmTD8A#!e2v+1;kGUI32lXXTW^DKqBh!jT(d*@ZXvER7*3<_-spX@aO)EGI`4}8 zz9(i1Vg|BB|FF6#7bZpF{OpQ7Vdq^IQdGF#i}R_OS(#w7Fj(8GGl9D*T9V{>-ui7hOGK|-5TE25UDS34N0kD&kQRbMo&3W9r= zu%=dRWAXQ+AV~O#Yg>O)v7JFMH1Z3Cdl}|p66P|=j8V5kT8j6P>w1+6>&RJ&F9L(0 zBi4azao$$Ej(b%eJyEAW*^9=#@O(C|A-`{S6r*t7(8C(g`X=4Qi4(Cd7sGLPdWe?? z;(8F{4FB|>qu+R7zw=NCF~FG5+h}-;d-NUAhP0dV5VoP6EJQz~-4Y|geo6@BBlFKg zI|{Qphd`nU#z0065b7b@JTtuB*Hf^68Vp_*=m%D;6ebqn``a4lJN;1M(t%*8LjDdr zw+b&e27_kpRD5KwuyQHB`^dkMb&`-W5$pG$&ABw}h!8Ab9}fZ7o?o+sZykf-FY5o@ zNs_RyX)sJd{hvSmoWS&OeTMum8ebKfz7GO_oM)AbZwvW%gRuV~^7p+bSmHjLUM${Q zkEcT3X4ALSRM!y41NlWx&%Q$ zD;4bdqc48Lxo;=NmEjSZFq2Q>G&*sGfFh*N?1$Fx!_M1A`Jy_c_Iya&S9?wFZL_Pm8 ztqPKApgyB*$=}>iSp7N}b{HY6W0t~nWV;*r*IDH#M91NrfVTbhAGzR$x*CD=X>#xg zVeQ;txQ2G#XT%i2X?QT~YlCxK*gPS&M=;c~#dYGx6~f4t*k8f{ZTQdtp=PaMuteYH z-?Ba#ydxJnKLqBIslCU3Zw=6IX1i#w{gbAxLrh;~%(~LAB^P@^z zgWBdsrmzchTddH}X*1xoFb;j@Otk;Em`Qd95U={MQK^tCXqJUnQYtRRE z9@a*}b^I+WYNIYKNQR}DS6L7BzkSLnxL$y{z4fq{woNEx4=0r+EDoVJP58>p+0}CCv3P81S)(M zMXwtPWq6ihlOwM27nllj4h6v_v_(6@%>@f&Xg3JuHZ28tIL16DVV`=N)`hzY*VrJi#n?;OtM)=h;Y%=9)mf*{ zS)V2O56tfzjcji=?kc~N6AIl>-udy7%+fRzG=1u)r6tKqLqeb-%13>JWL1sOKSBB3 z3s2d#H1q*bo-luaY$EDsJ(TY(>LHu+BM8h1rDDFN1IpQrtz@0OgJ3YqQB#`B zo_7d>g(!~=Ya&a)GkUvGKDM^LtUktb&Z6va`j^Yk7!|xgIlkcymwp@3FGD$d^EMaD zAnap~@(c5F=a@hhbV9l3EYsZf;VSrv@1s@q@7$XERA7hi+SLPV)JYjCScCIO(#vA? z+e<2FfOB-(7aQp#_Ak!ESb9}#kkqMl5HwBJ^s|nY`WC97)kCyz7NezexJU6G*H(u1 zGo`hdOEXQvIo))LlvWx5=aIScR zM7c~ky%m%wf681Sy}rH)Eb*QL>)(^iHf{tn)aQo0IkUWs`;e&5?=AYXMBE>VM13~x zvxr6Y#&bewTVAJzvu^#c{|4%F(6AVmza|7Opq=sje3Wf1#(5TXdu$|UHvNKO7INq@ z=LX|wGu5c)0V^J}-CjY^3H8Be&PR3<>jtIc{Og}xgPY=dVKv&Kq_%arFH=DR>c8J5 z6F#?G)7uUGA8x@re8;}eC}-TY<`#{DU>43Do^2iY+7>}zfwF0AFMiJ~2wLO!8XXt7 zLoJQ}h3|#;Fz$)-Ud3%CILvY57kjJV7REYb!$w$$O;M?_;$5cdgQAqcftQ6gj6nb796ScEDg{czoGvR>xu+3^T^{ z;NE=<+;Q&@e^+^x8tVZ@z=Q=%NX;`P|9@^y9DSCYDq4iL|LjXLB;QHlz3R$#0kY70-0u-AEH0C*jU;)9;6ARgl_Zfz3yK0F)P zKT5M_ahTV)4g#Zy09clDg11h<_h=Qaty-SuF&NV*M?W*!RN}mDAcTA3=XB5KZBegZ zxFPomdAx}$#@*)xz?ipcZiRLuc;o-&T>p3-P%XI!=W$Q*gPo83$hymL?u`<{!>-Eg zZ!zfq9Q*z(v&kKECku?8C_x%$AbmZ01oy+0;MpTwYH;=d7{0=OO#Gp=@O2!F{-T5u zxivF*9SscMe<$EO)zXTad4$8w)d8@%S0DcP@p`zHh%u`nV|iv;7&O0wdusNJd1fre zW^r!1@+_El&A_N6!h|@ zW@wxn@PX(O$fVJY6kCzY3FNN#4 zzxeFxA6eAXOOSOD>y~fbDC=dE4=?aNY9Os}*?u}3T#hN>bSqbNNpJ>?Pf>!^jbG}b zeutqj5qs)Q@|3n;H~{UEm9VuaO%mS4L)jrER0n>Roa163iz?zWuA^dK37`#G1d;R)7y!TA3 z?}$F7(V=5Js~)Yp#R=#6weJ)=8q@F@Z#b0JgNjanxCi<$n)P6vGj;N|=g`{l)c8hu z^G?uu(9EK7o-5iA%@|p>ab5@9lhw%ov>SsxPs#gvR=`}`YcYRTTRyj}6tLhs+>CXQ zo!W)Eor67Is~6->^)CSZ1K6kL;6k;@7D{7}hrdjdH3SAz4`L(#KQHOl`ZeVRDL_%RRWE+2w*`M1A z4e;#0VZ<%AzU>z6Z*1M)l#c`2XPorQh4;>)eSy_jW6E1a@zM`JH}Fb~Cuo@Dzewb} zaQ&!}M|8^P&bThr$btMh|9OYx{9gKbiI{`0xn6j&e%>$CeT{tF(Kzoi&Yv1N=xxKi zwKxxI+xj5%B4 z9|g^W@SW^!%Q~Lj1-BOCdTfR>ix{#KCR|m)0MGI4M9FqgDuZFs@PjO5)>iFr9Q?V0 zO>*0$m8%jO@v2j_=T$e+p05j}y@0l_NAPRADRy`2;c|ZB6>(-ETX@PE;`w95LEf+r z$uTw0@(T1E~=lKcHl zDcs^p$oue0-7n!Xe2!Pbv6I83PMZp#3gg#>p%IeOG#AY0DPidAbg3E3f(;{-(Cq$?RR1Jz#tjeex^bEb-)SxKay$>N;V^1N4=$IH zZkrDp!vA2rQFHzHyJ_42{dSG4=em}&horadzlHMDn{@rT#U|cGXG3_^Hh%pCaW*#zss{ zfmu%!;O;(%y-7>N8qo?^vwRBMs)&P6$oYWN5_YgG1}5ym9v>3|S=gy)jHzHAPS=g> z@Si=n{~HJ$#_VLB(y{*|`nA7Y6WFcM*vAbybhp3DD%TR{3%zRdH9(vzQ(N#YJBV|s zXwQ9z5$9X_F5E!3hkHDJD0di2oNpeOz`JcG&iCDC@J)Y+r}46R{DE$-@L=olyb#yv zn(v*ubO4`po%r8M8pxxL5a;=?2J{=jWosS-ZaO8O_!=1${Qvl8@z$j-CYy2z`!ip6T%~Y)2-8gV;kA31+ZDy`>_CuSO z*gI0#%USO5G`#$&M9bzTka~Bh8`$@beywVRb4 z?TNjN4O^WK#n|KH$(f04R_-CF#vZ20wkz0x{V7n0eO0bxgs~W_Byd8`DLr?xJ_F)m z;288nG7?ywKl`ChSF{h?)7f3S7)Wmy2bC#}KKj_Y9pntBphpn%A@ZinFxp1O0f0{@6 zGyk+3>VgK6^?(;pbrt(LZeJy-tja*KUkNYtvZQ%wm!b6%?1$dugH*k*01{kr9rVC2^`v4DQ;b8!~bLA#%LY$mIv zj{PE;UReqZi&B7xGJ$6TC*C4Yx}R}?QMwjLB9a*Hj6mVic|4}7z5OdIh^aqr#~Q`<*)4d zxifTq(osWhu$Zp9kEzXF(D&4g?_u4L&mFQ(EB{lUi%YgiJrZ8PK3ubp_D_=rwMP3K zfxT4Zk0h`Cm*J+n5~42|vAgI$dsv~KTR5`#nz<1CMge7`Mzb2|Z(Pe!Kx=a!mNq#Z z0wWagvQ;=M`&2aMaR$V>Ym7Djm`I!(7!#JRT7e15qGai0BiIX~2xI7gjY!=14PhK5z&1M9fn3F7It z+?y9-+(UES>Rx^BfoD}Ta!B!6c566YKl1WC>wqx;&Go|D*V!8DwOaX~oLkmCDTQ8m z0W0%y?i<9UtY&5K8U44QjE~abjhDef{_vAQpF;PGt*1ba_r zKJi)55^cgg4}WGLPX{;bV`aB!D@#@%f>JMxp?W5;KGvx)9Qy=`*H5sG-I8IzI$Wo? zU0?&RC&2Y>0q{+BpUtR$xsx&P+_n)0iUus<)# zo$T9juU*7>z@4rHxFK%AYTCvcBC#96#KogaQl{`1{zZ|?Ae z{AXX=#oVq3aSm}?!~>&w$P!?sn{r^nY2;};gUxlyf=hl1u>P%L?$?ijzbp1`8?=*^&pZUfL6v)MzK3dyF{On9`5$??9XbJB{FNZ_zqs z&uVwxJDoV2&YZ&gV;oq+=jY+6d?xOvYvjSxC-Y$wi06Tc-T5$1Jew>Y%1l?&_2#kp zxoc|Ebq!DVZp3-`%=vwfM*IE`=VfsfQqIH*n1#KQ9&9X>S{yIY_O!~#c_Q_AS%k4} z>{a@wHmkKc58S>hK(BUNrhh*hZe%N9z&jahIV}?|U=533wWqN2SB}6yQY);=&9j%`I>t~{C*O;3PFtCg_V;0Vk49t&xQF)lZNvDVnLrcQkoOm@A& z`kKbTR@_TyEj?fx1&l%Wi1-!&HlSUrmzZN8nfobFwoBgzNjz<2cKDX%cS*kgu0&XDZf|l9R z-NPl|j=o&$t%Xw8$3<`rIe&QdRB8~M2QEJpaN$->cKAj%JU@edVB?yz-QzN$rN06$ z?{H*y*%A1OI(*Z0AWJbn2)!H?@MHB<*485#GFL0$FJH-Sbxi=pAe=)lhOy%GSU7|8 zbpHCCY~-~V*inWtF^fd3bG{E=9mCj}*#VY%hd961OJ@5%5NC6}18m23;tX>Ru;MV{ z{NPYB+oIzI%8hs-9AS%XS@-T9g+-cwfv}cg>ZW`sKk#$tcr&4 z664I8G3OTU$GmKkxBavdeq!uebNyj_A7P>%$?c{&3wC{pvtGK3pxHOjjQOWNmuJ;x z)w3}!ik#~t9FX#pOCTQSse4U#N(I-8z|mO=8$9+%0~h6i&rj@iKK+0ccQPBEA?L^W zrzG>gB=$s>*Jegn;^FZJ z1zbPfgxR)6|`Z#9`A{M5~flHqFM^Iy6id*4sk*oW8_<*of! z&PU=Jv1^Mfpf|>j{C~zttrAN>#5m{aNh)dNg(Bd{*}~3ODxa1IXOVM_v~`kSN;W(| z&fZr;q(kj9VHR@U`F@M^ed7@r3ksN%5G_SrOa&iv1&kY+iuH<<;H9$ys`XDwrF-K+ z|FQz)&(2C8OZUSV-1Cb3eoLzJWFI8SF!pZrTxwnt4dZd2qx0Rv(qePs9CWs~OVby` zc}wpwdBi&6+(1?>pS6lOuev4JT9yyQp=_~EsosD}3 z3K$dbB-L+{35(Y$Aa}2ebjcU@ykt1vHR>0txgm=q{vuQ(L__~-l`@By8_v6Ib`RpZVhIRNg%=@1C3PvA@v-9A_Ld0|8JWs!q z5Z;71*UcLswA697;WLB@I?kKZ!iAc+2d;f~wbF%!I=i87dq(*7hpxBioFf?OIL9x_ z{a4OxQ5)tQRspVgO3=R&BTbJh0fhqhp_F5!4yTLYIC8cKY$F8?%7Y)sdF_i@k}@nC z{+>~Q=ZkmhhkrAm$y)63dgz`yZN?GkgL-?f*G={4$W)kD57#O8FRLr}B>}fUA8+p^ z^^%_P&>!PjzQ?bq4-elDoujZ{>av?^>yG>2-F@6|wJ%erHH!xO-FWuapib^=XX4y* znlZF{OZxnyEC6yA5a&a~jzPv;;;g9ycR7tXk0`7yEOsEy*X3=5;jf8vV0#xK|1oi1 zer=*~1oIg*44ZiP3VJ%bG5G67;UexQXs&Nqk@ElbdBwh~!poJ};iviCx`Q0oRf9k(4;;AaZV{R6=C=K*{8I5m?BuH+?}JX@zqh zyhY9(;tSPk-)tCwoKx>_Q{R1)0gL@GzHxVgdhv)Ou+T{XouQRl>6;1%3=|Nz@m_8d zza(hcKmjt_t+|N?@nEn-0X1i}$sJe+dspEe!QoM3bCzGmp6MC5rA$_HTlN8&sO?a-N7#Cc8C9T+g3IJf;$NBEdToXtD57laPPnXPaYE>;j{ zW#8#S)qUc;vLZl;Xh@uMEhB}QD~RErkx9aKoqf(!<_ps>k50qwYTO&aUFUBECVms% z|EBAcv%d>=I?i7zfBdUH&+F8SZAwM|8P|g~P9Kom5=wv}=WdVsOPvlCK_GHo{Q8I5 zw@V(BAm`@~W7O62vhn;H&V8}H)qn0}K(wy{CRZlp{&hNn`+5p!ZvCv!NY7NT{o@af z%(uF1!5RhXYJZ5kSW~vCI1W7BaV`0{uWWT;3_Qj?_#s?y~PXuej(1AjPhXKG~(PTx*Dc=5NEH6mO?-raZa+uJg9cWd1!kt zVbW9L9CH_Yc4NM=hFdd>?Lq^r2dI(V#vTy5`4H#fo6ZOcI-6Wpc~{t`n+I*`8H!II z(U``D^~Ezf&Na5y7rpxu%qzD7{vhX5_UY0#^f%@ND8akg2&wcy z5xhpu;j90st!(o^jhrtTMyWqc$%b90Q72EeR6i}sfYU1#P}j^RceKqBuz0AtFXEikF-b>-qj_}k+V+=9hVWqgiBY2o{MEu@DP%oIh4u{43|ZeMd68n-#FP0Qb1NtEJeq5@-^L zYr`7TB)_C0m@3D8rBg=Im)3c33^~WDvea_7Y&d@kb-T@Y^#pYWJYKGV-tp&hCpSF; z-!aC$s(rzkfF7x^2+utx`E7M^vP{Ap5`XBix4vxl+Bhh*Q$Xp+L9*;2F)$C~QLdN# zWqYsf1^bbh^Z9bOES&8D%Qu*RHUFsW)3rU&WFYPz8LfgkdK7c6H{}U9==8a=YcnBB z$2sDbi?Bk+dDo(u!Xq8$Uo1pe{De4vJ-b&>-676#ztV*Z^@#KP`4@yoI?j5n9}Deu z`n!WJ5FLY_lv=ZJn6`-7zjF`x&7A zTlWa&Mk(OgjP7dQ9_w>=SkkJ zgr7RQ@u%fL;Z;28bHtk^!V(+O=Y*_HLT#OW?!O~RFnmCq!>{KG4Rz-u3|5s0IXe6N zG3ukB(Ano}ibmobojwO#vlln&IEP)f7hQGppcl%gb)0=r{fEJj_eU-(Krq-82h!`jokK9s2~z9qu)Qh&?`y`uimH4YZmQGn0gLbc)n z`phR3uplc>?KEmH>}iL&G>atl(9wIKbuM!5ouf8gwg>v)nr-=z$cT)~&n$(~thY?Q@xj zAA8p71#B!-!ihD%q&4SCzzyS~GhZH+>KrM87J?GuK1WDNE%U(UmjW_w`$~_Hvm0_= zzHAQmpwED8^dFvkcuF3B55qWIYX{z(BGql43S*x8V-B;2wEk5hjJ@Fx`Oed&^G)Jl z57zKq|8}m_{n$Pj9gFWp=cUr_R(qkSspdSsuhg;g9@uvj_g=#kQjaNn;C2m+^G|bz z@6Czx6N`s1ZWY<*Ro5+reLDX+SR5gwWfJFpxwC}I-lWf4@@EN6zLDLCygEzh^^Q0f zJf0=|#vEV`ljJ|MgvWuzxoNxE!nRh#_Na2Upw`)tJo`C9SDk%sHDivjT(?fq^rQcw z`Io=as^BDIu*01|a8?(@sd8n&!bF)aS+x z(xetH*-(ml=;53yW$({`dkYotslg#>=ljEu)>Z+Tigd}Y4sw3z57|dfN$)Qw!r=4% zP~yuapJ%b~@Dn$Ox;99CUn0)c*@M)@uEcr4v;k_4y-zj2 z{c=}9J>ffX9<1!G4o91$x!!q4NA*U`HPy(qx0tJ4+7oBJ3wLsN>wM`f&+?p`I?gNg zZ)f+^t-CdT@(EqM?ms^Be{-HQA(Ywle+GIL$T`l0nWdM&swYZlU;0?G3A+UTWlHFE z;j)x8Cm+6@$35{T7p3fiGtfUBWA)irq(xm$fc+LF9KBm2ZSy?}KhYoV;rm1~TXGQe zG2g&E^u4saX)Qs-^y>@fa^vVh%?w_GxVl*k&prU``_z6uB2vYcLmZelupU zVh=pU*lv$5HtfP>iX*+X#Jrc0i_-V<{& z9X?5;+h2um7*CtC_?fh>S0O~;9$3?q7gFj$HJD>Ov%mglX#n<2H{5`|I49|`l~^C_ z;ufrV;#rTqcRmaoP|o|?gsnK00>5$JB-F){Es9RWJajy7(%z1>EQ^JAj|1TAkseG) z-Uq*M-|AOWf$e{{7dBvy^1bnqZ1N)FJb$Y(U!1o?%R$}Voo~EE`>j_U!}xV2#q(!g z-OJVYNQY-+9_F*cNr!J7%;eEaD4zdxOD6YNPda=;p2^qfat0oyWbjIN;^vTjoOi89 z+=kj80)&M=|}(HoacE2vvQ{wP}d3bv@xEX z+Tt$!M!hn()nnI7ufz5;0nn%7mz3dj0nS$88P!Gxtj!e;v+VGUm`wxL%PrzI( zk7f)upMYxrKp1_(n#D~%25_b8t=%wS?gen;uG4BA(Mqgsc_hIb9(gZv| zq=LoClbP$c{m>~y1uGAEvj$uD!R9zT!|?Yc%Nk3Z*A8sO!xhBYyv20B+KV`UTeyWU zeN49EvTq7M(U3UD-8{wJFOv=rUweT&oFyI3>U4)+cuRXCGMl&Db_j8^8}@_OD4_|9oq_1OH8kN8g4-`9W1t&(WG?0E%GP!Q+J!xj8F`VpG(|LI5n-<*$#LG0e8 zO6WQT&p=IV#iV8TAtE1h*Wc7(A5Rp+SermFoKTmsC6}NLp1FPb+JtTEa~3W=4uq+T zEZOjTYN&;4x3by}Y(?|aP!)hV_jxYN^q;{auAfCj$rN{`?dEhpLc^vlZkVa(XDxh5aN8$(vzo& z#M$`qCcb1BajspO%9GaX_Of5*a7$a_4Bkcj6`l#z{C0M`oZBuW&co-t;&!)*Rp-vX z`OHPcbM)OhdCGjsbvaVsG;ba1l;(d=+ZyEsMH1(26%FzX$I$h`Pa5Q{z%4XKzo}172F?^_@hVi)vcs z{hR;1GcJJnc76kWFn_z=HfuI;?GqR~J`mPjXv)5r-+@;RRNz(Dl9fw0Vewh)lkVie zWX_ji`MMx57%DKwG3UUzTQK<4Tg9H&W7>N*uOGvvqTSZq|Le&oS&xKtt*qbTBAd|p zkXG(=rJQw~dq68UJN%X<*CEa=r`6=S6~uXAbu%9Kh&ZSH>cP$L&^%~!*^5_Z(>$2c zdIQfWCi~ncFoAo{A-mD&MK<@><=-}HbeWg-C4F8nqLjDrCw;E;eZqIVB331q?|4_# zHO)PnIRE5pRuJc}QAT;A?h?b+6Rh)OD$?i2u5I#K1k(R5b+X8-8A4-jjW_;R&PR{GGL9ph#6LYC?1EOaK zL;CXwwyL5~dvDWyve=wqxmr2zd@*~FeL^d@IrECyL>$%1&+GnX-KQPY$|LUAlq83Jo7U z#~u7yK5?E{eUN|0^G%xTZ(P-Uw~RRNloj!3Zp3+1?oED)6RSIe@A8xp#JS%6mweD$ z;;f3TpXc|M#>71|&WjpHoVWj}pXYs+#t)Yn=2g6=@gc5X_`m7%q}kZVu=+jxdK&vzy26f`?-;#5P;cBHmop-v7;?r&wZYzE)0t zb(gJMo~@M+Z2ZO=yJXOB+)|5o@FH8m3@{JbpKQgXWHY{YY@&9|@~Rg6adfO!wjOWI z$J$UXfs?)ihhoYl7-`>^%Yun>L)+o}y*Y8tsGiN^{fP6U+bUjBPMn9@Y{$F~;(RVU zk(b^jyCKcZ;H`3r)yv+w+*KroGs-XWtxJg8>F$;Mxo(b|JK{ILigijg&#T+b?|eJ% z$!p{xZg06h`dJ#;V)Fz3Od`&Y=A8dm&dvL*Vof`If_U`B)34dG>uX;_>gzOO#{bvE8Rx#~xj9Oz_Q7XI`d6vn7PY;MC6m9IdF^%8GQ3B|svrCJVGOEQ^r zyYpH(e`YEBdnrdNKU`A9HqXn{$_U#!~4G)bEDIw!(nO7dDuMC;Z^%v^JB@R z!+I9h{EI8;Fqqo#s@7yH683lEZHLnu@W%Qce8eHjzqQ{c@R^N?^PQffxr-NZmM@si zX9mzZ<=`)WzB-#Yk2$rGkLW}GbHhea{EjYm^rL4YKR25gep_~&&mKtfp=LRJb1ixn zVc946`g$Z!k)`mYYxG<`x$faVClTklE!OjJ%-PiFw)-59f932YTgVJjzCyyRKxm)e zo~3O41R>v4a41^Nau2`J{_kbBiGBHSQ!C5dGMKVnfmYs-cb(<7JFS%;*u7>6cy2=T zT>%sI_>l&r!>M%}@O@oKhj;Ea<6;le;l`s|@gj`#YsZhZ=J}^chmT$9z@-Y(;gn~N z{1^5$){J><(}zdbCeF{WPxs;+@;6R?aN`vdh;!dYGkM@8;@qob74J8Ie2?pgL-@-t z#ChSREj$9x_-j5hMYWeFtS5%aA&GqM9FhmEjpv(md2}B}Z|7%P)AfRoAYP#+&f{eB zxsy9_?o>5^7iJRY%xY`y^2bm6`8BkEn)7X#pE-99o1^~&o^J{S@pW5fG3qN+jK#CK z??9;B#;9*UC4KoAIeDVhlI5B+lLcOy_H{Mzn^ZLx~T+kVc$cO;kKPE=+s<){$_oDkd9p zC^wR;?i2HdZFcaJx^<%W^bLHXjIO`;T*9~XB+k#LkK`{-6XzkbyYl;9#Mxn0eXc4b z&cm#Ju&jZrwBPkl&INzGShnmJbUYOZ*{3bp`?)`1Fy>0ej2OY}vL0*42Tk^4B{mne z@`%((_H)1)t!%n6l{FknI^4rsV#Su^OSlcZ#T@ezwPTDszG9wvJaMbO!-h#(&3p?TJtyWiS6r^9eJzzq{C-jd-0UvWGfaHxN^ho6g#RjYBcxE zC%?|1mlt<0C(iwkE#`)`$X53lui$^($%e$e58*@1iTS&0>$w%y9Me3Pb%TQWW2`l# zk!?pVj*_1kQu?o3qcVYN*jH7)r+o?EbgA+VMBvOkq`31zLIKNPjkHca~P3 zYPpT=uTMJcc{hn!4I=ySVM{i9G9XSn=DqPXmZ{4{jBzVm@B6kZl?{BI>c+o|1eKv z3u0(q+vuLjqMeCt%UNfc(*d#xhPI{bUM#VF*ZU1CHzc;E`}O#q9AfL6-;n2~5ZilQ zEx2(y>9Bo)4UaoRocH(Z&d=l#=kyi8oz4>Hpo*cqH6z__(ZZe2J59_j+D+xpGKjfX z(`o$vMq)lYehN?1#q_S%cjIrd#*0QjgZ*52R0(lzzp^X0=}mLx`F(Aqr+-Qe1`7CjE{kT)wzKu8se~Fe18x!YuFO#It!-#Wy zi*%{yLE_BYs-?H~~6t3!Iqx_J=i+qPWRxEFE$5@RG+G2*Phx366K zOaAZ{gW2*EUc~wKz%Y4C5OI!czfWGb5$W^Fh~x5wx5!rXyK-J$d5Uy+^^6B{AMBy2 z;p6Q1MLzgEu`O?03qI>|5hKo+Kx$uNwf95|c&1y&tq8P&3%lvvFATSW_ym%Rb~c9z zZ%N*lUk9RfvFJ;eD&-v`h^_yo0(lGF8nE^F6#3Qn#JTg?o$^*#&qH%RR?An)%XblH z&t?|#c{7P^p`D)0>Tqg}JlT*qhlcH!_uWpMuT)F&XSa#-;C2t?i+U4h>mGmQkFm~x zmRm+6==zH0K966m;ggy;pMTc{0^*3X@oQI@yp%YHd5woIX2jWU`+O*RN^CB*5iW#Ombuqp(qT#-W~c29D<{wfDB-CWFI|iAlGRG?<`U z$5r>knn_v2aI%jjOn6M6)2m&gywPWpKZ=&}pt>agc=}P6fVC4edSW=LP&QC!H$E*` zDcdxLIDfgRa;d(zRy*dO`h3bfPu=cCH7vxvlKF4rWKQFVGeCd2C%>T`Z+>rwe0d0Q zerR7PzkP~0dmpTluZknii3W|Kq9<`ae8~$RC)LbCdqw|?6&U3e6S61o^ZKbZdaYH zy*{W_J!p#cc{HEjGRzi+_aV*}E(72to|DpCuYj3w)S5U~UBcYN#l(5O)mHe`Pp8i@ zvCwlWagGm8hswcZD@N92;2TA@!g|LoFnUaEr(S#jLET7)^#*=}3A((LtsnkC3(OhO zd~fuaT7t`Z`n?D98w=N#5l{btO@w*dNnSk2TqtxSp8BOGLQo0GCxdRlDD0P~`5edM zb}-@tvAywOzl+;6dZrEbyi(7sN7s8FoTu*FoW6JVn&G)Sbk9`NkKXt;eb+zj#*EG; za&>q$e79DC!^?H@BTVp8tJg( zj|zzXe{7uzSWnyc|0~IqDVZWugi@xA)o1U6h$us3$`HwzA|lOmsT9pLr=)1m+~=IL zBT^_ClPOcAjG2Z1KA&~&^Sl4+d!Oe%_kH)X&uO36S)a9sv-etbe}VAqiq7AWo!GBA zI(Ec?2Y|_%mhM=qE7{0;hX?yiX z-~qW%zQdsnX`F)lm=-QX&OyL4?CL&4Q%m4{O#V45RfBRRH%r!cEO34|da87(J-lBb zAN^*Zzd0XLSSPu@Ml#s6zaF+6#$nIvQtj*tT z=ON!a$uhk&dn-Eb0-PJi)0o_sfOG!zNHp;!%(Z8Rq@!+jz%a8oGE*HR#s9o$;XSa39xb2V^n`c)EYSW4OTr z+EDLym;I~_Y5xPjc`D6EKYYgDoO=a^Oa9RL;3`cTqwx6|i8CGJ z3D3Cr;WNqh1;DvP+6$TM1Lv=jiD-TtaE@Y^q6?>h^QYGi=+|=KTvK%z)gJ}Uo6X`- za5QipYnF{PTA=S+G4DK5(ge=+UU$&Kf#55yb!$Oe#IeNgir;9MIXstdT4%gy9@y}} zq~3V_O7MX`j2gb<0&HDvM&M4(z;@x?v3No#u)U%`0S~tYp4Bv8Mw5$!>=~E)O~H$& zfWEY^5B}X5?lUbi7)_(`7X=P)UJa6Xn*!&EEtlAOLugO?VMBI1jU6J?nRdF9l(++D zZ<>$Z=sn!$-+m)}dWmGO#%~lqn&uq3dR}rV5;#w3`XuSD2%PIG2GBS$#j<3lgC{~*CvBcUjFm} za(V#1LVwN&)TRx-qRm(VhtmB!!n3@x>xO@pf(=J6RmD$dfz34D7>rlif`8~=JrXZ| z0<NXyc(rf$jdDld$(8;CVf2Dt-{VS9Z@OZqsoWMbN)b4Z`Qvz&kQYPe2`1M9$9_ zN{-J0&Sx*@vg(V0^T=3j_No{k{?DstWd?_Vb1ltB-}m(2oL{)!mt0bi!#gL^e0FxX zB)u?jj_{R3aa^seJvUaWqsj}w`B$X@+BX9@zje1nDa*m0r61@yimt%9r&TDLI}A8S zdnKW%cVW!jxbYl9anSd%W|z?Aq2QA<>hB@_)8H$Phqcle-tb&aO21J>H?Wz7n>*om z?qI{oc0F;h*q5DA>5naZfRCQW5ZvJpu${1dB<@)PY}?|-;>5GS(`Ka(etCb7?78-I z9FP4lXyZw0*t`y|ZKk=Wo4&$tC;Y}CiQ{Bw&kp}s_LvoL);~OujTQH7NQO$w?4y9Q zV8dZs{^q=FLz85#<{#8D&J%f_yeL__6*zyuPb5CifwSRYC3LPCIDaS_g7Vh`=RGac zQLZy^#>(cXgC1~RTCy7*vjEPuZ+y^BO|WP4v~U!s4E8LgXM>b-f%DqC`Dn=mu;-sw zE0CQxJlC7Nn`jY@xgywe)`ur3@-lFKnez_a7RO^3F1Mq#S-?5KSrNb01bc3N-vv*7 z3Y_1$)98r}zkpExL)#HcZOGD22A4=>8l*sO1@>&jk^#jgU*HuwcJaC@$Xe?@43Y>ki5lV0Y&Xvk5kj6UT9O=6Y z-4yrU^UJ-^FEPeTYDFkITMV4ZmpIh-Jv`Uy^{3G?x{pxokmqlxV(+0h#{swYeIcLHa#NjVaoO~AS4%O%OWD&Ty=_Nl~09B;I3 zkV6u0;H>A_3u&GM&a0LUNBN1s`Qw1eXvQV5XFapIsJ`^Dto<=sYfzB|%=@;DwL_O3 zz&~H6@jc%<0_P#lhv_~N;5=Fyj-sB!v)s;#qi2=DKWC0kLl@kERpA?YCP@$cK*Py= zBpnUR_dYB^t>(Zv@vRhDmjLIC$0t#t4_xcFe{qn#2L8UcHNTvQA>e@u(jvhEJdG+WMYS#5ecOH64 z0v`hB$yHvG8P&k~T}7}&aRiK?KhKVnj2s2y=L4g2B)(O^Innl_r2IQ@UU=|x|wkhVe$o!v1JM9~f_}=sp^$^@F*IlKxbb_60a=xy?aKZQ)s5 z;+N8MoX`*IAJ~9WU4iqWtGj6YN?`TC&1JL=s5+%)&j$zdufKcbl;G`{N=O>tev>0ar(qF(ov#4FOXkR)^Z%$HiG7( zf8_tSJu3$EK(RFLWm755w>U6V;;zwxjB06&bz3vZ_1!QZRJcA_61lKc_O~oG$4g?5 z0_X0Xrb$%&fpgz?b0x+aak4tCu4^Tymqg3->ZSW76BdTc^q3m~l1`_9^OA&EN#uLr z%)dG#@ofUmRmK-22KB(XYIVKDC{pZqdbdhi={XqTdF^ihk+hEmUp?ee7v!V~&((Cc z5B*I6E1kjWbdL`(AAe~S>Zu6KUyav6?Zbfi#SxRxs0iSEo*jT*wZXN0R>VtsO@;T{ z$EJs&%M#!`SZySGU_G>F?&bt(7qK7Qd30&nrFh`nNb}M6kNTVQ{P+E79^3}>#Fy^H z4fK=DwtS2l*Lor4-a{nS>NjN1Ws!c}u=h*geAznMaQ{G97ahLvprNvSs;mw_Zi}HL z6gW@VzRR$(1URq#xJ@ZRqB#IYv37s4%U-I&@&c7xtE!VM8{C{AqJZz&b`65-}iHsWNZN29;Y58dH(@8 zn|_Rz96Ar28{el&-qZnS#ZG4=+Fqc|Vvk5-=K!DRg+C4T#ki~;e%VUh*FhWPZt1ek z7Qp$;whU=4JqIte=ePNxvOX!m`6G$=L%)qZ(28jPz*gw zU?1OVc=9Q5wv*Q|)Ql{X-E*gH7pYkRaDHt$mVI^@I1d@)&F)c-m(^L{?IfE+&rAtz zsO(tAMrlXLbi(CIHaQMB%af~Y|LHKs%gCr=7bL>icWJXW{I8F|Vc8TUWNl7;Jl#$^v$Z_?s>KsLWP(2Ijk}LZwxgfccNH!)Knn z0L(x2b}+a-0LpbURQ0Eihx?d5)ns=}1)g7~1hC;dfwNun8usM^C@*H~rF|TLv+tpT zGN%mSEaam%zwkHbGu_4^i5rVI&F+%tgUit{i6;s>mpjm)41WKTv?vD z=XTGMqwL|;XJyYD5b>3DA97Nr71}hoqEO(hV?Bp+Ne9k#FV}H$slYjDn*-;hepFV! z?XC-uYc}fz-=AyHwY3@a%B*O(S&!M&FJ&}^`D`{<2A*!P>K{{C7V_$v)&OO_; zxy4z)`61cB>Ge*KJ$qb(FXuqd0}31r*T!7xc-`B; zJl{f|KR5}P@8~AakEn)c&#wK!Rs8{d#;%EzZ-e?@ei2Tm0`9476~c`UfxmVC4&tKh zL66UGX5(nwbm6%&b@#DW#=v=??oR0+0-S|>^os|8AN%)sqhZ|y8f!QS{iJ(&wO)8h z26(5SBwY{W>78Y0zwIQl`bhi72&r`0>~xwBnx2)oe1kne_jiTRvow9|$8oX!(qw

      870hdw(tfR7i~jgwDw<=yOn8#B0>yKn*SnGjUO^-utRbx+HOb25VR9ZA|;%LDjZ znK~t`^Dy9i;L9_@x=(#_$?CUuci5kCc8C2yr1-d}KfZen=mA%I z^BZaWc)=!59O}ZK>I8b&?eE;U7^pLL!(Hyz9k@?W^J&gO{GPaX{WdPd2RK{*mgBxX zhj;gJyCQq=GjJC2(T837n{#k)CFJ86f}-fTw(%+JCD`-`>U)T;&3CFXw5BmpX;54w zIsC<-UqL9c*6=`8Wx3Kb=3(e}Ak9Uzz>A&rC=BV#(Ht1KmUUfm6pixnM2W+?a;le( zqWr;L=;~Z8F4*cAI{Cm0g%=oeff~ShPMI~=trLv#66)N!PO32WcsMPDBU;cWuI_o9 z+j;^xFIGRp6FI{kYy;4PSelEZ#KS<93qX2x?r6AfYuVWL0CcuH&6`u*AZ^kOM0=Nbph$N;_K{T} z`WEkjp1jibPyU6?1etG-(gpI0cUmh@9c*_ z=o5Rk^x#HM1?Iae$8gufz|L27XE-F4`n{PkEFEoFi(*k!i;(V3C&5`vaYZcqoaQPL zxG~W;+0Tl=c1OiS_Q`c%n=$bk`)wt#HDC+bQ^SF$haJcE9SJ;N*nLea_fvc&r1F19%`Zd zk8h1M&l+_1hp(hAZ-u;kG-u7uj%MzUc$$X?^3_&Z;{(v7phI=-Yq~PJNpl$!=tV6l_v;$8w=USvk=e)wT zJ>xpz!v{eBzN?8%CWCf#osH{hep{hV_W5-<`!eXAI}c#%c+iap{qYEq|L(+a{Cgpk zzwt`MpQ)b|uDv`x3nwUnzW<~M2R;YRC3zRHDb1ZB)VbeKk3Z1ym7rC=zQs~Ht`KzX z76s-8T{jbSN{8-@(GB3=`m-Ms?FstNtYOSBd(bIrTFlq&p!q62CPCDe+b}cT4$7VF z7c${=%q85@QE?>``Vv@WPu|2#IspuQ=h-q^$)H<}cQajwK%HrutQhlX&|5i%nMeJ( zaG!s3Rt(QZpI7_J%2mF1#~o;nHlfaZ)tNYp=7$w@jN2xx=LGt^oDWu>1G?+uNPMje z=s)96;Rp1Lo>2c@QZYt3paa7$$|XUO+sr29adXO3hZ)dKU|k0&uNrhu-pz>GgVcPU(Jk+_g~>JHk5 zw_qmi2A$}!iTS<}bY*8dW&&NW5b7@+>cTjgf_DDy&8+ALdjF3==ImDBzxZA#(-I2| zpA9?4^rYuxg=onEy8%ZYY=HOn8z zoB^KeHYH%+y`US5^6~O%px@7~!Xr9@9)Iiset#FZ{WN%oGc!StkCJ2hip;ki?81y& z59O=IsxTw;LEpWp#$bAGLuh|jCkn)hBdBFU=bPHp<9CWwRz07604@jt=>Ey;}bq2k#$%oOVdlZH89kYX&i+4bO2|dbm zqjP+re2Zf=?U6b| zoaX_0K>0zubU5hShS9kG8Zi9Qkc+1t0Ufuq3L7o~U6K75hl>9E;>STKY35cY_X}Kb#q40=mdai#bYTya?Ccj+x9vbpZYOya5x}2t2jq z=Q24o&!bSM$UL=#de=j1i4DC0v`eE{G{# z44TY4${6T?o<201;eG+z-pAvZPIS##sGsvCnVB#876rXDW}peMo#d3pSZIJg>zmBf zJO9nuwUZKN=-Rh%AC2V;@QD+^_PVV%9ybxav49!1Y?2zu?f+xYQH z(C4#San&%;4V&bde(!-##oKPo+;Y%6)cZ01(V%Ug4rN}_`GRntKNe$|DWVS#&z;0b zM?-nsbA3j&Bj_Q@MogqQo(Uai$`}*i`P<5Z@s0x>p0|PddJweB*gcHV4A5~sJ(y`9 zfuUT1AJbF>`loU*V;v0I(CR32b`$94xF}|-F6cJ_Cuq)P;C#b2i7DI%JnchLnIJm0 z7203D?IbgP9O%^F$;{f_e{(*P)Cm{p0OwqvMK~uF*p?>y;a?(WE$>v^w;mX3J>jv> zQP96f-@~b9pr^;a$NTz$j&SS1@XvvdRcm*~TpS->l^?)(2SK^&+2M@D8uZd%TFf(X zta!J-9%G~q<%g6E8M~jrD(J2equl^{^bu2LSqbRec@|91XwX*`H!vFeL01ph&a9>9 zVGpm%9Jhu?H?b>d=3N7-`iuE zXI{Wl{bn3g#-oXC6!heJ~`BG1~k$=K-%eV!uhi`OPX5{F9!S5w5kJ>Vr3o z1U(@#3EvR=M5`z%?&ShJt7qTF+i0vIp}w+aEAAu*`golj6Hx=Ka(;AW91}pNC95)f z=(k6qe&h>vhFJo7aG54^SO>J-^6|{bZlL+}Y0TW$z-LnthYJF3hsvF|JXI+*dLXB>ofw%r`b>=(xyjcdm-UUz{{nshSL zL$u-4rkPCfaVYor$uJ#UL0fz1q}9s5z0sd@%X z&iV{uK2(4n{A@U*aSHSu>F2D9}C6!m}S7wVqkO9XMC7-OO}M1)g(DZ5Zn# zpm%-R#`w<=%X@EUGM48t&#ipA@eIXdX z8xDGdN+Pa#46KIw=3wu$pu+|etl|cGZfFgDyd3oEz7Md{M9?vJUg2pp&Z2Pt{?|X@ zH*bN-=Yeue^>xs9{5moY=RohO=*n#U#}C)`WbV?KFv7LHPN_1hX^bU7KUqJJ*+XMK z2zugAb*5Yww7Js=Ca(`@d;77>kFO%bX}Zh|`i)MgpE-9Dvor^Er-4(M@gip@-I+|- zD&Ty;K*D%s0#Bw6Gq;a{9(QpTb8IH)K1Q>d{fqwQ96a?jdYlPt)ii#fCtX0lx;O%l zI}SWO@6N$-4Cw2ftg*8^=s~kR@Wk`Lio}KBp2t8pe~HBpH-mPXk%k>5pg%m%!LR7r zukc*c-j?E%Kj7H|Cs*LEblp@a-}2`w-blZd30h_MZ5);Y+H&1PJUD+sjB=pQ&o^vSJjLchB`a$^kUZ2Z-PSo(^va2O*z2RJH9XTIui5>NqP%o=%Pnw@p~H2K`39;;~Z|I z=K%$6;9iXL-vL9t2~wbdRWTZQqVpaBM#COqN{3 z@1sF~sI0|%Ma~a1e_&HOi*|(@RU=du>u!^cCd~`>wf`5tL7Xu zX+&sfPF={mv+~=WR5`7wbTG?=~C9ikv^%8(|%~w_K=ms*eetISDvV z7-WXq3W4pHw#8VTuEz^?miU`vCz11*atl1%=x@#?dGQ9$gMjn%>Aeip#Qx6PEKR>% z8#qt)G10ev2&^nB-p*VnuGigk**J5WJ(LS;CLP2+ZrWzu(uc#LJhD8mG+G|?`sz+) zYmaa<+^)>Jvwoc@{ zQuilozY@xWz0%l8G=7~>$7bRYRk2SKdebH?IJh&argli)b7z;hvZCBKRj8;T^e6Ji{MY z1Mfx8>H@zw6xdD}ThHsigJ<+NXyNn4vB4vZeg!kgFtNY8Jd+_S#4&UBN@G(0 z$`f7tPIF#IEGA1R=Y2GWYFz0maxB{u4N7-IKU_AFvGYAq2A$Ux^Oj`FP#W_)l;#m$ zzn*lY{#oI$8@lAPiQq80UQW-(%AIx3oV-E0OfT-#fvPm)qzWIo|&=R#e zk|_bbb5IR=@jo~RE!9B!vp%CCpJ+blWdV{VbRXG1qxn+?lo@I(RH4-kZm2%ZlYM4U zhPvN#LypWoZuPMow6KxJD~^7_O?#7$3f{S)duCJl8}*5@_IwHP=glw0%Ct&FG5?U} zJrUZuV^S+``!!6a$L{G(K64>5{qB|y**^r{i?*K$8TAo_sk()m7E?gBa5KbJkX>P6~tBir0nf@bUE3V5;m9~(B z^qiW|wgbC<5KFpmU(k0iD3<#tfcD+drTj=1)RBDYUcQ^2TM_ECtnFRSR{~qbek$d; zb3pq<_bSJ;{`MO&l1}Jk7X|!{#wB)`a!@ijq6Mi}x}jwST_t51_mI|EH}s`^i{YP$ zE9h#B8*)BTCsj8g=m^aP*>Jp_?fktE+4{MmC*vKtu@ke=MY>nDYwIO$T+k_5u4IQE zz4`QpWHj`&8#2q9$G`dzhwLu9p?*=`{C+k@)@I}6LVn~Kco%O!eBkX>kIKrEjt?R> zFW_AaDw<9H^nrI#RI{7RItlM$PjxV{ONHNsZbJ(B^ap+y78^^6N(S%`U0F-QVt{|m z`e($D0K{(Eap7=YA>6t*b!?_PL=xhMQT-I~8amom-Z^tz-veNYPk*H=3ioAD0(cfbP+6 znFYO9Z~>BRbf6E-$G!g;cRxJ??d|MFf3ugkmb_GCNzX!T%2(j`Z%#z@lW9(|A!B)l z#x{?NbVFkzZTO25fq!qE)BNRqz<-_ETV728`0w97guH$T{Ix&NB`^8||H?vp(wGeV zUG+kUz6bD+>XJgfWdr|^O(n!%T&I$x-XI!uZ;Zg=Z11;3I}aF!%u*^p6bbsxy8h)q z>3$@k&d+t4<=LWNlAAiA{Ml-#v&UPn{N_gB{J~^W`Dq$!_rIKnUrCkpy)Ta)@3^5m z^+|>=6k1WQOgCg@+>y1G+($=gPJ|2Vp0nkrYYD!W2zKs z^m9W8!XvoTw+oQdXIC^VBZsr^l!LYgps(^X-gZhNKdsud@)$Ubf+-zX(Gjt#6Iuw{^<3M6*D)t3;Pmsk|!OqV~^T@a` z;Ay9EmE0EB=pyZ2lX2m|bIwMka-%e;qfw_)E`12)+K&g6e|HAXi_Q9$d()WW|K+@9 zl)B{@Hz=b5 z%^T>3);X4PsbNy&NzVWs|M-}*t0_R^uDPNTT?Kw^#~dU%P4ig&>ci*$K8?Ql)BJ7@ zqja}iw4 z{u;D{p8xD)af#~_T!9{ZcSY(dpScuIDN3TbIkqkB&A+`^fUHi^d=mwud2PiURO&+W zq+B%QuXoEtYb>cfA6~{!zLSP#Y;r{zO51oh%M@fz^C{ez;K~=LC!&I2nsY%fp5M3( zI6v=L$LrEKu7YjMThNhI90$(pore(zMc};0Xa+I63HID%VoGLD2F~|pTau;fz?ryh zC#TGSbDNPP*)OiKGpQaVMjdQ>y@DUHmjdT${)b7J$n)FeP*P9N{s?WjIV+gh((#_4 z%@27IA6L*{hI^Bf$AR;VG!Jqi;BU@{)_*cE@1cOz2#uewuFNgsT2LAF6(+9UT+W*Y zbZM>|$}nQN{pL03X-_w#T;0ZPai~Ba@4KRl5vu%PTPgCTen8Ty%g-w+K<1Qfi`;zv z^`C5{NcRp}Jh0+7^vk4s$*F&EcII_Drz3w_?(#N}|8gk>O}pcYqST}LpB727_D8&~ z;5{b-XLP!q@7EPL-`k-^R`&Gd87COGTwS}6Y@~5qg=b&gypFhvedSB@UBqz+ zaL!$Mh@22PD_MGzDJfvj9YO-h9W~&b_2vjEEdtKwzmAde1Hf=@a|Fq@1kRSP{Yfj0 zjVb)C_yt?YI7iScXl~zE;@aJCEgN!m)Zd(gU%0V-#wg(RC2r_p+(It8s0G#0{nP6< zrE*a>8_+%4Plb3kauK>UNaG95Z~mb>A8THL0$EqIWWP2)cZn2b`MIK(4~_ZfDFtZJ z3L1B0+!lVvn{1R!|6bEs5B`8gChFCX=9AS6<&%xl(Is=5lR7D$FEL9+#dIIWLYE@` zG6v3X>tFFk*T6p)>-Qr1d!l8}^}AAw6x+aj>PYBpviV1-to&)#N@7X(s|(M5^~6?^ z-UIBpC(W<~18%Gd>9N=8^Dw_1%4Ga~3 z#E|#&Y^G4Zslk^VSqS9@mn_J1E6}GkmXYl=cC=8(uh%Lvik?{&^uPT^b^9Q0ub~1i z&!gky_1>IyQVUYHp}Ce+%el(z22?`#o__NC!*%XlgIXWBq6Vv>yydtGWD)O*PD&6z zYrGWQqJH48;d)-py#U2)yP`p6Zv2S**~qTl1v%v%;k~D2A}cvszc7JMJerPX?{G!C zinIA!A5&59KsWTl?&v%kBoq+QQMQ7ru0`|Pl*oQo4fOBf!AfgZsoG*?!N;-B0&Th(4x z9;_Nm%EWaf<596Bi2=^bpSzLWOM&g+089czACmA`pX{dl5CyjKuNmU3_BUtOsD0eg z#R_<879DFXOXNm-wxB-LC;MeIaC%M+NM4!dj-Sz;|8?&g8gPN;{h6=JYyG@{)LmUs zsr+I-T26`v(!5|dhwkA|S`?sbl&2~VlKbL?Tgy@B)5d!Z!%2lRuh^&`m9 zaNwNa8AU41fae&~NOEl=aL#*aL(0Wfm{|bl2Wy6tg6Yn(HvfP2 zyeEx2y-ESkI!WUO>6danty@sNi5uE8^8=@A+<=1UzU{c20sM*7Yv{-+S5#9tlYe>n z0y0_WibCov`KXI!Xe0Fra#!8?&%+AP-kUVm`0u?*qZQ00Yu9U%LAt;hRZS=U&!F!+ zGuoKAtOU+h{Vm9WuE6>D6>GBlHE>?1>Oi`;!MHB%hC2x!2Aq%m@gmNX~R%DA^c7UJM7$jZ=(>|9U9j{Q51A==ny$PR5ew{JdGfIUw#0 zf4V#DyZblii}H0`(K-ce6i;nf>jr0R)Pj=ed}i`)1>U`X1KRY=6*W#B!H?N`4b2R8 zMSRH|-p~I6lB0W4E%~kdD4#MK@5coVf8fi1dy$Xy(p}J#Gco**q-=C3&IPq|S-gE- zCc>&TXVYfFKf8Gf4O>og+{i!V_lyC~zgqwBu8#4tHv7i)CfO0t_sww{LGBbo-`7!p zB6)iqI6pT;B-aEuYfo52?0y8xt~GtNn%Icr=li3#lCKYe^OYC}>K}l!L4h05Tm_sb ztnenPSAlb@h99|N1@>IA+KG{7M;l zyn$CHavkc5W_VZfDpyXS0(w4;8UKXe&^JZao+PDTeC$3LV>s_uCdzN1@3S~NkgzVm zdC+`K5>yDByM3NSsAREsD=kFahk^A&)kx=J) zf`$>8|FuayvLvsfJ!*>U(Xgo&Xe6_AK*S8Al z+-VLg@luC6*wJpL{9f31`fqz4B&WnH+R0<@C^vLi=K;sXH=|J#X+PNeE0;c_9_7$^ z$NDH0{^8OqD8kki_08Ae+h`8c$$jXUp|c5J*|`K&m$;w<7q;<9bMnw98o#D5OV=)1 zvyd9ytLon|g8%vH6zbRJg5GJS@f+Gtq8BUZTzg(VKeQ=P_Uwx8=lQ0d;FE3j>v(Mj zd_||tjeL|Zux(rVo^MKm`G|&^92utwYdAMUBtlhoRR-R67rCChgK&xBiQ zL@NsH)^FtyGD}=XbyOWn>jNvVtU<(L1hDF%qe5=c-=FYaRxkd-AGiws*7ZJN)kGg+ zT}|!sEL_`~5rlS&`@tS|gtq+Gp1p?l;QjW<<56_KV~x>uZhLeyYNMRhAJubMw;l!1 zIf%6R3#T{x3YtgHqXs21F`%QJK$V5IEMce z51fPBkMT<1!6xtR3E<5=fYqu5TYjLpR^NuF@LF_?FR%(TjpNGu!}#Ij>jY#Xep`8- ztAxj8!?oKb-Eh(vct;T(yJBE0{J-!Il>1clS=;~L7jB;*n&f2Bn4Dx6uW4 zHTb~gZp}jHX1bsFM_*01WbwOVWd-408rXm|>nsd{oC$C%xoL5+6a^r6T=MA%N zvun=-=Z-I58fs+#=kI@lB;!4S^XVh!C7LweqVPPn7uqG~LxA&|CqvM}Exm*yiet!zuUxSqVeK-k!fTN>bVp+?sUQ%a84cGqb_o2RoULw-rsC&#PYUeFd3Q&WG;=ax2~u8ef2N&JW|3pDRX3>HKFYf1E41lZ&RTb3qyf z>D+IWh3s`*(Bvoi+_8`8$cg%sh=mt8jnGu2JI58Fz)G(D32?rp6vW<9gtw=e;9*(4j`)-1qKrROSPmzpltf@7Dq6TCN6hHsCjo*R`OK zIN)5YMSt(&x59*@18}^^d0LbX_B01p-SUm__z2*VV*_i#J&!F$7wI_J%EFYhD9uH#t6k8e(aSlP0a-|0!vzgI zvyQt)^WvqN((>@_To_74_j}Rxy{rS=lA{^o%a zF9YZL@?3OlA8?MCUWY7i1Lw_~-=UX>fU|#bC%k$EaNblj09$VW&hfppah})@N{1la zDDFoxFj$UXhXA+Q@?97$1J3u{ys@Il`S-pE%xnjH9$(91ThX4`?zK2d+#?STp2g_oIcme5zp{Suxu}x%eGQwM+0>7jC~1HTdiD4T``9xb#ZPlV zhWIgS)|P^F=$R1B;70c2f+Vzy?iGGHHB{od5IEO_FGUXr182>uv&iN)aJGKdf@bao z&cQBSv2`_Y-k_k4-`WG`%ia_4oJGL-Sr;R0wh}l$`m!1m@w@Q3Gj{x zxdo5G5(1n(KNw=)t-zVhHOB#SfO8Muop{Y+;5_h+Cq5GZeq+2>D1P@2ID2a);9fq! z%1SO9Pc;F1HtbLEWV&81@b4CW3ooX9j-byd$}^^7Klo%)SH?R7u6+{Jl_4VM`afM5 zp)UL@NB;qByK5z%mm`ml#nH9pD;K#g!ObY0ek-}zaXZ)l^w<3Yd?Ah7o{Nx~3+kYqR2F(R6HQcdK?9O^8nlc| zM_qfnpt-ic4c2T=K@Xy+Ki{fvnC+d2GUzt~t8dpOrMrPMgTv50LDFmMhwKT#Fk)s?h|> zIb_ZQw%L=Q_uXC5z>U6am~JsTOk>4%oY#f@iE>ffJi5M-|D$Zvp-i;&n=|@gyV=0( zK^pq}$r%-#P&8Ehl8iFwm}FWXnvecb0@4qn_tZKo*-LY*2yN5d8;`oo0?y}iyW%5n zf%D#c2D74ne&w(Y_d5fef8}`L+7-Zg=(=NARS!6;SEb--3~+XtS%5zs0?tLPmH6m0 z;C!~{1N`71u=;lC18%~=xh_JHnZ6G=Gm$FHwZ*`>!gC_im&V@^+WDv5kQpm-UUx{s zY!^A(l^Om|dzMb{_!x~NAv{<0 zF%#^!AMAPQc1LWR1)S$UK8$yZoF#Wo;1+THbN0!zc!tP1KCT?A(0m8NeMTzW!Nnry zsoh%fTamNzM|pbk1~^OWdoU&rzB zKl$i|`hqpXf2nWx2;{G}$zz)&x-M$kkykw1jO^(?fr_Fm?j7|TDYspbU5G1px2PJO zq@2&2EZ}DCCFqf|D|%)!mK!^;811BMbaN;7;l7T_MYCtQps)2ExW4N$(UN!0sE_JL z_WtQK?OoH(Hg&vOLMU1m1nGSQx2E^opsMb47VO?alrIi2RCpD%L$ zCm;QPIjgQc#t-eJfVU^Rp`Ge|`1#UijW??0f;Q?M;xvaRp#9@rkzXLjcA{%+-zI}SKikp^zyAcBnb*s) ziU-*9uEfpQs8F=$l7E1dbyM{?v;x=8BqTm&vP@3Gtrfo&L}+o5*L0j4LRL# zMh63GIa8x#^l+dHI{Nt@xA##zTHfCk*>3dVG^Yb+?X8Ga91EOR@0iQ}{tTQ;<}76A z`T}R0@k`ij7C3)vHfINl!!E)mIXQjsyc2gVJ^ZhmR zSzUi%b&WG%-!BBthN)U?0{!MGu&Vvhon_Ym=i<1<(lC*;%d_axGa_ffJ4_Kd3mO>z z|9+!;emrlwM-FeL^RlFuWB7{j*C?!bCX2LTow;Jj91^1e>&$7Z=8y&R;oG0et~ta!7S=Q-Et*3f z^##rYU(Y6|SYX?4!fc{32KKjjD9s`sQ-Cc^XF}#AILnwD8%`(7#BW%kEA&VY(dV?D zoJLGX32s zg_o>7FVi_BmcM_hRHnPOALVyy<;(QF(}(%g<7Z{MU)RIDS3-tN>)VC%1+}R%9bKHs zC;fzPRi4TB_>9iL*~CWWNn3(~{fW$j{kDGELN#NYB~1GJPmhjwB4s zl4<4YZ@hkRx=f#M{l-tzhi@p}9`fXMW4x?9`Ew6qYy;l}T~2G0>$UI=Mcc-Tw9Em{ zGv*y7$qaCA+;EP#y#gE7_pc>Cw84g_t34&##eFYdZQl_~@!UP0-A)ug0h8TS>x<_d z?B4$*Mwh`qJe}~9sOAIDDKEa04&R+*ZEJu2nf&Mq<=^JEkWz7dqwl1bRi2a8skGH2nHX%?K~a~;d4dh!yg!;Gtb*^_5ndySzI&3azE%E65}6by(-Y6r z{E4aXO>krBOtRMrIFD>!M?yr-ehEP&V>EDHzA=k@NCD3I)2hixnlDUvE``2NiSjzI z;hB2xNw&B@zh`ti-8T+Qd{sJ@$H~KQymyFl`2{K1@XOn(<-;ou$?g-N-E?pg%77WYhc{~@VfBy<

      Be_I|Jtzx7U*4Gr^vnj(L%8 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 Date: Sat, 23 Apr 2016 03:17:22 +0200 Subject: [PATCH 008/232] Recreated GNU GPL v3 license file, hopefully fixes #3218 --- LICENSE.txt | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 0de1c6985..1e9ad695f 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,26 +1,23 @@ + RawTherapee - A powerful, cross-platform raw image processing program. + Copyright (C) 2004-2012 Gabor Horvath - RawTherapee - - -Copyright ©2004-2012 Gábor Horváth - -RawTherapee is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -RawTherapee is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License below for more details. + RawTherapee is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + RawTherapee is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - + Version 3, 29 June 2007 - Copyright ©2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -638,3 +635,4 @@ Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS + From d153b554930aaa81f488416bd7ca50b04dac1c72 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 23 Apr 2016 20:31:35 +0200 Subject: [PATCH 009/232] Reduce default strength of raw ca-auto-correction --- rtengine/procparams.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9c4ddbd58..d3b12adcd 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -888,7 +888,7 @@ void RAWParams::setDefaults() ff_clipControl = 0; cared = 0; cablue = 0; - caautostrength = 6; + caautostrength = 2; ca_autocorrect = false; hotPixelFilter = false; deadPixelFilter = false; From e61e4883464370fc31296ca7b38c9f4122fa2cd9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 23 Apr 2016 22:45:40 +0200 Subject: [PATCH 010/232] small speedup for lut += operator --- rtengine/LUT.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index b128d89b8..76bcf0ccd 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -258,14 +258,19 @@ public: return *this; } - // handy to sum up per thread histograms + // handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (unsigned int). LUT & operator+=(LUT &rhs) { if (rhs.size == this->size) { +#ifdef _OPENMP + #pragma omp simd +#endif + for(unsigned int i = 0; i < this->size; i++) { data[i] += rhs.data[i]; } } + return *this; } From e495093b187b647b6585604d2827fb0eb1776871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 16 Apr 2016 22:20:18 +0200 Subject: [PATCH 011/232] Clean up clutstore.* and add LRU cache This commit adds a true LRU cache to `rtengine` which is used in the new `CLUTStore` class. The code in `clutstore.*` was cleaned up with C++11 features and small optimizations taken from my `clutbench` project. The `CLUTStore` class was converted to a true singleton. --- rtengine/cache.h | 236 ++++++++++++++++ rtengine/clutstore.cc | 571 ++++++++++++-------------------------- rtengine/clutstore.h | 119 +++----- rtengine/improcfun.cc | 14 +- rtengine/simpleprocess.cc | 2 +- rtgui/filmsimulation.cc | 6 +- 6 files changed, 476 insertions(+), 472 deletions(-) create mode 100644 rtengine/cache.h diff --git a/rtengine/cache.h b/rtengine/cache.h new file mode 100644 index 000000000..2e53aab2a --- /dev/null +++ b/rtengine/cache.h @@ -0,0 +1,236 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2016 Flössie + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include "../rtgui/threadutils.h" + +namespace rtengine +{ + +namespace cache_helper +{ + + // See http://stackoverflow.com/a/20790050 + template + struct has_hash + : std::false_type + { + }; + + template + struct has_hash()(std::declval()), void())> + : std::true_type + { + }; + +} + +template +class Cache +{ +public: + class Hook + { + public: + virtual ~Hook() + { + } + virtual void onDiscard(const K& key, const V& value) = 0; + virtual void onDisplace(const K& key, const V& value) = 0; + virtual void onRemove(const K& key, const V& value) = 0; + virtual void onDestroy() = 0; + }; + + Cache(unsigned long _size, Hook* _hook = 0) : + store_size(_size), + hook(_hook) + { + } + + ~Cache() + { + if (hook) { + resize(0); + hook->onDestroy(); + } + } + + bool get(const K& key, V& value) const + { + mutex.lock(); + const StoreConstIterator store_it = store.find(key); + const bool present = store_it != store.end(); + if (present) { + lru_list.splice( + lru_list.begin(), + lru_list, + store_it->second.lru_list_it + ); + value = store_it->second.value; + } + mutex.unlock(); + + return present; + } + + bool set(const K& key, const V& value) + { + return set(key, value, Mode::UNCOND); + } + + bool replace(const K& key, const V& value) + { + return set(key, value, Mode::KNOWN); + } + + bool insert(const K& key, const V& value) + { + return set(key, value, Mode::UNKNOWN); + } + + bool remove(const K& key) + { + mutex.lock(); + const StoreIterator store_it = store.find(key); + const bool present = store_it != store.end(); + if (present) { + remove(store_it); + } + mutex.unlock(); + + return present; + } + + void resize(unsigned long size) + { + mutex.lock(); + while (lru_list.size() > size) { + discard(); + } + store_size = size; + mutex.unlock(); + } + + void clear() + { + mutex.lock(); + if (hook) { + for (const auto& entry : store) { + hook->onRemove(entry.first, entry.second.value); + } + } + lru_list.clear(); + store.clear(); + mutex.unlock(); + } + +private: + struct Value; + + using Store = typename std::conditional< + cache_helper::has_hash::value, + std::unordered_map, + std::map + >::type; + using StoreIterator = typename Store::iterator; + using StoreConstIterator = typename Store::const_iterator; + + typedef std::list LruList; + using LruListIterator = typename LruList::iterator; + + struct Value { + V value; + LruListIterator lru_list_it; + }; + + enum class Mode { + UNCOND, + KNOWN, + UNKNOWN + }; + + void discard() + { + const StoreIterator store_it = lru_list.back(); + if (hook) { + hook->onDiscard(store_it->first, store_it->second.value); + } + store.erase(store_it); + lru_list.pop_back(); + } + + bool set(const K& key, const V& value, Mode mode) + { + mutex.lock(); + const StoreIterator store_it = store.find(key); + const bool is_new_key = store_it == store.end(); + if (is_new_key) { + if (mode == Mode::UNCOND || mode == Mode::UNKNOWN) { + if (lru_list.size() >= store_size) { + discard(); + } + lru_list.push_front(store.end()); + const Value v = { + value, + lru_list.begin() + }; + lru_list.front() = store.emplace(key, v).first; + } + } else { + if (mode == Mode::UNCOND || mode == Mode::KNOWN) { + if (hook) { + hook->onDisplace(key, store_it->second.value); + } + lru_list.splice( + lru_list.begin(), + lru_list, + store_it->second.lru_list_it + ); + store_it->second.value = value; + } + } + mutex.unlock(); + + return is_new_key; + } + + void remove(const StoreIterator& store_it) + { + if (hook) { + hook->onRemove(store_it->first, store_it->second.value); + } + lru_list.erase(store_it->second.lru_list_it); + store.erase(store_it); + } + + unsigned long store_size; + Hook* const hook; + mutable MyMutex mutex; + Store store; + mutable LruList lru_list; +}; + +} diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index a0ea5afb4..533d1e89d 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -3,440 +3,233 @@ #include "stdimagesource.h" #include "../rtgui/options.h" -rtengine::CLUTStore clutStore; - -using namespace rtengine; - -const float MAXVAL8 = 255.; - -CLUTStore::CLUTStore() +namespace { -} -CLUT* CLUTStore::getClut( const Glib::ustring& filename ) +std::unique_ptr loadFile( + const Glib::ustring& filename, + const Glib::ustring& working_color_space, + unsigned int& clut_level +) { - CLUT *result = 0; - m_mutex.lock(); - Cluts::iterator cluts_it = m_cluts.find(filename); + std::unique_ptr result; - if (cluts_it == m_cluts.end()) { - if (m_cluts.size() >= options.clutCacheSize) { - // Evict a "random" entry from cache - Cluts::iterator victim_it = m_cluts.begin(); + rtengine::StdImageSource img_src; - if (--victim_it->second.first == -1) { - delete victim_it->second.second; - m_cluts.erase(victim_it); - } - } - - cluts_it = m_cluts.insert(std::make_pair(filename, std::make_pair(0, new HaldCLUT))).first; - cluts_it->second.second->load( filename ); - } - - if (cluts_it->second.second->isValid()) { - result = cluts_it->second.second; - ++cluts_it->second.first; - } else { - delete cluts_it->second.second; - m_cluts.erase(cluts_it); - } - - m_mutex.unlock(); - - return result; -} - -void CLUTStore::releaseClut( const CLUT* clut ) -{ - m_mutex.lock(); - - for (Cluts::iterator cluts_it = m_cluts.begin(); cluts_it != m_cluts.end(); ++cluts_it) { - if (cluts_it->second.second == clut) { - if (--cluts_it->second.first == -1) { - delete cluts_it->second.second; - m_cluts.erase(cluts_it); - } - - break; - } - } - - m_mutex.unlock(); -} - -void CLUTStore::clearCache() -{ - m_mutex.lock(); - - for (Cluts::iterator cluts_it = m_cluts.begin(); cluts_it != m_cluts.end();) { - if (--cluts_it->second.first == -1) { - delete cluts_it->second.second; - Cluts::iterator tmp = cluts_it; - ++cluts_it; - m_cluts.erase(tmp); - } else { - ++cluts_it; - } - } - - m_mutex.unlock(); -} - -void rtengine::splitClutFilename( Glib::ustring filename, Glib::ustring &name, Glib::ustring &extension, Glib::ustring &profileName ) -{ - filename = Glib::path_get_basename( filename ); - name = filename; - //remove dirs - size_t lastSlashPos = filename.find_last_of( "/" ); - - if ( lastSlashPos == Glib::ustring::npos ) { - lastSlashPos = filename.find_last_of( "\\" ); - } - - size_t lastDotPos = filename.find_last_of( '.' ); - - if ( lastDotPos != Glib::ustring::npos ) { - name = filename.substr( 0, lastDotPos ); - extension = filename.substr( lastDotPos + 1, Glib::ustring::npos ); - } - - profileName = "sRGB"; // sRGB by default - static std::vector workingProfiles = rtengine::getWorkingProfiles(); - - for ( std::vector::iterator it = workingProfiles.begin(); it != workingProfiles.end(); ++it ) { - Glib::ustring ¤tProfile = *it; - - if ( std::search( name.rbegin(), name.rend(), currentProfile.rbegin(), currentProfile.rend() ) == name.rbegin() ) { - profileName = currentProfile; - name = name.substr( 0, name.size() - currentProfile.size() ); - break; - } - } -} - -//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -HaldCLUT::HaldCLUT() - : m_clutImage( 0 ), - m_level (0), - m_profile( "sRGB" ) -{ -} - -HaldCLUT::~HaldCLUT() -{ - if ( m_clutImage ) { - m_clutImage->free(); - m_clutImage = 0; - } -} - -void HaldCLUT::load( Glib::ustring filename ) -{ - m_clutImage = loadFile( filename, "", m_level ); - Glib::ustring name, ext; - splitClutFilename( filename, name, ext, m_profile ); - - if ( m_clutImage ) { - m_filename = filename; - } -} - -Glib::ustring HaldCLUT::profile() const -{ - return m_profile; -} - -Imagefloat* HaldCLUT::loadFile( Glib::ustring filename, Glib::ustring workingColorSpace, int &outLevel ) -{ - Imagefloat *result = 0; - StdImageSource imgSrc; - - if ( !Glib::file_test( filename, Glib::FILE_TEST_EXISTS ) || imgSrc.load(filename) ) { + if (!Glib::file_test(filename, Glib::FILE_TEST_EXISTS) || img_src.load(filename)) { return result; } int fw, fh; - imgSrc.getFullSize (fw, fh, TR_NONE); + img_src.getFullSize(fw, fh, TR_NONE); bool valid = false; - //test on Hald format, copypasted from http://www.quelsolaar.com/technology/clut.html - if ( fw == fh ) { - outLevel = 1; - - for(; outLevel * outLevel * outLevel < fw; outLevel++); - - if( !( outLevel * outLevel * outLevel > fw ) ) { + if (fw == fh) { + unsigned int level = 1; + while (level * level * level < fw) { + ++level; + } + if (level * level * level == fw && level > 1) { + clut_level = level; valid = true; } } - if ( valid ) { - ColorTemp currWB = imgSrc.getWB(); - Imagefloat* baseImg = new Imagefloat (fw, fh); - PreviewProps pp (0, 0, fw, fh, 1); + if (valid) { + rtengine::ColorTemp curr_wb = img_src.getWB(); + result = std::unique_ptr(new rtengine::Imagefloat(fw, fh)); + const PreviewProps pp(0, 0, fw, fh, 1); - procparams::ColorManagementParams icm; - icm.working = workingColorSpace; + rtengine::procparams::ColorManagementParams icm; + icm.working = working_color_space; - imgSrc.getImage (currWB, TR_NONE, baseImg, pp, procparams::ToneCurveParams(), icm, procparams::RAWParams()); + img_src.getImage(curr_wb, TR_NONE, result.get(), pp, rtengine::procparams::ToneCurveParams(), icm, rtengine::procparams::RAWParams()); - if ( !workingColorSpace.empty() ) { - imgSrc.convertColorSpace(baseImg, icm, currWB); + if (!working_color_space.empty()) { + img_src.convertColorSpace(result.get(), icm, curr_wb); } - - result = baseImg; } return result; } -void HaldCLUT::loadClut( Imagefloat *img, RawClut &outClut ) +inline void posToXy(unsigned int pos, unsigned int width, unsigned int (&x)[2], unsigned int (&y)[2]) { - img->normalizeFloatTo1(); - int y_size = img->getH(); - int x_size = img->getW(); - outClut.resize( x_size * y_size * 3 ); - int clutIdx = 0; + x[0] = pos % width; + y[0] = pos / width; + x[1] = (pos + 1) % width; + y[1] = (pos + 1) / width; +} - //int level = m_level * m_level; (unused) - for(int y = 0; y < y_size; y++) { - for(int x = 0; x < x_size; x++) { - outClut[ clutIdx * 3 ] = img->r( y, x ) * MAXVAL8; - outClut[ clutIdx * 3 + 1 ] = img->g( y, x ) * MAXVAL8; - outClut[ clutIdx * 3 + 2 ] = img->b( y, x ) * MAXVAL8; +} - ++clutIdx; +void rtengine::CLUT::splitClutFilename( + const Glib::ustring& filename, + Glib::ustring& name, + Glib::ustring& extension, + Glib::ustring& profile_name +) +{ + Glib::ustring basename = Glib::path_get_basename(filename); + + Glib::ustring::size_type last_slash_pos = basename.rfind('/'); + if (last_slash_pos == Glib::ustring::npos) { + last_slash_pos = basename.rfind('\\'); + } + + const Glib::ustring::size_type last_dot_pos = basename.rfind('.'); + + if (last_dot_pos != Glib::ustring::npos) { + name.assign(basename, 0, last_dot_pos); + extension.assign(basename, last_dot_pos + 1, Glib::ustring::npos); + } else { + name = basename; + } + + profile_name = "sRGB"; + + for (const auto& working_profile : rtengine::getWorkingProfiles()) { + if ( std::search( name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend() ) == name.rbegin() ) { + profile_name = working_profile; + name.erase(name.size() - working_profile.size()); + break; } } } -Imagefloat* HaldCLUT::generateIdentImage( int level ) +rtengine::HaldCLUT::HaldCLUT() : + clut_level(0), + clut_profile("sRGB") { - int imageWidth = level * level * level; - Imagefloat *resultImg = new Imagefloat( imageWidth, imageWidth ); +} - int cubeSideSize = level * level; - float step = MAXVALF / (cubeSideSize - 1); - int pos = 0; +rtengine::HaldCLUT::~HaldCLUT() +{ +} - for( int b = 0; b < cubeSideSize; ++b ) { - for ( int g = 0; g < cubeSideSize; ++g ) { - for ( int r = 0; r < cubeSideSize; ++r ) { - int x = pos / imageWidth; - int y = pos % imageWidth; - resultImg->r( x, y ) = step * r; - resultImg->g( x, y ) = step * g; - resultImg->b( x, y ) = step * b; - ++pos; - } +bool rtengine::HaldCLUT::load(const Glib::ustring& filename) +{ + clut_image = loadFile(filename, "", clut_level); + Glib::ustring name, ext; + splitClutFilename(filename, name, ext, clut_profile); + + if (clut_image) { + clut_filename = filename; + return true; + } + + return false; +} + +rtengine::HaldCLUT::operator bool() const +{ + return static_cast(clut_image); +} + +Glib::ustring rtengine::HaldCLUT::getFilename() const +{ + return clut_filename; +} + +Glib::ustring rtengine::HaldCLUT::getProfile() const +{ + return clut_profile; +} + +void rtengine::HaldCLUT::getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const +{ + const unsigned int level = clut_level * clut_level; + + const float flevel_minus_one = static_cast(level - 1) / 65535.0f; + const float flevel_minus_two = static_cast(level - 2); + + const unsigned int red = std::min(flevel_minus_two, r * flevel_minus_one); + const unsigned int green = std::min(flevel_minus_two, g * flevel_minus_one); + const unsigned int blue = std::min(flevel_minus_two, b * flevel_minus_one); + + r = r * flevel_minus_one - red; + g = g * flevel_minus_one - green; + b = b * flevel_minus_one - blue; + + const unsigned int level_square = level * level; + + const unsigned int color = red + green * level + blue * level_square; + + unsigned int x[2]; + unsigned int y[2]; + posToXy(color, clut_image->getWidth(), x, y); + + float tmp1[4] __attribute__((aligned(16))); + tmp1[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; + tmp1[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; + tmp1[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + + posToXy(color + level, clut_image->getWidth(), x, y); + + float tmp2[4] __attribute__((aligned(16))); + tmp2[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; + tmp2[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; + tmp2[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + + float out[4] __attribute__((aligned(16))); + out[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + out[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + out[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + + posToXy(color + level_square, clut_image->getWidth(), x, y); + + tmp1[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; + tmp1[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; + tmp1[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + + posToXy(color + level + level_square, clut_image->getWidth(), x, y); + + tmp2[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; + tmp2[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; + tmp2[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + + tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + + out_r = out[0] * (1 - b) + tmp1[0] * b; + out_g = out[1] * (1 - b) + tmp1[1] * b; + out_b = out[2] * (1 - b) + tmp1[2] * b; +} + +rtengine::CLUTStore& rtengine::CLUTStore::getInstance() +{ + static CLUTStore instance; + return instance; +} + +std::shared_ptr rtengine::CLUTStore::getClut(const Glib::ustring& filename) +{ + std::shared_ptr result; + + if (!cache.get(filename, result)) { + std::unique_ptr clut(new rtengine::HaldCLUT); + if (clut->load(filename)) { + result = std::move(clut); + cache.insert(filename, result); } } - return resultImg; + return result; } - -bool HaldCLUT::isValid() const +void rtengine::CLUTStore::releaseClut(const std::shared_ptr& clut) { - return m_clutImage != 0; + cache.remove(clut->getFilename()); } -void HaldCLUT::getRGB( float rr, float gg, float bb, float &outR, float &outG, float &outB ) const +void rtengine::CLUTStore::clearCache() { - rr /= MAXVALF; - gg /= MAXVALF; - bb /= MAXVALF; - correct( *m_clutImage, m_level, rr, gg, bb, outR, outG, outB ); + cache.clear(); } -inline float valF( unsigned char val ) +rtengine::CLUTStore::CLUTStore() : + cache(options.clutCacheSize) { - return float( val ) / MAXVAL8; -} - -// copypasted from http://www.quelsolaar.com/technology/clut.html -void HaldCLUT::correct( const HaldCLUT::RawClut& clut, int level, float rr, float gg, float bb, float &outR, float &outG, float &outB ) -{ - int color, red, green, blue, i, j; - float tmp[6], r, g, b; - level = level * level; - - red = rr * (float)(level - 1); - - if(red > level - 2) { - red = (float)level - 2; - } - - if(red < 0) { - red = 0; - } - - green = gg * (float)(level - 1); - - if(green > level - 2) { - green = (float)level - 2; - } - - if(green < 0) { - green = 0; - } - - blue = bb * (float)(level - 1); - - if(blue > level - 2) { - blue = (float)level - 2; - } - - if(blue < 0) { - blue = 0; - } - - r = rr * (float)(level - 1) - red; - g = gg * (float)(level - 1) - green; - b = bb * (float)(level - 1) - blue; - - color = red + green * level + blue * level * level; - - i = color * 3; - j = (color + 1) * 3; - - tmp[0] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[1] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[2] = valF( clut[i] ) * (1 - r) + valF( clut[j] ) * r; - - i = (color + level) * 3; - j = (color + level + 1) * 3; - - tmp[3] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[4] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[5] = valF( clut[i] ) * (1 - r) + valF( clut[j] ) * r; - - outR = tmp[0] * (1 - g) + tmp[3] * g; - outG = tmp[1] * (1 - g) + tmp[4] * g; - outB = tmp[2] * (1 - g) + tmp[5] * g; - - i = (color + level * level) * 3; - j = (color + level * level + 1) * 3; - - tmp[0] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[1] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[2] = valF( clut[i] ) * (1 - r) + valF( clut[j] ) * r; - - i = (color + level + level * level) * 3; - j = (color + level + level * level + 1) * 3; - - tmp[3] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[4] = valF( clut[i++] ) * (1 - r) + valF( clut[j++] ) * r; - tmp[5] = valF( clut[i] ) * (1 - r) + valF( clut[j] ) * r; - - tmp[0] = tmp[0] * (1 - g) + tmp[3] * g; - tmp[1] = tmp[1] * (1 - g) + tmp[4] * g; - tmp[2] = tmp[2] * (1 - g) + tmp[5] * g; - - outR = outR * (1 - b) + tmp[0] * b; - outG = outG * (1 - b) + tmp[1] * b; - outB = outB * (1 - b) + tmp[2] * b; -} - -inline void pos2xy( int pos, int imageSideSize, int &outX, int &outY ) -{ - outX = pos / imageSideSize; - outY = pos % imageSideSize; -} - -void HaldCLUT::correct( Imagefloat &clutImage, int level, float rr, float gg, float bb, float &outR, float &outG, float &outB ) -{ - int color, red, green, blue, i, j; - float tmp[6], r, g, b; - level = level * level; - int imageSideSize = clutImage.getW(); - - red = rr * (float)(level - 1); - - if(red > level - 2) { - red = (float)level - 2; - } - - if(red < 0) { - red = 0; - } - - green = gg * (float)(level - 1); - - if(green > level - 2) { - green = (float)level - 2; - } - - if(green < 0) { - green = 0; - } - - blue = bb * (float)(level - 1); - - if(blue > level - 2) { - blue = (float)level - 2; - } - - if(blue < 0) { - blue = 0; - } - - r = rr * (float)(level - 1) - red; - g = gg * (float)(level - 1) - green; - b = bb * (float)(level - 1) - blue; - - color = red + green * level + blue * level * level; - - - i = color; - j = color + 1; - int xi, yi, xj, yj; - pos2xy( i, imageSideSize, xi, yi ); - pos2xy( j, imageSideSize, xj, yj ); - - tmp[0] = clutImage.r( xi, yi ) * (1 - r) + clutImage.r( xj, yj ) * r; - tmp[1] = clutImage.g( xi, yi ) * (1 - r) + clutImage.g( xj, yj ) * r; - tmp[2] = clutImage.b( xi, yi ) * (1 - r) + clutImage.b( xj, yj ) * r; - - i = color + level; - j = color + level + 1; - pos2xy( i, imageSideSize, xi, yi ); - pos2xy( j, imageSideSize, xj, yj ); - - tmp[3] = clutImage.r( xi, yi ) * (1 - r) + clutImage.r( xj, yj ) * r; - tmp[4] = clutImage.g( xi, yi ) * (1 - r) + clutImage.g( xj, yj ) * r; - tmp[5] = clutImage.b( xi, yi ) * (1 - r) + clutImage.b( xj, yj ) * r; - - outR = tmp[0] * (1 - g) + tmp[3] * g; - outG = tmp[1] * (1 - g) + tmp[4] * g; - outB = tmp[2] * (1 - g) + tmp[5] * g; - - i = color + level * level; - j = color + level * level + 1; - pos2xy( i, imageSideSize, xi, yi ); - pos2xy( j, imageSideSize, xj, yj ); - - tmp[0] = clutImage.r( xi, yi ) * (1 - r) + clutImage.r( xj, yj ) * r; - tmp[1] = clutImage.g( xi, yi ) * (1 - r) + clutImage.g( xj, yj ) * r; - tmp[2] = clutImage.b( xi, yi ) * (1 - r) + clutImage.b( xj, yj ) * r; - - i = color + level + level * level; - j = color + level + level * level + 1; - pos2xy( i, imageSideSize, xi, yi ); - pos2xy( j, imageSideSize, xj, yj ); - - tmp[3] = clutImage.r( xi, yi ) * (1 - r) + clutImage.r( xj, yj ) * r; - tmp[4] = clutImage.g( xi, yi ) * (1 - r) + clutImage.g( xj, yj ) * r; - tmp[5] = clutImage.b( xi, yi ) * (1 - r) + clutImage.b( xj, yj ) * r; - - tmp[0] = tmp[0] * (1 - g) + tmp[3] * g; - tmp[1] = tmp[1] * (1 - g) + tmp[4] * g; - tmp[2] = tmp[2] * (1 - g) + tmp[5] * g; - - outR = outR * (1 - b) + tmp[0] * b; - outG = outG * (1 - b) + tmp[1] * b; - outB = outB * (1 - b) + tmp[2] * b; } diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index de080b737..ce8fd9627 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -1,107 +1,78 @@ -#ifndef CLUT_STORE_INCLUDED -#define CLUT_STORE_INCLUDED +#pragma once + +#include #include -#include "../rtgui/threadutils.h" + #include "imagefloat.h" -#include -#include +#include "cache.h" namespace rtengine { -// simple CLUT interface class CLUT { public: - virtual void getRGB( float r, float g, float b, float &outR, float &outG, float &outB ) const = 0; - virtual Glib::ustring profile() const = 0; -protected: - virtual ~CLUT() {}; + CLUT() = default; + CLUT(const CLUT& other) = delete; + CLUT& operator =(const CLUT& other) = delete; + virtual ~CLUT() = default; + + virtual explicit operator bool() const = 0; + + virtual Glib::ustring getFilename() const = 0; + virtual Glib::ustring getProfile() const = 0; + + virtual void getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const = 0; + + static void splitClutFilename( + const Glib::ustring& filename, + Glib::ustring& name, + Glib::ustring& extension, + Glib::ustring& profile_name + ); }; -class HaldCLUT : public CLUT +class HaldCLUT + : public CLUT { public: HaldCLUT(); ~HaldCLUT(); - void load( Glib::ustring filename ); - bool isValid() const; - void getRGB( float r, float g, float b, float &outR, float &outG, float &outB ) const; - Glib::ustring profile() const; + bool load(const Glib::ustring& filename); - typedef std::vector RawClut; // using 8 bit for reduce memory usage - static void correct( const RawClut&, int level, float r, float g, float b, float &outR, float &outG, float &outB ); - static void correct( Imagefloat &clutImage, int level, float rr, float gg, float bb, float &outR, float &outG, float &outB ); - static Imagefloat* generateIdentImage( int level ); - static Imagefloat* loadFile( Glib::ustring filename, Glib::ustring workingColorSpace, int &outLevel ); + explicit operator bool() const; + + Glib::ustring getFilename() const; + Glib::ustring getProfile() const; + + void getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const; private: - - void loadClut( Imagefloat *img, RawClut &outClut ); - - Imagefloat *m_clutImage; - int m_level; - Glib::ustring m_filename; - Glib::ustring m_profile; + std::unique_ptr clut_image; + unsigned int clut_level; + Glib::ustring clut_filename; + Glib::ustring clut_profile; }; -// CLUT cache class CLUTStore { public: - CLUTStore(); + static CLUTStore& getInstance(); - CLUT* getClut( const Glib::ustring& filename ); - void releaseClut( const CLUT* clut ); + CLUTStore(const CLUTStore& other) = delete; + CLUTStore& operator =(const CLUTStore& other) = delete; + + std::shared_ptr getClut(const Glib::ustring& filename); + void releaseClut(const std::shared_ptr& clut); void clearCache(); private: - typedef std::map > Cluts; + CLUTStore(); - Cluts m_cluts; - MyMutex m_mutex; + Cache> cache; }; -void splitClutFilename( Glib::ustring filename, Glib::ustring &name, Glib::ustring &extension, Glib::ustring &profileName ); - -}; //namespace rtengine - -extern rtengine::CLUTStore clutStore; - -namespace rtengine -{ - -//support class for automate call of clutStore.releaseClut() -class ClutPtr -{ -public: - ClutPtr() : m_point( 0 ) {} - explicit ClutPtr(CLUT *p) : m_point( p ) {} - ~ClutPtr() - { - clutStore.releaseClut( m_point ); - } - const CLUT* operator-> () const - { - return m_point; - } - operator bool() const - { - return m_point != 0; - } - void set( CLUT *p ) - { - m_point = p; - } - -private: - ClutPtr& operator=(ClutPtr const& cp ); - CLUT *m_point; -}; - -}; //namespace rtengine - -#endif +} diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 989d9c6a7..2732c567d 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3205,21 +3205,21 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - ClutPtr colorLUT; + std::shared_ptr colorLUT; bool clutAndWorkingProfilesAreSame = false; TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { - colorLUT.set( clutStore.getClut( params->filmSimulation.clutFilename ) ); + colorLUT = CLUTStore::getInstance().getClut( params->filmSimulation.clutFilename ); if ( colorLUT ) { - clutAndWorkingProfilesAreSame = colorLUT->profile() == params->icm.working; + clutAndWorkingProfilesAreSame = colorLUT->getProfile() == params->icm.working; if ( !clutAndWorkingProfilesAreSame ) { work2xyz = iccStore->workingSpaceMatrix( params->icm.working ); - xyz2clut = iccStore->workingSpaceInverseMatrix( colorLUT->profile() ); + xyz2clut = iccStore->workingSpaceInverseMatrix( colorLUT->getProfile() ); xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); - clut2xyz = iccStore->workingSpaceMatrix( colorLUT->profile() ); + clut2xyz = iccStore->workingSpaceMatrix( colorLUT->getProfile() ); } } } @@ -4337,6 +4337,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //Film Simulations if ( colorLUT ) { + MyTime start, stop; + start.set(); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; @@ -4375,6 +4377,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } + stop.set(); + printf("Film simulation took %dus.\n", stop.etime(start)); } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c03addb42..bda0f84b0 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -857,7 +857,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p // 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) { - clutStore.clearCache(); + CLUTStore::getInstance().clearCache(); } // freeing up some memory diff --git a/rtgui/filmsimulation.cc b/rtgui/filmsimulation.cc index 07f85df94..3ee1f4742 100644 --- a/rtgui/filmsimulation.cc +++ b/rtgui/filmsimulation.cc @@ -72,7 +72,7 @@ void FilmSimulation::onClutSelected() if ( getEnabled() && !currentClutFilename.empty() && listener && currentClutFilename != m_oldClutFilename ) { Glib::ustring clutName, dummy; - splitClutFilename( currentClutFilename, clutName, dummy, dummy ); + CLUT::splitClutFilename( currentClutFilename, clutName, dummy, dummy ); listener->panelChanged( EvFilmSimulationFilename, clutName ); m_oldClutFilename = currentClutFilename; @@ -132,7 +132,7 @@ void FilmSimulation::read( const rtengine::procparams::ProcParams* pp, const Par if ( !get_inconsistent() && !pp->filmSimulation.enabled ) { if (options.clutCacheSize == 1) { - clutStore.clearCache(); + CLUTStore::getInstance().clearCache(); } } @@ -279,7 +279,7 @@ int ClutComboBox::parseDir (const Glib::ustring& path) for (const auto& entry : entries) { Glib::ustring name, extension, profileName; - splitClutFilename (entry, name, extension, profileName); + CLUT::splitClutFilename (entry, name, extension, profileName); extension = extension.casefold (); if (extension.compare ("tif") != 0 && extension.compare ("png") != 0) { From f639cd6b82849a7e3bd3ade4d5e0aaf6507b75c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 18 Apr 2016 20:38:23 +0200 Subject: [PATCH 012/232] Use Image16 instead of Imagefloat for CLUT Gain speed and reduce memory by using Image16 instead of Imagefloat for the CLUT. --- rtengine/clutstore.cc | 28 ++++++++++++++++++---------- rtengine/clutstore.h | 7 +++++-- rtengine/improcfun.cc | 4 ---- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 533d1e89d..53adcc013 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -1,18 +1,22 @@ +#include + #include "clutstore.h" -#include "rt_math.h" + +#include "image16.h" +#include "imagefloat.h" #include "stdimagesource.h" #include "../rtgui/options.h" namespace { -std::unique_ptr loadFile( +std::unique_ptr loadFile( const Glib::ustring& filename, const Glib::ustring& working_color_space, unsigned int& clut_level ) { - std::unique_ptr result; + std::unique_ptr result; rtengine::StdImageSource img_src; @@ -38,17 +42,19 @@ std::unique_ptr loadFile( if (valid) { rtengine::ColorTemp curr_wb = img_src.getWB(); - result = std::unique_ptr(new rtengine::Imagefloat(fw, fh)); + std::unique_ptr img_float = std::unique_ptr(new rtengine::Imagefloat(fw, fh)); const PreviewProps pp(0, 0, fw, fh, 1); rtengine::procparams::ColorManagementParams icm; icm.working = working_color_space; - img_src.getImage(curr_wb, TR_NONE, result.get(), pp, rtengine::procparams::ToneCurveParams(), icm, rtengine::procparams::RAWParams()); + img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), icm, rtengine::procparams::RAWParams()); if (!working_color_space.empty()) { - img_src.convertColorSpace(result.get(), icm, curr_wb); + img_src.convertColorSpace(img_float.get(), icm, curr_wb); } + + result = std::unique_ptr(img_float->to16()); } return result; @@ -100,6 +106,8 @@ void rtengine::CLUT::splitClutFilename( rtengine::HaldCLUT::HaldCLUT() : clut_level(0), + flevel_minus_one(0.0f), + flevel_minus_two(0.0f), clut_profile("sRGB") { } @@ -116,6 +124,9 @@ bool rtengine::HaldCLUT::load(const Glib::ustring& filename) if (clut_image) { clut_filename = filename; + clut_level *= clut_level; + flevel_minus_one = static_cast(clut_level - 1) / 65535.0f; + flevel_minus_two = static_cast(clut_level - 2); return true; } @@ -139,10 +150,7 @@ Glib::ustring rtengine::HaldCLUT::getProfile() const void rtengine::HaldCLUT::getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const { - const unsigned int level = clut_level * clut_level; - - const float flevel_minus_one = static_cast(level - 1) / 65535.0f; - const float flevel_minus_two = static_cast(level - 2); + const unsigned int level = clut_level; // This is important const unsigned int red = std::min(flevel_minus_two, r * flevel_minus_one); const unsigned int green = std::min(flevel_minus_two, g * flevel_minus_one); diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index ce8fd9627..b084c67fe 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -4,12 +4,13 @@ #include -#include "imagefloat.h" #include "cache.h" namespace rtengine { +class Image16; + class CLUT { public: @@ -50,8 +51,10 @@ public: void getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const; private: - std::unique_ptr clut_image; + std::unique_ptr clut_image; unsigned int clut_level; + float flevel_minus_one; + float flevel_minus_two; Glib::ustring clut_filename; Glib::ustring clut_profile; }; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2732c567d..d61c79513 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4337,8 +4337,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //Film Simulations if ( colorLUT ) { - MyTime start, stop; - start.set(); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; @@ -4377,8 +4375,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - stop.set(); - printf("Film simulation took %dus.\n", stop.etime(start)); } From b1a9e968365c5cafcd499dd706268d6f26ddf98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 23 Apr 2016 22:46:21 +0200 Subject: [PATCH 013/232] Store HaldCLUT as flat RGBx array Instead of using an `Image16`, which is organized in planes, store the HaldCLUT in an `AlignedBuffer` with sequential RGBx values. This gives a speedup of roughly 23% here. --- rtengine/alignedbuffer.h | 31 +++----- rtengine/clutstore.cc | 163 ++++++++++++++++++++++++++------------- rtengine/clutstore.h | 16 ++-- rtengine/improcfun.cc | 10 +-- 4 files changed, 131 insertions(+), 89 deletions(-) diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index a33d4dfe8..ac8471b7e 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -18,9 +18,10 @@ */ #ifndef _ALIGNEDBUFFER_ #define _ALIGNEDBUFFER_ -#include +#include #include #include +#include #include #include "../rtgui/threadutils.h" @@ -58,7 +59,7 @@ public: /** @brief Return true if there's no memory allocated */ - bool isEmpty() + bool isEmpty() const { return allocatedSize == 0; } @@ -120,28 +121,14 @@ public: void swap(AlignedBuffer &other) { - void *tmpReal = other.real; - other.real = real; - real = tmpReal; - - char tmpAlignt = other.alignment; - other.alignment = alignment; - alignment = tmpAlignt; - - size_t tmpAllocSize = other.allocatedSize; - other.allocatedSize = allocatedSize; - allocatedSize = tmpAllocSize; - - T* tmpData = other.data; - other.data = data; - data = tmpData; - - bool tmpInUse = other.inUse; - other.inUse = inUse; - inUse = tmpInUse; + std::swap(real, other.real); + std::swap(alignment, other.alignment); + std::swap(allocatedSize, other.allocatedSize); + std::swap(data, other.data); + std::swap(inUse, other.inUse); } - unsigned int getSize() + unsigned int getSize() const { return unitSize ? allocatedSize / unitSize : 0; } diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 53adcc013..add051254 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -1,8 +1,11 @@ #include +#ifdef __SSE2__ +#include +#endif + #include "clutstore.h" -#include "image16.h" #include "imagefloat.h" #include "stdimagesource.h" #include "../rtgui/options.h" @@ -10,24 +13,23 @@ namespace { -std::unique_ptr loadFile( +bool loadFile( const Glib::ustring& filename, const Glib::ustring& working_color_space, + AlignedBuffer& clut_image, unsigned int& clut_level ) { - std::unique_ptr result; - rtengine::StdImageSource img_src; if (!Glib::file_test(filename, Glib::FILE_TEST_EXISTS) || img_src.load(filename)) { - return result; + return false; } int fw, fh; img_src.getFullSize(fw, fh, TR_NONE); - bool valid = false; + bool res = false; if (fw == fh) { unsigned int level = 1; @@ -36,11 +38,11 @@ std::unique_ptr loadFile( } if (level * level * level == fw && level > 1) { clut_level = level; - valid = true; + res = true; } } - if (valid) { + if (res) { rtengine::ColorTemp curr_wb = img_src.getWB(); std::unique_ptr img_float = std::unique_ptr(new rtengine::Imagefloat(fw, fh)); const PreviewProps pp(0, 0, fw, fh, 1); @@ -54,20 +56,39 @@ std::unique_ptr loadFile( img_src.convertColorSpace(img_float.get(), icm, curr_wb); } - result = std::unique_ptr(img_float->to16()); + AlignedBuffer image(fw * fh * 4 + 1); + + std::size_t index = 0; + for (int y = 0; y < fh; ++y) { + for (int x = 0; x < fw; ++x) { + image.data[index] = img_float->r(y, x); + ++index; + image.data[index] = img_float->g(y, x); + ++index; + image.data[index] = img_float->b(y, x); + index += 2; + } + } + + clut_image.swap(image); } - return result; + return res; } -inline void posToXy(unsigned int pos, unsigned int width, unsigned int (&x)[2], unsigned int (&y)[2]) +inline void posToIndex(unsigned int pos, size_t (&index)[2]) { - x[0] = pos % width; - y[0] = pos / width; - x[1] = (pos + 1) % width; - y[1] = (pos + 1) / width; + index[0] = static_cast(pos) * 4; + index[1] = static_cast(pos + 1) * 4; } +#ifdef __SSE2__ +inline __m128 getClutValue(const AlignedBuffer& clut_image, size_t index) +{ + return _mm_cvtpu16_ps(*reinterpret_cast(clut_image.data + index)); +} +#endif + } void rtengine::CLUT::splitClutFilename( @@ -118,11 +139,10 @@ rtengine::HaldCLUT::~HaldCLUT() bool rtengine::HaldCLUT::load(const Glib::ustring& filename) { - clut_image = loadFile(filename, "", clut_level); - Glib::ustring name, ext; - splitClutFilename(filename, name, ext, clut_profile); + if (loadFile(filename, "", clut_image, clut_level)) { + Glib::ustring name, ext; + splitClutFilename(filename, name, ext, clut_profile); - if (clut_image) { clut_filename = filename; clut_level *= clut_level; flevel_minus_one = static_cast(clut_level - 1) / 65535.0f; @@ -135,7 +155,7 @@ bool rtengine::HaldCLUT::load(const Glib::ustring& filename) rtengine::HaldCLUT::operator bool() const { - return static_cast(clut_image); + return !clut_image.isEmpty(); } Glib::ustring rtengine::HaldCLUT::getFilename() const @@ -148,62 +168,97 @@ Glib::ustring rtengine::HaldCLUT::getProfile() const return clut_profile; } -void rtengine::HaldCLUT::getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const +void rtengine::HaldCLUT::getRGB(float r, float g, float b, float out_rgbx[4]) const { - const unsigned int level = clut_level; // This is important + const unsigned int level = clut_level; // This is important const unsigned int red = std::min(flevel_minus_two, r * flevel_minus_one); const unsigned int green = std::min(flevel_minus_two, g * flevel_minus_one); const unsigned int blue = std::min(flevel_minus_two, b * flevel_minus_one); + const unsigned int level_square = level * level; + + const unsigned int color = red + green * level + blue * level_square; + +#ifndef __SSE2__ r = r * flevel_minus_one - red; g = g * flevel_minus_one - green; b = b * flevel_minus_one - blue; - const unsigned int level_square = level * level; + size_t index[2]; + posToIndex(color, index); - const unsigned int color = red + green * level + blue * level_square; + float tmp1[4] ALIGNED16; + tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - unsigned int x[2]; - unsigned int y[2]; - posToXy(color, clut_image->getWidth(), x, y); + posToIndex(color + level, index); - float tmp1[4] __attribute__((aligned(16))); - tmp1[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; - tmp1[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; - tmp1[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + float tmp2[4] ALIGNED16; + tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - posToXy(color + level, clut_image->getWidth(), x, y); + out_rgbx[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + out_rgbx[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + out_rgbx[2] = tmp1[2] * (1 - g) + tmp2[2] * g; - float tmp2[4] __attribute__((aligned(16))); - tmp2[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; - tmp2[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; - tmp2[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + posToIndex(color + level_square, index); - float out[4] __attribute__((aligned(16))); - out[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - out[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - out[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - posToXy(color + level_square, clut_image->getWidth(), x, y); + posToIndex(color + level + level_square, index); - tmp1[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; - tmp1[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; - tmp1[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - posToXy(color + level + level_square, clut_image->getWidth(), x, y); + tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; - tmp2[0] = clut_image->r(y[0], x[0]) * (1 - r) + clut_image->r(y[1], x[1]) * r; - tmp2[1] = clut_image->g(y[0], x[0]) * (1 - r) + clut_image->g(y[1], x[1]) * r; - tmp2[2] = clut_image->b(y[0], x[0]) * (1 - r) + clut_image->b(y[1], x[1]) * r; + out_rgbx[0] = out_rgbx[0] * (1 - b) + tmp1[0] * b; + out_rgbx[1] = out_rgbx[1] * (1 - b) + tmp1[1] * b; + out_rgbx[2] = out_rgbx[2] * (1 - b) + tmp1[2] * b; +#else + const __m128 v_rgb = _mm_set_ps(0.0f, b, g, r) *_mm_load_ps1(&flevel_minus_one) - _mm_set_ps(0.0f, blue, green, red); - tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + size_t index[2]; + posToIndex(color, index); - out_r = out[0] * (1 - b) + tmp1[0] * b; - out_g = out[1] * (1 - b) + tmp1[1] * b; - out_b = out[2] * (1 - b) + tmp1[2] * b; + const __m128 v_r = _mm_shuffle_ps(v_rgb, v_rgb, 0x00); + + __m128 v_cv0 = getClutValue(clut_image, index[0]); + __m128 v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + + posToIndex(color + level, index); + + v_cv0 = getClutValue(clut_image, index[0]); + __m128 v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + + const __m128 v_g = _mm_shuffle_ps(v_rgb, v_rgb, 0x55); + + __m128 v_out = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + + posToIndex(color + level_square, index); + + v_cv0 = getClutValue(clut_image, index[0]); + v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + + posToIndex(color + level + level_square, index); + + v_cv0 = getClutValue(clut_image, index[0]); + v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + + v_tmp1 = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + + const __m128 v_b = _mm_shuffle_ps(v_rgb, v_rgb, 0xAA); + + _mm_store_ps(out_rgbx, v_b * (v_tmp1 - v_out) + v_out); +#endif } rtengine::CLUTStore& rtengine::CLUTStore::getInstance() diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index b084c67fe..ed3491fbe 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -1,16 +1,16 @@ #pragma once #include +#include #include #include "cache.h" +#include "alignedbuffer.h" namespace rtengine { -class Image16; - class CLUT { public: @@ -24,7 +24,7 @@ public: virtual Glib::ustring getFilename() const = 0; virtual Glib::ustring getProfile() const = 0; - virtual void getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const = 0; + virtual void getRGB(float r, float g, float b, float out_rgbx[4]) const = 0; static void splitClutFilename( const Glib::ustring& filename, @@ -43,15 +43,15 @@ public: bool load(const Glib::ustring& filename); - explicit operator bool() const; + explicit operator bool() const override; - Glib::ustring getFilename() const; - Glib::ustring getProfile() const; + Glib::ustring getFilename() const override; + Glib::ustring getProfile() const override; - void getRGB(float r, float g, float b, float& out_r, float& out_g, float& out_b) const; + void getRGB(float r, float g, float b, float out_rgbx[4]) const override; private: - std::unique_ptr clut_image; + AlignedBuffer clut_image; unsigned int clut_level; float flevel_minus_one; float flevel_minus_two; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d61c79513..2e15da916 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4355,12 +4355,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceG = CLIP( Color::gamma_srgb( sourceG ) ); sourceB = CLIP( Color::gamma_srgb( sourceB ) ); - float r, g, b; - colorLUT->getRGB( sourceR, sourceG, sourceB, r, g, b ); + float out_rgbx[4] ALIGNED16; + colorLUT->getRGB( sourceR, sourceG, sourceB, out_rgbx ); // apply strength - sourceR = r * filmSimCorrectedStrength + sourceR * filmSimSourceStrength; - sourceG = g * filmSimCorrectedStrength + sourceG * filmSimSourceStrength; - sourceB = b * filmSimCorrectedStrength + sourceB * filmSimSourceStrength; + sourceR = out_rgbx[0] * filmSimCorrectedStrength + sourceR * filmSimSourceStrength; + sourceG = out_rgbx[1] * filmSimCorrectedStrength + sourceG * filmSimSourceStrength; + sourceB = out_rgbx[2] * filmSimCorrectedStrength + sourceB * filmSimSourceStrength; // apply inverse gamma sRGB sourceR = Color::igamma_srgb( sourceR ); sourceG = Color::igamma_srgb( sourceG ); From 56f8ea086cdc95a0d177e6f83391b1ebba165344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 23 Apr 2016 23:02:02 +0200 Subject: [PATCH 014/232] Correct whitespace Last commit messed up some whitespace, this one fixes it. --- rtengine/clutstore.cc | 86 +++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index add051254..9619eff0f 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -170,94 +170,94 @@ Glib::ustring rtengine::HaldCLUT::getProfile() const void rtengine::HaldCLUT::getRGB(float r, float g, float b, float out_rgbx[4]) const { - const unsigned int level = clut_level; // This is important + const unsigned int level = clut_level; // This is important const unsigned int red = std::min(flevel_minus_two, r * flevel_minus_one); const unsigned int green = std::min(flevel_minus_two, g * flevel_minus_one); const unsigned int blue = std::min(flevel_minus_two, b * flevel_minus_one); - const unsigned int level_square = level * level; + const unsigned int level_square = level * level; - const unsigned int color = red + green * level + blue * level_square; + const unsigned int color = red + green * level + blue * level_square; #ifndef __SSE2__ r = r * flevel_minus_one - red; g = g * flevel_minus_one - green; b = b * flevel_minus_one - blue; - size_t index[2]; - posToIndex(color, index); + size_t index[2]; + posToIndex(color, index); - float tmp1[4] ALIGNED16; - tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + float tmp1[4] ALIGNED16; + tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - posToIndex(color + level, index); + posToIndex(color + level, index); - float tmp2[4] ALIGNED16; - tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + float tmp2[4] ALIGNED16; + tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - out_rgbx[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - out_rgbx[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - out_rgbx[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + out_rgbx[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + out_rgbx[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + out_rgbx[2] = tmp1[2] * (1 - g) + tmp2[2] * g; - posToIndex(color + level_square, index); + posToIndex(color + level_square, index); - tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - posToIndex(color + level + level_square, index); + posToIndex(color + level + level_square, index); - tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; + tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; + tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; - tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; + tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; + tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; out_rgbx[0] = out_rgbx[0] * (1 - b) + tmp1[0] * b; out_rgbx[1] = out_rgbx[1] * (1 - b) + tmp1[1] * b; out_rgbx[2] = out_rgbx[2] * (1 - b) + tmp1[2] * b; #else - const __m128 v_rgb = _mm_set_ps(0.0f, b, g, r) *_mm_load_ps1(&flevel_minus_one) - _mm_set_ps(0.0f, blue, green, red); + const __m128 v_rgb = _mm_set_ps(0.0f, b, g, r) *_mm_load_ps1(&flevel_minus_one) - _mm_set_ps(0.0f, blue, green, red); - size_t index[2]; - posToIndex(color, index); + size_t index[2]; + posToIndex(color, index); - const __m128 v_r = _mm_shuffle_ps(v_rgb, v_rgb, 0x00); + const __m128 v_r = _mm_shuffle_ps(v_rgb, v_rgb, 0x00); __m128 v_cv0 = getClutValue(clut_image, index[0]); __m128 v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; - posToIndex(color + level, index); + posToIndex(color + level, index); v_cv0 = getClutValue(clut_image, index[0]); - __m128 v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + __m128 v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; - const __m128 v_g = _mm_shuffle_ps(v_rgb, v_rgb, 0x55); + const __m128 v_g = _mm_shuffle_ps(v_rgb, v_rgb, 0x55); - __m128 v_out = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + __m128 v_out = v_g * (v_tmp2 - v_tmp1) + v_tmp1; - posToIndex(color + level_square, index); + posToIndex(color + level_square, index); v_cv0 = getClutValue(clut_image, index[0]); - v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; - posToIndex(color + level + level_square, index); + posToIndex(color + level + level_square, index); v_cv0 = getClutValue(clut_image, index[0]); - v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; - v_tmp1 = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + v_tmp1 = v_g * (v_tmp2 - v_tmp1) + v_tmp1; - const __m128 v_b = _mm_shuffle_ps(v_rgb, v_rgb, 0xAA); + const __m128 v_b = _mm_shuffle_ps(v_rgb, v_rgb, 0xAA); - _mm_store_ps(out_rgbx, v_b * (v_tmp1 - v_out) + v_out); + _mm_store_ps(out_rgbx, v_b * (v_tmp1 - v_out) + v_out); #endif } From 78c08e9e5c4287e7b00351732a395cbe9d2c6120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 26 Apr 2016 20:48:11 +0200 Subject: [PATCH 015/232] Add Ingo's optimizations Add Ingo's SSE optimizations and clean up the non-SSE part of `getRGB()` with `intp()`. --- rtengine/clutstore.cc | 105 +++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 9619eff0f..692dcbcb9 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -1,11 +1,9 @@ #include -#ifdef __SSE2__ -#include -#endif - #include "clutstore.h" +#include "opthelper.h" +#include "rt_math.h" #include "imagefloat.h" #include "stdimagesource.h" #include "../rtgui/options.h" @@ -76,16 +74,14 @@ bool loadFile( return res; } -inline void posToIndex(unsigned int pos, size_t (&index)[2]) -{ - index[0] = static_cast(pos) * 4; - index[1] = static_cast(pos + 1) * 4; -} - #ifdef __SSE2__ -inline __m128 getClutValue(const AlignedBuffer& clut_image, size_t index) +inline vfloat getClutValue(const AlignedBuffer& clut_image, size_t index) { +#ifdef __SSE4_1__ + return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(*reinterpret_cast(clut_image.data + index))); +#else return _mm_cvtpu16_ps(*reinterpret_cast(clut_image.data + index)); +#endif } #endif @@ -185,79 +181,74 @@ void rtengine::HaldCLUT::getRGB(float r, float g, float b, float out_rgbx[4]) co g = g * flevel_minus_one - green; b = b * flevel_minus_one - blue; - size_t index[2]; - posToIndex(color, index); + size_t index = color * 4; float tmp1[4] ALIGNED16; - tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp1[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); + tmp1[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp1[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); - posToIndex(color + level, index); + index = (color + level) * 4; float tmp2[4] ALIGNED16; - tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp2[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); + tmp2[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp2[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); - out_rgbx[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - out_rgbx[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - out_rgbx[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + out_rgbx[0] = intp(g, tmp2[0], tmp1[0]); + out_rgbx[1] = intp(g, tmp2[1], tmp1[1]); + out_rgbx[2] = intp(g, tmp2[2], tmp1[2]); - posToIndex(color + level_square, index); + index = (color + level_square) * 4; - tmp1[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp1[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp1[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp1[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); + tmp1[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp1[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); - posToIndex(color + level + level_square, index); + index = (color + level + level_square) * 4; - tmp2[0] = clut_image.data[index[0]] * (1 - r) + clut_image.data[index[1]] * r; - tmp2[1] = clut_image.data[index[0] + 1] * (1 - r) + clut_image.data[index[1] + 1] * r; - tmp2[2] = clut_image.data[index[0] + 2] * (1 - r) + clut_image.data[index[1] + 2] * r; + tmp2[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); + tmp2[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp2[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); - tmp1[0] = tmp1[0] * (1 - g) + tmp2[0] * g; - tmp1[1] = tmp1[1] * (1 - g) + tmp2[1] * g; - tmp1[2] = tmp1[2] * (1 - g) + tmp2[2] * g; + tmp1[0] = intp(g, tmp2[0], tmp1[0]); + tmp1[1] = intp(g, tmp2[1], tmp1[1]); + tmp1[2] = intp(g, tmp2[2], tmp1[2]); - out_rgbx[0] = out_rgbx[0] * (1 - b) + tmp1[0] * b; - out_rgbx[1] = out_rgbx[1] * (1 - b) + tmp1[1] * b; - out_rgbx[2] = out_rgbx[2] * (1 - b) + tmp1[2] * b; + out_rgbx[0] = intp(b, tmp1[0], out_rgbx[0]); + out_rgbx[1] = intp(b, tmp1[1], out_rgbx[1]); + out_rgbx[2] = intp(b, tmp1[2], out_rgbx[2]); #else - const __m128 v_rgb = _mm_set_ps(0.0f, b, g, r) *_mm_load_ps1(&flevel_minus_one) - _mm_set_ps(0.0f, blue, green, red); + const vfloat v_tmp = _mm_set_ps(0.0f, b, g, r) * _mm_load_ps1(&flevel_minus_one); + const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(_mm_load_ps1(&flevel_minus_two), v_tmp))); - size_t index[2]; - posToIndex(color, index); + size_t index = color * 4; - const __m128 v_r = _mm_shuffle_ps(v_rgb, v_rgb, 0x00); + const vfloat v_r = PERMUTEPS(v_rgb, 0x00); - __m128 v_cv0 = getClutValue(clut_image, index[0]); - __m128 v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + vfloat v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - posToIndex(color + level, index); + index = (color + level) * 4; - v_cv0 = getClutValue(clut_image, index[0]); - __m128 v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + vfloat v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - const __m128 v_g = _mm_shuffle_ps(v_rgb, v_rgb, 0x55); + const vfloat v_g = PERMUTEPS(v_rgb, 0x55); - __m128 v_out = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + vfloat v_out = vintpf(v_g, v_tmp2, v_tmp1); - posToIndex(color + level_square, index); + index = (color + level_square) * 4; - v_cv0 = getClutValue(clut_image, index[0]); - v_tmp1 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - posToIndex(color + level + level_square, index); + index = (color + level + level_square) * 4; - v_cv0 = getClutValue(clut_image, index[0]); - v_tmp2 = v_r * (getClutValue(clut_image, index[1]) - v_cv0) + v_cv0; + v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - v_tmp1 = v_g * (v_tmp2 - v_tmp1) + v_tmp1; + v_tmp1 = vintpf(v_g, v_tmp2, v_tmp1); - const __m128 v_b = _mm_shuffle_ps(v_rgb, v_rgb, 0xAA); + const vfloat v_b = PERMUTEPS(v_rgb, 0xAA); - _mm_store_ps(out_rgbx, v_b * (v_tmp1 - v_out) + v_out); + _mm_store_ps(out_rgbx, vintpf(v_b, v_tmp1, v_out)); #endif } From bf499055e182563f36e26ac3b309a8ee260e1b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 26 Apr 2016 21:57:58 +0200 Subject: [PATCH 016/232] Apply `HaldCLUT::getRGB()` per tile line `getRGB()` now takes a whole tile line instead of a single pixel. --- rtengine/clutstore.cc | 106 +++++++++++++++++++++--------------------- rtengine/clutstore.h | 4 +- rtengine/improcfun.cc | 26 ++++++++--- 3 files changed, 75 insertions(+), 61 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 692dcbcb9..c9d4645a2 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -164,92 +164,94 @@ Glib::ustring rtengine::HaldCLUT::getProfile() const return clut_profile; } -void rtengine::HaldCLUT::getRGB(float r, float g, float b, float out_rgbx[4]) const +void rtengine::HaldCLUT::getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const { const unsigned int level = clut_level; // This is important - const unsigned int red = std::min(flevel_minus_two, r * flevel_minus_one); - const unsigned int green = std::min(flevel_minus_two, g * flevel_minus_one); - const unsigned int blue = std::min(flevel_minus_two, b * flevel_minus_one); - const unsigned int level_square = level * level; - const unsigned int color = red + green * level + blue * level_square; + for (std::size_t column = 0; column < line_size; ++column, ++r, ++g, ++b, out_rgbx += 4) { + const unsigned int red = std::min(flevel_minus_two, *r * flevel_minus_one); + const unsigned int green = std::min(flevel_minus_two, *g * flevel_minus_one); + const unsigned int blue = std::min(flevel_minus_two, *b * flevel_minus_one); + + const unsigned int color = red + green * level + blue * level_square; #ifndef __SSE2__ - r = r * flevel_minus_one - red; - g = g * flevel_minus_one - green; - b = b * flevel_minus_one - blue; + const float re = *r * flevel_minus_one - red; + const float gr = *g * flevel_minus_one - green; + const float bl = *b * flevel_minus_one - blue; - size_t index = color * 4; + size_t index = color * 4; - float tmp1[4] ALIGNED16; - tmp1[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); - tmp1[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); - tmp1[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); + float tmp1[4] ALIGNED16; + tmp1[0] = intp(re, clut_image.data[index + 4], clut_image.data[index]); + tmp1[1] = intp(re, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp1[2] = intp(re, clut_image.data[index + 6], clut_image.data[index + 2]); - index = (color + level) * 4; + index = (color + level) * 4; - float tmp2[4] ALIGNED16; - tmp2[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); - tmp2[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); - tmp2[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); + float tmp2[4] ALIGNED16; + tmp2[0] = intp(re, clut_image.data[index + 4], clut_image.data[index]); + tmp2[1] = intp(re, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp2[2] = intp(re, clut_image.data[index + 6], clut_image.data[index + 2]); - out_rgbx[0] = intp(g, tmp2[0], tmp1[0]); - out_rgbx[1] = intp(g, tmp2[1], tmp1[1]); - out_rgbx[2] = intp(g, tmp2[2], tmp1[2]); + out_rgbx[0] = intp(gr, tmp2[0], tmp1[0]); + out_rgbx[1] = intp(gr, tmp2[1], tmp1[1]); + out_rgbx[2] = intp(gr, tmp2[2], tmp1[2]); - index = (color + level_square) * 4; + index = (color + level_square) * 4; - tmp1[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); - tmp1[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); - tmp1[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); + tmp1[0] = intp(re, clut_image.data[index + 4], clut_image.data[index]); + tmp1[1] = intp(re, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp1[2] = intp(re, clut_image.data[index + 6], clut_image.data[index + 2]); - index = (color + level + level_square) * 4; + index = (color + level + level_square) * 4; - tmp2[0] = intp(r, clut_image.data[index + 4], clut_image.data[index]); - tmp2[1] = intp(r, clut_image.data[index + 5], clut_image.data[index + 1]); - tmp2[2] = intp(r, clut_image.data[index + 6], clut_image.data[index + 2]); + tmp2[0] = intp(re, clut_image.data[index + 4], clut_image.data[index]); + tmp2[1] = intp(re, clut_image.data[index + 5], clut_image.data[index + 1]); + tmp2[2] = intp(re, clut_image.data[index + 6], clut_image.data[index + 2]); - tmp1[0] = intp(g, tmp2[0], tmp1[0]); - tmp1[1] = intp(g, tmp2[1], tmp1[1]); - tmp1[2] = intp(g, tmp2[2], tmp1[2]); + tmp1[0] = intp(gr, tmp2[0], tmp1[0]); + tmp1[1] = intp(gr, tmp2[1], tmp1[1]); + tmp1[2] = intp(gr, tmp2[2], tmp1[2]); - out_rgbx[0] = intp(b, tmp1[0], out_rgbx[0]); - out_rgbx[1] = intp(b, tmp1[1], out_rgbx[1]); - out_rgbx[2] = intp(b, tmp1[2], out_rgbx[2]); + out_rgbx[0] = intp(bl, tmp1[0], out_rgbx[0]); + out_rgbx[1] = intp(bl, tmp1[1], out_rgbx[1]); + out_rgbx[2] = intp(bl, tmp1[2], out_rgbx[2]); #else - const vfloat v_tmp = _mm_set_ps(0.0f, b, g, r) * _mm_load_ps1(&flevel_minus_one); - const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(_mm_load_ps1(&flevel_minus_two), v_tmp))); + const vfloat v_tmp = _mm_set_ps(0.0f, *b, *g, *r) * _mm_load_ps1(&flevel_minus_one); + const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(_mm_load_ps1(&flevel_minus_two), v_tmp))); - size_t index = color * 4; + size_t index = color * 4; - const vfloat v_r = PERMUTEPS(v_rgb, 0x00); + const vfloat v_r = PERMUTEPS(v_rgb, 0x00); - vfloat v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + vfloat v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - index = (color + level) * 4; + index = (color + level) * 4; - vfloat v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + vfloat v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - const vfloat v_g = PERMUTEPS(v_rgb, 0x55); + const vfloat v_g = PERMUTEPS(v_rgb, 0x55); - vfloat v_out = vintpf(v_g, v_tmp2, v_tmp1); + vfloat v_out = vintpf(v_g, v_tmp2, v_tmp1); - index = (color + level_square) * 4; + index = (color + level_square) * 4; - v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - index = (color + level + level_square) * 4; + index = (color + level + level_square) * 4; - v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - v_tmp1 = vintpf(v_g, v_tmp2, v_tmp1); + v_tmp1 = vintpf(v_g, v_tmp2, v_tmp1); - const vfloat v_b = PERMUTEPS(v_rgb, 0xAA); + const vfloat v_b = PERMUTEPS(v_rgb, 0xAA); - _mm_store_ps(out_rgbx, vintpf(v_b, v_tmp1, v_out)); + _mm_store_ps(out_rgbx, vintpf(v_b, v_tmp1, v_out)); #endif + } } rtengine::CLUTStore& rtengine::CLUTStore::getInstance() diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index ed3491fbe..6203e4e61 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -24,7 +24,7 @@ public: virtual Glib::ustring getFilename() const = 0; virtual Glib::ustring getProfile() const = 0; - virtual void getRGB(float r, float g, float b, float out_rgbx[4]) const = 0; + virtual void getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const = 0; static void splitClutFilename( const Glib::ustring& filename, @@ -48,7 +48,7 @@ public: Glib::ustring getFilename() const override; Glib::ustring getProfile() const override; - void getRGB(float r, float g, float b, float out_rgbx[4]) const override; + void getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const override; private: AlignedBuffer clut_image; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2e15da916..d274806bb 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include #include #include #include @@ -3224,8 +3225,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - double filmSimCorrectedStrength = double(params->filmSimulation.strength) / 100.; - double filmSimSourceStrength = double(100 - params->filmSimulation.strength) / 100.; + float filmSimCorrectedStrength = static_cast(params->filmSimulation.strength) / 100.0f; + float filmSimSourceStrength = 1.0f - filmSimCorrectedStrength; const float exp_scale = pow (2.0, expcomp); const float comp = (max(0.0, expcomp) + 1.0) * hlcompr / 100.0; @@ -4354,13 +4355,24 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceR = CLIP( Color::gamma_srgb( sourceR ) ); sourceG = CLIP( Color::gamma_srgb( sourceG ) ); sourceB = CLIP( Color::gamma_srgb( sourceB ) ); + } + + const std::size_t line_size = std::min(TS, tW - jstart); + std::size_t out_rgbx_size = 4 * (line_size + 16); + std::unique_ptr out_rgbx_buf(new float[out_rgbx_size]); + void* out_rgbx_ptr = out_rgbx_buf.get(); + float* const out_rgbx = reinterpret_cast(std::align(16, 4 * line_size, out_rgbx_ptr, out_rgbx_size)); + colorLUT->getRGB(line_size, rtemp + ti * TS, gtemp + ti * TS, btemp + ti * TS, out_rgbx); + + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + float &sourceR = rtemp[ti * TS + tj]; + float &sourceG = gtemp[ti * TS + tj]; + float &sourceB = btemp[ti * TS + tj]; - float out_rgbx[4] ALIGNED16; - colorLUT->getRGB( sourceR, sourceG, sourceB, out_rgbx ); // apply strength - sourceR = out_rgbx[0] * filmSimCorrectedStrength + sourceR * filmSimSourceStrength; - sourceG = out_rgbx[1] * filmSimCorrectedStrength + sourceG * filmSimSourceStrength; - sourceB = out_rgbx[2] * filmSimCorrectedStrength + sourceB * filmSimSourceStrength; + sourceR = out_rgbx[tj * 4 + 0] * filmSimCorrectedStrength + sourceR * filmSimSourceStrength; + sourceG = out_rgbx[tj * 4 + 1] * filmSimCorrectedStrength + sourceG * filmSimSourceStrength; + sourceB = out_rgbx[tj * 4 + 2] * filmSimCorrectedStrength + sourceB * filmSimSourceStrength; // apply inverse gamma sRGB sourceR = Color::igamma_srgb( sourceR ); sourceG = Color::igamma_srgb( sourceG ); From 9dee6dddf1a114f32fccead94e851205ba110077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 26 Apr 2016 22:16:23 +0200 Subject: [PATCH 017/232] Hoist `out_rgbx` allocation out of the loops --- rtengine/improcfun.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d274806bb..2fd2bfb17 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4338,6 +4338,11 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //Film Simulations if ( colorLUT ) { + std::size_t out_rgbx_size = 4 * (TS + 16); + std::unique_ptr out_rgbx_buf(new float[out_rgbx_size]); + void* out_rgbx_ptr = out_rgbx_buf.get(); + float* const out_rgbx = reinterpret_cast(std::align(16, 4 * TS, out_rgbx_ptr, out_rgbx_size)); + for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; @@ -4357,12 +4362,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceB = CLIP( Color::gamma_srgb( sourceB ) ); } - const std::size_t line_size = std::min(TS, tW - jstart); - std::size_t out_rgbx_size = 4 * (line_size + 16); - std::unique_ptr out_rgbx_buf(new float[out_rgbx_size]); - void* out_rgbx_ptr = out_rgbx_buf.get(); - float* const out_rgbx = reinterpret_cast(std::align(16, 4 * line_size, out_rgbx_ptr, out_rgbx_size)); - colorLUT->getRGB(line_size, rtemp + ti * TS, gtemp + ti * TS, btemp + ti * TS, out_rgbx); + colorLUT->getRGB(std::min(TS, tW - jstart), rtemp + ti * TS, gtemp + ti * TS, btemp + ti * TS, out_rgbx); for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; From b97ed08987f7b1bec966db9e37ebd79637a9e2f0 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 29 Apr 2016 07:41:17 +0200 Subject: [PATCH 018/232] Add working profile Rec2020 --- rtengine/iccmatrices.h | 10 + rtengine/iccstore.cc | 52 ++-- rtengine/iplab2rgb.cc | 10 +- rtengine/settings.h | 1 + rtengine/simpleprocess.cc | 12 +- rtgui/options.cc | 564 +++++++++++++++++++------------------- 6 files changed, 349 insertions(+), 300 deletions(-) diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 9e9682a73..62ac7f150 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -84,6 +84,16 @@ const double prophoto_xyz[3][3] = {{1.3459433, -0.2556075, -0.0511118}, {0.0000000, 0.0000000, 1.2118128} }; +const double xyz_rec2020[3][3] = {{0.636958, 0.144617, 0.168881}, + {0.262700, 0.677998, 0.059302}, + {0.0000000, 0.028073, 1.060985} +}; + +const double rec2020_xyz[3][3] = {{1.716651, -0.355671, -0.253366}, + { -0.666684, 1.616481, 0.015769}, + {0.017640, -0.042771, 0.942103} +}; + const double xyz_widegamut[3][3] = {{0.7161046, 0.1009296, 0.1471858}, {0.2581874, 0.7249378, 0.0168748}, {0.0000000, 0.0517813, 0.7734287} diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index cb5314489..66099199c 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -41,8 +41,9 @@ void loadProfiles (const Glib::ustring& dirName, std::map* profileNames, bool nameUpper, bool onlyRgb) { - if (dirName.empty ()) + if (dirName.empty ()) { return; + } try { @@ -52,23 +53,27 @@ void loadProfiles (const Glib::ustring& dirName, const Glib::ustring fileName = *entry; - if (fileName.size () < 4) + if (fileName.size () < 4) { continue; + } const Glib::ustring extension = fileName.substr (fileName.size () - 4).casefold (); - if (extension.compare (".icc") != 0 && extension.compare (".icm") != 0) + if (extension.compare (".icc") != 0 && extension.compare (".icm") != 0) { continue; + } const Glib::ustring filePath = Glib::build_filename (dirName, fileName); - if (!Glib::file_test (filePath, Glib::FILE_TEST_IS_REGULAR)) + if (!Glib::file_test (filePath, Glib::FILE_TEST_IS_REGULAR)) { continue; + } Glib::ustring name = fileName.substr (0, fileName.size() - 4); - if (nameUpper) + if (nameUpper) { name = name.uppercase (); + } if (profiles) { const rtengine::ProfileContent content (filePath); @@ -77,28 +82,31 @@ void loadProfiles (const Glib::ustring& dirName, if (profile && (!onlyRgb || cmsGetColorSpace (profile) == cmsSigRgbData)) { profiles->insert (std::make_pair (name, profile)); - if (profileContents) + if (profileContents) { profileContents->insert (std::make_pair (name, content)); + } } } - if (profileNames) + if (profileNames) { profileNames->insert (std::make_pair (name, filePath)); + } } - } - catch (Glib::Exception&) {} + } catch (Glib::Exception&) {} } inline void getSupportedIntent (cmsHPROFILE profile, cmsUInt32Number intent, cmsUInt32Number direction, std::uint8_t& result) { - if (cmsIsIntentSupported (profile, intent, direction)) + if (cmsIsIntentSupported (profile, intent, direction)) { result |= 1 << intent; + } } inline std::uint8_t getSupportedIntents (cmsHPROFILE profile, cmsUInt32Number direction) { - if (!profile) + if (!profile) { return 0; + } std::uint8_t result = 0; @@ -116,9 +124,9 @@ inline cmsHPROFILE createXYZProfile () return rtengine::ICCStore::createFromMatrix (mat, false, "XYZ"); } -const double (*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best}; -const double (*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz}; -const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB"}; +const double (*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020}; +const double (*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz}; +const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020"}; const char* wpgamma[] = {"default", "BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9"}; //gamma free //default = gamma inside profile //BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92 @@ -163,8 +171,9 @@ std::vector ICCStore::getProfiles () const std::vector res; - for (ProfileMap::const_iterator profile = fileProfiles.begin (); profile != fileProfiles.end (); ++profile) + for (ProfileMap::const_iterator profile = fileProfiles.begin (); profile != fileProfiles.end (); ++profile) { res.push_back (profile->first); + } return res; } @@ -181,8 +190,9 @@ std::vector ICCStore::getProfilesFromDir (const Glib::ustring& di loadProfiles (profilesDir, &profiles, NULL, NULL, false, true); loadProfiles (dirName, &profiles, NULL, NULL, false, true); - for (ProfileMap::const_iterator profile = profiles.begin (); profile != profiles.end (); ++profile) + for (ProfileMap::const_iterator profile = profiles.begin (); profile != profiles.end (); ++profile) { res.push_back (profile->first); + } return res; } @@ -388,22 +398,25 @@ cmsHPROFILE ICCStore::getStdProfile (const Glib::ustring& name) const const ProfileMap::const_iterator r = fileStdProfiles.find (nameUpper); // return profile from store - if (r != fileStdProfiles.end ()) + if (r != fileStdProfiles.end ()) { return r->second; + } // profile is not yet in store const NameMap::const_iterator f = fileStdProfilesFileNames.find (nameUpper); // profile does not exist - if (f == fileStdProfilesFileNames.end ()) + if (f == fileStdProfilesFileNames.end ()) { return NULL; + } // but there exists one => load it const ProfileContent content (f->second); const cmsHPROFILE profile = content.toProfile (); - if (profile) + if (profile) { const_cast(fileStdProfiles).insert (std::make_pair (f->first, profile)); + } // profile is not valid or it is now stored => remove entry from fileStdProfilesFileNames const_cast(fileStdProfilesFileNames).erase (f); @@ -481,6 +494,7 @@ void ICCStore::findDefaultMonitorProfile () defaultMonitorProfile = Glib::ustring(profileName); defaultMonitorProfile = Glib::path_get_basename(defaultMonitorProfile); size_t pos = defaultMonitorProfile.rfind("."); + if (pos != Glib::ustring::npos) { defaultMonitorProfile = defaultMonitorProfile.substr(0, pos); } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 4510044aa..21e5ca794 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -429,6 +429,14 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int p5 = 0.1300; p6 = 0.0350; select_temp = 1; + } else if (profi == "Rec2020") { + p1 = 0.7080; // Rec2020 primaries + p2 = 0.2920; + p3 = 0.1700; + p4 = 0.7970; + p5 = 0.1310; + p6 = 0.0460; + select_temp = 2; } else { p1 = 0.7347; //ProPhoto and default primaries p2 = 0.2653; @@ -511,7 +519,7 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int if(select_temp == 1) { t50 = 5003; // for Widegamut, Prophoto Best, Beta D50 } else if (select_temp == 2) { - t50 = 6504; // for sRGB, AdobeRGB, Bruce D65 + t50 = 6504; // for sRGB, AdobeRGB, Bruce Rec2020 D65 } cmsCIExyY xyD; diff --git a/rtengine/settings.h b/rtengine/settings.h index 3e9c9d38a..4053a547f 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -56,6 +56,7 @@ public: Glib::ustring bruce; // default name of Bruce Glib::ustring srgb; // default name of SRGB space profile Glib::ustring srgb10; // default name of SRGB space profile + Glib::ustring rec2020; // default name of rec2020 bool gamutICC; // no longer used bool gamutLch; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c03addb42..daa0a45e8 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -293,6 +293,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p adjustr = 1.f / 1.3f; } else if (params.icm.working == "WideGamut") { adjustr = 1.f / 1.1f; + } else if (params.icm.working == "Rec2020") { + adjustr = 1.f / 1.1f; } else if (params.icm.working == "Beta RGB") { adjustr = 1.f / 1.2f; } else if (params.icm.working == "BestRGB") { @@ -532,6 +534,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p adjustr = 1.f / 1.3f; } else if (params.icm.working == "WideGamut") { adjustr = 1.f / 1.1f; + } else if (params.icm.working == "Rec2020") { + adjustr = 1.f / 1.1f; } else if (params.icm.working == "Beta RGB") { adjustr = 1.f / 1.2f; } else if (params.icm.working == "BestRGB") { @@ -1177,11 +1181,11 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p useLCMS = false; bool pro = false; Glib::ustring chpro, outProfile; - bool present_space[9] = {false, false, false, false, false, false, false, false, false}; + bool present_space[10] = {false, false, false, false, false, false, false, false, false, false}; std::vector opnames = iccStore->getProfiles (); //test if files are in system - for (int j = 0; j < 9; j++) { + for (int j = 0; j < 10; j++) { // one can modify "option" [Color Management] to adapt the profile's name if they are different for windows, MacOS, Linux ?? // some of them are actually provided by RT, thanks to Jacques Desmis if (j == 0) { @@ -1202,6 +1206,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p chpro = options.rtSettings.srgb10; //gamma 1.0 } else if(j == 8) { chpro = options.rtSettings.prophoto10; //gamma 1.0 + } else if(j == 9) { + chpro = options.rtSettings.rec2020; } for (unsigned int i = 0; i < opnames.size(); i++) { @@ -1241,6 +1247,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p outProfile = options.rtSettings.srgb10; } else if (params.icm.working == "ProPhoto" && present_space[8] && pro) { outProfile = options.rtSettings.prophoto10; + } else if (params.icm.working == "Rec2020" && present_space[9]) { + outProfile = options.rtSettings.rec2020; } else { // Should not occurs if (settings->verbose) { diff --git a/rtgui/options.cc b/rtgui/options.cc index 88b795687..e723361be 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -644,6 +644,7 @@ void Options::setDefaults () rtSettings.bruce = "Bruce"; rtSettings.beta = "BetaRGB"; rtSettings.best = "BestRGB"; + rtSettings.rec2020 = "Rec2020"; rtSettings.verbose = false; rtSettings.gamutICC = true; rtSettings.gamutLch = true; @@ -1542,6 +1543,10 @@ int Options::readFromFile (Glib::ustring fname) rtSettings.best = keyFile.get_string("Color Management", "Best"); } + if( keyFile.has_key ("Color Management", "Rec2020")) { + rtSettings.rec2020 = keyFile.get_string("Color Management", "Rec2020"); + } + if( keyFile.has_key ("Color Management", "Bruce")) { rtSettings.bruce = keyFile.get_string("Color Management", "Bruce"); } @@ -1776,11 +1781,13 @@ int Options::readFromFile (Glib::ustring fname) if (options.rtSettings.verbose) { printf("Options::readFromFile / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } + setDefaults (); } catch (...) { if (options.rtSettings.verbose) { printf("Options::readFromFile / Unknown exception while trying to load \"%s\"!\n", fname.c_str()); } + setDefaults (); } @@ -1810,309 +1817,310 @@ int Options::saveToFile (Glib::ustring fname) try { - Glib::KeyFile keyFile; + Glib::KeyFile keyFile; - keyFile.set_boolean ("General", "TabbedEditor", tabbedUI); - keyFile.set_boolean ("General", "StoreLastProfile", savesParamsAtExit); + keyFile.set_boolean ("General", "TabbedEditor", tabbedUI); + keyFile.set_boolean ("General", "StoreLastProfile", savesParamsAtExit); - if (startupDir == STARTUPDIR_HOME) { - keyFile.set_string ("General", "StartupDirectory", "home"); - } else if (startupDir == STARTUPDIR_CURRENT) { - keyFile.set_string ("General", "StartupDirectory", "current"); - } else if (startupDir == STARTUPDIR_CUSTOM) { - keyFile.set_string ("General", "StartupDirectory", "custom"); - } else if (startupDir == STARTUPDIR_LAST) { - keyFile.set_string ("General", "StartupDirectory", "last"); - } - - keyFile.set_string ("General", "StartupPath", startupPath); - keyFile.set_string ("General", "DateFormat", dateFormat); - keyFile.set_integer ("General", "AdjusterMinDelay", adjusterMinDelay); - keyFile.set_integer ("General", "AdjusterMaxDelay", adjusterMaxDelay); - keyFile.set_boolean ("General", "MultiUser", multiUser); - keyFile.set_string ("General", "Language", language); - keyFile.set_boolean ("General", "LanguageAutoDetect", languageAutoDetect); - keyFile.set_string ("General", "Theme", theme); - keyFile.set_boolean ("General", "SlimUI", slimUI); - keyFile.set_boolean ("General", "UseSystemTheme", useSystemTheme); - keyFile.set_string ("General", "Version", VERSION); - keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath); - keyFile.set_string ("General", "FlatFieldsPath", rtSettings.flatFieldsPath); - keyFile.set_boolean ("General", "Verbose", rtSettings.verbose); - keyFile.set_double ("General", "BotLeft", rtSettings.bot_left); - keyFile.set_double ("General", "TopLeft", rtSettings.top_left); - keyFile.set_double ("General", "TopRight", rtSettings.top_right); - keyFile.set_double ("General", "BotRight", rtSettings.bot_right); - keyFile.set_double ("General", "EDdetec", rtSettings.ed_detec); - keyFile.set_double ("General", "EDdetecStr", rtSettings.ed_detecStr); - keyFile.set_double ("General", "EDLow", rtSettings.ed_low); - keyFile.set_double ("General", "EDLipinfl", rtSettings.ed_lipinfl); - keyFile.set_double ("General", "EDLipampl", rtSettings.ed_lipampl); - - - keyFile.set_integer ("External Editor", "EditorKind", editorToSendTo); - keyFile.set_string ("External Editor", "GimpDir", gimpDir); - keyFile.set_string ("External Editor", "PhotoshopDir", psDir); - keyFile.set_string ("External Editor", "CustomEditor", customEditorProg); - - keyFile.set_boolean ("File Browser", "BrowseOnlyRaw", fbOnlyRaw); - keyFile.set_boolean ("File Browser", "BrowserShowsDate", fbShowDateTime); - keyFile.set_boolean ("File Browser", "BrowserShowsExif", fbShowBasicExif); - keyFile.set_boolean ("File Browser", "BrowserShowsExpComp", fbShowExpComp); - keyFile.set_boolean ("File Browser", "BrowserShowsHidden", fbShowHidden); - keyFile.set_integer ("File Browser", "ThumbnailSize", thumbSize); - keyFile.set_integer ("File Browser", "ThumbnailSizeTab", thumbSizeTab); - keyFile.set_integer ("File Browser", "ThumbnailSizeQueue", thumbSizeQueue); - keyFile.set_integer ("File Browser", "SameThumbSize", sameThumbSize); - keyFile.set_integer ("File Browser", "MaxPreviewHeight", maxThumbnailHeight); - keyFile.set_integer ("File Browser", "MaxCacheEntries", maxCacheEntries); - Glib::ArrayHandle pext = parseExtensions; - keyFile.set_string_list ("File Browser", "ParseExtensions", pext); - Glib::ArrayHandle pextena = parseExtensionsEnabled; - keyFile.set_integer_list ("File Browser", "ParseExtensionsEnabled", pextena); - keyFile.set_integer ("File Browser", "ThumbnailArrangement", fbArrangement); - keyFile.set_integer ("File Browser", "ThumbnailInterpolation", thumbInterp); - keyFile.set_boolean ("File Browser", "LiveThumbnails", liveThumbnails); - Glib::ArrayHandle pfav = favoriteDirs; - keyFile.set_string_list ("File Browser", "FavoriteDirs", pfav); - Glib::ArrayHandle pren = renameTemplates; - keyFile.set_string_list ("File Browser", "RenameTemplates", pren); - keyFile.set_boolean ("File Browser", "RenameUseTemplates", renameUseTemplates); - Glib::ArrayHandle ptzoom = thumbnailZoomRatios; - keyFile.set_double_list ("File Browser", "ThumbnailZoomRatios", ptzoom); - keyFile.set_boolean ("File Browser", "OverlayedFileNames", overlayedFileNames); - keyFile.set_boolean ("File Browser", "FilmStripOverlayedFileNames", filmStripOverlayedFileNames); - keyFile.set_boolean ("File Browser", "ShowFileNames", showFileNames ); - keyFile.set_boolean ("File Browser", "FilmStripShowFileNames", filmStripShowFileNames ); - keyFile.set_boolean ("File Browser", "InternalThumbIfUntouched", internalThumbIfUntouched ); - keyFile.set_boolean ("File Browser", "menuGroupRank", menuGroupRank); - keyFile.set_boolean ("File Browser", "menuGroupLabel", menuGroupLabel); - keyFile.set_boolean ("File Browser", "menuGroupFileOperations", menuGroupFileOperations); - keyFile.set_boolean ("File Browser", "menuGroupProfileOperations", menuGroupProfileOperations); - keyFile.set_boolean ("File Browser", "menuGroupExtProg", menuGroupExtProg); - keyFile.set_integer ("File Browser", "MaxRecentFolders", maxRecentFolders); - { - std::vector temp; - temp.reserve(maxRecentFolders); - - for(unsigned int i = 0; i < std::min(recentFolders.size(), maxRecentFolders); i++) { - temp.push_back(recentFolders[i]); + if (startupDir == STARTUPDIR_HOME) { + keyFile.set_string ("General", "StartupDirectory", "home"); + } else if (startupDir == STARTUPDIR_CURRENT) { + keyFile.set_string ("General", "StartupDirectory", "current"); + } else if (startupDir == STARTUPDIR_CUSTOM) { + keyFile.set_string ("General", "StartupDirectory", "custom"); + } else if (startupDir == STARTUPDIR_LAST) { + keyFile.set_string ("General", "StartupDirectory", "last"); } - keyFile.set_string_list ("File Browser", "RecentFolders", temp); - } - keyFile.set_integer ("Clipping Indication", "HighlightThreshold", highlightThreshold); - keyFile.set_integer ("Clipping Indication", "ShadowThreshold", shadowThreshold); - keyFile.set_boolean ("Clipping Indication", "BlinkClipped", blinkClipped); + keyFile.set_string ("General", "StartupPath", startupPath); + keyFile.set_string ("General", "DateFormat", dateFormat); + keyFile.set_integer ("General", "AdjusterMinDelay", adjusterMinDelay); + keyFile.set_integer ("General", "AdjusterMaxDelay", adjusterMaxDelay); + keyFile.set_boolean ("General", "MultiUser", multiUser); + keyFile.set_string ("General", "Language", language); + keyFile.set_boolean ("General", "LanguageAutoDetect", languageAutoDetect); + keyFile.set_string ("General", "Theme", theme); + keyFile.set_boolean ("General", "SlimUI", slimUI); + keyFile.set_boolean ("General", "UseSystemTheme", useSystemTheme); + keyFile.set_string ("General", "Version", VERSION); + keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath); + keyFile.set_string ("General", "FlatFieldsPath", rtSettings.flatFieldsPath); + keyFile.set_boolean ("General", "Verbose", rtSettings.verbose); + keyFile.set_double ("General", "BotLeft", rtSettings.bot_left); + keyFile.set_double ("General", "TopLeft", rtSettings.top_left); + keyFile.set_double ("General", "TopRight", rtSettings.top_right); + keyFile.set_double ("General", "BotRight", rtSettings.bot_right); + keyFile.set_double ("General", "EDdetec", rtSettings.ed_detec); + keyFile.set_double ("General", "EDdetecStr", rtSettings.ed_detecStr); + keyFile.set_double ("General", "EDLow", rtSettings.ed_low); + keyFile.set_double ("General", "EDLipinfl", rtSettings.ed_lipinfl); + keyFile.set_double ("General", "EDLipampl", rtSettings.ed_lipampl); - keyFile.set_integer ("Performance", "RgbDenoiseThreadLimit", rgbDenoiseThreadLimit); - keyFile.set_double ("Performance", "NRauto", rtSettings.nrauto); - keyFile.set_double ("Performance", "NRautomax", rtSettings.nrautomax); - keyFile.set_double ("Performance", "NRhigh", rtSettings.nrhigh); - keyFile.set_integer ("Performance", "NRWavlevel", rtSettings.nrwavlevel); - keyFile.set_integer ("Performance", "LevNR", rtSettings.leveldnv); - keyFile.set_integer ("Performance", "LevNRTI", rtSettings.leveldnti); - keyFile.set_integer ("Performance", "LevNRAUT", rtSettings.leveldnaut); - keyFile.set_integer ("Performance", "LevNRLISS", rtSettings.leveldnliss); - keyFile.set_integer ("Performance", "SIMPLNRAUT", rtSettings.leveldnautsimpl); - keyFile.set_integer ("Performance", "ClutCacheSize", clutCacheSize); - keyFile.set_integer ("Performance", "MaxInspectorBuffers", maxInspectorBuffers); - keyFile.set_integer ("Performance", "PreviewDemosaicFromSidecar", prevdemo); - keyFile.set_boolean ("Performance", "Daubechies", rtSettings.daubech); - keyFile.set_boolean ("Performance", "SerializeTiffRead", serializeTiffRead); - keyFile.set_string ("Output", "Format", saveFormat.format); - keyFile.set_integer ("Output", "JpegQuality", saveFormat.jpegQuality); - keyFile.set_integer ("Output", "JpegSubSamp", saveFormat.jpegSubSamp); - keyFile.set_integer ("Output", "PngCompression", saveFormat.pngCompression); - keyFile.set_integer ("Output", "PngBps", saveFormat.pngBits); - keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits); - keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed); - keyFile.set_boolean ("Output", "SaveProcParams", saveFormat.saveParams); + keyFile.set_integer ("External Editor", "EditorKind", editorToSendTo); + keyFile.set_string ("External Editor", "GimpDir", gimpDir); + keyFile.set_string ("External Editor", "PhotoshopDir", psDir); + keyFile.set_string ("External Editor", "CustomEditor", customEditorProg); - keyFile.set_string ("Output", "FormatBatch", saveFormatBatch.format); - keyFile.set_integer ("Output", "JpegQualityBatch", saveFormatBatch.jpegQuality); - keyFile.set_integer ("Output", "JpegSubSampBatch", saveFormatBatch.jpegSubSamp); - keyFile.set_integer ("Output", "PngCompressionBatch", saveFormatBatch.pngCompression); - keyFile.set_integer ("Output", "PngBpsBatch", saveFormatBatch.pngBits); - keyFile.set_integer ("Output", "TiffBpsBatch", saveFormatBatch.tiffBits); - keyFile.set_boolean ("Output", "TiffUncompressedBatch", saveFormatBatch.tiffUncompressed); - keyFile.set_boolean ("Output", "SaveProcParamsBatch", saveFormatBatch.saveParams); + keyFile.set_boolean ("File Browser", "BrowseOnlyRaw", fbOnlyRaw); + keyFile.set_boolean ("File Browser", "BrowserShowsDate", fbShowDateTime); + keyFile.set_boolean ("File Browser", "BrowserShowsExif", fbShowBasicExif); + keyFile.set_boolean ("File Browser", "BrowserShowsExpComp", fbShowExpComp); + keyFile.set_boolean ("File Browser", "BrowserShowsHidden", fbShowHidden); + keyFile.set_integer ("File Browser", "ThumbnailSize", thumbSize); + keyFile.set_integer ("File Browser", "ThumbnailSizeTab", thumbSizeTab); + keyFile.set_integer ("File Browser", "ThumbnailSizeQueue", thumbSizeQueue); + keyFile.set_integer ("File Browser", "SameThumbSize", sameThumbSize); + keyFile.set_integer ("File Browser", "MaxPreviewHeight", maxThumbnailHeight); + keyFile.set_integer ("File Browser", "MaxCacheEntries", maxCacheEntries); + Glib::ArrayHandle pext = parseExtensions; + keyFile.set_string_list ("File Browser", "ParseExtensions", pext); + Glib::ArrayHandle pextena = parseExtensionsEnabled; + keyFile.set_integer_list ("File Browser", "ParseExtensionsEnabled", pextena); + keyFile.set_integer ("File Browser", "ThumbnailArrangement", fbArrangement); + keyFile.set_integer ("File Browser", "ThumbnailInterpolation", thumbInterp); + keyFile.set_boolean ("File Browser", "LiveThumbnails", liveThumbnails); + Glib::ArrayHandle pfav = favoriteDirs; + keyFile.set_string_list ("File Browser", "FavoriteDirs", pfav); + Glib::ArrayHandle pren = renameTemplates; + keyFile.set_string_list ("File Browser", "RenameTemplates", pren); + keyFile.set_boolean ("File Browser", "RenameUseTemplates", renameUseTemplates); + Glib::ArrayHandle ptzoom = thumbnailZoomRatios; + keyFile.set_double_list ("File Browser", "ThumbnailZoomRatios", ptzoom); + keyFile.set_boolean ("File Browser", "OverlayedFileNames", overlayedFileNames); + keyFile.set_boolean ("File Browser", "FilmStripOverlayedFileNames", filmStripOverlayedFileNames); + keyFile.set_boolean ("File Browser", "ShowFileNames", showFileNames ); + keyFile.set_boolean ("File Browser", "FilmStripShowFileNames", filmStripShowFileNames ); + keyFile.set_boolean ("File Browser", "InternalThumbIfUntouched", internalThumbIfUntouched ); + keyFile.set_boolean ("File Browser", "menuGroupRank", menuGroupRank); + keyFile.set_boolean ("File Browser", "menuGroupLabel", menuGroupLabel); + keyFile.set_boolean ("File Browser", "menuGroupFileOperations", menuGroupFileOperations); + keyFile.set_boolean ("File Browser", "menuGroupProfileOperations", menuGroupProfileOperations); + keyFile.set_boolean ("File Browser", "menuGroupExtProg", menuGroupExtProg); + keyFile.set_integer ("File Browser", "MaxRecentFolders", maxRecentFolders); + { + std::vector temp; + temp.reserve(maxRecentFolders); - keyFile.set_string ("Output", "PathTemplate", savePathTemplate); - keyFile.set_string ("Output", "PathFolder", savePathFolder); - keyFile.set_boolean ("Output", "AutoSuffix", autoSuffix); - keyFile.set_boolean ("Output", "ForceFormatOpts", forceFormatOpts); - keyFile.set_integer ("Output", "SaveMethodNum", saveMethodNum); - keyFile.set_boolean ("Output", "UsePathTemplate", saveUsePathTemplate); - keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); - keyFile.set_boolean ("Output", "OverwriteOutputFile", overwriteOutputFile); - keyFile.set_boolean ("Output", "TunnelMetaData", tunnelMetaData); + for(unsigned int i = 0; i < std::min(recentFolders.size(), maxRecentFolders); i++) { + temp.push_back(recentFolders[i]); + } - keyFile.set_string ("Profiles", "Directory", profilePath); - keyFile.set_boolean ("Profiles", "UseBundledProfiles", useBundledProfiles); - keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath); - keyFile.set_string ("Profiles", "RawDefault", defProfRaw); - keyFile.set_string ("Profiles", "ImgDefault", defProfImg); - keyFile.set_boolean ("Profiles", "FilledProfile", filledProfile); - keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); - keyFile.set_boolean ("Profiles", "SaveParamsToCache", saveParamsCache); - keyFile.set_integer ("Profiles", "LoadParamsFromLocation", paramsLoadLocation); - keyFile.set_string ("Profiles", "CustomProfileBuilderPath", CPBPath); - keyFile.set_integer ("Profiles", "CustomProfileBuilderKeys", CPBKeys); + keyFile.set_string_list ("File Browser", "RecentFolders", temp); + } + keyFile.set_integer ("Clipping Indication", "HighlightThreshold", highlightThreshold); + keyFile.set_integer ("Clipping Indication", "ShadowThreshold", shadowThreshold); + keyFile.set_boolean ("Clipping Indication", "BlinkClipped", blinkClipped); - keyFile.set_string ("GUI", "Font", font); - keyFile.set_integer ("GUI", "WindowWidth", windowWidth); - keyFile.set_integer ("GUI", "WindowHeight", windowHeight); - keyFile.set_integer ("GUI", "WindowX", windowX); - keyFile.set_integer ("GUI", "WindowY", windowY); - keyFile.set_boolean ("GUI", "WindowMaximized", windowMaximized); - keyFile.set_integer ("GUI", "DetailWindowWidth", detailWindowWidth); - keyFile.set_integer ("GUI", "DetailWindowHeight", detailWindowHeight); - keyFile.set_integer ("GUI", "DirBrowserWidth", dirBrowserWidth); - keyFile.set_integer ("GUI", "DirBrowserHeight", dirBrowserHeight); - keyFile.set_integer ("GUI", "SortType", dirBrowserSortType); - keyFile.set_integer ("GUI", "PreferencesWidth", preferencesWidth); - keyFile.set_integer ("GUI", "PreferencesHeight", preferencesHeight); - keyFile.set_integer ("GUI", "SaveAsDialogWidth", saveAsDialogWidth); - keyFile.set_integer ("GUI", "SaveAsDialogHeight", saveAsDialogHeight); - keyFile.set_integer ("GUI", "ToolPanelWidth", toolPanelWidth); - keyFile.set_integer ("GUI", "BrowserToolPanelWidth", browserToolPanelWidth); - keyFile.set_integer ("GUI", "BrowserToolPanelHeight", browserToolPanelHeight); - keyFile.set_boolean ("GUI", "BrowserToolPanelOpened", browserToolPanelOpened); - keyFile.set_boolean ("GUI", "EditorFilmStripOpened", editorFilmStripOpened); - keyFile.set_boolean ("GUI", "BrowserDirPanelOpened", browserDirPanelOpened); - keyFile.set_integer ("GUI", "HistoryPanelWidth", historyPanelWidth); - keyFile.set_integer ("GUI", "LastPreviewScale", lastScale); - keyFile.set_integer ("GUI", "PanAccelFactor", panAccelFactor); - keyFile.set_boolean ("GUI", "RememberZoomAndPan", rememberZoomAndPan); - keyFile.set_integer ("GUI", "LastCropSize", lastCropSize); - keyFile.set_boolean ("GUI", "ShowHistory", showHistory); - keyFile.set_integer ("GUI", "ShowFilePanelState", showFilePanelState); - keyFile.set_boolean ("GUI", "ShowInfo", showInfo); - keyFile.set_boolean ("GUI", "MainNBVertical", mainNBVertical); - keyFile.set_boolean ("GUI", "ShowClippedHighlights", showClippedHighlights); - keyFile.set_boolean ("GUI", "ShowClippedShadows", showClippedShadows); - keyFile.set_integer ("GUI", "FrameColor", bgcolor); - keyFile.set_boolean ("GUI", "ProcessingQueueEnbled", procQueueEnabled); - Glib::ArrayHandle tpopen = tpOpen; - keyFile.set_integer_list ("GUI", "ToolPanelsExpanded", tpopen); - keyFile.set_integer ("GUI", "MultiDisplayMode", multiDisplayMode); - keyFile.set_double_list ("GUI", "CutOverlayBrush", cutOverlayBrush); - keyFile.set_double_list ("GUI", "NavGuideBrush", navGuideBrush); - keyFile.set_integer ("GUI", "HistogramPosition", histogramPosition); - keyFile.set_boolean ("GUI", "HistogramBar", histogramBar); - keyFile.set_boolean ("GUI", "HistogramFullMode", histogramFullMode); - keyFile.set_boolean ("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); - keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); - keyFile.set_boolean ("GUI", "HideTPVScrollbar", hideTPVScrollbar); - keyFile.set_boolean ("GUI", "UseIconNoText", UseIconNoText); - keyFile.set_boolean ("GUI", "HistogramWorking", rtSettings.HistogramWorking); - keyFile.set_integer ("GUI", "CurveBBoxPosition", curvebboxpos); + keyFile.set_integer ("Performance", "RgbDenoiseThreadLimit", rgbDenoiseThreadLimit); + keyFile.set_double ("Performance", "NRauto", rtSettings.nrauto); + keyFile.set_double ("Performance", "NRautomax", rtSettings.nrautomax); + keyFile.set_double ("Performance", "NRhigh", rtSettings.nrhigh); + keyFile.set_integer ("Performance", "NRWavlevel", rtSettings.nrwavlevel); + keyFile.set_integer ("Performance", "LevNR", rtSettings.leveldnv); + keyFile.set_integer ("Performance", "LevNRTI", rtSettings.leveldnti); + keyFile.set_integer ("Performance", "LevNRAUT", rtSettings.leveldnaut); + keyFile.set_integer ("Performance", "LevNRLISS", rtSettings.leveldnliss); + keyFile.set_integer ("Performance", "SIMPLNRAUT", rtSettings.leveldnautsimpl); + keyFile.set_integer ("Performance", "ClutCacheSize", clutCacheSize); + keyFile.set_integer ("Performance", "MaxInspectorBuffers", maxInspectorBuffers); + keyFile.set_integer ("Performance", "PreviewDemosaicFromSidecar", prevdemo); + keyFile.set_boolean ("Performance", "Daubechies", rtSettings.daubech); + keyFile.set_boolean ("Performance", "SerializeTiffRead", serializeTiffRead); - //Glib::ArrayHandle crvopen = crvOpen; - //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); + keyFile.set_string ("Output", "Format", saveFormat.format); + keyFile.set_integer ("Output", "JpegQuality", saveFormat.jpegQuality); + keyFile.set_integer ("Output", "JpegSubSamp", saveFormat.jpegSubSamp); + keyFile.set_integer ("Output", "PngCompression", saveFormat.pngCompression); + keyFile.set_integer ("Output", "PngBps", saveFormat.pngBits); + keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits); + keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed); + keyFile.set_boolean ("Output", "SaveProcParams", saveFormat.saveParams); - keyFile.set_integer ("Crop Settings", "PPI", cropPPI); + keyFile.set_string ("Output", "FormatBatch", saveFormatBatch.format); + keyFile.set_integer ("Output", "JpegQualityBatch", saveFormatBatch.jpegQuality); + keyFile.set_integer ("Output", "JpegSubSampBatch", saveFormatBatch.jpegSubSamp); + keyFile.set_integer ("Output", "PngCompressionBatch", saveFormatBatch.pngCompression); + keyFile.set_integer ("Output", "PngBpsBatch", saveFormatBatch.pngBits); + keyFile.set_integer ("Output", "TiffBpsBatch", saveFormatBatch.tiffBits); + keyFile.set_boolean ("Output", "TiffUncompressedBatch", saveFormatBatch.tiffUncompressed); + keyFile.set_boolean ("Output", "SaveProcParamsBatch", saveFormatBatch.saveParams); - keyFile.set_string ("Color Management", "ICCDirectory", rtSettings.iccDirectory); - keyFile.set_string ("Color Management", "MonitorProfile", rtSettings.monitorProfile); - keyFile.set_boolean ("Color Management", "AutoMonitorProfile", rtSettings.autoMonitorProfile); - keyFile.set_boolean ("Color Management", "Autocielab", rtSettings.autocielab); - keyFile.set_boolean ("Color Management", "RGBcurvesLumamode_Gamut", rtSettings.rgbcurveslumamode_gamut); - keyFile.set_integer ("Color Management", "Intent", rtSettings.monitorIntent); - keyFile.set_integer ("Color Management", "view", rtSettings.viewingdevice); - keyFile.set_integer ("Color Management", "grey", rtSettings.viewingdevicegrey); - keyFile.set_integer ("Color Management", "greySc", rtSettings.viewinggreySc); + keyFile.set_string ("Output", "PathTemplate", savePathTemplate); + keyFile.set_string ("Output", "PathFolder", savePathFolder); + keyFile.set_boolean ("Output", "AutoSuffix", autoSuffix); + keyFile.set_boolean ("Output", "ForceFormatOpts", forceFormatOpts); + keyFile.set_integer ("Output", "SaveMethodNum", saveMethodNum); + keyFile.set_boolean ("Output", "UsePathTemplate", saveUsePathTemplate); + keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); + keyFile.set_boolean ("Output", "OverwriteOutputFile", overwriteOutputFile); + keyFile.set_boolean ("Output", "TunnelMetaData", tunnelMetaData); - keyFile.set_string ("Color Management", "AdobeRGB", rtSettings.adobe); - keyFile.set_string ("Color Management", "ProPhoto", rtSettings.prophoto); - keyFile.set_string ("Color Management", "ProPhoto10", rtSettings.prophoto10); - keyFile.set_string ("Color Management", "WideGamut", rtSettings.widegamut); - keyFile.set_string ("Color Management", "sRGB", rtSettings.srgb); - keyFile.set_string ("Color Management", "sRGB10", rtSettings.srgb10); - keyFile.set_string ("Color Management", "Beta", rtSettings.beta); - keyFile.set_string ("Color Management", "Best", rtSettings.best); - keyFile.set_string ("Color Management", "Bruce", rtSettings.bruce); - keyFile.set_integer ("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize); - keyFile.set_boolean ("Color Management", "GamutICC", rtSettings.gamutICC); + keyFile.set_string ("Profiles", "Directory", profilePath); + keyFile.set_boolean ("Profiles", "UseBundledProfiles", useBundledProfiles); + keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath); + keyFile.set_string ("Profiles", "RawDefault", defProfRaw); + keyFile.set_string ("Profiles", "ImgDefault", defProfImg); + keyFile.set_boolean ("Profiles", "FilledProfile", filledProfile); + keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); + keyFile.set_boolean ("Profiles", "SaveParamsToCache", saveParamsCache); + keyFile.set_integer ("Profiles", "LoadParamsFromLocation", paramsLoadLocation); + keyFile.set_string ("Profiles", "CustomProfileBuilderPath", CPBPath); + keyFile.set_integer ("Profiles", "CustomProfileBuilderKeys", CPBKeys); + + keyFile.set_string ("GUI", "Font", font); + keyFile.set_integer ("GUI", "WindowWidth", windowWidth); + keyFile.set_integer ("GUI", "WindowHeight", windowHeight); + keyFile.set_integer ("GUI", "WindowX", windowX); + keyFile.set_integer ("GUI", "WindowY", windowY); + keyFile.set_boolean ("GUI", "WindowMaximized", windowMaximized); + keyFile.set_integer ("GUI", "DetailWindowWidth", detailWindowWidth); + keyFile.set_integer ("GUI", "DetailWindowHeight", detailWindowHeight); + keyFile.set_integer ("GUI", "DirBrowserWidth", dirBrowserWidth); + keyFile.set_integer ("GUI", "DirBrowserHeight", dirBrowserHeight); + keyFile.set_integer ("GUI", "SortType", dirBrowserSortType); + keyFile.set_integer ("GUI", "PreferencesWidth", preferencesWidth); + keyFile.set_integer ("GUI", "PreferencesHeight", preferencesHeight); + keyFile.set_integer ("GUI", "SaveAsDialogWidth", saveAsDialogWidth); + keyFile.set_integer ("GUI", "SaveAsDialogHeight", saveAsDialogHeight); + keyFile.set_integer ("GUI", "ToolPanelWidth", toolPanelWidth); + keyFile.set_integer ("GUI", "BrowserToolPanelWidth", browserToolPanelWidth); + keyFile.set_integer ("GUI", "BrowserToolPanelHeight", browserToolPanelHeight); + keyFile.set_boolean ("GUI", "BrowserToolPanelOpened", browserToolPanelOpened); + keyFile.set_boolean ("GUI", "EditorFilmStripOpened", editorFilmStripOpened); + keyFile.set_boolean ("GUI", "BrowserDirPanelOpened", browserDirPanelOpened); + keyFile.set_integer ("GUI", "HistoryPanelWidth", historyPanelWidth); + keyFile.set_integer ("GUI", "LastPreviewScale", lastScale); + keyFile.set_integer ("GUI", "PanAccelFactor", panAccelFactor); + keyFile.set_boolean ("GUI", "RememberZoomAndPan", rememberZoomAndPan); + keyFile.set_integer ("GUI", "LastCropSize", lastCropSize); + keyFile.set_boolean ("GUI", "ShowHistory", showHistory); + keyFile.set_integer ("GUI", "ShowFilePanelState", showFilePanelState); + keyFile.set_boolean ("GUI", "ShowInfo", showInfo); + keyFile.set_boolean ("GUI", "MainNBVertical", mainNBVertical); + keyFile.set_boolean ("GUI", "ShowClippedHighlights", showClippedHighlights); + keyFile.set_boolean ("GUI", "ShowClippedShadows", showClippedShadows); + keyFile.set_integer ("GUI", "FrameColor", bgcolor); + keyFile.set_boolean ("GUI", "ProcessingQueueEnbled", procQueueEnabled); + Glib::ArrayHandle tpopen = tpOpen; + keyFile.set_integer_list ("GUI", "ToolPanelsExpanded", tpopen); + keyFile.set_integer ("GUI", "MultiDisplayMode", multiDisplayMode); + keyFile.set_double_list ("GUI", "CutOverlayBrush", cutOverlayBrush); + keyFile.set_double_list ("GUI", "NavGuideBrush", navGuideBrush); + keyFile.set_integer ("GUI", "HistogramPosition", histogramPosition); + keyFile.set_boolean ("GUI", "HistogramBar", histogramBar); + keyFile.set_boolean ("GUI", "HistogramFullMode", histogramFullMode); + keyFile.set_boolean ("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); + keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); + keyFile.set_boolean ("GUI", "HideTPVScrollbar", hideTPVScrollbar); + keyFile.set_boolean ("GUI", "UseIconNoText", UseIconNoText); + keyFile.set_boolean ("GUI", "HistogramWorking", rtSettings.HistogramWorking); + keyFile.set_integer ("GUI", "CurveBBoxPosition", curvebboxpos); + + //Glib::ArrayHandle crvopen = crvOpen; + //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); + + keyFile.set_integer ("Crop Settings", "PPI", cropPPI); + + keyFile.set_string ("Color Management", "ICCDirectory", rtSettings.iccDirectory); + keyFile.set_string ("Color Management", "MonitorProfile", rtSettings.monitorProfile); + keyFile.set_boolean ("Color Management", "AutoMonitorProfile", rtSettings.autoMonitorProfile); + keyFile.set_boolean ("Color Management", "Autocielab", rtSettings.autocielab); + keyFile.set_boolean ("Color Management", "RGBcurvesLumamode_Gamut", rtSettings.rgbcurveslumamode_gamut); + keyFile.set_integer ("Color Management", "Intent", rtSettings.monitorIntent); + keyFile.set_integer ("Color Management", "view", rtSettings.viewingdevice); + keyFile.set_integer ("Color Management", "grey", rtSettings.viewingdevicegrey); + keyFile.set_integer ("Color Management", "greySc", rtSettings.viewinggreySc); + + keyFile.set_string ("Color Management", "AdobeRGB", rtSettings.adobe); + keyFile.set_string ("Color Management", "ProPhoto", rtSettings.prophoto); + keyFile.set_string ("Color Management", "ProPhoto10", rtSettings.prophoto10); + keyFile.set_string ("Color Management", "WideGamut", rtSettings.widegamut); + keyFile.set_string ("Color Management", "sRGB", rtSettings.srgb); + keyFile.set_string ("Color Management", "sRGB10", rtSettings.srgb10); + keyFile.set_string ("Color Management", "Beta", rtSettings.beta); + keyFile.set_string ("Color Management", "Best", rtSettings.best); + keyFile.set_string ("Color Management", "Rec2020", rtSettings.rec2020); + keyFile.set_string ("Color Management", "Bruce", rtSettings.bruce); + keyFile.set_integer ("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize); + keyFile.set_boolean ("Color Management", "GamutICC", rtSettings.gamutICC); // keyFile.set_boolean ("Color Management", "BWcomplement", rtSettings.bw_complementary); - keyFile.set_boolean ("Color Management", "Ciecamfloat", rtSettings.ciecamfloat); - keyFile.set_boolean ("Color Management", "GamutLch", rtSettings.gamutLch); - keyFile.set_integer ("Color Management", "ProtectRed", rtSettings.protectred); - keyFile.set_integer ("Color Management", "Amountchroma", rtSettings.amchroma); - keyFile.set_double ("Color Management", "ProtectRedH", rtSettings.protectredh); - keyFile.set_integer ("Color Management", "CRI", rtSettings.CRI_color); - keyFile.set_integer ("Color Management", "DenoiseLabgamma", rtSettings.denoiselabgamma); + keyFile.set_boolean ("Color Management", "Ciecamfloat", rtSettings.ciecamfloat); + keyFile.set_boolean ("Color Management", "GamutLch", rtSettings.gamutLch); + keyFile.set_integer ("Color Management", "ProtectRed", rtSettings.protectred); + keyFile.set_integer ("Color Management", "Amountchroma", rtSettings.amchroma); + keyFile.set_double ("Color Management", "ProtectRedH", rtSettings.protectredh); + keyFile.set_integer ("Color Management", "CRI", rtSettings.CRI_color); + keyFile.set_integer ("Color Management", "DenoiseLabgamma", rtSettings.denoiselabgamma); // keyFile.set_boolean ("Color Management", "Ciebadpixgauss", rtSettings.ciebadpixgauss); - keyFile.set_double ("Color Management", "CBDLArtif", rtSettings.artifact_cbdl); - keyFile.set_double ("Color Management", "CBDLlevel0", rtSettings.level0_cbdl); - keyFile.set_double ("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); + keyFile.set_double ("Color Management", "CBDLArtif", rtSettings.artifact_cbdl); + keyFile.set_double ("Color Management", "CBDLlevel0", rtSettings.level0_cbdl); + keyFile.set_double ("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); // keyFile.set_double ("Color Management", "Colortoningab", rtSettings.colortoningab); // keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); - keyFile.set_string ("Color Management", "ClutsDirectory", clutsDir); + keyFile.set_string ("Color Management", "ClutsDirectory", clutsDir); - Glib::ArrayHandle bab = baBehav; - keyFile.set_integer_list ("Batch Processing", "AdjusterBehavior", bab); + Glib::ArrayHandle bab = baBehav; + keyFile.set_integer_list ("Batch Processing", "AdjusterBehavior", bab); - keyFile.set_boolean ("Sounds", "Enable", sndEnable); - keyFile.set_string ("Sounds", "BatchQueueDone", sndBatchQueueDone); - keyFile.set_string ("Sounds", "LngEditProcDone", sndLngEditProcDone); - keyFile.set_double ("Sounds", "LngEditProcDoneSecs", sndLngEditProcDoneSecs); + keyFile.set_boolean ("Sounds", "Enable", sndEnable); + keyFile.set_string ("Sounds", "BatchQueueDone", sndBatchQueueDone); + keyFile.set_string ("Sounds", "LngEditProcDone", sndLngEditProcDone); + keyFile.set_double ("Sounds", "LngEditProcDoneSecs", sndLngEditProcDoneSecs); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening" , fastexport_bypass_sharpening ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" , fastexport_bypass_sharpenEdge ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" , fastexport_bypass_sharpenMicro ); - //keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise ); - //keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe" , fastexport_bypass_defringe ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer" , fastexport_bypass_dirpyrequalizer ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_wavelet" , fastexport_bypass_wavelet ); - keyFile.set_string ("Fast Export", "fastexport_raw_bayer_method" , fastexport_raw_bayer_method ); - //keyFile.set_boolean ("Fast Export", "fastexport_bypass_bayer_raw_all_enhance" , fastexport_bypass_raw_bayer_all_enhance ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations" , fastexport_bypass_raw_bayer_dcb_iterations ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance" , fastexport_bypass_raw_bayer_dcb_enhance ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations", fastexport_bypass_raw_bayer_lmmse_iterations); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise" , fastexport_bypass_raw_bayer_linenoise ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh" , fastexport_bypass_raw_bayer_greenthresh ); - keyFile.set_string ("Fast Export", "fastexport_raw_xtrans_method" , fastexport_raw_xtrans_method ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps" , fastexport_bypass_raw_ccSteps ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ca" , fastexport_bypass_raw_ca ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_df" , fastexport_bypass_raw_df ); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ff" , fastexport_bypass_raw_ff ); - keyFile.set_string ("Fast Export", "fastexport_icm_input" , fastexport_icm_input ); - keyFile.set_string ("Fast Export", "fastexport_icm_working" , fastexport_icm_working ); - keyFile.set_string ("Fast Export", "fastexport_icm_output" , fastexport_icm_output ); - keyFile.set_integer ("Fast Export", "fastexport_icm_output_intent" , fastexport_icm_outputIntent ); - keyFile.set_string ("Fast Export", "fastexport_icm_gamma" , fastexport_icm_gamma ); - keyFile.set_boolean ("Fast Export", "fastexport_resize_enabled" , fastexport_resize_enabled ); - keyFile.set_double ("Fast Export", "fastexport_resize_scale" , fastexport_resize_scale ); - keyFile.set_string ("Fast Export", "fastexport_resize_appliesTo" , fastexport_resize_appliesTo ); - keyFile.set_string ("Fast Export", "fastexport_resize_method" , fastexport_resize_method ); - keyFile.set_integer ("Fast Export", "fastexport_resize_dataspec" , fastexport_resize_dataspec ); - keyFile.set_integer ("Fast Export", "fastexport_resize_width" , fastexport_resize_width ); - keyFile.set_integer ("Fast Export", "fastexport_resize_height" , fastexport_resize_height ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening" , fastexport_bypass_sharpening ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" , fastexport_bypass_sharpenEdge ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" , fastexport_bypass_sharpenMicro ); + //keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise ); + //keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe" , fastexport_bypass_defringe ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" , fastexport_bypass_dirpyrDenoise ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq" , fastexport_bypass_sh_hq ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer" , fastexport_bypass_dirpyrequalizer ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_wavelet" , fastexport_bypass_wavelet ); + keyFile.set_string ("Fast Export", "fastexport_raw_bayer_method" , fastexport_raw_bayer_method ); + //keyFile.set_boolean ("Fast Export", "fastexport_bypass_bayer_raw_all_enhance" , fastexport_bypass_raw_bayer_all_enhance ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations" , fastexport_bypass_raw_bayer_dcb_iterations ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance" , fastexport_bypass_raw_bayer_dcb_enhance ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations", fastexport_bypass_raw_bayer_lmmse_iterations); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise" , fastexport_bypass_raw_bayer_linenoise ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh" , fastexport_bypass_raw_bayer_greenthresh ); + keyFile.set_string ("Fast Export", "fastexport_raw_xtrans_method" , fastexport_raw_xtrans_method ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps" , fastexport_bypass_raw_ccSteps ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ca" , fastexport_bypass_raw_ca ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_df" , fastexport_bypass_raw_df ); + keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ff" , fastexport_bypass_raw_ff ); + keyFile.set_string ("Fast Export", "fastexport_icm_input" , fastexport_icm_input ); + keyFile.set_string ("Fast Export", "fastexport_icm_working" , fastexport_icm_working ); + keyFile.set_string ("Fast Export", "fastexport_icm_output" , fastexport_icm_output ); + keyFile.set_integer ("Fast Export", "fastexport_icm_output_intent" , fastexport_icm_outputIntent ); + keyFile.set_string ("Fast Export", "fastexport_icm_gamma" , fastexport_icm_gamma ); + keyFile.set_boolean ("Fast Export", "fastexport_resize_enabled" , fastexport_resize_enabled ); + keyFile.set_double ("Fast Export", "fastexport_resize_scale" , fastexport_resize_scale ); + keyFile.set_string ("Fast Export", "fastexport_resize_appliesTo" , fastexport_resize_appliesTo ); + keyFile.set_string ("Fast Export", "fastexport_resize_method" , fastexport_resize_method ); + keyFile.set_integer ("Fast Export", "fastexport_resize_dataspec" , fastexport_resize_dataspec ); + keyFile.set_integer ("Fast Export", "fastexport_resize_width" , fastexport_resize_width ); + keyFile.set_integer ("Fast Export", "fastexport_resize_height" , fastexport_resize_height ); - keyFile.set_string ("Dialogs", "LastIccDir", lastIccDir); - keyFile.set_string ("Dialogs", "LastDarkframeDir", lastDarkframeDir); - keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); - keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); - keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); - keyFile.set_string ("Dialogs", "LastRetinexDir", lastRetinexDir); - keyFile.set_string ("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); - keyFile.set_string ("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); - keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); - keyFile.set_string ("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); - keyFile.set_string ("Dialogs", "LastBWCurvesDir", lastBWCurvesDir); - keyFile.set_string ("Dialogs", "LastToneCurvesDir", lastToneCurvesDir); - keyFile.set_string ("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); - keyFile.set_string ("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); + keyFile.set_string ("Dialogs", "LastIccDir", lastIccDir); + keyFile.set_string ("Dialogs", "LastDarkframeDir", lastDarkframeDir); + keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); + keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); + keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + keyFile.set_string ("Dialogs", "LastRetinexDir", lastRetinexDir); + keyFile.set_string ("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); + keyFile.set_string ("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); + keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); + keyFile.set_string ("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); + keyFile.set_string ("Dialogs", "LastBWCurvesDir", lastBWCurvesDir); + keyFile.set_string ("Dialogs", "LastToneCurvesDir", lastToneCurvesDir); + keyFile.set_string ("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); + keyFile.set_string ("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); - keyData = keyFile.to_data (); + keyData = keyFile.to_data (); } catch (Glib::KeyFileError&) {} From e9beb1b69ce07d0a335d0acc2224537bff549424 Mon Sep 17 00:00:00 2001 From: Desmis Date: Fri, 29 Apr 2016 07:53:41 +0200 Subject: [PATCH 019/232] Add rec2020.icm --- rtdata/iccprofiles/output/Rec2020.icm | Bin 0 -> 9120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rtdata/iccprofiles/output/Rec2020.icm diff --git a/rtdata/iccprofiles/output/Rec2020.icm b/rtdata/iccprofiles/output/Rec2020.icm new file mode 100644 index 0000000000000000000000000000000000000000..0decaf6dc1de06aec45db6979f89a65cb9091c73 GIT binary patch literal 9120 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 literal 0 HcmV?d00001 From 29fe23e517fa8dde0a31f33de9a00f0d5e286085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 29 Apr 2016 17:26:56 +0200 Subject: [PATCH 020/232] Move `film_simulation_strength` calculation into `HaldCLUT::getRGB()` - Moved `film_simulation_strength` calculation into `HaldCLUT::getRGB()` - Removed unneeded base class `CLUT` - Used `_MM_SHUFFLE` --- rtengine/clutstore.cc | 103 ++++++++++++++++++++++------------------ rtengine/clutstore.h | 49 ++++++++----------- rtengine/improcfun.cc | 43 ++++++++--------- rtgui/filmsimulation.cc | 4 +- 4 files changed, 99 insertions(+), 100 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index c9d4645a2..b5f07c121 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -87,40 +87,6 @@ inline vfloat getClutValue(const AlignedBuffer& clut_image, size_ } -void rtengine::CLUT::splitClutFilename( - const Glib::ustring& filename, - Glib::ustring& name, - Glib::ustring& extension, - Glib::ustring& profile_name -) -{ - Glib::ustring basename = Glib::path_get_basename(filename); - - Glib::ustring::size_type last_slash_pos = basename.rfind('/'); - if (last_slash_pos == Glib::ustring::npos) { - last_slash_pos = basename.rfind('\\'); - } - - const Glib::ustring::size_type last_dot_pos = basename.rfind('.'); - - if (last_dot_pos != Glib::ustring::npos) { - name.assign(basename, 0, last_dot_pos); - extension.assign(basename, last_dot_pos + 1, Glib::ustring::npos); - } else { - name = basename; - } - - profile_name = "sRGB"; - - for (const auto& working_profile : rtengine::getWorkingProfiles()) { - if ( std::search( name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend() ) == name.rbegin() ) { - profile_name = working_profile; - name.erase(name.size() - working_profile.size()); - break; - } - } -} - rtengine::HaldCLUT::HaldCLUT() : clut_level(0), flevel_minus_one(0.0f), @@ -164,7 +130,14 @@ Glib::ustring rtengine::HaldCLUT::getProfile() const return clut_profile; } -void rtengine::HaldCLUT::getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const +void rtengine::HaldCLUT::getRGB( + float strength, + std::size_t line_size, + const float* r, + const float* g, + const float* b, + float* out_rgbx +) const { const unsigned int level = clut_level; // This is important @@ -219,13 +192,18 @@ void rtengine::HaldCLUT::getRGB(std::size_t line_size, const float* r, const flo out_rgbx[0] = intp(bl, tmp1[0], out_rgbx[0]); out_rgbx[1] = intp(bl, tmp1[1], out_rgbx[1]); out_rgbx[2] = intp(bl, tmp1[2], out_rgbx[2]); + + out_rgbx[0] = intp(strength, out_rgbx[0], *r); + out_rgbx[1] = intp(strength, out_rgbx[1], *g); + out_rgbx[2] = intp(strength, out_rgbx[2], *b); #else - const vfloat v_tmp = _mm_set_ps(0.0f, *b, *g, *r) * _mm_load_ps1(&flevel_minus_one); + const vfloat v_in = _mm_set_ps(0.0f, *b, *g, *r); + const vfloat v_tmp = v_in * _mm_load_ps1(&flevel_minus_one); const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(_mm_load_ps1(&flevel_minus_two), v_tmp))); size_t index = color * 4; - const vfloat v_r = PERMUTEPS(v_rgb, 0x00); + const vfloat v_r = PERMUTEPS(v_rgb, _MM_SHUFFLE(0, 0, 0, 0)); vfloat v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); @@ -233,7 +211,7 @@ void rtengine::HaldCLUT::getRGB(std::size_t line_size, const float* r, const flo vfloat v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); - const vfloat v_g = PERMUTEPS(v_rgb, 0x55); + const vfloat v_g = PERMUTEPS(v_rgb, _MM_SHUFFLE(1, 1, 1, 1)); vfloat v_out = vintpf(v_g, v_tmp2, v_tmp1); @@ -247,22 +225,58 @@ void rtengine::HaldCLUT::getRGB(std::size_t line_size, const float* r, const flo v_tmp1 = vintpf(v_g, v_tmp2, v_tmp1); - const vfloat v_b = PERMUTEPS(v_rgb, 0xAA); + const vfloat v_b = PERMUTEPS(v_rgb, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ps(out_rgbx, vintpf(v_b, v_tmp1, v_out)); + v_out = vintpf(v_b, v_tmp1, v_out); + + _mm_store_ps(out_rgbx, vintpf(_mm_load_ps1(&strength), v_out, v_in)); #endif } } +void rtengine::HaldCLUT::splitClutFilename( + const Glib::ustring& filename, + Glib::ustring& name, + Glib::ustring& extension, + Glib::ustring& profile_name +) +{ + Glib::ustring basename = Glib::path_get_basename(filename); + + Glib::ustring::size_type last_slash_pos = basename.rfind('/'); + if (last_slash_pos == Glib::ustring::npos) { + last_slash_pos = basename.rfind('\\'); + } + + const Glib::ustring::size_type last_dot_pos = basename.rfind('.'); + + if (last_dot_pos != Glib::ustring::npos) { + name.assign(basename, 0, last_dot_pos); + extension.assign(basename, last_dot_pos + 1, Glib::ustring::npos); + } else { + name = basename; + } + + profile_name = "sRGB"; + + for (const auto& working_profile : rtengine::getWorkingProfiles()) { + if ( std::search( name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend() ) == name.rbegin() ) { + profile_name = working_profile; + name.erase(name.size() - working_profile.size()); + break; + } + } +} + rtengine::CLUTStore& rtengine::CLUTStore::getInstance() { static CLUTStore instance; return instance; } -std::shared_ptr rtengine::CLUTStore::getClut(const Glib::ustring& filename) +std::shared_ptr rtengine::CLUTStore::getClut(const Glib::ustring& filename) { - std::shared_ptr result; + std::shared_ptr result; if (!cache.get(filename, result)) { std::unique_ptr clut(new rtengine::HaldCLUT); @@ -275,11 +289,6 @@ std::shared_ptr rtengine::CLUTStore::getClut(const Glib::ustring return result; } -void rtengine::CLUTStore::releaseClut(const std::shared_ptr& clut) -{ - cache.remove(clut->getFilename()); -} - void rtengine::CLUTStore::clearCache() { cache.clear(); diff --git a/rtengine/clutstore.h b/rtengine/clutstore.h index 6203e4e61..7383b597f 100644 --- a/rtengine/clutstore.h +++ b/rtengine/clutstore.h @@ -11,20 +11,29 @@ namespace rtengine { -class CLUT +class HaldCLUT { public: - CLUT() = default; - CLUT(const CLUT& other) = delete; - CLUT& operator =(const CLUT& other) = delete; - virtual ~CLUT() = default; + HaldCLUT(); + HaldCLUT(const HaldCLUT& other) = delete; + HaldCLUT& operator =(const HaldCLUT& other) = delete; + ~HaldCLUT(); - virtual explicit operator bool() const = 0; + bool load(const Glib::ustring& filename); - virtual Glib::ustring getFilename() const = 0; - virtual Glib::ustring getProfile() const = 0; + explicit operator bool() const; - virtual void getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const = 0; + Glib::ustring getFilename() const; + Glib::ustring getProfile() const; + + void getRGB( + float strength, + std::size_t line_size, + const float* r, + const float* g, + const float* b, + float* out_rgbx + ) const; static void splitClutFilename( const Glib::ustring& filename, @@ -32,23 +41,6 @@ public: Glib::ustring& extension, Glib::ustring& profile_name ); -}; - -class HaldCLUT - : public CLUT -{ -public: - HaldCLUT(); - ~HaldCLUT(); - - bool load(const Glib::ustring& filename); - - explicit operator bool() const override; - - Glib::ustring getFilename() const override; - Glib::ustring getProfile() const override; - - void getRGB(std::size_t line_size, const float* r, const float* g, const float* b, float* out_rgbx) const override; private: AlignedBuffer clut_image; @@ -67,15 +59,14 @@ public: CLUTStore(const CLUTStore& other) = delete; CLUTStore& operator =(const CLUTStore& other) = delete; - std::shared_ptr getClut(const Glib::ustring& filename); - void releaseClut(const std::shared_ptr& clut); + std::shared_ptr getClut(const Glib::ustring& filename); void clearCache(); private: CLUTStore(); - Cache> cache; + Cache> cache; }; } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2fd2bfb17..4bc95e5fa 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -16,7 +16,6 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include #include #include #include @@ -3206,27 +3205,26 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - std::shared_ptr colorLUT; + std::shared_ptr hald_clut; bool clutAndWorkingProfilesAreSame = false; TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { - colorLUT = CLUTStore::getInstance().getClut( params->filmSimulation.clutFilename ); + hald_clut = CLUTStore::getInstance().getClut( params->filmSimulation.clutFilename ); - if ( colorLUT ) { - clutAndWorkingProfilesAreSame = colorLUT->getProfile() == params->icm.working; + if ( hald_clut ) { + clutAndWorkingProfilesAreSame = hald_clut->getProfile() == params->icm.working; if ( !clutAndWorkingProfilesAreSame ) { work2xyz = iccStore->workingSpaceMatrix( params->icm.working ); - xyz2clut = iccStore->workingSpaceInverseMatrix( colorLUT->getProfile() ); + xyz2clut = iccStore->workingSpaceInverseMatrix( hald_clut->getProfile() ); xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); - clut2xyz = iccStore->workingSpaceMatrix( colorLUT->getProfile() ); + clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); } } } - float filmSimCorrectedStrength = static_cast(params->filmSimulation.strength) / 100.0f; - float filmSimSourceStrength = 1.0f - filmSimCorrectedStrength; + const float film_simulation_strength = static_cast(params->filmSimulation.strength) / 100.0f; const float exp_scale = pow (2.0, expcomp); const float comp = (max(0.0, expcomp) + 1.0) * hlcompr / 100.0; @@ -4337,11 +4335,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //Film Simulations - if ( colorLUT ) { - std::size_t out_rgbx_size = 4 * (TS + 16); - std::unique_ptr out_rgbx_buf(new float[out_rgbx_size]); - void* out_rgbx_ptr = out_rgbx_buf.get(); - float* const out_rgbx = reinterpret_cast(std::align(16, 4 * TS, out_rgbx_ptr, out_rgbx_size)); + if ( hald_clut ) { + float out_rgbx[4 * TS] ALIGNED16; for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -4362,21 +4357,25 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceB = CLIP( Color::gamma_srgb( sourceB ) ); } - colorLUT->getRGB(std::min(TS, tW - jstart), rtemp + ti * TS, gtemp + ti * TS, btemp + ti * TS, out_rgbx); + const std::size_t line_offset = ti * TS; + hald_clut->getRGB( + film_simulation_strength, + std::min(TS, tW - jstart), + rtemp + line_offset, + gtemp + line_offset, + btemp + line_offset, + out_rgbx + ); for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - // apply strength - sourceR = out_rgbx[tj * 4 + 0] * filmSimCorrectedStrength + sourceR * filmSimSourceStrength; - sourceG = out_rgbx[tj * 4 + 1] * filmSimCorrectedStrength + sourceG * filmSimSourceStrength; - sourceB = out_rgbx[tj * 4 + 2] * filmSimCorrectedStrength + sourceB * filmSimSourceStrength; // apply inverse gamma sRGB - sourceR = Color::igamma_srgb( sourceR ); - sourceG = Color::igamma_srgb( sourceG ); - sourceB = Color::igamma_srgb( sourceB ); + sourceR = Color::igamma_srgb(out_rgbx[tj * 4 + 0]); + sourceG = Color::igamma_srgb(out_rgbx[tj * 4 + 1]); + sourceB = Color::igamma_srgb(out_rgbx[tj * 4 + 2]); if (!clutAndWorkingProfilesAreSame) { //convert from clut to working profile diff --git a/rtgui/filmsimulation.cc b/rtgui/filmsimulation.cc index 3ee1f4742..f916a5397 100644 --- a/rtgui/filmsimulation.cc +++ b/rtgui/filmsimulation.cc @@ -72,7 +72,7 @@ void FilmSimulation::onClutSelected() if ( getEnabled() && !currentClutFilename.empty() && listener && currentClutFilename != m_oldClutFilename ) { Glib::ustring clutName, dummy; - CLUT::splitClutFilename( currentClutFilename, clutName, dummy, dummy ); + HaldCLUT::splitClutFilename( currentClutFilename, clutName, dummy, dummy ); listener->panelChanged( EvFilmSimulationFilename, clutName ); m_oldClutFilename = currentClutFilename; @@ -279,7 +279,7 @@ int ClutComboBox::parseDir (const Glib::ustring& path) for (const auto& entry : entries) { Glib::ustring name, extension, profileName; - CLUT::splitClutFilename (entry, name, extension, profileName); + HaldCLUT::splitClutFilename (entry, name, extension, profileName); extension = extension.casefold (); if (extension.compare ("tif") != 0 && extension.compare ("png") != 0) { From beaea22779abe3732a7cee4dfa2a4ef4ad1785e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 29 Apr 2016 20:35:37 +0200 Subject: [PATCH 021/232] Vectorize color space conversion for HaldCLUT Vectorize color space conversion for HaldCLUT depending on the definition of `VECTLENSP`. It's not fully AVX compatible because `F2V`, `LVF`, and `STVF` are SSE only. --- rtengine/color.cc | 9 ++++ rtengine/color.h | 4 +- rtengine/improcfun.cc | 99 +++++++++++++++++++++++++++++++++++++------ 3 files changed, 98 insertions(+), 14 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index f5a8c86a3..dc0710a2f 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -819,6 +819,15 @@ 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)) ; } +#ifdef __SSE2__ +void Color::rgbxyz (vfloat r, vfloat g, vfloat b, vfloat &x, vfloat &y, vfloat &z, const vfloat xyz_rgb[3][3]) +{ + x = ((xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b)) ; + y = ((xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b)) ; + z = ((xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b)) ; +} +#endif + void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]) { //Transform to output color. Standard sRGB is D65, but internal representation is D50 diff --git a/rtengine/color.h b/rtengine/color.h index 3f78692d8..9ff00034c 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -325,7 +325,9 @@ public: */ static void rgbxyz (float r, float g, float b, float &x, float &y, float &z, 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]); +#endif /** * @brief Convert Lab in xyz diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4bc95e5fa..c1de37474 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3208,6 +3208,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer std::shared_ptr hald_clut; bool clutAndWorkingProfilesAreSame = false; TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; +#ifdef VECTLENSP + vfloat v_work2xyz[3][3]; + vfloat v_xyz2clut[3][3]; + vfloat v_clut2xyz[3][3]; + vfloat v_xyz2work[3][3]; +#endif if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { hald_clut = CLUTStore::getInstance().getClut( params->filmSimulation.clutFilename ); @@ -3220,6 +3226,16 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer xyz2clut = iccStore->workingSpaceInverseMatrix( hald_clut->getProfile() ); xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); +#ifdef VECTLENSP + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + v_work2xyz[i][j] = F2V(work2xyz[i][j]); + v_xyz2clut[i][j] = F2V(xyz2clut[i][j]); + v_xyz2work[i][j] = F2V(xyz2work[i][j]); + v_clut2xyz[i][j] = F2V(clut2xyz[i][j]); + } + } +#endif } } } @@ -4335,22 +4351,51 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //Film Simulations - if ( hald_clut ) { + if (hald_clut) { float out_rgbx[4 * TS] ALIGNED16; for (int i = istart, ti = 0; i < tH; i++, ti++) { + if (!clutAndWorkingProfilesAreSame) { +#ifdef VECTLENSP + if (!(std::min(TS, tW - jstart) & ~(VECTLENSP - 1))) { + for (int j = jstart, tj = 0; j < tW; j += VECTLENSP, tj += VECTLENSP) { + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); + + //convert from working to clut profile + vfloat x; + vfloat y; + vfloat z; + Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, v_work2xyz ); + Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, v_xyz2clut ); + + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); + } + } + else +#endif + { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + float &sourceR = rtemp[ti * TS + tj]; + float &sourceG = gtemp[ti * TS + tj]; + float &sourceB = btemp[ti * TS + tj]; + + //convert from working to clut profile + float x, y, z; + Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, work2xyz ); + Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2clut ); + } + } + } + for (int j = jstart, tj = 0; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - if (!clutAndWorkingProfilesAreSame) { - //convert from working to clut profile - float x, y, z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, work2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2clut ); - } - //appply gamma sRGB (default RT) sourceR = CLIP( Color::gamma_srgb( sourceR ) ); sourceG = CLIP( Color::gamma_srgb( sourceG ) ); @@ -4376,14 +4421,42 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceR = Color::igamma_srgb(out_rgbx[tj * 4 + 0]); sourceG = Color::igamma_srgb(out_rgbx[tj * 4 + 1]); sourceB = Color::igamma_srgb(out_rgbx[tj * 4 + 2]); + } - if (!clutAndWorkingProfilesAreSame) { - //convert from clut to working profile - float x, y, z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, clut2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2work ); + if (!clutAndWorkingProfilesAreSame) { +#ifdef VECTLENSP + if (!(std::min(TS, tW - jstart) & ~(VECTLENSP - 1))) { + for (int j = jstart, tj = 0; j < tW; j += VECTLENSP, tj += VECTLENSP) { + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); + + //convert from clut to working profile + vfloat x; + vfloat y; + vfloat z; + Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, v_clut2xyz ); + Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, v_xyz2work ); + + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); + } } + else +#endif + { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + float &sourceR = rtemp[ti * TS + tj]; + float &sourceG = gtemp[ti * TS + tj]; + float &sourceB = btemp[ti * TS + tj]; + //convert from clut to working profile + float x, y, z; + Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, clut2xyz ); + Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2work ); + } + } } } } From 130337578ee64ec7beec34171453942f305c4536 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Fri, 29 Apr 2016 23:17:54 +0200 Subject: [PATCH 022/232] Updated Sony ILCE-6000.dcp, #3220 --- rtdata/dcpprofiles/Sony ILCE-6000.dcp | Bin 1045602 -> 1045602 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rtdata/dcpprofiles/Sony ILCE-6000.dcp b/rtdata/dcpprofiles/Sony ILCE-6000.dcp index 6d7e7c1e6cc48fec4b1affa84bf42d9fb9661137..5ef8c4d31549e2c243636dddd87d2cb06f3d017d 100644 GIT binary patch delta 32857 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 KG)SYZ?*9NrNQG$t delta 32857 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 From 12a5d90fe6be16d9495d696037b6da2e034cdeed Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 30 Apr 2016 07:41:34 +0200 Subject: [PATCH 023/232] chanhe matrix rgb-xyz and xyz-rgb --- rtengine/iccmatrices.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 62ac7f150..d70aedd0c 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -54,7 +54,7 @@ const double sRGB_xyz[3][3] = {{3.13593293538656, -1.61878246026431, // Color space conversion to/from XYZ; color spaces adapted to D50 using Bradford transform -const double xyz_sRGB[3][3] = {{0.4360747, 0.3850649, 0.1430804}, +const double xyz_sRGB[3][3] = {{0.4360747, 0.385061, 0.1430804}, {0.2225045, 0.7168786, 0.0606169}, {0.0139322, 0.0971045, 0.7141733} }; @@ -83,7 +83,7 @@ const double prophoto_xyz[3][3] = {{1.3459433, -0.2556075, -0.0511118}, { -0.5445989, 1.5081673, 0.0205351}, {0.0000000, 0.0000000, 1.2118128} }; - +/* const double xyz_rec2020[3][3] = {{0.636958, 0.144617, 0.168881}, {0.262700, 0.677998, 0.059302}, {0.0000000, 0.028073, 1.060985} @@ -93,6 +93,16 @@ const double rec2020_xyz[3][3] = {{1.716651, -0.355671, -0.253366}, { -0.666684, 1.616481, 0.015769}, {0.017640, -0.042771, 0.942103} }; +*/ +const double xyz_rec2020[3][3] = {{0.6734241, 0.1656411, 0.1251286}, + {0.2790177, 0.6753402, 0.0456377}, + { -0.0019300, 0.0299784, 0.7973330} +}; + +const double rec2020_xyz[3][3] = {{1.6473376, -0.3935675, -0.2359961}, + { -0.6826036, 1.6475887, 0.0128190}, + {0.0296524, -0.0628993, 1.2531279} +}; const double xyz_widegamut[3][3] = {{0.7161046, 0.1009296, 0.1471858}, {0.2581874, 0.7249378, 0.0168748}, From 06611c04bab09ddae0fa79a34cb432dcae8c39f9 Mon Sep 17 00:00:00 2001 From: Desmis Date: Sat, 30 Apr 2016 07:47:21 +0200 Subject: [PATCH 024/232] small change --- rtengine/iccmatrices.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index d70aedd0c..292f45612 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -54,7 +54,7 @@ const double sRGB_xyz[3][3] = {{3.13593293538656, -1.61878246026431, // Color space conversion to/from XYZ; color spaces adapted to D50 using Bradford transform -const double xyz_sRGB[3][3] = {{0.4360747, 0.385061, 0.1430804}, +const double xyz_sRGB[3][3] = {{0.4360747, 0.3850649, 0.1430804}, {0.2225045, 0.7168786, 0.0606169}, {0.0139322, 0.0971045, 0.7141733} }; From 2dd2f5ca175b6c0673f02bd50a63fcbe59a5b5f5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 1 May 2016 00:16:06 +0200 Subject: [PATCH 025/232] Speedup for thumbnail processing --- rtengine/LUT.h | 130 +++--- rtengine/curves.cc | 718 +++++++++------------------------- rtengine/curves.h | 56 +-- rtengine/dcp.cc | 4 +- rtengine/demosaic_algos.cc | 5 +- rtengine/diagonalcurves.cc | 6 +- rtengine/improccoordinator.cc | 50 +-- rtengine/improccoordinator.h | 2 +- rtengine/improcfun.cc | 131 +++---- rtengine/previewimage.cc | 7 - rtengine/rawimagesource.cc | 19 +- rtengine/rtthumbnail.cc | 52 ++- rtengine/simpleprocess.cc | 39 +- rtengine/sleef.c | 8 +- 14 files changed, 427 insertions(+), 800 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 76bcf0ccd..6203cfb92 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -215,7 +215,7 @@ public: * For a LUT(500), it will return 500 * @return number of element in the array */ - int getSize() + unsigned int getSize() const { return size; } @@ -274,6 +274,20 @@ public: return *this; } + // mutliply all elements of LUT with a constant float value + LUT & operator*=(float factor) + { +#ifdef _OPENMP + #pragma omp simd +#endif + + for(unsigned int i = 0; i < this->size; i++) { + data[i] *= factor; + } + + return *this; + } + // use with integer indices T& operator[](int index) const { @@ -526,79 +540,59 @@ public: upperBound = 0; maxs = 0; } -}; - - -// TODO: HOMBRE: HueLUT is actually unused, could we delete this class now that LUT::getVal01 has been created? - - -/** @brief LUT subclass handling hue values specifically. - The array has a fixed size of float values and have to be in the [0.; 1.] range in both axis (no error checking implemented) */ -class HueLUT : public LUTf -{ -public: - HueLUT() : LUTf() {} - explicit HueLUT(bool createArray) : LUTf() + // create an identity LUT (LUT(x) = x) or a scaled identity LUT (LUT(x) = x / divisor) + void makeIdentity(float divisor = 1.f) { - if (createArray) { - this->operator () (501, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); - } - } - - void create() - { - this->operator () (501, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); - } - - // use with integer indices - float& operator[](int index) const - { - return data[ rtengine::LIM(index, 0, upperBound) ]; - } - - // use with float indices in the [0.;1.] range - float operator[](float index) const - { - int idx = int(index * 500.f); // don't use floor! The difference in negative space is no problems here - - if (index < 0.f) { - return data[0]; - } else if (index > 1.f) { - return data[upperBound]; - } - - float balance = index - float(idx / 500.f); - float h1 = data[idx]; - float h2 = data[idx + 1]; - - if (h1 == h2) { - return h1; - } - - if ((h1 > h2) && (h1 - h2 > 0.5f)) { - h1 -= 1.f; - float value = h1 + balance * (h2 - h1); - - if (value < 0.f) { - value += 1.f; + if(divisor == 1.f) { + for(unsigned int i = 0; i < size; i++) { + data[i] = i; } - - return value; - } else if (h2 - h1 > 0.5f) { - h2 -= 1.f; - float value = h1 + balance * (h2 - h1); - - if (value < 0.f) { - value += 1.f; - } - - return value; } else { - return h1 + balance * (h2 - h1); + for(unsigned int i = 0; i < size; i++) { + data[i] = i / divisor; + } } } -}; + // compress a LUT with size y into a LUT with size y (y &dest, unsigned int numVals) const + { + numVals = std::min(numVals, size); + float divisor = numVals - 1; + float mult = (dest.size - 1) / divisor; + + for (unsigned int i = 0; i < numVals; i++) { + int hi = (int)(mult * i); + dest.data[hi] += this->data[i] ; + } + } + + // compress a LUT with size y into a LUT with size y (y &dest, unsigned int numVals, const LUT &passThrough) const + { + if(passThrough) { + numVals = std::min(numVals, size); + numVals = std::min(numVals, passThrough.getSize()); + float mult = dest.size - 1; + + for (int i = 0; i < numVals; i++) { + int hi = (int)(mult * passThrough[i]); + dest[hi] += this->data[i] ; + } + } + } + + void makeConstant(float value, unsigned int numVals = 0) + { + numVals = numVals == 0 ? size : numVals; + numVals = std::min(numVals, size); + for(unsigned int i = 0; i < numVals; i++) { + data[i] = value; + } + } + + +}; #endif /* LUT_H_ */ diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 6792df50d..e8a1bc88e 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -43,7 +43,7 @@ using namespace std; namespace rtengine { -Curve::Curve () : N(0), x(NULL), y(NULL), ypp(NULL), hashSize(1000 /* has to be initialized to the maximum value */ ) {} +Curve::Curve () : N(0), x(nullptr), y(nullptr), ypp(nullptr), hashSize(1000 /* has to be initialized to the maximum value */ ) {} void Curve::AddPolygons () { @@ -155,11 +155,9 @@ void Curve::getControlPoint(int cpNum, double &x, double &y) const const double CurveFactory::sRGBGamma = 2.2; const double CurveFactory::sRGBGammaCurve = 2.4; -SSEFUNCTION void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) +void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool needed) { - if (needed) { - LUTf lutCurve (65536); for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1 ) { // change to [0,1] range @@ -167,307 +165,139 @@ SSEFUNCTION void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int sk // apply custom/parametric/NURBS curve, if any val = diagCurve->getVal (val); // store result in a temporary array - lutCurve[i] = (val); + outCurve[i] = val; } // if skip>1, let apply linear interpolation in the skipped points of the curve if (skip > 1) { - int prev = 0; + float skipmul = 1.f / (float) skip; - for (int i = 1; i <= 0xffff - skip; i++) { - if (i % skip == 0) { - prev += skip; - continue; + for (int i = 0; i <= 0x10000 - skip; i += skip) { + for(int j = 1; j < skip; j++) { + outCurve[i + j] = ( outCurve[i] * (skip - j) + outCurve[i + skip] * j ) * skipmul; } - - lutCurve[i] = ( lutCurve[prev] * (skip - i % skip) + lutCurve[prev + skip] * (i % skip) ) / skip; } } - for (int i = 0; i <= 0xffff; i++) { - outCurve[i] = (65535.f * lutCurve[i]); - } + outCurve *= 65535.f; } else { -#ifdef __SSE2__ - __m128 fourv = _mm_set1_ps(4.f); - __m128 iv = _mm_set_ps(3.f, 2.f, 1.f, 0.f); - - for (int i = 0; i <= 0xfffc; i += 4) { - _mm_storeu_ps(&outCurve[i], iv); - iv += fourv; - } - -#else - - for (int i = 0; i <= 0xffff; i++) { - outCurve[i] = (float)i; - } - -#endif - } - -} - -void CurveFactory::updatechroma ( - const std::vector& cccurvePoints, - LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma - int skip) -{ - LUTf dCcurve(65536, 0); - float val; - - for (int i = 0; i < 48000; i++) { //32768*1.414 + ... - val = (double)i / 47999.0; - dCcurve[i] = CLIPD(val); - } - - outBeforeCCurveHistogramC.clear(); - bool histNeededC = false; - - - if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { - if (outBeforeCCurveHistogramC /*&& histogramCropped*/) { - histNeededC = true; - } - } - - for (int i = 0; i < 48000; i++) { //32768*1.414 + ... - float val; - - if (histNeededC) { - float hval = dCcurve[i]; - int hi = (int)(255.0 * CLIPD(hval)); // - outBeforeCCurveHistogramC[hi] += histogramC[i] ; - } + outCurve.makeIdentity(); } } - -void CurveFactory::curveLightBrightColor ( - procparams::ColorAppearanceParams::eTCModeId curveMode1, const std::vector& curvePoints1, - procparams::ColorAppearanceParams::eTCModeId curveMode2, const std::vector& curvePoints2, - procparams::ColorAppearanceParams::eCTCModeId curveMode3, const std::vector& curvePoints3, - LUTu & histogram, LUTu & histogramCropped, LUTu & outBeforeCCurveHistogram,//for Luminance - LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma - ColorAppearance & customColCurve1, - ColorAppearance & customColCurve2, - ColorAppearance & customColCurve3, - int skip) +void CurveFactory::curveLightBrightColor (const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3, + const LUTu & histogram, LUTu & outBeforeCCurveHistogram,//for Luminance + const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma + ColorAppearance & customColCurve1, ColorAppearance & customColCurve2, ColorAppearance & customColCurve3, int skip) { outBeforeCCurveHistogram.clear(); outBeforeCCurveHistogramC.clear(); - bool histNeededC = false; - bool histNeeded = false; - DiagonalCurve* tcurve = NULL; customColCurve3.Reset(); if (!curvePoints3.empty() && curvePoints3[0] > DCT_Linear && curvePoints3[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePoints3, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePoints3, CURVES_MIN_POLY_POINTS / skip); if (outBeforeCCurveHistogramC /*&& histogramCropped*/) { - histNeededC = true; + histogramC.compressTo(outBeforeCCurveHistogramC, 48000); } - } - - if (tcurve) { - if (tcurve->isIdentity()) { - delete tcurve; - tcurve = NULL; - } else { + if (!tcurve.isIdentity()) { customColCurve3.Set(tcurve); } - - delete tcurve; - tcurve = NULL; } + customColCurve2.Reset(); if (!curvePoints2.empty() && curvePoints2[0] > DCT_Linear && curvePoints2[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePoints2, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); if (outBeforeCCurveHistogram /*&& histogramCropped*/) { histNeeded = true; } - } - - if (tcurve) { - if (tcurve->isIdentity()) { - delete tcurve; - tcurve = NULL; - } else { + if (!tcurve.isIdentity()) { customColCurve2.Set(tcurve); } - - delete tcurve; - tcurve = NULL; } + // create first curve if needed customColCurve1.Reset(); if (!curvePoints1.empty() && curvePoints1[0] > DCT_Linear && curvePoints1[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePoints1, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePoints1, CURVES_MIN_POLY_POINTS / skip); if (outBeforeCCurveHistogram /*&& histogramCropped*/) { histNeeded = true; } - } - - if (tcurve) { - if (tcurve->isIdentity()) { - delete tcurve; - tcurve = NULL; - } else { + if (!tcurve.isIdentity()) { customColCurve1.Set(tcurve); - delete tcurve; - tcurve = NULL; } } if (histNeeded) { - for (int i = 0; i < 32768; i++) { - double hval = CLIPD((double)i / 32767.0); - int hi = (int)(255.0 * hval); - outBeforeCCurveHistogram[hi] += histogram[i] ; - } - } - - if (histNeededC) { - for (int i = 0; i < 48000; i++) { //32768*1.414 + ... - double hval = CLIPD((double)i / 47999.0); - int hi = (int)(255.0 * hval); // - outBeforeCCurveHistogramC[hi] += histogramC[i] ; - } - } - - if (tcurve) { - delete tcurve; - } - -} -// add curve Denoise : C=f(C) -void CurveFactory::denoiseCC ( bool & ccdenoiseutili, const std::vector& cccurvePoints, LUTf & NoiseCCcurve, int skip) -{ - bool needed; - DiagonalCurve* dCurve = NULL; - LUTf dCcurve(65536, 0); - - float val; - - for (int i = 0; i < 48000; i++) { - dCcurve[i] = (float)i / 47999.0; - } - - needed = false; - - if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { - dCurve = new DiagonalCurve (cccurvePoints, CURVES_MIN_POLY_POINTS / skip); - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - ccdenoiseutili = true; - } - } - - fillCurveArray(dCurve, NoiseCCcurve, skip, needed); - //NoiseCCcurve.dump("Noise"); - - if (dCurve) { - delete dCurve; - dCurve = NULL; + histogram.compressTo(outBeforeCCurveHistogram, 32768); } } - -void CurveFactory::curveBW ( - const std::vector& curvePointsbw, const std::vector& curvePointsbw2, - LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance - ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip) +void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std::vector& curvePointsbw2, + const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance + ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip) { const float gamma_ = Color::sRGBGammaCurve; - const float start = expf(gamma_ * logf( -0.055 / ((1.0 / gamma_ - 1.0) * 1.055 ))); - const float slope = 1.055 * powf (start, 1.0 / gamma_ - 1) - 0.055 / start; - const float mul = 1.055; - const float add = 0.055; + constexpr float mul = 1.055; + constexpr float add = 0.055; + const float start = expf(gamma_ * logf( -add / ((1.0 / gamma_ - 1.0) * mul ))); + const float slope = mul * powf (start, 1.0 / gamma_ - 1) - add / start; outBeforeCCurveHistogrambw.clear(); bool histNeeded = false; - DiagonalCurve* tcurve = NULL; customToneCurvebw2.Reset(); if (!curvePointsbw2.empty() && curvePointsbw2[0] > DCT_Linear && curvePointsbw2[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePointsbw2, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePointsbw2, CURVES_MIN_POLY_POINTS / skip); if (outBeforeCCurveHistogrambw /*&& histogramCropped*/) { histNeeded = true; } - } - - if (tcurve) { - if (!tcurve->isIdentity()) { + if (!tcurve.isIdentity()) { customToneCurvebw2.Set(tcurve, gamma_, start, slope, mul, add); } - - delete tcurve; - tcurve = NULL; } + customToneCurvebw1.Reset(); if (!curvePointsbw.empty() && curvePointsbw[0] > DCT_Linear && curvePointsbw[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePointsbw, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePointsbw, CURVES_MIN_POLY_POINTS / skip); if (outBeforeCCurveHistogrambw /*&& histogramCropped*/) { histNeeded = true; } - } - - if (tcurve) { - if (!tcurve->isIdentity()) { + if (!tcurve.isIdentity()) { customToneCurvebw1.Set(tcurve, gamma_, start, slope, mul, add); } - - delete tcurve; - tcurve = NULL; } + // create first curve if needed if (histNeeded) { - LUTf dcurve(65536, 0); - - float val; - - for (int i = 0; i < 32768; i++) { - val = (float)i / 32767.f; - dcurve[i] = CLIPD(val); - } - - for (int i = 0; i < 32768; i++) { - float hval = dcurve[i]; - int hi = (int)(255.0 * CLIPD(hval)); - outBeforeCCurveHistogrambw[hi] += histogrambw[i] ; - } + histogrambw.compressTo(outBeforeCCurveHistogrambw, 32768); } - - if (tcurve) { - delete tcurve; - } - } + // add curve Lab : C=f(L) -void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip) +void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, const LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip) { - bool needed; - DiagonalCurve* dCurve = NULL; + bool needed = false; + DiagonalCurve* dCurve = nullptr; if (outBeforeCLurveHistogram) { outBeforeCLurveHistogram.clear(); @@ -475,8 +305,6 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve bool histNeededCL = false; - needed = false; - if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { dCurve = new DiagonalCurve (clcurvePoints, CURVES_MIN_POLY_POINTS / skip); @@ -490,25 +318,21 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve } } - if(histNeededCL) - for (int i = 0; i < 50000; i++) { //32768*1.414 + ... - int hi = (int)(255.0 * CLIPD((float)i / 49999.0)); // - outBeforeCLurveHistogram[hi] += histogramcl[i] ; - } - + if(histNeededCL) { + histogramcl.compressTo(outBeforeCLurveHistogram, 50000); + } fillCurveArray(dCurve, clCurve, skip, needed); if (dCurve) { delete dCurve; - dCurve = NULL; } } -void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram) +void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; - DiagonalCurve* dCurve = NULL; + DiagonalCurve* dCurve = nullptr; outBeforeCurveHistogram.clear(); bool histNeeded = false; @@ -526,28 +350,20 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m } if (histNeeded) { - for (int i = 0; i < 32768; i++) { - double hval = CLIPD((double)i / 32767.0); - int hi = (int)(255.0 * hval); - outBeforeCurveHistogram[hi] += histogram[i] ; - } + histogram.compressTo(outBeforeCurveHistogram, 32768); } fillCurveArray(dCurve, mapcurve, skip, needed); if (dCurve) { delete dCurve; - dCurve = NULL; } } - - - -void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram) +void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; - DiagonalCurve* dCurve = NULL; + DiagonalCurve* dCurve = nullptr; outBeforeCurveHistogram.clear(); bool histNeeded = false; @@ -565,37 +381,24 @@ void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip) { - bool needed; - DiagonalCurve* dCurve = NULL; - - // if (outBeforeWavCLurveHistogram) - // outBeforeWavCLurveHistogram.clear(); - bool histNeededCL = false; - - needed = false; + bool needed = false; + DiagonalCurve* dCurve = nullptr; if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) { dCurve = new DiagonalCurve (wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip); - // if (outBeforeWavCLurveHistogram) - // histNeededCL = true; if (dCurve && !dCurve->isIdentity()) { needed = true; @@ -603,112 +406,47 @@ void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& clcurvePoints, LUTf & clToningCurve, int skip) +// add curve Colortoning : C=f(L) and CLf(L) +void CurveFactory::curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip) { - bool needed; - DiagonalCurve* dCurve = NULL; + bool needed = false; + DiagonalCurve* dCurve = nullptr; - needed = false; - - if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (clcurvePoints, CURVES_MIN_POLY_POINTS / skip); + if (!curvePoints.empty() && curvePoints[0] != 0) { + dCurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); if (dCurve && !dCurve->isIdentity()) { needed = true; - clctoningutili = true; } } - fillCurveArray(dCurve, clToningCurve, skip, needed); - - // clToningCurve.dump("CLToning"); - if (dCurve) { - delete dCurve; - dCurve = NULL; - } -} - -// add curve Colortoning : CLf(L) -void CurveFactory::curveToningLL ( bool & llctoningutili, const std::vector& llcurvePoints, LUTf & llToningCurve, int skip) -{ - bool needed; - DiagonalCurve* dCurve = NULL; - - needed = false; - - if (!llcurvePoints.empty() && llcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (llcurvePoints, CURVES_MIN_POLY_POINTS / skip); - - if (dCurve && !dCurve->isIdentity()) { - needed = true; - llctoningutili = true; - } - } - - fillCurveArray(dCurve, llToningCurve, skip, needed); -// llToningCurve.dump("LLToning"); + fillCurveArray(dCurve, ToningCurve, skip, needed); if (dCurve) { delete dCurve; - dCurve = NULL; } } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili, bool & ccutili, bool & cclutili, double saturation, double rstprotection, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, - LUTu & histogramC, LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, //for chroma + const LUTu & histogramC, const LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, //for chroma int skip) { - - //----------------------------------------------------- - - bool needed; - DiagonalCurve* dCurve = NULL; - LUTf dCcurve(65536, 0); + bool needed = false; + DiagonalCurve* dCurve = nullptr; int k = 48000; //32768*1.41 - if(outBeforeCCurveHistogram || outBeforeLCurveHistogram) { - for (int i = 0; i < k * adjustr; i++) { //# 32768*1.414 approximation maxi for chroma - dCcurve[i] = (float)i / (k * adjustr - 1); - } - } - - if (outBeforeCCurveHistogram) { - outBeforeCCurveHistogram.clear(); - } - - bool histNeededC = false; - - if (outBeforeLCurveHistogram) { - outBeforeLCurveHistogram.clear(); - } - - bool histNeededLC = false; - - //----------------------------------------------------- - - needed = false; - // create a curve if needed if (!acurvePoints.empty() && acurvePoints[0] != 0) { dCurve = new DiagonalCurve (acurvePoints, CURVES_MIN_POLY_POINTS / skip); @@ -720,11 +458,10 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } fillCurveArray(dCurve, aoutCurve, skip, needed); - //if(autili) aoutCurve.dump("acurve"); if (dCurve) { delete dCurve; - dCurve = NULL; + dCurve = nullptr; } //----------------------------------------------------- @@ -744,17 +481,21 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili if (dCurve) { delete dCurve; - dCurve = NULL; + dCurve = nullptr; } //----------------------------------------------- needed = false; + if (outBeforeCCurveHistogram) { + outBeforeCCurveHistogram.clear(); + } + if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { dCurve = new DiagonalCurve (cccurvePoints, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogram /*&& histogramCropped*/) { - histNeededC = true; + if (outBeforeCCurveHistogram) { + histogramC.compressTo(outBeforeCCurveHistogram, k * adjustr); } if (dCurve && !dCurve->isIdentity()) { @@ -763,29 +504,25 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - if (histNeededC) { - for (int i = 0; i < k * adjustr; i++) { //32768*1.414 + ... - float hval = dCcurve[i]; - int hi = (int)(255.0 * CLIPD(hval)); // - outBeforeCCurveHistogram[hi] += histogramC[i] ; - } - } - fillCurveArray(dCurve, satCurve, skip, needed); if (dCurve) { delete dCurve; - dCurve = NULL; + dCurve = nullptr; } //---------------------------- needed = false; + if (outBeforeLCurveHistogram) { + outBeforeLCurveHistogram.clear(); + } + if (!lccurvePoints.empty() && lccurvePoints[0] != 0) { dCurve = new DiagonalCurve (lccurvePoints, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeLCurveHistogram /*&& histogramCropped*/) { - histNeededLC = true; + if (outBeforeLCurveHistogram) { + histogramLC.compressTo(outBeforeLCurveHistogram, k * adjustr); } if (dCurve && !dCurve->isIdentity()) { @@ -794,22 +531,11 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - if (histNeededLC) { - for (int i = 0; i < k * adjustr; i++) { //32768*1.414 + ... - float hval = dCcurve[i]; - int hi = (int)(255.0 * CLIPD(hval)); // - outBeforeLCurveHistogram[hi] += histogramLC[i] ; - } - } - - fillCurveArray(dCurve, lhskCurve, skip, needed); if (dCurve) { delete dCurve; - dCurve = NULL; } - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -817,15 +543,15 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, - double shcompr, double br, double contr, - procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, - procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, - LUTu & histogram, LUTu & histogramCropped, - LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, - LUTu & outBeforeCCurveHistogram, - ToneCurve & customToneCurve1, - ToneCurve & customToneCurve2, - int skip) + double shcompr, double br, double contr, + procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, + procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, + LUTu & histogram, LUTu & histogramCropped, + LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, + LUTu & outBeforeCCurveHistogram, + ToneCurve & customToneCurve1, + ToneCurve & customToneCurve2, + int skip) { // the curve shapes are defined in sRGB gamma, but the output curves will operate on linear floating point data, @@ -846,7 +572,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - DiagonalCurve* brightcurve = NULL; + DiagonalCurve* brightcurve = nullptr; // check if brightness curve is needed if (br > 0.00001 || br < -0.00001) { @@ -885,28 +611,47 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double float scale = 65536.0; float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0; float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; - //printf("shoulder = %e\n",shoulder); - //printf ("exp_scale= %f comp= %f def_mul=%f a= %f \n",exp_scale,comp,def_mul,a); - if (comp <= 0.0f) - for (int i = 0; i < 0x10000; i++) { - hlCurve[i] = exp_scale; - } - else { - for (int i = 0; i <= shoulder; i++) { - hlCurve[i] = exp_scale; - } + if (comp <= 0.0f) { + hlCurve.makeConstant(exp_scale); + } else { + hlCurve.makeConstant(exp_scale, shoulder + 1); float scalemshoulder = scale - shoulder; - for (int i = shoulder + 1; i < 0x10000; i++) { +#ifdef __SSE2__ + int i = shoulder + 1; + if(i&1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference // change to [0,1] range float val = (float)i - shoulder; float R = val * comp / (scalemshoulder); hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + i++; } - } + vdouble onev = _mm_set1_pd(1.0); + vdouble Rv = _mm_set_pd((i+1-shoulder) * (double)comp/ scalemshoulder,(i-shoulder) * (double)comp/ scalemshoulder); + vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder); + vdouble exp_scalev = _mm_set1_pd(exp_scale); + for (; i < 0x10000; i+=2) { + // change to [0,1] range + vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv; + vfloat resultfv = _mm_cvtpd_ps(resultv); + _mm_store_ss(&hlCurve[i], resultfv); + resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1,1,1,1)); + _mm_store_ss(&hlCurve[i+1], resultfv); + Rv += incrementv; + } +#else + float R = comp / scalemshoulder; + float increment = R; + for (int i = shoulder + 1; i < 0x10000; i++) { + // change to [0,1] range + hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision + R += increment; + } +#endif + } // curve without contrast LUTf dcurve(0x10000); @@ -915,7 +660,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // change to [0,1] range shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. float val = 1.f / 65535.f; - float val2 = simplebasecurve (val, black, 0.015 * shcompr); + float val2 = simplebasecurve (val, black, 0.015 * shcompr); shCurve[0] = CLIPD(val2) / val; val = 0.0; // gamma correction @@ -929,11 +674,11 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // store result in a temporary array dcurve[0] = CLIPD(val); - #pragma omp parallel for + + #pragma omp parallel for //schedule(dynamic,2048) for (int i = 1; i < 0x10000; i++) { - float val; - val = (float)i / 65535.0f; + float val = i / 65535.f; float val2 = simplebasecurve (val, black, 0.015 * shcompr); shCurve[i] = CLIPD(val2) / val; @@ -965,18 +710,13 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double unsigned int sum = 0; float avg = 0; - //double sqavg = 0; for (int i = 0; i <= 0xffff; i++) { - float fi = i; - fi *= hlCurve[i]; + float fi = i * hlCurve[i]; avg += dcurve[(int)(shCurve[fi] * fi)] * histogram[i]; - //sqavg += dcurve[i]*dcurve[i] * histogram[i]; sum += histogram[i]; } avg /= sum; - //sqavg /= sum; - //double stddev = sqrt(sqavg-avg*avg); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% std::vector contrastcurvePoints; @@ -995,41 +735,35 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double contrastcurvePoints.at(7) = 1.; // white point contrastcurvePoints.at(8) = 1.; // value at white point - DiagonalCurve* contrastcurve = new DiagonalCurve (contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // apply contrast enhancement for (int i = 0; i <= 0xffff; i++) { - dcurve[i] = contrastcurve->getVal (dcurve[i]); + dcurve[i] = contrastcurve.getVal (dcurve[i]); } - delete contrastcurve; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // create second curve if needed bool histNeeded = false; - DiagonalCurve* tcurve = NULL; + DiagonalCurve* tcurve = nullptr; customToneCurve2.Reset(); if (!curvePoints2.empty() && curvePoints2[0] > DCT_Linear && curvePoints2[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePoints2, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); + + if (!tcurve.isIdentity()) { + customToneCurve2.Set(tcurve, gamma_, start, slope, mul, add); + } if (outBeforeCCurveHistogram /*&& histogramCropped*/) { histNeeded = true; } } - if (tcurve) { - if (!tcurve->isIdentity()) { - customToneCurve2.Set(tcurve, gamma_, start, slope, mul, add); - } - - delete tcurve; - tcurve = NULL; - } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1038,90 +772,53 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double customToneCurve1.Reset(); if (!curvePoints.empty() && curvePoints[0] > DCT_Linear && curvePoints[0] < DCT_Unchanged) { - tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve tcurve(curvePoints, CURVES_MIN_POLY_POINTS / skip); + + if (!tcurve.isIdentity()) { + customToneCurve1.Set(tcurve, gamma_, start, slope, mul, add); + } if (outBeforeCCurveHistogram /*&& histogramCropped*/) { histNeeded = true; } } - if (tcurve) { - if (!tcurve->isIdentity()) { - customToneCurve1.Set(tcurve, gamma_, start, slope, mul, add); - } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - delete tcurve; - tcurve = NULL; +#ifdef __SSE2__ + vfloat gamma_v = F2V(gamma_); + vfloat startv = F2V(start); + vfloat slopev = F2V(slope); + vfloat mulv = F2V(mul); + vfloat addv = F2V(add); + vfloat c65535v = F2V(65535.f); + for (int i = 0; i <= 0xffff; i+=4) { + vfloat valv = LVFU(dcurve[i]); + valv = igamma (valv, gamma_v, startv, slopev, mulv, addv); + STVFU(outCurve[i],c65535v * valv); } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - // create curve bw - // curve 2 - /* DiagonalCurve* tbwcurve = NULL; - customToneCurvebw2.Reset(); - - if (!curvePointsbw2.empty() && curvePointsbw2[0]>DCT_Linear && curvePointsbw2[0]isIdentity()) { - delete tbwcurve; - tbwcurve = NULL; - } - else - customToneCurvebw2.Set(tbwcurve); - delete tbwcurve; - tbwcurve = NULL; - } - - customToneCurvebw1.Reset(); - - if (!curvePointsbw.empty() && curvePointsbw[0]>DCT_Linear && curvePointsbw[0]isIdentity()) { - delete tbwcurve; - tbwcurve = NULL; - } - else if (curveModeb != procparams::BlackWhiteParams::TC_MODE_STD_BW) { - customToneCurvebw1.Set(tbwcurve); - delete tbwcurve; - tbwcurve = NULL; - } - } - */ - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - +#else for (int i = 0; i <= 0xffff; i++) { float val = dcurve[i]; - - if (histNeeded) { - float fi = i; - float hval = hlCurve[i] * fi; - hval = dcurve[shCurve[hval] * hval]; - //if (needigamma) - // hval = igamma2 (hval); - int hi = (int)(255.0 * (hval)); - outBeforeCCurveHistogram[hi] += histogram/*Cropped*/[i] ; - } - val = igamma (val, gamma_, start, slope, mul, add); outCurve[i] = (65535.f * val); } +#endif + + if (histNeeded) { + for (int i = 0; i <= 0xffff; i++) { + float fi = i; + float hval = hlCurve[i] * fi; + hval = dcurve[shCurve[hval] * hval]; + int hi = (int)(255.f * (hval)); + outBeforeCCurveHistogram[hi] += histogram[i] ; + } + } if (tcurve) { delete tcurve; } - /*if (outBeforeCCurveHistogram) { - for (int i=0; i<256; i++) printf("i= %d bchist= %d \n",i,outBeforeCCurveHistogram[i]); - }*/ } @@ -1130,12 +827,11 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, - LUTu & histogram, LUTu & histogramCropped, LUTf & outCurve, + const LUTu & histogram, LUTu & histogramCropped, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili) { - // curve without contrast - LUTf dcurve(65536, 0); + LUTf dcurve(32768, 0); // clear array that stores histogram valid before applying the custom curve if (outBeforeCCurveHistogram) { @@ -1174,7 +870,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (val); + val = brightcurve.getVal (val); // store result in a temporary array dcurve[i] = CLIPD(val); } - delete brightcurve; } else { - for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow - // set the identity curve in the temporary array - dcurve[i] = (float)i / 32767.0; - } + dcurve.makeIdentity(32767.f); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1206,27 +898,21 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector 0.00001 || contr < -0.00001) { utili = true; - DiagonalCurve* contrastcurve = NULL; - // compute mean luminance of the image with the curve applied int sum = 0; float avg = 0; - //float sqavg = 0; for (int i = 0; i < 32768; i++) { avg += dcurve[i] * histogram[i]; - //sqavg += dcurve[i]*dcurve[i] * histogram[i]; sum += histogram[i]; } + std::vector contrastcurvePoints; + if(sum) { avg /= sum; - //sqavg /= sum; - //float stddev = sqrt(sqavg-avg*avg); - // printf("avg=%f\n",avg); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - std::vector contrastcurvePoints; contrastcurvePoints.resize(9); contrastcurvePoints.at(0) = double(DCT_NURBS); @@ -1242,12 +928,10 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector contrastcurvePoints; contrastcurvePoints.resize(5); contrastcurvePoints.at(0) = double(DCT_NURBS); @@ -1257,22 +941,22 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (dcurve[i]); + dcurve[i] = contrastcurve.getVal (dcurve[i]); } - delete contrastcurve; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // create a curve if needed - DiagonalCurve* tcurve = NULL; + DiagonalCurve* tcurve = nullptr; bool histNeeded = false; if (!curvePoints.empty() && curvePoints[0] != 0) { @@ -1285,7 +969,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorisIdentity()) { delete tcurve; - tcurve = NULL; + tcurve = nullptr; } if (tcurve) { @@ -1297,14 +981,14 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (dcurve[i]); - outCurve[i] = (32767.0 * val); + outCurve[i] = (32767.f * val); } } else { // Skip the slow getval method if no curve is used (or an identity curve) @@ -1312,25 +996,21 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, LUTf & outCurve, int skip) { - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // create a curve if needed - DiagonalCurve* tcurve = NULL; + DiagonalCurve* tcurve = nullptr; if (!curvePoints.empty() && curvePoints[0] != 0) { tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); @@ -1352,7 +1029,7 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC if (tcurve && tcurve->isIdentity()) { delete tcurve; - tcurve = NULL; + tcurve = nullptr; } if (tcurve) { @@ -1362,23 +1039,16 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC for (int i = 0; i < 65536; i++) { // apply custom/parametric/NURBS curve, if any - // RGB curves are defined with sRGB gamma, but operate on linear data - float val = float(i) / 65535.f; - val = CurveFactory::gamma2 (val); + float val = Color::gamma2curve[i] / 65535.f; val = tcurve->getVal(val); - val = CurveFactory::igamma2 (val); - //float val = tcurve->getVal ((float)i/65536.0f); - outCurve[i] = (65536.0f * val); + outCurve[i] = Color::igammatab_srgb[val * 65535.f]; } delete tcurve; - } - // let the LUTf empty for identity curves - else { + } else { // let the LUTf empty for identity curves outCurve.reset(); } - } @@ -1388,12 +1058,12 @@ void ColorAppearance::Reset() } // Fill a LUT with X/Y, ranged 0xffff -void ColorAppearance::Set(Curve *pCurve) +void ColorAppearance::Set(const Curve &pCurve) { lutColCurve(65536); for (int i = 0; i < 65536; i++) { - lutColCurve[i] = pCurve->getVal(double(i) / 65535.) * 65535.; + lutColCurve[i] = pCurve.getVal(double(i) / 65535.) * 65535.; } } @@ -1436,20 +1106,20 @@ void ToneCurve::Reset() } // Fill a LUT with X/Y, ranged 0xffff -void ToneCurve::Set(Curve *pCurve, float gamma, float start, float slope, float mul, float add) +void ToneCurve::Set(const Curve &pCurve, float gamma, float start, float slope, float mul, float add) { lutToneCurve(65536); if (gamma <= 0.0 || gamma == 1.) { for (int i = 0; i < 65536; i++) { - lutToneCurve[i] = (float)pCurve->getVal(float(i) / 65535.f) * 65535.f; + lutToneCurve[i] = (float)pCurve.getVal(float(i) / 65535.f) * 65535.f; } } else { // apply gamma, that is 'pCurve' is defined with the given gamma and here we convert it to a curve in linear space for (int i = 0; i < 65536; i++) { float val = float(i) / 65535.f; val = CurveFactory::gamma (val, gamma, start, slope, mul, add); - val = pCurve->getVal(val); + val = pCurve.getVal(val); val = CurveFactory::igamma (val, gamma, start, slope, mul, add); lutToneCurve[i] = val * 65535.f; } @@ -1479,7 +1149,7 @@ void OpacityCurve::Set(const Curve *pCurve) void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) { - FlatCurve* tcurve = NULL; + FlatCurve* tcurve = nullptr; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); @@ -1490,7 +1160,7 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) Set(tcurve); opautili = true; delete tcurve; - tcurve = NULL; + tcurve = nullptr; } } @@ -1863,7 +1533,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin) { - FlatCurve* tcurve = NULL; + FlatCurve* tcurve = nullptr; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); @@ -1872,7 +1542,7 @@ void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const do if (tcurve) { SetXYZ(tcurve, xyz_rgb, rgb_xyz, satur, lumin); delete tcurve; - tcurve = NULL; + tcurve = nullptr; } } @@ -1964,7 +1634,7 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], void ColorGradientCurve::SetRGB(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3]) { - FlatCurve* tcurve = NULL; + FlatCurve* tcurve = nullptr; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); @@ -1973,7 +1643,7 @@ void ColorGradientCurve::SetRGB(const std::vector &curvePoints, const do if (tcurve) { SetRGB(tcurve, xyz_rgb, rgb_xyz); delete tcurve; - tcurve = NULL; + tcurve = nullptr; } } diff --git a/rtengine/curves.h b/rtengine/curves.h index b0e9d691f..cac839827 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -159,7 +159,9 @@ protected: static inline double simplebasecurve (double x, double b, double sr) { // a = 1, D = 1, hr = 0 (unused for a = D = 1) - if (b < 0) { + if (b == 0.0) { + return x; + } else if (b < 0) { double m = 0.5;//midpoint double slope = 1.0 + b; //slope of straight line between (0,-b) and (1,1) double y = -b + m * slope; //value at midpoint @@ -175,7 +177,7 @@ protected: double y = (m - b) * slope; if (x <= m) { - return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y; + return clower (x / m, slope * m / y, sr) * y; } else { return y + (x - m) * slope; } @@ -238,13 +240,18 @@ public: } static inline float gamma (float x, float gamma, float start, float slope, float mul, float add) { - return (x <= start ? x*slope : expf(logf(x) / gamma) * mul - add); + return (x <= start ? x*slope : xexpf(xlogf(x) / gamma) * mul - add); } static inline float igamma (float x, float gamma, float start, float slope, float mul, float add) { - return (x <= start * slope ? x / slope : expf(logf((x + add) / mul) * gamma) ); + return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) ); } - +#ifdef __SSE2__ + static inline vfloat igamma (vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add) + { + return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) ); + } +#endif static inline float hlcurve (const float exp_scale, const float comp, const float hlrange, float level) { if (comp > 0.0) { @@ -276,37 +283,30 @@ public: LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, int skip = 1); - static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, + static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip); - static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip); + static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, const LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip); static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip); - static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram); - static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram); + static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); + static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - static void curveToningCL ( bool & clctoningutili, const std::vector& clcurvePoints, LUTf & clToningCurve, int skip); - static void curveToningLL ( bool & llctoningutili, const std::vector& llcurvePoints, LUTf & llToningCurve, int skip); - static void denoiseCC ( bool & ccdenoiseutili, const std::vector& cccurvePoints, LUTf & NoiseCCcurve, int skip); + static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip); static void complexsgnCurve ( float adjustr, bool & autili, bool & butili, bool & ccutili, bool & clcutili, double saturation, double rstprotection, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, - LUTu & histogramC, LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, ///for chroma + const LUTu & histogramC, const LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, ///for chroma int skip = 1); - static void complexLCurve (double br, double contr, const std::vector& curvePoints, LUTu & histogram, LUTu & histogramCropped, + static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTu & histogramCropped, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); - static void updatechroma ( - const std::vector& cccurvePoints, - LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma - int skip = 1); - static void curveLightBrightColor ( - procparams::ColorAppearanceParams::eTCModeId curveMode, const std::vector& curvePoints, - procparams::ColorAppearanceParams::eTCModeId curveMode2, const std::vector& curvePoints2, - procparams::ColorAppearanceParams::eCTCModeId curveMode3, const std::vector& curvePoints3, - LUTu & histogram, LUTu & histogramCropped, LUTu & outBeforeCCurveHistogram, - LUTu & histogramC, LUTu & outBeforeCCurveHistogramC, + const std::vector& curvePoints, + const std::vector& curvePoints2, + const std::vector& curvePoints3, + const LUTu & histogram, LUTu & outBeforeCCurveHistogram, + const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC, ColorAppearance & outColCurve1, ColorAppearance & outColCurve2, ColorAppearance & outColCurve3, @@ -358,11 +358,11 @@ protected: } static inline double p01 (double x, double prot) { - return x <= 0.5 ? CurveFactory::clower (x * 2, 2.0, prot) / 2.0 : 0.5 + CurveFactory::cupper ((x - 0.5) * 2, 2.0, prot) / 2.0; + return x <= 0.5 ? CurveFactory::clower (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::cupper ((x - 0.5) * 2, 2.0, prot) * 0.5; } static inline double p10 (double x, double prot) { - return x <= 0.5 ? CurveFactory::cupper (x * 2, 2.0, prot) / 2.0 : 0.5 + CurveFactory::clower ((x - 0.5) * 2, 2.0, prot) / 2.0; + return x <= 0.5 ? CurveFactory::cupper (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::clower ((x - 0.5) * 2, 2.0, prot) * 0.5; } static inline double pfull (double x, double prot, double sh, double hl) { @@ -464,7 +464,7 @@ public: virtual ~ToneCurve() {}; void Reset(); - void Set(Curve *pCurve, float gamma = 0, float start = 0, float slope = 0, float mul = 0, float add = 0); + void Set(const Curve &pCurve, float gamma = 0, float start = 0, float slope = 0, float mul = 0, float add = 0); operator bool (void) const { return lutToneCurve; @@ -688,7 +688,7 @@ public: virtual ~ColorAppearance() {}; void Reset(); - void Set(Curve *pCurve); + void Set(const Curve &pCurve); operator bool (void) const { return lutColCurve; diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index c05230738..8e6ce6728 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1011,7 +1011,7 @@ DCPProfile::DCPProfile(Glib::ustring fname) // Create the curve DiagonalCurve rawCurve(cPoints, CURVES_MIN_POLY_POINTS); - toneCurve.Set((Curve*)&rawCurve); + toneCurve.Set(rawCurve); hasToneCurve = true; } } else if (tag == NULL) { @@ -1031,7 +1031,7 @@ DCPProfile::DCPProfile(Glib::ustring fname) } DiagonalCurve rawCurve(cPoints, CURVES_MIN_POLY_POINTS); - toneCurve.Set((Curve*)&rawCurve); + toneCurve.Set(rawCurve); hasToneCurve = true; } } diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index c6d66e4bf..72f801bab 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1414,10 +1414,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i gamtab = &(Color::gammatab_24_17a); } else { gamtab = new LUTf(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); - - for(int i = 0; i < 65536; i++) { - (*gamtab)[i] = (float)i / 65535.f; - } + gamtab->makeIdentity(65535.f); } diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index f09eb3459..4b41c2c29 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -301,10 +301,10 @@ double DiagonalCurve::getVal (double t) const } // do a binary search for the right interval: - int k_lo = 0, k_hi = N - 1; + unsigned int k_lo = 0, k_hi = N - 1; while (k_hi - k_lo > 1) { - int k = (k_hi + k_lo) / 2; + unsigned int k = (k_hi + k_lo) / 2; if (x[k] > t) { k_hi = k; @@ -323,7 +323,7 @@ double DiagonalCurve::getVal (double t) const else { // if (kind==Spline) { double a = (x[k_hi] - t) / h; double b = (t - x[k_lo]) / h; - double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) / 6.0; + double r = a * y[k_lo] + b * y[k_hi] + ((a * a * a - a) * ypp[k_lo] + (b * b * b - b) * ypp[k_hi]) * (h * h) * 0.1666666666666666666666666666666; return CLIPD(r); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 2f14c1ded..ccee4328b 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -40,7 +40,7 @@ ImProcCoordinator::ImProcCoordinator () tonecurve(65536, 0), //,1); chaut(0.f), redaut(0.f), blueaut(0.f), maxredaut(0.f), maxblueaut(0.f), minredaut(0.f), minblueaut(0.f), nresi(0.f), chromina(0.f), sigma(0.f), lumema(0.f), - lumacurve(65536, 0), + lumacurve(32770, 0), // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation chroma_acurve(65536, 0), chroma_bcurve(65536, 0), satcurve(65536, 0), @@ -53,7 +53,7 @@ ImProcCoordinator::ImProcCoordinator () NoiseCCcurve(65536, 0), vhist16(65536), vhist16bw(65536), lhist16(65536), lhist16Cropped(65536), - lhist16CAM(65536), lhist16CroppedCAM(65536), + lhist16CAM(65536), lhist16CCAM(65536), lhist16RETI(65536), histCropped(65536), @@ -465,12 +465,11 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) opautili = false; params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); - bool clctoningutili = false; - bool llctoningutili = false; - CurveFactory::curveToningCL(clctoningutili, params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); - // clToningcurve.dump("CLToning3"); - CurveFactory::curveToningLL(llctoningutili, params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); - + if(params.colorToning.enabled) { + CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + // clToningcurve.dump("CLToning3"); + CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + } CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1); @@ -698,39 +697,24 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if(params.colorappearance.enabled) { //L histo and Chroma histo for ciecam // histogram well be for Lab (Lch) values, because very difficult to do with J,Q, M, s, C - int x1, y1, x2, y2, pos, posc; + int x1, y1, x2, y2; params.crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); lhist16CAM.clear(); - lhist16CroppedCAM.clear(); lhist16CCAM.clear(); - for (int x = 0; x < pH; x++) - for (int y = 0; y < pW; y++) { - pos = CLIP((int)(nprevl->L[x][y])); - - if(!params.colorappearance.datacie) { - posc = CLIP((int)sqrt(nprevl->a[x][y] * nprevl->a[x][y] + nprevl->b[x][y] * nprevl->b[x][y])); + if(!params.colorappearance.datacie) { + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + int pos = CLIP((int)(nprevl->L[x][y])); + int posc = CLIP((int)sqrt(nprevl->a[x][y] * nprevl->a[x][y] + nprevl->b[x][y] * nprevl->b[x][y])); lhist16CAM[pos]++; lhist16CCAM[posc]++; - } - - if (y >= y1 && y < y2 && x >= x1 && x < x2) { - lhist16CroppedCAM[pos]++; - } } + } - LUTu dummy; - CurveFactory::curveLightBrightColor ( - params.colorappearance.curveMode, params.colorappearance.curve, - params.colorappearance.curveMode2, params.colorappearance.curve2, - params.colorappearance.curveMode3, params.colorappearance.curve3, - lhist16CAM, lhist16CroppedCAM, histLCAM, - lhist16CCAM, histCCAM, - customColCurve1, - customColCurve2, - customColCurve3, - scale == 1 ? 1 : 1 - ); + CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, + lhist16CAM, histLCAM, lhist16CCAM, histCCAM, + customColCurve1, customColCurve2, customColCurve3, 1); float fnum = imgsrc->getMetaData()->getFNumber (); // F number float fiso = imgsrc->getMetaData()->getISOSpeed () ; // ISO float fspeed = imgsrc->getMetaData()->getShutterSpeed () ; // Speed diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 4d442482e..e138de925 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -108,7 +108,7 @@ protected: LUTu vhist16, vhist16bw; LUTu lhist16, lhist16Cropped; - LUTu lhist16CAM, lhist16CroppedCAM; + LUTu lhist16CAM; LUTu lhist16CCAM; LUTu lhist16RETI; LUTu histCropped; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 989d9c6a7..74c750ccc 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -37,7 +37,8 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" - +#define BENCHMARK +#include "StopWatch.h" #ifdef _OPENMP #include #endif @@ -1722,27 +1723,28 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int LUTu hist16Q; if (needJ) { - hist16J (65536); + hist16J (32768); hist16J.clear(); } if (needQ) { - hist16Q (65536); + hist16Q (32768); hist16Q.clear(); } - #pragma omp parallel + const int numThreads = min(max(width*height / 65536,1),omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) { LUTu hist16Jthr; LUTu hist16Qthr; if (needJ) { - hist16Jthr (65536); + hist16Jthr (32768); hist16Jthr.clear(); } if (needQ) { - hist16Qthr(65536); + hist16Qthr(32768); hist16Qthr.clear(); } @@ -1751,37 +1753,48 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { //rough correspondence between L and J float currL = lab->L[i][j] / 327.68f; - float koef = 1.0f; //rough correspondence between L and J + float koef; //rough correspondence between L and J -// if (currL>95.f) koef=1.f; - if(currL > 85.f) { - koef = 0.97f; - } else if(currL > 80.f) { - koef = 0.93f; - } else if(currL > 70.f) { - koef = 0.87f; - } else if(currL > 60.f) { - koef = 0.85f; - } else if(currL > 50.f) { - koef = 0.8f; - } else if(currL > 40.f) { - koef = 0.75f; + if(currL > 50.f) { + if(currL > 70.f) { + if(currL > 80.f) { + if(currL > 85.f) { + koef = 0.97f; + } else { + koef = 0.93f; + } + } else { + koef = 0.87f; + } + } else { + if (currL > 60.f) { + koef = 0.85f; + } else { + koef = 0.8f; + } + } + } else { + if(currL > 10.f) { + if(currL > 20.f) { + if(currL > 40.f) { + koef = 0.75f; + } else { + koef = 0.7f; + } + } else { + koef = 0.9f; + } + } else { + koef = 1.0; + } } -// else if(currL>30.f) koef=0.7f; - else if(currL > 20.f) { - koef = 0.7f; - } else if(currL > 10.f) { - koef = 0.9f; - } - -// else if(currL>0.f) koef=1.0f; if (needJ) { - hist16Jthr[CLIP((int)((koef * lab->L[i][j])))]++; //evaluate histogram luminance L # J + hist16Jthr[(int)((koef * lab->L[i][j]))]++; //evaluate histogram luminance L # J } if (needQ) { - hist16Qthr[CLIP((int) (sqrtf((koef * (lab->L[i][j])) * 32768.f)))]++; //for brightness Q : approximation for Q=wh*sqrt(J/100) J not equal L + hist16Qthr[(int) (sqrtf((koef * (lab->L[i][j])) * 32768.f))]++; //for brightness Q : approximation for Q=wh*sqrt(J/100) J not equal L } sum += koef * lab->L[i][j]; //evaluate mean J to calculate Yb @@ -1790,14 +1803,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int #pragma omp critical { if(needJ) - for(int i = 0; i < 65536; i++) { - hist16J[i] += hist16Jthr[i]; - } + hist16J += hist16Jthr; if(needQ) - for(int i = 0; i < 65536; i++) { - hist16Q[i] += hist16Qthr[i]; - } + hist16Q += hist16Qthr; } } @@ -3077,7 +3086,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf) { - LUTf fGammaLUTf; Imagefloat *tmpImage = NULL; // NOTE: We're getting all 3 pointers here, but this function may not need them all, so one could optimize this @@ -3373,13 +3381,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } bool hasgammabw = gammabwr != 1.f || gammabwg != 1.f || gammabwb != 1.f; - fGammaLUTf(65535); - #pragma omp parallel for - - for (int i = 0; i < 65536; i++) { - fGammaLUTf[i] = CurveFactory::gamma2 (float(i) / 65535.f) * 65535.f; - } - if (hasColorToning || blackwhite || (params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled)) { tmpImage = new Imagefloat(working->width, working->height); } @@ -3387,15 +3388,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int W = working->width; int H = working->height; - - - - - - - - - #define TS 112 #ifdef _OPENMP @@ -3592,9 +3584,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editID == EUID_ToneCurve1) { // filling the pipette buffer for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = CLIP(fGammaLUTf[rtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpG[ti * TS + tj] = CLIP(fGammaLUTf[gtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpB[ti * TS + tj] = CLIP(fGammaLUTf[btemp[ti * TS + tj]] / 65535.f); + editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; } } } @@ -3663,9 +3655,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editID == EUID_ToneCurve2) { // filling the pipette buffer for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = CLIP(fGammaLUTf[rtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpG[ti * TS + tj] = CLIP(fGammaLUTf[gtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpB[ti * TS + tj] = CLIP(fGammaLUTf[btemp[ti * TS + tj]] / 65535.f); + editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; } } } @@ -3722,19 +3714,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editID == EUID_RGB_R) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editWhateverTmp[ti * TS + tj] = fGammaLUTf[rtemp[ti * TS + tj]] / 65536.f; + editWhateverTmp[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65536.f; } } } else if (editID == EUID_RGB_G) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editWhateverTmp[ti * TS + tj] = fGammaLUTf[gtemp[ti * TS + tj]] / 65536.f; + editWhateverTmp[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65536.f; } } } else if (editID == EUID_RGB_B) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editWhateverTmp[ti * TS + tj] = fGammaLUTf[btemp[ti * TS + tj]] / 65536.f; + editWhateverTmp[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65536.f; } } } @@ -4167,9 +4159,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editID == EUID_BlackWhiteBeforeCurve) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = CLIP(fGammaLUTf[rtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpG[ti * TS + tj] = CLIP(fGammaLUTf[gtemp[ti * TS + tj]] / 65535.f); - editIFloatTmpB[ti * TS + tj] = CLIP(fGammaLUTf[btemp[ti * TS + tj]] / 65535.f); + editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; + editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; } } } else if (editID == EUID_BlackWhiteLuminance) { @@ -4402,9 +4394,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float fx, fy, fz; - fx = (x < 65535.0f ? Color::cachef[std::max(x, 0.f)] : 327.68f * std::cbrt(x / MAXVALF)); - fy = (y < 65535.0f ? Color::cachef[std::max(y, 0.f)] : 327.68f * std::cbrt(y / MAXVALF)); - fz = (z < 65535.0f ? Color::cachef[std::max(z, 0.f)] : 327.68f * std::cbrt(z / MAXVALF)); + fx = (x < 65535.0f ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF)); + fy = (y < 65535.0f ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF)); + fz = (z < 65535.0f ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF)); lab->L[i][j] = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; lab->a[i][j] = (500.0f * (fx - fy) ); @@ -4560,7 +4552,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - editWhatever->v(i, j) = CLIP(fGammaLUTf[tmpImage->r(i, j)] / 65535.f); // assuming that r=g=b + editWhatever->v(i, j) = Color::gamma2curve[tmpImage->r(i, j)] / 65535.f; // assuming that r=g=b } } } @@ -5527,6 +5519,7 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histCLurve, LUTu &histLLCurve, LUTu &histLCurve) { + int W = lold->W; int H = lold->H; // lhskcurve.dump("lh_curve"); diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index f9f6c12a1..7103cadd4 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -120,15 +120,8 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext rtengine::Image8 *output = NULL; const unsigned char *data = NULL; int fw, fh; - LUTf cdcurve; - bool dehacontlutili = false; procparams::ProcParams params; - /*rtengine::RAWParams raw; - rtengine::LensProfParams lensProf; - rtengine::procparams::ToneCurveParams toneCurve; - rtengine::procparams::ColorManagementParams icm; - rtengine::CoarseTransformParams coarse;*/ ColorTemp wb = rawImage.getWB (); rawImage.getFullSize (fw, fh, TR_NONE); PreviewProps pp (0, 0, fw, fh, 1); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1a4e0dbb5..7d9dd0bf3 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4311,7 +4311,7 @@ BENCHFUN #pragma omp parallel #endif { - LUTu tmphistogram(65536 >> histcompr); + LUTu tmphistogram(histogram.getSize()); tmphistogram.clear(); #ifdef _OPENMP #pragma omp for nowait @@ -4366,17 +4366,18 @@ BENCHFUN const bool fourColours = ri->getSensorType() == ST_BAYER && ((mult[1] != mult[3] || cblacksom[1] != cblacksom[3]) || FC(0,0) == 3 || FC(0,1) == 3 || FC(1,0) == 3 || FC(1,1) == 3); + constexpr int histoSize = 65536; LUTu hist[4]; - hist[0](65536); + hist[0](histoSize); hist[0].clear(); if (ri->get_colors() > 1) { - hist[1](65536); + hist[1](histoSize); hist[1].clear(); - hist[2](65536); + hist[2](histoSize); hist[2].clear(); } if (fourColours) { - hist[3](65536); + hist[3](histoSize); hist[3].clear(); } @@ -4391,15 +4392,15 @@ BENCHFUN { // we need one LUT per color and thread, which corresponds to 1 MB per thread LUTu tmphist[4]; - tmphist[0](65536); + tmphist[0](histoSize); tmphist[0].clear(); if (ri->get_colors() > 1) { - tmphist[1](65536); + tmphist[1](histoSize); tmphist[1].clear(); - tmphist[2](65536); + tmphist[2](histoSize); tmphist[2].clear(); if (fourColours) { - tmphist[3](65536); + tmphist[3](histoSize); tmphist[3].clear(); } } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index e20efdbdd..5f09bb74a 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -38,6 +38,8 @@ #include "../rtgui/ppversion.h" #include "improccoordinator.h" #include +#define BENCHMARK +#include "StopWatch.h" extern Options options; @@ -798,6 +800,7 @@ IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, std::string camName, double focalLen, double focalLen35mm, float focusDist, float shutter, float fnumber, float iso, std::string expcomp_, double& myscale) { + BENCHFUN // check if the WB's equalizer value has changed if (wbEqual < (params.wb.equal - 5e-4) || wbEqual > (params.wb.equal + 5e-4)) { wbEqual = params.wb.equal; @@ -923,7 +926,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei } else { StdImageSource::colorSpaceConversion (baseImg, params.icm, embProfile, thumbImg->getSampleFormat()); } - int fw = baseImg->width; int fh = baseImg->height; //ColorTemp::CAT02 (baseImg, ¶ms) ;//perhaps not good! @@ -972,7 +974,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei int black = params.toneCurve.black; int hlcompr = params.toneCurve.hlcompr; int hlcomprthresh = params.toneCurve.hlcomprthresh; - if (params.toneCurve.autoexp && aeHistogram) { ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); //ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr); @@ -981,11 +982,13 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LUTf curve1 (65536); LUTf curve2 (65536); LUTf curve (65536); + LUTf satcurve (65536); LUTf lhskcurve (65536); + LUTf lumacurve(32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation LUTf clcurve (65536); - LUTf clToningcurve (65536); - LUTf cl2Toningcurve (65536); + LUTf clToningcurve; + LUTf cl2Toningcurve; LUTf rCurve (65536); LUTf gCurve (65536); @@ -1003,7 +1006,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei ColorAppearance customColCurve3; ToneCurve customToneCurvebw1; ToneCurve customToneCurvebw2; - CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, params.toneCurve.curveMode, params.toneCurve.curve, @@ -1013,7 +1015,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 16); CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 16); CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 16); - TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); double wp[3][3] = { {wprof[0][0], wprof[0][1], wprof[0][2]}, @@ -1030,13 +1031,14 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); //params.dirpyrDenoise.getCurves(dnNoisCurve, lldenoisutili); - bool clctoningutili = false; - bool llctoningutili = false; - CurveFactory::curveToningCL(clctoningutili, params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); - CurveFactory::curveToningLL(llctoningutili, params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + if(params.colorToning.enabled) { + clToningcurve (65536); + cl2Toningcurve (65536); + CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); + } CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 16); - double rrm, ggm, bbm; float autor, autog, autob; float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; @@ -1066,7 +1068,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LabImage* labView = new LabImage (fw, fh); DCPProfile *dcpProf = NULL; - if (isRaw) { cmsHPROFILE dummy; RawImageSource::findInputProfile(params.icm.input, NULL, camName, &dcpProf, dummy); @@ -1075,7 +1076,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei dcpProf->setStep2ApplyState(params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset); } } - ipf.rgbProc (baseImg, labView, NULL, curve1, curve2, curve, shmap, 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); // freeing up some memory @@ -1100,7 +1100,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei hist16[CLIP((int)((labView->L[i][j])))]++; hist16C[CLIP((int)sqrt(labView->a[i][j]*labView->a[i][j] + labView->b[i][j]*labView->b[i][j]))]++; } - // luminance processing // ipf.EPDToneMap(labView,0,6); @@ -1110,9 +1109,8 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei bool ccutili = false; bool cclutili = false; bool clcutili = false; - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, - hist16, hist16, curve, dummy, 16, utili); + hist16, hist16, lumacurve, dummy, 16, utili); CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, hist16C, dummy, 16); @@ -1123,7 +1121,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei //ipf.luminanceCurve (labView, labView, curve); - ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, curve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); + ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); ipf.vibrance(labView); @@ -1133,18 +1131,18 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei //if(!params.colorappearance.enabled){ipf.EPDToneMap(labView,5,6);} - CurveFactory::curveLightBrightColor ( - params.colorappearance.curveMode, params.colorappearance.curve, - params.colorappearance.curveMode2, params.colorappearance.curve2, - params.colorappearance.curveMode3, params.colorappearance.curve3, - hist16, hist16, dummy, - hist16C, dummy, - customColCurve1, - customColCurve2, - customColCurve3, - 16); if(params.colorappearance.enabled) { + CurveFactory::curveLightBrightColor ( + params.colorappearance.curve, + params.colorappearance.curve2, + params.colorappearance.curve3, + hist16, dummy, + hist16C, dummy, + customColCurve1, + customColCurve2, + customColCurve3, + 16); int begh = 0, endh = labView->H; bool execsharp = false; float d; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c03addb42..b7d1f3b61 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -771,10 +771,10 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p LUTf curve (65536, 0); LUTf satcurve (65536, 0); LUTf lhskcurve (65536, 0); - LUTf lumacurve(65536, 0); + LUTf lumacurve(32770, 0); // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation LUTf clcurve (65536, 0); - LUTf clToningcurve (65536, 0); - LUTf cl2Toningcurve (65536, 0); + LUTf clToningcurve; + LUTf cl2Toningcurve; LUTf wavclCurve (65536, 0); LUTf rCurve (65536, 0); @@ -814,11 +814,12 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p bool opautili = false; params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); - bool clctoningutili = false; - CurveFactory::curveToningCL(clctoningutili, params.colorToning.clcurve, clToningcurve, 1); - bool llctoningutili = false; - CurveFactory::curveToningLL(llctoningutili, params.colorToning.cl2curve, cl2Toningcurve, 1); - + if(params.colorToning.enabled) { + clToningcurve (65536, 0); + CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, 1); + cl2Toningcurve (65536, 0); + CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, 1); + } LabImage* labView = new LabImage (fw, fh); @@ -894,10 +895,10 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p if(params.labCurve.contrast != 0) { //only use hist16 for contrast #ifdef _OPENMP - #pragma omp parallel shared(hist16,labView, fh, fw) + #pragma omp parallel #endif { - LUTu hist16thr (65536); // 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 @@ -906,19 +907,14 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p for (int i = 0; i < fh; i++) for (int j = 0; j < fw; j++) { - hist16thr[CLIP((int)((labView->L[i][j])))]++; + hist16thr[(int)((labView->L[i][j]))]++; } #pragma omp critical { - for(int i = 0; i < 65536; i++) - { - hist16[i] += hist16thr[i]; - } + hist16 += hist16thr; } } - - } bool utili = false; @@ -935,7 +931,6 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, hist16C, hist16C, dummy, dummy, 1); -// ipf.MSR(labView, labView->W, labView->H, 1); ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); @@ -1025,10 +1020,10 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p begh = 0; endh = fh; CurveFactory::curveLightBrightColor ( - params.colorappearance.curveMode, params.colorappearance.curve, - params.colorappearance.curveMode2, params.colorappearance.curve2, - params.colorappearance.curveMode3, params.colorappearance.curve3, - hist16, hist16, dummy, + params.colorappearance.curve, + params.colorappearance.curve2, + params.colorappearance.curve3, + hist16, dummy, hist16C, dummy, customColCurve1, customColCurve2, diff --git a/rtengine/sleef.c b/rtengine/sleef.c index c7b3fb486..2377aea79 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -58,7 +58,9 @@ __inline double ldexpk(double x, int q) { m = (((m + q) >> 9) - m) << 7; q = q - (m << 2); u = longBitsToDouble(((int64_t)(m + 0x3ff)) << 52); - x = x * u * u * u * u; + double u2 = u*u; + u2 = u2 * u2; + x = x * u2; u = longBitsToDouble(((int64_t)(q + 0x3ff)) << 52); return x * u; } @@ -1197,7 +1199,7 @@ __inline float xexpf(float d) { int q = (int)xrintf(d * R_LN2f); float s, u; - + s = mlaf(q, -L2Uf, d); s = mlaf(q, -L2Lf, s); @@ -1246,7 +1248,7 @@ __inline float xdivf( float d, int n){ uflint.intval -= n << 23; // add n to the exponent } return uflint.floatval; -} +} From eceb024ba88fa5303071b799ff05ca2669b5d238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 1 May 2016 10:41:21 +0200 Subject: [PATCH 026/232] Add Ingo's `gamma_srgbclipped` patch --- rtengine/color.h | 4 ++++ rtengine/improcfun.cc | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 9ff00034c..be7740e2a 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1079,6 +1079,10 @@ public: { return gammatab_srgb[x]; } + static inline float gamma_srgbclipped (float x) + { + return gamma2curve[x]; + } static inline float gamma (float x) { return gammatab[x]; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index c1de37474..4660ed6cb 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -19,6 +19,9 @@ #include #include #include +#ifdef _OPENMP +#include +#endif #include "rtengine.h" #include "improcfun.h" @@ -38,9 +41,6 @@ #include "clutstore.h" #include "ciecam02.h" -#ifdef _OPENMP -#include -#endif #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -4396,10 +4396,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - //appply gamma sRGB (default RT) - sourceR = CLIP( Color::gamma_srgb( sourceR ) ); - sourceG = CLIP( Color::gamma_srgb( sourceG ) ); - sourceB = CLIP( Color::gamma_srgb( sourceB ) ); + //apply gamma sRGB (default RT) + sourceR = Color::gamma_srgbclipped( sourceR ); + sourceG = Color::gamma_srgbclipped( sourceG ); + sourceB = Color::gamma_srgbclipped( sourceB ); } const std::size_t line_offset = ti * TS; From 39f4db609a7c589043d84ef7e9a3ce13eb8aa972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 1 May 2016 11:10:11 +0200 Subject: [PATCH 027/232] Final code cleanup - Corrected whitespace and comments - Replaced `VECTLENSP` with `__SSE2__` and `4` - Removed redundant `inline` (see: http://programmers.stackexchange.com/a/35436 and http://stackoverflow.com/a/5971755) --- rtengine/clutstore.cc | 4 ++-- rtengine/improcfun.cc | 52 +++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index b5f07c121..5e96046ae 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -75,7 +75,7 @@ bool loadFile( } #ifdef __SSE2__ -inline vfloat getClutValue(const AlignedBuffer& clut_image, size_t index) +vfloat getClutValue(const AlignedBuffer& clut_image, size_t index) { #ifdef __SSE4_1__ return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(*reinterpret_cast(clut_image.data + index))); @@ -260,7 +260,7 @@ void rtengine::HaldCLUT::splitClutFilename( profile_name = "sRGB"; for (const auto& working_profile : rtengine::getWorkingProfiles()) { - if ( std::search( name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend() ) == name.rbegin() ) { + if (std::search(name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend()) == name.rbegin()) { profile_name = working_profile; name.erase(name.size() - working_profile.size()); break; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4660ed6cb..c1079c8b1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3208,7 +3208,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer std::shared_ptr hald_clut; bool clutAndWorkingProfilesAreSame = false; TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; -#ifdef VECTLENSP +#ifdef __SSE2__ vfloat v_work2xyz[3][3]; vfloat v_xyz2clut[3][3]; vfloat v_clut2xyz[3][3]; @@ -3226,7 +3226,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer xyz2clut = iccStore->workingSpaceInverseMatrix( hald_clut->getProfile() ); xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); -#ifdef VECTLENSP +#ifdef __SSE2__ for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { v_work2xyz[i][j] = F2V(work2xyz[i][j]); @@ -4350,25 +4350,25 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } - //Film Simulations + // Film Simulations if (hald_clut) { float out_rgbx[4 * TS] ALIGNED16; for (int i = istart, ti = 0; i < tH; i++, ti++) { if (!clutAndWorkingProfilesAreSame) { -#ifdef VECTLENSP - if (!(std::min(TS, tW - jstart) & ~(VECTLENSP - 1))) { - for (int j = jstart, tj = 0; j < tW; j += VECTLENSP, tj += VECTLENSP) { + // Convert from working to clut profile +#ifdef __SSE2__ + if (!(std::min(TS, tW - jstart) & ~3)) { + for (int j = jstart, tj = 0; j < tW; j += 4, tj += 4) { vfloat sourceR = LVF(rtemp[ti * TS + tj]); vfloat sourceG = LVF(gtemp[ti * TS + tj]); vfloat sourceB = LVF(btemp[ti * TS + tj]); - //convert from working to clut profile vfloat x; vfloat y; vfloat z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, v_work2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, v_xyz2clut ); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); STVF(rtemp[ti * TS + tj], sourceR); STVF(gtemp[ti * TS + tj], sourceG); @@ -4383,10 +4383,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - //convert from working to clut profile float x, y, z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, work2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2clut ); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, work2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2clut); } } } @@ -4396,10 +4395,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - //apply gamma sRGB (default RT) - sourceR = Color::gamma_srgbclipped( sourceR ); - sourceG = Color::gamma_srgbclipped( sourceG ); - sourceB = Color::gamma_srgbclipped( sourceB ); + // Apply gamma sRGB (default RT) + sourceR = Color::gamma_srgbclipped(sourceR); + sourceG = Color::gamma_srgbclipped(sourceG); + sourceB = Color::gamma_srgbclipped(sourceB); } const std::size_t line_offset = ti * TS; @@ -4417,26 +4416,26 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - // apply inverse gamma sRGB + // Apply inverse gamma sRGB sourceR = Color::igamma_srgb(out_rgbx[tj * 4 + 0]); sourceG = Color::igamma_srgb(out_rgbx[tj * 4 + 1]); sourceB = Color::igamma_srgb(out_rgbx[tj * 4 + 2]); } if (!clutAndWorkingProfilesAreSame) { -#ifdef VECTLENSP - if (!(std::min(TS, tW - jstart) & ~(VECTLENSP - 1))) { - for (int j = jstart, tj = 0; j < tW; j += VECTLENSP, tj += VECTLENSP) { + // Convert from clut to working profile +#ifdef __SSE2__ + if (!(std::min(TS, tW - jstart) & ~3)) { + for (int j = jstart, tj = 0; j < tW; j += 4, tj += 4) { vfloat sourceR = LVF(rtemp[ti * TS + tj]); vfloat sourceG = LVF(gtemp[ti * TS + tj]); vfloat sourceB = LVF(btemp[ti * TS + tj]); - //convert from clut to working profile vfloat x; vfloat y; vfloat z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, v_clut2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, v_xyz2work ); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); STVF(rtemp[ti * TS + tj], sourceR); STVF(gtemp[ti * TS + tj], sourceG); @@ -4451,10 +4450,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float &sourceG = gtemp[ti * TS + tj]; float &sourceB = btemp[ti * TS + tj]; - //convert from clut to working profile float x, y, z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, clut2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2work ); + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2work); } } } @@ -4462,7 +4460,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } - if(!blackwhite) { + if (!blackwhite) { // ready, fill lab for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { From 17635cf53565b4fed6fc4cced16cd5dd2ec5e901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 1 May 2016 11:17:40 +0200 Subject: [PATCH 028/232] Add myself to AUTHORS.txt With permission by [Ingo][1] I added myself to AUTHORS.txt. [1]: https://github.com/Beep6581/RawTherapee/pull/3260#issuecomment-212565582 --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 8c87a42c3..37ac98993 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -12,6 +12,7 @@ Developement contributors, in last name alphabetical order: Oliver Duis Maciek Dworak Michael Ezra + Flössie Jean-Christophe Frisch Ilias Giarimis Steve Herrell From d530617ae19b72de01b883ae6385c1fc3753ec68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 1 May 2016 20:49:17 +0200 Subject: [PATCH 029/232] Include last remarks from Ingo - Changed `_mm_store_ps` to `STVF` - Increased number of cached CLUTs by factor 1.5 --- rtengine/clutstore.cc | 2 +- rtgui/preferences.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 5e96046ae..e96614e4c 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -229,7 +229,7 @@ void rtengine::HaldCLUT::getRGB( v_out = vintpf(v_b, v_tmp1, v_out); - _mm_store_ps(out_rgbx, vintpf(_mm_load_ps1(&strength), v_out, v_in)); + STVF(*out_rgbx, vintpf(_mm_load_ps1(&strength), v_out, v_in)); #endif } } diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 10800d527..14c9cb0eb 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -572,9 +572,9 @@ Gtk::Widget* Preferences::getPerformancePanel () clutCacheSizeSB->set_increments (1, 5); clutCacheSizeSB->set_max_length(2); // Will this be sufficient? :) #ifdef _OPENMP - clutCacheSizeSB->set_range (1, 2 * omp_get_num_procs()); + clutCacheSizeSB->set_range (1, 3 * omp_get_num_procs()); #else - clutCacheSizeSB->set_range (1, 8); + clutCacheSizeSB->set_range (1, 12); #endif clutCacheSizeHB->pack_start (*CLUTLl, Gtk::PACK_SHRINK, 0); clutCacheSizeHB->pack_end (*clutCacheSizeSB, Gtk::PACK_SHRINK, 0); From 2b9f6e3355390ced1a81975f60713f5b0f6cd48c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 1 May 2016 21:36:13 +0200 Subject: [PATCH 030/232] Add Ingo's clutspeed.patch --- rtengine/clutstore.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index e96614e4c..a4c177b3d 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -143,6 +143,10 @@ void rtengine::HaldCLUT::getRGB( const unsigned int level_square = level * level; +#ifdef __SSE2__ + const vfloat v_strength = F2V(strength); +#endif + for (std::size_t column = 0; column < line_size; ++column, ++r, ++g, ++b, out_rgbx += 4) { const unsigned int red = std::min(flevel_minus_two, *r * flevel_minus_one); const unsigned int green = std::min(flevel_minus_two, *g * flevel_minus_one); @@ -229,7 +233,7 @@ void rtengine::HaldCLUT::getRGB( v_out = vintpf(v_b, v_tmp1, v_out); - STVF(*out_rgbx, vintpf(_mm_load_ps1(&strength), v_out, v_in)); + STVF(*out_rgbx, vintpf(v_strength, v_out, v_in)); #endif } } From add88cc62c8ba06d801e1488e1777398f952a54b Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Sun, 1 May 2016 22:49:10 +0200 Subject: [PATCH 031/232] astyle'd rtengine/clutstore.cc --- rtengine/clutstore.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index a4c177b3d..ea3a2a7fc 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -31,9 +31,11 @@ bool loadFile( if (fw == fh) { unsigned int level = 1; + while (level * level * level < fw) { ++level; } + if (level * level * level == fw && level > 1) { clut_level = level; res = true; @@ -57,6 +59,7 @@ bool loadFile( AlignedBuffer image(fw * fh * 4 + 1); std::size_t index = 0; + for (int y = 0; y < fh; ++y) { for (int x = 0; x < fw; ++x) { image.data[index] = img_float->r(y, x); @@ -248,6 +251,7 @@ void rtengine::HaldCLUT::splitClutFilename( Glib::ustring basename = Glib::path_get_basename(filename); Glib::ustring::size_type last_slash_pos = basename.rfind('/'); + if (last_slash_pos == Glib::ustring::npos) { last_slash_pos = basename.rfind('\\'); } @@ -284,6 +288,7 @@ std::shared_ptr rtengine::CLUTStore::getClut(const Glib::ust if (!cache.get(filename, result)) { std::unique_ptr clut(new rtengine::HaldCLUT); + if (clut->load(filename)) { result = std::move(clut); cache.insert(filename, result); From 5e0a859ceabb49e2f07f6bbebec05d0a47ace46b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 3 May 2016 20:01:59 +0200 Subject: [PATCH 032/232] Fix buffer overrun in rgbProc() --- rtengine/improcfun.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index c1079c8b1..cabfa38eb 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3388,7 +3388,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } bool hasgammabw = gammabwr != 1.f || gammabwg != 1.f || gammabwb != 1.f; - fGammaLUTf(65535); + fGammaLUTf(65536); #pragma omp parallel for for (int i = 0; i < 65536; i++) { From aa5072fa0aafea5471398da57797ff3eab8dec01 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 3 May 2016 20:12:04 +0200 Subject: [PATCH 033/232] Speedup for histogram panel --- rtengine/helpersse2.h | 3 ++ rtgui/histogrampanel.cc | 66 +++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h index da1691748..0f1fc5759 100644 --- a/rtengine/helpersse2.h +++ b/rtengine/helpersse2.h @@ -26,17 +26,20 @@ typedef __m128i vint2; #define LVFU(x) _mm_loadu_ps(&x) #define STVF(x,y) _mm_store_ps(&x,y) #define STVFU(x,y) _mm_storeu_ps(&x,y) +#define LVI(x) _mm_load_si128((__m128i*)&x) #else // there is a bug in gcc 4.7.x when using openmp and aligned memory and -O3, also need to map the aligned functions to unaligned functions for WIN32 builds #define LVF(x) _mm_loadu_ps((float*)&x) #define LVFU(x) _mm_loadu_ps(&x) #define STVF(x,y) _mm_storeu_ps(&x,y) #define STVFU(x,y) _mm_storeu_ps(&x,y) +#define LVI(x) _mm_loadu_si128((__m128i*)&x) #endif #else #define LVF(x) _mm_load_ps((float*)&x) #define LVFU(x) _mm_loadu_ps(&x) #define STVF(x,y) _mm_store_ps(&x,y) #define STVFU(x,y) _mm_storeu_ps(&x,y) +#define LVI(x) _mm_load_si128((__m128i*)&x) #endif #if defined(__x86_64__) && defined(__AVX__) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index e5d3d560e..9c8163c8e 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -25,8 +25,7 @@ #include "rtimage.h" #include "../rtengine/improccoordinator.h" #include "../rtengine/color.h" - - +#include "../rtengine/opthelper.h" using namespace rtengine; extern Glib::ustring argv0; @@ -852,7 +851,7 @@ void HistogramArea::update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu g_idle_add (histupdateUI, haih); } -void HistogramArea::renderHistogram () +SSEFUNCTION void HistogramArea::renderHistogram () { if (!is_realized ()) { @@ -878,7 +877,7 @@ void HistogramArea::renderHistogram () // make double copies of LUT, one for faster access, another one to scale down the raw histos LUTu rhchanged(256), ghchanged(256), bhchanged(256); - unsigned int lhisttemp[256], chisttemp[256], rhtemp[256], ghtemp[256], bhtemp[256]; + unsigned int lhisttemp[256] ALIGNED16 {0}, chisttemp[256] ALIGNED16 {0}, rhtemp[256] ALIGNED16 {0}, ghtemp[256] ALIGNED16 {0}, bhtemp[256] ALIGNED16 {0}; const int scale = (rawMode ? 8 : 1); for(int i = 0; i < 256; i++) { @@ -937,31 +936,48 @@ void HistogramArea::renderHistogram () if (!fullMode) { int area = 0; - if(!rawMode) - for (int i = 0; i < fullhistheight; i++) { - for (int j = 0; j < 256; j++) - if ((needLuma && lhisttemp[j] > i) || (needChroma && chisttemp[j] > i) || (needRed && rhtemp[j] > i) || (needGreen && ghtemp[j] > i) || (needBlue && bhtemp[j] > i)) { - area++; - } +#ifdef __SSE2__ + vint onev = _mm_set1_epi32(1); + vint iv = (vint)ZEROV; +#endif - if ((double)area / (256 * (i + 1)) < 0.3) { - realhistheight = i; - break; - } - } - else - for (int i = 0; i < fullhistheight; i++) { - for (int j = 0; j < 256; j++) - if ((needRed && rhtemp[j] > i) || (needGreen && ghtemp[j] > i) || (needBlue && bhtemp[j] > i)) { - area++; - } + for (int i = 0; i < fullhistheight; i++) { +#ifdef __SSE2__ + vint areatempv = (vint)ZEROV; + + for (int j = 0; j < 256; j += 4) { + vmask mask1v = _mm_cmpgt_epi32(LVI(lhisttemp[j]), iv); + vmask mask2v = _mm_cmpgt_epi32(LVI(rhtemp[j]), iv); + vmask mask3v = _mm_cmpgt_epi32(LVI(ghtemp[j]), iv); + vmask mask4v = _mm_cmpgt_epi32(LVI(bhtemp[j]), iv); + mask1v = _mm_or_si128(mask1v, mask2v); + mask3v = _mm_or_si128(mask3v, mask4v); + mask2v = _mm_cmpgt_epi32(LVI(chisttemp[j]), iv); + mask1v = _mm_or_si128(mask1v, mask3v); + mask1v = _mm_or_si128(mask1v, mask2v); + areatempv = _mm_add_epi32(areatempv, _mm_and_si128(mask1v, onev)); - if ((double)area / (256 * (i + 1)) < 0.3) { - realhistheight = i; - break; - } } + areatempv = _mm_add_epi32(areatempv, (vint)_mm_movehl_ps((vfloat)areatempv, (vfloat)areatempv)); + areatempv = _mm_add_epi32(areatempv, _mm_shuffle_epi32(areatempv, 1)); + area += _mm_cvtsi128_si32(areatempv); + iv = _mm_add_epi32(iv, onev); + +#else + + for (int j = 0; j < 256; j++) + if (lhisttemp[j] > i || rhtemp[j] > i || ghtemp[j] > i || bhtemp[j] > i || chisttemp[j] > i) { + area++; + } + +#endif + + if ((double)area / (256 * (i + 1)) < 0.3) { + realhistheight = i; + break; + } + } } if (realhistheight < winh - 2) { From 9622bbc2ba8a5c9f78cbe528f23575e0c60705f8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 3 May 2016 20:50:45 +0200 Subject: [PATCH 034/232] Fix buffer overrun in clutstore.cc --- rtengine/clutstore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index ea3a2a7fc..9d0cea35a 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -56,7 +56,7 @@ bool loadFile( img_src.convertColorSpace(img_float.get(), icm, curr_wb); } - AlignedBuffer image(fw * fh * 4 + 1); + AlignedBuffer image(fw * fh * 4 + 4); std::size_t index = 0; From 2ad89f9464ad1d8e61349bba620d2b03e5bf0530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 4 May 2016 20:15:15 +0200 Subject: [PATCH 035/232] Fix buffer overrun when applying HaldCLUT (#3154) Ingo found a buffer overrun due to an inverted mask when deciding whether to take the SSE path or not. This fix applies his suggested pattern for boder cases. Kudos to @heckflosse. --- rtengine/improcfun.cc | 91 ++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index cabfa38eb..4a0fe684e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4354,39 +4354,37 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hald_clut) { float out_rgbx[4 * TS] ALIGNED16; + for (int i = istart, ti = 0; i < tH; i++, ti++) { if (!clutAndWorkingProfilesAreSame) { // Convert from working to clut profile + int j = jstart; + int tj = 0; #ifdef __SSE2__ - if (!(std::min(TS, tW - jstart) & ~3)) { - for (int j = jstart, tj = 0; j < tW; j += 4, tj += 4) { - vfloat sourceR = LVF(rtemp[ti * TS + tj]); - vfloat sourceG = LVF(gtemp[ti * TS + tj]); - vfloat sourceB = LVF(btemp[ti * TS + tj]); + for (; j < tW - 3; j += 4, tj += 4) { + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); - vfloat x; - vfloat y; - vfloat z; - Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); - Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); + vfloat x; + vfloat y; + vfloat z; + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); - STVF(rtemp[ti * TS + tj], sourceR); - STVF(gtemp[ti * TS + tj], sourceG); - STVF(btemp[ti * TS + tj], sourceB); - } + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); } - else #endif - { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + for (; j < tW; j++, tj++) { + float &sourceR = rtemp[ti * TS + tj]; + float &sourceG = gtemp[ti * TS + tj]; + float &sourceB = btemp[ti * TS + tj]; - float x, y, z; - Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, work2xyz); - Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2clut); - } + float x, y, z; + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, work2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2clut); } } @@ -4424,36 +4422,33 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (!clutAndWorkingProfilesAreSame) { // Convert from clut to working profile + int j = jstart; + int tj = 0; #ifdef __SSE2__ - if (!(std::min(TS, tW - jstart) & ~3)) { - for (int j = jstart, tj = 0; j < tW; j += 4, tj += 4) { - vfloat sourceR = LVF(rtemp[ti * TS + tj]); - vfloat sourceG = LVF(gtemp[ti * TS + tj]); - vfloat sourceB = LVF(btemp[ti * TS + tj]); + for (; j < tW - 3; j += 4, tj += 4) { + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); - vfloat x; - vfloat y; - vfloat z; - Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); - Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); + vfloat x; + vfloat y; + vfloat z; + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); - STVF(rtemp[ti * TS + tj], sourceR); - STVF(gtemp[ti * TS + tj], sourceG); - STVF(btemp[ti * TS + tj], sourceB); - } + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); } - else #endif - { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + for (; j < tW; j++, tj++) { + float &sourceR = rtemp[ti * TS + tj]; + float &sourceG = gtemp[ti * TS + tj]; + float &sourceB = btemp[ti * TS + tj]; - float x, y, z; - Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, clut2xyz); - Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2work); - } + float x, y, z; + Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, clut2xyz); + Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, xyz2work); } } } From 31b2589b9b67450cfbfe5f014b37a89ef186f12f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 6 May 2016 17:16:45 +0200 Subject: [PATCH 036/232] Fix crashes caused by aligned access to unaligned memory in CLUT code, fixes #3154, fixes #3278, fixes #3277 --- rtengine/clutstore.cc | 10 ++++----- rtengine/improcfun.cc | 48 ++++++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 9d0cea35a..5d859f90c 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -56,7 +56,7 @@ bool loadFile( img_src.convertColorSpace(img_float.get(), icm, curr_wb); } - AlignedBuffer image(fw * fh * 4 + 4); + AlignedBuffer image(fw * fh * 4 + 8); // + 8 because of SSE4_1 version of getClutValue std::size_t index = 0; @@ -81,9 +81,9 @@ bool loadFile( vfloat getClutValue(const AlignedBuffer& clut_image, size_t index) { #ifdef __SSE4_1__ - return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(*reinterpret_cast(clut_image.data + index))); + return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_loadu_si128(reinterpret_cast(clut_image.data + index)))); #else - return _mm_cvtpu16_ps(*reinterpret_cast(clut_image.data + index)); + return _mm_set_ps(clut_image.data[index + 3], clut_image.data[index + 2], clut_image.data[index + 1], clut_image.data[index]); #endif } #endif @@ -205,8 +205,8 @@ void rtengine::HaldCLUT::getRGB( out_rgbx[2] = intp(strength, out_rgbx[2], *b); #else const vfloat v_in = _mm_set_ps(0.0f, *b, *g, *r); - const vfloat v_tmp = v_in * _mm_load_ps1(&flevel_minus_one); - const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(_mm_load_ps1(&flevel_minus_two), v_tmp))); + const vfloat v_tmp = v_in * F2V(flevel_minus_one); + const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(F2V(flevel_minus_two), v_tmp))); size_t index = color * 4; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4a0fe684e..e9ae98e2a 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3209,10 +3209,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bool clutAndWorkingProfilesAreSame = false; TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; #ifdef __SSE2__ - vfloat v_work2xyz[3][3]; - vfloat v_xyz2clut[3][3]; - vfloat v_clut2xyz[3][3]; - vfloat v_xyz2work[3][3]; + vfloat v_work2xyz[3][3] ALIGNED16; + vfloat v_xyz2clut[3][3] ALIGNED16; + vfloat v_clut2xyz[3][3] ALIGNED16; + vfloat v_xyz2work[3][3] ALIGNED16; #endif if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { @@ -3227,6 +3227,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); #ifdef __SSE2__ + for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { v_work2xyz[i][j] = F2V(work2xyz[i][j]); @@ -3235,6 +3236,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer v_clut2xyz[i][j] = F2V(clut2xyz[i][j]); } } + #endif } } @@ -3452,6 +3454,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer editWhateverTmp = (float(*))data; } + float out_rgbx[4 * TS] ALIGNED16; // Line buffer for CLUT #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) @@ -4352,8 +4355,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Film Simulations if (hald_clut) { - float out_rgbx[4 * TS] ALIGNED16; - for (int i = istart, ti = 0; i < tH; i++, ti++) { if (!clutAndWorkingProfilesAreSame) { @@ -4361,10 +4362,11 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int j = jstart; int tj = 0; #ifdef __SSE2__ + for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVF(rtemp[ti * TS + tj]); - vfloat sourceG = LVF(gtemp[ti * TS + tj]); - vfloat sourceB = LVF(btemp[ti * TS + tj]); + vfloat sourceR = LVFU(rtemp[ti * TS + tj]); + vfloat sourceG = LVFU(gtemp[ti * TS + tj]); + vfloat sourceB = LVFU(btemp[ti * TS + tj]); vfloat x; vfloat y; @@ -4372,11 +4374,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); - STVF(rtemp[ti * TS + tj], sourceR); - STVF(gtemp[ti * TS + tj], sourceG); - STVF(btemp[ti * TS + tj], sourceB); + STVFU(rtemp[ti * TS + tj], sourceR); + STVFU(gtemp[ti * TS + tj], sourceG); + STVFU(btemp[ti * TS + tj], sourceB); } + #endif + for (; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; float &sourceG = gtemp[ti * TS + tj]; @@ -4425,10 +4429,11 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int j = jstart; int tj = 0; #ifdef __SSE2__ + for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVF(rtemp[ti * TS + tj]); - vfloat sourceG = LVF(gtemp[ti * TS + tj]); - vfloat sourceB = LVF(btemp[ti * TS + tj]); + vfloat sourceR = LVFU(rtemp[ti * TS + tj]); + vfloat sourceG = LVFU(gtemp[ti * TS + tj]); + vfloat sourceB = LVFU(btemp[ti * TS + tj]); vfloat x; vfloat y; @@ -4436,11 +4441,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); - STVF(rtemp[ti * TS + tj], sourceR); - STVF(gtemp[ti * TS + tj], sourceG); - STVF(btemp[ti * TS + tj], sourceB); + STVFU(rtemp[ti * TS + tj], sourceR); + STVFU(gtemp[ti * TS + tj], sourceG); + STVFU(btemp[ti * TS + tj], sourceB); } + #endif + for (; j < tW; j++, tj++) { float &sourceR = rtemp[ti * TS + tj]; float &sourceG = gtemp[ti * TS + tj]; @@ -7185,6 +7192,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, wipv[i][j] = F2V(wiprof[i][j]); } } + #endif #ifdef _OPENMP @@ -7194,9 +7202,10 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, for(int i = 0; i < H; i++) { int j = 0; #ifdef __SSE2__ + for(; j < W - 3; j += 4) { vfloat X, Y, Z; - vfloat R,G,B; + vfloat R, G, B; Color::Lab2XYZ(LVFU(src.L[i][j]), LVFU(src.a[i][j]), LVFU(src.b[i][j]), X, Y, Z); Color::xyz2rgb(X, Y, Z, R, G, B, wipv); STVFU(dst.r(i, j), R); @@ -7205,6 +7214,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, } #endif + for(; j < W; j++) { float X, Y, Z; Color::Lab2XYZ(src.L[i][j], src.a[i][j], src.b[i][j], X, Y, Z); From 6646c2dc5cbc5300fd66c584d862aea1689f1174 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 6 May 2016 21:51:57 +0200 Subject: [PATCH 037/232] Speedup for thumbnail and editor processing, also reduced base memory usage a bit --- rtengine/LUT.h | 124 ++++++---- rtengine/color.cc | 10 +- rtengine/curves.cc | 67 +++--- rtengine/curves.h | 5 +- rtengine/dcrop.cc | 2 +- rtengine/improccoordinator.cc | 100 ++++---- rtengine/improccoordinator.h | 3 +- rtengine/improcfun.cc | 433 ++++++++++++---------------------- rtengine/improcfun.h | 7 +- rtengine/rtthumbnail.cc | 138 +++++------ rtengine/simpleprocess.cc | 60 +++-- 11 files changed, 430 insertions(+), 519 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 6203cfb92..00c7b1858 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -64,10 +64,10 @@ #define LUT_CLIP_ABOVE 2 #define LUTf LUT -#define LUTi LUT -#define LUTu LUT +#define LUTi LUT +#define LUTu LUT #define LUTd LUT -#define LUTuc LUT +#define LUTuc LUT #include #ifndef NDEBUG @@ -155,41 +155,6 @@ public: #endif } - LUT(int s, T * source, int flags = 0xfffffff) - { -#ifndef NDEBUG - - if (s <= 0) { - printf("s<=0!\n"); - } - - assert (s > 0); - - if (!source) { - printf("source is NULL!\n"); - } - - assert (source != nullptr); -#endif - dirty = false; // Assumption - clip = flags; - data = new T[s]; - owner = 1; - size = s; - upperBound = size - 1; - maxs = size - 2; - maxsf = (float)maxs; -#if defined( __SSE2__ ) && defined( __x86_64__ ) - maxsv = F2V( size - 2); - sizeiv = _mm_set1_epi32( (int)(size - 1) ); - sizev = F2V( size - 1 ); -#endif - - for (int i = 0; i < s; i++) { - data[i] = source[i]; - } - } - LUT() { data = nullptr; @@ -224,7 +189,7 @@ public: * For a LUT(500), it will return 499, because 500 elements, starting from 0, goes up to 499 * @return number of element in the array */ - int getUpperBound() + unsigned int getUpperBound() const { return size > 0 ? upperBound : 0; } @@ -258,7 +223,8 @@ public: return *this; } - // handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (unsigned int). + // 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+=(LUT &rhs) { if (rhs.size == this->size) { @@ -274,7 +240,8 @@ public: return *this; } - // mutliply all elements of LUT with a constant float value + // multiply all elements of LUT with a constant float value + template::value>::type> LUT & operator*=(float factor) { #ifdef _OPENMP @@ -362,6 +329,7 @@ public: } */ #ifdef __SSE4_1__ + template::value>::type> vfloat operator[](vint idxv ) const { vfloat tempv, p1v; @@ -401,6 +369,7 @@ public: return p1v; } #else + template::value>::type> vfloat operator[](vint idxv ) const { vfloat tempv, p1v; @@ -445,6 +414,7 @@ public: #endif // use with float indices + template::value>::type> T operator[](float index) const { int idx = (int)index; // don't use floor! The difference in negative space is no problems here @@ -470,9 +440,10 @@ public: } // Return the value for "index" that is in the [0-1] range. + template::value>::type> T getVal01 (float index) const { - index *= float(upperBound); + index *= (float)upperBound; int idx = (int)index; // don't use floor! The difference in negative space is no problems here if (index < 0.f) { @@ -542,6 +513,7 @@ public: } // create an identity LUT (LUT(x) = x) or a scaled identity LUT (LUT(x) = x / divisor) + template::value>::type> void makeIdentity(float divisor = 1.f) { if(divisor == 1.f) { @@ -555,9 +527,11 @@ public: } } - // compress a LUT with size y into a LUT with size y (y &dest, unsigned int numVals) const + // compress a LUT with size y into a LUT with size x (y>x) + template::value>::type> + void compressTo(LUT &dest, unsigned int numVals = 0) const { + numVals = numVals == 0 ? size : numVals; numVals = std::min(numVals, size); float divisor = numVals - 1; float mult = (dest.size - 1) / divisor; @@ -568,7 +542,8 @@ public: } } - // compress a LUT with size y into a LUT with size y (y with size y into a LUT with size x (y>x) by using the passTrough LUT to calculate indexes + template::value>::type> void compressTo(LUT &dest, unsigned int numVals, const LUT &passThrough) const { if(passThrough) { @@ -583,15 +558,74 @@ public: } } + // compute sum and average of a LUT + template::value>::type> + void getSumAndAverage(float &sum, float &avg) const + { + sum = 0.f; + avg = 0.f; + int i = 0; +#ifdef __SSE2__ + vfloat iv = _mm_set_ps(3.f, 2.f, 1.f, 0.f); + vfloat fourv = F2V(4.f); + vint sumv = (vint)ZEROV; + vfloat avgv = ZEROV; + + for(; i < size - 3; i += 4) { + vint datav = _mm_loadu_si128((__m128i*)&data[i]); + sumv += datav; + avgv += iv * _mm_cvtepi32_ps(datav); + iv += fourv; + + } + + sum = vhadd(_mm_cvtepi32_ps(sumv)); + avg = vhadd(avgv); +#endif + + for (; i < size; i++) { + T val = data[i]; + sum += val; + avg += i * val; + } + + avg /= sum; + } + + + template::value>::type> void makeConstant(float value, unsigned int numVals = 0) { numVals = numVals == 0 ? size : numVals; numVals = std::min(numVals, size); + for(unsigned int i = 0; i < numVals; i++) { data[i] = value; } } + // share the buffer with another LUT, handy for same data but different clip flags + void share(const LUT &source, int flags = 0xfffffff) + { + if (owner && data) { + delete[] data; + } + + dirty = false; // Assumption + clip = flags; + data = source.data; + owner = 0; + size = source.getSize(); + upperBound = size - 1; + maxs = size - 2; + maxsf = (float)maxs; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + maxsv = F2V( size - 2); + sizeiv = _mm_set1_epi32( (int)(size - 1) ); + sizev = F2V( size - 1 ); +#endif + } + }; diff --git a/rtengine/color.cc b/rtengine/color.cc index f5a8c86a3..db6824486 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -139,7 +139,6 @@ void Color::init () constexpr auto maxindex = 65536; cachef(maxindex, LUT_CLIP_BELOW); - gamma2curve(maxindex, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); gammatab(maxindex, 0); gammatabThumb(maxindex, 0); @@ -185,11 +184,14 @@ void Color::init () #ifdef _OPENMP #pragma omp section #endif + { + for (int i = 0; i < maxindex; i++) + { + gammatab_srgb[i] = 65535.0 * gamma2(i / 65535.0); + } - for (int i = 0; i < maxindex; i++) { - gammatab_srgb[i] = gamma2curve[i] = 65535.0 * gamma2(i / 65535.0); // two lookup tables with same content but one clips and one does not clip + gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags } - #ifdef _OPENMP #pragma omp section #endif diff --git a/rtengine/curves.cc b/rtengine/curves.cc index e8a1bc88e..724ec7280 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -294,34 +294,20 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std } // add curve Lab : C=f(L) -void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, const LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip) +void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip) { bool needed = false; DiagonalCurve* dCurve = nullptr; - if (outBeforeCLurveHistogram) { - outBeforeCLurveHistogram.clear(); - } - - bool histNeededCL = false; - if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { dCurve = new DiagonalCurve (clcurvePoints, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCLurveHistogram) { - histNeededCL = true; - } - if (dCurve && !dCurve->isIdentity()) { needed = true; clcutili = true; } } - if(histNeededCL) { - histogramcl.compressTo(outBeforeCLurveHistogram, 50000); - } - fillCurveArray(dCurve, clCurve, skip, needed); if (dCurve) { @@ -543,15 +529,15 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, - double shcompr, double br, double contr, - procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, - procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, - LUTu & histogram, LUTu & histogramCropped, - LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, - LUTu & outBeforeCCurveHistogram, - ToneCurve & customToneCurve1, - ToneCurve & customToneCurve2, - int skip) + double shcompr, double br, double contr, + procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, + procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, + LUTu & histogram, LUTu & histogramCropped, + LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, + LUTu & outBeforeCCurveHistogram, + ToneCurve & customToneCurve1, + ToneCurve & customToneCurve2, + int skip) { // the curve shapes are defined in sRGB gamma, but the output curves will operate on linear floating point data, @@ -621,34 +607,40 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double #ifdef __SSE2__ int i = shoulder + 1; - if(i&1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference + + if(i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference // change to [0,1] range float val = (float)i - shoulder; float R = val * comp / (scalemshoulder); hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision i++; } + vdouble onev = _mm_set1_pd(1.0); - vdouble Rv = _mm_set_pd((i+1-shoulder) * (double)comp/ scalemshoulder,(i-shoulder) * (double)comp/ scalemshoulder); + vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder); vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder); vdouble exp_scalev = _mm_set1_pd(exp_scale); - for (; i < 0x10000; i+=2) { + + for (; i < 0x10000; i += 2) { // change to [0,1] range vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv; vfloat resultfv = _mm_cvtpd_ps(resultv); _mm_store_ss(&hlCurve[i], resultfv); - resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1,1,1,1)); - _mm_store_ss(&hlCurve[i+1], resultfv); + resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1)); + _mm_store_ss(&hlCurve[i + 1], resultfv); Rv += incrementv; } + #else float R = comp / scalemshoulder; float increment = R; + for (int i = shoulder + 1; i < 0x10000; i++) { // change to [0,1] range hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision R += increment; } + #endif } @@ -674,8 +666,9 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // store result in a temporary array dcurve[0] = CLIPD(val); - - #pragma omp parallel for //schedule(dynamic,2048) +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 1; i < 0x10000; i++) { float val = i / 65535.f; @@ -792,17 +785,21 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double vfloat mulv = F2V(mul); vfloat addv = F2V(add); vfloat c65535v = F2V(65535.f); - for (int i = 0; i <= 0xffff; i+=4) { + + for (int i = 0; i <= 0xffff; i += 4) { vfloat valv = LVFU(dcurve[i]); valv = igamma (valv, gamma_v, startv, slopev, mulv, addv); - STVFU(outCurve[i],c65535v * valv); + STVFU(outCurve[i], c65535v * valv); } + #else + for (int i = 0; i <= 0xffff; i++) { float val = dcurve[i]; val = igamma (val, gamma_, start, slope, mul, add); outCurve[i] = (65535.f * val); } + #endif if (histNeeded) { @@ -827,7 +824,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, - const LUTu & histogram, LUTu & histogramCropped, LUTf & outCurve, + const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili) { // curve without contrast @@ -962,7 +959,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip); - static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, const LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip); + static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip); static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip); static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); @@ -298,8 +298,7 @@ public: const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, const LUTu & histogramC, const LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, ///for chroma int skip = 1); - static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTu & histogramCropped, - LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); + static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); static void curveLightBrightColor ( const std::vector& curvePoints, diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 77f0598b4..27104bde2 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -814,7 +814,7 @@ void Crop::update (int todo) LUTu dummy; int moderetinex; // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); - parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); + parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); parent->ipf.vibrance (labnCrop); if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ccee4328b..4e099dc5c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -23,7 +23,9 @@ #include "../rtgui/ppversion.h" #include "colortemp.h" #include "improcfun.h" - +#ifdef _OPENMP +#include +#endif namespace rtengine { @@ -52,12 +54,11 @@ ImProcCoordinator::ImProcCoordinator () Noisecurve(65536, 0), NoiseCCcurve(65536, 0), vhist16(65536), vhist16bw(65536), - lhist16(65536), lhist16Cropped(65536), lhist16CAM(65536), lhist16CCAM(65536), lhist16RETI(65536), histCropped(65536), - lhist16Clad(65536), lhist16CLlad(65536), + lhist16Clad(65536), lhist16LClad(65536), lhist16LLClad(65536), histRed(256), histRedRaw(256), histGreen(256), histGreenRaw(256), @@ -67,7 +68,6 @@ ImProcCoordinator::ImProcCoordinator () histToneCurveBW(256), histLCurve(256), histCCurve(256), - histCLurve(256), histLLCurve(256), histLCAM(256), @@ -366,7 +366,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) */ imgsrc->convertColorSpace(orig_prev, params.icm, currWB); - ipf.firstAnalysis (orig_prev, ¶ms, vhist16); + ipf.firstAnalysis (orig_prev, params, vhist16); } readyphase++; @@ -450,28 +450,29 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, scale == 1 ? 1 : 1); - TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); - 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->workingSpaceInverseMatrix (params.icm.working); - 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]} - }; opautili = false; - params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); if(params.colorToning.enabled) { + TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); + 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->workingSpaceInverseMatrix (params.icm.working); + 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]} + }; + params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); - // clToningcurve.dump("CLToning3"); CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1); + if(params.blackwhite.enabled) { + CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1); + } float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; float satLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f); @@ -559,31 +560,39 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } // compute L channel histogram - int x1, y1, x2, y2, pos; + int x1, y1, x2, y2; params.crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); - lhist16.clear(); - lhist16Cropped.clear(); - lhist16Clad.clear(); - lhist16CLlad.clear(); - lhist16LLClad.clear(); - - for (int x = 0; x < pH; x++) - for (int y = 0; y < pW; y++) { - pos = CLIP((int)(oprevl->L[x][y])); - lhist16[pos]++; - - if (y >= y1 && y < y2 && x >= x1 && x < x2) { - lhist16Cropped[pos]++; - } - } } readyphase++; - if ((todo & M_LUMACURVE) || (todo & M_CROP)) { + if (todo & (M_LUMACURVE | M_CROP)) { + LUTu lhist16(32768); + lhist16.clear(); +#ifdef _OPENMP + const int numThreads = min(max(pW * pH / (int)lhist16.getSize(), 1), omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif + { + LUTu lhist16thr(lhist16.getSize()); + lhist16thr.clear(); +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + int pos = (int)(oprevl->L[x][y]); + lhist16thr[pos]++; + } + +#ifdef _OPENMP + #pragma omp critical +#endif + lhist16 += lhist16thr; + } utili = false; - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, lhist16, lhist16Cropped, - lumacurve, histLCurve, scale == 1 ? 1 : 16, utili); + CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, lhist16, lumacurve, histLCurve, scale == 1 ? 1 : 16, utili); } if (todo & M_LUMACURVE) { @@ -593,7 +602,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) cclutili = false; clcutili = false; - CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, lhist16CLlad, histCLurve, scale == 1 ? 1 : 16); + CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); float adjustr = 1.0f; @@ -605,6 +614,9 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) else if (params.icm.working=="BestRGB") {adjustr = adjustbg = 1.4f;} else if (params.icm.working=="BruceRGB") {adjustr = 1.8f; adjustbg = 1.5f;} */ + + lhist16LLClad.clear(); + lhist16Clad.clear(); CurveFactory::complexsgnCurve (adjustr, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, lhist16Clad, lhist16LLClad, histCCurve, histLLCurve, scale == 1 ? 1 : 16); @@ -615,8 +627,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) progress ("Applying Color Boost...", 100 * readyphase / numofphases); // ipf.MSR(nprevl, nprevl->W, nprevl->H, 1); - - ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histCLurve, histLLCurve, histLCurve); + ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLLCurve, histLCurve); ipf.vibrance(nprevl); if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { @@ -678,7 +689,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) wavcontlutili = false; //CurveFactory::curveWavContL ( wavcontlutili,params.wavelet.lcurve, wavclCurve, LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,int skip); - CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve , /*lhist16CLlad, histCLurve,*/ scale == 1 ? 1 : 16); + CurveFactory::curveWavContL(wavcontlutili, params.wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); if((params.wavelet.enabled)) { @@ -709,7 +720,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) int posc = CLIP((int)sqrt(nprevl->a[x][y] * nprevl->a[x][y] + nprevl->b[x][y] * nprevl->b[x][y])); lhist16CAM[pos]++; lhist16CCAM[posc]++; - } + } } CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, @@ -1291,7 +1302,6 @@ void ImProcCoordinator::startProcessing(int changeCode) void ImProcCoordinator::process () { - if (plistener) { plistener->setProgressState (true); } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index e138de925..d394f942c 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -107,7 +107,6 @@ protected: LUTf NoiseCCcurve; LUTu vhist16, vhist16bw; - LUTu lhist16, lhist16Cropped; LUTu lhist16CAM; LUTu lhist16CCAM; LUTu lhist16RETI; @@ -116,7 +115,7 @@ protected: LUTu histRed, histRedRaw; LUTu histGreen, histGreenRaw; LUTu histBlue, histBlueRaw; - LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve, histCLurve; + LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve; LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI; LUTf CAMBrightCurveJ, CAMBrightCurveQ; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 74c750ccc..854b0b6b0 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -73,34 +73,6 @@ void ImProcFunctions::setScale (double iscale) scale = iscale; } -// Called from several threads -void ImProcFunctions::firstAnalysisThread (Imagefloat* original, Glib::ustring wprofile, unsigned int* histogram, int row_from, int row_to) -{ - - TMatrix wprof = iccStore->workingSpaceMatrix (wprofile); - - lumimul[0] = wprof[1][0]; - lumimul[1] = wprof[1][1]; - lumimul[2] = wprof[1][2]; - - int W = original->width; - - for (int i = row_from; i < row_to; i++) { - for (int j = 0; j < W; j++) { - - int r = original->r(i, j); - int g = original->g(i, j); - int b = original->b(i, j); - - int y = CLIP((int)(lumimul[0] * r + lumimul[1] * g + lumimul[2] * b)) ; - - if (histogram) { - histogram[y]++; - } - } - } -} - void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent) { // set up monitor transform @@ -148,59 +120,67 @@ void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, con #endif } -void ImProcFunctions::firstAnalysis (Imagefloat* original, const ProcParams* params, LUTu & histogram) +void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const ProcParams ¶ms, LUTu & histogram) { - Glib::ustring wprofile = params->icm.working; + TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); + + lumimul[0] = wprof[1][0]; + lumimul[1] = wprof[1][1]; + lumimul[2] = wprof[1][2]; + int W = original->width; + int H = original->height; + + float lumimulf[3] = {static_cast(lumimul[0]), static_cast(lumimul[1]), static_cast(lumimul[2])}; // calculate histogram of the y channel needed for contrast curve calculation in exposure adjustments - - int T = 1; -#ifdef _OPENMP - - if(multiThread) { - T = omp_get_max_threads(); - } - -#endif - - unsigned int** hist = new unsigned int* [T]; - - for (int i = 0; i < T; i++) { - hist[i] = new unsigned int[65536]; - memset (hist[i], 0, 65536 * sizeof(int)); - } - -#ifdef _OPENMP - #pragma omp parallel if (multiThread) - { - int H = original->height; - int tid = omp_get_thread_num(); - int nthreads = omp_get_num_threads(); - int blk = H / nthreads; - - if (tid < nthreads - 1) { - firstAnalysisThread (original, wprofile, hist[tid], tid * blk, (tid + 1)*blk); - } else { - firstAnalysisThread (original, wprofile, hist[tid], tid * blk, H); - } - } -#else - firstAnalysisThread (original, wprofile, hist[0], 0, original->height); -#endif - histogram.clear(); - for (int j = 0; j < T; j++) - for (int i = 0; i < 65536; i++) { - histogram[i] += hist[j][i]; + if(multiThread) { + +#ifdef _OPENMP + const int numThreads = min(max(W * H / (int)histogram.getSize(), 1), omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif + { + LUTu hist(histogram.getSize()); + hist.clear(); +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int i = 0; i < H; i++) + { + for (int j = 0; j < W; j++) { + + float r = original->r(i, j); + float g = original->g(i, j); + float b = original->b(i, j); + + int y = (lumimulf[0] * r + lumimulf[1] * g + lumimulf[2] * b); + hist[y]++; + } + } + +#ifdef _OPENMP + #pragma omp critical +#endif + histogram += hist; + } + } else { + for (int i = 0; i < H; i++) { + for (int j = 0; j < W; j++) { - for (int i = 0; i < T; i++) { - delete [] hist[i]; + float r = original->r(i, j); + float g = original->g(i, j); + float b = original->b(i, j); + + int y = (lumimulf[0] * r + lumimulf[1] * g + lumimulf[2] * b); + histogram[y]++; + } + } } - - delete [] hist; } // Copyright (c) 2012 Jacques Desmis @@ -1468,38 +1448,18 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int MyTime t1e, t2e; t1e.set(); #endif - LUTf dLcurve; - LUTu hist16JCAM; - float val; //preparate for histograms CIECAM - if(pW != 1) { //only with improccoordinator - dLcurve(65536, 0); - dLcurve.clear(); - hist16JCAM(65536); + LUTu hist16JCAM; + LUTu hist16_CCAM; + if(pW != 1 && params->colorappearance.datacie) { //only with improccoordinator + hist16JCAM(32768); hist16JCAM.clear(); - - for (int i = 0; i < 32768; i++) { //# 32768*1.414 approximation maxi for chroma - val = (double)i / 32767.0; - dLcurve[i] = CLIPD(val); - } - } - - LUTf dCcurve(65536, 0); - LUTu hist16_CCAM(65536); - bool chropC = false; - float valc; - - if(pW != 1) { //only with improccoordinator - for (int i = 0; i < 48000; i++) { //# 32768*1.414 approximation maxi for chroma - valc = (double)i / 47999.0; - dCcurve[i] = CLIPD(valc); - } - + hist16_CCAM(48000); hist16_CCAM.clear(); } - //end preparate histogram + //end preparate histogram int width = lab->W, height = lab->H; float minQ = 10000.f; float maxQ = -1000.f; @@ -1513,8 +1473,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int bool algepd = false; float sum = 0.f; - const bool ciedata = (params->colorappearance.datacie && pW != 1); - bool jp = ciedata; + const bool epdEnabled = params->epd.enabled; + bool ciedata = (params->colorappearance.datacie && pW != 1) && !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) + || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB @@ -1732,19 +1694,19 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int hist16Q.clear(); } - const int numThreads = min(max(width*height / 65536,1),omp_get_max_threads()); + const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) { LUTu hist16Jthr; LUTu hist16Qthr; if (needJ) { - hist16Jthr (32768); + hist16Jthr(hist16J.getSize()); hist16Jthr.clear(); } if (needQ) { - hist16Qthr(32768); + hist16Qthr(hist16Q.getSize()); hist16Qthr.clear(); } @@ -1802,11 +1764,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int #pragma omp critical { - if(needJ) + if(needJ) { hist16J += hist16Jthr; + } - if(needQ) + if(needQ) { hist16Q += hist16Qthr; + } } } @@ -1864,9 +1828,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else { yb = 90.0f; } - } - - if(settings->viewinggreySc == 1) { + } else if(settings->viewinggreySc == 1) { yb = 18.0f; //fixed } @@ -1911,7 +1873,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int const float f_l = fl; const float coe = pow_F(fl, 0.25f); const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; - const bool epdEnabled = params->epd.enabled; const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); @@ -2391,57 +2352,38 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int if(!params->colorappearance.tonecie || !settings->autocielab || !epdEnabled) { - if(ciedata) { + if(ciedata) { //only with improccoordinator // Data for J Q M s and C histograms int posl, posc; float brli = 327.f; float chsacol = 327.f; - int libr = 0; - int colch = 0; + float libr; + float colch; + //update histogram if(curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { brli = 70.0f; - libr = 1; - } else if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + libr = Q; //40.0 to 100.0 approximative factor for Q - 327 for J + } else /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ { brli = 327.f; - libr = 0; + libr = J; //327 for J } + posl = (int)(libr * brli); + hist16JCAM[posl]++; if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { chsacol = 327.f; - colch = 0; + colch = C; //450.0 approximative factor for s 320 for M } else if(curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { chsacol = 450.0f; - colch = 1; - } else if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { + colch = s; + } else /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ { chsacol = 327.0f; - colch = 2; + colch = M; } + posc = (int)(colch * chsacol); + hist16_CCAM[posc]++; - //update histogram - if(pW != 1) { //only with improccoordinator - if(libr == 1) { - posl = CLIP((int)(Q * brli)); //40.0 to 100.0 approximative factor for Q - 327 for J - } else if(libr == 0) { - posl = CLIP((int)(J * brli)); //327 for J - } - - hist16JCAM[posl]++; - } - - chropC = true; - - if(pW != 1) { //only with improccoordinator - if(colch == 0) { - posc = CLIP((int)(C * chsacol)); //450.0 approximative factor for s 320 for M - } else if(colch == 1) { - posc = CLIP((int)(s * chsacol)); - } else if(colch == 2) { - posc = CLIP((int)(M * chsacol)); - } - - hist16_CCAM[posc]++; - } } if(LabPassOne) { @@ -2582,25 +2524,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } // End of parallelization - if(!params->colorappearance.tonecie || !settings->autocielab) { //normal + if(!params->colorappearance.tonecie || !settings->autocielab) { //normal if(ciedata) { //update histogram J - for (int i = 0; i < 32768; i++) { // - if (jp) { - float hval = dLcurve[i]; - int hi = (int)(255.0f * CLIPD(hval)); // - histLCAM[hi] += hist16JCAM[i] ; - } - } - - for (int i = 0; i < 48000; i++) { // - if (chropC) { - float hvalc = dCcurve[i]; - int hic = (int)(255.0f * CLIPD(hvalc)); // - histCCAM[hic] += hist16_CCAM[i] ; - } - } + hist16JCAM.compressTo(histLCAM); + //update histogram C + hist16_CCAM.compressTo(histCCAM); } } @@ -2732,6 +2662,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { + ciedata = (params->colorappearance.datacie && pW != 1); if(epdEnabled && params->colorappearance.tonecie && algepd) { lab->deleteLab(); ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); @@ -2786,54 +2717,31 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int posl, posc; float brli = 327.f; float chsacol = 327.f; - int libr = 0; - int colch = 0; - float sa_t; + float libr; + float colch; if(curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { brli = 70.0f; - libr = 1; - } else if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + libr = ncie->Q_p[i][j]; //40.0 to 100.0 approximative factor for Q - 327 for J + } else /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ { brli = 327.f; - libr = 0; + libr = ncie->J_p[i][j]; //327 for J } + posl = (int)(libr * brli); + hist16JCAM[posl]++; if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { chsacol = 327.f; - colch = 0; + colch = ncie_C_p; } else if(curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { chsacol = 450.0f; - colch = 1; - } else if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { + colch = 100.f * sqrtf(ncie_C_p / ncie->Q_p[i][j]); + } else /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ { chsacol = 327.0f; - colch = 2; - } - - //update histogram - if(pW != 1) { //only with improccoordinator - if(libr == 1) { - posl = CLIP((int)(ncie->Q_p[i][j] * brli)); //40.0 to 100.0 approximative factor for Q - 327 for J - } else if(libr == 0) { - posl = CLIP((int)(ncie->J_p[i][j] * brli)); //327 for J - } - - hist16JCAM[posl]++; - } - - chropC = true; - - if(pW != 1) { //only with improccoordinator - if(colch == 0) { - posc = CLIP((int)(ncie_C_p * chsacol)); //450.0 approximative factor for s 320 for M - } else if(colch == 1) { - sa_t = 100.f * sqrtf(ncie_C_p / ncie->Q_p[i][j]); //Q_p always > 0 - posc = CLIP((int)(sa_t * chsacol)); - } else if(colch == 2) { - posc = CLIP((int)(ncie->M_p[i][j] * chsacol)); - } - - hist16_CCAM[posc]++; + colch = ncie->M_p[i][j]; } + posc = (int)(colch * chsacol); + hist16_CCAM[posc]++; } //end histograms @@ -2959,24 +2867,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int //show CIECAM histograms if(ciedata) { //update histogram J and Q - for (int i = 0; i < 32768; i++) { // - if (jp) { - float hval = dLcurve[i]; - int hi = (int)(255.0f * CLIPD(hval)); // - histLCAM[hi] += hist16JCAM[i] ; - } - } + //update histogram J + hist16JCAM.compressTo(histLCAM); //update color histogram M,s,C - for (int i = 0; i < 48000; i++) { // - if (chropC) { - float hvalc = dCcurve[i]; - int hic = (int)(255.0f * CLIPD(hvalc)); // - histCCAM[hic] += hist16_CCAM[i] ; - } - } + hist16_CCAM.compressTo(histCCAM); } - } } } @@ -3215,7 +3111,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer ClutPtr colorLUT; bool clutAndWorkingProfilesAreSame = false; - TMatrix work2xyz, xyz2clut, clut2xyz, xyz2work; + TMatrix xyz2clut, clut2xyz; if ( params->filmSimulation.enabled && !params->filmSimulation.clutFilename.empty() ) { colorLUT.set( clutStore.getClut( params->filmSimulation.clutFilename ) ); @@ -3224,9 +3120,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer clutAndWorkingProfilesAreSame = colorLUT->profile() == params->icm.working; if ( !clutAndWorkingProfilesAreSame ) { - work2xyz = iccStore->workingSpaceMatrix( params->icm.working ); xyz2clut = iccStore->workingSpaceInverseMatrix( colorLUT->profile() ); - xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); clut2xyz = iccStore->workingSpaceMatrix( colorLUT->profile() ); } } @@ -4338,7 +4232,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (!clutAndWorkingProfilesAreSame) { //convert from working to clut profile float x, y, z; - Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, work2xyz ); + Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, wprof ); Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2clut ); } @@ -4362,7 +4256,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //convert from clut to working profile float x, y, z; Color::rgbxyz( sourceR, sourceG, sourceB, x, y, z, clut2xyz ); - Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, xyz2work ); + Color::xyz2rgb( x, y, z, sourceR, sourceG, sourceB, wiprof ); } } @@ -5517,9 +5411,8 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur -SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histCLurve, LUTu &histLLCurve, LUTu &histLCurve) +SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLLCurve, LUTu &histLCurve) { - int W = lold->W; int H = lold->H; // lhskcurve.dump("lh_curve"); @@ -5605,31 +5498,15 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } - LUTf dCcurve; - LUTf dLcurve; LUTu hist16Clad; LUTu hist16Llad; //preparate for histograms CIECAM if(pW != 1) { //only with improccoordinator - dCcurve(48000, 0); - dLcurve(65536, 0); hist16Clad(65536); - hist16Llad(65536); - float val; - - for (int i = 0; i < 48000; i++) { //# 32768*1.414 approximation maxi for chroma - val = (double)i / 47999.0; - dCcurve[i] = CLIPD(val); - } - - for (int i = 0; i < 65535; i++) { // a - val = (double)i / 65534.0; - dLcurve[i] = CLIPD(val); - } - hist16Clad.clear(); + hist16Llad(65536); hist16Llad.clear(); } @@ -6125,7 +6002,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu //update histogram C if(pW != 1) { //only with improccoordinator - int posp = CLIP((int)sqrt((atmp * atmp + btmp * btmp))); + int posp = (int)sqrt(atmp * atmp + btmp * btmp); hist16Clad[posp]++; } @@ -6181,7 +6058,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu //update histo LC if(pW != 1) { //only with improccoordinator - int posl = CLIP((int(Lprov1 * 327.68f))); + int posl = Lprov1 * 327.68f; hist16Llad[posl]++; } @@ -6269,20 +6146,11 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } // end of parallelization - //update histogram C with data chromaticity and not with CC curve if(pW != 1) { //only with improccoordinator - for (int i = 0; i < 48000; i++) { //32768*1.414 + ... - float hval = dCcurve[i]; - int hi = (int)(255.0 * CLIPD(hval)); // - histCCurve[hi] += hist16Clad[i] ; - } - - //update histogram L with data luminance - for (int i = 0; i < 65535; i++) { - float hlval = dLcurve[i]; - int hli = (int)(255.0 * CLIPD(hlval)); - histLCurve[hli] += hist16Llad[i] ; - } + //update histogram C with data chromaticity and not with CC curve + hist16Clad.compressTo(histCCurve); + //update histogram L with data luminance + hist16Llad.compressTo(histLCurve); } #ifdef _DEBUG @@ -6683,15 +6551,15 @@ void ImProcFunctions::EPDToneMap(LabImage *lab, unsigned int Iterates, int skip) #pragma omp parallel for // removed schedule(dynamic,10) #endif - for(int ii = 0; ii < N; ii++) - a[ii] *= s, - b[ii] *= s, - //L[ii] = L[ii]*32767.0f*(1.f/gamm) + minL; - L[ii] = L[ii] * maxL * (1.f / gamm) + minL; + for(int ii = 0; ii < N; ii++) { + a[ii] *= s; + b[ii] *= s; + L[ii] = L[ii] * maxL * (1.f / gamm) + minL; + } } -void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defgain, double clip, +void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double defgain, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh) { @@ -6704,12 +6572,7 @@ void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defga float ave = 0.f, hidev = 0.f, lodev = 0.f; //find average luminance - for (int i = 0; i < imax; i++) { - sum += histogram[i]; - ave += histogram[i] * (float)i; - } - - ave /= (sum); + histogram.getSumAndAverage(sum, ave); //find median of luminance int median = 0, count = histogram[0]; @@ -6734,25 +6597,35 @@ void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defga float octile[8] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, ospread = 0.f; count = 0; - for (int i = 0; i < imax; i++) { + int i = 0; + for (; i < min((int)ave,imax); i++) { if (count < 8) { octile[count] += histogram[i]; if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { - octile[count] = log(1. + (float)i) / log(2.f); + octile[count] = xlog(1. + (float)i) / log(2.f); count++;// = min(count+1,7); } } - if (i < ave) { - //lodev += SQR(ave-i)*histogram[i]; - lodev += (log(ave + 1.f) - log((float)i + 1.)) * histogram[i]; - losum += histogram[i]; - } else { - //hidev += SQR(i-ave)*histogram[i]; - hidev += (log((float)i + 1.) - log(ave + 1.f)) * histogram[i]; - hisum += histogram[i]; + //lodev += SQR(ave-i)*histogram[i]; + lodev += (xlog(ave + 1.f) - xlog((float)i + 1.)) * histogram[i]; + losum += histogram[i]; + } + for (; i < imax; i++) { + if (count < 8) { + octile[count] += histogram[i]; + + if (octile[count] > sum / 8.f || (count == 7 && octile[count] > sum / 16.f)) { + octile[count] = xlog(1. + (float)i) / log(2.f); + count++;// = min(count+1,7); + } } + + //hidev += SQR(i-ave)*histogram[i]; + hidev += (xlog((float)i + 1.) - xlog(ave + 1.f)) * histogram[i]; + hisum += histogram[i]; + } if (losum == 0 || hisum == 0) { //probably the image is a blackframe @@ -6815,7 +6688,7 @@ void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defga int clipped = 0; int rawmax = (imax) - 1; - while (rawmax > 1 && histogram[rawmax] + clipped <= 0) { + while (histogram[rawmax] + clipped <= 0 && rawmax > 1) { clipped += histogram[rawmax]; rawmax--; } @@ -6907,11 +6780,15 @@ void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defga //take gamma into account double whiteclipg = (int)(CurveFactory::gamma2 (whiteclip * corr / 65536.0) * 65536.0); - double gavg = 0.; + float gavg = 0.; - for (int i = 0; i<65536 >> histcompr; i++) { - gavg += histogram[i] * CurveFactory::gamma2((float)(corr * (i << histcompr) < 65535 ? corr * (i << histcompr) : 65535)) / sum; + float val = 0.f; + float increment = corr * (1 << histcompr); + for (int i = 0; i < 65536 >> histcompr; i++) { + gavg += histogram[i] * Color::gamma2curve[val]; + val += increment; } + gavg /= sum; if (black < gavg) { int maxwhiteclip = (gavg - black) * 4 / 3 + black; // dont let whiteclip be such large that the histogram average goes above 3/4 @@ -6981,6 +6858,7 @@ void ImProcFunctions::getAutoExp (LUTu & histogram, int histcompr, double defga } bright = max(-100, min(bright, 100)); + } @@ -7101,6 +6979,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, wipv[i][j] = F2V(wiprof[i][j]); } } + #endif #ifdef _OPENMP @@ -7110,9 +6989,10 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, for(int i = 0; i < H; i++) { int j = 0; #ifdef __SSE2__ + for(; j < W - 3; j += 4) { vfloat X, Y, Z; - vfloat R,G,B; + vfloat R, G, B; Color::Lab2XYZ(LVFU(src.L[i][j]), LVFU(src.a[i][j]), LVFU(src.b[i][j]), X, Y, Z); Color::xyz2rgb(X, Y, Z, R, G, B, wipv); STVFU(dst.r(i, j), R); @@ -7121,6 +7001,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb(const LabImage &src, Imagefloat &dst, } #endif + for(; j < W; j++) { float X, Y, Z; Color::Lab2XYZ(src.L[i][j], src.a[i][j], src.b[i][j], X, Y, Z); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 90a046149..ea64ce4ab 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -75,7 +75,6 @@ class ImProcFunctions void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, int W, int H, const SharpeningParams &sharpenParam); void sharpenHaloCtrl (LabImage* lab, float** blurmap, float** base, int W, int H, SharpeningParams &sharpenParam); void sharpenHaloCtrlcam (CieImage* ncie, float** blurmap, float** base, int W, int H); - void firstAnalysisThread(Imagefloat* original, Glib::ustring wprofile, unsigned int* histogram, int row_from, int row_to); void dcdamping (float** aI, float** aO, float damping, int W, int H); bool needsCA (); @@ -229,7 +228,7 @@ public: bool needsTransform (); bool needsPCVignetting (); - void firstAnalysis (Imagefloat* working, const ProcParams* params, LUTu & vhist16); + void firstAnalysis (const Imagefloat* const working, const ProcParams ¶ms, LUTu & vhist16); void updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent); void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, @@ -255,7 +254,7 @@ public: void ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, int scalecd, int rtt); - void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histCLurve, LUTu &histLCurve, LUTu &histLurve); + void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve, LUTu &histLurve); void vibrance (LabImage* lab);//Jacques' vibrance void colorCurve (LabImage* lold, LabImage* lnew); void sharpening (LabImage* lab, float** buffer, SharpeningParams &sharpenParam); @@ -377,7 +376,7 @@ public: bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LCPMapper *pLCPMap = NULL); bool transCoord (int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef = -1, const LCPMapper *pLCPMap = NULL); - static void getAutoExp (LUTu & histogram, int histcompr, double defgain, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh); + static void getAutoExp (const LUTu & histogram, int histcompr, double defgain, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh); static double getAutoDistor (const Glib::ustring& fname, int thumb_size); double getTransformAutoFill (int oW, int oH, const LCPMapper *pLCPMap = NULL); void rgb2lab(const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 5f09bb74a..15ceee77d 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -32,7 +32,6 @@ #include "rawimagesource.h" #include "stdimagesource.h" #include -#include #include "rawimage.h" #include "jpeg.h" #include "../rtgui/ppversion.h" @@ -54,7 +53,7 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, StdImageSource imgSrc; if (imgSrc.load(fname)) { - return NULL; + return nullptr; } ImageIO* img = imgSrc.getImageIO(); @@ -96,7 +95,7 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, // bilinear interpolation if (tpp->thumbImg) { delete tpp->thumbImg; - tpp->thumbImg = NULL; + tpp->thumbImg = nullptr; } if (inspectorMode) { @@ -161,7 +160,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL if( r ) { delete ri; - return NULL; + return nullptr; } rml.exifBase = ri->get_exifBase(); @@ -192,7 +191,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL printf("Could not extract thumb from %s\n", fname.data()); delete img; delete ri; - return NULL; + return nullptr; } Thumbnail* tpp = new Thumbnail (); @@ -220,7 +219,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL if (tpp->thumbImg) { delete tpp->thumbImg; - tpp->thumbImg = NULL; + tpp->thumbImg = nullptr; } if (inspectorMode) { @@ -289,7 +288,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati if( r ) { delete ri; - return NULL; + return nullptr; } int width = ri->get_width(); @@ -297,8 +296,8 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati rtengine::Thumbnail* tpp = new rtengine::Thumbnail; tpp->isRaw = true; - tpp->embProfile = NULL; - tpp->embProfileData = NULL; + tpp->embProfile = nullptr; + tpp->embProfileData = nullptr; tpp->embProfileLength = ri->get_profileLen(); if (ri->get_profileLen()) @@ -502,7 +501,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati delete tpp->thumbImg; } - tpp->thumbImg = NULL; + tpp->thumbImg = nullptr; tpp->thumbImg = resizeTo(w, h, TI_Bilinear, tmpImg); delete tmpImg; @@ -737,11 +736,11 @@ void Thumbnail::init () } Thumbnail::Thumbnail () : - camProfile(NULL), thumbImg(NULL), + camProfile(nullptr), thumbImg(nullptr), camwbRed(1.0), camwbGreen(1.0), camwbBlue(1.0), redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), autoWBTemp(2700), autoWBGreen(1.0), wbEqual(-1.0), - embProfileLength(0), embProfileData(NULL), embProfile(NULL), + embProfileLength(0), embProfileData(nullptr), embProfile(nullptr), redMultiplier(1.0), greenMultiplier(1.0), blueMultiplier(1.0), defGain(1.0), scaleForSave(8192), @@ -935,10 +934,9 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei ipf.updateColorProfiles (params.icm, options.rtSettings.monitorProfile, options.rtSettings.monitorIntent); LUTu hist16 (65536); - LUTu hist16C (65536); double gamma = isRaw ? Color::sRGBGamma : 0; // usually in ImageSource, but we don't have that here - ipf.firstAnalysis (baseImg, ¶ms, hist16); + ipf.firstAnalysis (baseImg, params, hist16); // perform transform if (ipf.needsTransform()) { @@ -953,7 +951,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei } // update blurmap - SHMap* shmap = NULL; + SHMap* shmap = nullptr; if (params.sh.enabled) { shmap = new SHMap (fw, fh, false); @@ -976,7 +974,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei int hlcomprthresh = params.toneCurve.hlcomprthresh; if (params.toneCurve.autoexp && aeHistogram) { ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); - //ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr); } LUTf curve1 (65536); @@ -989,17 +986,11 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LUTf clcurve (65536); LUTf clToningcurve; LUTf cl2Toningcurve; - - LUTf rCurve (65536); - LUTf gCurve (65536); - LUTf bCurve (65536); - LUTu dummy; ToneCurve customToneCurve1, customToneCurve2; ColorGradientCurve ctColorCurve; OpacityCurve ctOpacityCurve; - // NoisCurve dnNoisCurve; ColorAppearance customColCurve1; ColorAppearance customColCurve2; @@ -1012,33 +1003,40 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei params.toneCurve.curveMode2, params.toneCurve.curve2, hist16, dummy, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16); + LUTf rCurve; + LUTf gCurve; + LUTf bCurve; CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 16); CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 16); CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 16); - TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); - 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->workingSpaceInverseMatrix (params.icm.working); - 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]} - }; + bool opautili = false; - params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); - //params.dirpyrDenoise.getCurves(dnNoisCurve, lldenoisutili); - if(params.colorToning.enabled) { - clToningcurve (65536); - cl2Toningcurve (65536); + TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); + 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->workingSpaceInverseMatrix (params.icm.working); + 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]} + }; + params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); + clToningcurve (65536); CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); + + cl2Toningcurve (65536); CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 16); + + if(params.blackwhite.enabled) { + CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 16); + } + double rrm, ggm, bbm; float autor, autog, autob; float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; @@ -1067,23 +1065,22 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei autor = autog = autob = -9000.f; // This will ask to compute the "auto" values for the B&W tool LabImage* labView = new LabImage (fw, fh); - DCPProfile *dcpProf = NULL; + DCPProfile *dcpProf = nullptr; if (isRaw) { cmsHPROFILE dummy; - RawImageSource::findInputProfile(params.icm.input, NULL, camName, &dcpProf, dummy); + RawImageSource::findInputProfile(params.icm.input, nullptr, camName, &dcpProf, dummy); - if (dcpProf != NULL) { + if (dcpProf) { dcpProf->setStep2ApplyState(params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset); } } - ipf.rgbProc (baseImg, labView, NULL, curve1, curve2, curve, shmap, 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); + ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, 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); // freeing up some memory customToneCurve1.Reset(); customToneCurve2.Reset(); ctColorCurve.Reset(); ctOpacityCurve.Reset(); -// dnNoisCurve.Reset(); customToneCurvebw1.Reset(); customToneCurvebw2.Reset(); @@ -1092,36 +1089,34 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei } // luminance histogram update - hist16.clear(); - hist16C.clear(); + if(params.labCurve.contrast != 0) { + hist16.clear(); + for (int i = 0; i < fh; i++) + for (int j = 0; j < fw; j++) { + hist16[(int)((labView->L[i][j]))]++; + } + } - for (int i = 0; i < fh; i++) - for (int j = 0; j < fw; j++) { - hist16[CLIP((int)((labView->L[i][j])))]++; - hist16C[CLIP((int)sqrt(labView->a[i][j]*labView->a[i][j] + labView->b[i][j]*labView->b[i][j]))]++; - } // luminance processing // ipf.EPDToneMap(labView,0,6); bool utili = false; + CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, + hist16, lumacurve, dummy, 16, utili); + + bool clcutili = false; + CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 16); + bool autili = false; bool butili = false; bool ccutili = false; bool cclutili = false; - bool clcutili = false; - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, - hist16, hist16, lumacurve, dummy, 16, utili); - - CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, hist16C, dummy, 16); - CurveFactory::complexsgnCurve (1.f, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, - hist16C, hist16C, dummy, dummy, + dummy, dummy, dummy, dummy, 16); - //ipf.luminanceCurve (labView, labView, curve); - - ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); + ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); ipf.vibrance(labView); @@ -1129,16 +1124,13 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei ipf.EPDToneMap(labView, 5, 6); } - //if(!params.colorappearance.enabled){ipf.EPDToneMap(labView,5,6);} - - if(params.colorappearance.enabled) { CurveFactory::curveLightBrightColor ( params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, hist16, dummy, - hist16C, dummy, + dummy, dummy, customColCurve1, customColCurve2, customColCurve3, @@ -1219,7 +1211,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei int Thumbnail::getImageWidth (const procparams::ProcParams& params, int rheight, float &ratio) { - if (thumbImg == NULL) { + if (!thumbImg) { return 0; // Can happen if thumb is just building and GUI comes in with resize wishes } @@ -1371,11 +1363,11 @@ void Thumbnail::transformPixel (int x, int y, int tran, int& tx, int& ty) unsigned char* Thumbnail::getGrayscaleHistEQ (int trim_width) { if (!thumbImg) { - return NULL; + return nullptr; } if (thumbImg->width < trim_width) { - return NULL; + return nullptr; } // to utilize the 8 bit color range of the thumbnail we brighten it and apply gamma correction @@ -1659,7 +1651,7 @@ bool Thumbnail::readImage (const Glib::ustring& fname) if (thumbImg) { delete thumbImg; - thumbImg = NULL; + thumbImg = nullptr; } Glib::ustring fullFName = fname + ".rtti"; @@ -1872,8 +1864,8 @@ bool Thumbnail::readEmbProfile (const Glib::ustring& fname) FILE* f = g_fopen (fname.c_str (), "rb"); if (!f) { - embProfileData = NULL; - embProfile = NULL; + embProfileData = nullptr; + embProfile = nullptr; embProfileLength = 0; } else { fseek (f, 0, SEEK_END); @@ -1945,7 +1937,7 @@ unsigned char* Thumbnail::getImage8Data() return img8->data; } - return NULL; + return nullptr; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index b7d1f3b61..951d0e6cc 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -726,9 +726,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p // perform first analysis LUTu hist16 (65536); - LUTu hist16C (65536); - ipf.firstAnalysis (baseImg, ¶ms, hist16); + ipf.firstAnalysis (baseImg, params, hist16); // perform transform (excepted resizing) if (ipf.needsTransform()) { @@ -777,9 +776,9 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p LUTf cl2Toningcurve; LUTf wavclCurve (65536, 0); - LUTf rCurve (65536, 0); - LUTf gCurve (65536, 0); - LUTf bCurve (65536, 0); + LUTf rCurve; + LUTf gCurve; + LUTf bCurve; LUTu dummy; ToneCurve customToneCurve1, customToneCurve2; @@ -798,23 +797,22 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 1); CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 1); - TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); - TMatrix wiprof = iccStore->workingSpaceInverseMatrix (params.icm.working); - - 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]} - }; - 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]} - }; bool opautili = false; - params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); if(params.colorToning.enabled) { + TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); + 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->workingSpaceInverseMatrix (params.icm.working); + 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]} + }; + params.colorToning.getCurves(ctColorCurve, ctOpacityCurve, wp, wip, opautili); clToningcurve (65536, 0); CurveFactory::curveToning(params.colorToning.clcurve, clToningcurve, 1); cl2Toningcurve (65536, 0); @@ -822,8 +820,9 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } LabImage* labView = new LabImage (fw, fh); - - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); + if(params.blackwhite.enabled) { + CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); + } double rrm, ggm, bbm; float autor, autog, autob; float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; @@ -889,10 +888,9 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // start tile processing...??? - hist16.clear(); - hist16C.clear(); if(params.labCurve.contrast != 0) { //only use hist16 for contrast + hist16.clear(); #ifdef _OPENMP #pragma omp parallel @@ -918,21 +916,21 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } bool utili = false; + CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); + + bool clcutili = false; + CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 1); + bool autili = false; bool butili = false; bool ccutili = false; bool cclutili = false; - bool clcutili = false; - - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, hist16, lumacurve, dummy, 1, utili); - CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, hist16C, dummy, 1); - CurveFactory::complexsgnCurve (1.f, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, - hist16C, hist16C, dummy, dummy, + dummy, dummy, dummy, dummy, 1); - ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy); + ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { ipf.EPDToneMap(labView, 5, 1); @@ -1024,7 +1022,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p params.colorappearance.curve2, params.colorappearance.curve3, hist16, dummy, - hist16C, dummy, + dummy, dummy, customColCurve1, customColCurve2, customColCurve3, From 01ddba2397b28abb8167cac533e51789ecb3d88a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 7 May 2016 22:11:39 +0200 Subject: [PATCH 038/232] remove CLIP() from index when accessing gamma2curve LUT because gamma2curve LUT already clips internally --- rtengine/iplab2rgb.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 4510044aa..4d78a2a4f 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -117,9 +117,9 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) /* copy RGB */ //int R1=((int)gamma2curve[(R)]) - data[ix++] = ((int)Color::gamma2curve[CLIP(R)]) >> 8; - data[ix++] = ((int)Color::gamma2curve[CLIP(G)]) >> 8; - data[ix++] = ((int)Color::gamma2curve[CLIP(B)]) >> 8; + data[ix++] = ((int)Color::gamma2curve[R]) >> 8; + data[ix++] = ((int)Color::gamma2curve[G]) >> 8; + data[ix++] = ((int)Color::gamma2curve[B]) >> 8; } } } @@ -229,9 +229,9 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyz); - image->data[ix++] = (int)Color::gamma2curve[CLIP(R)] >> 8; - image->data[ix++] = (int)Color::gamma2curve[CLIP(G)] >> 8; - image->data[ix++] = (int)Color::gamma2curve[CLIP(B)] >> 8; + image->data[ix++] = (int)Color::gamma2curve[R] >> 8; + image->data[ix++] = (int)Color::gamma2curve[G] >> 8; + image->data[ix++] = (int)Color::gamma2curve[B] >> 8; } } } From 5c14573be7cba3d191f759ed7042328ec0bf1273 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 8 May 2016 23:16:23 +0200 Subject: [PATCH 039/232] cleaned code a bit, also added a small speedup --- rtengine/colortemp.cc | 8 ++++---- rtengine/colortemp.h | 22 +++++++++++----------- rtengine/dcp.cc | 24 +++++++++++------------- rtengine/dcp.h | 30 +++++++++++++++--------------- rtengine/iimage.h | 6 ------ rtengine/imagesource.h | 12 ++++++------ rtengine/procparams.cc | 14 +++++++------- rtengine/procparams.h | 10 +++++----- rtengine/rawimagesource.cc | 16 +++++++--------- rtengine/rawimagesource.h | 22 +++++++++++----------- rtengine/stdimagesource.cc | 10 +++++----- rtengine/stdimagesource.h | 26 ++++++++------------------ 12 files changed, 90 insertions(+), 110 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 2ccbcba8d..c99e4bd41 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -70,7 +70,7 @@ static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desm {0.000001251141, 0.00000045181, 0.000000} }; -ColorTemp::ColorTemp (double t, double g, double e, Glib::ustring m) : temp(t), green(g), equal(e), method(m) +ColorTemp::ColorTemp (double t, double g, double e, const Glib::ustring &m) : temp(t), green(g), equal(e), method(m) { clip (temp, green, equal); @@ -120,7 +120,7 @@ ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e mul2temp (mulr, mulg, mulb, equal, temp, green); } -void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) +void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const { double maxtemp = double(MAXTEMP), mintemp = double(MINTEMP); @@ -849,7 +849,7 @@ const double ColorTemp::ColabSky42_0_m24_spect[97] = { /* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */ #define LERP(a,b,c) (((b) - (a)) * (c) + (a)) -int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp) +int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp) const { typedef struct UVT { @@ -1128,7 +1128,7 @@ void ColorTemp::temp2mulxyz (double tem, double gree, std::string method , doubl //printf("Xxyz=%f Zxyz=%f\n",Xxyz,Zxyz); } -void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) +void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const { clip (temp, green, equal); diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index c79ebb4bf..a1a805092 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -47,12 +47,14 @@ private: std::string method; static void clip (double &temp, double &green); static void clip (double &temp, double &green, double &equal); + int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp) const; + void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const; public: ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {} ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {} - ColorTemp (double t, double g, double e, Glib::ustring m); + ColorTemp (double t, double g, double e, const Glib::ustring &m); ColorTemp (double mulr, double mulg, double mulb, double e); void update (const double rmul, const double gmul, const double bmul, const double equal) @@ -67,42 +69,40 @@ public: this->equal = equal; } - inline std::string getMethod() + inline std::string getMethod() const { return method; } - inline double getTemp () + inline double getTemp () const { return temp; } - inline double getGreen () + inline double getGreen () const { return green; } - inline double getEqual () + inline double getEqual () const { return equal; } - void getMultipliers (double &mulr, double &mulg, double &mulb) + void getMultipliers (double &mulr, double &mulg, double &mulb) const { temp2mul (temp, green, equal, mulr, mulg, mulb); } - void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green); - void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul); + void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const; static void temp2mulxyz (double tem, double gree, std::string method, double &Xxyz, double &Zxyz); - int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp); 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 CAT02 (Imagefloat* baseImg, const ProcParams* params); //static void ciecam_02 (LabImage* lab, const ProcParams* params); - bool operator== (const ColorTemp& other) + bool operator== (const ColorTemp& other) const { return fabs(temp - other.temp) < 1e-10 && fabs(green - other.green) < 1e-10; } - bool operator!= (const ColorTemp& other) + bool operator!= (const ColorTemp& other) const { return !(*this == other); } diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 8e6ce6728..89eec3773 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -542,7 +542,7 @@ static double calibrationIlluminantToTemperature(int light) return 0.0; } } -void DCPProfile::MakeXYZCAM(ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const +void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const { // code adapted from dng_color_spec::FindXYZtoCamera // note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support) @@ -742,7 +742,7 @@ void DCPProfile::MakeXYZCAM(ColorTemp &wb, double pre_mul[3], double camWbMatrix } } -const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const +const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const { *deleteHandle = NULL; @@ -813,7 +813,7 @@ const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(ColorTemp &wb, int prefer return aDeltas; } -DCPProfile::DCPProfile(Glib::ustring fname) +DCPProfile::DCPProfile(const Glib::ustring &fname) { const int TIFFFloatSize = 4; const int TagColorMatrix1 = 50721, TagColorMatrix2 = 50722, TagProfileHueSatMapDims = 50937; @@ -1433,7 +1433,7 @@ void DCPProfile::dngref_NeutralToXY(double neutral[3], int preferredIlluminant, XY[1] = lastXY[1]; } -void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, Glib::ustring workingSpace, ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], bool useToneCurve, bool applyHueSatMap, bool applyLookTable) const +void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], bool useToneCurve, bool applyHueSatMap, bool applyLookTable) const { TMatrix mWork = iccStore->workingSpaceInverseMatrix (workingSpace); @@ -1551,7 +1551,7 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, Glib::ustring } } -void DCPProfile::setStep2ApplyState(Glib::ustring workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure) +void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure) { applyState.useToneCurve = useToneCurve; @@ -1695,18 +1695,16 @@ DCPStore* DCPStore::getInstance() } // Reads all profiles from the given profiles dir -void DCPStore::init (Glib::ustring rtProfileDir) +void DCPStore::init (const Glib::ustring &rtProfileDir) { MyMutex::MyLock lock(mtx); fileStdProfiles.clear(); - Glib::ustring rootDirName = rtProfileDir; - - if (rootDirName != "") { + if (rtProfileDir != "") { std::deque qDirs; - qDirs.push_front(rootDirName); + qDirs.push_front(rtProfileDir); while (!qDirs.empty()) { // process directory @@ -1749,7 +1747,7 @@ void DCPStore::init (Glib::ustring rtProfileDir) } } -DCPProfile* DCPStore::getProfile (Glib::ustring filename) +DCPProfile* DCPStore::getProfile (const Glib::ustring &filename) { MyMutex::MyLock lock(mtx); @@ -1765,7 +1763,7 @@ DCPProfile* DCPStore::getProfile (Glib::ustring filename) return profileCache[filename]; } -DCPProfile* DCPStore::getStdProfile(Glib::ustring camShortName) +DCPProfile* DCPStore::getStdProfile(const Glib::ustring &camShortName) { Glib::ustring name2 = camShortName.uppercase(); @@ -1778,7 +1776,7 @@ DCPProfile* DCPStore::getStdProfile(Glib::ustring camShortName) return NULL; } -bool DCPStore::isValidDCPFileName(Glib::ustring filename) const +bool DCPStore::isValidDCPFileName(const Glib::ustring &filename) const { if (!Glib::file_test (filename, Glib::FILE_TEST_EXISTS) || Glib::file_test (filename, Glib::FILE_TEST_IS_DIR)) { return false; diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 7a960edc9..f20f3543c 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -26,7 +26,7 @@ #include "../rtgui/threadutils.h" #include #include -#include +//#include namespace rtengine { @@ -71,39 +71,39 @@ class DCPProfile void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; void dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const; - void MakeXYZCAM(ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; - const HSBModify* MakeHueSatMap(ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; + void MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; + const HSBModify* MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; public: - DCPProfile(Glib::ustring fname); + DCPProfile(const Glib::ustring &fname); ~DCPProfile(); - bool getHasToneCurve() + bool getHasToneCurve() const { return hasToneCurve; } - bool getHasLookTable() + bool getHasLookTable() const { return !!aLookTable; } - bool getHasHueSatMap() + bool getHasHueSatMap() const { return !!aDeltas1; } - bool getHasBaselineExposureOffset() + bool getHasBaselineExposureOffset() const { return hasBaselineExposureOffset; } - void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) + void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const { i1 = iLightSource1; i2 = iLightSource2; temp1 = temperature1, temp2 = temperature2; willInterpolate_ = willInterpolate; }; - void Apply(Imagefloat *pImg, int preferredIlluminant, Glib::ustring workingSpace, ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; - void setStep2ApplyState(Glib::ustring workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure); + void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; + void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure); void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth) const; }; @@ -118,12 +118,12 @@ class DCPStore std::map profileCache; public: - void init(Glib::ustring rtProfileDir); + void init(const Glib::ustring &rtProfileDir); - bool isValidDCPFileName(Glib::ustring filename) const; + bool isValidDCPFileName(const Glib::ustring &filename) const; - DCPProfile* getProfile(Glib::ustring filename); - DCPProfile* getStdProfile(Glib::ustring camShortName); + DCPProfile* getProfile(const Glib::ustring &filename); + DCPProfile* getStdProfile(const Glib::ustring &camShortName); static DCPStore* getInstance(); }; diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 4b0450e54..e7dd5865d 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -1010,9 +1010,6 @@ public: avg_r += double(r_); avg_g += double(g_); avg_b += double(b_); - /*avg_r += intpow( (double)r(i, j), p); - avg_g += intpow( (double)g(i, j), p); - avg_b += intpow( (double)b(i, j), p);*/ n++; } @@ -1616,9 +1613,6 @@ public: avg_r += double(r_); avg_g += double(g_); avg_b += double(b_); - /*avg_r += intpow( (double)r(i, j), p); - avg_g += intpow( (double)g(i, j), p); - avg_b += intpow( (double)b(i, j), p);*/ n++; } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 80fc53f23..79389f24c 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -66,7 +66,7 @@ public: embProfile(NULL), idata(NULL), dirpyrdenoiseExpComp(INFINITY) {} virtual ~ImageSource () {} - virtual int load (Glib::ustring fname, bool batch = false) = 0; + virtual int load (const Glib::ustring &fname, bool batch = false) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) {}; virtual void demosaic (const RAWParams &raw) {}; virtual void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, 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) {}; @@ -78,10 +78,10 @@ public: virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; virtual void MSR(LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; - virtual bool IsrgbSourceModified() = 0; // tracks whether cached rgb output of demosaic has been modified + virtual bool IsrgbSourceModified() const = 0; // tracks whether cached rgb output of demosaic has been modified // use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat* - virtual void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hlp, ColorManagementParams cmp, RAWParams raw) {} + virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hlp, const ColorManagementParams &cmp, const RAWParams &raw) = 0; virtual eSensorType getSensorType () { return ST_NONE; @@ -89,12 +89,12 @@ public: // true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource virtual bool isWBProviderReady () = 0; - virtual void convertColorSpace (Imagefloat* image, ColorManagementParams cmp, 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 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 ColorTemp getWB () = 0; + virtual ColorTemp getWB () const = 0; virtual ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) = 0; - virtual double getDefGain () + virtual double getDefGain () const { return 1.0; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index d3b12adcd..d954e5edc 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -19,7 +19,7 @@ #include #include "procparams.h" #include "rt_math.h" -#include "dcp.h" +#include "curves.h" #include "../rtgui/multilangmgr.h" #include "../rtgui/version.h" #include "../rtgui/ppversion.h" @@ -1251,7 +1251,7 @@ void ProcParams::setDefaults () ppVersion = PPVERSION; } -static Glib::ustring expandRelativePath(Glib::ustring procparams_fname, Glib::ustring prefix, Glib::ustring embedded_fname) +static Glib::ustring expandRelativePath(const Glib::ustring &procparams_fname, const Glib::ustring &prefix, Glib::ustring embedded_fname) { if (embedded_fname == "" || !Glib::path_is_absolute(procparams_fname)) { return embedded_fname; @@ -1273,7 +1273,7 @@ static Glib::ustring expandRelativePath(Glib::ustring procparams_fname, Glib::us return absPath; } -static Glib::ustring relativePathIfInside(Glib::ustring procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) +static Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) { if (fnameAbsolute || embedded_fname == "" || !Glib::path_is_absolute(procparams_fname)) { return embedded_fname; @@ -1301,7 +1301,7 @@ static Glib::ustring relativePathIfInside(Glib::ustring procparams_fname, bool f return prefix + embedded_fname.substr(dir1.length()); } -int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsolute, ParamsEdited* pedited) +int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, bool fnameAbsolute, ParamsEdited* pedited) { if (fname.empty () && fname2.empty ()) { @@ -3397,7 +3397,7 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol } } -int ProcParams::write (Glib::ustring &fname, Glib::ustring &content) const +int ProcParams::write (const Glib::ustring &fname, const Glib::ustring &content) const { int error = 0; @@ -3417,7 +3417,7 @@ int ProcParams::write (Glib::ustring &fname, Glib::ustring &content) const return error; } -int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) +int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) { setlocale(LC_NUMERIC, "C"); // to set decimal point to "." @@ -8005,7 +8005,7 @@ PartialProfile::PartialProfile(const ProcParams* pp, const ParamsEdited* pe) } } -int PartialProfile::load (Glib::ustring fName) +int PartialProfile::load (const Glib::ustring &fName) { if (!pparams) { pparams = new ProcParams(); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7946ce4d9..aa6c78922 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -524,7 +524,7 @@ public: double green; double equal; - WBEntry(Glib::ustring p, enum WBTypes t, Glib::ustring l, int temp, double green, double equal) : ppLabel(p), type(t), GUILabel(l), temperature(temp), green(green), equal(equal) {}; + WBEntry(const Glib::ustring &p, enum WBTypes t, const Glib::ustring &l, int temp, double green, double equal) : ppLabel(p), type(t), GUILabel(l), temperature(temp), green(green), equal(equal) {}; }; class WBParams @@ -1312,14 +1312,14 @@ public: * @param pedited pointer to a ParamsEdited object (optional) to store which values has to be saved * @return Error code (=0 if all supplied filenames where created correctly) */ - int save (Glib::ustring fname, Glib::ustring fname2 = "", bool fnameAbsolute = true, ParamsEdited* pedited = NULL); + int save (const Glib::ustring &fname, const Glib::ustring &fname2 = "", bool fnameAbsolute = true, ParamsEdited* pedited = NULL); /** * Loads the parameters from a file. * @param fname the name of the file * @params pedited pointer to a ParamsEdited object (optional) to store which values has been loaded * @return Error code (=0 if no error) */ - int load (Glib::ustring fname, ParamsEdited* pedited = NULL); + int load (const Glib::ustring &fname, ParamsEdited* pedited = NULL); /** Creates a new instance of ProcParams. * @return a pointer to the new ProcParams instance. */ @@ -1341,7 +1341,7 @@ private: * @param content the text to write * @return Error code (=0 if no error) * */ - int write (Glib::ustring &fname, Glib::ustring &content) const; + int write (const Glib::ustring &fname, const Glib::ustring &content) const; }; @@ -1371,7 +1371,7 @@ public: PartialProfile (const ProcParams* pp, const ParamsEdited* pe = NULL); void deleteInstance (); void clearGeneral (); - int load (Glib::ustring fName); + int load (const Glib::ustring &fName); void set (bool v); const void applyTo (ProcParams *destParams) const ; }; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 7d9dd0bf3..a16ec1194 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -587,9 +587,7 @@ void RawImageSource::transformRect (PreviewProps pp, int tran, int &ssx1, int &s } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -static float -calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const float c_white[4], const float c_black[4], bool isMono, int colors) +float calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const float c_white[4], const float c_black[4], bool isMono, int colors) { if (isMono || colors == 1) { for (int c = 0; c < 4; c++) { @@ -617,7 +615,7 @@ calculate_scale_mul(float scale_mul[4], const float pre_mul_[4], const float c_w return gain; } -void RawImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hrp, ColorManagementParams cmp, RAWParams raw ) +void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw ) { MyMutex::MyLock lock(getImageMutex); @@ -727,7 +725,7 @@ void RawImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, Pre float line_blue[imwidth] ALIGNED16; #ifdef _OPENMP - #pragma omp for + #pragma omp for schedule(dynamic,16) #endif for (int ix = 0; ix < imheight; ix++) { @@ -891,7 +889,7 @@ void RawImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, Pre } } -DCPProfile *RawImageSource::getDCP(ColorManagementParams cmp, ColorTemp &wb) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb) { DCPProfile *dcpProf = NULL; cmsHPROFILE dummy; @@ -905,7 +903,7 @@ DCPProfile *RawImageSource::getDCP(ColorManagementParams cmp, ColorTemp &wb) return dcpProf; } -void RawImageSource::convertColorSpace(Imagefloat* image, ColorManagementParams cmp, ColorTemp &wb) +void RawImageSource::convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) { double pre_mul[3] = { ri->get_pre_mul(0), ri->get_pre_mul(1), ri->get_pre_mul(2) }; colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast(getMetaData()))->getCamera()); @@ -1501,7 +1499,7 @@ void RawImageSource::vflip (Imagefloat* image) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -int RawImageSource::load (Glib::ustring fname, bool batch) +int RawImageSource::load (const Glib::ustring &fname, bool batch) { MyTime t1, t2; @@ -3651,7 +3649,7 @@ lab2ProphotoRgbD50(float L, float A, float B, float& r, float& g, float& b) } // Converts raw image including ICC input profile to working space - floating point version -void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) +void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) { // MyTime t1, t2, t3; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 0dd6c9098..6eebba3ca 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -39,7 +39,8 @@ private: static DiagonalCurve *phaseOneIccCurveInv; static LUTf invGrad; // for fast_demosaic static LUTf initInvGrad (); - static void colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName); + static void colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName); + int defTransform (int tran); protected: MyMutex getImageMutex; // locks getImage @@ -97,7 +98,6 @@ protected: void hphd_green (float** hpmap); void processFalseColorCorrectionThread (Imagefloat* im, array2D &rbconv_Y, array2D &rbconv_I, array2D &rbconv_Q, array2D &rbout_I, array2D &rbout_Q, const int row_from, const int row_to); void hlRecovery (std::string method, float* red, float* green, float* blue, int i, int sx1, int width, int skip, const RAWParams &raw, float* hlmax); - int defTransform (int tran); void transformRect (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); @@ -115,7 +115,7 @@ public: RawImageSource (); ~RawImageSource (); - int load (Glib::ustring fname, bool batch = false); + int load (const Glib::ustring &fname, bool batch = false); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse); void demosaic (const RAWParams &raw); void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, 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); @@ -127,7 +127,7 @@ public: void refinement_lassus (int PassCount); void refinement(int PassCount); - bool IsrgbSourceModified() + bool IsrgbSourceModified() const { return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } @@ -137,12 +137,12 @@ public: void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW ); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw); // raw for cblack - void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hrp, ColorManagementParams cmp, RAWParams raw); - eSensorType getSensorType () + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw); + eSensorType getSensorType () const { return ri != NULL ? ri->getSensorType() : ST_NONE; } - ColorTemp getWB () + ColorTemp getWB () const { return camera_wb; } @@ -153,7 +153,7 @@ public: return rawData; } - double getDefGain () + double getDefGain () const { return defGain; } @@ -184,11 +184,11 @@ public: } void getAutoExpHistogram (LUTu & histogram, int& histcompr); void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); - DCPProfile *getDCP(ColorManagementParams cmp, ColorTemp &wb); + DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb); - void convertColorSpace(Imagefloat* image, ColorManagementParams cmp, ColorTemp &wb); + void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); - static void colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], std::string camName) + static void colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], std::string camName) { colorSpaceConversion_ (im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); } diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index aabb35a30..e422d23b2 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -83,7 +83,7 @@ StdImageSource::~StdImageSource () } } -void StdImageSource::getSampleFormat (Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) +void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) { sFormat = IIOSF_UNKNOWN; @@ -125,7 +125,7 @@ void StdImageSource::getSampleFormat (Glib::ustring &fname, IIOSampleFormat &sFo * and RT's image data type (Image8, Image16 and Imagefloat), then it will * load the image into it */ -int StdImageSource::load (Glib::ustring fname, bool batch) +int StdImageSource::load (const Glib::ustring &fname, bool batch) { fileName = fname; @@ -213,7 +213,7 @@ int StdImageSource::load (Glib::ustring fname, bool batch) return 0; } -void StdImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hrp, ColorManagementParams cmp, RAWParams raw) +void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw) { // the code will use OpenMP as of now. @@ -234,12 +234,12 @@ void StdImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, Pre } } -void StdImageSource::convertColorSpace(Imagefloat* image, ColorManagementParams cmp, ColorTemp &wb) +void StdImageSource::convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) { colorSpaceConversion (image, cmp, embProfile, img->getSampleFormat()); } -void StdImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat) +void StdImageSource::colorSpaceConversion (Imagefloat* im, const ColorManagementParams &cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat) { bool skipTransform = false; diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 6017fae74..048f3b3c0 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -38,15 +38,15 @@ protected: bool rgbSourceModified; //void transformPixel (int x, int y, int tran, int& tx, int& ty); - void getSampleFormat (Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); + void getSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); public: StdImageSource (); ~StdImageSource (); - int load (Glib::ustring fname, bool batch = false); - void getImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, ToneCurveParams hrp, ColorManagementParams cmp, RAWParams raw); - ColorTemp getWB () + int load (const Glib::ustring &fname, bool batch = false); + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw); + ColorTemp getWB () const { return wb; } @@ -60,7 +60,7 @@ public: void getAutoExpHistogram (LUTu &histogram, int& histcompr); - double getDefGain () + double getDefGain () const { return 0.0; } @@ -90,20 +90,10 @@ public: plistener = pl; } - void convertColorSpace(Imagefloat* image, ColorManagementParams cmp, ColorTemp &wb);// RAWParams raw will not be used for non-raw files (see imagesource.h) - static void colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat); + void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb);// RAWParams raw will not be used for non-raw files (see imagesource.h) + static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams &cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat); - static inline double intpow (double a, int b) - { - double r = 1.0; - - for (int i = 0; i < b; i++) { - r *= a; - } - - return r; - } - bool IsrgbSourceModified() + bool IsrgbSourceModified() const { return rgbSourceModified; } From 721de446f456ed1cf06b58cc05d76673e0fbcb43 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 9 May 2016 20:00:12 +0200 Subject: [PATCH 040/232] Fix crash caused by uninitialized variables when using ciecam02 on files without exif data, fixes #3084 --- rtengine/imagedata.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index c0da10761..bbfc303fc 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -44,7 +44,7 @@ ImageMetaData* ImageMetaData::fromFile (const Glib::ustring& fname, RawMetaDataL return new ImageData (fname, rml); } -ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) +ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) : iso_speed(0), aperture(0.), shutter(0.) { size_t dotpos = fname.find_last_of ('.'); From 1edfb0c6f79d72acb6f759e2df30a11503404b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 10 May 2016 20:39:20 +0200 Subject: [PATCH 041/232] Switch `getClutValue` to vfloat2 and load/store source[RGB] unaligned Ingo had some cleanup suggestions in #3154 which I tried to realize with this commit. Although switching to `vfloat2` is a clever idea, I can see no further speedup. --- rtengine/clutstore.cc | 27 +++++++++++++++++++-------- rtengine/improcfun.cc | 34 ++++++++++++++++------------------ 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 5d859f90c..fc167734c 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -56,7 +56,7 @@ bool loadFile( img_src.convertColorSpace(img_float.get(), icm, curr_wb); } - AlignedBuffer image(fw * fh * 4 + 8); // + 8 because of SSE4_1 version of getClutValue + AlignedBuffer image(fw * fh * 4 + 8); // + 8 because of SSE4_1 version of getClutValues std::size_t index = 0; @@ -78,12 +78,19 @@ bool loadFile( } #ifdef __SSE2__ -vfloat getClutValue(const AlignedBuffer& clut_image, size_t index) +vfloat2 getClutValues(const AlignedBuffer& clut_image, size_t index) { + const __m128i v_values = _mm_loadu_si128(reinterpret_cast(clut_image.data + index)); #ifdef __SSE4_1__ - return _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_loadu_si128(reinterpret_cast(clut_image.data + index)))); + return { + _mm_cvtepi32_ps(_mm_cvtepu16_epi32(v_values)), + _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_srli_si128(v_values, 8))) + }; #else - return _mm_set_ps(clut_image.data[index + 3], clut_image.data[index + 2], clut_image.data[index + 1], clut_image.data[index]); + return { + _mm_cvtpu16_ps(_mm_movepi64_pi64(v_values)), + _mm_cvtpu16_ps(_mm_movepi64_pi64(_mm_srli_si128(v_values, 8))) + }; #endif } #endif @@ -212,11 +219,13 @@ void rtengine::HaldCLUT::getRGB( const vfloat v_r = PERMUTEPS(v_rgb, _MM_SHUFFLE(0, 0, 0, 0)); - vfloat v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + vfloat2 v_clut_values = getClutValues(clut_image, index); + vfloat v_tmp1 = vintpf(v_r, v_clut_values.y, v_clut_values.x); index = (color + level) * 4; - vfloat v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + v_clut_values = getClutValues(clut_image, index); + vfloat v_tmp2 = vintpf(v_r, v_clut_values.y, v_clut_values.x); const vfloat v_g = PERMUTEPS(v_rgb, _MM_SHUFFLE(1, 1, 1, 1)); @@ -224,11 +233,13 @@ void rtengine::HaldCLUT::getRGB( index = (color + level_square) * 4; - v_tmp1 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + v_clut_values = getClutValues(clut_image, index); + v_tmp1 = vintpf(v_r, v_clut_values.y, v_clut_values.x); index = (color + level + level_square) * 4; - v_tmp2 = vintpf(v_r, getClutValue(clut_image, index + 4), getClutValue(clut_image, index)); + v_clut_values = getClutValues(clut_image, index); + v_tmp2 = vintpf(v_r, v_clut_values.y, v_clut_values.x); v_tmp1 = vintpf(v_g, v_tmp2, v_tmp1); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index e9ae98e2a..bc70bf5e5 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3226,8 +3226,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer xyz2clut = iccStore->workingSpaceInverseMatrix( hald_clut->getProfile() ); xyz2work = iccStore->workingSpaceInverseMatrix( params->icm.working ); clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); -#ifdef __SSE2__ +#ifdef __SSE2__ for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { v_work2xyz[i][j] = F2V(work2xyz[i][j]); @@ -3236,8 +3236,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer v_clut2xyz[i][j] = F2V(clut2xyz[i][j]); } } - #endif + } } } @@ -4361,12 +4361,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Convert from working to clut profile int j = jstart; int tj = 0; -#ifdef __SSE2__ +#ifdef __SSE2__ for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVFU(rtemp[ti * TS + tj]); - vfloat sourceG = LVFU(gtemp[ti * TS + tj]); - vfloat sourceB = LVFU(btemp[ti * TS + tj]); + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); vfloat x; vfloat y; @@ -4374,11 +4374,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_work2xyz); Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); - STVFU(rtemp[ti * TS + tj], sourceR); - STVFU(gtemp[ti * TS + tj], sourceG); - STVFU(btemp[ti * TS + tj], sourceB); + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); } - #endif for (; j < tW; j++, tj++) { @@ -4428,12 +4427,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Convert from clut to working profile int j = jstart; int tj = 0; -#ifdef __SSE2__ +#ifdef __SSE2__ for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVFU(rtemp[ti * TS + tj]); - vfloat sourceG = LVFU(gtemp[ti * TS + tj]); - vfloat sourceB = LVFU(btemp[ti * TS + tj]); + vfloat sourceR = LVF(rtemp[ti * TS + tj]); + vfloat sourceG = LVF(gtemp[ti * TS + tj]); + vfloat sourceB = LVF(btemp[ti * TS + tj]); vfloat x; vfloat y; @@ -4441,11 +4440,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz(sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); Color::xyz2rgb(x, y, z, sourceR, sourceG, sourceB, v_xyz2work); - STVFU(rtemp[ti * TS + tj], sourceR); - STVFU(gtemp[ti * TS + tj], sourceG); - STVFU(btemp[ti * TS + tj], sourceB); + STVF(rtemp[ti * TS + tj], sourceR); + STVF(gtemp[ti * TS + tj], sourceG); + STVF(btemp[ti * TS + tj], sourceB); } - #endif for (; j < tW; j++, tj++) { From aa2beb4c724c6d8ba301ce7426d512ecc50faed5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 11 May 2016 00:04:11 +0200 Subject: [PATCH 042/232] Floessie suggested some C++11 related improvements which I add with this commit --- rtengine/LUT.h | 26 +++--- rtengine/curves.cc | 207 +++++++++++++++++---------------------------- 2 files changed, 92 insertions(+), 141 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 00c7b1858..6676e38a7 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -59,17 +59,8 @@ #ifndef LUT_H_ #define LUT_H_ -// bit representations of flags -#define LUT_CLIP_BELOW 1 -#define LUT_CLIP_ABOVE 2 - -#define LUTf LUT -#define LUTi LUT -#define LUTu LUT -#define LUTd LUT -#define LUTuc LUT - #include +#include #ifndef NDEBUG #include #include @@ -78,6 +69,21 @@ #include #include "rt_math.h" +// Bit representations of flags +enum { + LUT_CLIP_BELOW = 1 << 0, + LUT_CLIP_ABOVE = 1 << 1 +}; + +template +class LUT; + +using LUTf = LUT; +using LUTi = LUT; +using LUTu = LUT; +using LUTd = LUT; +using LUTuc = LUT; + template class LUT { diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 724ec7280..568f1e8ea 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -16,12 +16,13 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include #ifdef _OPENMP #include #endif @@ -43,7 +44,7 @@ using namespace std; namespace rtengine { -Curve::Curve () : N(0), x(nullptr), y(nullptr), ypp(nullptr), hashSize(1000 /* has to be initialized to the maximum value */ ) {} +Curve::Curve () : N(0), x(nullptr), y(nullptr), ypp(nullptr), hashSize(1000 /* has to be initialized to the maximum value */) {} void Curve::AddPolygons () { @@ -297,10 +298,10 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip) { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (clcurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; @@ -308,22 +309,18 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve } } - fillCurveArray(dCurve, clCurve, skip, needed); - - if (dCurve) { - delete dCurve; - } + fillCurveArray(dCurve.get(), clCurve, skip, needed); } void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; outBeforeCurveHistogram.clear(); bool histNeeded = false; if (!mapcurvePoints.empty() && mapcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (mapcurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCurveHistogram) { histNeeded = true; @@ -339,22 +336,18 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m histogram.compressTo(outBeforeCurveHistogram, 32768); } - fillCurveArray(dCurve, mapcurve, skip, needed); - - if (dCurve) { - delete dCurve; - } + fillCurveArray(dCurve.get(), mapcurve, skip, needed); } void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; outBeforeCurveHistogram.clear(); bool histNeeded = false; if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCurveHistogram) { histNeeded = true; @@ -370,21 +363,17 @@ void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip) { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; @@ -392,32 +381,24 @@ void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& curvePoints, LUTf & ToningCurve, int skip) { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; if (!curvePoints.empty() && curvePoints[0] != 0) { - dCurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; } } - fillCurveArray(dCurve, ToningCurve, skip, needed); - - if (dCurve) { - delete dCurve; - } + fillCurveArray(dCurve.get(), ToningCurve, skip, needed); } @@ -430,12 +411,12 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili { bool needed = false; - DiagonalCurve* dCurve = nullptr; + std::unique_ptr dCurve; int k = 48000; //32768*1.41 // create a curve if needed if (!acurvePoints.empty() && acurvePoints[0] != 0) { - dCurve = new DiagonalCurve (acurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; @@ -443,19 +424,16 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - fillCurveArray(dCurve, aoutCurve, skip, needed); + fillCurveArray(dCurve.get(), aoutCurve, skip, needed); - if (dCurve) { - delete dCurve; - dCurve = nullptr; - } + dCurve = nullptr; //----------------------------------------------------- needed = false; if (!bcurvePoints.empty() && bcurvePoints[0] != 0) { - dCurve = new DiagonalCurve (bcurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { needed = true; @@ -463,12 +441,9 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - fillCurveArray(dCurve, boutCurve, skip, needed); + fillCurveArray(dCurve.get(), boutCurve, skip, needed); - if (dCurve) { - delete dCurve; - dCurve = nullptr; - } + dCurve = nullptr; //----------------------------------------------- needed = false; @@ -478,7 +453,7 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { - dCurve = new DiagonalCurve (cccurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCCurveHistogram) { histogramC.compressTo(outBeforeCCurveHistogram, k * adjustr); @@ -490,12 +465,9 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - fillCurveArray(dCurve, satCurve, skip, needed); + fillCurveArray(dCurve.get(), satCurve, skip, needed); - if (dCurve) { - delete dCurve; - dCurve = nullptr; - } + dCurve = nullptr; //---------------------------- needed = false; @@ -505,7 +477,7 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } if (!lccurvePoints.empty() && lccurvePoints[0] != 0) { - dCurve = new DiagonalCurve (lccurvePoints, CURVES_MIN_POLY_POINTS / skip); + dCurve = std::unique_ptr(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeLCurveHistogram) { histogramLC.compressTo(outBeforeLCurveHistogram, k * adjustr); @@ -517,11 +489,7 @@ void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili } } - fillCurveArray(dCurve, lhskCurve, skip, needed); - - if (dCurve) { - delete dCurve; - } + fillCurveArray(dCurve.get(), lhskCurve, skip, needed); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -558,36 +526,35 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - DiagonalCurve* brightcurve = nullptr; + std::unique_ptr brightcurve; // check if brightness curve is needed if (br > 0.00001 || br < -0.00001) { - std::vector brightcurvePoints; - brightcurvePoints.resize(9); - brightcurvePoints.at(0) = double(DCT_NURBS); + std::vector brightcurvePoints(9); + brightcurvePoints[0] = DCT_NURBS; - brightcurvePoints.at(1) = 0.; //black point. Value in [0 ; 1] range - brightcurvePoints.at(2) = 0.; //black point. Value in [0 ; 1] range + brightcurvePoints[1] = 0.; //black point. Value in [0 ; 1] range + brightcurvePoints[2] = 0.; //black point. Value in [0 ; 1] range if(br > 0) { - brightcurvePoints.at(3) = 0.1; //toe point - brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point + brightcurvePoints[3] = 0.1; //toe point + brightcurvePoints[4] = 0.1 + br / 150.0; //value at toe point - brightcurvePoints.at(5) = 0.7; //shoulder point - brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point + brightcurvePoints[5] = 0.7; //shoulder point + brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point } else { - brightcurvePoints.at(3) = max(0.0, 0.1 - br / 150.0); //toe point - brightcurvePoints.at(4) = 0.1; //value at toe point + brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point + brightcurvePoints[4] = 0.1; //value at toe point - brightcurvePoints.at(5) = 0.7 - br / 300.0; //shoulder point - brightcurvePoints.at(6) = 0.7; //value at shoulder point + brightcurvePoints[5] = 0.7 - br / 300.0; //shoulder point + brightcurvePoints[6] = 0.7; //value at shoulder point } - brightcurvePoints.at(7) = 1.; // white point - brightcurvePoints.at(8) = 1.; // value at white point + brightcurvePoints[7] = 1.; // white point + brightcurvePoints[8] = 1.; // value at white point - brightcurve = new DiagonalCurve (brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); + brightcurve = std::unique_ptr(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip)); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -688,9 +655,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double dcurve[i] = CLIPD(val); } - if (brightcurve) { - delete brightcurve; - } + brightcurve = nullptr; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -712,23 +677,22 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double avg /= sum; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - std::vector contrastcurvePoints; - contrastcurvePoints.resize(9); - contrastcurvePoints.at(0) = double(DCT_NURBS); + std::vector contrastcurvePoints(9); + contrastcurvePoints[0] = DCT_NURBS; - contrastcurvePoints.at(1) = 0; //black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 0; //black point. Value in [0 ; 1] range + contrastcurvePoints[1] = 0; //black point. Value in [0 ; 1] range + contrastcurvePoints[2] = 0; //black point. Value in [0 ; 1] range - contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); //toe point - contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); //value at toe point + contrastcurvePoints[3] = avg - avg * (0.6 - contr / 250.0); //toe point + contrastcurvePoints[4] = avg - avg * (0.6 + contr / 250.0); //value at toe point - contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); //shoulder point - contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); //value at shoulder point + contrastcurvePoints[5] = avg + (1 - avg) * (0.6 - contr / 250.0); //shoulder point + contrastcurvePoints[6] = avg + (1 - avg) * (0.6 + contr / 250.0); //value at shoulder point - contrastcurvePoints.at(7) = 1.; // white point - contrastcurvePoints.at(8) = 1.; // value at white point + contrastcurvePoints[7] = 1.; // white point + contrastcurvePoints[8] = 1.; // value at white point - DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); + const DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // apply contrast enhancement @@ -742,11 +706,10 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // create second curve if needed bool histNeeded = false; - DiagonalCurve* tcurve = nullptr; customToneCurve2.Reset(); if (!curvePoints2.empty() && curvePoints2[0] > DCT_Linear && curvePoints2[0] < DCT_Unchanged) { - DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); + const DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); if (!tcurve.isIdentity()) { customToneCurve2.Set(tcurve, gamma_, start, slope, mul, add); @@ -765,7 +728,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double customToneCurve1.Reset(); if (!curvePoints.empty() && curvePoints[0] > DCT_Linear && curvePoints[0] < DCT_Unchanged) { - DiagonalCurve tcurve(curvePoints, CURVES_MIN_POLY_POINTS / skip); + const DiagonalCurve tcurve(curvePoints, CURVES_MIN_POLY_POINTS / skip); if (!tcurve.isIdentity()) { customToneCurve1.Set(tcurve, gamma_, start, slope, mul, add); @@ -811,11 +774,6 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double outBeforeCCurveHistogram[hi] += histogram[i] ; } } - - if (tcurve) { - delete tcurve; - } - } @@ -953,11 +911,11 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector tcurve; bool histNeeded = false; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); + tcurve = std::unique_ptr(new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip)); if (outBeforeCCurveHistogram) { histNeeded = true; @@ -965,7 +923,6 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorisIdentity()) { - delete tcurve; tcurve = nullptr; } @@ -1004,10 +961,6 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, LUTf & outC { // create a curve if needed - DiagonalCurve* tcurve = nullptr; + std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] != 0) { - tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip); + tcurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip)); } if (tcurve && tcurve->isIdentity()) { - delete tcurve; tcurve = nullptr; } @@ -1041,8 +993,6 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC val = tcurve->getVal(val); outCurve[i] = Color::igammatab_srgb[val * 65535.f]; } - - delete tcurve; } else { // let the LUTf empty for identity curves outCurve.reset(); } @@ -1146,17 +1096,16 @@ void OpacityCurve::Set(const Curve *pCurve) void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) { - FlatCurve* tcurve = nullptr; + std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); tcurve->setIdentityValue(0.); } if (tcurve) { - Set(tcurve); + Set(tcurve.get()); opautili = true; - delete tcurve; tcurve = nullptr; } } @@ -1530,16 +1479,14 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin) { - FlatCurve* tcurve = nullptr; + std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); } if (tcurve) { - SetXYZ(tcurve, xyz_rgb, rgb_xyz, satur, lumin); - delete tcurve; - tcurve = nullptr; + SetXYZ(tcurve.get(), xyz_rgb, rgb_xyz, satur, lumin); } } @@ -1631,16 +1578,14 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], void ColorGradientCurve::SetRGB(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3]) { - FlatCurve* tcurve = nullptr; + std::unique_ptr tcurve; if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) { - tcurve = new FlatCurve (curvePoints, false, CURVES_MIN_POLY_POINTS / 2); + tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2)); } if (tcurve) { - SetRGB(tcurve, xyz_rgb, rgb_xyz); - delete tcurve; - tcurve = nullptr; + SetRGB(tcurve.get(), xyz_rgb, rgb_xyz); } } From f4d5c645de112bf9e5423707513115eaf82653e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 11 May 2016 20:01:17 +0200 Subject: [PATCH 043/232] Add Ingo's `clutstore_no_mmx.patch` Ingo has provided a solution for the strange Windows crash with `_mm_cvtpu16_ps()`: It was not an alignment problem, but the use of MMX instructions which led to the SEGV. Now Ingo's solutions omits MMX instructions altogether and is nevertheless faster than the `_mm_set_ps()` workaround. Many thanks to @heckflosse! --- rtengine/clutstore.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index fc167734c..2724ed34e 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -87,9 +87,18 @@ vfloat2 getClutValues(const AlignedBuffer& clut_image, size_t ind _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_srli_si128(v_values, 8))) }; #else + vint lowval = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(1, 0, 1, 0)); + vint highval = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(3, 2, 3, 2)); + lowval = _mm_shufflelo_epi16(lowval, _MM_SHUFFLE(1, 1, 0, 0)); + highval = _mm_shufflelo_epi16(highval, _MM_SHUFFLE(1, 1, 0, 0)); + lowval = _mm_shufflehi_epi16(lowval, _MM_SHUFFLE(3, 3, 2, 2)); + highval = _mm_shufflehi_epi16(highval, _MM_SHUFFLE(3, 3, 2, 2)); + lowval = vandm(lowval, _mm_set1_epi32(0x0000ffff)); + highval = vandm(highval, _mm_set1_epi32(0x0000ffff)); + return { - _mm_cvtpu16_ps(_mm_movepi64_pi64(v_values)), - _mm_cvtpu16_ps(_mm_movepi64_pi64(_mm_srli_si128(v_values, 8))) + _mm_cvtepi32_ps(lowval), + _mm_cvtepi32_ps(highval) }; #endif } @@ -261,12 +270,6 @@ void rtengine::HaldCLUT::splitClutFilename( { Glib::ustring basename = Glib::path_get_basename(filename); - Glib::ustring::size_type last_slash_pos = basename.rfind('/'); - - if (last_slash_pos == Glib::ustring::npos) { - last_slash_pos = basename.rfind('\\'); - } - const Glib::ustring::size_type last_dot_pos = basename.rfind('.'); if (last_dot_pos != Glib::ustring::npos) { From 12656796517cfd733cc9747a47de3a51ee39b682 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 11 May 2016 21:04:32 +0200 Subject: [PATCH 044/232] Retinex: some small improvements and some cleanup --- rtengine/improccoordinator.cc | 3 +- rtengine/ipretinex.cc | 246 +++++++++++----------------------- rtengine/rawimagesource.cc | 139 ++++++++++--------- 3 files changed, 158 insertions(+), 230 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index b6862ab66..7434776d5 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -55,7 +55,7 @@ ImProcCoordinator::ImProcCoordinator () lhist16(65536), lhist16Cropped(65536), lhist16CAM(65536), lhist16CroppedCAM(65536), lhist16CCAM(65536), - lhist16RETI(65536), + lhist16RETI(), histCropped(65536), lhist16Clad(65536), lhist16CLlad(65536), lhist16LClad(65536), lhist16LLClad(65536), @@ -236,6 +236,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } if (params.retinex.enabled) { + lhist16RETI(32768); lhist16RETI.clear(); imgsrc->retinexPrepareBuffers(params.icm, params.retinex, conversionBuffer, lhist16RETI); diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index f66fb39af..6773e7a12 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -47,7 +47,6 @@ #include "opthelper.h" #include "StopWatch.h" -#define MAX_RETINEX_SCALES 8 #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ @@ -60,13 +59,9 @@ PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \ PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \ PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median -namespace rtengine + +namespace { - -extern const Settings* settings; - -static float RetinexScales[MAX_RETINEX_SCALES]; - void retinex_scales( float* scales, int nscales, int mode, int s, float high) { if ( nscales == 1 ) { @@ -102,6 +97,7 @@ void retinex_scales( float* scales, int nscales, int mode, int s, float high) } } } + void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, float &maxtr, float &mintr) { // summation using double precision to avoid too large summation error for large pictures @@ -123,14 +119,8 @@ void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, floa sum += dst[i][j]; vsquared += (dst[i][j] * dst[i][j]); - if ( dst[i][j] > lmax) { - lmax = dst[i][j] ; - } - - if ( dst[i][j] < lmin) { - lmin = dst[i][j] ; - } - + lmax = dst[i][j] > lmax ? dst[i][j] : lmax; + lmin = dst[i][j] < lmin ? dst[i][j] : lmin; } #ifdef _OPENMP @@ -148,81 +138,30 @@ void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, floa stddv = (float)sqrt(stddv); } - - - - - -void mean_stddv( float **dst, float &mean, float &stddv, int W_L, int H_L, const float factor, float &maxtr, float &mintr) - -{ - // summation using double precision to avoid too large summation error for large pictures - double vsquared = 0.f; - double sum = 0.f; - maxtr = 0.f; - mintr = 0.f; -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float lmax = 0.f, lmin = 0.f; - -#ifdef _OPENMP - #pragma omp for reduction(+:sum,vsquared) // this can lead to differences, but parallel summation is more accurate -#endif - - for (int i = 0; i < H_L; i++ ) - for (int j = 0; j < W_L; j++) { - sum += dst[i][j]; - vsquared += (dst[i][j] * dst[i][j]); - - if ( dst[i][j] > lmax) { - lmax = dst[i][j] ; - } - - if ( dst[i][j] < lmin) { - lmin = dst[i][j] ; - } - - } - -#ifdef _OPENMP - #pragma omp critical -#endif - { - maxtr = maxtr > lmax ? maxtr : lmax; - mintr = mintr < lmin ? mintr : lmin; - } - - } - - sum *= factor; - maxtr *= factor; - mintr *= factor; - vsquared *= (factor * factor); - mean = sum / (float) (W_L * H_L); - vsquared /= (float) W_L * H_L; - stddv = ( vsquared - (mean * mean) ); - stddv = (float)sqrt(stddv); } + +namespace rtengine +{ + +extern const Settings* settings; + void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) { if (deh.enabled) {//enabled float mean, stddv, maxtr, mintr; - //float mini, delta, maxi; float delta; - float eps = 2.f; + constexpr float eps = 2.f; bool useHsl = deh.retinexcolorspace == "HSLLOG"; bool useHslLin = deh.retinexcolorspace == "HSLLIN"; float gain2 = (float) deh.gain / 100.f; //def =1 not use gain2 = useHslLin ? gain2 * 0.5f : gain2; float offse = (float) deh.offs; //def = 0 not use int iter = deh.iter; - int gradient = deh.scal; + int gradient = deh.scal; int scal = 3;//disabled scal - int nei = (int) 2.8f * deh.neigh; //def = 220 + int nei = (int) (2.8f * deh.neigh); //def = 220 float vart = (float)deh.vart / 100.f;//variance float gradvart = (float)deh.grad; float gradstr = (float)deh.grads; @@ -231,9 +170,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e limD = pow(limD, 1.7f);//about 2500 enough limD *= useHslLin ? 10.f : 1.f; float ilimD = 1.f / limD; - int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" ) float hig = ((float) deh.highl) / 100.f; - bool higplus = false ; float elogt; float hl = deh.baselog; scal = deh.skal; @@ -248,50 +185,43 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e int W_L = width; float *tran[H_L] ALIGNED16; - float *tranBuffer; - int viewmet = 0; + float *tranBuffer = nullptr; elogt = 2.71828f;//disabled baselog - FlatCurve* shcurve = NULL;//curve L=f(H) bool lhutili = false; - if (deh.enabled) { - shcurve = new FlatCurve(deh.lhcurve); + FlatCurve* shcurve = new FlatCurve(deh.lhcurve); //curve L=f(H) - if (!shcurve || shcurve->isIdentity()) { - if (shcurve) { - delete shcurve; - shcurve = NULL; - } - } else { - lhutili = true; + if (!shcurve || shcurve->isIdentity()) { + if (shcurve) { + delete shcurve; + shcurve = nullptr; } + } else { + lhutili = true; } + bool higplus = false ; + int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" ) + if(deh.retinexMethod == "highliplus") { higplus = true; - } - - if (deh.retinexMethod == "uni") { + moderetinex = 3; + } else if (deh.retinexMethod == "uni") { moderetinex = 0; - } - - if (deh.retinexMethod == "low") { + } else if (deh.retinexMethod == "low") { moderetinex = 1; - } - - if (deh.retinexMethod == "highli" || deh.retinexMethod == "highliplus") { + } else { /*if (deh.retinexMethod == "highli") */ moderetinex = 3; } - for(int it = 1; it < iter + 1; it++) { //iter nb max of iterations - float aahi = 49.f / 99.f; ////reduce sensibility 50% - float bbhi = 1.f - aahi; - float high; - high = bbhi + aahi * (float) deh.highl; + constexpr float aahi = 49.f / 99.f; ////reduce sensibility 50% + constexpr float bbhi = 1.f - aahi; + + for(int it = 1; it < iter + 1; it++) { //iter nb max of iterations + float high = bbhi + aahi * (float) deh.highl; - float grads; float grad = 1.f; float sc = scal; @@ -382,7 +312,6 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } scal = round(sc); - float strengthx; float ks = 1.f; if(gradstr != 0) { @@ -413,8 +342,11 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } } - strengthx = ks * strength; - //printf("scale=%d\n", scal); + float strengthx = ks * strength; + + constexpr auto maxRetinexScales = 8; + float RetinexScales[maxRetinexScales]; + retinex_scales( RetinexScales, scal, moderetinex, nei / grad, high ); float *src[H_L] ALIGNED16; @@ -428,39 +360,28 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e int shHighlights = deh.highlights; int shShadows = deh.shadows; + int mapmet = 0; if(deh.mapMethod == "map") { mapmet = 2; - } - - if(deh.mapMethod == "mapT") { + } else if(deh.mapMethod == "mapT") { mapmet = 3; - } - - /*if(deh.mapMethod == "curv") { - mapmet = 1; - }*/ - - if(deh.mapMethod == "gaus") { + } else if(deh.mapMethod == "gaus") { mapmet = 4; } const double shradius = mapmet == 4 ? (double) deh.radius : 40.; + int viewmet = 0; + if(deh.viewMethod == "mask") { viewmet = 1; - } - - if(deh.viewMethod == "tran") { + } else if(deh.viewMethod == "tran") { viewmet = 2; - } - - if(deh.viewMethod == "tran2") { + } else if(deh.viewMethod == "tran2") { viewmet = 3; - } - - if(deh.viewMethod == "unsharp") { + } else if(deh.viewMethod == "unsharp") { viewmet = 4; } @@ -554,6 +475,12 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e #endif if(mapmet > 0 && mapcontlutili && it == 1) { + // TODO: When rgbcurvespeedup branch is merged into master we can simplify the code by + // 1) in rawimagesource.retinexPrepareCurves() insert + // mapcurve *= 0.5f; + // after + // CurveFactory::mapcurve (mapcontlutili, retinexParams.mapcurve, mapcurve, 1, lhist16RETI, histLRETI); + // 2) remove the division by 2.f from the code 7 lines below this line #ifdef _OPENMP #pragma omp parallel for #endif @@ -567,21 +494,21 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } if(((mapmet == 2 && scale > 2) || mapmet == 3 || mapmet == 4) && it == 1) { - - + float hWeight = (100.f - shHighlights) / 100.f; + float sWeight = (100.f - shShadows) / 100.f; #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic,16) #endif for (int i = 0; i < H_L; i++) { for (int j = 0; j < W_L; j++) { - double mapval = 1.0 + shmap->map[i][j]; - double factor = 1.0; + float mapval = 1.f + shmap->map[i][j]; + float factor = 1.f; if (mapval > h_th) { - factor = (h_th + (100.0 - shHighlights) * (mapval - h_th) / 100.0) / mapval; + factor = (h_th + hWeight * (mapval - h_th)) / mapval; } else if (mapval < s_th) { - factor = (s_th - (100.0 - shShadows) * (s_th - mapval) / 100.0) / mapval; + factor = (s_th - sWeight * (s_th - mapval)) / mapval; } out[i][j] *= factor; @@ -629,10 +556,9 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } } - shmap = NULL; + shmap = nullptr; delete [] buffer; - //delete [] outBuffer; delete [] srcBuffer; mean = 0.f; @@ -657,6 +583,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e bmax *= 500.f; amin *= 500.f; bmin *= 500.f; + #ifdef _OPENMP #pragma omp parallel #endif @@ -676,6 +603,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e absciss = amin * luminance[i][j] + bmin; } + //TODO : move multiplication by 4.f and subtraction of 1.f inside the curve luminance[i][j] *= (-1.f + 4.f * dehatransmissionCurve[absciss]); //new transmission if(viewmet == 3 || viewmet == 2) { @@ -797,10 +725,9 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e #pragma omp parallel #endif { - float absciss; float cdmax = -999999.f, cdmin = 999999.f; #ifdef _OPENMP - #pragma omp for + #pragma omp for schedule(dynamic,16) nowait #endif for ( int i = 0; i < H_L; i ++ ) @@ -808,6 +735,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float gan; if (dehagaintransmissionCurve && mean != 0.f && stddv != 0.f) { + float absciss; if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) { absciss = asig * luminance[i][j] + bsig; @@ -819,6 +747,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e // float cd = cdfactor * ( luminance[i][j] - mini ) + offse; + // TODO : move multiplication by 2.f inside the curve gan = 2.f * (dehagaintransmissionCurve[absciss]); //new gain function transmission } else { gan = 0.5f; @@ -826,17 +755,12 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float cd = gan * cdfactor * ( luminance[i][j] ) + offse; - if(cd > cdmax) { - cdmax = cd; - } - - if(cd < cdmin) { - cdmin = cd; - } + cdmax = cd > cdmax ? cd : cdmax; + cdmin = cd < cdmin ? cd : cdmin; float str = strengthx; - if(lhutili && it == 1) { // S=f(H) + if(lhutili && it == 1) { // S=f(H) { float HH = exLuminance[i][j]; float valparam; @@ -851,31 +775,23 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } } - if(exLuminance[i][j] > 65535.f * hig && higplus) { + if(higplus && exLuminance[i][j] > 65535.f * hig) { str *= hig; } if(viewmet == 0) { - luminance[i][j] = clipretinex( cd, 0.f, 32768.f ) * str + (1.f - str) * originalLuminance[i][j]; - } - - if(viewmet == 1) { + luminance[i][j] = intp(str, clipretinex( cd, 0.f, 32768.f ), originalLuminance[i][j]); + } else if(viewmet == 1) { luminance[i][j] = out[i][j]; - } - - if(viewmet == 4) { - luminance[i][j] = (1.f + str) * originalLuminance[i][j] - str * out[i][j]; //unsharp - } - - if(viewmet == 2) { + } else if(viewmet == 4) { + luminance[i][j] = originalLuminance[i][j] + str * (originalLuminance[i][j] - out[i][j]);//unsharp + } else if(viewmet == 2) { if(tran[i][j] <= mean) { luminance[i][j] = azb + aza * tran[i][j]; //auto values } else { luminance[i][j] = bzb + bza * tran[i][j]; } - } - - if(viewmet == 3) { + } else { /*if(viewmet == 3) */ luminance[i][j] = 1000.f + tran[i][j] * 700.f; //arbitrary values to help display log values which are between -20 to + 30 - usage values -4 + 5 } @@ -890,23 +806,23 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e } } + delete [] outBuffer; - outBuffer = NULL; + outBuffer = nullptr; //printf("cdmin=%f cdmax=%f\n",minCD, maxCD); Tmean = mean; Tsigma = stddv; Tmin = mintr; Tmax = maxtr; - - if (shcurve && it == 1) { + if (shcurve) { delete shcurve; + shcurve = nullptr; } } - if(viewmet == 3 || viewmet == 2) { + if(tranBuffer) { delete [] tranBuffer; - tranBuffer = NULL; } } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 27ddb6b3c..2780c033f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1764,7 +1764,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le LCPProfile *pLCPProf = lcpStore->getProfile(lensProf.lcpFile); if (pLCPProf) { // don't check focal length to allow distortion correction for lenses without chip, also pass dummy focal length 1 in case of 0 - LCPMapper map(pLCPProf, max(idata->getFocalLen(),1.0), idata->getFocalLen35mm(), idata->getFocusDist(), idata->getFNumber(), true, false, W, H, coarse, -1); + LCPMapper map(pLCPProf, max(idata->getFocalLen(), 1.0), idata->getFocalLen35mm(), idata->getFocusDist(), idata->getFNumber(), true, false, W, H, coarse, -1); #ifdef _OPENMP #pragma omp parallel for @@ -1970,7 +1970,6 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar LUTf *retinexgamtab;//gamma before and after Retinex to restore tones LUTf lutTonereti; - lutTonereti(65536); if(retinexParams.gammaretinex == "low") { retinexgamtab = &(Color::gammatab_115_2); @@ -1986,24 +1985,33 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar double gamm2 = retinexParams.gam; if(gamm2 < 1.) { - pwr = 1. / pwr; - gamm = 1. / gamm; + std::swap(pwr, gamm); } int mode = 0, imax = 0; Color::calcGamma(pwr, ts, mode, imax, g_a0, g_a1, g_a2, g_a3, g_a4, g_a5); // call to calcGamma with selected gamma and slope // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); + double start; + double add; + + if(gamm2 < 1.) { + start = g_a2; + add = g_a4; + } else { + start = g_a3; + add = g_a4; + } + + double mul = 1. + g_a4; + + lutTonereti(65536); + for (int i = 0; i < 65536; i++) { double val = (i) / 65535.; - double start = g_a3; - double add = g_a4; - double mul = 1. + g_a4; double x; if(gamm2 < 1.) { - start = g_a2; - add = g_a4; x = Color::igammareti (val, gamm, start, ts, mul , add); } else { x = Color::gammareti (val, gamm, start, ts, mul , add); @@ -2055,6 +2063,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar } */ if(retinexParams.gammaretinex != "none" && retinexParams.str != 0) {//gamma + #ifdef _OPENMP #pragma omp parallel for #endif @@ -2083,7 +2092,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar if(lhist16RETI) { - lhist16RETIThr(32769, 0); + lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); } @@ -2101,7 +2110,6 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar for (; j < W - border - 3; j += 4) { vfloat H, S, L; - int pos; Color::rgb2hsl(LVFU(red[i][j]), LVFU(green[i][j]), LVFU(blue[i][j]), H, S, L); STVFU(conversionBuffer[0][i - border][j - border], H); STVFU(conversionBuffer[1][i - border][j - border], S); @@ -2111,7 +2119,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar if(lhist16RETI) { for(int p = 0; p < 4; p++) { - pos = (int) clipretinex( conversionBuffer[2][i - border][j - border + p], 0.f, 32768.f);//histogram in curve HSL + int pos = ( conversionBuffer[2][i - border][j - border + p]);//histogram in curve HSL lhist16RETIThr[pos]++; } } @@ -2121,14 +2129,13 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar for (; j < W - border; j++) { float H, S, L; - int pos; //rgb=>lab Color::rgb2hslfloat(red[i][j], green[i][j], blue[i][j], conversionBuffer[0][i - border][j - border], conversionBuffer[1][i - border][j - border], L); L *= 32768.f; conversionBuffer[2][i - border][j - border] = L; if(lhist16RETI) { - pos = (int) clipretinex(L, 0, 32768); + int pos = L; lhist16RETIThr[pos]++; } } @@ -2139,10 +2146,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar { if(lhist16RETI) { - // Add per Thread LUT to global LUT - for(int i = 0; i < 32769; i++) { - lhist16RETI[i] += lhist16RETIThr[i]; - } + lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } } #endif @@ -2150,10 +2154,10 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar } } else { TMatrix wprof = iccStore->workingSpaceMatrix (cmp.working); - 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]} + 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])} }; // Conversion rgb -> lab is hard to vectorize because it uses a lut (that's not the main problem) @@ -2166,25 +2170,19 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar LUTu lhist16RETIThr; if(lhist16RETI) { - lhist16RETIThr(32769, 0); + lhist16RETIThr(lhist16RETI.getSize()); lhist16RETIThr.clear(); } #ifdef _OPENMP - #pragma omp for + #pragma omp for schedule(dynamic,16) #endif for (int i = border; i < H - border; i++ ) for (int j = border; j < W - border; j++) { float X, Y, Z, L, aa, bb; - int pos; - float R_, G_, B_; - R_ = red[i][j]; - G_ = green[i][j]; - B_ = blue[i][j]; - float k; //rgb=>lab - Color::rgbxyz(R_, G_, B_, X, Y, Z, wp); + Color::rgbxyz(red[i][j], green[i][j], blue[i][j], X, Y, Z, wp); //convert Lab Color::XYZ2Lab(X, Y, Z, L, aa, bb); conversionBuffer[0][i - border][j - border] = aa; @@ -2195,7 +2193,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar // 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) { - pos = (int) clipretinex(L, 0, 32768); + int pos = L; lhist16RETIThr[pos]++;//histogram in Curve Lab } } @@ -2204,10 +2202,7 @@ void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexPar #pragma omp critical { if(lhist16RETI) { - // Add per Thread LUT to global LUT - for(int i = 0; i < 32769; i++) { - lhist16RETI[i] += lhist16RETIThr[i]; - } + lhist16RETI += lhist16RETIThr; // Add per Thread LUT to global LUT } } #endif @@ -2263,23 +2258,29 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC int mode = 0, imax = 0; if(gamm2 < 1.) { - pwr = 1. / pwr; - gamm = 1. / gamm; + std::swap(pwr, gamm); } Color::calcGamma(pwr, ts, mode, imax, g_a0, g_a1, g_a2, g_a3, g_a4, g_a5); // call to calcGamma with selected gamma and slope + double mul = 1. + g_a4; + double add; + double start; + + if(gamm2 < 1.) { + start = g_a3; + add = g_a3; + } else { + add = g_a4; + start = g_a2; + } + // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); for (int i = 0; i < 65536; i++) { double val = (i) / 65535.; double x; - double mul = 1. + g_a4; - double add = g_a4; - double start = g_a2; if(gamm2 < 1.) { - start = g_a3; - add = g_a3; x = Color::gammareti (val, gamm, start, ts, mul , add); } else { x = Color::igammareti (val, gamm, start, ts, mul , add); @@ -2303,11 +2304,10 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC float val; if(dehacontlutili && histLRETI) { - hist16RET(32769, 0); + hist16RET(32768); hist16RET.clear(); histLRETI.clear(); - dLcurve(32769, 0); - dLcurve.clear(); + dLcurve(32768); } FlatCurve* chcurve = NULL;//curve c=f(H) @@ -2335,8 +2335,8 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC // one LUT per thread LUTu hist16RETThr; - if(dehacontlutili && histLRETI) { - hist16RETThr(32769, 0); + if(hist16RET) { + hist16RETThr(hist16RET.getSize()); hist16RETThr.clear(); } @@ -2350,7 +2350,7 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC LBuffer[i][j] = cdcurve[2.f * temp[i][j]] / 2.f; if(histLRETI) { - int pos = (int) clipretinex(LBuffer[i][j], 0.f, 32768.f); + int pos = LBuffer[i][j]; hist16RETThr[pos]++; //histogram in Curve } } @@ -2363,24 +2363,24 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC #pragma omp critical #endif { - if(dehacontlutili && histLRETI) { - // Add per Thread LUT to global LUT - for(int i = 0; i < 32769; i++) { - hist16RET[i] += hist16RETThr[i]; - } + if(hist16RET) { + hist16RET += hist16RETThr; // Add per Thread LUT to global LUT } } } - if(dehacontlutili && histLRETI) {//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 :) for (int i = 0; i < 32768; i++) { val = (double)i / 32767.0; - dLcurve[i] = CLIPD(val); + dLcurve[i] = val; } for (int i = 0; i < 32768; i++) { float hval = dLcurve[i]; - int hi = (int)(255.0f * CLIPD(hval)); + int hi = (int)(255.0f * hval); histLRETI[hi] += hist16RET[i]; } } @@ -2399,7 +2399,6 @@ void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneC for (; j < W - border; j++) { float valp; - float chr; // if(chutili) { // c=f(H) { valp = float((chcurve->getVal(conversionBuffer[3][i - border][j - border]) - 0.5f)); @@ -4365,12 +4364,12 @@ void RawImageSource::hlRecovery (std::string method, float* red, float* green, f void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) { -BENCHFUN + BENCHFUN histcompr = 3; histogram(65536 >> histcompr); histogram.clear(); - const float refwb[3] = {static_cast(refwb_red),static_cast(refwb_green),static_cast(refwb_blue)}; + const float refwb[3] = {static_cast(refwb_red), static_cast(refwb_green), static_cast(refwb_blue)}; #ifdef _OPENMP #pragma omp parallel @@ -4388,11 +4387,11 @@ BENCHFUN if (ri->getSensorType() == ST_BAYER) { for (int j = start; j < end; j++) { - tmphistogram[(int)(refwb[ri->FC(i,j)] * rawData[i][j]) >> histcompr] += 4; + tmphistogram[(int)(refwb[ri->FC(i, j)] * rawData[i][j]) >> histcompr] += 4; } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { for (int j = start; j < end; j++) { - tmphistogram[(int)(refwb[ri->XTRANSFC(i,j)] * rawData[i][j]) >> histcompr] += 4; + tmphistogram[(int)(refwb[ri->XTRANSFC(i, j)] * rawData[i][j]) >> histcompr] += 4; } } else if (ri->get_colors() == 1) { for (int j = start; j < end; j++) { @@ -4419,7 +4418,7 @@ BENCHFUN // Histogram MUST be 256 in size; gamma is applied, blackpoint and gain also void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) { -BENCHFUN + BENCHFUN histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear(); @@ -4429,17 +4428,19 @@ BENCHFUN 65535.0f / ri->get_white(3) }; - const bool fourColours = ri->getSensorType() == ST_BAYER && ((mult[1] != mult[3] || cblacksom[1] != cblacksom[3]) || FC(0,0) == 3 || FC(0,1) == 3 || FC(1,0) == 3 || FC(1,1) == 3); + const bool fourColours = ri->getSensorType() == ST_BAYER && ((mult[1] != mult[3] || cblacksom[1] != cblacksom[3]) || FC(0, 0) == 3 || FC(0, 1) == 3 || FC(1, 0) == 3 || FC(1, 1) == 3); LUTu hist[4]; hist[0](65536); hist[0].clear(); + if (ri->get_colors() > 1) { hist[1](65536); hist[1].clear(); hist[2](65536); hist[2].clear(); } + if (fourColours) { hist[3](65536); hist[3].clear(); @@ -4458,16 +4459,19 @@ BENCHFUN LUTu tmphist[4]; tmphist[0](65536); tmphist[0].clear(); + if (ri->get_colors() > 1) { tmphist[1](65536); tmphist[1].clear(); tmphist[2](65536); tmphist[2].clear(); + if (fourColours) { tmphist[3](65536); tmphist[3].clear(); } } + #ifdef _OPENMP #pragma omp for nowait #endif @@ -4514,9 +4518,11 @@ BENCHFUN #endif { hist[0] += tmphist[0]; + if (ri->get_colors() > 1) { hist[1] += tmphist[1]; hist[2] += tmphist[2]; + if (fourColours) { hist[3] += tmphist[3]; } @@ -4528,13 +4534,16 @@ BENCHFUN int idx; idx = CLIP((int)Color::gamma(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)))); histRedRaw[idx >> 8] += hist[0][i]; + if (ri->get_colors() > 1) { idx = CLIP((int)Color::gamma(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)))); histGreenRaw[idx >> 8] += hist[1][i]; + if (fourColours) { idx = CLIP((int)Color::gamma(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)))); histGreenRaw[idx >> 8] += hist[3][i]; } + idx = CLIP((int)Color::gamma(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)))); histBlueRaw[idx >> 8] += hist[2][i]; } @@ -4574,6 +4583,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { BENCHFUN constexpr double clipHigh = 64000.0; + if (ri->get_colors() == 1) { rm = gm = bm = 1; return; @@ -4653,6 +4663,7 @@ void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) #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 From e8595890c5bf2dffa1d2cbd6e95c35b502e8fc68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 12 May 2016 20:21:17 +0200 Subject: [PATCH 045/232] Final cleanups --- rtengine/clutstore.cc | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 2724ed34e..f738c3da9 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -80,21 +80,23 @@ bool loadFile( #ifdef __SSE2__ vfloat2 getClutValues(const AlignedBuffer& clut_image, size_t index) { - const __m128i v_values = _mm_loadu_si128(reinterpret_cast(clut_image.data + index)); + const vint v_values = _mm_loadu_si128(reinterpret_cast(clut_image.data + index)); #ifdef __SSE4_1__ return { _mm_cvtepi32_ps(_mm_cvtepu16_epi32(v_values)), _mm_cvtepi32_ps(_mm_cvtepu16_epi32(_mm_srli_si128(v_values, 8))) }; #else - vint lowval = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(1, 0, 1, 0)); - vint highval = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(3, 2, 3, 2)); - lowval = _mm_shufflelo_epi16(lowval, _MM_SHUFFLE(1, 1, 0, 0)); - highval = _mm_shufflelo_epi16(highval, _MM_SHUFFLE(1, 1, 0, 0)); - lowval = _mm_shufflehi_epi16(lowval, _MM_SHUFFLE(3, 3, 2, 2)); - highval = _mm_shufflehi_epi16(highval, _MM_SHUFFLE(3, 3, 2, 2)); - lowval = vandm(lowval, _mm_set1_epi32(0x0000ffff)); - highval = vandm(highval, _mm_set1_epi32(0x0000ffff)); + const vint v_mask = _mm_set1_epi32(0x0000FFFF); + + vint v_low = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(1, 0, 1, 0)); + vint v_high = _mm_shuffle_epi32(v_values, _MM_SHUFFLE(3, 2, 3, 2)); + v_low = _mm_shufflelo_epi16(v_low, _MM_SHUFFLE(1, 1, 0, 0)); + v_high = _mm_shufflelo_epi16(v_high, _MM_SHUFFLE(1, 1, 0, 0)); + v_low = _mm_shufflehi_epi16(v_low, _MM_SHUFFLE(3, 3, 2, 2)); + v_high = _mm_shufflehi_epi16(v_high, _MM_SHUFFLE(3, 3, 2, 2)); + v_low = vandm(v_low, m_mask); + v_high = vandm(v_high, v_mask); return { _mm_cvtepi32_ps(lowval), From aa2912531644cf66c2565c73776f13de67ef3e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 12 May 2016 21:44:20 +0200 Subject: [PATCH 046/232] Read-ahead of `getClutValues()` is only one pixel now --- rtengine/clutstore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index f738c3da9..5fd2cfae3 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -56,7 +56,7 @@ bool loadFile( img_src.convertColorSpace(img_float.get(), icm, curr_wb); } - AlignedBuffer image(fw * fh * 4 + 8); // + 8 because of SSE4_1 version of getClutValues + AlignedBuffer image(fw * fh * 4 + 4); // getClutValues() loads one pixel in advance std::size_t index = 0; From c601e05422794bf7a1925b951c53ad343c885d42 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 13 May 2016 15:40:21 +0200 Subject: [PATCH 047/232] Fix non OpenMP build and astyled improcfun.cc --- rtengine/improcfun.cc | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 854b0b6b0..51c045ab5 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -149,8 +149,7 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro #pragma omp for nowait #endif - for (int i = 0; i < H; i++) - { + for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { float r = original->r(i, j); @@ -1452,6 +1451,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int //preparate for histograms CIECAM LUTu hist16JCAM; LUTu hist16_CCAM; + if(pW != 1 && params->colorappearance.datacie) { //only with improccoordinator hist16JCAM(32768); hist16JCAM.clear(); @@ -1459,7 +1459,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int hist16_CCAM.clear(); } - //end preparate histogram + //end preparate histogram int width = lab->W, height = lab->H; float minQ = 10000.f; float maxQ = -1000.f; @@ -1475,8 +1475,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int const bool epdEnabled = params->epd.enabled; bool ciedata = (params->colorappearance.datacie && pW != 1) && !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) - || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); + || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB @@ -1694,8 +1694,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int hist16Q.clear(); } +#ifdef _OPENMP const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif { LUTu hist16Jthr; LUTu hist16Qthr; @@ -2364,10 +2366,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int if(curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { brli = 70.0f; libr = Q; //40.0 to 100.0 approximative factor for Q - 327 for J - } else /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ { + } else { /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ brli = 327.f; libr = J; //327 for J } + posl = (int)(libr * brli); hist16JCAM[posl]++; @@ -2377,10 +2380,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { chsacol = 450.0f; colch = s; - } else /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ { + } else { /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ chsacol = 327.0f; colch = M; } + posc = (int)(colch * chsacol); hist16_CCAM[posc]++; @@ -2663,6 +2667,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { ciedata = (params->colorappearance.datacie && pW != 1); + if(epdEnabled && params->colorappearance.tonecie && algepd) { lab->deleteLab(); ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); @@ -2723,10 +2728,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int if(curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { brli = 70.0f; libr = ncie->Q_p[i][j]; //40.0 to 100.0 approximative factor for Q - 327 for J - } else /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ { + } else { /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ brli = 327.f; libr = ncie->J_p[i][j]; //327 for J } + posl = (int)(libr * brli); hist16JCAM[posl]++; @@ -2736,10 +2742,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { chsacol = 450.0f; colch = 100.f * sqrtf(ncie_C_p / ncie->Q_p[i][j]); - } else /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ { + } else { /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ chsacol = 327.0f; colch = ncie->M_p[i][j]; } + posc = (int)(colch * chsacol); hist16_CCAM[posc]++; } @@ -6598,7 +6605,8 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double count = 0; int i = 0; - for (; i < min((int)ave,imax); i++) { + + for (; i < min((int)ave, imax); i++) { if (count < 8) { octile[count] += histogram[i]; @@ -6612,6 +6620,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double lodev += (xlog(ave + 1.f) - xlog((float)i + 1.)) * histogram[i]; losum += histogram[i]; } + for (; i < imax; i++) { if (count < 8) { octile[count] += histogram[i]; @@ -6784,10 +6793,12 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double float val = 0.f; float increment = corr * (1 << histcompr); + for (int i = 0; i < 65536 >> histcompr; i++) { gavg += histogram[i] * Color::gamma2curve[val]; val += increment; } + gavg /= sum; if (black < gavg) { From 74447dff9930229d782b1e3a1e1090a640d1922b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 13 May 2016 21:52:49 +0200 Subject: [PATCH 048/232] cleanup for Ciecam02::curveJfloat(..) --- rtengine/ciecam02.cc | 95 +++++++++++++++++-------------------------- rtengine/ciecam02.h | 2 +- rtengine/improcfun.cc | 4 +- 3 files changed, 41 insertions(+), 60 deletions(-) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 83ff98f95..ae9460bff 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -180,39 +180,36 @@ void Ciecam02::curveJ (double br, double contr, int db, LUTf & outCurve, LUTu & } } -void Ciecam02::curveJfloat (float br, float contr, int db, LUTf & outCurve, LUTu & histogram ) +void Ciecam02::curveJfloat (float br, float contr, LUTf & outCurve, const LUTu & histogram ) { - LUTf dcurve(65536, 0); - int skip = 1; // check if brightness curve is needed if (br > 0.00001f || br < -0.00001f) { - std::vector brightcurvePoints; - brightcurvePoints.resize(9); - brightcurvePoints.at(0) = double(DCT_NURBS); + std::vector brightcurvePoints(9); + brightcurvePoints[0] = double(DCT_NURBS); - brightcurvePoints.at(1) = 0.f; // black point. Value in [0 ; 1] range - brightcurvePoints.at(2) = 0.f; // black point. Value in [0 ; 1] range + brightcurvePoints[1] = 0.f; // black point. Value in [0 ; 1] range + brightcurvePoints[2] = 0.f; // black point. Value in [0 ; 1] range if (br > 0) { - brightcurvePoints.at(3) = 0.1f; // toe point - brightcurvePoints.at(4) = 0.1f + br / 150.0f; //value at toe point + brightcurvePoints[3] = 0.1f; // toe point + brightcurvePoints[4] = 0.1f + br / 150.0f; //value at toe point - brightcurvePoints.at(5) = 0.7f; // shoulder point - brightcurvePoints.at(6) = min(1.0f, 0.7f + br / 300.0f); //value at shoulder point + brightcurvePoints[5] = 0.7f; // shoulder point + brightcurvePoints[6] = min(1.0f, 0.7f + br / 300.0f); //value at shoulder point } else { - brightcurvePoints.at(3) = 0.1f - br / 150.0f; // toe point - brightcurvePoints.at(4) = 0.1f; // value at toe point + brightcurvePoints[3] = 0.1f - br / 150.0f; // toe point + brightcurvePoints[4] = 0.1f; // value at toe point - brightcurvePoints.at(5) = min(1.0f, 0.7f - br / 300.0f); // shoulder point - brightcurvePoints.at(6) = 0.7f; // value at shoulder point + brightcurvePoints[5] = min(1.0f, 0.7f - br / 300.0f); // shoulder point + brightcurvePoints[6] = 0.7f; // value at shoulder point } - brightcurvePoints.at(7) = 1.f; // white point - brightcurvePoints.at(8) = 1.f; // value at white point + brightcurvePoints[7] = 1.f; // white point + brightcurvePoints[8] = 1.f; // value at white point - DiagonalCurve* brightcurve = new DiagonalCurve (brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); + DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS); // Applying brightness curve for (int i = 0; i < 32768; i++) { @@ -221,67 +218,51 @@ void Ciecam02::curveJfloat (float br, float contr, int db, LUTf & outCurve, LUTu float val = (float)i / 32767.0f; // apply brightness curve - val = brightcurve->getVal (val); + val = brightcurve.getVal (val); - // store result in a temporary array - dcurve[i] = CLIPD(val); + // store result + outCurve[i] = CLIPD(val); } - delete brightcurve; } else { - // for (int i=0; i<32768; i++) { // L values range up to 32767, higher values are for highlight overflow - for (int i = 0; i < (32768 * db); i++) { // L values range up to 32767, higher values are for highlight overflow - - // set the identity curve in the temporary array - dcurve[i] = (float)i / (db * 32768.0f); - } + // set the identity curve + outCurve.makeIdentity(32767.f); } if (contr > 0.00001f || contr < -0.00001f) { // compute mean luminance of the image with the curve applied - int sum = 0; - float avg = 0; + float sum, avg; - //float sqavg = 0; - for (int i = 0; i < 32768; i++) { - avg += dcurve[i] * histogram[i];//approximation for average : usage of L (lab) instead of J - sum += histogram[i]; - } + histogram.getSumAndAverage(sum, avg); - avg /= sum; - //printf("avg=%f\n",avg); - std::vector contrastcurvePoints; - contrastcurvePoints.resize(9); - contrastcurvePoints.at(0) = double(DCT_NURBS); + std::vector contrastcurvePoints(9); - contrastcurvePoints.at(1) = 0.f; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(2) = 0.f; // black point. Value in [0 ; 1] range + contrastcurvePoints[0] = double(DCT_NURBS); - contrastcurvePoints.at(3) = avg - avg * (0.6f - contr / 250.0f); // toe point - contrastcurvePoints.at(4) = avg - avg * (0.6f + contr / 250.0f); // value at toe point + contrastcurvePoints[1] = 0.f; // black point. Value in [0 ; 1] range + contrastcurvePoints[2] = 0.f; // black point. Value in [0 ; 1] range - contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6f - contr / 250.0f); // shoulder point - contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6f + contr / 250.0f); // value at shoulder point + contrastcurvePoints[3] = avg - avg * (0.6f - contr / 250.0f); // toe point + contrastcurvePoints[4] = avg - avg * (0.6f + contr / 250.0f); // value at toe point - contrastcurvePoints.at(7) = 1.f; // white point - contrastcurvePoints.at(8) = 1.f; // value at white point + contrastcurvePoints[5] = avg + (1 - avg) * (0.6f - contr / 250.0f); // shoulder point + contrastcurvePoints[6] = avg + (1 - avg) * (0.6f + contr / 250.0f); // value at shoulder point - DiagonalCurve* contrastcurve = new DiagonalCurve (contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); + contrastcurvePoints[7] = 1.f; // white point + contrastcurvePoints[8] = 1.f; // value at white point + + DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS); // apply contrast enhancement - for (int i = 0; i < (32768 * db); i++) { - dcurve[i] = contrastcurve->getVal (dcurve[i]); + for (int i = 0; i < 32768; i++) { + outCurve[i] = contrastcurve.getVal(outCurve[i]); } - delete contrastcurve; } - // for (int i=0; i<32768; i++) outCurve[i] = 32768.0*dcurve[i]; - for (int i = 0; i < (db * 32768); i++) { - outCurve[i] = db * 32768.0f * dcurve[i]; - } + outCurve *= 32767.f; } /** diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index e5b61d466..927b69b0e 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -74,7 +74,7 @@ public: static void curvecolor(double satind, double satval, double &sres, double parsat); static void curvecolorfloat(float satind, float satval, float &sres, float parsat); static void curveJ (double br, double contr, int db, LUTf & outCurve , LUTu & histogram ) ; - static void curveJfloat (float br, float contr, int db, LUTf & outCurve , LUTu & histogram ) ; + static void curveJfloat (float br, float contr, LUTf & outCurve , const LUTu & histogram ) ; /** * Inverse transform from CIECAM02 JCh to XYZ. diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 51c045ab5..786ec0b38 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1790,7 +1790,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float jli = params->colorappearance.jlight; float contra = params->colorappearance.contrast; - Ciecam02::curveJfloat (jli, contra, 1, CAMBrightCurveJ, hist16J);//lightness and contrast J + Ciecam02::curveJfloat (jli, contra, CAMBrightCurveJ, hist16J);//lightness and contrast J } if (needQ) { @@ -1802,7 +1802,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float qbri = params->colorappearance.qbright; float qcontra = params->colorappearance.qcontrast; - Ciecam02::curveJfloat (qbri, qcontra, 1, CAMBrightCurveQ, hist16Q);//brightness and contrast Q + Ciecam02::curveJfloat (qbri, qcontra, CAMBrightCurveQ, hist16Q);//brightness and contrast Q } } From 9da7de408069e021bd6a20a922fb1d7d4f0fec99 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 14 May 2016 12:04:02 +0200 Subject: [PATCH 049/232] Fixed a bug I introduced with last commit and changed argument order of Ciecam02::curveJfloat --- rtengine/ciecam02.cc | 11 ++++++++--- rtengine/ciecam02.h | 2 +- rtengine/improcfun.cc | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index ae9460bff..3bbc261cf 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -180,7 +180,7 @@ void Ciecam02::curveJ (double br, double contr, int db, LUTf & outCurve, LUTu & } } -void Ciecam02::curveJfloat (float br, float contr, LUTf & outCurve, const LUTu & histogram ) +void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve) { // check if brightness curve is needed @@ -233,10 +233,15 @@ void Ciecam02::curveJfloat (float br, float contr, LUTf & outCurve, const LUTu & if (contr > 0.00001f || contr < -0.00001f) { // compute mean luminance of the image with the curve applied - float sum, avg; + float sum = 0.f; + float avg = 0.f; - histogram.getSumAndAverage(sum, avg); + for (int i = 0; i < 32768; i++) { + avg += outCurve[i] * histogram[i];//approximation for average : usage of L (lab) instead of J + sum += histogram[i]; + } + avg /= sum; std::vector contrastcurvePoints(9); contrastcurvePoints[0] = double(DCT_NURBS); diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 927b69b0e..199d03f59 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -74,7 +74,7 @@ public: static void curvecolor(double satind, double satval, double &sres, double parsat); static void curvecolorfloat(float satind, float satval, float &sres, float parsat); static void curveJ (double br, double contr, int db, LUTf & outCurve , LUTu & histogram ) ; - static void curveJfloat (float br, float contr, LUTf & outCurve , const LUTu & histogram ) ; + static void curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve ) ; /** * Inverse transform from CIECAM02 JCh to XYZ. diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 786ec0b38..eb95510be 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1790,7 +1790,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float jli = params->colorappearance.jlight; float contra = params->colorappearance.contrast; - Ciecam02::curveJfloat (jli, contra, CAMBrightCurveJ, hist16J);//lightness and contrast J + Ciecam02::curveJfloat (jli, contra, hist16J, CAMBrightCurveJ);//lightness and contrast J } if (needQ) { @@ -1802,7 +1802,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float qbri = params->colorappearance.qbright; float qcontra = params->colorappearance.qcontrast; - Ciecam02::curveJfloat (qbri, qcontra, CAMBrightCurveQ, hist16Q);//brightness and contrast Q + Ciecam02::curveJfloat (qbri, qcontra, hist16Q, CAMBrightCurveQ);//brightness and contrast Q } } From 56804fca6935d6ae0a07b6f9d5ecb805a0c7f7ce Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 14 May 2016 13:17:17 +0200 Subject: [PATCH 050/232] use LUTf.makeIdentity() --- rtengine/ipvibrance.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index 3e6ff97f2..1d152c737 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -59,9 +59,7 @@ void fillCurveArrayVib(DiagonalCurve* diagCurve, LUTf &outCurve) outCurve[i] = 65535.f * diagCurve->getVal( double(i) / 65535.0 ); } } else { - for (int i = 0; i <= 0xffff; i++) { - outCurve[i] = float(i); - } + outCurve.makeIdentity(); } } From e8d90698cfe2bfb5c5a05ffe4d7b4cf113829c8f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 14 May 2016 14:26:56 +0200 Subject: [PATCH 051/232] Fix copy/paste bugs --- rtengine/clutstore.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 5fd2cfae3..e8f1c920e 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -95,12 +95,12 @@ vfloat2 getClutValues(const AlignedBuffer& clut_image, size_t ind v_high = _mm_shufflelo_epi16(v_high, _MM_SHUFFLE(1, 1, 0, 0)); v_low = _mm_shufflehi_epi16(v_low, _MM_SHUFFLE(3, 3, 2, 2)); v_high = _mm_shufflehi_epi16(v_high, _MM_SHUFFLE(3, 3, 2, 2)); - v_low = vandm(v_low, m_mask); + v_low = vandm(v_low, v_mask); v_high = vandm(v_high, v_mask); return { - _mm_cvtepi32_ps(lowval), - _mm_cvtepi32_ps(highval) + _mm_cvtepi32_ps(v_low), + _mm_cvtepi32_ps(v_high) }; #endif } From 80f86c7189c4b88ee51fddbef5874e312aedf648 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 14 May 2016 19:29:26 +0200 Subject: [PATCH 052/232] Histogram of working space does not show 'gray2C' for gray regions, fixes #3283, fixes #3213, kudos to mmmtok for providing the patch --- rtengine/iplab2rgb.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 21e5ca794..79a45c99e 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -202,7 +202,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, } } else { - const auto rgb_xyz = iccStore->workingSpaceMatrix (profile); + const auto xyz_rgb = iccStore->workingSpaceInverseMatrix (profile); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) @@ -227,7 +227,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, float z_ = 65535.0 * Color::f2xyz(fz) * Color::D50z; float y_ = (LL > Color::epskap) ? 65535.0 * fy * fy * fy : 65535.0 * LL / Color::kappa; - Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyz); + Color::xyz2rgb(x_, y_, z_, R, G, B, xyz_rgb); image->data[ix++] = (int)Color::gamma2curve[CLIP(R)] >> 8; image->data[ix++] = (int)Color::gamma2curve[CLIP(G)] >> 8; From b23778eebc405977fc79e8ccf2b309afb7f66433 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 15 May 2016 16:07:23 +0200 Subject: [PATCH 053/232] Speedup for flatcurves and NURBS curves getval() functions --- rtengine/curves.cc | 12 ++++++++++++ rtengine/curves.h | 4 +++- rtengine/diagonalcurves.cc | 18 +++++++++--------- rtengine/flatcurves.cc | 31 ++++++------------------------- 4 files changed, 30 insertions(+), 35 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 568f1e8ea..a5214e451 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -70,6 +70,18 @@ void Curve::AddPolygons () poly_y.push_back(y3); } +void Curve::fillDyByDx () +{ + dyByDx.resize(poly_x.size() - 1); + + for(unsigned int i = 0; i < poly_x.size() - 1; i++) { + double dx = poly_x[i + 1] - poly_x[i]; + double dy = poly_y[i + 1] - poly_y[i]; + dyByDx[i] = dy / dx; + + } +} + void Curve::fillHash() { hash.resize(hashSize + 2); diff --git a/rtengine/curves.h b/rtengine/curves.h index d841b2eb1..d5e1412eb 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -336,6 +336,7 @@ protected: // end of variables used in Parametric curves only std::vector poly_x; // X points of the faceted curve std::vector poly_y; // Y points of the faceted curve + std::vector dyByDx; std::vector hash; unsigned short hashSize; // hash table's size, between [10, 100, 1000] @@ -369,6 +370,7 @@ protected: } void fillHash(); + void fillDyByDx(); public: Curve (); @@ -406,7 +408,7 @@ public: class FlatCurve : public Curve { -protected: +private: FlatCurveType kind; double* leftTangent; double* rightTangent; diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 4b41c2c29..19c662c0b 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -72,11 +72,15 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) if(x[0] == 0.f && x[1] == 0.f) // Avoid crash when first two points are at x = 0 (git Issue 2888) + { x[1] = 0.01f; + } if(x[0] == 1.f && x[1] == 1.f) // Avoid crash when first two points are at x = 1 (100 in gui) (git Issue 2923) + { x[0] = 0.99f; + } if (!identity) { if (kind == DCT_Spline && N > 2) { @@ -260,6 +264,8 @@ void DiagonalCurve::NURBS_set () // adding the final horizontal segment, always (see under) poly_x.push_back(3.0); // 3.0 is a hack for optimization purpose of the getVal method (the last value has to be beyond the normal range) poly_y.push_back(y[N - 1]); + + fillDyByDx(); } double DiagonalCurve::getVal (double t) const @@ -303,7 +309,7 @@ double DiagonalCurve::getVal (double t) const // do a binary search for the right interval: unsigned int k_lo = 0, k_hi = N - 1; - while (k_hi - k_lo > 1) { + while (k_hi > 1 + k_lo) { unsigned int k = (k_hi + k_lo) / 2; if (x[k] > t) { @@ -347,7 +353,7 @@ double DiagonalCurve::getVal (double t) const k_hi = hash.at(i).higherValue; // do a binary search for the right interval : - while (k_hi - k_lo > 1) { + while (k_hi > 1 + k_lo) { unsigned int k = (k_hi + k_lo) / 2; if (poly_x[k] > t) { @@ -357,13 +363,7 @@ double DiagonalCurve::getVal (double t) const } } - if (k_lo == k_hi) { - k_hi = k_lo + 1; - } - - double dx = poly_x[k_hi] - poly_x[k_lo]; - double dy = poly_y[k_hi] - poly_y[k_lo]; - return poly_y[k_lo] + (t - poly_x[k_lo]) * ( dy ) / dx; + return poly_y[k_lo] + (t - poly_x[k_lo]) * dyByDx[k_lo]; break; } diff --git a/rtengine/flatcurves.cc b/rtengine/flatcurves.cc index ee4d6d29c..5a4dfeacf 100644 --- a/rtengine/flatcurves.cc +++ b/rtengine/flatcurves.cc @@ -16,21 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include #include "curves.h" #include #include -#include "mytime.h" -#include - -#include -#include namespace rtengine { -FlatCurve::FlatCurve (const std::vector& p, bool isPeriodic, int poly_pn) : kind(FCT_Empty), leftTangent(NULL), rightTangent(NULL), identityValue(0.5), periodic(isPeriodic) +FlatCurve::FlatCurve (const std::vector& p, bool isPeriodic, int poly_pn) : kind(FCT_Empty), leftTangent(nullptr), rightTangent(nullptr), identityValue(0.5), periodic(isPeriodic) { ppn = poly_pn > 65500 ? 65500 : poly_pn; @@ -341,17 +334,7 @@ void FlatCurve::CtrlPoints_set () poly_x.push_back(3.0); // 3.0 is a hack for optimization purpose of the getVal method (the last value has to be beyond the normal range) poly_y.push_back(sc_y[j - 1]); - /* - // Checking the values - Glib::ustring fname = "Curve.xyz"; // TopSolid'Design "plot" file format - std::ofstream f (fname.c_str()); - f << "$" << std::endl;; - for (unsigned int iter = 0; iter < poly_x.size(); iter++) { - f << poly_x[iter] << ", " << poly_y[iter] << ", 0." << std::endl;; - } - f << "$" << std::endl;; - f.close (); - */ + fillDyByDx(); } double FlatCurve::getVal (double t) const @@ -367,10 +350,10 @@ double FlatCurve::getVal (double t) const } // do a binary search for the right interval: - int k_lo = 0, k_hi = poly_x.size() - 1; + unsigned int k_lo = 0, k_hi = poly_x.size() - 1; - while (k_hi - k_lo > 1) { - int k = (k_hi + k_lo) / 2; + while (k_hi > 1 + k_lo) { + unsigned int k = (k_hi + k_lo) / 2; if (poly_x[k] > t) { k_hi = k; @@ -379,9 +362,7 @@ double FlatCurve::getVal (double t) const } } - double dx = poly_x[k_hi] - poly_x[k_lo]; - double dy = poly_y[k_hi] - poly_y[k_lo]; - return poly_y[k_lo] + (t - poly_x[k_lo]) * dy / dx; + return poly_y[k_lo] + (t - poly_x[k_lo]) * dyByDx[k_lo]; break; } From 20aec5b1291052cb046b742d3f4704bfb0d23193 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 16 May 2016 18:20:42 +0200 Subject: [PATCH 054/232] Cleanup and small improvements for ciecam02 --- rtengine/LUT.h | 16 +++ rtengine/ciecam02.cc | 2 +- rtengine/ciecam02.h | 2 +- rtengine/improcfun.cc | 303 +++++++++++++++++++----------------------- 4 files changed, 152 insertions(+), 171 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 6676e38a7..ecf5aa6cc 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -261,6 +261,22 @@ public: return *this; } + // divide all elements of LUT by a constant float value + template::value>::type> + LUT & operator/=(float divisor) + { +#ifdef _OPENMP + #pragma omp simd +#endif + + for(unsigned int i = 0; i < this->size; i++) { + data[i] /= divisor; + } + + return *this; + } + + // use with integer indices T& operator[](int index) const { diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 3bbc261cf..f10ae4b31 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -843,7 +843,7 @@ void Ciecam02::xyz2jchqms_ciecam02( double &J, double &C, double &h, double &Q, h = myh; } -void Ciecam02::xyz2jchqms_ciecam02float( float &J, float &C, float &h, float &Q, float &M, float &s, float &aw, float &fl, float &wh, +void Ciecam02::xyz2jchqms_ciecam02float( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, float c, float nc, int gamu, float pow1, float nbb, float ncb, float pfl, float cz, float d) diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 199d03f59..a551b2504 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -125,7 +125,7 @@ public: float c, float nc, float n, float nbb, float ncb, float cz, float d ); static void xyz2jchqms_ciecam02float( float &J, float &C, float &h, - float &Q, float &M, float &s, float &aw, float &fl, float &wh, + float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, float c, float nc, int gamu, float n, float nbb, float ncb, float pfl, float cz, float d ); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index eb95510be..ae7d370f3 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -55,15 +55,15 @@ extern const Settings* settings; ImProcFunctions::~ImProcFunctions () { - if (monitorTransform != NULL) { + if (monitorTransform) { cmsDeleteTransform (monitorTransform); } - if (output2monitorTransform != NULL) { + if (output2monitorTransform) { cmsDeleteTransform (output2monitorTransform); } - if (lab2outputTransform != NULL) { + if (lab2outputTransform) { cmsDeleteTransform (lab2outputTransform); } } @@ -76,21 +76,21 @@ void ImProcFunctions::setScale (double iscale) void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent) { // set up monitor transform - if (monitorTransform != NULL) { + if (monitorTransform) { cmsDeleteTransform (monitorTransform); } - if (output2monitorTransform != NULL) { + if (output2monitorTransform) { cmsDeleteTransform (output2monitorTransform); } - if (lab2outputTransform != NULL) { + if (lab2outputTransform) { cmsDeleteTransform (lab2outputTransform); } - monitorTransform = NULL; - output2monitorTransform = NULL; - lab2outputTransform = NULL; + monitorTransform = nullptr; + output2monitorTransform = nullptr; + lab2outputTransform = nullptr; #if !defined(__APPLE__) // No support for monitor profiles on OS X, all data is sRGB @@ -98,7 +98,7 @@ void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, con if (monitor) { MyMutex::MyLock lcmsLock (*lcmsMutex); - cmsHPROFILE iprof = cmsCreateLab4Profile(NULL); + cmsHPROFILE iprof = cmsCreateLab4Profile(nullptr); monitorTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_8, monitorIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is for thread safety, NOOPTIMIZE for precision @@ -1440,8 +1440,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, int scalecd, int rtt) { if(params->colorappearance.enabled) { -//int lastskip; -//if(rtt==1) {lastskip=scalecd;} //not for Rtthumbnail #ifdef _DEBUG MyTime t1e, t2e; @@ -1466,12 +1464,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int float Yw; Yw = 1.0; double Xw, Zw; - float f, nc, yb, la, c, xw, yw, zw, f2, c2, nc2, yb2, la2; + float f, nc, yb, la, c, xw, yw, zw, f2, c2, nc2, yb2; float fl, n, nbb, ncb, aw; //d float xwd, ywd, zwd; int alg = 0; bool algepd = false; - float sum = 0.f; const bool epdEnabled = params->epd.enabled; bool ciedata = (params->colorappearance.datacie && pW != 1) && !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) @@ -1518,7 +1515,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(params->colorappearance.algo == "QM") { alg = 2; algepd = true; - } else if(params->colorappearance.algo == "ALL") { + } else { /*if(params->colorappearance.algo == "ALL")*/ alg = 3; algepd = true; } @@ -1552,7 +1549,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int xwd = 95.04f; //fluo F7 ywd = 100.0f; zwd = 108.75f; - } else if(settings->viewingdevice == 7) { + } else { /*if(settings->viewingdevice == 7) */ xwd = 100.96f; //fluo F11 ywd = 100.0f; zwd = 64.35f; @@ -1572,7 +1569,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int yb2 = 23.0f; } else if(settings->viewingdevicegrey == 5) { yb2 = 30.0f; - } else if(settings->viewingdevicegrey == 6) { + } else { /* if(settings->viewingdevicegrey == 6)*/ yb2 = 40.0f; } @@ -1585,7 +1582,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } } - la2 = float(params->colorappearance.adaplum); + const float la2 = float(params->colorappearance.adaplum); // level of adaptation const float deg = (params->colorappearance.degree) / 100.0f; @@ -1667,17 +1664,82 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int const ColorAppearanceParams::eCTCModeId curveMode3 = params->colorappearance.curveMode3; const bool hasColCurve3 = bool(customColCurve3); - bool c1s = false; - bool c1co = false; - if( hasColCurve3 && curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { - c1s = true; + if(settings->viewinggreySc == 0) { //auto + if (mean < 15.f) { + yb = 3.0f; + } else if(mean < 30.f) { + yb = 5.0f; + } else if(mean < 40.f) { + yb = 10.0f; + } else if(mean < 45.f) { + yb = 15.0f; + } else if(mean < 50.f) { + yb = 18.0f; + } else if(mean < 55.f) { + yb = 23.0f; + } else if(mean < 60.f) { + yb = 30.0f; + } else if(mean < 70.f) { + yb = 40.0f; + } else if(mean < 80.f) { + yb = 60.0f; + } else if(mean < 90.f) { + yb = 80.0f; + } else { + yb = 90.0f; + } + } else if(settings->viewinggreySc == 1) { + yb = 18.0f; //fixed } - if(hasColCurve3 && curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { - c1co = true; + + const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated + + const int gamu = (params->colorappearance.gamut == true) ? 1 : 0; + xw = 100.0f * Xw; + yw = 100.0f * Yw; + zw = 100.0f * Zw; + float xw1, yw1, zw1, xw2, yw2, zw2; + + // settings of WB: scene and viewing + if(params->colorappearance.wbmodel == "RawT") { + xw1 = 96.46f; //use RT WB; CAT 02 is used for output device (see prefreneces) + yw1 = 100.0f; + zw1 = 82.445f; + xw2 = xwd; + yw2 = ywd; + zw2 = zwd; + } else if(params->colorappearance.wbmodel == "RawTCAT02") { + xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences + yw1 = yw; + zw1 = zw; + xw2 = xwd; + yw2 = ywd; + zw2 = zwd; } + float cz, wh, pfl; + Ciecam02::initcam1float(gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); + const float pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f ); + float nj, dj, nbbj, ncbj, czj, awj, flj; + Ciecam02::initcam2float(gamu, yb2, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); + const float reccmcz = 1.f / (c2 * czj); + const float pow1n = pow_F( 1.64f - pow_F( 0.29f, nj ), 0.73f ); + + const float epsil = 0.0001f; + const float w_h = wh + epsil; + const float coefQ = 32767.f / wh; + const float a_w = aw; + const float c_ = c; + const float f_l = fl; + const float coe = pow_F(fl, 0.25f); + const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; + const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) + || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); + + if(CAMBrightCurveJ.dirty || CAMBrightCurveQ.dirty) { bool needJ = (alg == 0 || alg == 1 || alg == 3); bool needQ = (alg == 2 || alg == 3); @@ -1694,6 +1756,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int hist16Q.clear(); } + float sum = 0.f; + #ifdef _OPENMP const int numThreads = min(max(width * height / 65536, 1), omp_get_max_threads()); #pragma omp parallel num_threads(numThreads) if(numThreads>1) @@ -1788,96 +1852,21 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int CAMBrightCurveJ.dirty = false; } - float jli = params->colorappearance.jlight; - float contra = params->colorappearance.contrast; - Ciecam02::curveJfloat (jli, contra, hist16J, CAMBrightCurveJ);//lightness and contrast J + Ciecam02::curveJfloat (params->colorappearance.jlight, params->colorappearance.contrast, hist16J, CAMBrightCurveJ);//lightness and contrast J + CAMBrightCurveJ /= 327.68f; } if (needQ) { if (!CAMBrightCurveQ) { CAMBrightCurveQ(32768, LUT_CLIP_ABOVE); - CAMBrightCurveQ.clear(); CAMBrightCurveQ.dirty = false; } - float qbri = params->colorappearance.qbright; - float qcontra = params->colorappearance.qcontrast; - Ciecam02::curveJfloat (qbri, qcontra, hist16Q, CAMBrightCurveQ);//brightness and contrast Q + Ciecam02::curveJfloat (params->colorappearance.qbright, params->colorappearance.qcontrast, hist16Q, CAMBrightCurveQ);//brightness and contrast Q + CAMBrightCurveQ /= coefQ; } } - if(settings->viewinggreySc == 0) { //auto - if (mean < 15.f) { - yb = 3.0f; - } else if(mean < 30.f) { - yb = 5.0f; - } else if(mean < 40.f) { - yb = 10.0f; - } else if(mean < 45.f) { - yb = 15.0f; - } else if(mean < 50.f) { - yb = 18.0f; - } else if(mean < 55.f) { - yb = 23.0f; - } else if(mean < 60.f) { - yb = 30.0f; - } else if(mean < 70.f) { - yb = 40.0f; - } else if(mean < 80.f) { - yb = 60.0f; - } else if(mean < 90.f) { - yb = 80.0f; - } else { - yb = 90.0f; - } - } else if(settings->viewinggreySc == 1) { - yb = 18.0f; //fixed - } - - - const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated - - const int gamu = (params->colorappearance.gamut == true) ? 1 : 0; - xw = 100.0f * Xw; - yw = 100.0f * Yw; - zw = 100.0f * Zw; - float xw1, yw1, zw1, xw2, yw2, zw2; - - // settings of WB: scene and viewing - if(params->colorappearance.wbmodel == "RawT") { - xw1 = 96.46f; //use RT WB; CAT 02 is used for output device (see prefreneces) - yw1 = 100.0f; - zw1 = 82.445f; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } else if(params->colorappearance.wbmodel == "RawTCAT02") { - xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences - yw1 = yw; - zw1 = zw; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } - - float cz, wh, pfl; - Ciecam02::initcam1float(gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); - const float pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f ); - float nj, dj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float(gamu, yb2, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); - const float reccmcz = 1.f / (c2 * czj); - const float pow1n = pow_F( 1.64f - pow_F( 0.29f, nj ), 0.73f ); - - const float epsil = 0.0001f; - const float w_h = wh + epsil; - const float a_w = aw; - const float c_ = c; - const float f_l = fl; - const float coe = pow_F(fl, 0.25f); - const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; - const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) - || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); //matrix for current working space TMatrix wiprof = iccStore->workingSpaceInverseMatrix (params->icm.working); @@ -2001,18 +1990,16 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int // we cannot have all algorithms with all chroma curves if(alg == 0) { - Jpro = CAMBrightCurveJ[Jpro * 327.68f] / 327.68f; //lightness CIECAM02 + contrast + Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //lightness CIECAM02 + contrast Qpro = QproFactor * sqrtf(Jpro); float Cp = (spro * spro * Qpro) / (1000000.f); Cpro = Cp * 100.f; float sres; Ciecam02::curvecolorfloat(chr, Cp , sres, 1.8f); Color::skinredfloat(Jpro, hpro, sres, Cp, 55.f, 30.f, 1, rstprotection, 100.f, Cpro); - } - - if(alg == 1) { + } else if(alg == 1) { // Lightness saturation - Jpro = CAMBrightCurveJ[Jpro * 327.68f] / 327.68f; //lightness CIECAM02 + contrast + Jpro = CAMBrightCurveJ[Jpro * 327.68f]; //lightness CIECAM02 + contrast float sres; float Sp = spro / 100.0f; float parsat = 1.5f; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) @@ -2025,8 +2012,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int Qpro = QproFactor * sqrtf(Jpro); Cpro = (spro * spro * Qpro) / (10000.0f); } else if(alg == 2) { - float coef = 32767.f / wh; - Qpro = (CAMBrightCurveQ[(float)(Qpro * coef)]) / coef; //brightness and contrast + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)]; //brightness and contrast float Mp, sres; Mp = Mpro / 100.0f; Ciecam02::curvecolorfloat(mchr, Mp , sres, 2.5f); @@ -2039,14 +2025,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int Cpro = Mpro / coe; Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero spro = 100.0f * sqrtf( Mpro / Qpro ); - } else if(alg == 3) { - float coef = 32760.f / wh; - - if(Qpro * coef >= 32767.0f) { - Qpro = (CAMBrightCurveQ[32767]) / coef; //brightness and contrast - } else { - Qpro = (CAMBrightCurveQ[(float)(Qpro * coef)]) / coef; //brightness and contrast - } + } else { /*if(alg == 3) */ + Qpro = CAMBrightCurveQ[(float)(Qpro * coefQ)]; //brightness and contrast float Mp, sres; Mp = Mpro / 100.0f; @@ -2065,7 +2045,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int Jpro = 99.9f; } - Jpro = (CAMBrightCurveJ[(float)(Jpro * 327.68f)]) / 327.68f; //lightness CIECAM02 + contrast + Jpro = CAMBrightCurveJ[(float)(Jpro * 327.68f)]; //lightness CIECAM02 + contrast float Sp = spro / 100.0f; Ciecam02::curvecolorfloat(schr, Sp , sres, 1.5f); dred = 100.f; // in C mode @@ -2284,7 +2264,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int Color::skinredfloat(Jpro, hpro, Ss, Sold, dred, protect_red, sk, rstprotection, ko, spro); Qpro = ( 4.0f / c ) * sqrtf( Jpro / 100.0f ) * ( aw + 4.0f ) ; Cpro = (spro * spro * Qpro) / (10000.0f); - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { // float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; @@ -2299,7 +2278,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int sk = 0; float ko = 1.f / coef; Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); - Cpro = Mpro / coe; if(Jpro < 1.f && Mpro > 12.f * coe) { Mpro = 12.f * coe; //reduce artifacts by "pseudo gamut control CIECAM" @@ -2310,20 +2288,13 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(Jpro < 7.f && Mpro > 50.f * coe) { Mpro = 50.f * coe; } + + Cpro = Mpro / coe; } } //to retrieve the correct values of variables - if(c1s) { - Qpro = ( 4.0f / c ) * sqrtf( Jpro / 100.0f ) * ( aw + 4.0f ) ; //for saturation curve - Cpro = (spro * spro * Qpro) / (10000.0f); - } - - if(c1co) { - float coe = pow_F(fl, 0.25f); - Cpro = Mpro / coe; - } // for colorfullness curve //retrieve values C,J...s C = Cpro; @@ -2405,9 +2376,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int xw2, yw2, zw2, f2, c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x, y, z; - x = (float)xx * 655.35f; - y = (float)yy * 655.35f; - z = (float)zz * 655.35f; + x = xx * 655.35f; + y = yy * 655.35f; + z = zz * 655.35f; float Ll, aa, bb; //convert xyz=>lab Color::XYZ2Lab(x, y, z, Ll, aa, bb); @@ -2677,14 +2648,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int //EPDToneMapCIE adated to CIECAM - const float eps = 0.0001f; + constexpr float eps = 0.0001f; const float co_e = (pow_F(f_l, 0.25f)) + eps; - TMatrix wiprofa = iccStore->workingSpaceInverseMatrix (params->icm.working); - const float wipa[3][3] = { - {float(wiprofa[0][0]), float(wiprofa[0][1]), float(wiprofa[0][2])}, - {float(wiprofa[1][0]), float(wiprofa[1][1]), float(wiprofa[1][2])}, - {float(wiprofa[2][0]), float(wiprofa[2][1]), float(wiprofa[2][2])} - }; #ifndef _DEBUG #pragma omp parallel @@ -2788,10 +2753,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int bool neg = false; bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly(sincosval, Lprov1, Chprov1, wipa, highlight, 0.15f, 0.96f, neg, more_rgb); + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else //gamut control : Lab values are in gamut - Color::gamutLchonly(sincosval, Lprov1, Chprov1, wipa, highlight, 0.15f, 0.96f); + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); #endif lab->L[i][j] = Lprov1 * 327.68f; @@ -2850,10 +2815,10 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int bool neg = false; bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly(sincosval, Lprov1, Chprov1, wipa, highlight, 0.15f, 0.96f, neg, more_rgb); + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else //gamut control : Lab values are in gamut - Color::gamutLchonly(sincosval, Lprov1, Chprov1, wipa, highlight, 0.15f, 0.96f); + Color::gamutLchonly(sincosval, Lprov1, Chprov1, wip, highlight, 0.15f, 0.96f); #endif lab->L[i][j] = Lprov1 * 327.68f; lab->a[i][j] = 327.68f * Chprov1 * sincosval.y; @@ -2989,12 +2954,12 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf) { - Imagefloat *tmpImage = NULL; + Imagefloat *tmpImage = nullptr; // NOTE: We're getting all 3 pointers here, but this function may not need them all, so one could optimize this - Imagefloat* editImgFloat = NULL; - LabImage* editLab = NULL; - PlanarWhateverData* editWhatever = NULL; + Imagefloat* editImgFloat = nullptr; + LabImage* editLab = nullptr; + PlanarWhateverData* editWhatever = nullptr; EditUniqueID editID = pipetteBuffer ? pipetteBuffer->getEditID() : EUID_None; if (editID != EUID_None) { @@ -3020,8 +2985,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer s_th = params->sh.stonalwidth * (shmap->avg - shmap->min_f) / 100; } - bool processSH = params->sh.enabled && shmap != NULL && (params->sh.highlights > 0 || params->sh.shadows > 0); - bool processLCE = params->sh.enabled && shmap != NULL && params->sh.localcontrast > 0; + bool processSH = params->sh.enabled && shmap && (params->sh.highlights > 0 || params->sh.shadows > 0); + bool processLCE = params->sh.enabled && shmap && params->sh.localcontrast > 0; double lceamount = params->sh.localcontrast / 200.0; TMatrix wprof = iccStore->workingSpaceMatrix (params->icm.working); @@ -3081,7 +3046,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hCurve->isIdentity()) { delete hCurve; - hCurve = NULL; + hCurve = nullptr; hCurveEnabled = false; } } @@ -3091,7 +3056,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (sCurve->isIdentity()) { delete sCurve; - sCurve = NULL; + sCurve = nullptr; sCurveEnabled = false; } } @@ -3101,7 +3066,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (vCurve->isIdentity()) { delete vCurve; - vCurve = NULL; + vCurve = nullptr; vCurveEnabled = false; } } @@ -3111,7 +3076,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (bwlCurve->isIdentity()) { delete bwlCurve; - bwlCurve = NULL; + bwlCurve = nullptr; bwlCurveEnabled = false; } } @@ -3296,8 +3261,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #endif { char *buffer; - char *editIFloatBuffer = NULL; - char *editWhateverBuffer = NULL; + char *editIFloatBuffer = nullptr; + char *editWhateverBuffer = nullptr; buffer = (char *) malloc(3 * sizeof(float) * TS * TS + 20 * 64 + 63); char *data; @@ -3439,7 +3404,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (dcpProf != NULL) { + if (dcpProf) { dcpProf->step2ApplyTile(rtemp, gtemp, btemp, tW - jstart, tH - istart, TS); } @@ -5426,9 +5391,9 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu //init Flatcurve for C=f(H) // NOTE: We're getting all 3 pointers here, but this function may not need them all, so one could optimize this - Imagefloat* editImgFloat = NULL; - LabImage* editLab = NULL; - PlanarWhateverData* editWhatever = NULL; + Imagefloat* editImgFloat = nullptr; + LabImage* editLab = nullptr; + PlanarWhateverData* editWhatever = nullptr; EditUniqueID editID = EUID_None; bool editPipette = false; @@ -5454,7 +5419,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } - FlatCurve* chCurve = NULL;// curve C=f(H) + FlatCurve* chCurve = nullptr;// curve C=f(H) bool chutili = false; if (params->labCurve.chromaticity > -100) { @@ -5463,7 +5428,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu if (!chCurve || chCurve->isIdentity()) { if (chCurve) { delete chCurve; - chCurve = NULL; + chCurve = nullptr; } }//do not use "Munsell" if Chcurve not used else { @@ -5471,7 +5436,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } - FlatCurve* lhCurve = NULL;//curve L=f(H) + FlatCurve* lhCurve = nullptr;//curve L=f(H) bool lhutili = false; if (params->labCurve.chromaticity > -100) { @@ -5480,7 +5445,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu if (!lhCurve || lhCurve->isIdentity()) { if (lhCurve) { delete lhCurve; - lhCurve = NULL; + lhCurve = nullptr; } }//do not use "Munsell" if Chcurve not used else { @@ -5488,7 +5453,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } - FlatCurve* hhCurve = NULL;//curve H=f(H) + FlatCurve* hhCurve = nullptr;//curve H=f(H) bool hhutili = false; if (params->labCurve.chromaticity > -100) { @@ -5497,7 +5462,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu if (!hhCurve || hhCurve->isIdentity()) { if (hhCurve) { delete hhCurve; - hhCurve = NULL; + hhCurve = nullptr; } }//do not use "Munsell" if Chcurve not used else { @@ -6884,13 +6849,13 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si Thumbnail* thumb = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, w_thumb, h_thumb, 1, FALSE); - if (thumb == NULL) { + if (!thumb) { return 0.0; } Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, 1.0, FALSE); - if (raw == NULL) { + if (!raw) { delete thumb; return 0.0; } @@ -6914,7 +6879,7 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si thumbGray = thumb->getGrayscaleHistEQ (width); rawGray = raw->getGrayscaleHistEQ (width); - if (thumbGray == NULL || rawGray == NULL) { + if (!thumbGray || !rawGray) { if (thumbGray) { delete thumbGray; } From 89a7ebac166483a6f3deb5bd139a4c5917083558 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 16 May 2016 19:13:35 +0200 Subject: [PATCH 055/232] fix wrong condition in Color::transitred --- rtengine/color.cc | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index dc0710a2f..3684891df 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1844,21 +1844,13 @@ void Color::transitred (const float HH, float const Chprov1, const float dred, c if(HH >= 0.15f && HH < 1.3f) { if (Chprov1 < dred) { factor = factorskin; - } else if(Chprov1 < (dred + protect_red)) - // factor = (factorsat-factorskin)/protect_red*Chprov1+factorsat-(dred+protect_red)*(factorsat-factorskin)/protect_red; - // optimized formula - { + } else if(Chprov1 < (dred + protect_red)) { factor = ((factorsat - factorskin) * Chprov1 + factorsat * protect_red - (dred + protect_red) * (factorsat - factorskin)) / protect_red; } - } - // then test if chroma is in the extanded range - else if ( HH > (0.15f - deltaHH) || HH < (1.3f + deltaHH) ) { + } else if ( HH > (0.15f - deltaHH) && HH < (1.3f + deltaHH) ) { // test if chroma is in the extended range if (Chprov1 < dred) { factor = factorskinext; // C=dred=55 => real max of skin tones - } else if (Chprov1 < (dred + protect_red)) // transition - // factor = (factorsat-factorskinext)/protect_red*Chprov1+factorsat-(dred+protect_red)*(factorsat-factorskinext)/protect_red; - // optimized formula - { + } else if (Chprov1 < (dred + protect_red)) {// transition factor = ((factorsat - factorskinext) * Chprov1 + factorsat * protect_red - (dred + protect_red) * (factorsat - factorskinext)) / protect_red; } } From 68a77f26f631651c11716d3f609eedc8dea8a0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 17 May 2016 20:51:14 +0200 Subject: [PATCH 056/232] Fix std::out_of_range exception with empty HaldCLUT basename User jgschaefer [reported an error on pixls.us](https://discuss.pixls.us/t/rt-build-from-git-crash-on-launch-debian-testing-64-bit/1425) which could be traced down to an empty basename for a HaldCLUT. The original implementation did not throw an exception due to the use of `std::string::substr()` instead of `std::string::erase()`, but silently assigned the first working profile to `profile_name`. --- rtengine/clutstore.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index e8f1c920e..f3ef27a79 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -283,11 +283,16 @@ void rtengine::HaldCLUT::splitClutFilename( profile_name = "sRGB"; - for (const auto& working_profile : rtengine::getWorkingProfiles()) { - if (std::search(name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend()) == name.rbegin()) { - profile_name = working_profile; - name.erase(name.size() - working_profile.size()); - break; + if (!name.empty()) { + for (const auto& working_profile : rtengine::getWorkingProfiles()) { + if ( + !working_profile.empty() // This isn't strictly needed, but an empty wp name should be skipped anyway + && std::search(name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend()) == name.rbegin() + ) { + profile_name = working_profile; + name.erase(name.size() - working_profile.size()); + break; + } } } } From 53f03bd00cf337d0743eb2009094047ca8bb8184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 18 May 2016 20:57:46 +0200 Subject: [PATCH 057/232] Fix ODR violation When building with LTO, the compiler warns about a violation of the ODR. This commit fixes the two competing places by moving the structs into anonymous namespaces. --- rtengine/jdatasrc.cc | 4 ++++ rtengine/jpeg_memsrc.cc | 3 +++ 2 files changed, 7 insertions(+) diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index c8567387b..ff509301d 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -32,6 +32,8 @@ /* Expanded data source object for stdio input */ +namespace +{ typedef struct { struct jpeg_source_mgr pub; /* public fields */ @@ -44,6 +46,8 @@ typedef struct { typedef my_source_mgr * my_src_ptr; +} + #define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ diff --git a/rtengine/jpeg_memsrc.cc b/rtengine/jpeg_memsrc.cc index 75a0b25bc..ab4ecf7d6 100644 --- a/rtengine/jpeg_memsrc.cc +++ b/rtengine/jpeg_memsrc.cc @@ -26,6 +26,8 @@ /* Expanded data source object for memory input */ +namespace +{ typedef struct { struct jpeg_source_mgr pub; /* public fields */ @@ -36,6 +38,7 @@ typedef struct { typedef my_source_mgr * my_src_ptr; +} /* * Initialize source --- called by jpeg_read_header From c556771843cd7d39ff90144b9ea352c32cbf740d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 18 May 2016 21:16:27 +0200 Subject: [PATCH 058/232] Prevent narrowing conversion when building for PowerPC --- rtengine/iccstore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 66099199c..82f280e54 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -263,7 +263,7 @@ cmsHPROFILE ICCStore::makeStdGammaProfile (cmsHPROFILE iprof) tags[i].sig == 0x6B545243) { // kTRC if (gamma_offset == 0) { gamma_offset = offset; - uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(gamma_size == 12 ? 0 : 1) }; + uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(gamma_size == 12 ? 0U : 1U) }; memcpy(&nd[offset], pcurve, 12); if (gamma_size == 14) { From 7d97d0da9311650331869db594574452524c91d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20P=C3=A9rez?= Date: Thu, 19 May 2016 15:23:37 +0200 Subject: [PATCH 059/232] Use "find_program" to search for git executable CMake's "find_file" can return non-executable files or folders, thus "find_program" must be used to ensure that only executable files are detected. Fixes issue #3290 --- AboutThisBuild.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AboutThisBuild.cmake b/AboutThisBuild.cmake index 68dea478d..2163ed0cb 100644 --- a/AboutThisBuild.cmake +++ b/AboutThisBuild.cmake @@ -5,13 +5,13 @@ find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAU 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_file(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) + find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) elseif (APPLE) - find_file(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") - find_file(GIT_CMD git) + 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_file(GIT_CMD git) + find_program(GIT_CMD git) set (SHELL "/bin/bash") endif (WIN32) From 6185ce3da7db1d2547d2e9f068c58e261f68dfc1 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Sun, 22 May 2016 13:48:35 +0200 Subject: [PATCH 060/232] Regenerated translation files. --- rtdata/languages/Catala | 19 ++++++++++++++----- rtdata/languages/Chinese (Simplified) | 19 ++++++++++++++----- rtdata/languages/Chinese (Traditional) | 19 ++++++++++++++----- rtdata/languages/Czech | 11 ++++++++++- rtdata/languages/Dansk | 19 ++++++++++++++----- rtdata/languages/Deutsch | 13 +++++++++++++ rtdata/languages/English (UK) | 19 ++++++++++++++----- rtdata/languages/English (US) | 19 ++++++++++++++----- rtdata/languages/Espanol | 19 ++++++++++++++----- rtdata/languages/Euskara | 19 ++++++++++++++----- rtdata/languages/Francais | 19 ++++++++++++++----- rtdata/languages/Greek | 19 ++++++++++++++----- rtdata/languages/Hebrew | 19 ++++++++++++++----- rtdata/languages/Italiano | 19 ++++++++++++++----- rtdata/languages/Japanese | 19 ++++++++++++++----- rtdata/languages/Latvian | 19 ++++++++++++++----- rtdata/languages/Magyar | 19 ++++++++++++++----- rtdata/languages/Nederlands | 11 ++++++++++- rtdata/languages/Norsk BM | 19 ++++++++++++++----- rtdata/languages/Polish | 19 ++++++++++++++----- rtdata/languages/Polish (Latin Characters) | 19 ++++++++++++++----- rtdata/languages/Portugues (Brasil) | 19 ++++++++++++++----- rtdata/languages/Russian | 19 ++++++++++++++----- rtdata/languages/Serbian (Cyrilic Characters) | 19 ++++++++++++++----- rtdata/languages/Serbian (Latin Characters) | 19 ++++++++++++++----- rtdata/languages/Slovak | 19 ++++++++++++++----- rtdata/languages/Suomi | 19 ++++++++++++++----- rtdata/languages/Swedish | 19 ++++++++++++++----- rtdata/languages/Turkish | 19 ++++++++++++++----- rtdata/languages/default | 18 +++++++++--------- 30 files changed, 406 insertions(+), 141 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 7ed78149f..afcb829a2 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1271,14 +1271,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1300,8 +1300,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 @@ -1780,8 +1782,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1801,6 +1807,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1820,10 +1827,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1831,6 +1839,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 5c6f5a39f..48b139f0f 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1188,14 +1188,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1217,8 +1217,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). @@ -1750,8 +1752,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1771,6 +1777,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1790,10 +1797,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1801,6 +1809,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index c79d07525..055d1f2b2 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -923,14 +923,14 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -952,8 +952,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1712,8 +1714,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1733,6 +1739,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1752,10 +1759,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1763,6 +1771,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index e1c7bc704..4a2e3a9bd 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2009,8 +2009,10 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -2030,11 +2032,16 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_RETINEX_CONTEDIT_MAP;Mask equalizer !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GRAD;Transmission gradient !TP_RETINEX_GRADS;Strength gradient !TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. !TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_MAP;Mask method @@ -2045,6 +2052,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_RETINEX_MAP_NONE;None !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. +!TP_RETINEX_SKAL;Scale +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_VIEW;Process !TP_RETINEX_VIEW_MASK;Mask !TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 46e8049d6..c22a60c37 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 48a293051..79675b740 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2043,3 +2043,16 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale +!TP_RETINEX_EQUAL;Equalizer +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. +!TP_RETINEX_ITERF;Tone mapping +!TP_RETINEX_SKAL;Scale +!TP_RETINEX_TRANF;Transmission diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index d0979941b..2f97b36d1 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -718,14 +718,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_420;Retinex - Histogram - HSL !HISTORY_MSG_421;Retinex - Gamma @@ -746,8 +746,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1679,8 +1681,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1700,6 +1706,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1719,10 +1726,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1730,6 +1738,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 677771240..f7a82441c 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -640,14 +640,14 @@ !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -669,8 +669,10 @@ !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1669,8 +1671,12 @@ !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1690,6 +1696,7 @@ !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1709,10 +1716,11 @@ !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1720,6 +1728,7 @@ !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 7be7aa516..215c21390 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1674,14 +1674,14 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1703,8 +1703,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet !MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w @@ -1853,8 +1855,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1874,6 +1880,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1893,10 +1900,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1904,6 +1912,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 251fa4673..5a7e068d2 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 7cfe47960..d35371458 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1893,14 +1893,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1922,8 +1922,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -1955,8 +1957,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1976,6 +1982,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1995,10 +2002,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -2006,6 +2014,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 61a6f844f..1929b0059 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -918,14 +918,14 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -947,8 +947,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1710,8 +1712,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1731,6 +1737,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1750,10 +1757,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1761,6 +1769,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index e007ebcd7..54396a92f 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 82061c24d..94329b411 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1539,14 +1539,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1568,8 +1568,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet @@ -1794,8 +1796,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1815,6 +1821,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1834,10 +1841,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1845,6 +1853,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 78cfa3275..967e57e4d 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1927,14 +1927,14 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1956,8 +1956,10 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -1987,8 +1989,12 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -2008,6 +2014,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -2027,10 +2034,11 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -2038,6 +2046,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 4d4415e58..bfbbf4d76 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 9600eb0ce..5183cb9de 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1200,14 +1200,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1229,8 +1229,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 @@ -1773,8 +1775,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1794,6 +1800,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1813,10 +1820,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1824,6 +1832,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index fa1dbcd09..7806899b6 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1977,8 +1977,10 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -2002,13 +2004,18 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_RETINEX_CONTEDIT_MAP;Mask equalizer !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). !TP_RETINEX_GRAD;Transmission gradient !TP_RETINEX_GRADS;Strength gradient !TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. !TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_MAP;Mask method @@ -2021,6 +2028,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. +!TP_RETINEX_SKAL;Scale +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_VIEW;Process !TP_RETINEX_VIEW_MASK;Mask diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 105277339..222667cd5 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -918,14 +918,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -947,8 +947,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1710,8 +1712,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1731,6 +1737,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1750,10 +1757,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1761,6 +1769,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 5f3c30045..323d6ac8a 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1631,14 +1631,14 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1660,8 +1660,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet @@ -1800,8 +1802,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1821,6 +1827,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1840,10 +1847,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1851,6 +1859,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 79bf35bea..1967a9e4e 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1631,14 +1631,14 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1660,8 +1660,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet @@ -1800,8 +1802,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1821,6 +1827,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1840,10 +1847,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1851,6 +1859,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index a665b17e4..06cc8b37d 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 778500cbb..5b9625741 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1482,14 +1482,14 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1511,8 +1511,10 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet @@ -1796,8 +1798,12 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1817,6 +1823,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1836,10 +1843,11 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1847,6 +1855,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index c48c5528f..dce9bfd10 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1123,14 +1123,14 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1152,8 +1152,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 @@ -1730,8 +1732,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1751,6 +1757,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1770,10 +1777,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1781,6 +1789,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index ee2df3cdf..5a5f9d454 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1123,14 +1123,14 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1152,8 +1152,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 @@ -1730,8 +1732,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1751,6 +1757,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1770,10 +1777,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1781,6 +1789,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 7ea5ead8a..a3ed2994b 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -982,14 +982,14 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1011,8 +1011,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 @@ -1719,8 +1721,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1740,6 +1746,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1759,10 +1766,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1770,6 +1778,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 5017c2066..f7962a735 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -920,14 +920,14 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -949,8 +949,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1711,8 +1713,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1732,6 +1738,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1751,10 +1758,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1762,6 +1770,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 3f979abaf..f3ba72af8 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1758,14 +1758,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -1787,8 +1787,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_COLORTONING;Color toning @@ -1881,8 +1883,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1902,6 +1908,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1921,10 +1928,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1932,6 +1940,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index d7f6fa405..b3de5a01f 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -919,14 +919,14 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Brightness +!HISTORY_MSG_410;Retinex - Offset !HISTORY_MSG_411;Retinex - Strength !HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_413;Retinex - Variance +!HISTORY_MSG_413;Retinex - Contrast !HISTORY_MSG_414;Retinex - Histogram - Lab !HISTORY_MSG_415;Retinex - Transmission !HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median +!HISTORY_MSG_417;Retinex - Transmission Median !HISTORY_MSG_418;Retinex - Threshold !HISTORY_MSG_419;Retinex - Color space !HISTORY_MSG_420;Retinex - Histogram - HSL @@ -948,8 +948,10 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_436;Retinex - M - Radius !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Preview +!HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_440;CbDL - Method +!HISTORY_MSG_441;Retinex - Gain transmission +!HISTORY_MSG_442;Retinex - Scale !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !MAIN_BUTTON_FULLSCREEN;Fullscreen !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 @@ -1710,8 +1712,12 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. !TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! +!TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma !TP_RETINEX_GAIN;Gain +!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +!TP_RETINEX_GAINTRANSMISSION;Gain transmission +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1731,6 +1737,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_HSLSPACE_LIN;HSL-Linear !TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic !TP_RETINEX_ITER;Iterations (Tone-mapping) +!TP_RETINEX_ITERF;Tone mapping !TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. !TP_RETINEX_LABEL;Retinex !TP_RETINEX_LABEL_MASK;Mask @@ -1750,10 +1757,11 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_NEIGHBOR;Radius !TP_RETINEX_NEUTRAL;Reset !TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Brightness +!TP_RETINEX_OFFSET;Offset (brightness) !TP_RETINEX_SCALES;Gaussian gradient !TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SETTINGS;Settings +!TP_RETINEX_SKAL;Scale !TP_RETINEX_SLOPE;Free gamma slope !TP_RETINEX_STRENGTH;Strength !TP_RETINEX_THRESHOLD;Threshold @@ -1761,6 +1769,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 !TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 !TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. +!TP_RETINEX_TRANF;Transmission !TP_RETINEX_TRANSMISSION;Transmission map !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_UNIFORM;Uniform diff --git a/rtdata/languages/default b/rtdata/languages/default index f4b042ec7..5998c585d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -639,14 +639,14 @@ HISTORY_MSG_406;W - ES - Neighboring pixels HISTORY_MSG_407;Retinex - Method HISTORY_MSG_408;Retinex - Radius HISTORY_MSG_409;Retinex - Contrast -HISTORY_MSG_410;Retinex - Brightness +HISTORY_MSG_410;Retinex - Offset HISTORY_MSG_411;Retinex - Strength HISTORY_MSG_412;Retinex - Gaussian Gradient -HISTORY_MSG_413;Retinex - Variance +HISTORY_MSG_413;Retinex - Contrast HISTORY_MSG_414;Retinex - Histogram - Lab HISTORY_MSG_415;Retinex - Transmission HISTORY_MSG_416;Retinex -HISTORY_MSG_417;Retinex - Transmission median +HISTORY_MSG_417;Retinex - Transmission Median HISTORY_MSG_418;Retinex - Threshold HISTORY_MSG_419;Retinex - Color space HISTORY_MSG_420;Retinex - Histogram - HSL @@ -668,7 +668,7 @@ HISTORY_MSG_435;Retinex - M - Shadows TW HISTORY_MSG_436;Retinex - M - Radius HISTORY_MSG_437;Retinex - M - Method HISTORY_MSG_438;Retinex - M - Equalizer -HISTORY_MSG_439;Retinex - Preview +HISTORY_MSG_439;Retinex - Process HISTORY_MSG_440;CbDL - Method HISTORY_MSG_441;Retinex - Gain transmission HISTORY_MSG_442;Retinex - Scale @@ -1673,8 +1673,10 @@ TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gau TP_RETINEX_EQUAL;Equalizer TP_RETINEX_FREEGAMMA;Free gamma TP_RETINEX_GAIN;Gain -TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. TP_RETINEX_GAINOFFS;Gain and Offset (brightness) +TP_RETINEX_GAINTRANSMISSION;Gain transmission +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. +TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free TP_RETINEX_GAMMA_HIGH;High @@ -1692,8 +1694,8 @@ TP_RETINEX_HIGHLIGHT;Highlight threshold TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. TP_RETINEX_HSLSPACE_LIN;HSL-Linear TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -TP_RETINEX_ITERF;Tone mapping TP_RETINEX_ITER;Iterations (Tone-mapping) +TP_RETINEX_ITERF;Tone mapping TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Mask @@ -1717,8 +1719,8 @@ TP_RETINEX_OFFSET;Offset (brightness) TP_RETINEX_SCALES;Gaussian gradient TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. TP_RETINEX_SETTINGS;Settings -TP_RETINEX_SLOPE;Free gamma slope TP_RETINEX_SKAL;Scale +TP_RETINEX_SLOPE;Free gamma slope TP_RETINEX_STRENGTH;Strength TP_RETINEX_THRESHOLD;Threshold TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. @@ -1727,8 +1729,6 @@ TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. TP_RETINEX_TRANF;Transmission TP_RETINEX_TRANSMISSION;Transmission map -TP_RETINEX_GAINTRANSMISSION;Gain transmission -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplfy or reduce transmission-map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate : gain TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. TP_RETINEX_UNIFORM;Uniform TP_RETINEX_VARIANCE;Contrast From f490c6468221913e72626def9d9e09178c42a06b Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Sun, 22 May 2016 14:08:30 +0200 Subject: [PATCH 061/232] Updated camconst.json, #3298 --- rtengine/camconst.json | 401 +++++++++++++++++++++++++++++++++++------ 1 file changed, 341 insertions(+), 60 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 05e21576c..4dd84c829 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -179,14 +179,14 @@ we want conservative values. By conservative values we mean that if you see a white level of most often 15760 and occassionally 15759 (ie very small variation of white level which -is a common case), you set the white level around 40-80 14bit units below or -10-20 12bit units. Say at 15700 in this example, or 4080 instead of 4095 for -12bit raws. This way we get a little margin from noise and camera variation. -Since sensor raw values are linear you lose in this example log2(1-50/15760) = --0.005 stop of detail, ie irrelevant. Thus it's better to provide RawTherapee -with knowledge where the image clips rather than keeping that last 0.005 stop -of highlight information and risking that clipping will not be detected -properly. +is a common case), you set the white level around 50-100 14-bit units below or +10-20 12-bit units. Say at 15700 in this example, or 4080 instead of 4095 for +12-bit raws. This way we get a little margin from noise and camera variation. +Since sensor raw values are linear, you lose, for example, +log2(1-50/15760) = -0.005 stops of detail, i.e. irrelevant. Thus it is better +to provide RawTherapee with knowledge where the image clips rather than keeping +that last 0.005 stop of highlight information and risking that clipping will +not be detected properly. It is very usual for white level to be a bell distribution instead of a candle when the camera applies long exposure noise reduction by subtracting a black frame @@ -201,7 +201,13 @@ whole fuzzy noise peak. If a little of the starting edge of the noise will be included it's not harmful, but 99% of it should be above. This would mean that it's better to measure white level on long exposure/ high temp raws but since this if difficult and time consuming we choose to measure on normal -raws and cover the abnormalities whith the conservative WL values. +raws and cover the abnormalities with the conservative WL values. + A more detailed approach when we only have non LENR measures is to subtract +a value according to per ISO read noise. +We can find data regarding read noise (stdev of gaussian distribution) at +http://www.photonstophotos.net/Charts/RN_ADU.htm . We find the per ISO tead_noise and +subtract from the measured value 6*read_noise. This gives confidence that 99.5% of +the bell is clipped out. If you have used Adobe's DNG Converter and analyzed it's output you may have noticed that it's very conservative regarding white levels, ie it cuts away @@ -326,7 +332,7 @@ About black levels: Unlike for white levels it's much more common that black levels can be derived from the format. Either it's simply 0 (typical for old Nikon cameras, -newer Nikons (year2013-14) have a BL at around 150 12bit or 600/768 14bit ), +newer Nikons (year2013-14) have a BL at around 150 12-bit or 600/768 14-bit ), or it can be derived from masked pixels (typical for Canon cameras) or otherwise be extracted from some tag. Some formats have built-in subtraction information and are pre-processed by DCRaw @@ -412,6 +418,46 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, + { // quality C, INTERMEDIATE ISO SAMPLES MISSING + "make_model": "Canon EOS-1D X Mark II", + "dcraw_matrix": [ 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 ], + // "raw_crop": [ 192, 96, 8696, 5800 ], // Full sensor 5568x3708 top38, left72, official crop left84, top50, right5555, bottom3697, 5472X3648 + // "masked_areas": [ 50, 4, 3697, 68 ], // left out 4 first columns from calculations because possibly the BL is still imbalanced there + "ranges": { + // black levels are read from raw masked pixels + // white levels are same for all colors all ISOs, but safety margin vary on ISO + "white": [ + { "iso": 50, "levels": 16350 }, // typical for all ISOs: 16383, stdev 2.25 + { "iso": 100, "levels": 16350 }, // stdev 2.25 + { "iso": [ 125, 160, 200, 250 ], "levels": 16340 }, // stdev 2.5 + { "iso": [ 320, 400, 500 ], "levels": 16330 }, // stdev 2.95 + { "iso": [ 640, 800, 1000 ], "levels": 16320 },// stdev x, 4.0 , x + { "iso": [ 1250, 1600, 2000 ], "levels": 16300 },// stdev x, 6.0 , x + { "iso": [ 2500, 3200, 4000 ], "levels": 16250 }, // STDEV x, 9.8 , x + { "iso": [ 5000, 6400, 8000 ], "levels": 16150 }, // stdev x, 17, x + { "iso": [ 10000, 12800, 16000 ], "levels": 16100 },// stdev x, 34 , x + { "iso": [ 20000, 25600, 32000 ], "levels": 16000 },// stdev x, 68 , x + { "iso": [ 40000, 51200, 64000 ], "levels": 15700 },// stdev x, 125, x + { "iso": [ 80000, 102400 ], "levels": 15100 },// stdev x, 245 + { "iso": [ 204800 ], "levels": 14000 }, + { "iso": [ 409600 ], "levels": 13000 } + ], + "white_max": 16383, + "aperture_scaling": [ + /* no need for aperture scaling because typical WL is 16383 at all ISOs .. */ + { "aperture": 1.2, "scale_factor": 1.130 }, // guessed by relative 6D data + { "aperture": 1.4, "scale_factor": 1.090 }, + { "aperture": 1.6, "scale_factor": 1.060 }, + { "aperture": 1.8, "scale_factor": 1.040 }, + { "aperture": 2.0, "scale_factor": 1.030 }, + { "aperture": 2.2, "scale_factor": 1.020 }, + { "aperture": 2.5, "scale_factor": 1.015 }, + { "aperture": 2.8, "scale_factor": 1.010 }, + { "aperture": 3.2, "scale_factor": 1.005 }, + { "aperture": 3.5, "scale_factor": 1.003 } + ] + } + }, { // quality A, "make_model": "Canon EOS 5D Mark III", "dcraw_matrix": [ 6722,-635,-963,-4287,12460,2028,-908,2162,5668 ], @@ -468,14 +514,18 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // Quality A, some missing scaling factors are safelly guessed - most samples by sfink16 at RT forums + { // Quality A, some missing scaling factors are safely guessed - samples by sfink16 & RawConvert at RT forums "make_model": "Canon EOS 6D", "dcraw_matrix": [ 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 ], "ranges": { "white": [ - { "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800, 16000, 25600 ], "levels": 15180 }, // typical 15283 - { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000, 20000 ], "levels": 13100 }, // typical 13225 - { "iso": [ 51200, 102400 ], "levels": 16280 } // typical 16383 + { "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200 ], "levels": 15180 }, // typical 15283 + { "iso": [ 4000, 6400, 8000, 12800 ], "levels": 15100 }, // typical 15283 + { "iso": [ 16000, 25600 ], "levels": 14900 }, // typical 15283 + { "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 13100 }, // typical 13225 + { "iso": [ 5000, 10000 ], "levels": 13000 }, // typical 13225 + { "iso": [ 20000 ], "levels": 12800 }, // typical 13225 + { "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383 ], "white_max": 16383, "aperture_scaling": [ @@ -484,7 +534,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { "aperture": 1.2, "scale_factor": 1.130 }, // from histogramm 1 gap in every 7 levels { "aperture": 1.4, "scale_factor": 1.090 }, // histogram 3 gaps in every 32 levels { "aperture": 1.6, "scale_factor": 1.060 }, // 16213/15283 - { "aperture": 1.8, "scale_factor": 1.040 }, // guessed + { "aperture": 1.8, "scale_factor": 1.040 }, // 16004/15283 { "aperture": 2.0, "scale_factor": 1.030 }, // 15800/15283 { "aperture": 2.2, "scale_factor": 1.020 }, // guessed { "aperture": 2.5, "scale_factor": 1.015 }, // 15541/15283 @@ -728,8 +778,35 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // Quality A, only one scaling factor missing and guessed safely - "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i" ], + { // Quality B, .. integer ISOs measured, intermediate ISO samples missing, + // scaling factors safely guessed to be same as 1200D .. + "make_model": [ "Canon EOS 1300D", "Canon EOS Rebel T6" ], + "dcraw_matrix": [ 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 ], // Dcraw 9.27 + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800 ], "levels": 15200 } // typical 15303 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data + { "aperture": 1.6, "scale_factor": 1.190 }, // guessed + { "aperture": 1.8, "scale_factor": 1.140 }, // guessed + { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095 + { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066 + { "aperture": 2.5, "scale_factor": 1.050 }, // guessed + { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348 + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + + { // Quality A, only one scaling factor missing and guessed safely, EOS 700D not tested but available samples look same as 650D + "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS 700D", "Canon EOS Rebel T5i" ], "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], "ranges": { "white": [ @@ -811,6 +888,38 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, + { // Quality C, inconsistent WL per ISO, missing scaling factors + "make_model": "Canon EOS M10", + "dcraw_matrix": [ 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 ], // DNGv9.3 D65 + "ranges": { + "white": [ + { "iso": [ 100, 125, 160, 320, 500, 2000, 4000, 6400 ], "levels": 16300 }, // typical 16383 + { "iso": 200, "levels": 12900 }, // typical 12940-15570-15376 + { "iso": 250, "levels": 14100 }, // typical 14200 + { "iso": 800, "levels": 13400 }, // typical 13500-16383x2 + { "iso": 1000, "levels": 14900 }, // typical 15010-16383 + { "iso": 1250, "levels": 12300 }, // typical 12400 + { "iso": 1600, "levels": 15200 }, // typical 15290-16075-16380 + { "iso": 2500, "levels": 12200 }, // typical 12300 + { "iso": 3200, "levels": 15000 }, // typical 15080-16383-16100-13660 + { "iso": 5000, "levels": 12800 }, // typical 12840 + { "iso": [ 12800, 25600 ], "levels": 16200 } // typical 16383 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: all scale factors are copied from EOS M3 */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // guessed + { "aperture": 2.2, "scale_factor": 1.025 }, // guessed + { "aperture": 2.5, "scale_factor": 1.020 }, // guessed + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed "make_model": "Canon EOS M3", "dcraw_matrix": [ 6362,-823,-847,-4426,12109,2616,-743,1857,5635 ], // DNG_V8.8 D65 @@ -838,7 +947,54 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, - { /* Quality B, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion, + { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed + "make_model": "Canon EOS 80D", + "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // DNG_V9.5 D65 + "raw_crop": [ 264, 34, 6024, 4022 ], // full size 6288x4056, official crop 276,46,6275,4045 + "masked_areas": [ 40, 96, 4000, 260 ], + "ranges": { + "white": [ + { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243 + { "iso": [ 160 ], "levels": 13000 }, // nominal 13097, + { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415 + { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150 + { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: need for more data to properly fill all scale factors */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // guessed + { "aperture": 2.2, "scale_factor": 1.025 }, // guessed + { "aperture": 2.5, "scale_factor": 1.020 }, // guessed + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + + { // Quality B, experimental infrared support commented out + "make_model": "Canon PowerShot G9", + "dcraw_matrix": [ 7368,-2141,-598,-5621,13254,2625,-1419,1696,5743 ], // DNG_V8.7 D65 + // "dcraw_matrix": [ 8796,-3770,311,-4148,11362,3197,-598,983,5880 ], // DNG_V8.7 A + // "dcraw_matrix": [ 15669,-8084,-2453,-2940,5756,101,126,-401,2463 ], // Infrared guessed 111 + // "dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed + "ranges": { "white": 4080 } + }, + { // Quality C, experimental infrared support commented out + "make_model": "Canon PowerShot A480", + "dcraw_matrix": [ 8275,-2905,-1261,-128,5305,505,52,482,2450 ], // DNG_CHDK_V1.3.0 Daylight + // "dcraw_matrix": [ 15906,-7425,-2014,-2010,5554,264,404,-265,2706 ], // Infrared guessed + "raw_crop": [ 6, 12, 3684, 2760 ], // full size 3720X2772, official Canon crop 3648x2736 + "masked_areas": [ 12, 3694, 2760, 3716 ], // only left side optically black area is considered + "ranges": { "white": 4080 } + }, + + + { /* Quality B, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion, for the moment just comment-uncomment the desired raw crop */ "make_model": "Canon PowerShot G1 X Mark II", "dcraw_matrix": [ 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 ], // D65 matrix from adobe dcp @@ -858,6 +1014,14 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "masked_areas": [ 40, 4, 3680, 76 ], "ranges": { "white": 4080 } }, + { // Quality B, + "make_model": [ "Canon PowerShot G9 X", "Canon PowerShot G5 X" ], + "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 + // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 + "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 + "masked_areas": [ 40, 4, 3680, 76 ], + "ranges": { "white": 16300 } + }, { // Quality B, "make_model": "Canon PowerShot G3 X", @@ -902,16 +1066,36 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 ], // DNG_v8.7 D65 "ranges": { "white": 16100 } }, + { // Quality B, + "make_model": "FUJIFILM X70", + "dcraw_matrix": [ 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 ], // DNG_v9.4 D65 + // "raw_crop": [ 4, 0, 4988, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop + "ranges": { "white": 16100 } + }, - { // Quality B + { // Quality B "make_model": "FUJIFILM X-A2", "dcraw_matrix": [ 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 ], // DNG D65 "ranges": { "white": 4050 } }, + { // Quality B "make_model": [ "FUJIFILM X-T1", "FUJIFILM X-T10", "FUJIFILM X-E2" ], "dcraw_matrix": [ 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 ], // DNG D65 // "dcraw_matrix": [ 9289,-3279,-632,-3539,11137,2758,-1049,1950,6544 ], // X-RITE D55 +// "raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop + "ranges": { "white": 16100 } + }, + { // Quality B + "make_model": "FUJIFILM X-E2S", + "dcraw_matrix": [ 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 ], // DNG_v9.4 D65 + "ranges": { "white": 16100 } + }, + + { // Quality B + "make_model": "FUJIFILM X-PRO2", + "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 + "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop "ranges": { "white": 16100 } }, @@ -926,19 +1110,16 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 ], // DNG_v8.8 D65 "ranges": { "white": 4040 } }, - - { // Quality B - "make_model": "FUJIFILM X-PRO2", - "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 - "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop - "ranges": { "white": 16100 } - }, - { // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG - "make_model": [ "LEICA SL (Typ 601)", "LEICA Q (Typ 116)" ], + "make_model": "LEICA Q (Typ 116)", "dcraw_matrix": [ 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 ], // DCP D65 "raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000 }, + { // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG + "make_model": "LEICA SL (Typ 601)", + "dcraw_matrix": [ 11492,-4930,-1188,-5593,14673,873,-609,1474,6343 ], // DNGv9.3 D65 + "raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000 + }, { // Quality B, frame corrections "make_model": "LG mobile LG-H815", @@ -991,34 +1172,69 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "white_max": 16383 } }, + { // quality B, intermediate ISO samples missing + "make_model": "Nikon D500", + "dcraw_matrix": [ 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 ], // DNG_v9.5 D65 + "ranges": { + "white": [ // measured at integer ISOs. Safety margin per ISO groups according to expected WL spread after LENR + { "iso": [ 100, 200, 400, 800, 1600 ], "levels": [ 16300, 16100, 16300 ] }, // typical G1,G2 16180 R,B 16383 + { "iso": [ 3200, 6400 ], "levels": [ 16250, 16050, 16250 ] }, // typical G1,G2,16200 R,B 16383 + { "iso": [ 12800, 25600 ], "levels": 16000 }, // typical G1,G2, R,B 16383 + { "iso": [ 51200, 102400 ], "levels": 15800 }, // typical G1,G2, R,B 16383 + { "iso": [ 204800, 409600 ], "levels": 15500 }, // typical G1,G2,R,B 16383 + { "iso": [ 819200, 1638400 ], "levels": 15000 } // typical G1,G2, R,B 16383 + ], + "white_max": 16383 + } + }, { // quality B, lacks aperture and ISO scaling, known to exist, but little to gain as the levels are so close to white_max "make_model": "Nikon D7000", "dcraw_matrix": [ 7530,-1942,-255,-4318,11390,3362,-926,1694,7649 ], // matrix provided by Tanveer(tsk1979) "ranges": { // measured at ISO 100. ISO differences not measured, but known to exist - "white": [ 16370, 15760, 16370 ], // typical R 16383, G 15778, B 16383 + "white": [ 16300, 15700, 16300 ], // typical R 16383, G 15778, B 16383 "white_max": 16383 // aperture scaling not measured, but known to exist, at f/1.8 the G channels hits white_max } }, + { // quality B, + "make_model": "NIKON COOLPIX A", + "dcraw_matrix": [ 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 ], // dng_d65 + "ranges": { + "white": [ + { "iso": [ 100, 125, 160, 200, 250, 320, 400, 500, 640, 800 ], "levels": [ 16300, 15700, 16300 ] }, // typical G1,G2 15760-15800 R,B 16383 + { "iso": [ 1000, 1250, 1600, 2000, 2500, 3200 ], "levels": 16300 }, // typical G1,G2, R,B 16383 + { "iso": [ 4000, 5000, 6400 ], "levels": 16200 }, // typical G1,G2, R,B 16383 + { "iso": [ 8000, 10000, 12800 ], "levels": 16000 }, // typical G1,G2,R,B 16383 + { "iso": [ 16000, 20000, 25600 ], "levels": 15700 } // typical G1,G2, R,B 16383 + ], + "white_max": 16383 + } + }, + + { // Quality B, NO LENR SAMPLES + "make_model": "Nikon D5", + "dcraw_matrix": [ 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 ], // adobe dng_v9.5 d65 + "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety + }, { // Quality B, aperture scaling used to scale WL at safer levels "make_model": "Nikon D5300", "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65 - "ranges": { "white": 16300 } // attention.. WL value is for 14bit files, has to be 4070 for 12bit files. WL typical 16383 set to 16300 for safety + "ranges": { "white": 16300 } // attention.. WL value is for 14-bit files, has to be 4070 for 12-bit files. WL typical 16383 set to 16300 for safety }, { // Quality B, aperture scaling used to scale WL at safer levels "make_model": "Nikon D5500", "dcraw_matrix": [ 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 ], // adobe dng_v9.0 d65 - "ranges": { "white": 16300 } // attention.. WL value is for 14bit files, has to be 4070 for 12bit files. WL typical 16383 set to 16300 for safety + "ranges": { "white": 16300 } // attention.. WL value is for 14-bit files, has to be 4070 for 12-bit files. WL typical 16383 set to 16300 for safety }, { // Quality B, color matrix from DNG_v9.0 instead of internal Dcraw_v9.25_r1.475, "make_model": "Nikon D7200", "dcraw_matrix": [ 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 ], // adobe dng_v9.0 d65 - "ranges": { "white": 16300 } // attention.. WL values are for 14bit files, has to be WL4070 for 12bit files. WL typical 16383 set to 16300 for safety, + "ranges": { "white": 16300 } // attention.. WL values are for 14-bit files, has to be WL4070 for 12-bit files. WL typical 16383 set to 16300 for safety, }, { // quality B, samples by joachip at RT forums, are measures at long exposures with LongExposureNoiseReduction @@ -1030,7 +1246,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "white": [ { "iso": [ 50, 100 ], "levels": [ 15800, 15800, 15350 ] }, // typical G1/G2/R 15879, B 15395-15670 lowered to 15800, 15350, 3969 B3917 { "iso": [ 200, 400, 800 ], "levels": [ 16300, 15700, 16300 ] }, // 15878, 16383 - { "iso": 1000, "levels": [ 16300, 16100, 16300 ] }, // 12bit lossless r4095, 3981-10, b4041- 12bit lossy r,g1,g2 3961 - b3917, + { "iso": 1000, "levels": [ 16300, 16100, 16300 ] }, // 12-bit lossless r4095, 3981-10, b4041- 12-bit lossy r,g1,g2 3961 - b3917, { "iso": 1600, "levels": [ 16300, 16100, 16300 ] }, // 16145-165, 16383 { "iso": [ 3200, 6400, 12800, 25600 ], "levels": [ 16300, 16300, 16300 ] } // 16383 ], @@ -1056,14 +1272,17 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { // quality B; Data from RusselCottrell at RT forums. sensor is not uniform "make_model": "Nikon D700", "dcraw_matrix": [ 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 ], - "ranges": { "white": 15750 } // Non linearities start at 15750 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 - // white 15750 is correct for 14bit files, 12 bit files need white level at 3900 + // "dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illum a + // "raw_crop": [ 1400, 600, 1600, 1600 ], // experimental - Dcraw 2 0 4284 2844, + "ranges": { "white": [ 15500, 15500, 15500 ] } + // Non linearities start at 15750 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 + // white 15750 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15750*4095/16383=3936 }, { // Quality B, "make_model": "Nikon D750", "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 ], // adobe dcp d65 DNGv8.7 - "ranges": { "white": 16300 } // attention.. WL values are for 14bit files, has to be WL4070 for 12bit files. WL typical 16383 set to 16300 for safety + "ranges": { "white": 16300 } // attention.. WL values are for 14-bit files, has to be WL4070 for 12-bit files. WL typical 16383 set to 16300 for safety }, { // quality B; Data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop @@ -1081,7 +1300,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Nikon D810", "dcraw_matrix": [ 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 ], // dcp_v8.6 d65 "raw_crop": [ 0, 0, 7380, 4928 ], // Official raw crop 7380x4928, - "ranges": { "white": 16300 } // attention WL 16300 is for 14bit raws and has to be 4070 for 12 bit raws. Typical WL at 16383 + "ranges": { "white": 16300 } // WL 16300 is for 14-bit raws, for 12-bit files RT auto calculates the correct WL. Typical WL at 16383 }, { // Quality b, 16Mp and 64Mp raw frames "make_model": "OLYMPUS E-M5MarkII", @@ -1095,9 +1314,27 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, + { // Quality B, 20Mp and 80Mp raw frames + "make_model": "OLYMPUS PEN-F", + "dcraw_matrix": [ 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 ], // dng_v9.5 D65 + // "raw_crop": [ 0, 0, 10372, -7780 ], // largest valid, full 80Mp 10400X7796, official crop 10 10 10368 7776 - + "ranges": { + "white": [ + { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956 + { "iso": [ 400, 800, 1600, 3200 ], "levels": 4070 }, // 4070-4095 + { "iso": [ 6400, 12800, 25600 ], "levels": 4040 } // 4000-4095 + ] + } + }, + + { // Quality b, missing per ISO samples + "make_model": "OLYMPUS E-M1", + "dcraw_matrix": [ 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 ], // dng d65 + "ranges": { "white": 4080 } // nominal 4095-4094, spread with some settings as long exposure + }, { // Quality b, crop correction - "make_model": "OLYMPUS E-M10", + "make_model": [ "OLYMPUS E-M10", "OLYMPUS E-M10 Mark II" ], "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], "raw_crop": [ 0, 0, 4624, 3472 ], // largest valid - full frame is 4640x3472 // "raw_crop": [ 4, 4, 4616, 3464 ], // olympus jpeg crop 8, 8, 4608, 3456 @@ -1109,14 +1346,14 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 4040 } // nominal 4056 }, - { // Quality B, with long exposure noise reduction White Level gets WL-BL = around 256_12bit levels less + { // Quality B, with long exposure noise reduction White Level gets WL-BL = around 256_12-bit levels less "make_model": "OLYMPUS E-PL7", "dcraw_matrix": [ 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 ], // DNG_V8.7 D65 "ranges": { "white": 4080 } // nominal 4093 }, { // Quality B, per ISO WL measures missing - "make_model": "OLYMPUS SH-2", + "make_model": [ "OLYMPUS SH-2", "Olympus SH-3" ], "dcraw_matrix": [ 10156,-3425,-1077,-2611,11177,1624,-385,1592,5080 ], // DNG_V9.1 D65 "ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093 }, @@ -1126,7 +1363,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know and we define here the needed offset of around 15. The total BL is base+offset */ { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 .. - "make_model": "Panasonic DMC-CM1", + "make_model": [ "Panasonic DMC-CM1", "Panasonic DMC-CM10" ], "dcraw_matrix": [ 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 ], // dcp_v8.7 d65 "ranges": { "black": 15, // 15 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset @@ -1162,7 +1399,18 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, - + { // Quality A, samples by helices at Rt forums + "make_model": [ "Panasonic DMC-ZS100", "Panasonic DMC-ZS110", "Panasonic DMC-TZ100", "Panasonic DMC-TZ101", "Panasonic DMC-TZ110", "Panasonic DMC-TX1" ], + "dcraw_matrix": [ 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 ], // dcp_v8.6 d65 + "ranges": { + "black": 15, // 15 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset + "white": [ + { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100 + { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095 + { "iso": [ 3200, 6400, 12600, 25600 ], "levels": 4080 } // exif 4095 distribution 4080-4095 + ] + } + }, { // Quality A "make_model": [ "Panasonic DMC-LF1", "Leica C (Typ 112)" ], "dcraw_matrix": [ 9379,-3267,-816,-3227,11560,1881,-926,1928,5340 ], @@ -1319,7 +1567,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, { // Quality A, - "make_model": [ "Panasonic DMC-GX7", "Panasonic DMC-GF7" ], + "make_model": [ "Panasonic DMC-GX7", "Panasonic DMC-GF7", "Panasonic DMC-GF8" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], "ranges": { "black": 15, // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset @@ -1331,12 +1579,11 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // Quality A, - "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70" ], + { // G7 Quality A, GX80 Quality B, BLs and WLs are same, color matrix looks to also be same as G7 + "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70", "Panasonic DMC-GX80", "Panasonic DMC-GX85" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.1 D65 - // "dcraw_matrix": [ 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 ], // LX100, DNG_V8.7 d65 "ranges": { - "black": 16, // 16 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "black": 16, // 16 is BL offset. Dcraw/RT read the BLbase from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111 { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626 @@ -1350,7 +1597,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 15, // 16 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset "white": [ - { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111 + { "iso": 100, "levels": 2800 }, // gaussian 2900-3200 exif_linearitylimit 2111 { "iso": 125, "levels": 3180 }, // guessed gaussian 3200-3600 exif_linearitylimit 2626 { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 ] @@ -1369,6 +1616,12 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, + { // Quality B, per ISO info missing + "make_model": "PENTAX K-x", + "dcraw_matrix": [ 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 ], // adobe dcp d65 + "ranges": { "white": 4080 } // nominal at ISO200 4094 + }, + { // Quality B, intermediate ISOs info missing "make_model": [ "RICOH PENTAX K-3", "PENTAX K-3" ], "dcraw_matrix": [ 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 ], // adobe dcp d65 @@ -1386,10 +1639,25 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, + { // Quality B, intermediate ISOs info missing + "make_model": [ "RICOH PENTAX 645Z", "PENTAX 645Z" ], + "dcraw_matrix": [ 9519,-3591,-664,-4074,11725,2671,-624,1501,6653 ], // adobe dcp d65 + "raw_crop": [ 48, 0, 8276, 6208 ],// full sensor 8384x6208 - official jpeg 8256x6192 + "ranges": { + "white": [ + { "iso": 100, "levels": 16310 }, // 16317 or 16350 + { "iso": 200, "levels": 16120 }, // 16254 or 16125 + { "iso": 400, "levels": 15860 }, // 16125 or 15868 + { "iso": 800, "levels": 15360 }, // 15868 or 15364-15370 + { "iso": [ 1600, 3200, 6400, 12800, 25600, 51200 ], "levels": 16300 } // 16383 - pentax dng tag is 15868-15350 + ] + } + }, + { // Quality B, intermediate ISOs info missing, spread due to blackframe subtraction guessed to be around 10levels "make_model": "PENTAX K10D", "dcraw_matrix": [ 9566,-2863,-803,-7170,15172,2112,-818,803,9705 ], // adobe DNG d65 - // "raw_crop": [ 0, 0, 3888, 2608 ], + // "raw_crop": [ 0, , 3888, 2608 ], "ranges": { "white": [ { "iso": 100, "levels": 4080 }, // R,G1,B = 4095 G2= 4087 @@ -1408,7 +1676,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 4030 } // double clipping point for each channel at a) 4095 and b) bell distribution with peak at 4038 .. used the conservative one }, { // Quality A, Conflict with "Samsung NX30" in Dcraw_v9.21_r1.414, frame corrections and color data - "make_model": "Samsung NX3000", + "make_model": [ "Samsung NX3000", "Samsung NX3300" ], "dcraw_matrix": [ 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 ], // DNG_v8.7.1 D65 "raw_crop": [ 92, 38, 5480, 3656 ] // jpeg 5472x3648 - full raw: 5600 x 3714 - Samsung's official crop: 96, 42, 5568, 3690 }, @@ -1417,10 +1685,11 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": [ "Samsung NX1", "Samsung NX500" ], "dcraw_matrix": [ 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 ], // DNG_v8.7 D65 // "dcraw_matrix": [ 13298,-6099,-296,-5243,16153,-1235,-508,1220,7758 ], // DNG_v8.7 Standard Light A - // "dcraw_matrix": [ 9598,-3268,-634,-5678,14795,824,-1255,2675,4523 ], // SAMSUNG DNG CONVERTER + // "dcraw_matrix": [ 9598,-3268,-634,-5678,14795,824,-1255,2675,4523 ], // SAMSUNG DNG CONVERTER v1.0 + "raw_crop": [ 1200, 500, 1600, 3600 ],// TRIAL CROP "ranges": { "white": [ - { "iso": 100, "levels": 16000 }, // typical 16084, LE 16120 and 16383, LENR 16280 + { "iso": 100, "levels": 16000 }, // 16000 typical 16084, LE 16120 and 16383, LENR 16280 { "iso": [ 200, 400, 800, 1600, 3200, 6400, 12800 ], "levels": 16300 }, // 16383 { "iso": [ 25600, 51200 ], "levels": 16300 } // 16383 ] @@ -1465,14 +1734,14 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the top "raw_crop": [ 12, 52, -110, -8 ] // for small size all numbers/2 }, - { // Quality C, correction for frame width, color matrix guessed .. + { // Quality C, correction for frame width, color matrix measured on a DP1 sample .. "make_model": [ "Sigma DP1 Merrill", "Sigma DP2 Merrill", "Sigma DP3 Merrill" ], - "dcraw_matrix": [ 5666,139,-892,3780,5428,270,1366,9757,4526 ], // copy fron SD1 Merrill icc cloudy8140 d65 + // "dcraw_matrix": [ 2149,1003,-530,-494,6073,344,-3935,10665,3608 ], // experimental, inverted icc DP1_Merrill_dpreview_daylight WP1.2 + "dcraw_matrix": [ 2517,1175,-621,-587,7080,404,-4677,12402,4231 ], // experimental, inverted icc DP1_Merrill_dpreview_daylight WP1.4 "ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the bottom "raw_crop": [ 12, 0, -110, -62 ] // for small size all numbers/2 }, - { // Quality A, correction for color matrix from Colin Walker's d50 to dng d65 "make_model": "Sony NEX-C3", // "dcraw_matrix": [ 5130,-1055,-269,-4473,11797,3050,-701,1310,7121 ], // Colin walker's d50 kept for possible consistency issues @@ -1486,13 +1755,20 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "raw_crop": [ 0, 0, 4920, 3276 ], "ranges": { "black": 512, "white": 16300 } }, - { // Quality A, + { // Quality A, "make_model": "Sony ILCA-77M2", "dcraw_matrix": [ 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 ], // adobe dcp d65 "raw_crop": [ 0, 0, 6024, 4024 ], "ranges": { "black": 512, "white": 16300 } }, + { // Quality B, + "make_model": "Sony ILCA-68", + "dcraw_matrix": [ 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 ], // adobe DNGv9.5 d65 + "raw_crop": [ 0, 0, -30, 0 ], + "ranges": { "black": 512, "white": 16300 } + }, + { // Quality A, correction for frame width "make_model": [ "Sony ILCE-3000", "Sony ILCE-3500", "Sony ILCE-5000", "Sony ILCE-QX1" ], "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 @@ -1511,6 +1787,12 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "raw_crop": [ 0, 0, 6024, 4024 ], "ranges": { "black": 512, "white": 16300 } }, + { // Quality A + "make_model": "Sony ILCE-6300", + "dcraw_matrix": [ 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 ], // DNG_v9.5 D65 + "raw_crop": [ 0, 0, 6024, 4024 ], + "ranges": { "black": 512, "white": 16300 } + }, { // Quality A "make_model": "Sony ILCE-7M2", "dcraw_matrix": [ 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 ], // DNGv8.7.1 @@ -1523,10 +1805,10 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 512, "white": 16300 } }, - { // Quality B, correction for frame width, crop modes not covered - "make_model": "Sony ILCE-7RM2", + { // Quality B, correction for frame width, crop modes covered + "make_model": [ "Sony ILCE-7RM2", "Sony DSC-RX1RM2" ], "dcraw_matrix": [ 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 ], // DNG_v9.1.1 D65 - "raw_crop": [ 0, 0, 7964, 5320 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage + "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage "ranges": { "black": 512, "white": 16300 } }, @@ -1592,7 +1874,6 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 4479,-895,-536,-5818,13569,2742,-1186,2190,7909], "ranges": { "black": 0, "white": 64400 } }, - { // Quality A for tested CFV, the other models have the same sensor (16 megapixel square sensor) "make_model": [ "Hasselblad V96C", "Hasselblad CFV", "Hasselblad CFV-II" ], "dcraw_matrix": [ 8519, -3260, -280, -5081, 13459, 1738, -1449, 2960, 7809 ] // borrowed from Adobe's DNG converter From 023e7d36956a0fefa7a0d99fc9e1316468eff5f7 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 22 May 2016 14:35:53 +0200 Subject: [PATCH 062/232] Copied poke255_uc implementation from gtk3 into master --- rtengine/previewimage.cc | 29 +++++--------------------- rtengine/previewimage.h | 2 +- rtengine/utils.cc | 45 ++++++++++++++++++++++++++++++++++++++++ rtengine/utils.h | 7 +++++++ 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index f9f6c12a1..9de5c81cb 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -84,26 +84,16 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext unsigned char *dst; #pragma omp for schedule(static,10) - for (unsigned int i = 0; i < (unsigned int)(h); i++) { + for (unsigned int i = 0; i < (unsigned int)(h); ++i) { src = data + i * w * 3; dst = previewImage->get_data() + i * w * 4; - for (unsigned int j = 0; j < (unsigned int)(w); j++) { + for (unsigned int j = 0; j < (unsigned int)(w); ++j) { unsigned char r = *(src++); unsigned char g = *(src++); unsigned char b = *(src++); -#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - *(dst++) = b; - *(dst++) = g; - *(dst++) = r; - *(dst++) = 0; -#else - *(dst++) = 0; - *(dst++) = r; - *(dst++) = g; - *(dst++) = b; -#endif + poke255_uc(dst, r, g, b); } } } @@ -178,17 +168,8 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext unsigned char r = *(src++); unsigned char g = *(src++); unsigned char b = *(src++); -#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - *(dst++) = b; - *(dst++) = g; - *(dst++) = r; - *(dst++) = 0; -#else - *(dst++) = 0; - *(dst++) = r; - *(dst++) = g; - *(dst++) = b; -#endif + + poke255_uc(dst, r, g, b); } } } diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h index 5135ddd9a..26b9a85d2 100644 --- a/rtengine/previewimage.h +++ b/rtengine/previewimage.h @@ -20,7 +20,7 @@ #define _PREVIEWIMAGE_ #include -#include "cairomm/cairomm.h" +#include namespace rtengine { diff --git a/rtengine/utils.cc b/rtengine/utils.cc index b45e4b436..2366f3a0c 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -29,6 +29,51 @@ using namespace std; namespace rtengine { +void poke255_uc(unsigned char* &dest, unsigned char r, unsigned char g, unsigned char b) +{ +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + *(dest++) = b; + *(dest++) = g; + *(dest++) = r; + *(dest++) = 0; +#else + *(dest++) = 0; + *(dest++) = r; + *(dest++) = g; + *(dest++) = b; +#endif +} + +void poke01_d(unsigned char* &dest, double r, double g, double b) +{ +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + *(dest++) = (unsigned char)(b * 255.); + *(dest++) = (unsigned char)(g * 255.); + *(dest++) = (unsigned char)(r * 255.); + *(dest++) = 0; +#else + *(dest++) = 0; + *(dest++) = (unsigned char)(r * 255.); + *(dest++) = (unsigned char)(g * 255.); + *(dest++) = (unsigned char)(b * 255.); +#endif +} + +void poke01_f(unsigned char* &dest, float r, float g, float b) +{ +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + *(dest++) = (unsigned char)(b * 255.f); + *(dest++) = (unsigned char)(g * 255.f); + *(dest++) = (unsigned char)(r * 255.f); + *(dest++) = 0; +#else + *(dest++) = 0; + *(dest++) = (unsigned char)(r * 255.f); + *(dest++) = (unsigned char)(g * 255.f); + *(dest++) = (unsigned char)(b * 255.f); +#endif +} + void bilinearInterp (const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh) { diff --git a/rtengine/utils.h b/rtengine/utils.h index 3040e39b9..1e742ffb3 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -22,6 +22,13 @@ namespace rtengine { +// update a point of a Cairo::Surface by accessing the raw data +void poke255_uc(unsigned char* &dest, unsigned char r, unsigned char g, unsigned char b); +// update a point of a Cairo::Surface by accessing the raw data +void poke01_d(unsigned char* &dest, double r, double g, double b); +// update a point of a Cairo::Surface by accessing the raw data +void poke01_f(unsigned char* &dest, float r, float g, float b); + void bilinearInterp (const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh); void nearestInterp (const unsigned char* src, int sw, int sh, unsigned char* dst, int dw, int dh); void rotate (unsigned char* img, int& w, int& h, int deg); From 18243db5bafb63595fd561c89a7b7676483ef843 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 22 May 2016 21:57:52 +0200 Subject: [PATCH 063/232] Update to dcraw 9.27 --- rtengine/dcraw.c | 572 +++++++++++++++++++++++++++++++--------------- rtengine/dcraw.cc | 437 +++++++++++++++++++++++++---------- rtengine/dcraw.h | 7 +- 3 files changed, 714 insertions(+), 302 deletions(-) diff --git a/rtengine/dcraw.c b/rtengine/dcraw.c index cf1afe4ac..441f967da 100644 --- a/rtengine/dcraw.c +++ b/rtengine/dcraw.c @@ -1,6 +1,6 @@ /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2015 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net This is a command-line ANSI C program to convert raw photos from any digital camera on any computer running any operating system. @@ -19,11 +19,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.475 $ - $Date: 2015/04/11 00:08:36 $ + $Revision: 1.477 $ + $Date: 2016/05/10 21:30:43 $ */ -#define DCRAW_VERSION "9.25" +#define DCRAW_VERSION "9.27" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -89,15 +89,6 @@ typedef unsigned long long UINT64; #define _(String) (String) #endif -#ifdef LJPEG_DECODE -#error Please compile dcraw.c by itself. -#error Do not link it with ljpeg_decode. -#endif - -#ifndef LONG_BIT -#define LONG_BIT (8 * sizeof (long)) -#endif - #if !defined(uchar) #define uchar unsigned char #endif @@ -158,6 +149,7 @@ struct decode { struct tiff_ifd { int width, height, bps, comp, phint, offset, flip, samples, bytes; int tile_width, tile_length; + float shutter; } tiff_ifd[10]; struct ph1 { @@ -179,7 +171,7 @@ struct ph1 { #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define LIM(x,min,max) MAX(min,MIN(x,max)) #define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) -#define CLIP(x) LIM(x,0,65535) +#define CLIP(x) LIM((int)(x),0,65535) #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } /* @@ -813,27 +805,22 @@ void CLASS canon_load_raw() FORC(2) free (huff[c]); } -/* - Not a full implementation of Lossless JPEG, just - enough to decode Canon, Kodak and Adobe DNG images. - */ struct jhead { - int bits, high, wide, clrs, sraw, psv, restart, vpred[6]; - ushort *huff[6], *free[4], *row; + int algo, bits, high, wide, clrs, sraw, psv, restart, vpred[6]; + ushort quant[64], idct[64], *huff[20], *free[20], *row; }; int CLASS ljpeg_start (struct jhead *jh, int info_only) { - int c, tag, len; + ushort c, tag, len; uchar data[0x10000]; const uchar *dp; memset (jh, 0, sizeof *jh); jh->restart = INT_MAX; - fread (data, 2, 1, ifp); - if (data[1] != 0xd8) return 0; + if ((fgetc(ifp),fgetc(ifp)) != 0xd8) return 0; do { - fread (data, 2, 2, ifp); + if (!fread (data, 2, 2, ifp)) return 0; tag = data[0] << 8 | data[1]; len = (data[2] << 8 | data[3]) - 2; if (tag <= 0xff00) return 0; @@ -841,7 +828,9 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) switch (tag) { case 0xffc3: jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; + case 0xffc1: case 0xffc0: + jh->algo = tag & 0xff; jh->bits = data[0]; jh->high = data[1] << 8 | data[2]; jh->wide = data[3] << 8 | data[4]; @@ -850,20 +839,25 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) break; case 0xffc4: if (info_only) break; - for (dp = data; dp < data+len && (c = *dp++) < 4; ) + for (dp = data; dp < data+len && !((c = *dp++) & -20); ) jh->free[c] = jh->huff[c] = make_decoder_ref (&dp); break; case 0xffda: jh->psv = data[1+data[0]*2]; jh->bits -= data[3+data[0]*2] & 15; break; + case 0xffdb: + FORC(64) jh->quant[c] = data[c*2+1] << 8 | data[c*2+2]; + break; case 0xffdd: jh->restart = data[0] << 8 | data[1]; } } while (tag != 0xffda); + if (jh->bits > 16 || jh->clrs > 6 || + !jh->bits || !jh->high || !jh->wide || !jh->clrs) return 0; if (info_only) return 1; - if (jh->clrs > 6 || !jh->huff[0]) return 0; - FORC(5) if (!jh->huff[c+1]) jh->huff[c+1] = jh->huff[c]; + if (!jh->huff[0]) return 0; + FORC(19) if (!jh->huff[c+1]) jh->huff[c+1] = jh->huff[c]; if (jh->sraw) { FORC(4) jh->huff[2+c] = jh->huff[1]; FORC(jh->sraw) jh->huff[1+c] = jh->huff[0]; @@ -1042,23 +1036,59 @@ void CLASS adobe_copy_pixel (unsigned row, unsigned col, ushort **rp) { int c; - if (is_raw == 2 && shot_select) (*rp)++; + if (tiff_samples == 2 && shot_select) (*rp)++; if (raw_image) { if (row < raw_height && col < raw_width) RAW(row,col) = curve[**rp]; - *rp += is_raw; + *rp += tiff_samples; } else { if (row < height && col < width) FORC(tiff_samples) image[row*width+col][c] = curve[(*rp)[c]]; *rp += tiff_samples; } - if (is_raw == 2 && shot_select) (*rp)--; + if (tiff_samples == 2 && shot_select) (*rp)--; +} + +void CLASS ljpeg_idct (struct jhead *jh) +{ + int c, i, j, len, skip, coef; + float work[3][8][8]; + static float cs[106] = { 0 }; + static const uchar zigzag[80] = + { 0, 1, 8,16, 9, 2, 3,10,17,24,32,25,18,11, 4, 5,12,19,26,33, + 40,48,41,34,27,20,13, 6, 7,14,21,28,35,42,49,56,57,50,43,36, + 29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54, + 47,55,62,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63 }; + + if (!cs[0]) + FORC(106) cs[c] = cos((c & 31)*M_PI/16)/2; + memset (work, 0, sizeof work); + work[0][0][0] = jh->vpred[0] += ljpeg_diff (jh->huff[0]) * jh->quant[0]; + for (i=1; i < 64; i++ ) { + len = gethuff (jh->huff[16]); + i += skip = len >> 4; + if (!(len &= 15) && skip < 15) break; + coef = getbits(len); + if ((coef & (1 << (len-1))) == 0) + coef -= (1 << len) - 1; + ((float *)work)[zigzag[i]] = coef * jh->quant[i]; + } + FORC(8) work[0][0][c] *= M_SQRT1_2; + FORC(8) work[0][c][0] *= M_SQRT1_2; + for (i=0; i < 8; i++) + for (j=0; j < 8; j++) + FORC(8) work[1][i][j] += work[0][i][c] * cs[(j*2+1)*c]; + for (i=0; i < 8; i++) + for (j=0; j < 8; j++) + FORC(8) work[2][i][j] += work[1][c][j] * cs[(i*2+1)*c]; + + FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c]+0.5); } void CLASS lossless_dng_load_raw() { - unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col; + unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col, i, j; struct jhead jh; ushort *rp; @@ -1069,14 +1099,32 @@ void CLASS lossless_dng_load_raw() if (!ljpeg_start (&jh, 0)) break; jwide = jh.wide; if (filters) jwide *= jh.clrs; - jwide /= is_raw; - for (row=col=jrow=0; jrow < jh.high; jrow++) { - rp = ljpeg_row (jrow, &jh); - for (jcol=0; jcol < jwide; jcol++) { - adobe_copy_pixel (trow+row, tcol+col, &rp); - if (++col >= tile_width || col >= raw_width) - row += 1 + (col = 0); - } + jwide /= MIN (is_raw, tiff_samples); + switch (jh.algo) { + case 0xc1: + jh.vpred[0] = 16384; + getbits(-1); + for (jrow=0; jrow+7 < jh.high; jrow += 8) { + for (jcol=0; jcol+7 < jh.wide; jcol += 8) { + ljpeg_idct (&jh); + rp = jh.idct; + row = trow + jcol/tile_width + jrow*2; + col = tcol + jcol%tile_width; + for (i=0; i < 16; i+=2) + for (j=0; j < 8; j++) + adobe_copy_pixel (row+i, col+j, &rp); + } + } + break; + case 0xc3: + for (row=col=jrow=0; jrow < jh.high; jrow++) { + rp = ljpeg_row (jrow, &jh); + for (jcol=0; jcol < jwide; jcol++) { + adobe_copy_pixel (trow+row, tcol+col, &rp); + if (++col >= tile_width || col >= raw_width) + row += 1 + (col = 0); + } + } } fseek (ifp, save+4, SEEK_SET); if ((tcol += tile_width) >= raw_width) @@ -1721,7 +1769,7 @@ void CLASS phase_one_load_raw_c() pixel[col] = curve[pixel[col]]; } for (col=0; col < raw_width; col++) { - i = (pixel[col] << 2) - ph1.black + i = (pixel[col] << 2*(ph1.format != 8)) - ph1.black + cblack[row][col >= ph1.split_col] + rblack[col][row >= ph1.split_row]; if (i > 0) RAW(row,col) = i; @@ -2813,6 +2861,8 @@ void CLASS smal_decode_segment (unsigned seg[2][2], int holes) fseek (ifp, seg[0][1]+1, SEEK_SET); getbits(-1); + if (seg[1][0] > raw_width*raw_height) + seg[1][0] = raw_width*raw_height; for (pix=seg[0][0]; pix < seg[1][0]; pix++) { for (s=0; s < 3; s++) { data = data << nbits | getbits(nbits); @@ -5261,7 +5311,7 @@ nf: order = 0x4949; FORC4 cam_mul[c ^ (c >> 1) ^ 1] = get4(); } if (tag == 0x3d && type == 3 && len == 4) - FORC4 cblack[c ^ c >> 1] = get2() >> (14-tiff_ifd[2].bps); + FORC4 cblack[c ^ c >> 1] = get2() >> (14-tiff_bps); if (tag == 0x81 && type == 4) { data_offset = get4(); fseek (ifp, data_offset + 41, SEEK_SET); @@ -5291,7 +5341,8 @@ nf: order = 0x4949; break; case 102: fseek (ifp, 6, SEEK_CUR); - goto get2_rggb; + FORC4 cam_mul[c ^ (c >> 1)] = get2(); + break; case 103: fseek (ifp, 16, SEEK_CUR); FORC4 cam_mul[c] = get2(); @@ -5325,7 +5376,7 @@ nf: order = 0x4949; if (tag == 0x200 && len == 4) FORC4 cblack[c ^ c >> 1] = get2(); if (tag == 0x201 && len == 4) - goto get2_rggb; + FORC4 cam_mul[c ^ (c >> 1)] = get2(); if (tag == 0x220 && type == 7) meta_offset = ftell(ifp); if (tag == 0x401 && type == 4 && len == 4) @@ -5371,7 +5422,7 @@ get2_256: } if ((tag | 0x70) == 0x2070 && (type == 4 || type == 13)) fseek (ifp, get4()+base, SEEK_SET); - if (tag == 0x2020) + if (tag == 0x2020 && !strncmp(buf,"OLYMP",5)) parse_thumb_note (base, 257, 258); if (tag == 0x2040) parse_makernote (base, 0x2040); @@ -5382,11 +5433,12 @@ get2_256: if (tag == 0x4001 && len > 500) { i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126; fseek (ifp, i, SEEK_CUR); -get2_rggb: FORC4 cam_mul[c ^ (c >> 1)] = get2(); - i = len >> 3 == 164 || len == 1506 ? 112:22; - fseek (ifp, i, SEEK_CUR); - FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + for (i+=18; i <= len; i+=10) { + get2(); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + if (sraw_mul[1] == 1170) break; + } } if (tag == 0x4021 && get4() && get4()) FORC4 cam_mul[c] = 1024; @@ -5439,12 +5491,14 @@ void CLASS parse_exif (int base) while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { - case 33434: shutter = getreal(type); break; + case 33434: tiff_ifd[tiff_nifds-1].shutter = + shutter = getreal(type); break; case 33437: aperture = getreal(type); break; case 34855: iso_speed = get2(); break; case 36867: case 36868: get_timestamp(0); break; case 37377: if ((expo = -getreal(type)) < 128) + tiff_ifd[tiff_nifds-1].shutter = shutter = pow (2, expo); break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; @@ -5682,6 +5736,8 @@ int CLASS parse_tiff_ifd (int base) case 61443: tiff_ifd[ifd].samples = len & 7; tiff_ifd[ifd].bps = getint(type); + if (tiff_bps < tiff_ifd[ifd].bps) + tiff_bps = tiff_ifd[ifd].bps; break; case 61446: raw_height = 0; @@ -5843,7 +5899,7 @@ int CLASS parse_tiff_ifd (int base) parse_kodak_ifd (base); break; case 33434: /* ExposureTime */ - shutter = getreal(type); + tiff_ifd[ifd].shutter = shutter = getreal(type); break; case 33437: /* FNumber */ aperture = getreal(type); @@ -5971,6 +6027,14 @@ int CLASS parse_tiff_ifd (int base) if (!make[0]) strcpy (make, "DNG"); is_raw = 1; break; + case 50708: /* UniqueCameraModel */ + if (model[0]) break; + fgets (make, 64, ifp); + if ((cp = strchr(make,' '))) { + strcpy(model,cp+1); + *cp = 0; + } + break; case 50710: /* CFAPlaneColor */ if (filters == 9) break; if (len > 4) len = 4; @@ -5984,10 +6048,7 @@ guess_cfa_pc: filters -= !filters; break; case 50711: /* CFALayout */ - if (get2() == 2) { - fuji_width = 1; - filters = 0x49494949; - } + if (get2() == 2) fuji_width = 1; break; case 291: case 50712: /* LinearizationTable */ @@ -6010,7 +6071,7 @@ guess_cfa_pc: break; case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ - for (num=i=0; i < len; i++) + for (num=i=0; i < (len & 0xffff); i++) num += getreal(type); black += num/len + 0.5; break; @@ -6128,7 +6189,7 @@ int CLASS parse_tiff (int base) void CLASS apply_tiff() { - int max_samp=0, raw=-1, thm=-1, i; + int max_samp=0, ties=0, os, ns, raw=-1, thm=-1, i; struct jhead jh; thumb_misc = 16; @@ -6140,13 +6201,25 @@ void CLASS apply_tiff() thumb_height = jh.high; } } + for (i=tiff_nifds; i--; ) { + if (tiff_ifd[i].shutter) + shutter = tiff_ifd[i].shutter; + tiff_ifd[i].shutter = shutter; + } for (i=0; i < tiff_nifds; i++) { if (max_samp < tiff_ifd[i].samples) max_samp = tiff_ifd[i].samples; if (max_samp > 3) max_samp = 3; + os = raw_width*raw_height; + ns = tiff_ifd[i].width*tiff_ifd[i].height; + if (tiff_bps) { + os *= tiff_bps; + ns *= tiff_ifd[i].bps; + } if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) && (tiff_ifd[i].width | tiff_ifd[i].height) < 0x10000 && - tiff_ifd[i].width*tiff_ifd[i].height > raw_width*raw_height) { + ns && ((ns > os && (ties = 1)) || + (ns == os && shot_select == ties++))) { raw_width = tiff_ifd[i].width; raw_height = tiff_ifd[i].height; tiff_bps = tiff_ifd[i].bps; @@ -6156,9 +6229,11 @@ void CLASS apply_tiff() tiff_samples = tiff_ifd[i].samples; tile_width = tiff_ifd[i].tile_width; tile_length = tiff_ifd[i].tile_length; + shutter = tiff_ifd[i].shutter; raw = i; } } + if (is_raw == 1 && ties) is_raw = ties; if (!tile_width ) tile_width = INT_MAX; if (!tile_length) tile_length = INT_MAX; for (i=tiff_nifds; i--; ) @@ -6235,8 +6310,8 @@ void CLASS apply_tiff() if (!dng_version) if ( (tiff_samples == 3 && tiff_ifd[raw].bytes && tiff_bps != 14 && (tiff_compress & -16) != 32768) - || (tiff_bps == 8 && !strcasestr(make,"Kodak") && - !strstr(model2,"DEBUG RAW"))) + || (tiff_bps == 8 && strncmp(make,"Phase",5) && + !strcasestr(make,"Kodak") && !strstr(model2,"DEBUG RAW"))) is_raw = 0; for (i=0; i < tiff_nifds; i++) if (i != raw && tiff_ifd[i].samples == max_samp && @@ -6377,9 +6452,7 @@ void CLASS ciff_block_1030() bitbuf = bitbuf << 16 | (get2() ^ key[i++ & 1]); vbits += 16; } - white[row][col] = - bitbuf << (LONG_BIT - vbits) >> (LONG_BIT - bpp); - vbits -= bpp; + white[row][col] = bitbuf >> (vbits -= bpp) & ~(-1 << bpp); } } @@ -6658,7 +6731,7 @@ void CLASS parse_fuji (int offset) } else if (tag == 0xc000) { c = order; order = 0x4949; - if ((tag = get4()) > 10000) tag = get4(); + while ((tag = get4()) > raw_width); width = tag; height = get4(); order = c; @@ -6680,7 +6753,7 @@ int CLASS parse_jpeg (int offset) order = 0x4d4d; len = get2() - 2; save = ftell(ifp); - if (mark == 0xc0 || mark == 0xc3) { + if (mark == 0xc0 || mark == 0xc3 || mark == 0xc9) { fgetc(ifp); raw_height = get2(); raw_width = get2(); @@ -6974,8 +7047,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9805,-2689,-1312,-5803,13064,3068,-2438,3075,8775 } }, { "Canon EOS D60", 0, 0xfa0, { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, - { "Canon EOS 5DS", 0, 0x3c96, /* DJC */ - { 6885,-753,-856,-4416,11752,2665,-1266,2393,5468 } }, + { "Canon EOS 5DS", 0, 0x3c96, + { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, @@ -7004,6 +7077,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { "Canon EOS 80D", 0, 0, + { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS 300D", 0, 0xfa0, @@ -7024,12 +7099,22 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS 700D", 0, 0x3c00, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 750D", 0, 0x368e, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 760D", 0, 0x350f, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, { 6444,-904,-893,-4563,12308,2535,-903,2016,6728 } }, { "Canon EOS 1200D", 0, 0x37c2, { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, + { "Canon EOS 1300D", 0, 0x3510, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS M3", 0, 0, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M10", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, { "Canon EOS M", 0, 0, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS-1Ds Mark III", 0, 0x3bb0, @@ -7048,6 +7133,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } }, { "Canon EOS-1D C", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { "Canon EOS-1D X Mark II", 0, 0, + { 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 } }, { "Canon EOS-1D X", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, { "Canon EOS-1D", 0, 0xe20, @@ -7076,14 +7163,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { -4778,9467,2172,4743,-1141,4344,-5146,9908,6077,-1566,11051,557 } }, { "Canon PowerShot G2", 0, 0, { 9087,-2693,-1049,-6715,14382,2537,-2291,2819,7790 } }, + { "Canon PowerShot G3 X", 0, 0, + { 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 } }, { "Canon PowerShot G3", 0, 0, { 9212,-2781,-1073,-6573,14189,2605,-2300,2844,7664 } }, + { "Canon PowerShot G5 X", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G5", 0, 0, { 9757,-2872,-933,-5972,13861,2301,-1622,2328,7212 } }, { "Canon PowerShot G6", 0, 0, { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { "Canon PowerShot G9 X", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9", 0, 0, { 7368,-2141,-598,-5621,13254,2625,-1418,1696,5743 } }, { "Canon PowerShot Pro1", 0, 0, @@ -7142,6 +7235,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 14134,-5576,-1527,-1991,10719,1273,-1158,1929,3581 } }, { "Canon PowerShot SX220", 0, 0, /* DJC */ { 13898,-5076,-1447,-1405,10109,1297,-244,1860,3687 } }, + { "Canon IXUS 160", 0, 0, /* DJC */ + { 11657,-3781,-1136,-3544,11262,2283,-160,1219,4700 } }, { "Casio EX-S20", 0, 0, /* DJC */ { 11634,-3924,-1128,-4968,12954,2015,-1588,2648,7206 } }, { "Casio EX-Z750", 0, 0, /* DJC */ @@ -7156,6 +7251,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 20183,-4295,-423,-3940,15330,3985,-280,4870,9800 } }, { "Contax N Digital", 0, 0xf1e, { 7777,1285,-1053,-9280,16543,2916,-3677,5679,7060 } }, + { "DXO ONE", 0, 0, + { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Epson R-D1", 0, 0, { 6827,-1878,-732,-8429,16012,2564,-704,592,7145 } }, { "Fujifilm E550", 0, 0, @@ -7236,25 +7333,31 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11768,-4971,-1133,-4904,12927,2183,-480,1723,4605 } }, { "Fujifilm X30", 0, 0, { 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 } }, + { "Fujifilm X70", 0, 0, + { 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 } }, { "Fujifilm X-Pro1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-Pro2", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, { "Fujifilm X-A2", 0, 0, { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-E2S", 0, 0, + { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, { "Fujifilm X-E2", 0, 0, { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, - { "Fujifilm X-T1", 0, 0, + { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, - { "Fujifilm XQ", 0, 0, // XQ1 and XQ2 + { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, @@ -7396,8 +7499,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D5500", 0, 0, { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { "Nikon D500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D50", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { "Nikon D5", 0, 0, + { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } }, { "Nikon D600", 0, 0x3e07, { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, { "Nikon D610", 0, 0, @@ -7408,8 +7515,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon D7100", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, - { "Nikon D7200", 0, 0, /* DJC */ - { 6111,-2759,-358,-5108,10766,4343,-769,1691,8030 } }, + { "Nikon D7200", 0, 0, + { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, @@ -7474,8 +7581,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, { "Nikon 1 J4", 0, 0, { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, - { "Nikon 1 J5", 0, 0, /* DJC */ - { 2621,-856,500,-4471,8761,5711,-1321,2644,11945 } }, + { "Nikon 1 J5", 0, 0, + { 7520,-2518,-645,-3844,12102,1945,-913,2249,6835 } }, { "Nikon 1 S2", 200, 0, { 6612,-1342,-618,-3338,11055,2623,-174,1792,5075 } }, { "Nikon 1 V2", 0, 0, @@ -7486,6 +7593,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } }, { "Nikon 1 ", 0, 0, /* J1, J2, S1, V1 */ { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } }, + { "Olympus AIR A01", 0, 0, + { 8992,-3093,-639,-2563,10721,2122,-437,1270,5473 } }, { "Olympus C5050", 0, 0, { 10508,-3124,-1273,-6079,14294,1901,-1653,2306,6237 } }, { "Olympus C5060", 0, 0, @@ -7556,7 +7665,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, - { "Olympus E-M10", 0, 0, + { "Olympus E-M10", 0, 0, /* also E-M10 Mark II */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, @@ -7564,6 +7673,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, { "Olympus E-M5", 0, 0xfe1, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus PEN-F", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, + { "Olympus SH-2", 0, 0, + { 10156,-3425,-1077,-2611,11177,1624,-385,1592,5080 } }, { "Olympus SP350", 0, 0, { 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } }, { "Olympus SP3", 0, 0, @@ -7580,6 +7693,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11522,-4044,-1146,-4736,12172,2904,-988,1829,6039 } }, { "Olympus STYLUS1", 0, 0, { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, + { "Olympus TG-4", 0, 0, + { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "Olympus XZ-1", 0, 0, @@ -7614,6 +7729,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 } }, { "Pentax K-r", 0, 0, { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, + { "Pentax K-1", 0, 0, + { 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 } }, + { "Pentax K-30", 0, 0, + { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, + { "Pentax K-3 II", 0, 0, + { 8626,-2607,-1155,-3995,12301,1881,-1039,1822,6925 } }, { "Pentax K-3", 0, 0, { 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 } }, { "Pentax K-5 II", 0, 0, @@ -7624,6 +7745,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, { "Pentax K-S1", 0, 0, { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, + { "Pentax K-S2", 0, 0, + { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + { "Pentax Q-S1", 0, 0, + { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, { "Panasonic DMC-CM1", 15, 0, @@ -7634,6 +7759,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, { "Panasonic DMC-FZ28", 15, 0xf96, { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { "Panasonic DMC-FZ330", 15, 0, + { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, + { "Panasonic DMC-FZ300", 15, 0, + { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ30", 0, 0xf94, { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, { "Panasonic DMC-FZ3", 15, 0, @@ -7714,6 +7843,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7798,-2562,-740,-3879,11584,2613,-1055,2248,5434 } }, { "Panasonic DMC-G6", 15, 0xfff, { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, + { "Panasonic DMC-G7", 15, 0xfff, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -7726,6 +7857,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } }, { "Panasonic DMC-GF7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GF8", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -7742,6 +7875,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, { "Panasonic DMC-GX7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GX8", 15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { "Panasonic DMC-TZ1", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + { "Panasonic DMC-ZS1", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, { "Panasonic DMC-TZ6", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, { "Panasonic DMC-ZS4", 15, 0, @@ -7750,6 +7889,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, { "Panasonic DMC-ZS5", 15, 0, { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, + { "Panasonic DMC-TZ8", 15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Panasonic DMC-ZS6", 15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Leica S (Typ 007)", 0, 0, + { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, + { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, + { "Leica Q (Typ 116)", 0, 0, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica M (Typ 262)", 0, 0, + { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, + { "Leica SL (Typ 601)", 0, 0, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830} }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -7764,8 +7917,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, { "Phase One P65", 0, 0, { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { "Photron BC2-HD", 0, 0, /* DJC */ + { 14603,-4122,-528,-1810,9794,2017,-297,2763,5936 } }, { "Red One", 704, 0xffff, /* DJC */ { 21014,-7891,-2613,-3056,12201,856,-2203,5125,8042 } }, + { "Ricoh GR II", 0, 0, + { 4630,-834,-423,-4977,12805,2417,-638,1467,6115 } }, + { "Ricoh GR", 0, 0, + { 3708,-543,-160,-5381,12254,3556,-1471,1929,8234 } }, { "Samsung EX1", 0, 0x3e00, { 8898,-2498,-994,-3144,11328,2066,-760,1381,4576 } }, { "Samsung EX2F", 0, 0x7ff, @@ -7774,6 +7933,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, { "Samsung NX mini", 0, 0, { 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 } }, + { "Samsung NX3300", 0, 0, + { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX3000", 0, 0, { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX30", 0, 0, /* NX30, NX300, NX300M */ @@ -7790,8 +7951,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, { "Samsung NX10", 0, 0, /* also NX100 */ { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, - { "Samsung NX500", 0, 0, /* DJC */ - { 10196,-4532,-272,-3888,11489,2400,-1203,2424,9173 } }, + { "Samsung NX500", 0, 0, + { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, { "Samsung NX5", 0, 0, { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, { "Samsung NX1", 0, 0, @@ -7808,17 +7969,19 @@ void CLASS adobe_coeff (const char *make, const char *model) { 16442,-2956,-2422,-2877,12128,750,-1136,6066,4559 } }, { "Sony DSC-F828", 0, 0, { 7924,-1910,-777,-8226,15459,2998,-1517,2199,6818,-7242,11401,3481 } }, - { "Sony DSC-R1", 512, 0, + { "Sony DSC-R1", 0, 0, { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, - { "Sony DSC-RX100M", 200, 0, /* M2 and M3 */ + { "Sony DSC-RX100M", 0, 0, /* M2, M3, and M4 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, - { "Sony DSC-RX100", 200, 0, + { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, - { "Sony DSC-RX10", 200, 0, + { "Sony DSC-RX10", 0, 0, /* also RX10M2 */ { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, - { "Sony DSC-RX1", 128, 0, + { "Sony DSC-RX1RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony DSC-RX1", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, @@ -7836,71 +7999,77 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, { "Sony DSLR-A390", 0, 0, { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, - { "Sony DSLR-A450", 128, 0xfeb, + { "Sony DSLR-A450", 0, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, - { "Sony DSLR-A580", 128, 0xfeb, + { "Sony DSLR-A580", 0, 0xfeb, { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, - { "Sony DSLR-A500", 128, 0xfeb, + { "Sony DSLR-A500", 0, 0xfeb, { 6046,-1127,-278,-5574,13076,2786,-691,1419,7625 } }, - { "Sony DSLR-A5", 128, 0xfeb, + { "Sony DSLR-A5", 0, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, - { "Sony DSLR-A700", 128, 0, + { "Sony DSLR-A700", 0, 0, { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, - { "Sony DSLR-A850", 128, 0, + { "Sony DSLR-A850", 0, 0, { 5413,-1162,-365,-5665,13098,2866,-608,1179,8440 } }, - { "Sony DSLR-A900", 128, 0, + { "Sony DSLR-A900", 0, 0, { 5209,-1072,-397,-8845,16120,2919,-1618,1803,8654 } }, - { "Sony ILCA-77M2", 128, 0, + { "Sony ILCA-68", 0, 0, + { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, + { "Sony ILCA-77M2", 0, 0, { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, - { "Sony ILCE-7M2", 128, 0, + { "Sony ILCE-6300", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, - { "Sony ILCE-7S", 128, 0, + { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, - { "Sony ILCE-7R", 128, 0, + { "Sony ILCE-7RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, - { "Sony ILCE-7", 128, 0, + { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, - { "Sony ILCE", 128, 0, /* 3000, 5000, 5100, 6000, and QX1 */ + { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony NEX-5N", 128, 0, + { "Sony NEX-5N", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony NEX-5R", 128, 0, + { "Sony NEX-5R", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-5T", 128, 0, + { "Sony NEX-5T", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-3N", 128, 0, + { "Sony NEX-3N", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, { "Sony NEX-3", 138, 0, /* DJC */ { 6907,-1256,-645,-4940,12621,2320,-1710,2581,6230 } }, { "Sony NEX-5", 116, 0, /* DJC */ { 6807,-1350,-342,-4216,11649,2567,-1089,2001,6420 } }, - { "Sony NEX-3", 128, 0, /* Adobe */ + { "Sony NEX-3", 0, 0, /* Adobe */ { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, - { "Sony NEX-5", 128, 0, /* Adobe */ + { "Sony NEX-5", 0, 0, /* Adobe */ { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, - { "Sony NEX-6", 128, 0, + { "Sony NEX-6", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-7", 128, 0, + { "Sony NEX-7", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony NEX", 128, 0, /* NEX-C3, NEX-F3 */ + { "Sony NEX", 0, 0, /* NEX-C3, NEX-F3 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A33", 128, 0, + { "Sony SLT-A33", 0, 0, { 6069,-1221,-366,-5221,12779,2734,-1024,2066,6834 } }, - { "Sony SLT-A35", 128, 0, + { "Sony SLT-A35", 0, 0, { 5986,-1618,-415,-4557,11820,3120,-681,1404,6971 } }, - { "Sony SLT-A37", 128, 0, + { "Sony SLT-A37", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A55", 128, 0, + { "Sony SLT-A55", 0, 0, { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, - { "Sony SLT-A57", 128, 0, + { "Sony SLT-A57", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A58", 128, 0, + { "Sony SLT-A58", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A65", 128, 0, + { "Sony SLT-A65", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony SLT-A77", 128, 0, + { "Sony SLT-A77", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony SLT-A99", 128, 0, + { "Sony SLT-A99", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, }; double cam_xyz[4][3]; @@ -8057,6 +8226,8 @@ void CLASS identify() { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 6096, 4056, 72, 34, 0, 0 }, + { 6288, 4056, 264, 34, 0, 0 }, { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { @@ -8070,6 +8241,7 @@ void CLASS identify() { 0x261, "EOS 50D" }, { 0x281, "EOS-1D Mark IV" }, { 0x287, "EOS 60D" }, { 0x167, "EOS-1DS" }, { 0x325, "EOS 70D" }, + { 0x350, "EOS 80D" }, { 0x328, "EOS-1D X Mark II" }, { 0x170, "EOS 300D" }, { 0x188, "EOS-1Ds Mark II" }, { 0x176, "EOS 450D" }, { 0x215, "EOS-1Ds Mark III" }, { 0x189, "EOS 350D" }, { 0x324, "EOS-1D C" }, @@ -8079,9 +8251,12 @@ void CLASS identify() { 0x286, "EOS 600D" }, { 0x285, "EOS 5D Mark III" }, { 0x301, "EOS 650D" }, { 0x302, "EOS 6D" }, { 0x326, "EOS 700D" }, { 0x250, "EOS 7D" }, + { 0x393, "EOS 750D" }, { 0x289, "EOS 7D Mark II" }, + { 0x347, "EOS 760D" }, { 0x254, "EOS 1000D" }, { 0x288, "EOS 1100D" }, - { 0x327, "EOS 1200D" }, + { 0x327, "EOS 1200D" }, { 0x382, "Canon EOS 5DS" }, + { 0x404, "EOS 1300D" }, { 0x401, "Canon EOS 5DS R" }, { 0x346, "EOS 100D" }, }, sonique[] = { { 0x002, "DSC-R1" }, { 0x100, "DSLR-A100" }, @@ -8109,7 +8284,10 @@ void CLASS identify() { 0x139, "ILCE-5000" }, { 0x13d, "DSC-RX100M3" }, { 0x13e, "ILCE-7S" }, { 0x13f, "ILCA-77M2" }, { 0x153, "ILCE-5100" }, { 0x154, "ILCE-7M2" }, - { 0x15a, "ILCE-QX1" }, + { 0x155, "DSC-RX100M4" },{ 0x156, "DSC-RX10M2" }, + { 0x158, "DSC-RX1RM2" }, { 0x15a, "ILCE-QX1" }, + { 0x15b, "ILCE-7RM2" }, { 0x15e, "ILCE-7SM2" }, + { 0x161, "ILCA-68" }, { 0x165, "ILCE-6300" }, }; static const struct { unsigned fsize; @@ -8146,6 +8324,7 @@ void CLASS identify() { 19131120,4168,3060,92,16, 4, 1,40,0x94,0,2,"Canon","PowerShot SX220 HS" }, { 21936096,4464,3276,25,10,73,12,40,0x16,0,2,"Canon","PowerShot SX30 IS" }, { 24724224,4704,3504, 8,16,56, 8,40,0x94,0,2,"Canon","PowerShot A3300 IS" }, + { 30858240,5248,3920, 8,16,56,16,40,0x94,0,2,"Canon","IXUS 160" }, { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, { 3217760,2080,1547, 0, 0,10, 1, 0,0x94,0,1,"Casio","QV-3*00EX" }, { 6218368,2585,1924, 0, 0, 9, 0, 0,0x94,0,1,"Casio","QV-5700" }, @@ -8204,6 +8383,8 @@ void CLASS identify() { 4841984,2090,1544, 0, 0,22, 0, 0,0x94,7,1,"Pentax","Optio S" }, { 6114240,2346,1737, 0, 0,22, 0, 0,0x94,7,1,"Pentax","Optio S4" }, { 10702848,3072,2322, 0, 0, 0,21,30,0x94,0,1,"Pentax","Optio 750Z" }, + { 4147200,1920,1080, 0, 0, 0, 0, 0,0x49,0,0,"Photron","BC2-HD" }, + { 4151666,1920,1080, 0, 0, 0, 0, 0,0x49,0,0,"Photron","BC2-HD",8 }, { 13248000,2208,3000, 0, 0, 0, 0,13,0x61,0,0,"Pixelink","A782" }, { 6291456,2048,1536, 0, 0, 0, 0,96,0x61,0,0,"RoverShot","3320AF" }, { 311696, 644, 484, 0, 0, 0, 0, 0,0x16,0,8,"ST Micro","STV680 VGA" }, @@ -8220,7 +8401,7 @@ void CLASS identify() static const char *corp[] = { "AgfaPhoto", "Canon", "Casio", "Epson", "Fujifilm", "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", - "Nikon", "Nokia", "Olympus", "Pentax", "Phase One", "Ricoh", + "Nikon", "Nokia", "Olympus", "Ricoh", "Pentax", "Phase One", "Samsung", "Sigma", "Sinar", "Sony" }; char head[32], *cp; int hlen, flen, fsize, zero_fsize=1, i, c; @@ -8387,7 +8568,7 @@ void CLASS identify() parse_foveon(); else if (!memcmp (head,"CI",2)) parse_cine(); - else + if (make[0] == 0) for (zero_fsize=i=0; i < sizeof table / sizeof *table; i++) if (fsize == table[i].fsize) { strcpy (make, table[i].make ); @@ -8482,9 +8663,10 @@ void CLASS identify() width = 4014; if (dng_version) { if (filters == UINT_MAX) filters = 0; - if (filters) is_raw = tiff_samples; - else colors = tiff_samples; + if (filters) is_raw *= tiff_samples; + else colors = tiff_samples; switch (tiff_compress) { + case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; @@ -8536,6 +8718,8 @@ void CLASS identify() top_margin = filters = 0; strcpy (model,"C603"); } + if (!strcmp(make,"Sony") && raw_width > 3888) + black = 128 << (tiff_bps - 12); if (is_foveon) { if (height*2 < width) pixel_aspect = 0.5; if (height > width) pixel_aspect = 2; @@ -8550,6 +8734,10 @@ void CLASS identify() SWAP(height,width); SWAP(raw_height,raw_width); } + if (width == 7200 && height == 3888) { + raw_width = width = 6480; + raw_height = height = 4320; + } filters = 0; tiff_samples = colors = 3; load_raw = &CLASS canon_sraw_load_raw; @@ -8725,7 +8913,7 @@ canon_a5: top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; - if (width == 4032 || width == 4952) left_margin = 0; + if (width == 4032 || width == 4952 || width == 6032) left_margin = 0; if (width == 3328 && (width -= 66)) left_margin = 34; if (width == 4936) left_margin = 4; if (!strcmp(model,"HS50EXR") || @@ -8968,6 +9156,8 @@ konica_400z: thumb_length = flen - (thumb_offset = 0xa39800); thumb_height = 480; thumb_width = 640; + } else if (!strcmp(model,"TG-4")) { + width -= 16; } } else if (!strcmp(model,"N Digital")) { height = 2047; @@ -8995,16 +9185,29 @@ konica_400z: order = 0x4d4d; } else if (!strcmp(make,"Sony") && raw_width == 4288) { width -= 32; + } else if (!strcmp(make,"Sony") && raw_width == 4600) { + if (!strcmp(model,"DSLR-A350")) + height -= 4; + black = 0; } else if (!strcmp(make,"Sony") && raw_width == 4928) { if (height < 3280) width -= 8; } else if (!strcmp(make,"Sony") && raw_width == 5504) { width -= height > 3664 ? 8 : 32; + if (!strncmp(model,"DSC",3)) + black = 200 << (tiff_bps - 12); } else if (!strcmp(make,"Sony") && raw_width == 6048) { width -= 24; if (strstr(model,"RX1") || strstr(model,"A99")) width -= 6; } else if (!strcmp(make,"Sony") && raw_width == 7392) { width -= 30; + } else if (!strcmp(make,"Sony") && raw_width == 8000) { + width -= 32; + if (!strncmp(model,"DSC",3)) { + tiff_bps = 14; + load_raw = &CLASS unpacked_load_raw; + black = 512; + } } else if (!strcmp(model,"DSLR-A100")) { if (width == 3880) { height--; @@ -9016,8 +9219,6 @@ konica_400z: load_flags = 2; } filters = 0x61616161; - } else if (!strcmp(model,"DSLR-A350")) { - height -= 4; } else if (!strcmp(model,"PIXL")) { height -= top_margin = 4; width -= left_margin = 32; @@ -9082,6 +9283,7 @@ bw: colors = 1; width = 768; data_offset = 1152; load_raw = &CLASS kodak_radc_load_raw; + tiff_bps = 12; } else if (strstr(model,"DC50")) { strcpy (model, "DC50"); height = 512; @@ -9160,7 +9362,7 @@ dng_skip: if (raw_color) adobe_coeff ("Apple","Quicktake"); if (fuji_width) { fuji_width = width >> !fuji_layout; - if (~fuji_width & 1) filters = 0x49494949; + filters = fuji_width & 1 ? 0x94949494 : 0x49494949; width = (height >> fuji_layout) + fuji_width; height = width - 1; pixel_aspect = 1; @@ -9274,10 +9476,14 @@ void CLASS convert_to_rgb() { { 0.529317, 0.330092, 0.140588 }, { 0.098368, 0.873465, 0.028169 }, { 0.016879, 0.117663, 0.865457 } }; + static const double aces_rgb[3][3] = + { { 0.432996, 0.375380, 0.189317 }, + { 0.089427, 0.816523, 0.102989 }, + { 0.019165, 0.118150, 0.941914 } }; static const double (*out_rgb[])[3] = - { rgb_rgb, adobe_rgb, wide_rgb, prophoto_rgb, xyz_rgb }; + { rgb_rgb, adobe_rgb, wide_rgb, prophoto_rgb, xyz_rgb, aces_rgb }; static const char *name[] = - { "sRGB", "Adobe RGB (1998)", "WideGamut D65", "ProPhoto D65", "XYZ" }; + { "sRGB", "Adobe RGB (1998)", "WideGamut D65", "ProPhoto D65", "XYZ", "ACES" }; static const unsigned phead[] = { 1024, 0, 0x2100000, 0x6d6e7472, 0x52474220, 0x58595a20, 0, 0, 0, 0x61637370, 0, 0, 0x6e6f6e65, 0, 0, 0, 0, 0xf6d6, 0x10000, 0xd32d }; @@ -9298,7 +9504,7 @@ void CLASS convert_to_rgb() gamma_curve (gamm[0], gamm[1], 0, 0); memcpy (out_cam, rgb_cam, sizeof out_cam); raw_color |= colors == 1 || document_mode || - output_color < 1 || output_color > 5; + output_color < 1 || output_color > 6; if (!raw_color) { oprof = (unsigned *) calloc (phead[0], 1); merror (oprof, "convert_to_rgb()"); @@ -9461,21 +9667,25 @@ struct tiff_hdr { char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; -void CLASS tiff_set (ushort *ntag, +void CLASS tiff_set (struct tiff_hdr *th, ushort *ntag, ushort tag, ushort type, int count, int val) { struct tiff_tag *tt; int c; tt = (struct tiff_tag *)(ntag+1) + (*ntag)++; - tt->tag = tag; - tt->type = type; - tt->count = count; - if (type < 3 && count <= 4) + tt->val.i = val; + if (type == 1 && count <= 4) FORC(4) tt->val.c[c] = val >> (c << 3); - else if (type == 3 && count <= 2) + else if (type == 2) { + count = strnlen((char *)th + val, count-1) + 1; + if (count <= 4) + FORC(4) tt->val.c[c] = ((char *)th)[val+c]; + } else if (type == 3 && count <= 2) FORC(2) tt->val.s[c] = val >> (c << 4); - else tt->val.i = val; + tt->count = count; + tt->type = type; + tt->tag = tag; } #define TOFF(ptr) ((char *)(&(ptr)) - (char *)th) @@ -9489,55 +9699,6 @@ void CLASS tiff_head (struct tiff_hdr *th, int full) th->order = htonl(0x4d4d4949) >> 16; th->magic = 42; th->ifd = 10; - if (full) { - tiff_set (&th->ntag, 254, 4, 1, 0); - tiff_set (&th->ntag, 256, 4, 1, width); - tiff_set (&th->ntag, 257, 4, 1, height); - tiff_set (&th->ntag, 258, 3, colors, output_bps); - if (colors > 2) - th->tag[th->ntag-1].val.i = TOFF(th->bps); - FORC4 th->bps[c] = output_bps; - tiff_set (&th->ntag, 259, 3, 1, 1); - tiff_set (&th->ntag, 262, 3, 1, 1 + (colors > 1)); - } - tiff_set (&th->ntag, 270, 2, 512, TOFF(th->desc)); - tiff_set (&th->ntag, 271, 2, 64, TOFF(th->make)); - tiff_set (&th->ntag, 272, 2, 64, TOFF(th->model)); - if (full) { - if (oprof) psize = ntohl(oprof[0]); - tiff_set (&th->ntag, 273, 4, 1, sizeof *th + psize); - tiff_set (&th->ntag, 277, 3, 1, colors); - tiff_set (&th->ntag, 278, 4, 1, height); - tiff_set (&th->ntag, 279, 4, 1, height*width*colors*output_bps/8); - } else - tiff_set (&th->ntag, 274, 3, 1, "12435867"[flip]-'0'); - tiff_set (&th->ntag, 282, 5, 1, TOFF(th->rat[0])); - tiff_set (&th->ntag, 283, 5, 1, TOFF(th->rat[2])); - tiff_set (&th->ntag, 284, 3, 1, 1); - tiff_set (&th->ntag, 296, 3, 1, 2); - tiff_set (&th->ntag, 305, 2, 32, TOFF(th->soft)); - tiff_set (&th->ntag, 306, 2, 20, TOFF(th->date)); - tiff_set (&th->ntag, 315, 2, 64, TOFF(th->artist)); - tiff_set (&th->ntag, 34665, 4, 1, TOFF(th->nexif)); - if (psize) tiff_set (&th->ntag, 34675, 7, psize, sizeof *th); - tiff_set (&th->nexif, 33434, 5, 1, TOFF(th->rat[4])); - tiff_set (&th->nexif, 33437, 5, 1, TOFF(th->rat[6])); - tiff_set (&th->nexif, 34855, 3, 1, iso_speed); - tiff_set (&th->nexif, 37386, 5, 1, TOFF(th->rat[8])); - if (gpsdata[1]) { - tiff_set (&th->ntag, 34853, 4, 1, TOFF(th->ngps)); - tiff_set (&th->ngps, 0, 1, 4, 0x202); - tiff_set (&th->ngps, 1, 2, 2, gpsdata[29]); - tiff_set (&th->ngps, 2, 5, 3, TOFF(th->gps[0])); - tiff_set (&th->ngps, 3, 2, 2, gpsdata[30]); - tiff_set (&th->ngps, 4, 5, 3, TOFF(th->gps[6])); - tiff_set (&th->ngps, 5, 1, 1, gpsdata[31]); - tiff_set (&th->ngps, 6, 5, 1, TOFF(th->gps[18])); - tiff_set (&th->ngps, 7, 5, 3, TOFF(th->gps[12])); - tiff_set (&th->ngps, 18, 2, 12, TOFF(th->gps[20])); - tiff_set (&th->ngps, 29, 2, 12, TOFF(th->gps[23])); - memcpy (th->gps, gpsdata, sizeof th->gps); - } th->rat[0] = th->rat[2] = 300; th->rat[1] = th->rat[3] = 1; FORC(6) th->rat[4+c] = 1000000; @@ -9552,6 +9713,55 @@ void CLASS tiff_head (struct tiff_hdr *th, int full) sprintf (th->date, "%04d:%02d:%02d %02d:%02d:%02d", t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); strncpy (th->artist, artist, 64); + if (full) { + tiff_set (th, &th->ntag, 254, 4, 1, 0); + tiff_set (th, &th->ntag, 256, 4, 1, width); + tiff_set (th, &th->ntag, 257, 4, 1, height); + tiff_set (th, &th->ntag, 258, 3, colors, output_bps); + if (colors > 2) + th->tag[th->ntag-1].val.i = TOFF(th->bps); + FORC4 th->bps[c] = output_bps; + tiff_set (th, &th->ntag, 259, 3, 1, 1); + tiff_set (th, &th->ntag, 262, 3, 1, 1 + (colors > 1)); + } + tiff_set (th, &th->ntag, 270, 2, 512, TOFF(th->desc)); + tiff_set (th, &th->ntag, 271, 2, 64, TOFF(th->make)); + tiff_set (th, &th->ntag, 272, 2, 64, TOFF(th->model)); + if (full) { + if (oprof) psize = ntohl(oprof[0]); + tiff_set (th, &th->ntag, 273, 4, 1, sizeof *th + psize); + tiff_set (th, &th->ntag, 277, 3, 1, colors); + tiff_set (th, &th->ntag, 278, 4, 1, height); + tiff_set (th, &th->ntag, 279, 4, 1, height*width*colors*output_bps/8); + } else + tiff_set (th, &th->ntag, 274, 3, 1, "12435867"[flip]-'0'); + tiff_set (th, &th->ntag, 282, 5, 1, TOFF(th->rat[0])); + tiff_set (th, &th->ntag, 283, 5, 1, TOFF(th->rat[2])); + tiff_set (th, &th->ntag, 284, 3, 1, 1); + tiff_set (th, &th->ntag, 296, 3, 1, 2); + tiff_set (th, &th->ntag, 305, 2, 32, TOFF(th->soft)); + tiff_set (th, &th->ntag, 306, 2, 20, TOFF(th->date)); + tiff_set (th, &th->ntag, 315, 2, 64, TOFF(th->artist)); + tiff_set (th, &th->ntag, 34665, 4, 1, TOFF(th->nexif)); + if (psize) tiff_set (th, &th->ntag, 34675, 7, psize, sizeof *th); + tiff_set (th, &th->nexif, 33434, 5, 1, TOFF(th->rat[4])); + tiff_set (th, &th->nexif, 33437, 5, 1, TOFF(th->rat[6])); + tiff_set (th, &th->nexif, 34855, 3, 1, iso_speed); + tiff_set (th, &th->nexif, 37386, 5, 1, TOFF(th->rat[8])); + if (gpsdata[1]) { + tiff_set (th, &th->ntag, 34853, 4, 1, TOFF(th->ngps)); + tiff_set (th, &th->ngps, 0, 1, 4, 0x202); + tiff_set (th, &th->ngps, 1, 2, 2, gpsdata[29]); + tiff_set (th, &th->ngps, 2, 5, 3, TOFF(th->gps[0])); + tiff_set (th, &th->ngps, 3, 2, 2, gpsdata[30]); + tiff_set (th, &th->ngps, 4, 5, 3, TOFF(th->gps[6])); + tiff_set (th, &th->ngps, 5, 1, 1, gpsdata[31]); + tiff_set (th, &th->ngps, 6, 5, 1, TOFF(th->gps[18])); + tiff_set (th, &th->ngps, 7, 5, 3, TOFF(th->gps[12])); + tiff_set (th, &th->ngps, 18, 2, 12, TOFF(th->gps[20])); + tiff_set (th, &th->ngps, 29, 2, 12, TOFF(th->gps[23])); + memcpy (th->gps, gpsdata, sizeof th->gps); + } } void CLASS jpeg_thumb() @@ -9672,7 +9882,7 @@ int CLASS main (int argc, const char **argv) puts(_("-n Set threshold for wavelet denoising")); puts(_("-H [0-9] Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)")); puts(_("-t [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW)")); - puts(_("-o [0-5] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ)")); + puts(_("-o [0-6] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ,ACES)")); #ifndef NO_LCMS puts(_("-o Apply output ICC profile from file")); puts(_("-p Apply camera ICC profile from file or \"embed\"")); diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index c0dbd816d..8ebc073d1 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -12,7 +12,7 @@ /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2015 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net This is a command-line ANSI C program to convert raw photos from any digital camera on any computer running any operating system. @@ -31,11 +31,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.475 $ - $Date: 2015/04/11 00:08:36 $ + $Revision: 1.477 $ + $Date: 2016/05/10 21:30:43 $ */ -#define DCRAW_VERSION "9.25" +#define DCRAW_VERSION "9.27" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -100,15 +100,6 @@ typedef unsigned long long UINT64; #define _(String) (String) #endif -#ifdef LJPEG_DECODE -#error Please compile dcraw.c by itself. -#error Do not link it with ljpeg_decode. -#endif - -#ifndef LONG_BIT -#define LONG_BIT (8 * sizeof (long)) -#endif - #define ushort UshORt typedef unsigned char uchar; typedef unsigned short ushort; @@ -787,17 +778,15 @@ struct jhead { int CLASS ljpeg_start (struct jhead *jh, int info_only) { - int c, tag; - ushort len; + ushort c, tag, len; uchar data[0x10000]; const uchar *dp; memset (jh, 0, sizeof *jh); jh->restart = INT_MAX; - fread (data, 2, 1, ifp); - if (data[1] != 0xd8) return 0; + if ((fgetc(ifp),fgetc(ifp)) != 0xd8) return 0; do { - fread (data, 2, 2, ifp); + if (!fread (data, 2, 2, ifp)) return 0; tag = data[0] << 8 | data[1]; len = (data[2] << 8 | data[3]) - 2; if (tag <= 0xff00) return 0; @@ -805,7 +794,9 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) switch (tag) { case 0xffc3: jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; + case 0xffc1: case 0xffc0: + jh->algo = tag & 0xff; jh->bits = data[0]; jh->high = data[1] << 8 | data[2]; jh->wide = data[3] << 8 | data[4]; @@ -814,20 +805,25 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) break; case 0xffc4: if (info_only) break; - for (dp = data; dp < data+len && (c = *dp++) < 4; ) + for (dp = data; dp < data+len && !((c = *dp++) & -20); ) jh->free[c] = jh->huff[c] = make_decoder_ref (&dp); break; case 0xffda: jh->psv = data[1+data[0]*2]; jh->bits -= data[3+data[0]*2] & 15; break; + case 0xffdb: + FORC(64) jh->quant[c] = data[c*2+1] << 8 | data[c*2+2]; + break; case 0xffdd: jh->restart = data[0] << 8 | data[1]; } } while (tag != 0xffda); + if (jh->bits > 16 || jh->clrs > 6 || + !jh->bits || !jh->high || !jh->wide || !jh->clrs) return 0; if (info_only) return 1; - if (jh->clrs > 6 || !jh->huff[0]) return 0; - FORC(5) if (!jh->huff[c+1]) jh->huff[c+1] = jh->huff[c]; + if (!jh->huff[0]) return 0; + FORC(19) if (!jh->huff[c+1]) jh->huff[c+1] = jh->huff[c]; if (jh->sraw) { FORC(4) jh->huff[2+c] = jh->huff[1]; FORC(jh->sraw) jh->huff[1+c] = jh->huff[0]; @@ -1006,23 +1002,59 @@ void CLASS adobe_copy_pixel (unsigned row, unsigned col, ushort **rp) { int c; - if (is_raw == 2 && shot_select) (*rp)++; + if (tiff_samples == 2 && shot_select) (*rp)++; if (raw_image) { if (row < raw_height && col < raw_width) RAW(row,col) = curve[**rp]; - *rp += is_raw; + *rp += tiff_samples; } else { if (row < height && col < width) FORC(tiff_samples) image[row*width+col][c] = curve[(*rp)[c]]; *rp += tiff_samples; } - if (is_raw == 2 && shot_select) (*rp)--; + if (tiff_samples == 2 && shot_select) (*rp)--; +} + +void CLASS ljpeg_idct (struct jhead *jh) +{ + int c, i, j, len, skip, coef; + float work[3][8][8]; + static float cs[106] = { 0 }; + static const uchar zigzag[80] = + { 0, 1, 8,16, 9, 2, 3,10,17,24,32,25,18,11, 4, 5,12,19,26,33, + 40,48,41,34,27,20,13, 6, 7,14,21,28,35,42,49,56,57,50,43,36, + 29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54, + 47,55,62,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63 }; + + if (!cs[0]) + FORC(106) cs[c] = cos((c & 31)*M_PI/16)/2; + memset (work, 0, sizeof work); + work[0][0][0] = jh->vpred[0] += ljpeg_diff (jh->huff[0]) * jh->quant[0]; + for (i=1; i < 64; i++ ) { + len = gethuff (jh->huff[16]); + i += skip = len >> 4; + if (!(len &= 15) && skip < 15) break; + coef = getbits(len); + if ((coef & (1 << (len-1))) == 0) + coef -= (1 << len) - 1; + ((float *)work)[zigzag[i]] = coef * jh->quant[i]; + } + FORC(8) work[0][0][c] *= M_SQRT1_2; + FORC(8) work[0][c][0] *= M_SQRT1_2; + for (i=0; i < 8; i++) + for (j=0; j < 8; j++) + FORC(8) work[1][i][j] += work[0][i][c] * cs[(j*2+1)*c]; + for (i=0; i < 8; i++) + for (j=0; j < 8; j++) + FORC(8) work[2][i][j] += work[1][c][j] * cs[(i*2+1)*c]; + + FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c]+0.5); } void CLASS lossless_dng_load_raw() { - unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col; + unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col, i, j; struct jhead jh; ushort *rp; @@ -1033,15 +1065,32 @@ void CLASS lossless_dng_load_raw() if (!ljpeg_start (&jh, 0)) break; jwide = jh.wide; if (filters) jwide *= jh.clrs; - jwide /= is_raw; - for (row=col=jrow=0; jrow < jh.high; jrow++) { - rp = ljpeg_row (jrow, &jh); - for (jcol=0; jcol < jwide; jcol++) { - adobe_copy_pixel (trow+row, tcol+col, &rp); - if (++col >= tile_width || col >= raw_width) - row += 1 + (col = 0); - } - } + jwide /= MIN (is_raw, tiff_samples); + switch (jh.algo) { + case 0xc1: + jh.vpred[0] = 16384; + getbits(-1); + for (jrow=0; jrow+7 < jh.high; jrow += 8) { + for (jcol=0; jcol+7 < jh.wide; jcol += 8) { + ljpeg_idct (&jh); + rp = jh.idct; + row = trow + jcol/tile_width + jrow*2; + col = tcol + jcol%tile_width; + for (i=0; i < 16; i+=2) + for (j=0; j < 8; j++) + adobe_copy_pixel (row+i, col+j, &rp); + } + } + break; + case 0xc3: + for (row=col=jrow=0; jrow < jh.high; jrow++) { + rp = ljpeg_row (jrow, &jh); + for (jcol=0; jcol < jwide; jcol++) { + adobe_copy_pixel (trow+row, tcol+col, &rp); + if (++col >= tile_width || col >= raw_width) + row += 1 + (col = 0); + } + } } fseek (ifp, save+4, SEEK_SET); if ((tcol += tile_width) >= raw_width) trow += tile_length + (tcol = 0); @@ -1685,8 +1734,7 @@ void CLASS phase_one_load_raw_c() pixel[col] = curve[pixel[col]]; } for (col=0; col < raw_width; col++) { - if (ph1.format != 8) pixel[col] <<= 2; - i = pixel[col] - ph1.black + i = (pixel[col] << 2*(ph1.format != 8)) - ph1.black + cblack[row][col >= ph1.split_col] + rblack[col][row >= ph1.split_row]; if (i > 0) RAW(row,col) = i; @@ -3111,6 +3159,8 @@ void CLASS smal_decode_segment (unsigned seg[2][2], int holes) fseek (ifp, seg[0][1]+1, SEEK_SET); getbits(-1); + if (seg[1][0] > raw_width*raw_height) + seg[1][0] = raw_width*raw_height; for (pix=seg[0][0]; pix < seg[1][0]; pix++) { for (s=0; s < 3; s++) { data = data << nbits | getbits(nbits); @@ -5237,7 +5287,7 @@ nf: order = 0x4949; FORC4 cam_mul[c ^ (c >> 1) ^ 1] = get4(); } if (tag == 0x3d && type == 3 && len == 4) - FORC4 cblack[c ^ c >> 1] = get2() >> (14-tiff_ifd[2].bps); + FORC4 cblack[c ^ c >> 1] = get2() >> (14-tiff_bps); if (tag == 0x81 && type == 4) { data_offset = get4(); fseek (ifp, data_offset + 41, SEEK_SET); @@ -5267,7 +5317,8 @@ nf: order = 0x4949; break; case 102: fseek (ifp, 6, SEEK_CUR); - goto get2_rggb; + FORC4 cam_mul[c ^ (c >> 1)] = get2(); + break; case 103: fseek (ifp, 16, SEEK_CUR); FORC4 cam_mul[c] = get2(); @@ -5301,7 +5352,7 @@ nf: order = 0x4949; if (tag == 0x200 && len == 4) FORC4 cblack[c ^ c >> 1] = get2(); if (tag == 0x201 && len == 4) - goto get2_rggb; + FORC4 cam_mul[c ^ (c >> 1)] = get2(); if (tag == 0x220 && type == 7) meta_offset = ftell(ifp); if (tag == 0x401 && type == 4 && len == 4) @@ -5347,7 +5398,7 @@ get2_256: } if ((tag | 0x70) == 0x2070 && (type == 4 || type == 13)) fseek (ifp, get4()+base, SEEK_SET); - if (tag == 0x2020) + if (tag == 0x2020 && !strncmp(buf,"OLYMP",5)) parse_thumb_note (base, 257, 258); if (tag == 0x2040) parse_makernote (base, 0x2040); @@ -5358,11 +5409,12 @@ get2_256: if (tag == 0x4001 && len > 500) { i = len == 582 ? 50 : len == 653 ? 68 : len == 5120 ? 142 : 126; fseek (ifp, i, SEEK_CUR); -get2_rggb: FORC4 cam_mul[c ^ (c >> 1)] = get2(); - i = len >> 3 == 164 || len == 1506 ? 112:22; - fseek (ifp, i, SEEK_CUR); - FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + for (i+=18; i <= len; i+=10) { + get2(); + FORC4 sraw_mul[c ^ (c >> 1)] = get2(); + if (sraw_mul[1] == 1170) break; + } } if (tag == 0x4021 && get4() && get4()) FORC4 cam_mul[c] = 1024; @@ -5415,13 +5467,14 @@ void CLASS parse_exif (int base) while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { - case 33434: shutter = getreal(type); break; + case 33434: tiff_ifd[tiff_nifds-1].shutter = shutter = getreal(type); break; case 33437: aperture = getreal(type); break; case 34855: iso_speed = get2(); break; case 34866: if((!iso_speed) || iso_speed == 65535) iso_speed = get4();break; case 36867: case 36868: get_timestamp(0); break; case 37377: if ((expo = -getreal(type)) < 128) + tiff_ifd[tiff_nifds-1].shutter = shutter = pow (2, expo); break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; @@ -5664,6 +5717,8 @@ int CLASS parse_tiff_ifd (int base) case 61443: tiff_ifd[ifd].samples = len & 7; tiff_ifd[ifd].bps = getint(type); + if (tiff_bps < tiff_ifd[ifd].bps) + tiff_bps = tiff_ifd[ifd].bps; break; case 61446: raw_height = 0; @@ -5835,7 +5890,7 @@ int CLASS parse_tiff_ifd (int base) parse_kodak_ifd (base); break; case 33434: /* ExposureTime */ - shutter = getreal(type); + tiff_ifd[ifd].shutter = shutter = getreal(type); break; case 33437: /* FNumber */ aperture = getreal(type); @@ -5964,7 +6019,12 @@ int CLASS parse_tiff_ifd (int base) is_raw = 1; break; case 50708: /* UniqueCameraModel */ - fgets (model3, 64, ifp); + if (model[0]) break; + fgets (make, 64, ifp); + if ((cp = strchr(make,' '))) { + strcpy(model,cp+1); + *cp = 0; + } break; case 50710: /* CFAPlaneColor */ if (filters == 9) break; @@ -5979,10 +6039,7 @@ guess_cfa_pc: filters -= !filters; break; case 50711: /* CFALayout */ - if (get2() == 2) { - fuji_width = 1; - filters = 0x49494949; - } + if (get2() == 2) fuji_width = 1; break; case 291: case 50712: /* LinearizationTable */ @@ -6014,7 +6071,7 @@ guess_cfa_pc: break; case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ - for (num=i=0; i < len; i++) + for (num=i=0; i < (len & 0xffff); i++) num += getreal(type); black += num/len + 0.5; break; @@ -6144,7 +6201,7 @@ int CLASS parse_tiff (int base) void CLASS apply_tiff() { - int max_samp=0, raw=-1, thm=-1, i; + int max_samp=0, ties=0, os, ns, raw=-1, thm=-1, i; struct jhead jh; thumb_misc = 16; @@ -6156,13 +6213,26 @@ void CLASS apply_tiff() thumb_height = jh.high; } } + for (i=tiff_nifds; i--; ) { + if (tiff_ifd[i].shutter) + shutter = tiff_ifd[i].shutter; + tiff_ifd[i].shutter = shutter; + } + for (i=0; i < tiff_nifds; i++) { if (max_samp < tiff_ifd[i].samples) max_samp = tiff_ifd[i].samples; if (max_samp > 3) max_samp = 3; + os = raw_width*raw_height; + ns = tiff_ifd[i].width*tiff_ifd[i].height; + if (tiff_bps) { + os *= tiff_bps; + ns *= tiff_ifd[i].bps; + } if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) && (tiff_ifd[i].width | tiff_ifd[i].height) < 0x10000 && - tiff_ifd[i].width*tiff_ifd[i].height > raw_width*raw_height) { + ns && ((ns > os && (ties = 1)) || + (ns == os && shot_select == ties++))) { raw_width = tiff_ifd[i].width; raw_height = tiff_ifd[i].height; tiff_bps = tiff_ifd[i].bps; @@ -6172,9 +6242,11 @@ void CLASS apply_tiff() tiff_samples = tiff_ifd[i].samples; tile_width = tiff_ifd[i].tile_width; tile_length = tiff_ifd[i].tile_length; + shutter = tiff_ifd[i].shutter; raw = i; } } + if (is_raw == 1 && ties) is_raw = ties; if (!tile_width ) tile_width = INT_MAX; if (!tile_length) tile_length = INT_MAX; for (i=tiff_nifds; i--; ) @@ -6257,8 +6329,8 @@ void CLASS apply_tiff() if (!dng_version) if ( (tiff_samples == 3 && tiff_ifd[raw].bytes && tiff_bps != 14 && (tiff_compress & -16) != 32768) - || (tiff_bps == 8 && !strcasestr(make,"Kodak") && - !strstr(model2,"DEBUG RAW"))) + || (tiff_bps == 8 && strncmp(make,"Phase",5) && + !strcasestr(make,"Kodak") && !strstr(model2,"DEBUG RAW"))) is_raw = 0; for (i=0; i < tiff_nifds; i++) if (i != raw && tiff_ifd[i].samples == max_samp && @@ -6400,9 +6472,7 @@ void CLASS ciff_block_1030() bitbuf = bitbuf << 16 | (get2() ^ key[i++ & 1]); vbits += 16; } - white[row][col] = - bitbuf << (LONG_BIT - vbits) >> (LONG_BIT - bpp); - vbits -= bpp; + white[row][col] = bitbuf >> (vbits -= bpp) & ~(-1 << bpp); } } @@ -6682,7 +6752,7 @@ void CLASS parse_fuji (int offset) } else if (tag == 0xc000) { c = order; order = 0x4949; - while ((tag = get4()) > 10000); + while ((tag = get4()) > raw_width); width = tag; height = get4(); order = c; @@ -6704,7 +6774,7 @@ int CLASS parse_jpeg (int offset) order = 0x4d4d; len = get2() - 2; save = ftell(ifp); - if (mark == 0xc0 || mark == 0xc3) { + if (mark == 0xc0 || mark == 0xc3 || mark == 0xc9) { fgetc(ifp); raw_height = get2(); raw_width = get2(); @@ -7003,8 +7073,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9805,-2689,-1312,-5803,13064,3068,-2438,3075,8775 } }, { "Canon EOS D60", 0, 0xfa0, { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, - { "Canon EOS 5DS", 0, 0x3c96, /* DJC */ - { 6885,-753,-856,-4416,11752,2665,-1266,2393,5468 } }, + { "Canon EOS 5DS", 0, 0x3c96, + { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, @@ -7033,6 +7103,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { "Canon EOS 80D", 0, 0, + { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS 300D", 0, 0xfa0, @@ -7053,12 +7125,22 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS 700D", 0, 0x3c00, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 750D", 0, 0x368e, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 760D", 0, 0x350f, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, { 6444,-904,-893,-4563,12308,2535,-903,2016,6728 } }, { "Canon EOS 1200D", 0, 0x37c2, { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, + { "Canon EOS 1300D", 0, 0x3510, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS M3", 0, 0, + { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M10", 0, 0, + { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, { "Canon EOS M", 0, 0, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, { "Canon EOS-1Ds Mark III", 0, 0x3bb0, @@ -7077,6 +7159,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4374,3631,-1743,-7520,15212,2472,-2892,3632,8161 } }, { "Canon EOS-1D C", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, + { "Canon EOS-1D X Mark II", 0, 0, + { 7596,-978,-967,-4808,12571,2503,-1398,2567,5752 } }, { "Canon EOS-1D X", 0, 0x3c4e, { 6847,-614,-1014,-4669,12737,2139,-1197,2488,6846 } }, { "Canon EOS-1D", 0, 0xe20, @@ -7105,14 +7189,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { -4778,9467,2172,4743,-1141,4344,-5146,9908,6077,-1566,11051,557 } }, { "Canon PowerShot G2", 0, 0, { 9087,-2693,-1049,-6715,14382,2537,-2291,2819,7790 } }, + { "Canon PowerShot G3 X", 0, 0, + { 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 } }, { "Canon PowerShot G3", 0, 0, { 9212,-2781,-1073,-6573,14189,2605,-2300,2844,7664 } }, + { "Canon PowerShot G5 X", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G5", 0, 0, { 9757,-2872,-933,-5972,13861,2301,-1622,2328,7212 } }, { "Canon PowerShot G6", 0, 0, { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { "Canon PowerShot G9 X", 0, 0, + { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9", 0, 0, { 7368,-2141,-598,-5621,13254,2625,-1418,1696,5743 } }, { "Canon PowerShot Pro1", 0, 0, @@ -7171,6 +7261,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 14134,-5576,-1527,-1991,10719,1273,-1158,1929,3581 } }, { "Canon PowerShot SX220", 0, 0, /* DJC */ { 13898,-5076,-1447,-1405,10109,1297,-244,1860,3687 } }, + { "Canon IXUS 160", 0, 0, /* DJC */ + { 11657,-3781,-1136,-3544,11262,2283,-160,1219,4700 } }, { "Casio EX-S20", 0, 0, /* DJC */ { 11634,-3924,-1128,-4968,12954,2015,-1588,2648,7206 } }, { "Casio EX-Z750", 0, 0, /* DJC */ @@ -7185,6 +7277,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 20183,-4295,-423,-3940,15330,3985,-280,4870,9800 } }, { "Contax N Digital", 0, 0xf1e, { 7777,1285,-1053,-9280,16543,2916,-3677,5679,7060 } }, + { "DXO ONE", 0, 0, + { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Epson R-D1", 0, 0, { 6827,-1878,-732,-8429,16012,2564,-704,592,7145 } }, { "Fujifilm E550", 0, 0, @@ -7265,25 +7359,31 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11768,-4971,-1133,-4904,12927,2183,-480,1723,4605 } }, { "Fujifilm X30", 0, 0, { 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 } }, + { "Fujifilm X70", 0, 0, + { 10450,-4329,-878,-3217,11105,2421,-752,1758,6519 } }, { "Fujifilm X-Pro1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-Pro2", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, { "Fujifilm X-A2", 0, 0, { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, + { "Fujifilm X-E2S", 0, 0, + { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, { "Fujifilm X-E2", 0, 0, { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, - { "Fujifilm X-T1", 0, 0, + { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, - { "Fujifilm XQ", 0, 0, // XQ1 and XQ2 + { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, @@ -7425,8 +7525,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D5500", 0, 0, { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { "Nikon D500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D50", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { "Nikon D5", 0, 0, + { 9200,-3522,-992,-5755,13803,2117,-753,1486,6338 } }, { "Nikon D600", 0, 0x3e07, { 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 } }, { "Nikon D610", 0, 0, @@ -7437,8 +7541,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon D7100", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, - { "Nikon D7200", 0, 0, /* DJC */ - { 6111,-2759,-358,-5108,10766,4343,-769,1691,8030 } }, + { "Nikon D7200", 0, 0, + { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, @@ -7503,8 +7607,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, { "Nikon 1 J4", 0, 0, { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, - { "Nikon 1 J5", 0, 0, /* DJC */ - { 2621,-856,500,-4471,8761,5711,-1321,2644,11945 } }, + { "Nikon 1 J5", 0, 0, + { 7520,-2518,-645,-3844,12102,1945,-913,2249,6835 } }, { "Nikon 1 S2", 200, 0, { 6612,-1342,-618,-3338,11055,2623,-174,1792,5075 } }, { "Nikon 1 V2", 0, 0, @@ -7515,6 +7619,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6588,-1305,-693,-3277,10987,2634,-355,2016,5106 } }, { "Nikon 1 ", 0, 0, /* J1, J2, S1, V1 */ { 8994,-2667,-865,-4594,12324,2552,-699,1786,6260 } }, + { "Olympus AIR A01", 0, 0, + { 8992,-3093,-639,-2563,10721,2122,-437,1270,5473 } }, { "Olympus C5050", 0, 0, { 10508,-3124,-1273,-6079,14294,1901,-1653,2306,6237 } }, { "Olympus C5060", 0, 0, @@ -7585,7 +7691,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, - { "Olympus E-M10", 0, 0, + { "Olympus E-M10", 0, 0, /* also E-M10 Mark II */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, @@ -7593,6 +7699,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, { "Olympus E-M5", 0, 0xfe1, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus PEN-F", 0, 0, + { 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 } }, + { "Olympus SH-2", 0, 0, + { 10156,-3425,-1077,-2611,11177,1624,-385,1592,5080 } }, { "Olympus SP350", 0, 0, { 12078,-4836,-1069,-6671,14306,2578,-786,939,7418 } }, { "Olympus SP3", 0, 0, @@ -7609,6 +7719,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 11522,-4044,-1146,-4736,12172,2904,-988,1829,6039 } }, { "Olympus STYLUS1", 0, 0, { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, + { "Olympus TG-4", 0, 0, + { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "Olympus XZ-1", 0, 0, @@ -7643,6 +7755,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8843,-2837,-625,-5025,12644,2668,-411,1234,7410 } }, { "Pentax K-r", 0, 0, { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, + { "Pentax K-1", 0, 0, + { 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 } }, + { "Pentax K-30", 0, 0, + { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, + { "Pentax K-3 II", 0, 0, + { 8626,-2607,-1155,-3995,12301,1881,-1039,1822,6925 } }, { "Pentax K-3", 0, 0, { 7415,-2052,-721,-5186,12788,2682,-1446,2157,6773 } }, { "Pentax K-5 II", 0, 0, @@ -7653,6 +7771,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, { "Pentax K-S1", 0, 0, { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, + { "Pentax K-S2", 0, 0, + { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + { "Pentax Q-S1", 0, 0, + { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, { "Panasonic DMC-CM1", 15, 0, @@ -7663,6 +7785,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, { "Panasonic DMC-FZ28", 15, 0xf96, { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { "Panasonic DMC-FZ330", 15, 0, + { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, + { "Panasonic DMC-FZ300", 15, 0, + { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ30", 0, 0xf94, { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, { "Panasonic DMC-FZ3", 15, 0, @@ -7743,6 +7869,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7798,-2562,-740,-3879,11584,2613,-1055,2248,5434 } }, { "Panasonic DMC-G6", 15, 0xfff, { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, + { "Panasonic DMC-G7", 15, 0xfff, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -7755,6 +7883,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } }, { "Panasonic DMC-GF7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GF8", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -7771,6 +7901,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, { "Panasonic DMC-GX7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GX8", 15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { "Panasonic DMC-TZ1", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, + { "Panasonic DMC-ZS1", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, { "Panasonic DMC-TZ6", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, { "Panasonic DMC-ZS4", 15, 0, @@ -7779,6 +7915,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, { "Panasonic DMC-ZS5", 15, 0, { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, + { "Panasonic DMC-TZ8", 15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Panasonic DMC-ZS6", 15, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Leica S (Typ 007)", 0, 0, + { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, + { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, + { "Leica Q (Typ 116)", 0, 0, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica M (Typ 262)", 0, 0, + { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, + { "Leica SL (Typ 601)", 0, 0, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830} }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -7793,8 +7943,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, { "Phase One P65", 0, 0, { 8035,435,-962,-6001,13872,2320,-1159,3065,5434 } }, + { "Photron BC2-HD", 0, 0, /* DJC */ + { 14603,-4122,-528,-1810,9794,2017,-297,2763,5936 } }, { "Red One", 704, 0xffff, /* DJC */ { 21014,-7891,-2613,-3056,12201,856,-2203,5125,8042 } }, + { "Ricoh GR II", 0, 0, + { 4630,-834,-423,-4977,12805,2417,-638,1467,6115 } }, + { "Ricoh GR", 0, 0, + { 3708,-543,-160,-5381,12254,3556,-1471,1929,8234 } }, { "Samsung EX1", 0, 0x3e00, { 8898,-2498,-994,-3144,11328,2066,-760,1381,4576 } }, { "Samsung EX2F", 0, 0x7ff, @@ -7803,6 +7959,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7557,-2522,-739,-4679,12949,1894,-840,1777,5311 } }, { "Samsung NX mini", 0, 0, { 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 } }, + { "Samsung NX3300", 0, 0, + { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX3000", 0, 0, { 8060,-2933,-761,-4504,12890,1762,-630,1489,5227 } }, { "Samsung NX30", 0, 0, /* NX30, NX300, NX300M */ @@ -7819,8 +7977,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, { "Samsung NX10", 0, 0, /* also NX100 */ { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, - { "Samsung NX500", 0, 0, /* DJC */ - { 10196,-4532,-272,-3888,11489,2400,-1203,2424,9173 } }, + { "Samsung NX500", 0, 0, + { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, { "Samsung NX5", 0, 0, { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, { "Samsung NX1", 0, 0, @@ -7837,18 +7995,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 16442,-2956,-2422,-2877,12128,750,-1136,6066,4559 } }, { "Sony DSC-F828", 0, 0, { 7924,-1910,-777,-8226,15459,2998,-1517,2199,6818,-7242,11401,3481 } }, - { "Sony DSC-R1", 512, 0, + { "Sony DSC-R1", 0, 0, { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, - { "Sony DSC-RX100M", 200, 0, /* M2 and M3 */ + { "Sony DSC-RX100M", 0, 0, /* M2, M3, and M4 */ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, - { "Sony DSC-RX100", 200, 0, + { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, - { "Sony DSC-RX10", 200, 0, + { "Sony DSC-RX10", 0, 0, { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, - { "Sony DSC-RX1", 128, 0, - { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "Sony DSC-RX1RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony DSC-RX1", 0, 0, + { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, @@ -7865,71 +8025,77 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, { "Sony DSLR-A390", 0, 0, { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, - { "Sony DSLR-A450", 128, 0xfeb, + { "Sony DSLR-A450", 0, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, - { "Sony DSLR-A580", 128, 0xfeb, + { "Sony DSLR-A580", 0, 0xfeb, { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, - { "Sony DSLR-A500", 128, 0xfeb, + { "Sony DSLR-A500", 0, 0xfeb, { 6046,-1127,-278,-5574,13076,2786,-691,1419,7625 } }, - { "Sony DSLR-A5", 128, 0xfeb, + { "Sony DSLR-A5", 0, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, - { "Sony DSLR-A700", 128, 0, + { "Sony DSLR-A700", 0, 0, { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, - { "Sony DSLR-A850", 128, 0, + { "Sony DSLR-A850", 0, 0, { 5413,-1162,-365,-5665,13098,2866,-608,1179,8440 } }, - { "Sony DSLR-A900", 128, 0, + { "Sony DSLR-A900", 0, 0, { 5209,-1072,-397,-8845,16120,2919,-1618,1803,8654 } }, - { "Sony ILCA-77M2", 128, 0, + { "Sony ILCA-68", 0, 0, + { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, + { "Sony ILCA-77M2", 0, 0, { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, - { "Sony ILCE-7M2", 128, 0, + { "Sony ILCE-6300", 0, 0, + { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, + { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, - { "Sony ILCE-7S", 128, 0, + { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, - { "Sony ILCE-7R", 128, 0, + { "Sony ILCE-7RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, - { "Sony ILCE-7", 128, 0, + { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, - { "Sony ILCE", 128, 0, /* 3000, 5000, 5100, 6000, and QX1 */ + { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony NEX-5N", 128, 0, + { "Sony NEX-5N", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony NEX-5R", 128, 0, + { "Sony NEX-5R", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-5T", 128, 0, + { "Sony NEX-5T", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-3N", 128, 0, + { "Sony NEX-3N", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, { "Sony NEX-3", 138, 0, /* DJC */ { 6907,-1256,-645,-4940,12621,2320,-1710,2581,6230 } }, { "Sony NEX-5", 116, 0, /* DJC */ { 6807,-1350,-342,-4216,11649,2567,-1089,2001,6420 } }, - { "Sony NEX-3", 128, 0, /* Adobe */ + { "Sony NEX-3", 0, 0, /* Adobe */ { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, - { "Sony NEX-5", 128, 0, /* Adobe */ + { "Sony NEX-5", 0, 0, /* Adobe */ { 6549,-1550,-436,-4880,12435,2753,-854,1868,6976 } }, - { "Sony NEX-6", 128, 0, + { "Sony NEX-6", 0, 0, { 6129,-1545,-418,-4930,12490,2743,-977,1693,6615 } }, - { "Sony NEX-7", 128, 0, + { "Sony NEX-7", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony NEX", 128, 0, /* NEX-C3, NEX-F3 */ + { "Sony NEX", 0, 0, /* NEX-C3, NEX-F3 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A33", 128, 0, + { "Sony SLT-A33", 0, 0, { 6069,-1221,-366,-5221,12779,2734,-1024,2066,6834 } }, - { "Sony SLT-A35", 128, 0, + { "Sony SLT-A35", 0, 0, { 5986,-1618,-415,-4557,11820,3120,-681,1404,6971 } }, - { "Sony SLT-A37", 128, 0, + { "Sony SLT-A37", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A55", 128, 0, + { "Sony SLT-A55", 0, 0, { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, - { "Sony SLT-A57", 128, 0, + { "Sony SLT-A57", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A58", 128, 0, + { "Sony SLT-A58", 0, 0, { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, - { "Sony SLT-A65", 128, 0, + { "Sony SLT-A65", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony SLT-A77", 128, 0, + { "Sony SLT-A77", 0, 0, { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, - { "Sony SLT-A99", 128, 0, + { "Sony SLT-A99", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, }; double cam_xyz[4][3]; @@ -8113,6 +8279,8 @@ void CLASS identify() { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 6096, 4056, 72, 34, 0, 0 }, + { 6288, 4056, 264, 34, 0, 0 }, { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { @@ -8126,6 +8294,7 @@ void CLASS identify() { 0x261, "EOS 50D" }, { 0x281, "EOS-1D Mark IV" }, { 0x287, "EOS 60D" }, { 0x167, "EOS-1DS" }, { 0x325, "EOS 70D" }, + { 0x350, "EOS 80D" }, { 0x328, "EOS-1D X Mark II" }, { 0x170, "EOS 300D" }, { 0x188, "EOS-1Ds Mark II" }, { 0x176, "EOS 450D" }, { 0x215, "EOS-1Ds Mark III" }, { 0x189, "EOS 350D" }, { 0x324, "EOS-1D C" }, @@ -8135,9 +8304,12 @@ void CLASS identify() { 0x286, "EOS 600D" }, { 0x285, "EOS 5D Mark III" }, { 0x301, "EOS 650D" }, { 0x302, "EOS 6D" }, { 0x326, "EOS 700D" }, { 0x250, "EOS 7D" }, + { 0x393, "EOS 750D" }, { 0x289, "EOS 7D Mark II" }, + { 0x347, "EOS 760D" }, { 0x254, "EOS 1000D" }, { 0x288, "EOS 1100D" }, - { 0x327, "EOS 1200D" }, + { 0x327, "EOS 1200D" }, { 0x382, "Canon EOS 5DS" }, + { 0x404, "EOS 1300D" }, { 0x401, "Canon EOS 5DS R" }, { 0x346, "EOS 100D" }, }, sonique[] = { { 0x002, "DSC-R1" }, { 0x100, "DSLR-A100" }, @@ -8165,7 +8337,10 @@ void CLASS identify() { 0x139, "ILCE-5000" }, { 0x13d, "DSC-RX100M3" }, { 0x13e, "ILCE-7S" }, { 0x13f, "ILCA-77M2" }, { 0x153, "ILCE-5100" }, { 0x154, "ILCE-7M2" }, - { 0x15a, "ILCE-QX1" }, + { 0x155, "DSC-RX100M4" },{ 0x156, "DSC-RX10M2" }, + { 0x158, "DSC-RX1RM2" }, { 0x15a, "ILCE-QX1" }, + { 0x15b, "ILCE-7RM2" }, { 0x15e, "ILCE-7SM2" }, + { 0x161, "ILCA-68" }, { 0x165, "ILCE-6300" }, }; static const struct { unsigned fsize; @@ -8202,6 +8377,7 @@ void CLASS identify() { 19131120,4168,3060,92,16, 4, 1,40,0x94,0,2,"Canon","PowerShot SX220 HS" }, { 21936096,4464,3276,25,10,73,12,40,0x16,0,2,"Canon","PowerShot SX30 IS" }, { 24724224,4704,3504, 8,16,56, 8,40,0x94,0,2,"Canon","PowerShot A3300 IS" }, + { 30858240,5248,3920, 8,16,56,16,40,0x94,0,2,"Canon","IXUS 160" }, { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, { 3217760,2080,1547, 0, 0,10, 1, 0,0x94,0,1,"Casio","QV-3*00EX" }, { 6218368,2585,1924, 0, 0, 9, 0, 0,0x94,0,1,"Casio","QV-5700" }, @@ -8260,6 +8436,8 @@ void CLASS identify() { 4841984,2090,1544, 0, 0,22, 0, 0,0x94,7,1,"Pentax","Optio S" }, { 6114240,2346,1737, 0, 0,22, 0, 0,0x94,7,1,"Pentax","Optio S4" }, { 10702848,3072,2322, 0, 0, 0,21,30,0x94,0,1,"Pentax","Optio 750Z" }, + { 4147200,1920,1080, 0, 0, 0, 0, 0,0x49,0,0,"Photron","BC2-HD" }, + { 4151666,1920,1080, 0, 0, 0, 0, 0,0x49,0,0,"Photron","BC2-HD",8 }, { 13248000,2208,3000, 0, 0, 0, 0,13,0x61,0,0,"Pixelink","A782" }, { 6291456,2048,1536, 0, 0, 0, 0,96,0x61,0,0,"RoverShot","3320AF" }, { 311696, 644, 484, 0, 0, 0, 0, 0,0x16,0,8,"ST Micro","STV680 VGA" }, @@ -8276,7 +8454,7 @@ void CLASS identify() static const char *corp[] = { "AgfaPhoto", "Canon", "Casio", "Epson", "Fujifilm", "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", - "Nikon", "Nokia", "Olympus", "Pentax", "Phase One", "Ricoh", + "Nikon", "Nokia", "Olympus", "Ricoh", "Pentax", "Phase One", "Samsung", "Sigma", "Sinar", "Sony" }; char head[32], *cp; int hlen, flen, fsize, zero_fsize=1, i, c; @@ -8451,7 +8629,7 @@ void CLASS identify() parse_foveon(); else if (!memcmp (head,"CI",2)) parse_cine(); - else + if (make[0] == 0) for (zero_fsize=i=0; i < sizeof table / sizeof *table; i++) if (fsize == table[i].fsize) { strcpy (make, table[i].make ); @@ -8548,9 +8726,10 @@ void CLASS identify() width = 4014; if (dng_version) { if (filters == UINT_MAX) filters = 0; - if (filters) is_raw = tiff_samples; - else colors = tiff_samples; + if (filters) is_raw *= tiff_samples; + else colors = tiff_samples; switch (tiff_compress) { + case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; case 8: load_raw = &CLASS deflate_dng_load_raw; break; @@ -8603,6 +8782,8 @@ void CLASS identify() top_margin = filters = 0; strcpy (model,"C603"); } + if (!strcmp(make,"Sony") && raw_width > 3888) + black = 128 << (tiff_bps - 12); if (is_foveon) { if (height*2 < width) pixel_aspect = 0.5; if (height > width) pixel_aspect = 2; @@ -8618,6 +8799,10 @@ void CLASS identify() SWAP(height,width); SWAP(raw_height,raw_width); } + if (width == 7200 && height == 3888) { + raw_width = width = 6480; + raw_height = height = 4320; + } filters = 0; tiff_samples = colors = 3; load_raw = &CLASS canon_sraw_load_raw; @@ -8793,7 +8978,7 @@ canon_a5: top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; - if (width == 4032 || width == 4952) left_margin = 0; + if (width == 4032 || width == 4952 || width == 6032) left_margin = 0; if (width == 3328 && (width -= 66)) left_margin = 34; if (width == 4936) left_margin = 4; if (!strcmp(model,"HS50EXR") || @@ -9067,6 +9252,8 @@ konica_400z: thumb_length = flen - (thumb_offset = 0xa39800); thumb_height = 480; thumb_width = 640; + } else if (!strcmp(model,"TG-4")) { + width -= 16; } } else if (!strcmp(model,"N Digital")) { height = 2047; @@ -9094,16 +9281,29 @@ konica_400z: order = 0x4d4d; } else if (!strcmp(make,"Sony") && raw_width == 4288) { width -= 32; + } else if (!strcmp(make,"Sony") && raw_width == 4600) { + if (!strcmp(model,"DSLR-A350")) + height -= 4; + black = 0; } else if (!strcmp(make,"Sony") && raw_width == 4928) { if (height < 3280) width -= 8; } else if (!strcmp(make,"Sony") && raw_width == 5504) { width -= height > 3664 ? 8 : 32; + if (!strncmp(model,"DSC",3)) + black = 200 << (tiff_bps - 12); } else if (!strcmp(make,"Sony") && raw_width == 6048) { width -= 24; if (strstr(model,"RX1") || strstr(model,"A99")) width -= 6; } else if (!strcmp(make,"Sony") && raw_width == 7392) { width -= 30; + } else if (!strcmp(make,"Sony") && raw_width == 8000) { + width -= 32; + if (!strncmp(model,"DSC",3)) { + tiff_bps = 14; + load_raw = &CLASS unpacked_load_raw; + black = 512; + } } else if (!strcmp(model,"DSLR-A100")) { if (width == 3880) { height--; @@ -9115,8 +9315,6 @@ konica_400z: load_flags = 2; } filters = 0x61616161; - } else if (!strcmp(model,"DSLR-A350")) { - height -= 4; } else if (!strcmp(model,"PIXL")) { height -= top_margin = 4; width -= left_margin = 32; @@ -9181,6 +9379,7 @@ bw: colors = 1; width = 768; data_offset = 1152; load_raw = &CLASS kodak_radc_load_raw; + tiff_bps = 12; } else if (strstr(model,"DC50")) { strcpy (model, "DC50"); height = 512; @@ -9271,7 +9470,7 @@ dng_skip: if (raw_color) adobe_coeff ("Apple","Quicktake"); if (fuji_width) { fuji_width = width >> !fuji_layout; - if (~fuji_width & 1) filters = 0x49494949; + filters = fuji_width & 1 ? 0x94949494 : 0x49494949; width = (height >> fuji_layout) + fuji_width; height = width - 1; pixel_aspect = 1; diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 856da84d1..405f202bd 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -127,6 +127,7 @@ protected: struct tiff_ifd { int width, height, bps, comp, phint, offset, flip, samples, bytes; int tile_width, tile_length, sample_format, predictor; + float shutter; } tiff_ifd[10]; struct ph1 { @@ -139,8 +140,8 @@ protected: } hbd; struct jhead { - int bits, high, wide, clrs, sraw, psv, restart, vpred[6]; - ushort *huff[6], *free[4], *row; + int algo, bits, high, wide, clrs, sraw, psv, restart, vpred[6]; + ushort quant[64], idct[64], *huff[20], *free[20], *row; }; struct tiff_tag { @@ -217,6 +218,8 @@ void ljpeg_end (struct jhead *jh); int ljpeg_diff (ushort *huff); ushort * ljpeg_row (int jrow, struct jhead *jh); void lossless_jpeg_load_raw(); +void ljpeg_idct (struct jhead *jh); + void canon_sraw_load_raw(); void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp); From d0158efadfd8d6c96d22b97bd6c57d078db315b5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 23 May 2016 19:31:22 +0200 Subject: [PATCH 064/232] Small correction to Deutsch file, thanks to hi-tower for the hint --- rtdata/languages/Deutsch | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 79675b740..ae2a5c5eb 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -108,8 +108,8 @@ EXPORT_BYPASS_SHARPENMICRO;Mikrokontrast überspringen EXPORT_BYPASS_SH_HQ;Schatten/Lichter überspringen\n(Schärfemaske) EXPORT_FASTEXPORTOPTIONS;Schnell-Export - Einstellungen EXPORT_INSTRUCTIONS;Die Einstellungen zum schnellen Export\nerlauben es, zeit- und ressourcenintensive\nEntwicklungsschritte zu überspringen und dafür\ndie Warteschlangenverarbeitung mit\nschnellen Export-Einstellungen auszuführen.\nDieses Vorgehen wird zur schnelleren\nGenerierung von gering aufgelösten Bildern\nempfohlen, falls es auf die Geschwindigkeit\nankommt oder für ein oder mehrere Bilder\nandere Ausgabegrößen gewünscht werden,\nohne Änderungen an deren gespeicherten\nParameter vornehmen zu müssen. -EXPORT_MAXHEIGHT;Maximale Höhe: -EXPORT_MAXWIDTH;Maximale Breite: +EXPORT_MAXHEIGHT;Maximale Höhe: +EXPORT_MAXWIDTH;Maximale Breite: EXPORT_PUTTOQUEUEFAST; Zur Warteschlange “Schneller Export“ hinzufügen EXPORT_RAW_DMETHOD;Demosaikmethode EXTPROGTARGET_1;RAW @@ -226,7 +226,7 @@ FILECHOOSER_FILTER_TIFF;TIFF-Dateien GENERAL_ABOUT;Über GENERAL_AFTER;Nachher GENERAL_APPLY;Anwenden -GENERAL_ASIMAGE;Als Bild +GENERAL_ASIMAGE;Wie Bild GENERAL_AUTO;Automatisch GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbrechen @@ -235,7 +235,7 @@ GENERAL_DISABLE;Deaktivieren GENERAL_DISABLED;Deaktiviert GENERAL_ENABLE;Aktivieren GENERAL_ENABLED;Aktiviert -GENERAL_FILE;Datei: +GENERAL_FILE;Datei: GENERAL_LANDSCAPE;Quer GENERAL_NA;n/a GENERAL_NO;Nein @@ -1209,7 +1209,7 @@ TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Gesamt: %4%% TP_BWMIX_RGBLABEL_HINT;RGB-Faktoren\n\nGesamt: Summe aller RGB-Werte.\n- immer 100% im Modus Relativ\n- höher (heller), oder niedriger (dunkler) 100% im Modus Absolut TP_BWMIX_RGB_TOOLTIP;Mischen Sie die Kanäle. Verwenden Sie die Vorgaben zur Orientierung.\nNegative Werte können zu Artefakten führen. TP_BWMIX_SETTING;Voreinstellung -TP_BWMIX_SETTING_TOOLTIP;Voreinstellungen für den Kanalmixer (Film, Landschaft, ...). +TP_BWMIX_SETTING_TOOLTIP;Voreinstellungen für den Kanalmixer (Film, Landschaft, ...). TP_BWMIX_SET_HIGHCONTAST;Hoher Kontrast TP_BWMIX_SET_HIGHSENSIT;Hohe Empfindlichkeit TP_BWMIX_SET_HYPERPANCHRO;Hyper-Panchromatisch From 918179f621cbd5c863825bd6f720ef5a79c89baa Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 23 May 2016 20:01:15 +0200 Subject: [PATCH 065/232] Correction to last commit --- rtdata/languages/Deutsch | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index ae2a5c5eb..8d810c585 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -108,8 +108,8 @@ EXPORT_BYPASS_SHARPENMICRO;Mikrokontrast überspringen EXPORT_BYPASS_SH_HQ;Schatten/Lichter überspringen\n(Schärfemaske) EXPORT_FASTEXPORTOPTIONS;Schnell-Export - Einstellungen EXPORT_INSTRUCTIONS;Die Einstellungen zum schnellen Export\nerlauben es, zeit- und ressourcenintensive\nEntwicklungsschritte zu überspringen und dafür\ndie Warteschlangenverarbeitung mit\nschnellen Export-Einstellungen auszuführen.\nDieses Vorgehen wird zur schnelleren\nGenerierung von gering aufgelösten Bildern\nempfohlen, falls es auf die Geschwindigkeit\nankommt oder für ein oder mehrere Bilder\nandere Ausgabegrößen gewünscht werden,\nohne Änderungen an deren gespeicherten\nParameter vornehmen zu müssen. -EXPORT_MAXHEIGHT;Maximale Höhe: -EXPORT_MAXWIDTH;Maximale Breite: +EXPORT_MAXHEIGHT;Maximale Höhe: +EXPORT_MAXWIDTH;Maximale Breite: EXPORT_PUTTOQUEUEFAST; Zur Warteschlange “Schneller Export“ hinzufügen EXPORT_RAW_DMETHOD;Demosaikmethode EXTPROGTARGET_1;RAW @@ -235,7 +235,7 @@ GENERAL_DISABLE;Deaktivieren GENERAL_DISABLED;Deaktiviert GENERAL_ENABLE;Aktivieren GENERAL_ENABLED;Aktiviert -GENERAL_FILE;Datei: +GENERAL_FILE;Datei: GENERAL_LANDSCAPE;Quer GENERAL_NA;n/a GENERAL_NO;Nein @@ -1209,7 +1209,7 @@ TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Gesamt: %4%% TP_BWMIX_RGBLABEL_HINT;RGB-Faktoren\n\nGesamt: Summe aller RGB-Werte.\n- immer 100% im Modus Relativ\n- höher (heller), oder niedriger (dunkler) 100% im Modus Absolut TP_BWMIX_RGB_TOOLTIP;Mischen Sie die Kanäle. Verwenden Sie die Vorgaben zur Orientierung.\nNegative Werte können zu Artefakten führen. TP_BWMIX_SETTING;Voreinstellung -TP_BWMIX_SETTING_TOOLTIP;Voreinstellungen für den Kanalmixer (Film, Landschaft, ...). +TP_BWMIX_SETTING_TOOLTIP;Voreinstellungen für den Kanalmixer (Film, Landschaft, ...). TP_BWMIX_SET_HIGHCONTAST;Hoher Kontrast TP_BWMIX_SET_HIGHSENSIT;Hohe Empfindlichkeit TP_BWMIX_SET_HYPERPANCHRO;Hyper-Panchromatisch From f86a0811aae311739615530976b3180b02c82ffd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 24 May 2016 18:14:09 +0200 Subject: [PATCH 066/232] treat black levels > 0xffff in camconst.json as absolute level & 0xffff --- rtengine/rawimage.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 3f4b2ac3f..919b1c7be 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -580,7 +580,9 @@ int RawImage::loadRaw (bool loadData, bool closeFile, ProgressListener *plistene if (cc) { for (int i = 0; i < 4; i++) { if (RT_blacklevel_from_constant) { - black_c4[i] = cblack[i] + cc->get_BlackLevel(i, iso_speed); + int blackFromCc = cc->get_BlackLevel(i, iso_speed); + // if black level from camconst > 0xffff it is an absolute value. + black_c4[i] = blackFromCc > 0xffff ? (blackFromCc & 0xffff) : blackFromCc + cblack[i]; } // load 4 channel white level here, will be used if available From d0cef55aada8e51321d44982a2a8ca258eaa6139 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 24 May 2016 19:06:41 +0200 Subject: [PATCH 067/232] Fix wrong crop for Samsung NX1 and NX500 --- rtengine/camconst.json | 1 - 1 file changed, 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 4dd84c829..d56eb05a6 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1686,7 +1686,6 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 ], // DNG_v8.7 D65 // "dcraw_matrix": [ 13298,-6099,-296,-5243,16153,-1235,-508,1220,7758 ], // DNG_v8.7 Standard Light A // "dcraw_matrix": [ 9598,-3268,-634,-5678,14795,824,-1255,2675,4523 ], // SAMSUNG DNG CONVERTER v1.0 - "raw_crop": [ 1200, 500, 1600, 3600 ],// TRIAL CROP "ranges": { "white": [ { "iso": 100, "levels": 16000 }, // 16000 typical 16084, LE 16120 and 16383, LENR 16280 From 6603577f5cac52e12c2cae0ae7db960459ed9c05 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Tue, 24 May 2016 21:45:05 +0200 Subject: [PATCH 068/232] Deutsch update --- rtdata/languages/Deutsch | 61 +++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 8d810c585..58dc186a4 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -27,6 +27,7 @@ #26 2015-12-22 Korrekturen (TooWaBoo) RT4.2.536 #27 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730 #28 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880 +#29 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -45,7 +46,7 @@ CURVEEDITOR_CURVE;Kurve CURVEEDITOR_CURVES;Kurven CURVEEDITOR_CUSTOM;Angepasst CURVEEDITOR_DARKS;Tiefen -CURVEEDITOR_EDITPOINT_HINT;Bearbeitung der Kurvenpunkte über Zahlenwerte.\n\nRechtsklick auf einen Kurvenpunkt um ihn auszuwählen. Rechtsklick in einen leeren Bereich um ihn abzuwählen. +CURVEEDITOR_EDITPOINT_HINT;Bearbeitung der Kurvenpunkte über Zahlenwerte.\n\nRechtsklick auf einen Kurvenpunkt um ihn auszuwählen.\nRechtsklick in einen leeren Bereich um ihn abzuwählen. CURVEEDITOR_HIGHLIGHTS;Spitzlichter CURVEEDITOR_LIGHTS;Lichter CURVEEDITOR_LINEAR;Linear @@ -109,7 +110,7 @@ EXPORT_BYPASS_SH_HQ;Schatten/Lichter überspringen\n(Schärfemaske) EXPORT_FASTEXPORTOPTIONS;Schnell-Export - Einstellungen EXPORT_INSTRUCTIONS;Die Einstellungen zum schnellen Export\nerlauben es, zeit- und ressourcenintensive\nEntwicklungsschritte zu überspringen und dafür\ndie Warteschlangenverarbeitung mit\nschnellen Export-Einstellungen auszuführen.\nDieses Vorgehen wird zur schnelleren\nGenerierung von gering aufgelösten Bildern\nempfohlen, falls es auf die Geschwindigkeit\nankommt oder für ein oder mehrere Bilder\nandere Ausgabegrößen gewünscht werden,\nohne Änderungen an deren gespeicherten\nParameter vornehmen zu müssen. EXPORT_MAXHEIGHT;Maximale Höhe: -EXPORT_MAXWIDTH;Maximale Breite: +EXPORT_MAXWIDTH;Maximale Breite: EXPORT_PUTTOQUEUEFAST; Zur Warteschlange “Schneller Export“ hinzufügen EXPORT_RAW_DMETHOD;Demosaikmethode EXTPROGTARGET_1;RAW @@ -226,7 +227,7 @@ FILECHOOSER_FILTER_TIFF;TIFF-Dateien GENERAL_ABOUT;Über GENERAL_AFTER;Nachher GENERAL_APPLY;Anwenden -GENERAL_ASIMAGE;Wie Bild +GENERAL_ASIMAGE;Als Bild GENERAL_AUTO;Automatisch GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbrechen @@ -367,7 +368,7 @@ HISTORY_MSG_105;(Farbsaum entfernen) HISTORY_MSG_106;(Farbsaum entfernen)\nRadius HISTORY_MSG_107;(Farbsaum entfernen)\nSchwellenwert HISTORY_MSG_108;(Belichtung)\nLichterkompression\nSchwellenwert -HISTORY_MSG_109;(Skalieren) - Breite & Höhe +HISTORY_MSG_109;(Skalieren) - Begrenzungsrahmen HISTORY_MSG_110;(Skalieren) - Anwenden auf: HISTORY_MSG_111;(L*a*b*) - Farbverschiebung\nvermeiden HISTORY_MSG_112;--unused-- @@ -667,28 +668,28 @@ HISTORY_MSG_406;(Wavelet)\nKantenschärfung\nBenachbarte Pixel HISTORY_MSG_407;(Retinex) - Methode HISTORY_MSG_408;(Retinex) - Radius HISTORY_MSG_409;(Retinex) - Einstellungen\nKontrast -HISTORY_MSG_410;(Retinex) - Einstellungen\nHelligkeit +HISTORY_MSG_410;(Retinex) - Einstellungen\nVerstärkung und Ausgleich\nAusgleich HISTORY_MSG_411;(Retinex) - Intensität -HISTORY_MSG_412;(Retinex)\nGaußscher Gradient +HISTORY_MSG_412;(Retinex) - Einstellungen\nDynamikkompression\nGaußscher Gradient HISTORY_MSG_413;(Retinex) - Kontrast -HISTORY_MSG_414;(Retinex) - Einstellungen\nLuminanz(L) - L*a*b* -HISTORY_MSG_415;(Retinex) - Einstellungen\nTransmissionskurve +HISTORY_MSG_414;(Retinex) - Einstellungen\nKorrekturen\nLuminanz(L) - L*a*b* +HISTORY_MSG_415;(Retinex) - Einstellungen\nTransmission\nTransmissionskurve HISTORY_MSG_416;(Retinex) -HISTORY_MSG_417;(Retinex) - Einstellungen\nTransmission Median-\nfilter +HISTORY_MSG_417;(Retinex) - Einstellungen\nTransmission\nMedianfilter HISTORY_MSG_418;(Retinex) - Einstellungen\nTransmission\nSchwellenwert HISTORY_MSG_419;(Retinex) - Farbraum HISTORY_MSG_420;(Retinex) - Einstellungen\nHSL-Kurve -HISTORY_MSG_421;(Retinex) - Einstellungen\nGammakorrektur +HISTORY_MSG_421;(Retinex) - Einstellungen\nKorrekturen\nGammakorrektur HISTORY_MSG_422;(Retinex) - Einstellungen\nGamma HISTORY_MSG_423;(Retinex) - Einstellungen\nGammasteigung HISTORY_MSG_424;(Retinex) - Einstellungen\nHL-Schwellenwert HISTORY_MSG_425;(Retinex) - Einstellungen\nBasis-Logarithmus -HISTORY_MSG_426;(Retinex) - Einstellungen\nFarbton (H) +HISTORY_MSG_426;(Retinex) - Einstellungen\nKorrekturen - Farbton (H) HISTORY_MSG_427;Ausgabe-Rendering-Intent HISTORY_MSG_428;Monitor-Rendering-Intent -HISTORY_MSG_429;(Retinex) - Einstellungen\nIterationen -HISTORY_MSG_430;(Retinex) - Einstellungen\nTransmission Gradient -HISTORY_MSG_431;(Retinex) - Einstellungen\nIntensität Gradient +HISTORY_MSG_429;(Retinex) - Einstellungen\nDynamikkompression\nIterationen +HISTORY_MSG_430;(Retinex) - Einstellungen\nDynamikkompression\nTransmission Gradient +HISTORY_MSG_431;(Retinex) - Einstellungen\nDynamikkompression\nIntensität Gradient HISTORY_MSG_432;(Retinex) - Maske\nLichter HISTORY_MSG_433;(Retinex) - Maske\nTonwertbreite Lichter HISTORY_MSG_434;(Retinex) - Maske\nSchatten @@ -698,6 +699,8 @@ HISTORY_MSG_437;(Retinex) - Maske\nMethode HISTORY_MSG_438;(Retinex) - Maske\nKurve HISTORY_MSG_439;(Retinex) - Vorschau HISTORY_MSG_440;(Detailebenenkontrast)\nProzessreihenfolge +HISTORY_MSG_441;(Retinex) - Einstellungen\nVerstärkung und Ausgleich\nTransmissionsverstärkung +HISTORY_MSG_442;(Retinex) - Einstellungen\nTransmission - Skalierung HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -1674,7 +1677,7 @@ TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Mit “3-pass“ erzielt man die besten Erg TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix TP_RESIZE_APPLIESTO;Anwenden auf: TP_RESIZE_CROPPEDAREA;Ausschnitt -TP_RESIZE_FITBOX;Breite & Höhe +TP_RESIZE_FITBOX;Begrenzungsrahmen TP_RESIZE_FULLIMAGE;Ganzes Bild TP_RESIZE_H;Höhe: TP_RESIZE_HEIGHT;Höhe @@ -1696,8 +1699,12 @@ TP_RETINEX_CURVEEDITOR_LH;Intensität=f(H) TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensität in Abhängigkeit des Farbtons (H)\nBei der Retinex-Methode "Spitzlichter" wirken sich die Änderungen auch auf die Chromakorrektur aus. TP_RETINEX_CURVEEDITOR_MAP;L=f(L) TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Die Kurve kann entweder alleine, oder mit der Gaußschen- oder Waveletmaske angewendet werden.\nArtefakte beachten! +TP_RETINEX_EQUAL;Korrekturen TP_RETINEX_FREEGAMMA;Gamma TP_RETINEX_GAIN;Kontrast +TP_RETINEX_GAINOFFS;Verstärkung und Ausgleich (Helligkeit) +TP_RETINEX_GAINTRANSMISSION;Transmissionsverstärkung +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Ändert die Helligkeit durch Verstärken oder\nReduzieren der Transmissionskarte. TP_RETINEX_GAIN_TOOLTIP;Wirkt sich auf das verarbeitete Bild aus. Wird für schwarze oder weiße Pixel verwendet und hilft das Histogramm auszugleichen. TP_RETINEX_GAMMA;Gammakorrektur TP_RETINEX_GAMMA_FREE;Benutzerdefiniert @@ -1716,7 +1723,8 @@ TP_RETINEX_HIGHLIGHT;Spitzlichter Schwellenwert TP_RETINEX_HIGHLIGHT_TOOLTIP;Benötigt unter Umständen Korrekturen der Einstellungen "Benachbarte Pixel" und "Weißpunkt" unter dem Reiter "RAW". TP_RETINEX_HSLSPACE_LIN;HSL-Linear TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmisch -TP_RETINEX_ITER;Iterationen (Dynamikkompression) +TP_RETINEX_ITER;Iterationen +TP_RETINEX_ITERF;Dynamikkompression TP_RETINEX_ITER_TOOLTIP;Simuliert eine Dynamikkompression.\nHöhere Werte erhöhen die Prozessorzeit. TP_RETINEX_LABEL;Retinex (Bildschleier entfernen) TP_RETINEX_LABEL_MASK;Maske @@ -1728,7 +1736,7 @@ TP_RETINEX_MAP_MAPP;Schärfemaske (Teil-Wavelet) TP_RETINEX_MAP_MAPT;Schärfemaske (Wavelet) TP_RETINEX_MAP_METHOD_TOOLTIP;Keine: Wendet die Maske, die mit der gaußschen Funktion (Radius, Methode) erstellt wurde an, um Halos und Artefakte zu reduzieren.\n\nNur Kurve: Wendet eine diagonale Kontrastkurve auf die Maske an.\nArtefakte beachten.\n\nGaußschenmaske: Wendet eine gaußsche Unschärfe auf die originale Maske an.\n(Schnell)\n\nSchärfemaske: Wendet ein Wavelet auf die originale Maske an.\n(Langsam) TP_RETINEX_MAP_NONE;Keine -TP_RETINEX_MEDIAN;Transmission Medianfilter +TP_RETINEX_MEDIAN;Medianfilter TP_RETINEX_METHOD;Methode TP_RETINEX_METHOD_TOOLTIP;"Schatten" wirkt sich auf dunkle Bereiche aus.\n"Schatten & Lichter" wirkt sich auf dunkle und helle Bereiche aus.\n"Lichter" wirkt sich auf helle Bereiche aus.\n"Spitzlichter" wirkt sich auf sehr helle Bereiche aus und reduziert Magenta-Falschfarben. TP_RETINEX_MLABEL;Schleierreduzierung: Min=%1 Max=%2 @@ -1736,17 +1744,19 @@ TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min=0 und Max=32768 sein TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Zurücksetzen TP_RETINEX_NEUTRAL_TIP;Setzt alle Regler und Kurven auf ihre Standardwerte zurück. -TP_RETINEX_OFFSET;Helligkeit +TP_RETINEX_OFFSET;Ausgleich (Helligkeit) TP_RETINEX_SCALES;Gaußscher Gradient TP_RETINEX_SCALES_TOOLTIP;Steht der Regler auf 0 sind alle Iterationen identisch.\nBei > 0 werden Skalierung und Radius reduziert und umgekehrt. TP_RETINEX_SETTINGS;Einstellungen +TP_RETINEX_SKAL;Skalierung TP_RETINEX_SLOPE;Gammasteigung TP_RETINEX_STRENGTH;Intensität -TP_RETINEX_THRESHOLD;Transmission Schwellenwert +TP_RETINEX_THRESHOLD;Schwellenwert TP_RETINEX_THRESHOLD_TOOLTIP;Limitiert den Bereich der Transmissionskurve. TP_RETINEX_TLABEL;T: Min=%1 Max=%2 Mittel=%3 Sigma=%4 TP_RETINEX_TLABEL2;T: Tmin=%1 Tmax=%2 TP_RETINEX_TLABEL_TOOLTIP;Ergebnis der Transmissionskurve: Min, Max, Mittel und Sigma\nMin und Max hat Einfluss auf die Abweichung.\n\nTmin = Kleinster Wert der Transmissionskurve\nTmax = Größter Wert der Transmissionskurve +TP_RETINEX_TRANF;Transmission TP_RETINEX_TRANSMISSION;Transmissionskurve TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission in Abhängigkeit der Transmission.\nx-Achse: Transmission negativer Werte (Min), Mittel und positiver Werte (Max).\ny-Achse: Verstärkung oder Reduzierung. TP_RETINEX_UNIFORM;Schatten & Lichter @@ -2043,16 +2053,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!HISTORY_MSG_441;Retinex - Gain transmission -!HISTORY_MSG_442;Retinex - Scale -!TP_RETINEX_EQUAL;Equalizer -!TP_RETINEX_GAINOFFS;Gain and Offset (brightness) -!TP_RETINEX_GAINTRANSMISSION;Gain transmission -!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_SKAL;Scale -!TP_RETINEX_TRANF;Transmission From 6e97875d814b3907f02fb38d355be71fa173ade6 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 24 May 2016 22:00:21 +0200 Subject: [PATCH 069/232] Small correction to Deutsch file --- rtdata/languages/Deutsch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 58dc186a4..1f2a579ac 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -227,7 +227,7 @@ FILECHOOSER_FILTER_TIFF;TIFF-Dateien GENERAL_ABOUT;Über GENERAL_AFTER;Nachher GENERAL_APPLY;Anwenden -GENERAL_ASIMAGE;Als Bild +GENERAL_ASIMAGE;Wie Bild GENERAL_AUTO;Automatisch GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbrechen From 5cd202ddb563b52044a27a9c46adaafacd6e872f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 24 May 2016 23:46:43 +0200 Subject: [PATCH 070/232] Fix build on Arch 32bit non SSE using gcc-6.6.1, fixes #3305, kudos to mbajor for reporting and to Floessie for providing a fix for the bug --- rtexif/rtexif.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 2d6c800fc..471f9fbe3 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -558,7 +558,7 @@ protected: lensAperture = exp( log(a1) + (log(a2) - log(a1)) / (log(f2) - log(f1)) * (log(focalLength) - log(f1)) ); } - dif = abs(lensAperture - maxApertureAtFocal); + dif = std::abs(lensAperture - maxApertureAtFocal); } else { dif = 0; } From 119fbfcd0bea125fb878e5814bcc91e45bdf7700 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 29 May 2016 22:35:15 +0200 Subject: [PATCH 071/232] Updated dcraw.patch file --- rtengine/dcraw.patch | 382 ++++++++++++++++++++++++------------------- 1 file changed, 212 insertions(+), 170 deletions(-) diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 88a56068c..2b4ee4102 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2016-02-11 22:56:58.043957200 +0100 -+++ dcraw.cc 2016-02-11 23:13:28.708268000 +0100 +--- dcraw.c 2016-05-29 22:32:01.173135400 +0200 ++++ dcraw.cc 2016-05-29 21:57:44.144527700 +0200 @@ -1,3 +1,15 @@ +/*RT*/#include +/*RT*/#include @@ -15,7 +15,7 @@ + /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2015 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net @@ -29,17 +41,17 @@ #define _GNU_SOURCE #endif @@ -52,8 +52,8 @@ #define snprintf _snprintf #define strcasecmp stricmp #define strncasecmp strnicmp -@@ -98,88 +109,38 @@ - #define LONG_BIT (8 * sizeof (long)) +@@ -89,89 +100,38 @@ + #define _(String) (String) #endif -#if !defined(uchar) @@ -123,6 +123,7 @@ -struct tiff_ifd { - int width, height, bps, comp, phint, offset, flip, samples, bytes; - int tile_width, tile_length; +- float shutter; -} tiff_ifd[10]; - -struct ph1 { @@ -147,7 +148,7 @@ -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#define LIM(x,min,max) MAX(min,MIN(x,max)) -#define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) --#define CLIP(x) LIM(x,0,65535) +-#define CLIP(x) LIM((int)(x),0,65535) +#define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b)) +#define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b)) +#define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max)) @@ -156,7 +157,7 @@ #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } /* -@@ -255,6 +216,7 @@ +@@ -247,6 +207,7 @@ if (filters == 1) return filter[(row+top_margin)&15][(col+left_margin)&15]; if (filters == 9) return xtrans[(row+6) % 6][(col+6) % 6]; @@ -164,7 +165,7 @@ return FC(row,col); } -@@ -297,6 +259,7 @@ +@@ -289,6 +250,7 @@ fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); } data_error++; @@ -172,7 +173,7 @@ } ushort CLASS sget2 (uchar *s) -@@ -370,7 +333,7 @@ +@@ -362,7 +324,7 @@ { if (fread (pixel, 2, count, ifp) < count) derror(); if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) @@ -181,7 +182,7 @@ } void CLASS cubic_spline (const int *x_, const int *y_, const int len) -@@ -597,10 +560,10 @@ +@@ -589,10 +551,10 @@ return 0; } @@ -195,17 +196,45 @@ unsigned c; if (nbits > 25) return 0; -@@ -824,7 +787,8 @@ +@@ -805,9 +767,13 @@ + FORC(2) free (huff[c]); + } + ++/* ++ Not a full implementation of Lossless JPEG, just ++ enough to decode Canon, Kodak and Adobe DNG images. ++ */ + struct jhead { +- int algo, bits, high, wide, clrs, sraw, psv, restart, vpred[6]; +- ushort quant[64], idct[64], *huff[20], *free[20], *row; ++ int bits, high, wide, clrs, sraw, psv, restart, vpred[6]; ++ ushort *huff[6], *free[4], *row; + }; int CLASS ljpeg_start (struct jhead *jh, int info_only) - { -- int c, tag, len; -+ int c, tag; -+ ushort len; - uchar data[0x10000]; - const uchar *dp; - -@@ -1284,14 +1248,14 @@ +@@ -828,9 +794,9 @@ + switch (tag) { + case 0xffc3: + jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; +- case 0xffc1: ++ case 0xffc1: + case 0xffc0: +- jh->algo = tag & 0xff; ++ jh->algo = tag & 0xff; + jh->bits = data[0]; + jh->high = data[1] << 8 | data[2]; + jh->wide = data[3] << 8 | data[4]; +@@ -1124,8 +1090,7 @@ + if (++col >= tile_width || col >= raw_width) + row += 1 + (col = 0); + } +- } +- } ++ } } + fseek (ifp, save+4, SEEK_SET); + if ((tcol += tile_width) >= raw_width) + trow += tile_length + (tcol = 0); +@@ -1332,14 +1297,14 @@ int i, nz; char tail[424]; @@ -222,7 +251,7 @@ void CLASS ppm_thumb() { -@@ -1653,10 +1617,10 @@ +@@ -1701,10 +1666,10 @@ } } @@ -236,17 +265,7 @@ unsigned c; if (nbits == -1) -@@ -1721,7 +1685,8 @@ - pixel[col] = curve[pixel[col]]; - } - for (col=0; col < raw_width; col++) { -- i = (pixel[col] << 2) - ph1.black -+ if (ph1.format != 8) pixel[col] <<= 2; -+ i = pixel[col] - ph1.black - + cblack[row][col >= ph1.split_col] - + rblack[col][row >= ph1.split_row]; - if (i > 0) RAW(row,col) = i; -@@ -1731,6 +1696,338 @@ +@@ -1779,6 +1744,338 @@ maximum = 0xfffc - ph1.black; } @@ -585,7 +604,7 @@ void CLASS hasselblad_load_raw() { struct jhead jh; -@@ -1954,10 +2251,10 @@ +@@ -2002,10 +2299,10 @@ maximum = curve[0x3ff]; } @@ -599,7 +618,7 @@ int byte; if (!nbits) return vbits=0; -@@ -2140,7 +2437,7 @@ +@@ -2188,7 +2485,7 @@ void CLASS kodak_radc_load_raw() { @@ -608,7 +627,7 @@ 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8, 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8, 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8, -@@ -2246,11 +2543,11 @@ +@@ -2294,11 +2591,11 @@ METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo) { @@ -622,7 +641,7 @@ cinfo->src->next_input_byte = jpeg_buffer; cinfo->src->bytes_in_buffer = nbytes; return TRUE; -@@ -2600,10 +2897,9 @@ +@@ -2648,10 +2945,9 @@ maximum = (1 << (thumb_misc & 31)) - 1; } @@ -635,7 +654,7 @@ if (start) { for (p=0; p < 4; p++) pad[p] = key = key * 48828125 + 1; -@@ -2688,11 +2984,13 @@ +@@ -2736,11 +3032,13 @@ bit += 7; } for (i=0; i < 16; i++, col+=2) @@ -650,7 +669,7 @@ } void CLASS samsung_load_raw() -@@ -2988,7 +3286,7 @@ +@@ -3038,7 +3336,7 @@ void CLASS foveon_decoder (unsigned size, unsigned code) { @@ -659,7 +678,7 @@ struct decode *cur; int i, len; -@@ -3085,7 +3383,7 @@ +@@ -3135,7 +3433,7 @@ pred[c] += diff[dindex->leaf]; if (pred[c] >> 16 && ~pred[c] >> 16) derror(); } @@ -668,7 +687,7 @@ } } } -@@ -3696,6 +3994,8 @@ +@@ -3746,6 +4044,8 @@ if (load_raw == &CLASS phase_one_load_raw || load_raw == &CLASS phase_one_load_raw_c) phase_one_correct(); @@ -677,7 +696,7 @@ if (fuji_width) { for (row=0; row < raw_height-top_margin*2; row++) { for (col=0; col < fuji_width << !fuji_layout; col++) { -@@ -3711,10 +4011,13 @@ +@@ -3761,10 +4061,13 @@ } } } else { @@ -693,7 +712,7 @@ if (mask[0][3] > 0) goto mask_set; if (load_raw == &CLASS canon_load_raw || load_raw == &CLASS lossless_jpeg_load_raw) { -@@ -4316,239 +4619,8 @@ +@@ -4366,239 +4669,8 @@ } } @@ -702,8 +721,7 @@ - int code[16][16][32], size=16, *ip, sum[4]; - int f, c, i, x, y, row, col, shift, color; - ushort *pix; -+/* RT: delete interpolation functions */ - +- - if (verbose) fprintf (stderr,_("Bilinear interpolation...\n")); - if (filters == 9) size = 6; - border_interpolate(1); @@ -886,7 +904,8 @@ - int dir[5] = { 1, width, -1, -width, 1 }; - int row, col, diff[2], guess[2], c, d, i; - ushort (*pix)[4]; -- ++/* RT: delete interpolation functions */ + - border_interpolate(3); - if (verbose) fprintf (stderr,_("PPG interpolation...\n")); - @@ -934,7 +953,7 @@ void CLASS cielab (ushort rgb[3], short lab[3]) { -@@ -4814,112 +4886,7 @@ +@@ -4864,112 +4936,7 @@ } #undef fcol @@ -952,7 +971,7 @@ - char (*homo)[TS][TS], *buffer; - - if (verbose) fprintf (stderr,_("AHD interpolation...\n")); - +- - cielab (0,0); - border_interpolate(5); - buffer = (char *) malloc (26*TS*TS); @@ -960,7 +979,7 @@ - rgb = (ushort(*)[TS][TS][3]) buffer; - lab = (short (*)[TS][TS][3])(buffer + 12*TS*TS); - homo = (char (*)[TS][TS]) (buffer + 24*TS*TS); -- + - for (top=2; top < height-5; top += TS-6) - for (left=2; left < width-5; left += TS-6) { - @@ -1047,7 +1066,7 @@ #undef TS void CLASS median_filter() -@@ -5089,7 +5056,7 @@ +@@ -5139,7 +5106,7 @@ } } @@ -1056,7 +1075,7 @@ void CLASS parse_makernote (int base, int uptag) { -@@ -5194,6 +5161,11 @@ +@@ -5244,6 +5211,11 @@ tag |= uptag << 16; if (tag == 2 && strstr(make,"NIKON") && !iso_speed) iso_speed = (get2(),get2()); @@ -1068,7 +1087,7 @@ if (tag == 4 && len > 26 && len < 35) { if ((i=(get4(),get2())) != 0x7fff && !iso_speed) iso_speed = 50 * pow (2, i/32.0 - 4); -@@ -5246,12 +5218,16 @@ +@@ -5296,12 +5268,16 @@ cam_mul[2] = get4() << 2; } } @@ -1086,15 +1105,25 @@ if (tag == 0x1d) while ((c = fgetc(ifp)) && c != EOF) serial = serial*10 + (isdigit(c) ? c - '0' : c % 10); -@@ -5442,6 +5418,7 @@ - case 33434: shutter = getreal(type); break; +@@ -5491,14 +5467,14 @@ + while (entries--) { + tiff_get (base, &tag, &type, &len, &save); + switch (tag) { +- case 33434: tiff_ifd[tiff_nifds-1].shutter = +- shutter = getreal(type); break; ++ case 33434: tiff_ifd[tiff_nifds-1].shutter = shutter = getreal(type); break; case 33437: aperture = getreal(type); break; case 34855: iso_speed = get2(); break; + case 34866: if((!iso_speed) || iso_speed == 65535) iso_speed = get4();break; case 36867: case 36868: get_timestamp(0); break; case 37377: if ((expo = -getreal(type)) < 128) -@@ -5613,28 +5590,33 @@ +- tiff_ifd[tiff_nifds-1].shutter = ++ tiff_ifd[tiff_nifds-1].shutter = + shutter = pow (2, expo); break; + case 37378: aperture = pow (2, getreal(type)/2); break; + case 37386: focal_len = getreal(type); break; +@@ -5667,28 +5643,33 @@ } } @@ -1134,7 +1163,7 @@ entries = get2(); if (entries > 512) return 1; while (entries--) { -@@ -5702,7 +5684,8 @@ +@@ -5758,7 +5739,8 @@ fgets (make, 64, ifp); break; case 272: /* Model */ @@ -1144,7 +1173,7 @@ break; case 280: /* Panasonic RW2 offset */ if (type != 4) break; -@@ -5762,6 +5745,9 @@ +@@ -5818,6 +5800,9 @@ case 315: /* Artist */ fread (artist, 64, 1, ifp); break; @@ -1154,7 +1183,7 @@ case 322: /* TileWidth */ tiff_ifd[ifd].tile_width = getint(type); break; -@@ -5777,6 +5763,9 @@ +@@ -5833,6 +5818,9 @@ is_raw = 5; } break; @@ -1164,7 +1193,7 @@ case 330: /* SubIFDs */ if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) { load_raw = &CLASS sony_arw_load_raw; -@@ -5790,6 +5779,9 @@ +@@ -5846,6 +5834,9 @@ fseek (ifp, i+4, SEEK_SET); } break; @@ -1174,17 +1203,7 @@ case 400: strcpy (make, "Sarnoff"); maximum = 0xfff; -@@ -5971,6 +5963,9 @@ - if (!make[0]) strcpy (make, "DNG"); - is_raw = 1; - break; -+ case 50708: /* UniqueCameraModel */ -+ fgets (model3, 64, ifp); -+ break; - case 50710: /* CFAPlaneColor */ - if (filters == 9) break; - if (len > 4) len = 4; -@@ -6002,12 +5997,21 @@ +@@ -6063,12 +6054,21 @@ case 61450: cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ @@ -1211,8 +1230,8 @@ + break; case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ - for (num=i=0; i < len; i++) -@@ -6024,13 +6028,13 @@ + for (num=i=0; i < (len & 0xffff); i++) +@@ -6085,13 +6085,13 @@ case 50721: /* ColorMatrix1 */ case 50722: /* ColorMatrix2 */ FORCC for (j=0; j < 3; j++) @@ -1228,7 +1247,7 @@ break; case 50727: /* AnalogBalance */ FORCC ab[c] = getreal(type); -@@ -6053,6 +6057,11 @@ +@@ -6114,6 +6114,11 @@ case 50752: read_shorts (cr2_slice, 3); break; @@ -1240,7 +1259,7 @@ case 50829: /* ActiveArea */ top_margin = getint(type); left_margin = getint(type); -@@ -6085,21 +6094,27 @@ +@@ -6146,21 +6151,27 @@ fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; @@ -1276,7 +1295,7 @@ cam_xyz_coeff (cmatrix, cam_xyz); } if (asn[0]) { -@@ -6107,13 +6122,14 @@ +@@ -6168,13 +6179,14 @@ FORCC cam_mul[c] = 1 / asn[c]; } if (!use_cm) @@ -1292,7 +1311,15 @@ fseek (ifp, base, SEEK_SET); order = get2(); -@@ -6191,7 +6207,12 @@ +@@ -6206,6 +6218,7 @@ + shutter = tiff_ifd[i].shutter; + tiff_ifd[i].shutter = shutter; + } ++ + for (i=0; i < tiff_nifds; i++) { + if (max_samp < tiff_ifd[i].samples) + max_samp = tiff_ifd[i].samples; +@@ -6266,7 +6279,12 @@ case 8: load_raw = &CLASS eight_bit_load_raw; break; case 12: if (tiff_ifd[raw].phint == 2) load_flags = 6; @@ -1306,7 +1333,7 @@ case 14: load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && -@@ -6230,6 +6251,7 @@ +@@ -6305,6 +6323,7 @@ case 32803: load_raw = &CLASS kodak_65000_load_raw; } case 32867: case 34892: break; @@ -1314,7 +1341,7 @@ default: is_raw = 0; } if (!dng_version) -@@ -6315,7 +6337,7 @@ +@@ -6390,7 +6409,7 @@ { const char *file, *ext; char *jname, *jfile, *jext; @@ -1323,7 +1350,7 @@ ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); -@@ -6337,13 +6359,14 @@ +@@ -6412,13 +6431,14 @@ } else while (isdigit(*--jext)) { if (*jext != '9') { @@ -1340,7 +1367,7 @@ if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); parse_tiff (12); -@@ -6620,6 +6643,7 @@ +@@ -6693,6 +6713,7 @@ load_raw = ph1.format < 3 ? &CLASS phase_one_load_raw : &CLASS phase_one_load_raw_c; maximum = 0xffff; @@ -1348,16 +1375,7 @@ strcpy (make, "Phase One"); if (model[0]) return; switch (raw_height) { -@@ -6658,7 +6682,7 @@ - } else if (tag == 0xc000) { - c = order; - order = 0x4949; -- if ((tag = get4()) > 10000) tag = get4(); -+ while ((tag = get4()) > 10000); - width = tag; - height = get4(); - order = c; -@@ -6688,7 +6712,11 @@ +@@ -6761,7 +6782,11 @@ order = get2(); hlen = get4(); if (get4() == 0x48454150) /* "HEAP" */ @@ -1369,7 +1387,7 @@ if (parse_tiff (save+6)) apply_tiff(); fseek (ifp, save+len, SEEK_SET); } -@@ -6960,7 +6988,8 @@ +@@ -7033,7 +7058,8 @@ { static const struct { const char *prefix; @@ -1379,7 +1397,22 @@ } table[] = { { "AgfaPhoto DC-833m", 0, 0, /* DJC */ { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, -@@ -7919,6 +7948,33 @@ +@@ -7977,12 +8003,12 @@ + { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, + { "Sony DSC-RX100", 0, 0, + { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, +- { "Sony DSC-RX10", 0, 0, /* also RX10M2 */ ++ { "Sony DSC-RX10", 0, 0, + { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, + { "Sony DSC-RX1RM2", 0, 0, + { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, + { "Sony DSC-RX1", 0, 0, +- { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, ++ { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "Sony DSLR-A100", 0, 0xfeb, + { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, + { "Sony DSLR-A290", 0, 0, +@@ -8088,6 +8114,33 @@ } break; } @@ -1413,7 +1446,7 @@ } void CLASS simple_coeff (int index) -@@ -8229,7 +8285,7 @@ +@@ -8410,7 +8463,7 @@ tiff_flip = flip = filters = UINT_MAX; /* unknown */ raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; maximum = height = width = top_margin = left_margin = 0; @@ -1422,7 +1455,7 @@ iso_speed = shutter = aperture = focal_len = unique_id = 0; tiff_nifds = 0; memset (tiff_ifd, 0, sizeof tiff_ifd); -@@ -8261,13 +8317,20 @@ +@@ -8442,13 +8495,20 @@ fread (head, 1, 32, ifp); fseek (ifp, 0, SEEK_END); flen = fsize = ftell(ifp); @@ -1445,7 +1478,7 @@ parse_ciff (hlen, flen-hlen, 0); load_raw = &CLASS canon_load_raw; } else if (parse_tiff(0)) apply_tiff(); -@@ -8313,6 +8376,7 @@ +@@ -8494,6 +8554,7 @@ fseek (ifp, 100+28*(shot_select > 0), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); @@ -1453,7 +1486,7 @@ apply_tiff(); } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); -@@ -8426,9 +8490,10 @@ +@@ -8607,9 +8668,10 @@ if (make[0] == 0) parse_smal (0, flen); if (make[0] == 0) { parse_jpeg(0); @@ -1467,7 +1500,7 @@ strcpy (make, "OmniVision"); data_offset = ftell(ifp) + 0x8000-32; width = raw_width; -@@ -8437,6 +8502,7 @@ +@@ -8618,6 +8680,7 @@ filters = 0x16161616; } else is_raw = 0; } @@ -1475,7 +1508,7 @@ for (i=0; i < sizeof corp / sizeof *corp; i++) if (strcasestr (make, corp[i])) /* Simplify company names */ -@@ -8468,7 +8534,7 @@ +@@ -8649,7 +8712,7 @@ if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) @@ -1484,15 +1517,15 @@ if (width >= 4960 && !strncmp(model,"K-5",3)) { left_margin = 10; width = 4950; filters = 0x16161616; } if (width == 4736 && !strcmp(model,"K-7")) -@@ -8487,6 +8553,7 @@ - switch (tiff_compress) { +@@ -8669,6 +8732,7 @@ + case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; + case 8: load_raw = &CLASS deflate_dng_load_raw; break; case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; } -@@ -8541,6 +8608,7 @@ +@@ -8725,6 +8789,7 @@ if (height > width) pixel_aspect = 2; filters = 0; simple_coeff(0); @@ -1500,7 +1533,7 @@ } else if (!strcmp(make,"Canon") && tiff_bps == 15) { switch (width) { case 3344: width -= 66; -@@ -8846,24 +8914,53 @@ +@@ -9034,24 +9099,53 @@ if (load_raw == &CLASS lossless_jpeg_load_raw) load_raw = &CLASS hasselblad_load_raw; if (raw_width == 7262) { @@ -1559,7 +1592,7 @@ } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); -@@ -8921,6 +9018,7 @@ +@@ -9109,6 +9203,7 @@ filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { @@ -1567,7 +1600,7 @@ if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { -@@ -8938,6 +9036,7 @@ +@@ -9126,6 +9221,7 @@ } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; @@ -1575,7 +1608,7 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -9155,6 +9254,18 @@ +@@ -9357,6 +9453,18 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1594,7 +1627,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9169,9 +9280,9 @@ +@@ -9371,9 +9479,9 @@ if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; @@ -1606,7 +1639,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -9250,194 +9361,249 @@ +@@ -9452,199 +9560,250 @@ } #endif @@ -1634,10 +1667,14 @@ - { { 0.529317, 0.330092, 0.140588 }, - { 0.098368, 0.873465, 0.028169 }, - { 0.016879, 0.117663, 0.865457 } }; +- static const double aces_rgb[3][3] = +- { { 0.432996, 0.375380, 0.189317 }, +- { 0.089427, 0.816523, 0.102989 }, +- { 0.019165, 0.118150, 0.941914 } }; - static const double (*out_rgb[])[3] = -- { rgb_rgb, adobe_rgb, wide_rgb, prophoto_rgb, xyz_rgb }; +- { rgb_rgb, adobe_rgb, wide_rgb, prophoto_rgb, xyz_rgb, aces_rgb }; - static const char *name[] = -- { "sRGB", "Adobe RGB (1998)", "WideGamut D65", "ProPhoto D65", "XYZ" }; +- { "sRGB", "Adobe RGB (1998)", "WideGamut D65", "ProPhoto D65", "XYZ", "ACES" }; - static const unsigned phead[] = - { 1024, 0, 0x2100000, 0x6d6e7472, 0x52474220, 0x58595a20, 0, 0, 0, - 0x61637370, 0, 0, 0x6e6f6e65, 0, 0, 0, 0, 0xf6d6, 0x10000, 0xd32d }; @@ -1658,7 +1695,7 @@ - gamma_curve (gamm[0], gamm[1], 0, 0); - memcpy (out_cam, rgb_cam, sizeof out_cam); - raw_color |= colors == 1 || document_mode || -- output_color < 1 || output_color > 5; +- output_color < 1 || output_color > 6; - if (!raw_color) { - oprof = (unsigned *) calloc (phead[0], 1); - merror (oprof, "convert_to_rgb()"); @@ -2023,37 +2060,42 @@ + + delete [] cBuffer; + delete [] uBuffer; - } ++} + } + + if (ifd->sample_format == 3) { // Floating point data + copyFloatDataToInt(float_raw_image, raw_image, raw_width*raw_height, maximum); + } -+} -+ -+/* RT: removed unused functions */ + } ++/* RT: removed unused functions */ ++ struct tiff_tag { ushort tag, type; -@@ -9461,590 +9627,11 @@ + int count; +@@ -9667,594 +9826,11 @@ char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; --void CLASS tiff_set (ushort *ntag, +-void CLASS tiff_set (struct tiff_hdr *th, ushort *ntag, - ushort tag, ushort type, int count, int val) -{ - struct tiff_tag *tt; - int c; - - tt = (struct tiff_tag *)(ntag+1) + (*ntag)++; -- tt->tag = tag; -- tt->type = type; -- tt->count = count; -- if (type < 3 && count <= 4) +- tt->val.i = val; +- if (type == 1 && count <= 4) - FORC(4) tt->val.c[c] = val >> (c << 3); -- else if (type == 3 && count <= 2) +- else if (type == 2) { +- count = strnlen((char *)th + val, count-1) + 1; +- if (count <= 4) +- FORC(4) tt->val.c[c] = ((char *)th)[val+c]; +- } else if (type == 3 && count <= 2) - FORC(2) tt->val.s[c] = val >> (c << 4); -- else tt->val.i = val; +- tt->count = count; +- tt->type = type; +- tt->tag = tag; -} - -#define TOFF(ptr) ((char *)(&(ptr)) - (char *)th) @@ -2067,55 +2109,6 @@ - th->order = htonl(0x4d4d4949) >> 16; - th->magic = 42; - th->ifd = 10; -- if (full) { -- tiff_set (&th->ntag, 254, 4, 1, 0); -- tiff_set (&th->ntag, 256, 4, 1, width); -- tiff_set (&th->ntag, 257, 4, 1, height); -- tiff_set (&th->ntag, 258, 3, colors, output_bps); -- if (colors > 2) -- th->tag[th->ntag-1].val.i = TOFF(th->bps); -- FORC4 th->bps[c] = output_bps; -- tiff_set (&th->ntag, 259, 3, 1, 1); -- tiff_set (&th->ntag, 262, 3, 1, 1 + (colors > 1)); -- } -- tiff_set (&th->ntag, 270, 2, 512, TOFF(th->desc)); -- tiff_set (&th->ntag, 271, 2, 64, TOFF(th->make)); -- tiff_set (&th->ntag, 272, 2, 64, TOFF(th->model)); -- if (full) { -- if (oprof) psize = ntohl(oprof[0]); -- tiff_set (&th->ntag, 273, 4, 1, sizeof *th + psize); -- tiff_set (&th->ntag, 277, 3, 1, colors); -- tiff_set (&th->ntag, 278, 4, 1, height); -- tiff_set (&th->ntag, 279, 4, 1, height*width*colors*output_bps/8); -- } else -- tiff_set (&th->ntag, 274, 3, 1, "12435867"[flip]-'0'); -- tiff_set (&th->ntag, 282, 5, 1, TOFF(th->rat[0])); -- tiff_set (&th->ntag, 283, 5, 1, TOFF(th->rat[2])); -- tiff_set (&th->ntag, 284, 3, 1, 1); -- tiff_set (&th->ntag, 296, 3, 1, 2); -- tiff_set (&th->ntag, 305, 2, 32, TOFF(th->soft)); -- tiff_set (&th->ntag, 306, 2, 20, TOFF(th->date)); -- tiff_set (&th->ntag, 315, 2, 64, TOFF(th->artist)); -- tiff_set (&th->ntag, 34665, 4, 1, TOFF(th->nexif)); -- if (psize) tiff_set (&th->ntag, 34675, 7, psize, sizeof *th); -- tiff_set (&th->nexif, 33434, 5, 1, TOFF(th->rat[4])); -- tiff_set (&th->nexif, 33437, 5, 1, TOFF(th->rat[6])); -- tiff_set (&th->nexif, 34855, 3, 1, iso_speed); -- tiff_set (&th->nexif, 37386, 5, 1, TOFF(th->rat[8])); -- if (gpsdata[1]) { -- tiff_set (&th->ntag, 34853, 4, 1, TOFF(th->ngps)); -- tiff_set (&th->ngps, 0, 1, 4, 0x202); -- tiff_set (&th->ngps, 1, 2, 2, gpsdata[29]); -- tiff_set (&th->ngps, 2, 5, 3, TOFF(th->gps[0])); -- tiff_set (&th->ngps, 3, 2, 2, gpsdata[30]); -- tiff_set (&th->ngps, 4, 5, 3, TOFF(th->gps[6])); -- tiff_set (&th->ngps, 5, 1, 1, gpsdata[31]); -- tiff_set (&th->ngps, 6, 5, 1, TOFF(th->gps[18])); -- tiff_set (&th->ngps, 7, 5, 3, TOFF(th->gps[12])); -- tiff_set (&th->ngps, 18, 2, 12, TOFF(th->gps[20])); -- tiff_set (&th->ngps, 29, 2, 12, TOFF(th->gps[23])); -- memcpy (th->gps, gpsdata, sizeof th->gps); -- } - th->rat[0] = th->rat[2] = 300; - th->rat[1] = th->rat[3] = 1; - FORC(6) th->rat[4+c] = 1000000; @@ -2130,6 +2123,55 @@ - sprintf (th->date, "%04d:%02d:%02d %02d:%02d:%02d", - t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); - strncpy (th->artist, artist, 64); +- if (full) { +- tiff_set (th, &th->ntag, 254, 4, 1, 0); +- tiff_set (th, &th->ntag, 256, 4, 1, width); +- tiff_set (th, &th->ntag, 257, 4, 1, height); +- tiff_set (th, &th->ntag, 258, 3, colors, output_bps); +- if (colors > 2) +- th->tag[th->ntag-1].val.i = TOFF(th->bps); +- FORC4 th->bps[c] = output_bps; +- tiff_set (th, &th->ntag, 259, 3, 1, 1); +- tiff_set (th, &th->ntag, 262, 3, 1, 1 + (colors > 1)); +- } +- tiff_set (th, &th->ntag, 270, 2, 512, TOFF(th->desc)); +- tiff_set (th, &th->ntag, 271, 2, 64, TOFF(th->make)); +- tiff_set (th, &th->ntag, 272, 2, 64, TOFF(th->model)); +- if (full) { +- if (oprof) psize = ntohl(oprof[0]); +- tiff_set (th, &th->ntag, 273, 4, 1, sizeof *th + psize); +- tiff_set (th, &th->ntag, 277, 3, 1, colors); +- tiff_set (th, &th->ntag, 278, 4, 1, height); +- tiff_set (th, &th->ntag, 279, 4, 1, height*width*colors*output_bps/8); +- } else +- tiff_set (th, &th->ntag, 274, 3, 1, "12435867"[flip]-'0'); +- tiff_set (th, &th->ntag, 282, 5, 1, TOFF(th->rat[0])); +- tiff_set (th, &th->ntag, 283, 5, 1, TOFF(th->rat[2])); +- tiff_set (th, &th->ntag, 284, 3, 1, 1); +- tiff_set (th, &th->ntag, 296, 3, 1, 2); +- tiff_set (th, &th->ntag, 305, 2, 32, TOFF(th->soft)); +- tiff_set (th, &th->ntag, 306, 2, 20, TOFF(th->date)); +- tiff_set (th, &th->ntag, 315, 2, 64, TOFF(th->artist)); +- tiff_set (th, &th->ntag, 34665, 4, 1, TOFF(th->nexif)); +- if (psize) tiff_set (th, &th->ntag, 34675, 7, psize, sizeof *th); +- tiff_set (th, &th->nexif, 33434, 5, 1, TOFF(th->rat[4])); +- tiff_set (th, &th->nexif, 33437, 5, 1, TOFF(th->rat[6])); +- tiff_set (th, &th->nexif, 34855, 3, 1, iso_speed); +- tiff_set (th, &th->nexif, 37386, 5, 1, TOFF(th->rat[8])); +- if (gpsdata[1]) { +- tiff_set (th, &th->ntag, 34853, 4, 1, TOFF(th->ngps)); +- tiff_set (th, &th->ngps, 0, 1, 4, 0x202); +- tiff_set (th, &th->ngps, 1, 2, 2, gpsdata[29]); +- tiff_set (th, &th->ngps, 2, 5, 3, TOFF(th->gps[0])); +- tiff_set (th, &th->ngps, 3, 2, 2, gpsdata[30]); +- tiff_set (th, &th->ngps, 4, 5, 3, TOFF(th->gps[6])); +- tiff_set (th, &th->ngps, 5, 1, 1, gpsdata[31]); +- tiff_set (th, &th->ngps, 6, 5, 1, TOFF(th->gps[18])); +- tiff_set (th, &th->ngps, 7, 5, 3, TOFF(th->gps[12])); +- tiff_set (th, &th->ngps, 18, 2, 12, TOFF(th->gps[20])); +- tiff_set (th, &th->ngps, 29, 2, 12, TOFF(th->gps[23])); +- memcpy (th->gps, gpsdata, sizeof th->gps); +- } -} - -void CLASS jpeg_thumb() @@ -2250,7 +2292,7 @@ - puts(_("-n Set threshold for wavelet denoising")); - puts(_("-H [0-9] Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)")); - puts(_("-t [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW)")); -- puts(_("-o [0-5] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ)")); +- puts(_("-o [0-6] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ,ACES)")); -#ifndef NO_LCMS - puts(_("-o Apply output ICC profile from file")); - puts(_("-p Apply camera ICC profile from file or \"embed\"")); From 6dba58e26e981409fb8cf9eee3effcff1f88053d Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 30 May 2016 09:11:07 +0200 Subject: [PATCH 072/232] fixed special handling of chroma = -100 --- rtengine/improcfun.cc | 13 +- rtengine/procparams.cc | 3780 ++++++++++++++++++++-------------------- 2 files changed, 1904 insertions(+), 1889 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index bc70bf5e5..91cb52603 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,6 +40,8 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" +#include "../rtgui/ppversion.h" +#include "../rtgui/guiutils.h" #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -3228,6 +3230,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer clut2xyz = iccStore->workingSpaceMatrix( hald_clut->getProfile() ); #ifdef __SSE2__ + for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { v_work2xyz[i][j] = F2V(work2xyz[i][j]); @@ -3236,6 +3239,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer v_clut2xyz[i][j] = F2V(clut2xyz[i][j]); } } + #endif } @@ -4363,6 +4367,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int tj = 0; #ifdef __SSE2__ + for (; j < tW - 3; j += 4, tj += 4) { vfloat sourceR = LVF(rtemp[ti * TS + tj]); vfloat sourceG = LVF(gtemp[ti * TS + tj]); @@ -4378,6 +4383,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer STVF(gtemp[ti * TS + tj], sourceG); STVF(btemp[ti * TS + tj], sourceB); } + #endif for (; j < tW; j++, tj++) { @@ -4429,6 +4435,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int tj = 0; #ifdef __SSE2__ + for (; j < tW - 3; j += 4, tj += 4) { vfloat sourceR = LVF(rtemp[ti * TS + tj]); vfloat sourceG = LVF(gtemp[ti * TS + tj]); @@ -4444,6 +4451,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer STVF(gtemp[ti * TS + tj], sourceG); STVF(btemp[ti * TS + tj], sourceB); } + #endif for (; j < tW; j++, tj++) { @@ -5756,7 +5764,10 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu const int chromaticity = params->labCurve.chromaticity; const float chromapro = (chromaticity + 100.0f) / 100.0f; const bool bwonly = params->blackwhite.enabled && !params->colorToning.enabled; - const bool bwToning = params->labCurve.chromaticity == - 100 /*|| params->blackwhite.method=="Ch" || params->blackwhite.enabled */ || bwonly; + bool bwq = false; +// if(params->ppVersion > 300 && params->labCurve.chromaticity == - 100) bwq = true; + // const bool bwToning = params->labCurve.chromaticity == - 100 /*|| params->blackwhite.method=="Ch" || params->blackwhite.enabled */ || bwonly; + const bool bwToning = bwq /*|| params->blackwhite.method=="Ch" || params->blackwhite.enabled */ || bwonly; //if(chromaticity==-100) chromaticity==-99; const bool LCredsk = params->labCurve.lcredsk; const bool ccut = ccutili; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 67b02a650..093ee1903 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1332,2076 +1332,2076 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol try { - Glib::KeyFile keyFile; + Glib::KeyFile keyFile; - keyFile.set_string ("Version", "AppVersion", APPVERSION); - keyFile.set_integer ("Version", "Version", PPVERSION); + keyFile.set_string ("Version", "AppVersion", APPVERSION); + keyFile.set_integer ("Version", "Version", PPVERSION); - if (!pedited || pedited->general.rank) { - keyFile.set_integer ("General", "Rank", rank); - } - - if (!pedited || pedited->general.colorlabel) { - keyFile.set_integer ("General", "ColorLabel", colorlabel); - } - - if (!pedited || pedited->general.intrash) { - keyFile.set_boolean ("General", "InTrash", inTrash); - } - - // save tone curve - if (!pedited || pedited->toneCurve.autoexp) { - keyFile.set_boolean ("Exposure", "Auto", toneCurve.autoexp); - } - - if (!pedited || pedited->toneCurve.clip) { - keyFile.set_double ("Exposure", "Clip", toneCurve.clip); - } - - if (!pedited || pedited->toneCurve.expcomp) { - keyFile.set_double ("Exposure", "Compensation", toneCurve.expcomp); - } - - if (!pedited || pedited->toneCurve.brightness) { - keyFile.set_integer ("Exposure", "Brightness", toneCurve.brightness); - } - - if (!pedited || pedited->toneCurve.contrast) { - keyFile.set_integer ("Exposure", "Contrast", toneCurve.contrast); - } - - if (!pedited || pedited->toneCurve.saturation) { - keyFile.set_integer ("Exposure", "Saturation", toneCurve.saturation); - } - - if (!pedited || pedited->toneCurve.black) { - keyFile.set_integer ("Exposure", "Black", toneCurve.black); - } - - if (!pedited || pedited->toneCurve.hlcompr) { - keyFile.set_integer ("Exposure", "HighlightCompr", toneCurve.hlcompr); - } - - if (!pedited || pedited->toneCurve.hlcomprthresh) { - keyFile.set_integer ("Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh); - } - - if (!pedited || pedited->toneCurve.shcompr) { - keyFile.set_integer ("Exposure", "ShadowCompr", toneCurve.shcompr); - } - - // save highlight recovery settings - if (!pedited || pedited->toneCurve.hrenabled) { - keyFile.set_boolean ("HLRecovery", "Enabled", toneCurve.hrenabled); - } - - if (!pedited || pedited->toneCurve.method) { - keyFile.set_string ("HLRecovery", "Method", toneCurve.method); - } - - if (!pedited || pedited->toneCurve.curveMode) { - Glib::ustring method; - - switch (toneCurve.curveMode) { - case (ToneCurveParams::TC_MODE_STD): - method = "Standard"; - break; - - case (ToneCurveParams::TC_MODE_FILMLIKE): - method = "FilmLike"; - break; - - case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): - method = "SatAndValueBlending"; - break; - - case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): - method = "WeightedStd"; - break; - - case (ToneCurveParams::TC_MODE_LUMINANCE): - method = "Luminance"; - break; - - case (ToneCurveParams::TC_MODE_PERCEPTUAL): - method = "Perceptual"; - break; + if (!pedited || pedited->general.rank) { + keyFile.set_integer ("General", "Rank", rank); } - keyFile.set_string ("Exposure", "CurveMode", method); - } - - if (!pedited || pedited->toneCurve.curveMode2) { - Glib::ustring method; - - switch (toneCurve.curveMode2) { - case (ToneCurveParams::TC_MODE_STD): - method = "Standard"; - break; - - case (ToneCurveParams::TC_MODE_FILMLIKE): - method = "FilmLike"; - break; - - case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): - method = "SatAndValueBlending"; - break; - - case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): - method = "WeightedStd"; - break; - - case (ToneCurveParams::TC_MODE_LUMINANCE): - method = "Luminance"; - break; - - case (ToneCurveParams::TC_MODE_PERCEPTUAL): - method = "Perceptual"; - break; + if (!pedited || pedited->general.colorlabel) { + keyFile.set_integer ("General", "ColorLabel", colorlabel); } - keyFile.set_string ("Exposure", "CurveMode2", method); - } - - if (!pedited || pedited->toneCurve.curve) { - Glib::ArrayHandle tcurve = toneCurve.curve; - keyFile.set_double_list("Exposure", "Curve", tcurve); - } - - if (!pedited || pedited->toneCurve.curve2) { - Glib::ArrayHandle tcurve = toneCurve.curve2; - keyFile.set_double_list("Exposure", "Curve2", tcurve); - } - - //save retinex - - if (!pedited || pedited->retinex.str) { - keyFile.set_integer ("Retinex", "Str", retinex.str); - } - - if (!pedited || pedited->retinex.scal) { - keyFile.set_integer ("Retinex", "Scal", retinex.scal); - } - - if (!pedited || pedited->retinex.iter) { - keyFile.set_integer ("Retinex", "Iter", retinex.iter); - } - - if (!pedited || pedited->retinex.grad) { - keyFile.set_integer ("Retinex", "Grad", retinex.grad); - } - - if (!pedited || pedited->retinex.grads) { - keyFile.set_integer ("Retinex", "Grads", retinex.grads); - } - - if (!pedited || pedited->retinex.gam) { - keyFile.set_double ("Retinex", "Gam", retinex.gam); - } - - if (!pedited || pedited->retinex.slope) { - keyFile.set_double ("Retinex", "Slope", retinex.slope); - } - - if (!pedited || pedited->retinex.enabled) { - keyFile.set_boolean ("Retinex", "Enabled", retinex.enabled); - } - - if (!pedited || pedited->retinex.medianmap) { - keyFile.set_boolean ("Retinex", "Median", retinex.medianmap); - } - - - - if (!pedited || pedited->retinex.neigh) { - keyFile.set_integer ("Retinex", "Neigh", retinex.neigh); - } - - if (!pedited || pedited->retinex.gain) { - keyFile.set_integer ("Retinex", "Gain", retinex.gain); - } - - if (!pedited || pedited->retinex.offs) { - keyFile.set_integer ("Retinex", "Offs", retinex.offs); - } - - if (!pedited || pedited->retinex.vart) { - keyFile.set_integer ("Retinex", "Vart", retinex.vart); - } - - if (!pedited || pedited->retinex.limd) { - keyFile.set_integer ("Retinex", "Limd", retinex.limd); - } - - if (!pedited || pedited->retinex.highl) { - keyFile.set_integer ("Retinex", "highl", retinex.highl); - } - - if (!pedited || pedited->retinex.baselog) { - keyFile.set_double ("Retinex", "baselog", retinex.baselog); - } - - if (!pedited || pedited->retinex.skal) { - keyFile.set_integer ("Retinex", "skal", retinex.skal); - } - - if (!pedited || pedited->retinex.retinexMethod) { - keyFile.set_string ("Retinex", "RetinexMethod", retinex.retinexMethod); - } - - if (!pedited || pedited->retinex.mapMethod) { - keyFile.set_string ("Retinex", "mapMethod", retinex.mapMethod); - } - - if (!pedited || pedited->retinex.viewMethod) { - keyFile.set_string ("Retinex", "viewMethod", retinex.viewMethod); - } - - if (!pedited || pedited->retinex.retinexcolorspace) { - keyFile.set_string ("Retinex", "Retinexcolorspace", retinex.retinexcolorspace); - } - - if (!pedited || pedited->retinex.gammaretinex) { - keyFile.set_string ("Retinex", "Gammaretinex", retinex.gammaretinex); - } - - if (!pedited || pedited->retinex.cdcurve) { - Glib::ArrayHandle cdcurve = retinex.cdcurve; - keyFile.set_double_list("Retinex", "CDCurve", cdcurve); - } - - if (!pedited || pedited->retinex.mapcurve) { - Glib::ArrayHandle mapcurve = retinex.mapcurve; - keyFile.set_double_list("Retinex", "MAPCurve", mapcurve); - } - - if (!pedited || pedited->retinex.cdHcurve) { - Glib::ArrayHandle cdHcurve = retinex.cdHcurve; - keyFile.set_double_list("Retinex", "CDHCurve", cdHcurve); - } - - if (!pedited || pedited->retinex.lhcurve) { - Glib::ArrayHandle lhcurve = retinex.lhcurve; - keyFile.set_double_list("Retinex", "LHCurve", lhcurve); - } - - if (!pedited || pedited->retinex.highlights) { - keyFile.set_integer ("Retinex", "Highlights", retinex.highlights); - } - - if (!pedited || pedited->retinex.htonalwidth) { - keyFile.set_integer ("Retinex", "HighlightTonalWidth", retinex.htonalwidth); - } - - if (!pedited || pedited->retinex.shadows) { - keyFile.set_integer ("Retinex", "Shadows", retinex.shadows); - } - - if (!pedited || pedited->retinex.stonalwidth) { - keyFile.set_integer ("Retinex", "ShadowTonalWidth", retinex.stonalwidth); - } - - if (!pedited || pedited->retinex.radius) { - keyFile.set_integer ("Retinex", "Radius", retinex.radius); - } - - if (!pedited || pedited->retinex.transmissionCurve) { - Glib::ArrayHandle transmissionCurve = retinex.transmissionCurve; - keyFile.set_double_list("Retinex", "TransmissionCurve", transmissionCurve); - } - - if (!pedited || pedited->retinex.gaintransmissionCurve) { - Glib::ArrayHandle gaintransmissionCurve = retinex.gaintransmissionCurve; - keyFile.set_double_list("Retinex", "GainTransmissionCurve", gaintransmissionCurve); - } - - // save channel mixer - if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { - Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Channel Mixer", "Red", rmix); - } - - if (!pedited || pedited->chmixer.green[0] || pedited->chmixer.green[1] || pedited->chmixer.green[2]) { - Glib::ArrayHandle gmix (chmixer.green, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Channel Mixer", "Green", gmix); - } - - if (!pedited || pedited->chmixer.blue[0] || pedited->chmixer.blue[1] || pedited->chmixer.blue[2]) { - Glib::ArrayHandle bmix (chmixer.blue, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Channel Mixer", "Blue", bmix); - } - - //save Black & White - if (!pedited || pedited->blackwhite.enabled) { - keyFile.set_boolean ("Black & White", "Enabled", blackwhite.enabled); - } - - if (!pedited || pedited->blackwhite.method) { - keyFile.set_string ("Black & White", "Method", blackwhite.method ); - } - - if (!pedited || pedited->blackwhite.autoc) { - keyFile.set_boolean ("Black & White", "Auto", blackwhite.autoc); - } - - if (!pedited || pedited->blackwhite.enabledcc) { - keyFile.set_boolean ("Black & White", "ComplementaryColors", blackwhite.enabledcc); - } - - if (!pedited || pedited->blackwhite.setting) { - keyFile.set_string ("Black & White", "Setting", blackwhite.setting ); - } - - if (!pedited || pedited->blackwhite.filter) { - keyFile.set_string ("Black & White", "Filter", blackwhite.filter ); - } - - if (!pedited || pedited->blackwhite.mixerRed) { - keyFile.set_integer ("Black & White", "MixerRed", blackwhite.mixerRed); - } - - if (!pedited || pedited->blackwhite.mixerOrange) { - keyFile.set_integer ("Black & White", "MixerOrange", blackwhite.mixerOrange); - } - - if (!pedited || pedited->blackwhite.mixerYellow) { - keyFile.set_integer ("Black & White", "MixerYellow", blackwhite.mixerYellow); - } - - if (!pedited || pedited->blackwhite.mixerGreen) { - keyFile.set_integer ("Black & White", "MixerGreen", blackwhite.mixerGreen); - } - - if (!pedited || pedited->blackwhite.mixerCyan) { - keyFile.set_integer ("Black & White", "MixerCyan", blackwhite.mixerCyan); - } - - if (!pedited || pedited->blackwhite.mixerBlue) { - keyFile.set_integer ("Black & White", "MixerBlue", blackwhite.mixerBlue); - } - - if (!pedited || pedited->blackwhite.mixerMagenta) { - keyFile.set_integer ("Black & White", "MixerMagenta", blackwhite.mixerMagenta); - } - - if (!pedited || pedited->blackwhite.mixerPurple) { - keyFile.set_integer ("Black & White", "MixerPurple", blackwhite.mixerPurple); - } - - if (!pedited || pedited->blackwhite.gammaRed) { - keyFile.set_integer ("Black & White", "GammaRed", blackwhite.gammaRed); - } - - if (!pedited || pedited->blackwhite.gammaGreen) { - keyFile.set_integer ("Black & White", "GammaGreen", blackwhite.gammaGreen); - } - - if (!pedited || pedited->blackwhite.gammaBlue) { - keyFile.set_integer ("Black & White", "GammaBlue", blackwhite.gammaBlue); - } - - if (!pedited || pedited->blackwhite.algo) { - keyFile.set_string ("Black & White", "Algorithm", blackwhite.algo); - } - - if (!pedited || pedited->blackwhite.luminanceCurve) { - Glib::ArrayHandle luminanceCurve = blackwhite.luminanceCurve; - keyFile.set_double_list("Black & White", "LuminanceCurve", luminanceCurve); - } - - if (!pedited || pedited->blackwhite.beforeCurveMode) { - Glib::ustring mode; - - switch (blackwhite.beforeCurveMode) { - case (BlackWhiteParams::TC_MODE_STD_BW): - mode = "Standard"; - break; - - case (BlackWhiteParams::TC_MODE_FILMLIKE_BW): - mode = "FilmLike"; - break; - - case (BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW): - mode = "SatAndValueBlending"; - break; - - case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): - mode = "WeightedStd"; - break; + if (!pedited || pedited->general.intrash) { + keyFile.set_boolean ("General", "InTrash", inTrash); } - keyFile.set_string ("Black & White", "BeforeCurveMode", mode); - } - - if (!pedited || pedited->blackwhite.afterCurveMode) { - Glib::ustring mode; - - switch (blackwhite.afterCurveMode) { - case (BlackWhiteParams::TC_MODE_STD_BW): - mode = "Standard"; - break; - - case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): - mode = "WeightedStd"; - break; - - default: - break; + // save tone curve + if (!pedited || pedited->toneCurve.autoexp) { + keyFile.set_boolean ("Exposure", "Auto", toneCurve.autoexp); } - keyFile.set_string ("Black & White", "AfterCurveMode", mode); - } + if (!pedited || pedited->toneCurve.clip) { + keyFile.set_double ("Exposure", "Clip", toneCurve.clip); + } - if (!pedited || pedited->blackwhite.beforeCurve) { - Glib::ArrayHandle tcurvebw = blackwhite.beforeCurve; - keyFile.set_double_list("Black & White", "BeforeCurve", tcurvebw); - } + if (!pedited || pedited->toneCurve.expcomp) { + keyFile.set_double ("Exposure", "Compensation", toneCurve.expcomp); + } - if (!pedited || pedited->blackwhite.afterCurve) { - Glib::ArrayHandle tcurvebw = blackwhite.afterCurve; - keyFile.set_double_list("Black & White", "AfterCurve", tcurvebw); - } + if (!pedited || pedited->toneCurve.brightness) { + keyFile.set_integer ("Exposure", "Brightness", toneCurve.brightness); + } - // save luma curve - if (!pedited || pedited->labCurve.brightness) { - keyFile.set_integer ("Luminance Curve", "Brightness", labCurve.brightness); - } + if (!pedited || pedited->toneCurve.contrast) { + keyFile.set_integer ("Exposure", "Contrast", toneCurve.contrast); + } - if (!pedited || pedited->labCurve.contrast) { - keyFile.set_integer ("Luminance Curve", "Contrast", labCurve.contrast); - } + if (!pedited || pedited->toneCurve.saturation) { + keyFile.set_integer ("Exposure", "Saturation", toneCurve.saturation); + } - if (!pedited || pedited->labCurve.chromaticity) { - keyFile.set_integer ("Luminance Curve", "Chromaticity", labCurve.chromaticity); - } + if (!pedited || pedited->toneCurve.black) { + keyFile.set_integer ("Exposure", "Black", toneCurve.black); + } - if (!pedited || pedited->labCurve.avoidcolorshift) { - keyFile.set_boolean ("Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift); - } + if (!pedited || pedited->toneCurve.hlcompr) { + keyFile.set_integer ("Exposure", "HighlightCompr", toneCurve.hlcompr); + } - if (!pedited || pedited->labCurve.rstprotection) { - keyFile.set_double ("Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection); - } + if (!pedited || pedited->toneCurve.hlcomprthresh) { + keyFile.set_integer ("Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh); + } - if (!pedited || pedited->labCurve.lcredsk) { - keyFile.set_boolean ("Luminance Curve", "LCredsk", labCurve.lcredsk); - } + if (!pedited || pedited->toneCurve.shcompr) { + keyFile.set_integer ("Exposure", "ShadowCompr", toneCurve.shcompr); + } - if (!pedited || pedited->labCurve.lcurve) { - Glib::ArrayHandle lcurve = labCurve.lcurve; - keyFile.set_double_list("Luminance Curve", "LCurve", lcurve); - } + // save highlight recovery settings + if (!pedited || pedited->toneCurve.hrenabled) { + keyFile.set_boolean ("HLRecovery", "Enabled", toneCurve.hrenabled); + } - if (!pedited || pedited->labCurve.acurve) { - Glib::ArrayHandle acurve = labCurve.acurve; - keyFile.set_double_list("Luminance Curve", "aCurve", acurve); - } + if (!pedited || pedited->toneCurve.method) { + keyFile.set_string ("HLRecovery", "Method", toneCurve.method); + } - if (!pedited || pedited->labCurve.bcurve) { - Glib::ArrayHandle bcurve = labCurve.bcurve; - keyFile.set_double_list("Luminance Curve", "bCurve", bcurve); - } + if (!pedited || pedited->toneCurve.curveMode) { + Glib::ustring method; - if (!pedited || pedited->labCurve.cccurve) { - Glib::ArrayHandle cccurve = labCurve.cccurve; - keyFile.set_double_list("Luminance Curve", "ccCurve", cccurve); - } + switch (toneCurve.curveMode) { + case (ToneCurveParams::TC_MODE_STD): + method = "Standard"; + break; - if (!pedited || pedited->labCurve.chcurve) { - Glib::ArrayHandle chcurve = labCurve.chcurve; - keyFile.set_double_list("Luminance Curve", "chCurve", chcurve); - } + case (ToneCurveParams::TC_MODE_FILMLIKE): + method = "FilmLike"; + break; - if (!pedited || pedited->labCurve.lhcurve) { - Glib::ArrayHandle lhcurve = labCurve.lhcurve; - keyFile.set_double_list("Luminance Curve", "lhCurve", lhcurve); - } + case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): + method = "SatAndValueBlending"; + break; - if (!pedited || pedited->labCurve.hhcurve) { - Glib::ArrayHandle hhcurve = labCurve.hhcurve; - keyFile.set_double_list("Luminance Curve", "hhCurve", hhcurve); - } + case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): + method = "WeightedStd"; + break; - if (!pedited || pedited->labCurve.lccurve) { - Glib::ArrayHandle lccurve = labCurve.lccurve; - keyFile.set_double_list("Luminance Curve", "LcCurve", lccurve); - } + case (ToneCurveParams::TC_MODE_LUMINANCE): + method = "Luminance"; + break; - if (!pedited || pedited->labCurve.clcurve) { - Glib::ArrayHandle clcurve = labCurve.clcurve; - keyFile.set_double_list("Luminance Curve", "ClCurve", clcurve); - } + case (ToneCurveParams::TC_MODE_PERCEPTUAL): + method = "Perceptual"; + break; + } - // save sharpening - if (!pedited || pedited->sharpening.enabled) { - keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); - } + keyFile.set_string ("Exposure", "CurveMode", method); + } - if (!pedited || pedited->sharpening.method) { - keyFile.set_string ("Sharpening", "Method", sharpening.method); - } + if (!pedited || pedited->toneCurve.curveMode2) { + Glib::ustring method; - if (!pedited || pedited->sharpening.radius) { - keyFile.set_double ("Sharpening", "Radius", sharpening.radius); - } + switch (toneCurve.curveMode2) { + case (ToneCurveParams::TC_MODE_STD): + method = "Standard"; + break; - if (!pedited || pedited->sharpening.amount) { - keyFile.set_integer ("Sharpening", "Amount", sharpening.amount); - } + case (ToneCurveParams::TC_MODE_FILMLIKE): + method = "FilmLike"; + break; - if (!pedited || pedited->sharpening.threshold) { - Glib::ArrayHandle thresh (sharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Sharpening", "Threshold", thresh); - } + case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): + method = "SatAndValueBlending"; + break; - if (!pedited || pedited->sharpening.edgesonly) { - keyFile.set_boolean ("Sharpening", "OnlyEdges", sharpening.edgesonly); - } + case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): + method = "WeightedStd"; + break; - if (!pedited || pedited->sharpening.edges_radius) { - keyFile.set_double ("Sharpening", "EdgedetectionRadius", sharpening.edges_radius); - } + case (ToneCurveParams::TC_MODE_LUMINANCE): + method = "Luminance"; + break; - if (!pedited || pedited->sharpening.edges_tolerance) { - keyFile.set_integer ("Sharpening", "EdgeTolerance", sharpening.edges_tolerance); - } + case (ToneCurveParams::TC_MODE_PERCEPTUAL): + method = "Perceptual"; + break; + } - if (!pedited || pedited->sharpening.halocontrol) { - keyFile.set_boolean ("Sharpening", "HalocontrolEnabled", sharpening.halocontrol); - } + keyFile.set_string ("Exposure", "CurveMode2", method); + } - if (!pedited || pedited->sharpening.halocontrol_amount) { - keyFile.set_integer ("Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount); - } + if (!pedited || pedited->toneCurve.curve) { + Glib::ArrayHandle tcurve = toneCurve.curve; + keyFile.set_double_list("Exposure", "Curve", tcurve); + } - if (!pedited || pedited->sharpening.deconvradius) { - keyFile.set_double ("Sharpening", "DeconvRadius", sharpening.deconvradius); - } + if (!pedited || pedited->toneCurve.curve2) { + Glib::ArrayHandle tcurve = toneCurve.curve2; + keyFile.set_double_list("Exposure", "Curve2", tcurve); + } - if (!pedited || pedited->sharpening.deconvamount) { - keyFile.set_integer ("Sharpening", "DeconvAmount", sharpening.deconvamount); - } + //save retinex - if (!pedited || pedited->sharpening.deconvdamping) { - keyFile.set_integer ("Sharpening", "DeconvDamping", sharpening.deconvdamping); - } + if (!pedited || pedited->retinex.str) { + keyFile.set_integer ("Retinex", "Str", retinex.str); + } - if (!pedited || pedited->sharpening.deconviter) { - keyFile.set_integer ("Sharpening", "DeconvIterations", sharpening.deconviter); - } + if (!pedited || pedited->retinex.scal) { + keyFile.set_integer ("Retinex", "Scal", retinex.scal); + } - // save vibrance - if (!pedited || pedited->vibrance.enabled) { - keyFile.set_boolean ("Vibrance", "Enabled", vibrance.enabled); - } + if (!pedited || pedited->retinex.iter) { + keyFile.set_integer ("Retinex", "Iter", retinex.iter); + } - if (!pedited || pedited->vibrance.pastels) { - keyFile.set_integer ("Vibrance", "Pastels", vibrance.pastels); - } + if (!pedited || pedited->retinex.grad) { + keyFile.set_integer ("Retinex", "Grad", retinex.grad); + } - if (!pedited || pedited->vibrance.saturated) { - keyFile.set_integer ("Vibrance", "Saturated", vibrance.saturated); - } + if (!pedited || pedited->retinex.grads) { + keyFile.set_integer ("Retinex", "Grads", retinex.grads); + } - if (!pedited || pedited->vibrance.psthreshold) { - Glib::ArrayHandle thresh (vibrance.psthreshold.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Vibrance", "PSThreshold", thresh); - } + if (!pedited || pedited->retinex.gam) { + keyFile.set_double ("Retinex", "Gam", retinex.gam); + } - if (!pedited || pedited->vibrance.protectskins) { - keyFile.set_boolean ("Vibrance", "ProtectSkins", vibrance.protectskins); - } + if (!pedited || pedited->retinex.slope) { + keyFile.set_double ("Retinex", "Slope", retinex.slope); + } - if (!pedited || pedited->vibrance.avoidcolorshift) { - keyFile.set_boolean ("Vibrance", "AvoidColorShift", vibrance.avoidcolorshift); - } + if (!pedited || pedited->retinex.enabled) { + keyFile.set_boolean ("Retinex", "Enabled", retinex.enabled); + } - if (!pedited || pedited->vibrance.pastsattog) { - keyFile.set_boolean ("Vibrance", "PastSatTog", vibrance.pastsattog); - } + if (!pedited || pedited->retinex.medianmap) { + keyFile.set_boolean ("Retinex", "Median", retinex.medianmap); + } - if (!pedited || pedited->vibrance.skintonescurve) { - Glib::ArrayHandle skintonescurve = vibrance.skintonescurve; - keyFile.set_double_list("Vibrance", "SkinTonesCurve", skintonescurve); - } - //save edge sharpening - if (!pedited || pedited->sharpenEdge.enabled) { - keyFile.set_boolean ("SharpenEdge", "Enabled", sharpenEdge.enabled); - } - if (!pedited || pedited->sharpenEdge.passes) { - keyFile.set_integer ("SharpenEdge", "Passes", sharpenEdge.passes); - } + if (!pedited || pedited->retinex.neigh) { + keyFile.set_integer ("Retinex", "Neigh", retinex.neigh); + } - if (!pedited || pedited->sharpenEdge.amount) { - keyFile.set_double ("SharpenEdge", "Strength", sharpenEdge.amount); - } + if (!pedited || pedited->retinex.gain) { + keyFile.set_integer ("Retinex", "Gain", retinex.gain); + } - if (!pedited || pedited->sharpenEdge.threechannels) { - keyFile.set_boolean ("SharpenEdge", "ThreeChannels", sharpenEdge.threechannels); - } + if (!pedited || pedited->retinex.offs) { + keyFile.set_integer ("Retinex", "Offs", retinex.offs); + } - //save micro-contrast sharpening - if (!pedited || pedited->sharpenMicro.enabled) { - keyFile.set_boolean ("SharpenMicro", "Enabled", sharpenMicro.enabled); - } + if (!pedited || pedited->retinex.vart) { + keyFile.set_integer ("Retinex", "Vart", retinex.vart); + } - if (!pedited || pedited->sharpenMicro.matrix) { - keyFile.set_boolean ("SharpenMicro", "Matrix", sharpenMicro.matrix); - } + if (!pedited || pedited->retinex.limd) { + keyFile.set_integer ("Retinex", "Limd", retinex.limd); + } - if (!pedited || pedited->sharpenMicro.amount) { - keyFile.set_double ("SharpenMicro", "Strength", sharpenMicro.amount); - } + if (!pedited || pedited->retinex.highl) { + keyFile.set_integer ("Retinex", "highl", retinex.highl); + } - if (!pedited || pedited->sharpenMicro.uniformity) { - keyFile.set_double ("SharpenMicro", "Uniformity", sharpenMicro.uniformity); - } + if (!pedited || pedited->retinex.baselog) { + keyFile.set_double ("Retinex", "baselog", retinex.baselog); + } - /* - // save colorBoost - if (!pedited || pedited->colorBoost.amount) keyFile.set_integer ("Color Boost", "Amount", colorBoost.amount); - if (!pedited || pedited->colorBoost.avoidclip) keyFile.set_boolean ("Color Boost", "AvoidColorClipping", colorBoost.avoidclip); - if (!pedited || pedited->colorBoost.enable_saturationlimiter) keyFile.set_boolean ("Color Boost", "SaturationLimiter", colorBoost.enable_saturationlimiter); - if (!pedited || pedited->colorBoost.saturationlimit) keyFile.set_double ("Color Boost", "SaturationLimit", colorBoost.saturationlimit); - */ + if (!pedited || pedited->retinex.skal) { + keyFile.set_integer ("Retinex", "skal", retinex.skal); + } - // save wb - if (!pedited || pedited->wb.method) { - keyFile.set_string ("White Balance", "Setting", wb.method); - } + if (!pedited || pedited->retinex.retinexMethod) { + keyFile.set_string ("Retinex", "RetinexMethod", retinex.retinexMethod); + } - if (!pedited || pedited->wb.temperature) { - keyFile.set_integer ("White Balance", "Temperature", wb.temperature); - } + if (!pedited || pedited->retinex.mapMethod) { + keyFile.set_string ("Retinex", "mapMethod", retinex.mapMethod); + } - if (!pedited || pedited->wb.green) { - keyFile.set_double ("White Balance", "Green", wb.green); - } + if (!pedited || pedited->retinex.viewMethod) { + keyFile.set_string ("Retinex", "viewMethod", retinex.viewMethod); + } - if (!pedited || pedited->wb.equal) { - keyFile.set_double ("White Balance", "Equal", wb.equal); - } + if (!pedited || pedited->retinex.retinexcolorspace) { + keyFile.set_string ("Retinex", "Retinexcolorspace", retinex.retinexcolorspace); + } - /* - // save colorShift - if (!pedited || pedited->colorShift.a) keyFile.set_double ("Color Shift", "ChannelA", colorShift.a); - if (!pedited || pedited->colorShift.b) keyFile.set_double ("Color Shift", "ChannelB", colorShift.b); - */ - // save colorappearance - if (!pedited || pedited->colorappearance.enabled) { - keyFile.set_boolean ("Color appearance", "Enabled", colorappearance.enabled); - } + if (!pedited || pedited->retinex.gammaretinex) { + keyFile.set_string ("Retinex", "Gammaretinex", retinex.gammaretinex); + } - if (!pedited || pedited->colorappearance.degree) { - keyFile.set_integer ("Color appearance", "Degree", colorappearance.degree); - } + if (!pedited || pedited->retinex.cdcurve) { + Glib::ArrayHandle cdcurve = retinex.cdcurve; + keyFile.set_double_list("Retinex", "CDCurve", cdcurve); + } - if (!pedited || pedited->colorappearance.autodegree) { - keyFile.set_boolean ("Color appearance", "AutoDegree", colorappearance.autodegree); - } + if (!pedited || pedited->retinex.mapcurve) { + Glib::ArrayHandle mapcurve = retinex.mapcurve; + keyFile.set_double_list("Retinex", "MAPCurve", mapcurve); + } - if (!pedited || pedited->colorappearance.surround) { - keyFile.set_string ("Color appearance", "Surround", colorappearance.surround); - } + if (!pedited || pedited->retinex.cdHcurve) { + Glib::ArrayHandle cdHcurve = retinex.cdHcurve; + keyFile.set_double_list("Retinex", "CDHCurve", cdHcurve); + } + + if (!pedited || pedited->retinex.lhcurve) { + Glib::ArrayHandle lhcurve = retinex.lhcurve; + keyFile.set_double_list("Retinex", "LHCurve", lhcurve); + } + + if (!pedited || pedited->retinex.highlights) { + keyFile.set_integer ("Retinex", "Highlights", retinex.highlights); + } + + if (!pedited || pedited->retinex.htonalwidth) { + keyFile.set_integer ("Retinex", "HighlightTonalWidth", retinex.htonalwidth); + } + + if (!pedited || pedited->retinex.shadows) { + keyFile.set_integer ("Retinex", "Shadows", retinex.shadows); + } + + if (!pedited || pedited->retinex.stonalwidth) { + keyFile.set_integer ("Retinex", "ShadowTonalWidth", retinex.stonalwidth); + } + + if (!pedited || pedited->retinex.radius) { + keyFile.set_integer ("Retinex", "Radius", retinex.radius); + } + + if (!pedited || pedited->retinex.transmissionCurve) { + Glib::ArrayHandle transmissionCurve = retinex.transmissionCurve; + keyFile.set_double_list("Retinex", "TransmissionCurve", transmissionCurve); + } + + if (!pedited || pedited->retinex.gaintransmissionCurve) { + Glib::ArrayHandle gaintransmissionCurve = retinex.gaintransmissionCurve; + keyFile.set_double_list("Retinex", "GainTransmissionCurve", gaintransmissionCurve); + } + + // save channel mixer + if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { + Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Channel Mixer", "Red", rmix); + } + + if (!pedited || pedited->chmixer.green[0] || pedited->chmixer.green[1] || pedited->chmixer.green[2]) { + Glib::ArrayHandle gmix (chmixer.green, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Channel Mixer", "Green", gmix); + } + + if (!pedited || pedited->chmixer.blue[0] || pedited->chmixer.blue[1] || pedited->chmixer.blue[2]) { + Glib::ArrayHandle bmix (chmixer.blue, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Channel Mixer", "Blue", bmix); + } + + //save Black & White + if (!pedited || pedited->blackwhite.enabled) { + keyFile.set_boolean ("Black & White", "Enabled", blackwhite.enabled); + } + + if (!pedited || pedited->blackwhite.method) { + keyFile.set_string ("Black & White", "Method", blackwhite.method ); + } + + if (!pedited || pedited->blackwhite.autoc) { + keyFile.set_boolean ("Black & White", "Auto", blackwhite.autoc); + } + + if (!pedited || pedited->blackwhite.enabledcc) { + keyFile.set_boolean ("Black & White", "ComplementaryColors", blackwhite.enabledcc); + } + + if (!pedited || pedited->blackwhite.setting) { + keyFile.set_string ("Black & White", "Setting", blackwhite.setting ); + } + + if (!pedited || pedited->blackwhite.filter) { + keyFile.set_string ("Black & White", "Filter", blackwhite.filter ); + } + + if (!pedited || pedited->blackwhite.mixerRed) { + keyFile.set_integer ("Black & White", "MixerRed", blackwhite.mixerRed); + } + + if (!pedited || pedited->blackwhite.mixerOrange) { + keyFile.set_integer ("Black & White", "MixerOrange", blackwhite.mixerOrange); + } + + if (!pedited || pedited->blackwhite.mixerYellow) { + keyFile.set_integer ("Black & White", "MixerYellow", blackwhite.mixerYellow); + } + + if (!pedited || pedited->blackwhite.mixerGreen) { + keyFile.set_integer ("Black & White", "MixerGreen", blackwhite.mixerGreen); + } + + if (!pedited || pedited->blackwhite.mixerCyan) { + keyFile.set_integer ("Black & White", "MixerCyan", blackwhite.mixerCyan); + } + + if (!pedited || pedited->blackwhite.mixerBlue) { + keyFile.set_integer ("Black & White", "MixerBlue", blackwhite.mixerBlue); + } + + if (!pedited || pedited->blackwhite.mixerMagenta) { + keyFile.set_integer ("Black & White", "MixerMagenta", blackwhite.mixerMagenta); + } + + if (!pedited || pedited->blackwhite.mixerPurple) { + keyFile.set_integer ("Black & White", "MixerPurple", blackwhite.mixerPurple); + } + + if (!pedited || pedited->blackwhite.gammaRed) { + keyFile.set_integer ("Black & White", "GammaRed", blackwhite.gammaRed); + } + + if (!pedited || pedited->blackwhite.gammaGreen) { + keyFile.set_integer ("Black & White", "GammaGreen", blackwhite.gammaGreen); + } + + if (!pedited || pedited->blackwhite.gammaBlue) { + keyFile.set_integer ("Black & White", "GammaBlue", blackwhite.gammaBlue); + } + + if (!pedited || pedited->blackwhite.algo) { + keyFile.set_string ("Black & White", "Algorithm", blackwhite.algo); + } + + if (!pedited || pedited->blackwhite.luminanceCurve) { + Glib::ArrayHandle luminanceCurve = blackwhite.luminanceCurve; + keyFile.set_double_list("Black & White", "LuminanceCurve", luminanceCurve); + } + + if (!pedited || pedited->blackwhite.beforeCurveMode) { + Glib::ustring mode; + + switch (blackwhite.beforeCurveMode) { + case (BlackWhiteParams::TC_MODE_STD_BW): + mode = "Standard"; + break; + + case (BlackWhiteParams::TC_MODE_FILMLIKE_BW): + mode = "FilmLike"; + break; + + case (BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW): + mode = "SatAndValueBlending"; + break; + + case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): + mode = "WeightedStd"; + break; + } + + keyFile.set_string ("Black & White", "BeforeCurveMode", mode); + } + + if (!pedited || pedited->blackwhite.afterCurveMode) { + Glib::ustring mode; + + switch (blackwhite.afterCurveMode) { + case (BlackWhiteParams::TC_MODE_STD_BW): + mode = "Standard"; + break; + + case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): + mode = "WeightedStd"; + break; + + default: + break; + } + + keyFile.set_string ("Black & White", "AfterCurveMode", mode); + } + + if (!pedited || pedited->blackwhite.beforeCurve) { + Glib::ArrayHandle tcurvebw = blackwhite.beforeCurve; + keyFile.set_double_list("Black & White", "BeforeCurve", tcurvebw); + } + + if (!pedited || pedited->blackwhite.afterCurve) { + Glib::ArrayHandle tcurvebw = blackwhite.afterCurve; + keyFile.set_double_list("Black & White", "AfterCurve", tcurvebw); + } + + // save luma curve + if (!pedited || pedited->labCurve.brightness) { + keyFile.set_integer ("Luminance Curve", "Brightness", labCurve.brightness); + } + + if (!pedited || pedited->labCurve.contrast) { + keyFile.set_integer ("Luminance Curve", "Contrast", labCurve.contrast); + } + + if (!pedited || pedited->labCurve.chromaticity) { + keyFile.set_integer ("Luminance Curve", "Chromaticity", labCurve.chromaticity); + } + + if (!pedited || pedited->labCurve.avoidcolorshift) { + keyFile.set_boolean ("Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift); + } + + if (!pedited || pedited->labCurve.rstprotection) { + keyFile.set_double ("Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection); + } + + if (!pedited || pedited->labCurve.lcredsk) { + keyFile.set_boolean ("Luminance Curve", "LCredsk", labCurve.lcredsk); + } + + if (!pedited || pedited->labCurve.lcurve) { + Glib::ArrayHandle lcurve = labCurve.lcurve; + keyFile.set_double_list("Luminance Curve", "LCurve", lcurve); + } + + if (!pedited || pedited->labCurve.acurve) { + Glib::ArrayHandle acurve = labCurve.acurve; + keyFile.set_double_list("Luminance Curve", "aCurve", acurve); + } + + if (!pedited || pedited->labCurve.bcurve) { + Glib::ArrayHandle bcurve = labCurve.bcurve; + keyFile.set_double_list("Luminance Curve", "bCurve", bcurve); + } + + if (!pedited || pedited->labCurve.cccurve) { + Glib::ArrayHandle cccurve = labCurve.cccurve; + keyFile.set_double_list("Luminance Curve", "ccCurve", cccurve); + } + + if (!pedited || pedited->labCurve.chcurve) { + Glib::ArrayHandle chcurve = labCurve.chcurve; + keyFile.set_double_list("Luminance Curve", "chCurve", chcurve); + } + + if (!pedited || pedited->labCurve.lhcurve) { + Glib::ArrayHandle lhcurve = labCurve.lhcurve; + keyFile.set_double_list("Luminance Curve", "lhCurve", lhcurve); + } + + if (!pedited || pedited->labCurve.hhcurve) { + Glib::ArrayHandle hhcurve = labCurve.hhcurve; + keyFile.set_double_list("Luminance Curve", "hhCurve", hhcurve); + } + + if (!pedited || pedited->labCurve.lccurve) { + Glib::ArrayHandle lccurve = labCurve.lccurve; + keyFile.set_double_list("Luminance Curve", "LcCurve", lccurve); + } + + if (!pedited || pedited->labCurve.clcurve) { + Glib::ArrayHandle clcurve = labCurve.clcurve; + keyFile.set_double_list("Luminance Curve", "ClCurve", clcurve); + } + + // save sharpening + if (!pedited || pedited->sharpening.enabled) { + keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); + } + + if (!pedited || pedited->sharpening.method) { + keyFile.set_string ("Sharpening", "Method", sharpening.method); + } + + if (!pedited || pedited->sharpening.radius) { + keyFile.set_double ("Sharpening", "Radius", sharpening.radius); + } + + if (!pedited || pedited->sharpening.amount) { + keyFile.set_integer ("Sharpening", "Amount", sharpening.amount); + } + + if (!pedited || pedited->sharpening.threshold) { + Glib::ArrayHandle thresh (sharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Sharpening", "Threshold", thresh); + } + + if (!pedited || pedited->sharpening.edgesonly) { + keyFile.set_boolean ("Sharpening", "OnlyEdges", sharpening.edgesonly); + } + + if (!pedited || pedited->sharpening.edges_radius) { + keyFile.set_double ("Sharpening", "EdgedetectionRadius", sharpening.edges_radius); + } + + if (!pedited || pedited->sharpening.edges_tolerance) { + keyFile.set_integer ("Sharpening", "EdgeTolerance", sharpening.edges_tolerance); + } + + if (!pedited || pedited->sharpening.halocontrol) { + keyFile.set_boolean ("Sharpening", "HalocontrolEnabled", sharpening.halocontrol); + } + + if (!pedited || pedited->sharpening.halocontrol_amount) { + keyFile.set_integer ("Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount); + } + + if (!pedited || pedited->sharpening.deconvradius) { + keyFile.set_double ("Sharpening", "DeconvRadius", sharpening.deconvradius); + } + + if (!pedited || pedited->sharpening.deconvamount) { + keyFile.set_integer ("Sharpening", "DeconvAmount", sharpening.deconvamount); + } + + if (!pedited || pedited->sharpening.deconvdamping) { + keyFile.set_integer ("Sharpening", "DeconvDamping", sharpening.deconvdamping); + } + + if (!pedited || pedited->sharpening.deconviter) { + keyFile.set_integer ("Sharpening", "DeconvIterations", sharpening.deconviter); + } + + // save vibrance + if (!pedited || pedited->vibrance.enabled) { + keyFile.set_boolean ("Vibrance", "Enabled", vibrance.enabled); + } + + if (!pedited || pedited->vibrance.pastels) { + keyFile.set_integer ("Vibrance", "Pastels", vibrance.pastels); + } + + if (!pedited || pedited->vibrance.saturated) { + keyFile.set_integer ("Vibrance", "Saturated", vibrance.saturated); + } + + if (!pedited || pedited->vibrance.psthreshold) { + Glib::ArrayHandle thresh (vibrance.psthreshold.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Vibrance", "PSThreshold", thresh); + } + + if (!pedited || pedited->vibrance.protectskins) { + keyFile.set_boolean ("Vibrance", "ProtectSkins", vibrance.protectskins); + } + + if (!pedited || pedited->vibrance.avoidcolorshift) { + keyFile.set_boolean ("Vibrance", "AvoidColorShift", vibrance.avoidcolorshift); + } + + if (!pedited || pedited->vibrance.pastsattog) { + keyFile.set_boolean ("Vibrance", "PastSatTog", vibrance.pastsattog); + } + + if (!pedited || pedited->vibrance.skintonescurve) { + Glib::ArrayHandle skintonescurve = vibrance.skintonescurve; + keyFile.set_double_list("Vibrance", "SkinTonesCurve", skintonescurve); + } + + //save edge sharpening + if (!pedited || pedited->sharpenEdge.enabled) { + keyFile.set_boolean ("SharpenEdge", "Enabled", sharpenEdge.enabled); + } + + if (!pedited || pedited->sharpenEdge.passes) { + keyFile.set_integer ("SharpenEdge", "Passes", sharpenEdge.passes); + } + + if (!pedited || pedited->sharpenEdge.amount) { + keyFile.set_double ("SharpenEdge", "Strength", sharpenEdge.amount); + } + + if (!pedited || pedited->sharpenEdge.threechannels) { + keyFile.set_boolean ("SharpenEdge", "ThreeChannels", sharpenEdge.threechannels); + } + + //save micro-contrast sharpening + if (!pedited || pedited->sharpenMicro.enabled) { + keyFile.set_boolean ("SharpenMicro", "Enabled", sharpenMicro.enabled); + } + + if (!pedited || pedited->sharpenMicro.matrix) { + keyFile.set_boolean ("SharpenMicro", "Matrix", sharpenMicro.matrix); + } + + if (!pedited || pedited->sharpenMicro.amount) { + keyFile.set_double ("SharpenMicro", "Strength", sharpenMicro.amount); + } + + if (!pedited || pedited->sharpenMicro.uniformity) { + keyFile.set_double ("SharpenMicro", "Uniformity", sharpenMicro.uniformity); + } + + /* + // save colorBoost + if (!pedited || pedited->colorBoost.amount) keyFile.set_integer ("Color Boost", "Amount", colorBoost.amount); + if (!pedited || pedited->colorBoost.avoidclip) keyFile.set_boolean ("Color Boost", "AvoidColorClipping", colorBoost.avoidclip); + if (!pedited || pedited->colorBoost.enable_saturationlimiter) keyFile.set_boolean ("Color Boost", "SaturationLimiter", colorBoost.enable_saturationlimiter); + if (!pedited || pedited->colorBoost.saturationlimit) keyFile.set_double ("Color Boost", "SaturationLimit", colorBoost.saturationlimit); + */ + + // save wb + if (!pedited || pedited->wb.method) { + keyFile.set_string ("White Balance", "Setting", wb.method); + } + + if (!pedited || pedited->wb.temperature) { + keyFile.set_integer ("White Balance", "Temperature", wb.temperature); + } + + if (!pedited || pedited->wb.green) { + keyFile.set_double ("White Balance", "Green", wb.green); + } + + if (!pedited || pedited->wb.equal) { + keyFile.set_double ("White Balance", "Equal", wb.equal); + } + + /* + // save colorShift + if (!pedited || pedited->colorShift.a) keyFile.set_double ("Color Shift", "ChannelA", colorShift.a); + if (!pedited || pedited->colorShift.b) keyFile.set_double ("Color Shift", "ChannelB", colorShift.b); + */ + // save colorappearance + if (!pedited || pedited->colorappearance.enabled) { + keyFile.set_boolean ("Color appearance", "Enabled", colorappearance.enabled); + } + + if (!pedited || pedited->colorappearance.degree) { + keyFile.set_integer ("Color appearance", "Degree", colorappearance.degree); + } + + if (!pedited || pedited->colorappearance.autodegree) { + keyFile.set_boolean ("Color appearance", "AutoDegree", colorappearance.autodegree); + } + + if (!pedited || pedited->colorappearance.surround) { + keyFile.set_string ("Color appearance", "Surround", colorappearance.surround); + } // if (!pedited || pedited->colorappearance.backgrd) keyFile.set_integer ("Color appearance", "Background", colorappearance.backgrd); - if (!pedited || pedited->colorappearance.adaplum) { - keyFile.set_double ("Color appearance", "AdaptLum", colorappearance.adaplum); - } + if (!pedited || pedited->colorappearance.adaplum) { + keyFile.set_double ("Color appearance", "AdaptLum", colorappearance.adaplum); + } - if (!pedited || pedited->colorappearance.badpixsl) { - keyFile.set_integer ("Color appearance", "Badpixsl", colorappearance.badpixsl); - } + if (!pedited || pedited->colorappearance.badpixsl) { + keyFile.set_integer ("Color appearance", "Badpixsl", colorappearance.badpixsl); + } - if (!pedited || pedited->colorappearance.wbmodel) { - keyFile.set_string ("Color appearance", "Model", colorappearance.wbmodel); - } + if (!pedited || pedited->colorappearance.wbmodel) { + keyFile.set_string ("Color appearance", "Model", colorappearance.wbmodel); + } - if (!pedited || pedited->colorappearance.algo) { - keyFile.set_string ("Color appearance", "Algorithm", colorappearance.algo); - } + if (!pedited || pedited->colorappearance.algo) { + keyFile.set_string ("Color appearance", "Algorithm", colorappearance.algo); + } - if (!pedited || pedited->colorappearance.jlight) { - keyFile.set_double ("Color appearance", "J-Light", colorappearance.jlight); - } + if (!pedited || pedited->colorappearance.jlight) { + keyFile.set_double ("Color appearance", "J-Light", colorappearance.jlight); + } - if (!pedited || pedited->colorappearance.qbright) { - keyFile.set_double ("Color appearance", "Q-Bright", colorappearance.qbright); - } + if (!pedited || pedited->colorappearance.qbright) { + keyFile.set_double ("Color appearance", "Q-Bright", colorappearance.qbright); + } - if (!pedited || pedited->colorappearance.chroma) { - keyFile.set_double ("Color appearance", "C-Chroma", colorappearance.chroma); - } + if (!pedited || pedited->colorappearance.chroma) { + keyFile.set_double ("Color appearance", "C-Chroma", colorappearance.chroma); + } - if (!pedited || pedited->colorappearance.schroma) { - keyFile.set_double ("Color appearance", "S-Chroma", colorappearance.schroma); - } + if (!pedited || pedited->colorappearance.schroma) { + keyFile.set_double ("Color appearance", "S-Chroma", colorappearance.schroma); + } - if (!pedited || pedited->colorappearance.mchroma) { - keyFile.set_double ("Color appearance", "M-Chroma", colorappearance.mchroma); - } + if (!pedited || pedited->colorappearance.mchroma) { + keyFile.set_double ("Color appearance", "M-Chroma", colorappearance.mchroma); + } - if (!pedited || pedited->colorappearance.contrast) { - keyFile.set_double ("Color appearance", "J-Contrast", colorappearance.contrast); - } + if (!pedited || pedited->colorappearance.contrast) { + keyFile.set_double ("Color appearance", "J-Contrast", colorappearance.contrast); + } - if (!pedited || pedited->colorappearance.qcontrast) { - keyFile.set_double ("Color appearance", "Q-Contrast", colorappearance.qcontrast); - } + if (!pedited || pedited->colorappearance.qcontrast) { + keyFile.set_double ("Color appearance", "Q-Contrast", colorappearance.qcontrast); + } - if (!pedited || pedited->colorappearance.colorh) { - keyFile.set_double ("Color appearance", "H-Hue", colorappearance.colorh); - } + if (!pedited || pedited->colorappearance.colorh) { + keyFile.set_double ("Color appearance", "H-Hue", colorappearance.colorh); + } - if (!pedited || pedited->colorappearance.rstprotection) { - keyFile.set_double ("Color appearance", "RSTProtection", colorappearance.rstprotection); - } + if (!pedited || pedited->colorappearance.rstprotection) { + keyFile.set_double ("Color appearance", "RSTProtection", colorappearance.rstprotection); + } - if (!pedited || pedited->colorappearance.adapscen) { - keyFile.set_double ("Color appearance", "AdaptScene", colorappearance.adapscen); - } + if (!pedited || pedited->colorappearance.adapscen) { + keyFile.set_double ("Color appearance", "AdaptScene", colorappearance.adapscen); + } - if (!pedited || pedited->colorappearance.autoadapscen) { - keyFile.set_boolean ("Color appearance", "AutoAdapscen", colorappearance.autoadapscen); - } + if (!pedited || pedited->colorappearance.autoadapscen) { + keyFile.set_boolean ("Color appearance", "AutoAdapscen", colorappearance.autoadapscen); + } - if (!pedited || pedited->colorappearance.surrsource) { - keyFile.set_boolean ("Color appearance", "SurrSource", colorappearance.surrsource); - } + if (!pedited || pedited->colorappearance.surrsource) { + keyFile.set_boolean ("Color appearance", "SurrSource", colorappearance.surrsource); + } - if (!pedited || pedited->colorappearance.gamut) { - keyFile.set_boolean ("Color appearance", "Gamut", colorappearance.gamut); - } + if (!pedited || pedited->colorappearance.gamut) { + keyFile.set_boolean ("Color appearance", "Gamut", colorappearance.gamut); + } // if (!pedited || pedited->colorappearance.badpix) keyFile.set_boolean ("Color appearance", "Badpix", colorappearance.badpix); - if (!pedited || pedited->colorappearance.datacie) { - keyFile.set_boolean ("Color appearance", "Datacie", colorappearance.datacie); - } + if (!pedited || pedited->colorappearance.datacie) { + keyFile.set_boolean ("Color appearance", "Datacie", colorappearance.datacie); + } - if (!pedited || pedited->colorappearance.tonecie) { - keyFile.set_boolean ("Color appearance", "Tonecie", colorappearance.tonecie); - } + if (!pedited || pedited->colorappearance.tonecie) { + keyFile.set_boolean ("Color appearance", "Tonecie", colorappearance.tonecie); + } // if (!pedited || pedited->colorappearance.sharpcie) keyFile.set_boolean ("Color appearance", "Sharpcie", colorappearance.sharpcie); - if (!pedited || pedited->colorappearance.curveMode) { - Glib::ustring method; + if (!pedited || pedited->colorappearance.curveMode) { + Glib::ustring method; - switch (colorappearance.curveMode) { - case (ColorAppearanceParams::TC_MODE_LIGHT): - method = "Lightness"; - break; + switch (colorappearance.curveMode) { + case (ColorAppearanceParams::TC_MODE_LIGHT): + method = "Lightness"; + break; - case (ColorAppearanceParams::TC_MODE_BRIGHT): - method = "Brightness"; - break; + case (ColorAppearanceParams::TC_MODE_BRIGHT): + method = "Brightness"; + break; + } + + keyFile.set_string ("Color appearance", "CurveMode", method); } - keyFile.set_string ("Color appearance", "CurveMode", method); - } + if (!pedited || pedited->colorappearance.curveMode2) { + Glib::ustring method; - if (!pedited || pedited->colorappearance.curveMode2) { - Glib::ustring method; + switch (colorappearance.curveMode2) { + case (ColorAppearanceParams::TC_MODE_LIGHT): + method = "Lightness"; + break; - switch (colorappearance.curveMode2) { - case (ColorAppearanceParams::TC_MODE_LIGHT): - method = "Lightness"; - break; + case (ColorAppearanceParams::TC_MODE_BRIGHT): + method = "Brightness"; + break; + } - case (ColorAppearanceParams::TC_MODE_BRIGHT): - method = "Brightness"; - break; + keyFile.set_string ("Color appearance", "CurveMode2", method); } - keyFile.set_string ("Color appearance", "CurveMode2", method); - } + if (!pedited || pedited->colorappearance.curveMode3) { + Glib::ustring method; - if (!pedited || pedited->colorappearance.curveMode3) { - Glib::ustring method; + switch (colorappearance.curveMode3) { + case (ColorAppearanceParams::TC_MODE_CHROMA): + method = "Chroma"; + break; - switch (colorappearance.curveMode3) { - case (ColorAppearanceParams::TC_MODE_CHROMA): - method = "Chroma"; - break; + case (ColorAppearanceParams::TC_MODE_SATUR): + method = "Saturation"; + break; - case (ColorAppearanceParams::TC_MODE_SATUR): - method = "Saturation"; - break; + case (ColorAppearanceParams::TC_MODE_COLORF): + method = "Colorfullness"; + break; - case (ColorAppearanceParams::TC_MODE_COLORF): - method = "Colorfullness"; - break; + } + keyFile.set_string ("Color appearance", "CurveMode3", method); } - keyFile.set_string ("Color appearance", "CurveMode3", method); - } + if (!pedited || pedited->colorappearance.curve) { + Glib::ArrayHandle tcurve = colorappearance.curve; + keyFile.set_double_list("Color appearance", "Curve", tcurve); + } - if (!pedited || pedited->colorappearance.curve) { - Glib::ArrayHandle tcurve = colorappearance.curve; - keyFile.set_double_list("Color appearance", "Curve", tcurve); - } + if (!pedited || pedited->colorappearance.curve2) { + Glib::ArrayHandle tcurve = colorappearance.curve2; + keyFile.set_double_list("Color appearance", "Curve2", tcurve); + } - if (!pedited || pedited->colorappearance.curve2) { - Glib::ArrayHandle tcurve = colorappearance.curve2; - keyFile.set_double_list("Color appearance", "Curve2", tcurve); - } - - if (!pedited || pedited->colorappearance.curve3) { - Glib::ArrayHandle tcurve = colorappearance.curve3; - keyFile.set_double_list("Color appearance", "Curve3", tcurve); - } + if (!pedited || pedited->colorappearance.curve3) { + Glib::ArrayHandle tcurve = colorappearance.curve3; + keyFile.set_double_list("Color appearance", "Curve3", tcurve); + } - // save impulseDenoise - if (!pedited || pedited->impulseDenoise.enabled) { - keyFile.set_boolean ("Impulse Denoising", "Enabled", impulseDenoise.enabled); - } + // save impulseDenoise + if (!pedited || pedited->impulseDenoise.enabled) { + keyFile.set_boolean ("Impulse Denoising", "Enabled", impulseDenoise.enabled); + } - if (!pedited || pedited->impulseDenoise.thresh) { - keyFile.set_integer ("Impulse Denoising", "Threshold", impulseDenoise.thresh); - } + if (!pedited || pedited->impulseDenoise.thresh) { + keyFile.set_integer ("Impulse Denoising", "Threshold", impulseDenoise.thresh); + } - // save defringe - if (!pedited || pedited->defringe.enabled) { - keyFile.set_boolean ("Defringing", "Enabled", defringe.enabled); - } + // save defringe + if (!pedited || pedited->defringe.enabled) { + keyFile.set_boolean ("Defringing", "Enabled", defringe.enabled); + } - if (!pedited || pedited->defringe.radius) { - keyFile.set_double ("Defringing", "Radius", defringe.radius); - } + if (!pedited || pedited->defringe.radius) { + keyFile.set_double ("Defringing", "Radius", defringe.radius); + } - if (!pedited || pedited->defringe.threshold) { - keyFile.set_integer ("Defringing", "Threshold", defringe.threshold); - } + if (!pedited || pedited->defringe.threshold) { + keyFile.set_integer ("Defringing", "Threshold", defringe.threshold); + } - if (!pedited || pedited->defringe.huecurve) { - Glib::ArrayHandle huecurve = defringe.huecurve; - keyFile.set_double_list("Defringing", "HueCurve", huecurve); - } + if (!pedited || pedited->defringe.huecurve) { + Glib::ArrayHandle huecurve = defringe.huecurve; + keyFile.set_double_list("Defringing", "HueCurve", huecurve); + } - // save dirpyrDenoise - if (!pedited || pedited->dirpyrDenoise.enabled) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled); - } + // save dirpyrDenoise + if (!pedited || pedited->dirpyrDenoise.enabled) { + keyFile.set_boolean ("Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled); + } - if (!pedited || pedited->dirpyrDenoise.enhance) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance); - } + if (!pedited || pedited->dirpyrDenoise.enhance) { + keyFile.set_boolean ("Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance); + } - if (!pedited || pedited->dirpyrDenoise.median) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Median", dirpyrDenoise.median); - } + if (!pedited || pedited->dirpyrDenoise.median) { + keyFile.set_boolean ("Directional Pyramid Denoising", "Median", dirpyrDenoise.median); + } - if (!pedited || pedited->dirpyrDenoise.autochroma) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Auto", dirpyrDenoise.autochroma); - } + if (!pedited || pedited->dirpyrDenoise.autochroma) { + keyFile.set_boolean ("Directional Pyramid Denoising", "Auto", dirpyrDenoise.autochroma); + } // if (!pedited || pedited->dirpyrDenoise.perform) keyFile.set_boolean ("Directional Pyramid Denoising", "Perform", dirpyrDenoise.perform); - if (!pedited || pedited->dirpyrDenoise.luma) { - keyFile.set_double ("Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma); - } - - if (!pedited || pedited->dirpyrDenoise.Ldetail) { - keyFile.set_double ("Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail); - } - - if (!pedited || pedited->dirpyrDenoise.chroma) { - keyFile.set_double ("Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma); - } - - if (!pedited || pedited->dirpyrDenoise.dmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod); - } - - if (!pedited || pedited->dirpyrDenoise.Lmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod); - } - - // never save 'auto chroma preview mode' to pp3 - if (!pedited || pedited->dirpyrDenoise.Cmethod) { - if(dirpyrDenoise.Cmethod == "PRE") { - dirpyrDenoise.Cmethod = "MAN"; + if (!pedited || pedited->dirpyrDenoise.luma) { + keyFile.set_double ("Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma); } - keyFile.set_string ("Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod); - } - - if (!pedited || pedited->dirpyrDenoise.C2method) { - if(dirpyrDenoise.C2method == "PREV") { - dirpyrDenoise.C2method = "MANU"; + if (!pedited || pedited->dirpyrDenoise.Ldetail) { + keyFile.set_double ("Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail); } - keyFile.set_string ("Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method); - } - - if (!pedited || pedited->dirpyrDenoise.smethod) { - keyFile.set_string ("Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod); - } - - if (!pedited || pedited->dirpyrDenoise.medmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod); - } - - if (!pedited || pedited->dirpyrDenoise.rgbmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod); - } - - if (!pedited || pedited->dirpyrDenoise.methodmed) { - keyFile.set_string ("Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed); - } - - if (!pedited || pedited->dirpyrDenoise.redchro) { - keyFile.set_double ("Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro); - } - - if (!pedited || pedited->dirpyrDenoise.bluechro) { - keyFile.set_double ("Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro); - } - - if (!pedited || pedited->dirpyrDenoise.gamma) { - keyFile.set_double ("Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma); - } - - if (!pedited || pedited->dirpyrDenoise.passes) { - keyFile.set_integer ("Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes); - } - - if (!pedited || pedited->dirpyrDenoise.lcurve) { - Glib::ArrayHandle lcurve = dirpyrDenoise.lcurve; - keyFile.set_double_list("Directional Pyramid Denoising", "LCurve", lcurve); - } - - if (!pedited || pedited->dirpyrDenoise.cccurve) { - Glib::ArrayHandle cccurve = dirpyrDenoise.cccurve; - keyFile.set_double_list("Directional Pyramid Denoising", "CCCurve", cccurve); - } - - //Save epd. - if (!pedited || pedited->epd.enabled) { - keyFile.set_boolean ("EPD", "Enabled", epd.enabled); - } - - if (!pedited || pedited->epd.strength) { - keyFile.set_double ("EPD", "Strength", epd.strength); - } - - if (!pedited || pedited->epd.gamma) { - keyFile.set_double ("EPD", "Gamma", epd.gamma); - } - - if (!pedited || pedited->epd.edgeStopping) { - keyFile.set_double ("EPD", "EdgeStopping", epd.edgeStopping); - } - - if (!pedited || pedited->epd.scale) { - keyFile.set_double ("EPD", "Scale", epd.scale); - } - - if (!pedited || pedited->epd.reweightingIterates) { - keyFile.set_integer ("EPD", "ReweightingIterates", epd.reweightingIterates); - } - - /* - // save lumaDenoise - if (!pedited || pedited->lumaDenoise.enabled) keyFile.set_boolean ("Luminance Denoising", "Enabled", lumaDenoise.enabled); - if (!pedited || pedited->lumaDenoise.radius) keyFile.set_double ("Luminance Denoising", "Radius", lumaDenoise.radius); - if (!pedited || pedited->lumaDenoise.edgetolerance) keyFile.set_integer ("Luminance Denoising", "EdgeTolerance", lumaDenoise.edgetolerance); - */ - - /* - // save colorDenoise - //if (!pedited || pedited->colorDenoise.enabled) keyFile.set_boolean ("Chrominance Denoising", "Enabled", colorDenoise.enabled); - if (!pedited || pedited->colorDenoise.amount) keyFile.set_integer ("Chrominance Denoising", "Amount", colorDenoise.amount); - */ - - // save sh - if (!pedited || pedited->sh.enabled) { - keyFile.set_boolean ("Shadows & Highlights", "Enabled", sh.enabled); - } - - if (!pedited || pedited->sh.hq) { - keyFile.set_boolean ("Shadows & Highlights", "HighQuality", sh.hq); - } - - if (!pedited || pedited->sh.highlights) { - keyFile.set_integer ("Shadows & Highlights", "Highlights", sh.highlights); - } - - if (!pedited || pedited->sh.htonalwidth) { - keyFile.set_integer ("Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth); - } - - if (!pedited || pedited->sh.shadows) { - keyFile.set_integer ("Shadows & Highlights", "Shadows", sh.shadows); - } - - if (!pedited || pedited->sh.stonalwidth) { - keyFile.set_integer ("Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth); - } - - if (!pedited || pedited->sh.localcontrast) { - keyFile.set_integer ("Shadows & Highlights", "LocalContrast", sh.localcontrast); - } - - if (!pedited || pedited->sh.radius) { - keyFile.set_integer ("Shadows & Highlights", "Radius", sh.radius); - } - - // save crop - if (!pedited || pedited->crop.enabled) { - keyFile.set_boolean ("Crop", "Enabled", crop.enabled); - } - - if (!pedited || pedited->crop.x) { - keyFile.set_integer ("Crop", "X", crop.x); - } - - if (!pedited || pedited->crop.y) { - keyFile.set_integer ("Crop", "Y", crop.y); - } - - if (!pedited || pedited->crop.w) { - keyFile.set_integer ("Crop", "W", crop.w); - } - - if (!pedited || pedited->crop.h) { - keyFile.set_integer ("Crop", "H", crop.h); - } - - if (!pedited || pedited->crop.fixratio) { - keyFile.set_boolean ("Crop", "FixedRatio", crop.fixratio); - } - - if (!pedited || pedited->crop.ratio) { - keyFile.set_string ("Crop", "Ratio", crop.ratio); - } - - if (!pedited || pedited->crop.orientation) { - keyFile.set_string ("Crop", "Orientation", crop.orientation); - } - - if (!pedited || pedited->crop.guide) { - keyFile.set_string ("Crop", "Guide", crop.guide); - } - - // save coarse - if (!pedited || pedited->coarse.rotate) { - keyFile.set_integer ("Coarse Transformation", "Rotate", coarse.rotate); - } - - if (!pedited || pedited->coarse.hflip) { - keyFile.set_boolean ("Coarse Transformation", "HorizontalFlip", coarse.hflip); - } - - if (!pedited || pedited->coarse.vflip) { - keyFile.set_boolean ("Coarse Transformation", "VerticalFlip", coarse.vflip); - } - - // save commonTrans - if (!pedited || pedited->commonTrans.autofill) { - keyFile.set_boolean ("Common Properties for Transformations", "AutoFill", commonTrans.autofill); - } - - // save rotate - if (!pedited || pedited->rotate.degree) { - keyFile.set_double ("Rotation", "Degree", rotate.degree); - } - - // save distortion - if (!pedited || pedited->distortion.amount) { - keyFile.set_double ("Distortion", "Amount", distortion.amount); - } - - // lens profile - if (!pedited || pedited->lensProf.lcpFile) { - keyFile.set_string ("LensProfile", "LCPFile", relativePathIfInside(fname, fnameAbsolute, lensProf.lcpFile)); - } - - if (!pedited || pedited->lensProf.useDist) { - keyFile.set_boolean ("LensProfile", "UseDistortion", lensProf.useDist); - } - - if (!pedited || pedited->lensProf.useVign) { - keyFile.set_boolean ("LensProfile", "UseVignette", lensProf.useVign); - } - - if (!pedited || pedited->lensProf.useCA) { - keyFile.set_boolean ("LensProfile", "UseCA", lensProf.useCA); - } - - // save perspective correction - if (!pedited || pedited->perspective.horizontal) { - keyFile.set_double ("Perspective", "Horizontal", perspective.horizontal); - } - - if (!pedited || pedited->perspective.vertical) { - keyFile.set_double ("Perspective", "Vertical", perspective.vertical); - } - - // save gradient - if (!pedited || pedited->gradient.enabled) { - keyFile.set_boolean ("Gradient", "Enabled", gradient.enabled); - } - - if (!pedited || pedited->gradient.degree) { - keyFile.set_double ("Gradient", "Degree", gradient.degree); - } - - if (!pedited || pedited->gradient.feather) { - keyFile.set_integer ("Gradient", "Feather", gradient.feather); - } - - if (!pedited || pedited->gradient.strength) { - keyFile.set_double ("Gradient", "Strength", gradient.strength); - } - - if (!pedited || pedited->gradient.centerX) { - keyFile.set_integer ("Gradient", "CenterX", gradient.centerX); - } - - if (!pedited || pedited->gradient.centerY) { - keyFile.set_integer ("Gradient", "CenterY", gradient.centerY); - } - - // save post-crop vignette - if (!pedited || pedited->pcvignette.enabled) { - keyFile.set_boolean ("PCVignette", "Enabled", pcvignette.enabled); - } - - if (!pedited || pedited->pcvignette.strength) { - keyFile.set_double ("PCVignette", "Strength", pcvignette.strength); - } - - if (!pedited || pedited->pcvignette.feather) { - keyFile.set_integer ("PCVignette", "Feather", pcvignette.feather); - } - - if (!pedited || pedited->pcvignette.roundness) { - keyFile.set_integer ("PCVignette", "Roundness", pcvignette.roundness); - } - - // save C/A correction - if (!pedited || pedited->cacorrection.red) { - keyFile.set_double ("CACorrection", "Red", cacorrection.red); - } - - if (!pedited || pedited->cacorrection.blue) { - keyFile.set_double ("CACorrection", "Blue", cacorrection.blue); - } - - // save vignetting correction - if (!pedited || pedited->vignetting.amount) { - keyFile.set_integer ("Vignetting Correction", "Amount", vignetting.amount); - } - - if (!pedited || pedited->vignetting.radius) { - keyFile.set_integer ("Vignetting Correction", "Radius", vignetting.radius); - } - - if (!pedited || pedited->vignetting.strength) { - keyFile.set_integer ("Vignetting Correction", "Strength", vignetting.strength); - } - - if (!pedited || pedited->vignetting.centerX) { - keyFile.set_integer ("Vignetting Correction", "CenterX", vignetting.centerX); - } - - if (!pedited || pedited->vignetting.centerY) { - keyFile.set_integer ("Vignetting Correction", "CenterY", vignetting.centerY); - } - - - if (!pedited || pedited->resize.enabled) { - keyFile.set_boolean ("Resize", "Enabled", resize.enabled); - } - - if (!pedited || pedited->resize.scale) { - keyFile.set_double ("Resize", "Scale", resize.scale); - } - - if (!pedited || pedited->resize.appliesTo) { - keyFile.set_string ("Resize", "AppliesTo", resize.appliesTo); - } - - if (!pedited || pedited->resize.method) { - keyFile.set_string ("Resize", "Method", resize.method); - } - - if (!pedited || pedited->resize.dataspec) { - keyFile.set_integer ("Resize", "DataSpecified", resize.dataspec); - } - - if (!pedited || pedited->resize.width) { - keyFile.set_integer ("Resize", "Width", resize.width); - } - - if (!pedited || pedited->resize.height) { - keyFile.set_integer ("Resize", "Height", resize.height); - } - - if (!pedited || pedited->prsharpening.enabled) { - keyFile.set_boolean ("PostResizeSharpening", "Enabled", prsharpening.enabled); - } - - if (!pedited || pedited->prsharpening.method) { - keyFile.set_string ("PostResizeSharpening", "Method", prsharpening.method); - } - - if (!pedited || pedited->prsharpening.radius) { - keyFile.set_double ("PostResizeSharpening", "Radius", prsharpening.radius); - } - - if (!pedited || pedited->prsharpening.amount) { - keyFile.set_integer ("PostResizeSharpening", "Amount", prsharpening.amount); - } - - if (!pedited || pedited->prsharpening.threshold) { - Glib::ArrayHandle thresh (prsharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("PostResizeSharpening", "Threshold", thresh); - } - - if (!pedited || pedited->prsharpening.edgesonly) { - keyFile.set_boolean ("PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly); - } - - if (!pedited || pedited->prsharpening.edges_radius) { - keyFile.set_double ("PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius); - } - - if (!pedited || pedited->prsharpening.edges_tolerance) { - keyFile.set_integer ("PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance); - } - - if (!pedited || pedited->prsharpening.halocontrol) { - keyFile.set_boolean ("PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol); - } - - if (!pedited || pedited->prsharpening.halocontrol_amount) { - keyFile.set_integer ("PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount); - } - - if (!pedited || pedited->prsharpening.deconvradius) { - keyFile.set_double ("PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius); - } - - if (!pedited || pedited->prsharpening.deconvamount) { - keyFile.set_integer ("PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount); - } - - if (!pedited || pedited->prsharpening.deconvdamping) { - keyFile.set_integer ("PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping); - } - - if (!pedited || pedited->prsharpening.deconviter) { - keyFile.set_integer ("PostResizeSharpening", "DeconvIterations", prsharpening.deconviter); - } - - - // save color management settings - if (!pedited || pedited->icm.input) { - keyFile.set_string ("Color Management", "InputProfile", relativePathIfInside(fname, fnameAbsolute, icm.input)); - } - - if (!pedited || pedited->icm.toneCurve) { - keyFile.set_boolean ("Color Management", "ToneCurve", icm.toneCurve); - } - - if (!pedited || pedited->icm.applyLookTable) { - keyFile.set_boolean ("Color Management", "ApplyLookTable", icm.applyLookTable); - } - - if (!pedited || pedited->icm.applyBaselineExposureOffset) { - keyFile.set_boolean ("Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset); - } - - if (!pedited || pedited->icm.applyHueSatMap) { - keyFile.set_boolean ("Color Management", "ApplyHueSatMap", icm.applyHueSatMap); - } - - if (!pedited || pedited->icm.blendCMSMatrix) { - keyFile.set_boolean ("Color Management", "BlendCMSMatrix", icm.blendCMSMatrix); - } - - if (!pedited || pedited->icm.dcpIlluminant) { - keyFile.set_integer ("Color Management", "DCPIlluminant", icm.dcpIlluminant); - } - - if (!pedited || pedited->icm.working) { - keyFile.set_string ("Color Management", "WorkingProfile", icm.working); - } - - if (!pedited || pedited->icm.output) { - keyFile.set_string ("Color Management", "OutputProfile", icm.output); - } - - if (!pedited || pedited->icm.outputIntent) { - Glib::ustring intent; - - switch (icm.outputIntent) { - default: - case RI_PERCEPTUAL: - intent = "Perceptual"; - break; - - case RI_RELATIVE: - intent = "Relative"; - break; - - case RI_SATURATION: - intent = "Saturation"; - break; - - case RI_ABSOLUTE: - intent = "Absolute"; - break; + if (!pedited || pedited->dirpyrDenoise.chroma) { + keyFile.set_double ("Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma); } - keyFile.set_string ("Color Management", "OutputProfileIntent", intent); - } - - if (!pedited || pedited->icm.gamma) { - keyFile.set_string ("Color Management", "Gammafree", icm.gamma); - } - - if (!pedited || pedited->icm.freegamma) { - keyFile.set_boolean ("Color Management", "Freegamma", icm.freegamma); - } - - if (!pedited || pedited->icm.gampos) { - keyFile.set_double ("Color Management", "GammaValue", icm.gampos); - } - - if (!pedited || pedited->icm.slpos) { - keyFile.set_double ("Color Management", "GammaSlope", icm.slpos); - } - - - - // save wavelet parameters - if (!pedited || pedited->wavelet.enabled) { - keyFile.set_boolean ("Wavelet", "Enabled", wavelet.enabled); - } - - if (!pedited || pedited->wavelet.strength) { - keyFile.set_integer ("Wavelet", "Strength", wavelet.strength); - } - - if (!pedited || pedited->wavelet.balance) { - keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); - } - - if (!pedited || pedited->wavelet.iter) { - keyFile.set_integer ("Wavelet", "Iter", wavelet.iter); - } - - if (!pedited || pedited->wavelet.thres) { - keyFile.set_integer ("Wavelet", "MaxLev", wavelet.thres); - } - - if (!pedited || pedited->wavelet.Tilesmethod) { - keyFile.set_string ("Wavelet", "TilesMethod", wavelet.Tilesmethod); - } - - if (!pedited || pedited->wavelet.daubcoeffmethod) { - keyFile.set_string ("Wavelet", "DaubMethod", wavelet.daubcoeffmethod); - } - - if (!pedited || pedited->wavelet.CLmethod) { - keyFile.set_string ("Wavelet", "ChoiceLevMethod", wavelet.CLmethod); - } - - if (!pedited || pedited->wavelet.Backmethod) { - keyFile.set_string ("Wavelet", "BackMethod", wavelet.Backmethod); - } - - if (!pedited || pedited->wavelet.Lmethod) { - keyFile.set_string ("Wavelet", "LevMethod", wavelet.Lmethod); - } - - if (!pedited || pedited->wavelet.Dirmethod) { - keyFile.set_string ("Wavelet", "DirMethod", wavelet.Dirmethod); - } - - if (!pedited || pedited->wavelet.greenhigh) { - keyFile.set_integer ("Wavelet", "CBgreenhigh", wavelet.greenhigh); - } - - if (!pedited || pedited->wavelet.greenmed) { - keyFile.set_integer ("Wavelet", "CBgreenmed", wavelet.greenmed); - } - - if (!pedited || pedited->wavelet.greenlow) { - keyFile.set_integer ("Wavelet", "CBgreenlow", wavelet.greenlow); - } - - if (!pedited || pedited->wavelet.bluehigh) { - keyFile.set_integer ("Wavelet", "CBbluehigh", wavelet.bluehigh); - } - - if (!pedited || pedited->wavelet.bluemed) { - keyFile.set_integer ("Wavelet", "CBbluemed", wavelet.bluemed); - } - - if (!pedited || pedited->wavelet.bluelow) { - keyFile.set_integer ("Wavelet", "CBbluelow", wavelet.bluelow); - } - - if (!pedited || pedited->wavelet.expcontrast) { - keyFile.set_boolean ("Wavelet", "Expcontrast", wavelet.expcontrast); - } - - if (!pedited || pedited->wavelet.expchroma) { - keyFile.set_boolean ("Wavelet", "Expchroma", wavelet.expchroma); - } - - if (!pedited || pedited->wavelet.expedge) { - keyFile.set_boolean ("Wavelet", "Expedge", wavelet.expedge); - } - - if (!pedited || pedited->wavelet.expresid) { - keyFile.set_boolean ("Wavelet", "Expresid", wavelet.expresid); - } - - if (!pedited || pedited->wavelet.expfinal) { - keyFile.set_boolean ("Wavelet", "Expfinal", wavelet.expfinal); - } - - if (!pedited || pedited->wavelet.exptoning) { - keyFile.set_boolean ("Wavelet", "Exptoning", wavelet.exptoning); - } - - if (!pedited || pedited->wavelet.expnoise) { - keyFile.set_boolean ("Wavelet", "Expnoise", wavelet.expnoise); - } - - for(int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Contrast" << (i + 1); - - if (!pedited || pedited->wavelet.c[i]) { - keyFile.set_integer("Wavelet", ss.str(), wavelet.c[i]); + if (!pedited || pedited->dirpyrDenoise.dmethod) { + keyFile.set_string ("Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod); } - } - for(int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Chroma" << (i + 1); - - if (!pedited || pedited->wavelet.ch[i]) { - keyFile.set_integer("Wavelet", ss.str(), wavelet.ch[i]); + if (!pedited || pedited->dirpyrDenoise.Lmethod) { + keyFile.set_string ("Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod); } - } - if (!pedited || pedited->wavelet.sup) { - keyFile.set_integer ("Wavelet", "ContExtra", wavelet.sup); - } + // never save 'auto chroma preview mode' to pp3 + if (!pedited || pedited->dirpyrDenoise.Cmethod) { + if(dirpyrDenoise.Cmethod == "PRE") { + dirpyrDenoise.Cmethod = "MAN"; + } - if (!pedited || pedited->wavelet.HSmethod) { - keyFile.set_string ("Wavelet", "HSMethod", wavelet.HSmethod); - } + keyFile.set_string ("Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod); + } - if (!pedited || pedited->wavelet.hllev) { - Glib::ArrayHandle thresh (wavelet.hllev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "HLRange", thresh); - } + if (!pedited || pedited->dirpyrDenoise.C2method) { + if(dirpyrDenoise.C2method == "PREV") { + dirpyrDenoise.C2method = "MANU"; + } - if (!pedited || pedited->wavelet.bllev) { - Glib::ArrayHandle thresh (wavelet.bllev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "SHRange", thresh); - } + keyFile.set_string ("Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method); + } - if (!pedited || pedited->wavelet.edgcont) { - Glib::ArrayHandle thresh (wavelet.edgcont.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "Edgcont", thresh); - } + if (!pedited || pedited->dirpyrDenoise.smethod) { + keyFile.set_string ("Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod); + } - if (!pedited || pedited->wavelet.level0noise) { - Glib::ArrayHandle thresh (wavelet.level0noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list("Wavelet", "Level0noise", thresh); - } + if (!pedited || pedited->dirpyrDenoise.medmethod) { + keyFile.set_string ("Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod); + } - if (!pedited || pedited->wavelet.level1noise) { - Glib::ArrayHandle thresh (wavelet.level1noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list("Wavelet", "Level1noise", thresh); - } + if (!pedited || pedited->dirpyrDenoise.rgbmethod) { + keyFile.set_string ("Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod); + } - if (!pedited || pedited->wavelet.level2noise) { - Glib::ArrayHandle thresh (wavelet.level2noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list("Wavelet", "Level2noise", thresh); - } + if (!pedited || pedited->dirpyrDenoise.methodmed) { + keyFile.set_string ("Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed); + } - if (!pedited || pedited->wavelet.level3noise) { - Glib::ArrayHandle thresh (wavelet.level3noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list("Wavelet", "Level3noise", thresh); - } + if (!pedited || pedited->dirpyrDenoise.redchro) { + keyFile.set_double ("Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro); + } + + if (!pedited || pedited->dirpyrDenoise.bluechro) { + keyFile.set_double ("Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro); + } + + if (!pedited || pedited->dirpyrDenoise.gamma) { + keyFile.set_double ("Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma); + } + + if (!pedited || pedited->dirpyrDenoise.passes) { + keyFile.set_integer ("Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes); + } + + if (!pedited || pedited->dirpyrDenoise.lcurve) { + Glib::ArrayHandle lcurve = dirpyrDenoise.lcurve; + keyFile.set_double_list("Directional Pyramid Denoising", "LCurve", lcurve); + } + + if (!pedited || pedited->dirpyrDenoise.cccurve) { + Glib::ArrayHandle cccurve = dirpyrDenoise.cccurve; + keyFile.set_double_list("Directional Pyramid Denoising", "CCCurve", cccurve); + } + + //Save epd. + if (!pedited || pedited->epd.enabled) { + keyFile.set_boolean ("EPD", "Enabled", epd.enabled); + } + + if (!pedited || pedited->epd.strength) { + keyFile.set_double ("EPD", "Strength", epd.strength); + } + + if (!pedited || pedited->epd.gamma) { + keyFile.set_double ("EPD", "Gamma", epd.gamma); + } + + if (!pedited || pedited->epd.edgeStopping) { + keyFile.set_double ("EPD", "EdgeStopping", epd.edgeStopping); + } + + if (!pedited || pedited->epd.scale) { + keyFile.set_double ("EPD", "Scale", epd.scale); + } + + if (!pedited || pedited->epd.reweightingIterates) { + keyFile.set_integer ("EPD", "ReweightingIterates", epd.reweightingIterates); + } + + /* + // save lumaDenoise + if (!pedited || pedited->lumaDenoise.enabled) keyFile.set_boolean ("Luminance Denoising", "Enabled", lumaDenoise.enabled); + if (!pedited || pedited->lumaDenoise.radius) keyFile.set_double ("Luminance Denoising", "Radius", lumaDenoise.radius); + if (!pedited || pedited->lumaDenoise.edgetolerance) keyFile.set_integer ("Luminance Denoising", "EdgeTolerance", lumaDenoise.edgetolerance); + */ + + /* + // save colorDenoise + //if (!pedited || pedited->colorDenoise.enabled) keyFile.set_boolean ("Chrominance Denoising", "Enabled", colorDenoise.enabled); + if (!pedited || pedited->colorDenoise.amount) keyFile.set_integer ("Chrominance Denoising", "Amount", colorDenoise.amount); + */ + + // save sh + if (!pedited || pedited->sh.enabled) { + keyFile.set_boolean ("Shadows & Highlights", "Enabled", sh.enabled); + } + + if (!pedited || pedited->sh.hq) { + keyFile.set_boolean ("Shadows & Highlights", "HighQuality", sh.hq); + } + + if (!pedited || pedited->sh.highlights) { + keyFile.set_integer ("Shadows & Highlights", "Highlights", sh.highlights); + } + + if (!pedited || pedited->sh.htonalwidth) { + keyFile.set_integer ("Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth); + } + + if (!pedited || pedited->sh.shadows) { + keyFile.set_integer ("Shadows & Highlights", "Shadows", sh.shadows); + } + + if (!pedited || pedited->sh.stonalwidth) { + keyFile.set_integer ("Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth); + } + + if (!pedited || pedited->sh.localcontrast) { + keyFile.set_integer ("Shadows & Highlights", "LocalContrast", sh.localcontrast); + } + + if (!pedited || pedited->sh.radius) { + keyFile.set_integer ("Shadows & Highlights", "Radius", sh.radius); + } + + // save crop + if (!pedited || pedited->crop.enabled) { + keyFile.set_boolean ("Crop", "Enabled", crop.enabled); + } + + if (!pedited || pedited->crop.x) { + keyFile.set_integer ("Crop", "X", crop.x); + } + + if (!pedited || pedited->crop.y) { + keyFile.set_integer ("Crop", "Y", crop.y); + } + + if (!pedited || pedited->crop.w) { + keyFile.set_integer ("Crop", "W", crop.w); + } + + if (!pedited || pedited->crop.h) { + keyFile.set_integer ("Crop", "H", crop.h); + } + + if (!pedited || pedited->crop.fixratio) { + keyFile.set_boolean ("Crop", "FixedRatio", crop.fixratio); + } + + if (!pedited || pedited->crop.ratio) { + keyFile.set_string ("Crop", "Ratio", crop.ratio); + } + + if (!pedited || pedited->crop.orientation) { + keyFile.set_string ("Crop", "Orientation", crop.orientation); + } + + if (!pedited || pedited->crop.guide) { + keyFile.set_string ("Crop", "Guide", crop.guide); + } + + // save coarse + if (!pedited || pedited->coarse.rotate) { + keyFile.set_integer ("Coarse Transformation", "Rotate", coarse.rotate); + } + + if (!pedited || pedited->coarse.hflip) { + keyFile.set_boolean ("Coarse Transformation", "HorizontalFlip", coarse.hflip); + } + + if (!pedited || pedited->coarse.vflip) { + keyFile.set_boolean ("Coarse Transformation", "VerticalFlip", coarse.vflip); + } + + // save commonTrans + if (!pedited || pedited->commonTrans.autofill) { + keyFile.set_boolean ("Common Properties for Transformations", "AutoFill", commonTrans.autofill); + } + + // save rotate + if (!pedited || pedited->rotate.degree) { + keyFile.set_double ("Rotation", "Degree", rotate.degree); + } + + // save distortion + if (!pedited || pedited->distortion.amount) { + keyFile.set_double ("Distortion", "Amount", distortion.amount); + } + + // lens profile + if (!pedited || pedited->lensProf.lcpFile) { + keyFile.set_string ("LensProfile", "LCPFile", relativePathIfInside(fname, fnameAbsolute, lensProf.lcpFile)); + } + + if (!pedited || pedited->lensProf.useDist) { + keyFile.set_boolean ("LensProfile", "UseDistortion", lensProf.useDist); + } + + if (!pedited || pedited->lensProf.useVign) { + keyFile.set_boolean ("LensProfile", "UseVignette", lensProf.useVign); + } + + if (!pedited || pedited->lensProf.useCA) { + keyFile.set_boolean ("LensProfile", "UseCA", lensProf.useCA); + } + + // save perspective correction + if (!pedited || pedited->perspective.horizontal) { + keyFile.set_double ("Perspective", "Horizontal", perspective.horizontal); + } + + if (!pedited || pedited->perspective.vertical) { + keyFile.set_double ("Perspective", "Vertical", perspective.vertical); + } + + // save gradient + if (!pedited || pedited->gradient.enabled) { + keyFile.set_boolean ("Gradient", "Enabled", gradient.enabled); + } + + if (!pedited || pedited->gradient.degree) { + keyFile.set_double ("Gradient", "Degree", gradient.degree); + } + + if (!pedited || pedited->gradient.feather) { + keyFile.set_integer ("Gradient", "Feather", gradient.feather); + } + + if (!pedited || pedited->gradient.strength) { + keyFile.set_double ("Gradient", "Strength", gradient.strength); + } + + if (!pedited || pedited->gradient.centerX) { + keyFile.set_integer ("Gradient", "CenterX", gradient.centerX); + } + + if (!pedited || pedited->gradient.centerY) { + keyFile.set_integer ("Gradient", "CenterY", gradient.centerY); + } + + // save post-crop vignette + if (!pedited || pedited->pcvignette.enabled) { + keyFile.set_boolean ("PCVignette", "Enabled", pcvignette.enabled); + } + + if (!pedited || pedited->pcvignette.strength) { + keyFile.set_double ("PCVignette", "Strength", pcvignette.strength); + } + + if (!pedited || pedited->pcvignette.feather) { + keyFile.set_integer ("PCVignette", "Feather", pcvignette.feather); + } + + if (!pedited || pedited->pcvignette.roundness) { + keyFile.set_integer ("PCVignette", "Roundness", pcvignette.roundness); + } + + // save C/A correction + if (!pedited || pedited->cacorrection.red) { + keyFile.set_double ("CACorrection", "Red", cacorrection.red); + } + + if (!pedited || pedited->cacorrection.blue) { + keyFile.set_double ("CACorrection", "Blue", cacorrection.blue); + } + + // save vignetting correction + if (!pedited || pedited->vignetting.amount) { + keyFile.set_integer ("Vignetting Correction", "Amount", vignetting.amount); + } + + if (!pedited || pedited->vignetting.radius) { + keyFile.set_integer ("Vignetting Correction", "Radius", vignetting.radius); + } + + if (!pedited || pedited->vignetting.strength) { + keyFile.set_integer ("Vignetting Correction", "Strength", vignetting.strength); + } + + if (!pedited || pedited->vignetting.centerX) { + keyFile.set_integer ("Vignetting Correction", "CenterX", vignetting.centerX); + } + + if (!pedited || pedited->vignetting.centerY) { + keyFile.set_integer ("Vignetting Correction", "CenterY", vignetting.centerY); + } - if (!pedited || pedited->wavelet.threshold) { - keyFile.set_integer ("Wavelet", "ThresholdHighlight", wavelet.threshold); - } + if (!pedited || pedited->resize.enabled) { + keyFile.set_boolean ("Resize", "Enabled", resize.enabled); + } - if (!pedited || pedited->wavelet.threshold2) { - keyFile.set_integer ("Wavelet", "ThresholdShadow", wavelet.threshold2); - } + if (!pedited || pedited->resize.scale) { + keyFile.set_double ("Resize", "Scale", resize.scale); + } - if (!pedited || pedited->wavelet.edgedetect) { - keyFile.set_integer ("Wavelet", "Edgedetect", wavelet.edgedetect); - } + if (!pedited || pedited->resize.appliesTo) { + keyFile.set_string ("Resize", "AppliesTo", resize.appliesTo); + } - if (!pedited || pedited->wavelet.edgedetectthr) { - keyFile.set_integer ("Wavelet", "Edgedetectthr", wavelet.edgedetectthr); - } + if (!pedited || pedited->resize.method) { + keyFile.set_string ("Resize", "Method", resize.method); + } - if (!pedited || pedited->wavelet.edgedetectthr2) { - keyFile.set_integer ("Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2); - } + if (!pedited || pedited->resize.dataspec) { + keyFile.set_integer ("Resize", "DataSpecified", resize.dataspec); + } - if (!pedited || pedited->wavelet.edgesensi) { - keyFile.set_integer ("Wavelet", "Edgesensi", wavelet.edgesensi); - } + if (!pedited || pedited->resize.width) { + keyFile.set_integer ("Resize", "Width", resize.width); + } - if (!pedited || pedited->wavelet.edgeampli) { - keyFile.set_integer ("Wavelet", "Edgeampli", wavelet.edgeampli); - } + if (!pedited || pedited->resize.height) { + keyFile.set_integer ("Resize", "Height", resize.height); + } - if (!pedited || pedited->wavelet.chroma) { - keyFile.set_integer ("Wavelet", "ThresholdChroma", wavelet.chroma); - } + if (!pedited || pedited->prsharpening.enabled) { + keyFile.set_boolean ("PostResizeSharpening", "Enabled", prsharpening.enabled); + } - if (!pedited || pedited->wavelet.CHmethod) { - keyFile.set_string ("Wavelet", "CHromaMethod", wavelet.CHmethod); - } + if (!pedited || pedited->prsharpening.method) { + keyFile.set_string ("PostResizeSharpening", "Method", prsharpening.method); + } - if (!pedited || pedited->wavelet.Medgreinf) { - keyFile.set_string ("Wavelet", "Medgreinf", wavelet.Medgreinf); - } + if (!pedited || pedited->prsharpening.radius) { + keyFile.set_double ("PostResizeSharpening", "Radius", prsharpening.radius); + } - if (!pedited || pedited->wavelet.CHSLmethod) { - keyFile.set_string ("Wavelet", "CHSLromaMethod", wavelet.CHSLmethod); - } + if (!pedited || pedited->prsharpening.amount) { + keyFile.set_integer ("PostResizeSharpening", "Amount", prsharpening.amount); + } - if (!pedited || pedited->wavelet.EDmethod) { - keyFile.set_string ("Wavelet", "EDMethod", wavelet.EDmethod); - } + if (!pedited || pedited->prsharpening.threshold) { + Glib::ArrayHandle thresh (prsharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("PostResizeSharpening", "Threshold", thresh); + } - if (!pedited || pedited->wavelet.NPmethod) { - keyFile.set_string ("Wavelet", "NPMethod", wavelet.NPmethod); - } + if (!pedited || pedited->prsharpening.edgesonly) { + keyFile.set_boolean ("PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly); + } - if (!pedited || pedited->wavelet.BAmethod) { - keyFile.set_string ("Wavelet", "BAMethod", wavelet.BAmethod); - } + if (!pedited || pedited->prsharpening.edges_radius) { + keyFile.set_double ("PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius); + } - if (!pedited || pedited->wavelet.TMmethod) { - keyFile.set_string ("Wavelet", "TMMethod", wavelet.TMmethod); - } + if (!pedited || pedited->prsharpening.edges_tolerance) { + keyFile.set_integer ("PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance); + } - if (!pedited || pedited->wavelet.chro) { - keyFile.set_integer ("Wavelet", "ChromaLink", wavelet.chro); - } + if (!pedited || pedited->prsharpening.halocontrol) { + keyFile.set_boolean ("PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol); + } - if (!pedited || pedited->wavelet.ccwcurve) { - Glib::ArrayHandle ccwcurve = wavelet.ccwcurve; - keyFile.set_double_list("Wavelet", "ContrastCurve", ccwcurve); - } + if (!pedited || pedited->prsharpening.halocontrol_amount) { + keyFile.set_integer ("PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount); + } - if (!pedited || pedited->wavelet.pastlev) { - Glib::ArrayHandle thresh (wavelet.pastlev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "Pastlev", thresh); - } + if (!pedited || pedited->prsharpening.deconvradius) { + keyFile.set_double ("PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius); + } - if (!pedited || pedited->wavelet.satlev) { - Glib::ArrayHandle thresh (wavelet.satlev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "Satlev", thresh); - } + if (!pedited || pedited->prsharpening.deconvamount) { + keyFile.set_integer ("PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount); + } - if (!pedited || pedited->wavelet.opacityCurveRG) { - Glib::ArrayHandle curve = wavelet.opacityCurveRG; - keyFile.set_double_list("Wavelet", "OpacityCurveRG", curve); - } + if (!pedited || pedited->prsharpening.deconvdamping) { + keyFile.set_integer ("PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping); + } - if (!pedited || pedited->wavelet.opacityCurveBY) { - Glib::ArrayHandle curve = wavelet.opacityCurveBY; - keyFile.set_double_list("Wavelet", "OpacityCurveBY", curve); - } - - if (!pedited || pedited->wavelet.opacityCurveW) { - Glib::ArrayHandle curve = wavelet.opacityCurveW; - keyFile.set_double_list("Wavelet", "OpacityCurveW", curve); - } - - if (!pedited || pedited->wavelet.opacityCurveWL) { - Glib::ArrayHandle curve = wavelet.opacityCurveWL; - keyFile.set_double_list("Wavelet", "OpacityCurveWL", curve); - } - - if (!pedited || pedited->wavelet.hhcurve) { - Glib::ArrayHandle curve = wavelet.hhcurve; - keyFile.set_double_list("Wavelet", "HHcurve", curve); - } - - if (!pedited || pedited->wavelet.Chcurve) { - Glib::ArrayHandle curve = wavelet.Chcurve; - keyFile.set_double_list("Wavelet", "CHcurve", curve); - } - - if (!pedited || pedited->wavelet.wavclCurve) { - Glib::ArrayHandle wavclCurve = wavelet.wavclCurve; - keyFile.set_double_list("Wavelet", "WavclCurve", wavclCurve); - } + if (!pedited || pedited->prsharpening.deconviter) { + keyFile.set_integer ("PostResizeSharpening", "DeconvIterations", prsharpening.deconviter); + } - if (!pedited || pedited->wavelet.median) { - keyFile.set_boolean ("Wavelet", "Median", wavelet.median); - } + // save color management settings + if (!pedited || pedited->icm.input) { + keyFile.set_string ("Color Management", "InputProfile", relativePathIfInside(fname, fnameAbsolute, icm.input)); + } - if (!pedited || pedited->wavelet.medianlev) { - keyFile.set_boolean ("Wavelet", "Medianlev", wavelet.medianlev); - } + if (!pedited || pedited->icm.toneCurve) { + keyFile.set_boolean ("Color Management", "ToneCurve", icm.toneCurve); + } - if (!pedited || pedited->wavelet.linkedg) { - keyFile.set_boolean ("Wavelet", "Linkedg", wavelet.linkedg); - } + if (!pedited || pedited->icm.applyLookTable) { + keyFile.set_boolean ("Color Management", "ApplyLookTable", icm.applyLookTable); + } - if (!pedited || pedited->wavelet.cbenab) { - keyFile.set_boolean ("Wavelet", "CBenab", wavelet.cbenab); - } + if (!pedited || pedited->icm.applyBaselineExposureOffset) { + keyFile.set_boolean ("Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset); + } - if (!pedited || pedited->wavelet.lipst) { - keyFile.set_boolean ("Wavelet", "Lipst", wavelet.lipst); - } + if (!pedited || pedited->icm.applyHueSatMap) { + keyFile.set_boolean ("Color Management", "ApplyHueSatMap", icm.applyHueSatMap); + } + + if (!pedited || pedited->icm.blendCMSMatrix) { + keyFile.set_boolean ("Color Management", "BlendCMSMatrix", icm.blendCMSMatrix); + } + + if (!pedited || pedited->icm.dcpIlluminant) { + keyFile.set_integer ("Color Management", "DCPIlluminant", icm.dcpIlluminant); + } + + if (!pedited || pedited->icm.working) { + keyFile.set_string ("Color Management", "WorkingProfile", icm.working); + } + + if (!pedited || pedited->icm.output) { + keyFile.set_string ("Color Management", "OutputProfile", icm.output); + } + + if (!pedited || pedited->icm.outputIntent) { + Glib::ustring intent; + + switch (icm.outputIntent) { + default: + case RI_PERCEPTUAL: + intent = "Perceptual"; + break; + + case RI_RELATIVE: + intent = "Relative"; + break; + + case RI_SATURATION: + intent = "Saturation"; + break; + + case RI_ABSOLUTE: + intent = "Absolute"; + break; + } + + keyFile.set_string ("Color Management", "OutputProfileIntent", intent); + } + + if (!pedited || pedited->icm.gamma) { + keyFile.set_string ("Color Management", "Gammafree", icm.gamma); + } + + if (!pedited || pedited->icm.freegamma) { + keyFile.set_boolean ("Color Management", "Freegamma", icm.freegamma); + } + + if (!pedited || pedited->icm.gampos) { + keyFile.set_double ("Color Management", "GammaValue", icm.gampos); + } + + if (!pedited || pedited->icm.slpos) { + keyFile.set_double ("Color Management", "GammaSlope", icm.slpos); + } + + + + // save wavelet parameters + if (!pedited || pedited->wavelet.enabled) { + keyFile.set_boolean ("Wavelet", "Enabled", wavelet.enabled); + } + + if (!pedited || pedited->wavelet.strength) { + keyFile.set_integer ("Wavelet", "Strength", wavelet.strength); + } + + if (!pedited || pedited->wavelet.balance) { + keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); + } + + if (!pedited || pedited->wavelet.iter) { + keyFile.set_integer ("Wavelet", "Iter", wavelet.iter); + } + + if (!pedited || pedited->wavelet.thres) { + keyFile.set_integer ("Wavelet", "MaxLev", wavelet.thres); + } + + if (!pedited || pedited->wavelet.Tilesmethod) { + keyFile.set_string ("Wavelet", "TilesMethod", wavelet.Tilesmethod); + } + + if (!pedited || pedited->wavelet.daubcoeffmethod) { + keyFile.set_string ("Wavelet", "DaubMethod", wavelet.daubcoeffmethod); + } + + if (!pedited || pedited->wavelet.CLmethod) { + keyFile.set_string ("Wavelet", "ChoiceLevMethod", wavelet.CLmethod); + } + + if (!pedited || pedited->wavelet.Backmethod) { + keyFile.set_string ("Wavelet", "BackMethod", wavelet.Backmethod); + } + + if (!pedited || pedited->wavelet.Lmethod) { + keyFile.set_string ("Wavelet", "LevMethod", wavelet.Lmethod); + } + + if (!pedited || pedited->wavelet.Dirmethod) { + keyFile.set_string ("Wavelet", "DirMethod", wavelet.Dirmethod); + } + + if (!pedited || pedited->wavelet.greenhigh) { + keyFile.set_integer ("Wavelet", "CBgreenhigh", wavelet.greenhigh); + } + + if (!pedited || pedited->wavelet.greenmed) { + keyFile.set_integer ("Wavelet", "CBgreenmed", wavelet.greenmed); + } + + if (!pedited || pedited->wavelet.greenlow) { + keyFile.set_integer ("Wavelet", "CBgreenlow", wavelet.greenlow); + } + + if (!pedited || pedited->wavelet.bluehigh) { + keyFile.set_integer ("Wavelet", "CBbluehigh", wavelet.bluehigh); + } + + if (!pedited || pedited->wavelet.bluemed) { + keyFile.set_integer ("Wavelet", "CBbluemed", wavelet.bluemed); + } + + if (!pedited || pedited->wavelet.bluelow) { + keyFile.set_integer ("Wavelet", "CBbluelow", wavelet.bluelow); + } + + if (!pedited || pedited->wavelet.expcontrast) { + keyFile.set_boolean ("Wavelet", "Expcontrast", wavelet.expcontrast); + } + + if (!pedited || pedited->wavelet.expchroma) { + keyFile.set_boolean ("Wavelet", "Expchroma", wavelet.expchroma); + } + + if (!pedited || pedited->wavelet.expedge) { + keyFile.set_boolean ("Wavelet", "Expedge", wavelet.expedge); + } + + if (!pedited || pedited->wavelet.expresid) { + keyFile.set_boolean ("Wavelet", "Expresid", wavelet.expresid); + } + + if (!pedited || pedited->wavelet.expfinal) { + keyFile.set_boolean ("Wavelet", "Expfinal", wavelet.expfinal); + } + + if (!pedited || pedited->wavelet.exptoning) { + keyFile.set_boolean ("Wavelet", "Exptoning", wavelet.exptoning); + } + + if (!pedited || pedited->wavelet.expnoise) { + keyFile.set_boolean ("Wavelet", "Expnoise", wavelet.expnoise); + } + + for(int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Contrast" << (i + 1); + + if (!pedited || pedited->wavelet.c[i]) { + keyFile.set_integer("Wavelet", ss.str(), wavelet.c[i]); + } + } + + for(int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Chroma" << (i + 1); + + if (!pedited || pedited->wavelet.ch[i]) { + keyFile.set_integer("Wavelet", ss.str(), wavelet.ch[i]); + } + } + + if (!pedited || pedited->wavelet.sup) { + keyFile.set_integer ("Wavelet", "ContExtra", wavelet.sup); + } + + if (!pedited || pedited->wavelet.HSmethod) { + keyFile.set_string ("Wavelet", "HSMethod", wavelet.HSmethod); + } + + if (!pedited || pedited->wavelet.hllev) { + Glib::ArrayHandle thresh (wavelet.hllev.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "HLRange", thresh); + } + + if (!pedited || pedited->wavelet.bllev) { + Glib::ArrayHandle thresh (wavelet.bllev.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "SHRange", thresh); + } + + if (!pedited || pedited->wavelet.edgcont) { + Glib::ArrayHandle thresh (wavelet.edgcont.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "Edgcont", thresh); + } + + if (!pedited || pedited->wavelet.level0noise) { + Glib::ArrayHandle thresh (wavelet.level0noise.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_double_list("Wavelet", "Level0noise", thresh); + } + + if (!pedited || pedited->wavelet.level1noise) { + Glib::ArrayHandle thresh (wavelet.level1noise.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_double_list("Wavelet", "Level1noise", thresh); + } + + if (!pedited || pedited->wavelet.level2noise) { + Glib::ArrayHandle thresh (wavelet.level2noise.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_double_list("Wavelet", "Level2noise", thresh); + } + + if (!pedited || pedited->wavelet.level3noise) { + Glib::ArrayHandle thresh (wavelet.level3noise.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_double_list("Wavelet", "Level3noise", thresh); + } + + + if (!pedited || pedited->wavelet.threshold) { + keyFile.set_integer ("Wavelet", "ThresholdHighlight", wavelet.threshold); + } + + if (!pedited || pedited->wavelet.threshold2) { + keyFile.set_integer ("Wavelet", "ThresholdShadow", wavelet.threshold2); + } + + if (!pedited || pedited->wavelet.edgedetect) { + keyFile.set_integer ("Wavelet", "Edgedetect", wavelet.edgedetect); + } + + if (!pedited || pedited->wavelet.edgedetectthr) { + keyFile.set_integer ("Wavelet", "Edgedetectthr", wavelet.edgedetectthr); + } + + if (!pedited || pedited->wavelet.edgedetectthr2) { + keyFile.set_integer ("Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2); + } + + if (!pedited || pedited->wavelet.edgesensi) { + keyFile.set_integer ("Wavelet", "Edgesensi", wavelet.edgesensi); + } + + if (!pedited || pedited->wavelet.edgeampli) { + keyFile.set_integer ("Wavelet", "Edgeampli", wavelet.edgeampli); + } + + if (!pedited || pedited->wavelet.chroma) { + keyFile.set_integer ("Wavelet", "ThresholdChroma", wavelet.chroma); + } + + if (!pedited || pedited->wavelet.CHmethod) { + keyFile.set_string ("Wavelet", "CHromaMethod", wavelet.CHmethod); + } + + if (!pedited || pedited->wavelet.Medgreinf) { + keyFile.set_string ("Wavelet", "Medgreinf", wavelet.Medgreinf); + } + + if (!pedited || pedited->wavelet.CHSLmethod) { + keyFile.set_string ("Wavelet", "CHSLromaMethod", wavelet.CHSLmethod); + } + + if (!pedited || pedited->wavelet.EDmethod) { + keyFile.set_string ("Wavelet", "EDMethod", wavelet.EDmethod); + } + + if (!pedited || pedited->wavelet.NPmethod) { + keyFile.set_string ("Wavelet", "NPMethod", wavelet.NPmethod); + } + + if (!pedited || pedited->wavelet.BAmethod) { + keyFile.set_string ("Wavelet", "BAMethod", wavelet.BAmethod); + } + + if (!pedited || pedited->wavelet.TMmethod) { + keyFile.set_string ("Wavelet", "TMMethod", wavelet.TMmethod); + } + + if (!pedited || pedited->wavelet.chro) { + keyFile.set_integer ("Wavelet", "ChromaLink", wavelet.chro); + } + + if (!pedited || pedited->wavelet.ccwcurve) { + Glib::ArrayHandle ccwcurve = wavelet.ccwcurve; + keyFile.set_double_list("Wavelet", "ContrastCurve", ccwcurve); + } + + if (!pedited || pedited->wavelet.pastlev) { + Glib::ArrayHandle thresh (wavelet.pastlev.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "Pastlev", thresh); + } + + if (!pedited || pedited->wavelet.satlev) { + Glib::ArrayHandle thresh (wavelet.satlev.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "Satlev", thresh); + } + + if (!pedited || pedited->wavelet.opacityCurveRG) { + Glib::ArrayHandle curve = wavelet.opacityCurveRG; + keyFile.set_double_list("Wavelet", "OpacityCurveRG", curve); + } + + if (!pedited || pedited->wavelet.opacityCurveBY) { + Glib::ArrayHandle curve = wavelet.opacityCurveBY; + keyFile.set_double_list("Wavelet", "OpacityCurveBY", curve); + } + + if (!pedited || pedited->wavelet.opacityCurveW) { + Glib::ArrayHandle curve = wavelet.opacityCurveW; + keyFile.set_double_list("Wavelet", "OpacityCurveW", curve); + } + + if (!pedited || pedited->wavelet.opacityCurveWL) { + Glib::ArrayHandle curve = wavelet.opacityCurveWL; + keyFile.set_double_list("Wavelet", "OpacityCurveWL", curve); + } + + if (!pedited || pedited->wavelet.hhcurve) { + Glib::ArrayHandle curve = wavelet.hhcurve; + keyFile.set_double_list("Wavelet", "HHcurve", curve); + } + + if (!pedited || pedited->wavelet.Chcurve) { + Glib::ArrayHandle curve = wavelet.Chcurve; + keyFile.set_double_list("Wavelet", "CHcurve", curve); + } + + if (!pedited || pedited->wavelet.wavclCurve) { + Glib::ArrayHandle wavclCurve = wavelet.wavclCurve; + keyFile.set_double_list("Wavelet", "WavclCurve", wavclCurve); + } + + + if (!pedited || pedited->wavelet.median) { + keyFile.set_boolean ("Wavelet", "Median", wavelet.median); + } + + if (!pedited || pedited->wavelet.medianlev) { + keyFile.set_boolean ("Wavelet", "Medianlev", wavelet.medianlev); + } + + if (!pedited || pedited->wavelet.linkedg) { + keyFile.set_boolean ("Wavelet", "Linkedg", wavelet.linkedg); + } + + if (!pedited || pedited->wavelet.cbenab) { + keyFile.set_boolean ("Wavelet", "CBenab", wavelet.cbenab); + } + + if (!pedited || pedited->wavelet.lipst) { + keyFile.set_boolean ("Wavelet", "Lipst", wavelet.lipst); + } // if (!pedited || pedited->wavelet.edgreinf) keyFile.set_boolean ("Wavelet", "Edgreinf", wavelet.edgreinf); - if (!pedited || pedited->wavelet.skinprotect) { - keyFile.set_double ("Wavelet", "Skinprotect", wavelet.skinprotect); - } + if (!pedited || pedited->wavelet.skinprotect) { + keyFile.set_double ("Wavelet", "Skinprotect", wavelet.skinprotect); + } - if (!pedited || pedited->wavelet.hueskin) { - Glib::ArrayHandle thresh (wavelet.hueskin.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "Hueskin", thresh); - } + if (!pedited || pedited->wavelet.hueskin) { + Glib::ArrayHandle thresh (wavelet.hueskin.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "Hueskin", thresh); + } - if (!pedited || pedited->wavelet.edgrad) { - keyFile.set_integer ("Wavelet", "Edgrad", wavelet.edgrad); - } + if (!pedited || pedited->wavelet.edgrad) { + keyFile.set_integer ("Wavelet", "Edgrad", wavelet.edgrad); + } - if (!pedited || pedited->wavelet.edgval) { - keyFile.set_integer ("Wavelet", "Edgval", wavelet.edgval); - } + if (!pedited || pedited->wavelet.edgval) { + keyFile.set_integer ("Wavelet", "Edgval", wavelet.edgval); + } - if (!pedited || pedited->wavelet.edgthresh) { - keyFile.set_integer ("Wavelet", "ThrEdg", wavelet.edgthresh); - } + if (!pedited || pedited->wavelet.edgthresh) { + keyFile.set_integer ("Wavelet", "ThrEdg", wavelet.edgthresh); + } // if (!pedited || pedited->wavelet.strength) keyFile.set_integer ("Wavelet", "Strength", wavelet.strength); - // if (!pedited || pedited->wavelet.balance) keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); + // if (!pedited || pedited->wavelet.balance) keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); - if (!pedited || pedited->wavelet.avoid) { - keyFile.set_boolean ("Wavelet", "AvoidColorShift", wavelet.avoid); - } - - if (!pedited || pedited->wavelet.tmr) { - keyFile.set_boolean ("Wavelet", "TMr", wavelet.tmr); - } - - if (!pedited || pedited->wavelet.rescon) { - keyFile.set_integer ("Wavelet", "ResidualcontShadow", wavelet.rescon); - } - - if (!pedited || pedited->wavelet.resconH) { - keyFile.set_integer ("Wavelet", "ResidualcontHighlight", wavelet.resconH); - } - - if (!pedited || pedited->wavelet.thr) { - keyFile.set_integer ("Wavelet", "ThresholdResidShadow", wavelet.thr); - } - - if (!pedited || pedited->wavelet.thrH) { - keyFile.set_integer ("Wavelet", "ThresholdResidHighLight", wavelet.thrH); - } - - if (!pedited || pedited->wavelet.reschro) { - keyFile.set_integer ("Wavelet", "Residualchroma", wavelet.reschro); - } - - if (!pedited || pedited->wavelet.tmrs) { - keyFile.set_double ("Wavelet", "ResidualTM", wavelet.tmrs); - } - - if (!pedited || pedited->wavelet.gamma) { - keyFile.set_double ("Wavelet", "Residualgamma", wavelet.gamma); - } - - if (!pedited || pedited->wavelet.sky) { - keyFile.set_double ("Wavelet", "HueRangeResidual", wavelet.sky); - } - - if (!pedited || pedited->wavelet.hueskin2) { - Glib::ArrayHandle thresh (wavelet.hueskin2.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Wavelet", "HueRange", thresh); - } - - if (!pedited || pedited->wavelet.contrast) { - keyFile.set_integer ("Wavelet", "Contrast", wavelet.contrast); - } - - - // save directional pyramid wavelet parameters - if (!pedited || pedited->dirpyrequalizer.enabled) { - keyFile.set_boolean ("Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled); - } - - if (!pedited || pedited->dirpyrequalizer.gamutlab) { - keyFile.set_boolean ("Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab); - } - - if (!pedited || pedited->dirpyrequalizer.cbdlMethod) { - keyFile.set_string ("Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod); - } - - for(int i = 0; i < 6; i++) { - std::stringstream ss; - ss << "Mult" << i; - - if (!pedited || pedited->dirpyrequalizer.mult[i]) { - keyFile.set_double("Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i]); + if (!pedited || pedited->wavelet.avoid) { + keyFile.set_boolean ("Wavelet", "AvoidColorShift", wavelet.avoid); } - } - if (!pedited || pedited->dirpyrequalizer.threshold) { - keyFile.set_double ("Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold); - } - - if (!pedited || pedited->dirpyrequalizer.skinprotect) { - keyFile.set_double ("Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect); - } - - // if (!pedited || pedited->dirpyrequalizer.algo) keyFile.set_string ("Directional Pyramid Equalizer", "Algorithm", dirpyrequalizer.algo); - if (!pedited || pedited->dirpyrequalizer.hueskin) { - Glib::ArrayHandle thresh (dirpyrequalizer.hueskin.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("Directional Pyramid Equalizer", "Hueskin", thresh); - } - - // save hsv wavelet parameters - if (!pedited || pedited->hsvequalizer.hcurve) { - Glib::ArrayHandle hcurve = hsvequalizer.hcurve; - keyFile.set_double_list("HSV Equalizer", "HCurve", hcurve); - } - - if (!pedited || pedited->hsvequalizer.scurve) { - Glib::ArrayHandle scurve = hsvequalizer.scurve; - keyFile.set_double_list("HSV Equalizer", "SCurve", scurve); - } - - if (!pedited || pedited->hsvequalizer.vcurve) { - Glib::ArrayHandle vcurve = hsvequalizer.vcurve; - keyFile.set_double_list("HSV Equalizer", "VCurve", vcurve); - } - - //save film simulation parameters - if ( !pedited || pedited->filmSimulation.enabled ) { - keyFile.set_boolean( "Film Simulation", "Enabled", filmSimulation.enabled ); - } - - if ( !pedited || pedited->filmSimulation.clutFilename ) { - keyFile.set_string ( "Film Simulation", "ClutFilename", filmSimulation.clutFilename ); - } - - if ( !pedited || pedited->filmSimulation.strength ) { - keyFile.set_integer( "Film Simulation", "Strength", filmSimulation.strength ); - } - - - if (!pedited || pedited->rgbCurves.lumamode) { - keyFile.set_boolean ("RGB Curves", "LumaMode", rgbCurves.lumamode); - } - - if (!pedited || pedited->rgbCurves.rcurve) { - Glib::ArrayHandle RGBrcurve = rgbCurves.rcurve; - keyFile.set_double_list("RGB Curves", "rCurve", RGBrcurve); - } - - if (!pedited || pedited->rgbCurves.gcurve) { - Glib::ArrayHandle RGBgcurve = rgbCurves.gcurve; - keyFile.set_double_list("RGB Curves", "gCurve", RGBgcurve); - } - - if (!pedited || pedited->rgbCurves.bcurve) { - Glib::ArrayHandle RGBbcurve = rgbCurves.bcurve; - keyFile.set_double_list("RGB Curves", "bCurve", RGBbcurve); - } - - // save Color Toning - if (!pedited || pedited->colorToning.enabled) { - keyFile.set_boolean ("ColorToning", "Enabled", colorToning.enabled); - } - - if (!pedited || pedited->colorToning.method) { - keyFile.set_string ("ColorToning", "Method", colorToning.method); - } - - if (!pedited || pedited->colorToning.lumamode) { - keyFile.set_boolean ("ColorToning", "Lumamode", colorToning.lumamode); - } - - if (!pedited || pedited->colorToning.twocolor) { - keyFile.set_string ("ColorToning", "Twocolor", colorToning.twocolor); - } - - if (!pedited || pedited->colorToning.redlow) { - keyFile.set_double ("ColorToning", "Redlow", colorToning.redlow); - } - - if (!pedited || pedited->colorToning.greenlow) { - keyFile.set_double ("ColorToning", "Greenlow", colorToning.greenlow); - } - - if (!pedited || pedited->colorToning.bluelow) { - keyFile.set_double ("ColorToning", "Bluelow", colorToning.bluelow); - } - - if (!pedited || pedited->colorToning.satlow) { - keyFile.set_double ("ColorToning", "Satlow", colorToning.satlow); - } - - if (!pedited || pedited->colorToning.balance) { - keyFile.set_integer ("ColorToning", "Balance", colorToning.balance); - } - - if (!pedited || pedited->colorToning.sathigh) { - keyFile.set_double ("ColorToning", "Sathigh", colorToning.sathigh); - } - - if (!pedited || pedited->colorToning.redmed) { - keyFile.set_double ("ColorToning", "Redmed", colorToning.redmed); - } - - if (!pedited || pedited->colorToning.greenmed) { - keyFile.set_double ("ColorToning", "Greenmed", colorToning.greenmed); - } - - if (!pedited || pedited->colorToning.bluemed) { - keyFile.set_double ("ColorToning", "Bluemed", colorToning.bluemed); - } - - if (!pedited || pedited->colorToning.redhigh) { - keyFile.set_double ("ColorToning", "Redhigh", colorToning.redhigh); - } - - if (!pedited || pedited->colorToning.greenhigh) { - keyFile.set_double ("ColorToning", "Greenhigh", colorToning.greenhigh); - } - - if (!pedited || pedited->colorToning.bluehigh) { - keyFile.set_double ("ColorToning", "Bluehigh", colorToning.bluehigh); - } - - if (!pedited || pedited->colorToning.autosat) { - keyFile.set_boolean ("ColorToning", "Autosat", colorToning.autosat); - } - - if (!pedited || pedited->colorToning.opacityCurve) { - Glib::ArrayHandle curve = colorToning.opacityCurve; - keyFile.set_double_list("ColorToning", "OpacityCurve", curve); - } - - if (!pedited || pedited->colorToning.colorCurve) { - Glib::ArrayHandle curve = colorToning.colorCurve; - keyFile.set_double_list("ColorToning", "ColorCurve", curve); - } - - if (!pedited || pedited->colorToning.satprotectionthreshold) { - keyFile.set_integer ("ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold ); - } - - if (!pedited || pedited->colorToning.saturatedopacity) { - keyFile.set_integer ("ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity ); - } - - if (!pedited || pedited->colorToning.strength) { - keyFile.set_integer ("ColorToning", "Strength", colorToning.strength ); - } - - if (!pedited || pedited->colorToning.hlColSat) { - Glib::ArrayHandle thresh (colorToning.hlColSat.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("ColorToning", "HighlightsColorSaturation", thresh); - } - - if (!pedited || pedited->colorToning.shadowsColSat) { - Glib::ArrayHandle thresh (colorToning.shadowsColSat.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list("ColorToning", "ShadowsColorSaturation", thresh); - } - - if (!pedited || pedited->colorToning.clcurve) { - Glib::ArrayHandle clcurve = colorToning.clcurve; - keyFile.set_double_list("ColorToning", "ClCurve", clcurve); - } - - if (!pedited || pedited->colorToning.cl2curve) { - Glib::ArrayHandle cl2curve = colorToning.cl2curve; - keyFile.set_double_list("ColorToning", "Cl2Curve", cl2curve); - } - - // save raw parameters - if (!pedited || pedited->raw.darkFrame) { - keyFile.set_string ("RAW", "DarkFrame", relativePathIfInside(fname, fnameAbsolute, raw.dark_frame) ); - } - - if (!pedited || pedited->raw.dfAuto) { - keyFile.set_boolean ("RAW", "DarkFrameAuto", raw.df_autoselect ); - } - - if (!pedited || pedited->raw.ff_file) { - keyFile.set_string ("RAW", "FlatFieldFile", relativePathIfInside(fname, fnameAbsolute, raw.ff_file) ); - } - - if (!pedited || pedited->raw.ff_AutoSelect) { - keyFile.set_boolean ("RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect ); - } - - if (!pedited || pedited->raw.ff_BlurRadius) { - keyFile.set_integer ("RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius ); - } - - if (!pedited || pedited->raw.ff_BlurType) { - keyFile.set_string ("RAW", "FlatFieldBlurType", raw.ff_BlurType ); - } - - if (!pedited || pedited->raw.ff_AutoClipControl) { - keyFile.set_boolean ("RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl ); - } - - if (!pedited || pedited->raw.ff_clipControl) { - keyFile.set_boolean ("RAW", "FlatFieldClipControl", raw.ff_clipControl ); - } - - if (!pedited || pedited->raw.caCorrection) { - keyFile.set_boolean ("RAW", "CA", raw.ca_autocorrect ); - } - - if (!pedited || pedited->raw.caAutoStrength) { - keyFile.set_double ("RAW", "CAAutoStrength", raw.caautostrength ); - } - - if (!pedited || pedited->raw.caRed) { - keyFile.set_double ("RAW", "CARed", raw.cared ); - } - - if (!pedited || pedited->raw.caBlue) { - keyFile.set_double ("RAW", "CABlue", raw.cablue ); - } - - if (!pedited || pedited->raw.hotPixelFilter) { - keyFile.set_boolean ("RAW", "HotPixelFilter", raw.hotPixelFilter ); - } - - if (!pedited || pedited->raw.deadPixelFilter) { - keyFile.set_boolean ("RAW", "DeadPixelFilter", raw.deadPixelFilter ); - } - - if (!pedited || pedited->raw.hotDeadPixelThresh) { - keyFile.set_integer ("RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh ); - } - - if (!pedited || pedited->raw.bayersensor.method) { - keyFile.set_string ("RAW Bayer", "Method", raw.bayersensor.method ); - } - - if (!pedited || pedited->raw.bayersensor.ccSteps) { - keyFile.set_integer ("RAW Bayer", "CcSteps", raw.bayersensor.ccSteps); - } - - if (!pedited || pedited->raw.bayersensor.exBlack0) { - keyFile.set_double ("RAW Bayer", "PreBlack0", raw.bayersensor.black0 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack1) { - keyFile.set_double ("RAW Bayer", "PreBlack1", raw.bayersensor.black1 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack2) { - keyFile.set_double ("RAW Bayer", "PreBlack2", raw.bayersensor.black2 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack3) { - keyFile.set_double ("RAW Bayer", "PreBlack3", raw.bayersensor.black3 ); - } - - if (!pedited || pedited->raw.bayersensor.exTwoGreen) { - keyFile.set_boolean ("RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen ); - } - - if (!pedited || pedited->raw.bayersensor.linenoise) { - keyFile.set_integer ("RAW Bayer", "LineDenoise", raw.bayersensor.linenoise); - } - - if (!pedited || pedited->raw.bayersensor.greenEq) { - keyFile.set_integer ("RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh); - } - - if (!pedited || pedited->raw.bayersensor.dcbIterations) { - keyFile.set_integer ("RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations ); - } - - if (!pedited || pedited->raw.bayersensor.dcbEnhance) { - keyFile.set_boolean ("RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance ); - } - - if (!pedited || pedited->raw.bayersensor.lmmseIterations) { - keyFile.set_integer ("RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations ); - } - - //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance ); - - if (!pedited || pedited->raw.xtranssensor.method) { - keyFile.set_string ("RAW X-Trans", "Method", raw.xtranssensor.method ); - } - - if (!pedited || pedited->raw.xtranssensor.ccSteps) { - keyFile.set_integer ("RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackRed) { - keyFile.set_double ("RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred ); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackGreen) { - keyFile.set_double ("RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen ); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackBlue) { - keyFile.set_double ("RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue ); - } - - - // save raw exposition - if (!pedited || pedited->raw.exPos) { - keyFile.set_double ("RAW", "PreExposure", raw.expos ); - } - - if (!pedited || pedited->raw.exPreser) { - keyFile.set_double ("RAW", "PrePreserv", raw.preser ); - } - - // save exif change list - if (!pedited || pedited->exif) { - for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); i++) { - keyFile.set_string ("Exif", i->first, i->second); + if (!pedited || pedited->wavelet.tmr) { + keyFile.set_boolean ("Wavelet", "TMr", wavelet.tmr); } - } - // save iptc change list - if (!pedited || pedited->iptc) { - for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); i++) { - Glib::ArrayHandle values = i->second; - keyFile.set_string_list ("IPTC", i->first, values); + if (!pedited || pedited->wavelet.rescon) { + keyFile.set_integer ("Wavelet", "ResidualcontShadow", wavelet.rescon); } - } - sPParams = keyFile.to_data(); + if (!pedited || pedited->wavelet.resconH) { + keyFile.set_integer ("Wavelet", "ResidualcontHighlight", wavelet.resconH); + } + + if (!pedited || pedited->wavelet.thr) { + keyFile.set_integer ("Wavelet", "ThresholdResidShadow", wavelet.thr); + } + + if (!pedited || pedited->wavelet.thrH) { + keyFile.set_integer ("Wavelet", "ThresholdResidHighLight", wavelet.thrH); + } + + if (!pedited || pedited->wavelet.reschro) { + keyFile.set_integer ("Wavelet", "Residualchroma", wavelet.reschro); + } + + if (!pedited || pedited->wavelet.tmrs) { + keyFile.set_double ("Wavelet", "ResidualTM", wavelet.tmrs); + } + + if (!pedited || pedited->wavelet.gamma) { + keyFile.set_double ("Wavelet", "Residualgamma", wavelet.gamma); + } + + if (!pedited || pedited->wavelet.sky) { + keyFile.set_double ("Wavelet", "HueRangeResidual", wavelet.sky); + } + + if (!pedited || pedited->wavelet.hueskin2) { + Glib::ArrayHandle thresh (wavelet.hueskin2.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Wavelet", "HueRange", thresh); + } + + if (!pedited || pedited->wavelet.contrast) { + keyFile.set_integer ("Wavelet", "Contrast", wavelet.contrast); + } + + + // save directional pyramid wavelet parameters + if (!pedited || pedited->dirpyrequalizer.enabled) { + keyFile.set_boolean ("Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled); + } + + if (!pedited || pedited->dirpyrequalizer.gamutlab) { + keyFile.set_boolean ("Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab); + } + + if (!pedited || pedited->dirpyrequalizer.cbdlMethod) { + keyFile.set_string ("Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod); + } + + for(int i = 0; i < 6; i++) { + std::stringstream ss; + ss << "Mult" << i; + + if (!pedited || pedited->dirpyrequalizer.mult[i]) { + keyFile.set_double("Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i]); + } + } + + if (!pedited || pedited->dirpyrequalizer.threshold) { + keyFile.set_double ("Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold); + } + + if (!pedited || pedited->dirpyrequalizer.skinprotect) { + keyFile.set_double ("Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect); + } + + // if (!pedited || pedited->dirpyrequalizer.algo) keyFile.set_string ("Directional Pyramid Equalizer", "Algorithm", dirpyrequalizer.algo); + if (!pedited || pedited->dirpyrequalizer.hueskin) { + Glib::ArrayHandle thresh (dirpyrequalizer.hueskin.value, 4, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Directional Pyramid Equalizer", "Hueskin", thresh); + } + + // save hsv wavelet parameters + if (!pedited || pedited->hsvequalizer.hcurve) { + Glib::ArrayHandle hcurve = hsvequalizer.hcurve; + keyFile.set_double_list("HSV Equalizer", "HCurve", hcurve); + } + + if (!pedited || pedited->hsvequalizer.scurve) { + Glib::ArrayHandle scurve = hsvequalizer.scurve; + keyFile.set_double_list("HSV Equalizer", "SCurve", scurve); + } + + if (!pedited || pedited->hsvequalizer.vcurve) { + Glib::ArrayHandle vcurve = hsvequalizer.vcurve; + keyFile.set_double_list("HSV Equalizer", "VCurve", vcurve); + } + + //save film simulation parameters + if ( !pedited || pedited->filmSimulation.enabled ) { + keyFile.set_boolean( "Film Simulation", "Enabled", filmSimulation.enabled ); + } + + if ( !pedited || pedited->filmSimulation.clutFilename ) { + keyFile.set_string ( "Film Simulation", "ClutFilename", filmSimulation.clutFilename ); + } + + if ( !pedited || pedited->filmSimulation.strength ) { + keyFile.set_integer( "Film Simulation", "Strength", filmSimulation.strength ); + } + + + if (!pedited || pedited->rgbCurves.lumamode) { + keyFile.set_boolean ("RGB Curves", "LumaMode", rgbCurves.lumamode); + } + + if (!pedited || pedited->rgbCurves.rcurve) { + Glib::ArrayHandle RGBrcurve = rgbCurves.rcurve; + keyFile.set_double_list("RGB Curves", "rCurve", RGBrcurve); + } + + if (!pedited || pedited->rgbCurves.gcurve) { + Glib::ArrayHandle RGBgcurve = rgbCurves.gcurve; + keyFile.set_double_list("RGB Curves", "gCurve", RGBgcurve); + } + + if (!pedited || pedited->rgbCurves.bcurve) { + Glib::ArrayHandle RGBbcurve = rgbCurves.bcurve; + keyFile.set_double_list("RGB Curves", "bCurve", RGBbcurve); + } + + // save Color Toning + if (!pedited || pedited->colorToning.enabled) { + keyFile.set_boolean ("ColorToning", "Enabled", colorToning.enabled); + } + + if (!pedited || pedited->colorToning.method) { + keyFile.set_string ("ColorToning", "Method", colorToning.method); + } + + if (!pedited || pedited->colorToning.lumamode) { + keyFile.set_boolean ("ColorToning", "Lumamode", colorToning.lumamode); + } + + if (!pedited || pedited->colorToning.twocolor) { + keyFile.set_string ("ColorToning", "Twocolor", colorToning.twocolor); + } + + if (!pedited || pedited->colorToning.redlow) { + keyFile.set_double ("ColorToning", "Redlow", colorToning.redlow); + } + + if (!pedited || pedited->colorToning.greenlow) { + keyFile.set_double ("ColorToning", "Greenlow", colorToning.greenlow); + } + + if (!pedited || pedited->colorToning.bluelow) { + keyFile.set_double ("ColorToning", "Bluelow", colorToning.bluelow); + } + + if (!pedited || pedited->colorToning.satlow) { + keyFile.set_double ("ColorToning", "Satlow", colorToning.satlow); + } + + if (!pedited || pedited->colorToning.balance) { + keyFile.set_integer ("ColorToning", "Balance", colorToning.balance); + } + + if (!pedited || pedited->colorToning.sathigh) { + keyFile.set_double ("ColorToning", "Sathigh", colorToning.sathigh); + } + + if (!pedited || pedited->colorToning.redmed) { + keyFile.set_double ("ColorToning", "Redmed", colorToning.redmed); + } + + if (!pedited || pedited->colorToning.greenmed) { + keyFile.set_double ("ColorToning", "Greenmed", colorToning.greenmed); + } + + if (!pedited || pedited->colorToning.bluemed) { + keyFile.set_double ("ColorToning", "Bluemed", colorToning.bluemed); + } + + if (!pedited || pedited->colorToning.redhigh) { + keyFile.set_double ("ColorToning", "Redhigh", colorToning.redhigh); + } + + if (!pedited || pedited->colorToning.greenhigh) { + keyFile.set_double ("ColorToning", "Greenhigh", colorToning.greenhigh); + } + + if (!pedited || pedited->colorToning.bluehigh) { + keyFile.set_double ("ColorToning", "Bluehigh", colorToning.bluehigh); + } + + if (!pedited || pedited->colorToning.autosat) { + keyFile.set_boolean ("ColorToning", "Autosat", colorToning.autosat); + } + + if (!pedited || pedited->colorToning.opacityCurve) { + Glib::ArrayHandle curve = colorToning.opacityCurve; + keyFile.set_double_list("ColorToning", "OpacityCurve", curve); + } + + if (!pedited || pedited->colorToning.colorCurve) { + Glib::ArrayHandle curve = colorToning.colorCurve; + keyFile.set_double_list("ColorToning", "ColorCurve", curve); + } + + if (!pedited || pedited->colorToning.satprotectionthreshold) { + keyFile.set_integer ("ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold ); + } + + if (!pedited || pedited->colorToning.saturatedopacity) { + keyFile.set_integer ("ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity ); + } + + if (!pedited || pedited->colorToning.strength) { + keyFile.set_integer ("ColorToning", "Strength", colorToning.strength ); + } + + if (!pedited || pedited->colorToning.hlColSat) { + Glib::ArrayHandle thresh (colorToning.hlColSat.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("ColorToning", "HighlightsColorSaturation", thresh); + } + + if (!pedited || pedited->colorToning.shadowsColSat) { + Glib::ArrayHandle thresh (colorToning.shadowsColSat.value, 2, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("ColorToning", "ShadowsColorSaturation", thresh); + } + + if (!pedited || pedited->colorToning.clcurve) { + Glib::ArrayHandle clcurve = colorToning.clcurve; + keyFile.set_double_list("ColorToning", "ClCurve", clcurve); + } + + if (!pedited || pedited->colorToning.cl2curve) { + Glib::ArrayHandle cl2curve = colorToning.cl2curve; + keyFile.set_double_list("ColorToning", "Cl2Curve", cl2curve); + } + + // save raw parameters + if (!pedited || pedited->raw.darkFrame) { + keyFile.set_string ("RAW", "DarkFrame", relativePathIfInside(fname, fnameAbsolute, raw.dark_frame) ); + } + + if (!pedited || pedited->raw.dfAuto) { + keyFile.set_boolean ("RAW", "DarkFrameAuto", raw.df_autoselect ); + } + + if (!pedited || pedited->raw.ff_file) { + keyFile.set_string ("RAW", "FlatFieldFile", relativePathIfInside(fname, fnameAbsolute, raw.ff_file) ); + } + + if (!pedited || pedited->raw.ff_AutoSelect) { + keyFile.set_boolean ("RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect ); + } + + if (!pedited || pedited->raw.ff_BlurRadius) { + keyFile.set_integer ("RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius ); + } + + if (!pedited || pedited->raw.ff_BlurType) { + keyFile.set_string ("RAW", "FlatFieldBlurType", raw.ff_BlurType ); + } + + if (!pedited || pedited->raw.ff_AutoClipControl) { + keyFile.set_boolean ("RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl ); + } + + if (!pedited || pedited->raw.ff_clipControl) { + keyFile.set_boolean ("RAW", "FlatFieldClipControl", raw.ff_clipControl ); + } + + if (!pedited || pedited->raw.caCorrection) { + keyFile.set_boolean ("RAW", "CA", raw.ca_autocorrect ); + } + + if (!pedited || pedited->raw.caAutoStrength) { + keyFile.set_double ("RAW", "CAAutoStrength", raw.caautostrength ); + } + + if (!pedited || pedited->raw.caRed) { + keyFile.set_double ("RAW", "CARed", raw.cared ); + } + + if (!pedited || pedited->raw.caBlue) { + keyFile.set_double ("RAW", "CABlue", raw.cablue ); + } + + if (!pedited || pedited->raw.hotPixelFilter) { + keyFile.set_boolean ("RAW", "HotPixelFilter", raw.hotPixelFilter ); + } + + if (!pedited || pedited->raw.deadPixelFilter) { + keyFile.set_boolean ("RAW", "DeadPixelFilter", raw.deadPixelFilter ); + } + + if (!pedited || pedited->raw.hotDeadPixelThresh) { + keyFile.set_integer ("RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh ); + } + + if (!pedited || pedited->raw.bayersensor.method) { + keyFile.set_string ("RAW Bayer", "Method", raw.bayersensor.method ); + } + + if (!pedited || pedited->raw.bayersensor.ccSteps) { + keyFile.set_integer ("RAW Bayer", "CcSteps", raw.bayersensor.ccSteps); + } + + if (!pedited || pedited->raw.bayersensor.exBlack0) { + keyFile.set_double ("RAW Bayer", "PreBlack0", raw.bayersensor.black0 ); + } + + if (!pedited || pedited->raw.bayersensor.exBlack1) { + keyFile.set_double ("RAW Bayer", "PreBlack1", raw.bayersensor.black1 ); + } + + if (!pedited || pedited->raw.bayersensor.exBlack2) { + keyFile.set_double ("RAW Bayer", "PreBlack2", raw.bayersensor.black2 ); + } + + if (!pedited || pedited->raw.bayersensor.exBlack3) { + keyFile.set_double ("RAW Bayer", "PreBlack3", raw.bayersensor.black3 ); + } + + if (!pedited || pedited->raw.bayersensor.exTwoGreen) { + keyFile.set_boolean ("RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen ); + } + + if (!pedited || pedited->raw.bayersensor.linenoise) { + keyFile.set_integer ("RAW Bayer", "LineDenoise", raw.bayersensor.linenoise); + } + + if (!pedited || pedited->raw.bayersensor.greenEq) { + keyFile.set_integer ("RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh); + } + + if (!pedited || pedited->raw.bayersensor.dcbIterations) { + keyFile.set_integer ("RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations ); + } + + if (!pedited || pedited->raw.bayersensor.dcbEnhance) { + keyFile.set_boolean ("RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance ); + } + + if (!pedited || pedited->raw.bayersensor.lmmseIterations) { + keyFile.set_integer ("RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations ); + } + + //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance ); + + if (!pedited || pedited->raw.xtranssensor.method) { + keyFile.set_string ("RAW X-Trans", "Method", raw.xtranssensor.method ); + } + + if (!pedited || pedited->raw.xtranssensor.ccSteps) { + keyFile.set_integer ("RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps); + } + + if (!pedited || pedited->raw.xtranssensor.exBlackRed) { + keyFile.set_double ("RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred ); + } + + if (!pedited || pedited->raw.xtranssensor.exBlackGreen) { + keyFile.set_double ("RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen ); + } + + if (!pedited || pedited->raw.xtranssensor.exBlackBlue) { + keyFile.set_double ("RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue ); + } + + + // save raw exposition + if (!pedited || pedited->raw.exPos) { + keyFile.set_double ("RAW", "PreExposure", raw.expos ); + } + + if (!pedited || pedited->raw.exPreser) { + keyFile.set_double ("RAW", "PrePreserv", raw.preser ); + } + + // save exif change list + if (!pedited || pedited->exif) { + for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); i++) { + keyFile.set_string ("Exif", i->first, i->second); + } + } + + // save iptc change list + if (!pedited || pedited->iptc) { + for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); i++) { + Glib::ArrayHandle values = i->second; + keyFile.set_string_list ("IPTC", i->first, values); + } + } + + sPParams = keyFile.to_data(); } catch(Glib::KeyFileError&) {} @@ -4225,6 +4225,10 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) if (keyFile.has_key ("Luminance Curve", "Chromaticity")) { labCurve.chromaticity = keyFile.get_integer ("Luminance Curve", "Chromaticity"); + if (ppVersion >= 303 && ppVersion < 314 && labCurve.chromaticity == -100) { + blackwhite.enabled = true; + } + if (pedited) { pedited->labCurve.chromaticity = true; } From d57eec162823b0188c6193403c1c50fc008cdd68 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 30 May 2016 13:46:08 +0200 Subject: [PATCH 073/232] Update for camconst.json, kudos to Ilias --- rtengine/camconst.json | 376 +++++++++++++++++++++++------------------ 1 file changed, 207 insertions(+), 169 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index d56eb05a6..c7bef9ee2 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -36,7 +36,7 @@ missing. That's why this file is needed. It's read once during startup, so if the file is updated you need to restart RawTherapee in order to take effect. The file is not intended for modification by the casual user, but advanced users can add missing camera information to this file. -If you do so please report at http://code.google.com/p/rawtherapee/issues so we can +If you do so please report at https://github.com/Beep6581/RawTherapee/issues so we can extend the distributed version of this file so your provided camera information becomes available to all. @@ -58,9 +58,20 @@ Examples: // make and model separated with single space, must match make // and model as provided by dcraw (case-insensitive). "make_model": "ManufacturerA ModelB", + Some Panasonics and some Canon Dslrs (of the low category like Canon 550D) exist + under alternate naming in various marketplaces (EOS 550D, EOS Rebel T2i, EOS Kiss X4). + For new models that are still not supported by the Dcraw version used in current RT, + we have to fill all the alternate names or else RT will not recognize the alternate model names + For models supported by Dcraw, filling the alternate names is simply desired (for better user info). + The format of multiple naming is to write all names in brackets i.e + instead of .. "make_model": "Canon EOS 550D", + type .. "make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ], // ColorMatrix with D65 Calibration Illuminant, in dcraw format "dcraw_matrix": [ 7530, -1942, -255, -4318, 11390, 3362, -926, 1694, 7649 ], // black level (or black offset if a base black is already extracted from exif by Dcraw, see Panasonic, resent Nikon ) + // For some rare cases where Dcraw detects wrong Black Level we need to correct it with absolute black i.e one that is not added up + // the detected. For this job we have to define "black" as 65535+desired_black. For example to correct a wrongly detected black level + of 9 instead of the correct 600 we define "black": 66135 i.e. 65535+600. // and white level same for all colors at all ISOs "ranges": { "black": 10, "white": 1000 }, // crop away masked sensor borders, 10 pixels left, 20 pixels top, resulting image width/height 4000x3000 @@ -68,14 +79,18 @@ Examples: that should be removed but keep in mind that sometimes after converting to DNG the borders are already cropped so the "negative number" way is not totally safe. "raw_crop": [ 10, 20, 4000, 3000 ], - // Almost same as MaskedAreas DNG tag, used for black level measuring here two areas defined - "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], - The difference here is the meaning of the numbers which here are expressing the absolute distance (in pixels) + // Almost same as MaskedAreas DNG tag, used for black level measuring. Here up to two areas can be defined + by tetrads of numbers + "masked_areas": [ 51, 2, 3804, 156, 51, 5794, 3804, 5792 ], // two tetrads define two areas + The difference vs "raw_crop" is the meaning of the numbers which here are expressing the absolute distance (in pixels) of each side of each rectangular "masked area" from the top and left side of the sensor - the first number is the distance of the top edge from the sensor's top - the second is the distance of the left side from the sensor's left - the third is the distance of the bottom side from the sensor's top - the fourth is the distance of the right side from the sensor's left + It is useful after detecting the masked areas, to not fully use these areas but leave a border of + 2-4 pixels instead, to take care of possible light leaks from the light sensing area to the optically + black (masked) area or sensor imperfections at the outer borders. }, { @@ -571,31 +586,6 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // Quality b, ISO and aperture WL data by ..... at RawTherapee forums, missing samples safely guessed - "make_model": "Canon EOS 550D", - "dcraw_matrix": [ 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 ], // dcraw 550d - "ranges": { - "white": [ - { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 - { "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650 - { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304 - ], - "white_max": 16383, - "aperture_scaling": [ - /* note: no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the - typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ - { "aperture": 1.4, "scale_factor": 1.250 }, // guessed - { "aperture": 1.6, "scale_factor": 1.150 }, // guessed - { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584 - { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584 - { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584 - { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584 - { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584 - { "aperture": 3.2, "scale_factor": 1.015 }, // guessed - { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible - ] - } - }, { // Quality A, f/1.6 aperture scale factor missing but safely guessed, ISO and aperture data by charlyw at RT forums "make_model": "Canon EOS 7D Mark II", "dcraw_matrix": [ 7268,-1082,-969,-4186,11839,2663,-825,2029,5839 ], // dng_v8.7 d65 @@ -752,8 +742,65 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, + { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed + "make_model": "Canon EOS 80D", + "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // DNG_V9.5 D65 + "raw_crop": [ 264, 34, 6024, 4022 ], // full size 6288x4056, official crop 276,46,6275,4045 + "masked_areas": [ 40, 96, 4000, 260 ], + "ranges": { + "white": [ + { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243 + { "iso": [ 160 ], "levels": 13000 }, // nominal 13097, + { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415 + { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150 + { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: need for more data to properly fill all scale factors */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // guessed + { "aperture": 2.2, "scale_factor": 1.025 }, // guessed + { "aperture": 2.5, "scale_factor": 1.020 }, // guessed + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + +// Canon Mid category DSLRs (Rebels) + + { // Quality b, ISO and aperture WL data by ..... at RawTherapee forums, missing samples safely guessed + "make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ], + "dcraw_matrix": [ 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 ], // dcraw 550d + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 + { "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 5000, 6400, 12800 ], "levels": 15200 } // typical 15304 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.250 }, // guessed + { "aperture": 1.6, "scale_factor": 1.150 }, // guessed + { "aperture": 1.8, "scale_factor": 1.110 }, // 15196/13584 + { "aperture": 2.0, "scale_factor": 1.080 }, // 14734/13584 + { "aperture": 2.2, "scale_factor": 1.050 }, // 14386/13584 + { "aperture": 2.5, "scale_factor": 1.040 }, // 14272/13584 + { "aperture": 2.8, "scale_factor": 1.030 }, // 14042/13584 + { "aperture": 3.2, "scale_factor": 1.015 }, // guessed + { "aperture": 3.5, "scale_factor": 1.000 } // guessed negligible + ] + } + }, + { // Quality b, scaling factors missing but guessed safely - "make_model": [ "Canon EOS 1200D", "Canon EOS Rebel T5", "Canon EOS 600D", "Canon EOS Rebel T3i" ], + "make_model": [ "Canon EOS 600D", "Canon EOS Rebel T3i", "Canon EOS Kiss X5", "Canon EOS 1200D", "Canon EOS Rebel T5", "Canon EOS Kiss X70" ], "dcraw_matrix": [ 6461,-907,-882,-4300,12184,2378,-819,1944,5931 ], // dcp D65 colormatrix2 "ranges": { "white": [ @@ -772,41 +819,13 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066 { "aperture": 2.5, "scale_factor": 1.050 }, // guessed { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348 - { "aperture": 3.2, "scale_factor": 1.000 }, // - { "aperture": 3.5, "scale_factor": 1.000 } // - ] - } - }, - - { // Quality B, .. integer ISOs measured, intermediate ISO samples missing, - // scaling factors safely guessed to be same as 1200D .. - "make_model": [ "Canon EOS 1300D", "Canon EOS Rebel T6" ], - "dcraw_matrix": [ 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 ], // Dcraw 9.27 - "ranges": { - "white": [ - { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 - { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 - { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800 ], "levels": 15200 } // typical 15303 - ], - "white_max": 16383, - "aperture_scaling": [ - /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the - typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ - { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data - { "aperture": 1.6, "scale_factor": 1.190 }, // guessed - { "aperture": 1.8, "scale_factor": 1.140 }, // guessed - { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095 - { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066 - { "aperture": 2.5, "scale_factor": 1.050 }, // guessed - { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348 - { "aperture": 3.2, "scale_factor": 1.000 }, // - { "aperture": 3.5, "scale_factor": 1.000 } // + { "aperture": 3.2, "scale_factor": 1.000 } // ] } }, { // Quality A, only one scaling factor missing and guessed safely, EOS 700D not tested but available samples look same as 650D - "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS 700D", "Canon EOS Rebel T5i" ], + "make_model": [ "Canon EOS 650D", "Canon EOS Rebel T4i", "Canon EOS Kiss X6i", "Canon EOS 700D", "Canon EOS Rebel T5i", "Canon EOS Kiss X7i" ], "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], "ranges": { "white": [ @@ -826,14 +845,13 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { "aperture": 2.2, "scale_factor": 1.025 }, // 13921/13583 { "aperture": 2.5, "scale_factor": 1.020 }, // { "aperture": 2.8, "scale_factor": 1.000 }, // - { "aperture": 3.2, "scale_factor": 1.000 }, // - { "aperture": 3.5, "scale_factor": 1.000 } // + { "aperture": 3.2, "scale_factor": 1.000 } // ] } }, { // Quality C, aperture scale factors and intermediate ISOs missing but safely guessed - "make_model": [ "Canon EOS 750D", "Canon EOS Rebel T6i", "Canon EOS 760D", "Canon EOS Rebel T6s" ], + "make_model": [ "Canon EOS 750D", "Canon EOS Rebel T6i", "Canon EOS Kiss X8i", "Canon EOS 760D", "Canon EOS Rebel T6s", "Canon EOS 8000D" ], "dcraw_matrix": [ 6362,-823,-847,-4426,12109,2616,-743,1857,5635 ], // dng_v9.0 d65 "raw_crop": [ 72, 34, 6024, 4022 ], // full size 6096x4056, official crop 84,46,6083,4045 "masked_areas": [ 40, 16, 4000, 54 ], @@ -861,6 +879,38 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, +// Canon Low End DSLRs +// Canon EOS 1200D/Rebel T5/Kiss X70" is upper at the same item as 600D/T3i/X5 + + { // Quality B, integer ISOs measured, intermediate ISO samples missing, + // scaling factors safely guessed to be same as 1200D .. + "make_model": [ "Canon EOS 1300D", "Canon EOS Rebel T6", "Canon EOS Kiss X80" ], + "dcraw_matrix": [ 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 ], // Dcraw 9.27 + "ranges": { + "white": [ + { "iso": [ 100, 125 ], "levels": 13480 }, // typical 13584 + { "iso": [ 160, 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12550 }, // typical 12650 + { "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400, 8000, 12800 ], "levels": 15200 } // typical 15303 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: no scale factors known for f/1.2 and f/1.0 (had no lenses to test with), but the + typical 12650 white levels maxes out at "white_max" for f/1.4 and below anyway. */ + { "aperture": 1.4, "scale_factor": 1.290 }, // guessed from 60D data + { "aperture": 1.6, "scale_factor": 1.190 }, // guessed + { "aperture": 1.8, "scale_factor": 1.140 }, // guessed + { "aperture": 2.0, "scale_factor": 1.090 }, // 12293/11222 = 1.095 + { "aperture": 2.2, "scale_factor": 1.060 }, // 11971/11222 = 1.066 + { "aperture": 2.5, "scale_factor": 1.050 }, // guessed + { "aperture": 2.8, "scale_factor": 1.030 }, // iso100: 14042/13584=1.0336 - iso200 15820/15303 = 1.0348 + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + +// Canon Mirrorless with Interchangable Lens + { // Quality B, missing scaling factors are guessed safely from 650D relative data "make_model": "Canon EOS M", "dcraw_matrix": [ 6602,-841,-939,-4472,12458,2247,-975,2039,6148 ], @@ -920,6 +970,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, + { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed "make_model": "Canon EOS M3", "dcraw_matrix": [ 6362,-823,-847,-4426,12109,2616,-743,1857,5635 ], // DNG_V8.8 D65 @@ -947,33 +998,16 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, - { // Quality C, White Levels not properly indicated, aperture scaling..missing scaling factors are guessed - "make_model": "Canon EOS 80D", - "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // DNG_V9.5 D65 - "raw_crop": [ 264, 34, 6024, 4022 ], // full size 6288x4056, official crop 276,46,6275,4045 - "masked_areas": [ 40, 96, 4000, 260 ], - "ranges": { - "white": [ - { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243 - { "iso": [ 160 ], "levels": 13000 }, // nominal 13097, - { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415 - { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150 - { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000 - ], - "white_max": 16383, - "aperture_scaling": [ - /* note: need for more data to properly fill all scale factors */ - { "aperture": 1.4, "scale_factor": 1.200 }, // guessed - { "aperture": 1.6, "scale_factor": 1.080 }, // guessed - { "aperture": 1.8, "scale_factor": 1.055 }, // guessed - { "aperture": 2.0, "scale_factor": 1.030 }, // guessed - { "aperture": 2.2, "scale_factor": 1.025 }, // guessed - { "aperture": 2.5, "scale_factor": 1.020 }, // guessed - { "aperture": 2.8, "scale_factor": 1.000 }, // - { "aperture": 3.2, "scale_factor": 1.000 }, // - { "aperture": 3.5, "scale_factor": 1.000 } // - ] - } + +// Canon Powershot + + { // Quality C, CHDK DNGs, raw frame corrections, experimental infrared support commented out + "make_model": "Canon PowerShot A480", + "dcraw_matrix": [ 8275,-2905,-1261,-128,5305,505,52,482,2450 ], // DNG_CHDK_V1.3.0 Daylight + // "dcraw_matrix": [ 15906,-7425,-2014,-2010,5554,264,404,-265,2706 ], // Infrared guessed + "raw_crop": [ 6, 12, 3684, 2760 ], // full size 3720X2772, official Canon crop 3648x2736 + "masked_areas": [ 12, 3694, 2760, 3716 ], // only left side optically black area is considered + "ranges": { "white": 4080 } }, { // Quality B, experimental infrared support commented out @@ -984,17 +1018,17 @@ Quality X: unknown, ie we knowing to little about the camera properties to know // "dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed "ranges": { "white": 4080 } }, - { // Quality C, experimental infrared support commented out - "make_model": "Canon PowerShot A480", - "dcraw_matrix": [ 8275,-2905,-1261,-128,5305,505,52,482,2450 ], // DNG_CHDK_V1.3.0 Daylight - // "dcraw_matrix": [ 15906,-7425,-2014,-2010,5554,264,404,-265,2706 ], // Infrared guessed - "raw_crop": [ 6, 12, 3684, 2760 ], // full size 3720X2772, official Canon crop 3648x2736 - "masked_areas": [ 12, 3694, 2760, 3716 ], // only left side optically black area is considered - "ranges": { "white": 4080 } + + { // Quality A, changes for raw crop which is optimistic in Dcraw + "make_model": "Canon PowerShot G12", + "dcraw_matrix": [ 13244,-5501,-1248,-1508,9858,1935,-270,1083,4366 ], + // "raw_crop": [ 62, 18, 3666, 2748 ],// max usable + "raw_crop": [ 68, 20, 3656, 2744 ],// equal to official Canon frame, 72,24,3719,2759 = 3648x2736 + "masked_areas": [ 24, 40, 2770, 44 ],// as declared in maker data + "ranges": { "white": 4080 } // }, - - { /* Quality B, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion, + { /* Quality B, needs a way to auto apply 3/2 or 4/3 crops (read exif tags ..) to work better with auto distortion, for the moment just comment-uncomment the desired raw crop */ "make_model": "Canon PowerShot G1 X Mark II", "dcraw_matrix": [ 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 ], // D65 matrix from adobe dcp @@ -1006,6 +1040,14 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 16300 } }, + { // Quality B, + "make_model": "Canon PowerShot G3 X", + "dcraw_matrix": [ 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 ], // DNG_V9.1.1 D65 + "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 + "masked_areas": [ 40, 4, 3680, 76 ], + "ranges": { "white": 16300 } + }, + { // Quality B, "make_model": "Canon PowerShot G7 X", "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 @@ -1014,18 +1056,11 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "masked_areas": [ 40, 4, 3680, 76 ], "ranges": { "white": 4080 } }, - { // Quality B, - "make_model": [ "Canon PowerShot G9 X", "Canon PowerShot G5 X" ], - "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 - // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 - "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 - "masked_areas": [ 40, 4, 3680, 76 ], - "ranges": { "white": 16300 } - }, { // Quality B, - "make_model": "Canon PowerShot G3 X", - "dcraw_matrix": [ 9701,-3857,-921,-3149,11537,1817,-786,1817,5147 ], // DNG_V9.1.1 D65 + "make_model": [ "Canon PowerShot G5 X", "Canon PowerShot G9 X" ], + "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 + // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 "masked_areas": [ 40, 4, 3680, 76 ], "ranges": { "white": 16300 } @@ -1039,15 +1074,6 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 4050 } }, - { // Quality A, changes for raw crop which is optimistic in Dcraw - "make_model": "Canon PowerShot G12", - "dcraw_matrix": [ 13244,-5501,-1248,-1508,9858,1935,-270,1083,4366 ], - // "raw_crop": [ 62, 18, 3666, 2748 ],// max usable - "raw_crop": [ 68, 20, 3656, 2744 ],// equal to official Canon frame, 72,24,3719,2759 = 3648x2736 - "masked_areas": [ 24, 40, 2770, 44 ],// as declared in maker data - "ranges": { "white": 4080 } // - }, - { // Quality B "make_model": "Canon PowerShot SX60 HS", "dcraw_matrix": [ 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 ], // DNG_V8.7 D65 @@ -1086,12 +1112,19 @@ Quality X: unknown, ie we knowing to little about the camera properties to know // "raw_crop": [ 4, 0, 4936, 3296 ], // full raw 4992,3296, fuji official 4936,3296 - experimental crop "ranges": { "white": 16100 } }, + { // Quality B "make_model": "FUJIFILM X-E2S", "dcraw_matrix": [ 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 ], // DNG_v9.4 D65 "ranges": { "white": 16100 } }, + { // Quality B + "make_model": "FUJIFILM X-PRO1", + "dcraw_matrix": [ 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 ], // DNG_v9.4 D65 + "ranges": { "white": 4080 } + }, + { // Quality B "make_model": "FUJIFILM X-PRO2", "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 @@ -1110,6 +1143,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 ], // DNG_v8.8 D65 "ranges": { "white": 4040 } }, + { // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG "make_model": "LEICA Q (Typ 116)", "dcraw_matrix": [ 10068,-4043,-1068,-5319,14268,1044,-765,1701,6522 ], // DCP D65 @@ -1154,6 +1188,9 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 4080 } // BL autodetected from exif }, +// For all Nikon Dslrs which have multiple bitdepth options (14 and 12 bit) we define the 14-bit value and RT adapts it to 12-bit +// when a 12-bit bitdepth is detected (WL12 = WL14*4095/16383) + { // quality B, samples by Johan Thor at RT.Issues, measures at long exposures with LENR are missing // but a safety margin is included - aperture scaling makes no significant difference "make_model": "Nikon D3S", @@ -1219,22 +1256,22 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety }, - { // Quality B, aperture scaling used to scale WL at safer levels + { // Quality B "make_model": "Nikon D5300", "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65 - "ranges": { "white": 16300 } // attention.. WL value is for 14-bit files, has to be 4070 for 12-bit files. WL typical 16383 set to 16300 for safety + "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety }, - { // Quality B, aperture scaling used to scale WL at safer levels + { // Quality B "make_model": "Nikon D5500", "dcraw_matrix": [ 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 ], // adobe dng_v9.0 d65 - "ranges": { "white": 16300 } // attention.. WL value is for 14-bit files, has to be 4070 for 12-bit files. WL typical 16383 set to 16300 for safety + "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety }, - { // Quality B, color matrix from DNG_v9.0 instead of internal Dcraw_v9.25_r1.475, + { // Quality B "make_model": "Nikon D7200", "dcraw_matrix": [ 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 ], // adobe dng_v9.0 d65 - "ranges": { "white": 16300 } // attention.. WL values are for 14-bit files, has to be WL4070 for 12-bit files. WL typical 16383 set to 16300 for safety, + "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety, }, { // quality B, samples by joachip at RT forums, are measures at long exposures with LongExposureNoiseReduction @@ -1252,12 +1289,12 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ], "white_max": 16383 } - }, - { // quality B, lacks WL measures at intermediate ISOs (160-250-320 ..) and measures at long exposures with LongExposureNoiseReduction + }, + { // quality B, missing WL measures at intermediate ISOs (160-250-320 ..) and at long exposures with LongExposureNoiseReduction set to ON // aperture scaling known to exist, but little to gain as the levels are so close to white_max "make_model": "Nikon D610", "dcraw_matrix": [ 8178,-2245,-609,-4857,12394,2776,-1207,2086,7298 ], // dcp d65 - "raw_crop": [ 0, 0, 6034, 4028 ], // Dcraw has no raw crop for D610 + "raw_crop": [ 0, 0, 6034, 4028 ], "ranges": { "white": [ { "iso": [ 50, 100 ], "levels": [ 15800, 15700, 15800 ] }, // typical G1/G2 15778, R/B 15879 lowered to 15700, 15800 for possible WL distribution under LENR @@ -1267,25 +1304,24 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ], "white_max": 16383 } - }, + }, - { // quality B; Data from RusselCottrell at RT forums. sensor is not uniform + { // quality B; Data from RusselCottrell at RT forums. sensor is not uniform "make_model": "Nikon D700", "dcraw_matrix": [ 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 ], - // "dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illum a - // "raw_crop": [ 1400, 600, 1600, 1600 ], // experimental - Dcraw 2 0 4284 2844, + // "dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illuminant A "ranges": { "white": [ 15500, 15500, 15500 ] } - // Non linearities start at 15750 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 - // white 15750 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15750*4095/16383=3936 - }, + // Non linearities start at 15500 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 + // white 15500 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15750*4095/16383=3936 + }, - { // Quality B, + { // Quality B, "make_model": "Nikon D750", "dcraw_matrix": [ 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 ], // adobe dcp d65 DNGv8.7 - "ranges": { "white": 16300 } // attention.. WL values are for 14-bit files, has to be WL4070 for 12-bit files. WL typical 16383 set to 16300 for safety - }, + "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. TypicalWL 16383 set to 16300 for safety + }, - { // quality B; Data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop + { // quality B; Data from RussellCottrell at RT forums. Largest aperture scale factor is 1.013, about 1/50th of a stop "make_model": "Nikon D800E", "dcraw_matrix": [ 7866,-2108,-555,-4869,12483,2681,-1176,2069,7501 ], // D800/D800E from dcraw.c "ranges": { @@ -1295,17 +1331,18 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { "iso": [ 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 16300 } // 16383 ] } - }, - { // quality B, WL set at 16300 from nominal 16380 for possible non linearities with LENR + }, + { // quality B, WL set at 16300 from nominal 16380 for possible non linearities with LENR "make_model": "Nikon D810", "dcraw_matrix": [ 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 ], // dcp_v8.6 d65 "raw_crop": [ 0, 0, 7380, 4928 ], // Official raw crop 7380x4928, - "ranges": { "white": 16300 } // WL 16300 is for 14-bit raws, for 12-bit files RT auto calculates the correct WL. Typical WL at 16383 + "ranges": { "white": 16300 } // WL values for 14-bit files, RT auto adapts it for 12-bit files. Typical WL at 16383 }, + { // Quality b, 16Mp and 64Mp raw frames "make_model": "OLYMPUS E-M5MarkII", "dcraw_matrix": [ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 ], // DNG_v8.8 D65 - "raw_crop": [ 0, 0, -6, -6 ], // largest valid, full 64Mp 9280x6938, official crop 0 0 9216 6912 - safe 5755 + "raw_crop": [ 0, 0, -6, -6 ], // largest valid, full 64Mp 9280x6938, official crop 0 0 9216 6912 "ranges": { "white": [ { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956 @@ -1317,7 +1354,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { // Quality B, 20Mp and 80Mp raw frames "make_model": "OLYMPUS PEN-F", "dcraw_matrix": [ 9476,-3182,-765,-2613,10958,1893,-449,1315,5268 ], // dng_v9.5 D65 - // "raw_crop": [ 0, 0, 10372, -7780 ], // largest valid, full 80Mp 10400X7796, official crop 10 10 10368 7776 - + // "raw_crop": [ 0, 0, 10372, -7780 ], // Highres mode largest valid, full 80Mp 10400X7796, official crop 10 10 10368 7776 "ranges": { "white": [ { "iso": [ 100, 200 ], "levels": 3950 }, // normal 4080-4095, HR Dpreview 4047, IR 3956 @@ -1358,15 +1395,15 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093 }, - /* since Dcraw_v9.21 Panasonic base BL is read from exif (tags 0x001c BlackLevelRed15 is BL offstet. - Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue + /* since Dcraw_v9.21 Panasonic base BL is read from exif (tags 0x001c BlackLevelRed15 is BL offset. + Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue and we define here the needed offset of around 15. The total BL is base+offset */ { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 .. "make_model": [ "Panasonic DMC-CM1", "Panasonic DMC-CM10" ], "dcraw_matrix": [ 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 ], // dcp_v8.7 d65 "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100 { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095 @@ -1378,20 +1415,20 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { // Quality A , replicated from rawimage.cc "make_model": "Panasonic DMC-FZ150", "dcraw_matrix": [ 10435,-3208,-72,-2293,10506,2067,-486,1725,4682 ], // RT, copy from custom dcp d55 - "ranges": { "black": 15, "white": 4050 } // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset }, { // Quality Β, "make_model": [ "Panasonic DMC-FZ300", "Panasonic DMC-FZ330" ], "dcraw_matrix": [ 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 ], // DNG-V9.1.1 - "ranges": { "black": 15, "white": 4050 } // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset }, { // Quality A, samples by helices at Rt forums "make_model": [ "Panasonic DMC-FZ1000", "Leica V-LUX (Typ 114)" ], "dcraw_matrix": [ 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 ], // dcp_v8.6 d65 "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100 { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095 @@ -1399,11 +1436,12 @@ Quality X: unknown, ie we knowing to little about the camera properties to know ] } }, - { // Quality A, samples by helices at Rt forums + { // Quality A, samples by helices at Rt forums and Chris Power at github "make_model": [ "Panasonic DMC-ZS100", "Panasonic DMC-ZS110", "Panasonic DMC-TZ100", "Panasonic DMC-TZ101", "Panasonic DMC-TZ110", "Panasonic DMC-TX1" ], "dcraw_matrix": [ 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 ], // dcp_v8.6 d65 + "raw_crop": [ 4, 4, -4, -4 ], // full raw frame 5488x3664 exif crop 5472X3648 with 8pixel borders. Set the borders at 4 pixels which added with RT's 4 pixels border gives exactly the official frame. "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 80, "levels": 3600 }, // exif:3277 distribution peak at 3700 up to +/- 100 { "iso": [ 100, 125, 200, 400, 800, 1600 ], "levels": 4050 }, // exif 4095 distribution 4050-4095 @@ -1414,13 +1452,13 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { // Quality A "make_model": [ "Panasonic DMC-LF1", "Leica C (Typ 112)" ], "dcraw_matrix": [ 9379,-3267,-816,-3227,11560,1881,-926,1928,5340 ], - "ranges": { "black": 15, "white": 4050 } // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset }, { // Quality A "make_model": [ "Panasonic DMC-TZ60", "Panasonic DMC-TZ61", "Panasonic DMC-ZS40", "Panasonic DMC-ZS41" ], "dcraw_matrix": [ 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 ], // matrix from Adobe dcp v8.4 "raw_crop": [ 8, 8, -8, -8 ], // crop according to exif 4896 X 3672 plus 4 pixels borders. RT's frame gets smaller than Dcraw but works better with auto distortion - "ranges": { "black": 14, "white": 4050 } // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "ranges": { "black": 14, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset }, { // Quality B, "make_model": [ "Panasonic DMC-TZ70", "Panasonic DMC-TZ71", "Panasonic DMC-ZS50", "Panasonic DMC-ZS51" ], @@ -1446,7 +1484,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-G1", "dcraw_matrix": [ 7477,-1615,-651,-5016,12769,2506,-1380,2475,7240 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // exif:4095 distribution peak at 3977 +/- up to 50 { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070 @@ -1457,21 +1495,21 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-G3", "dcraw_matrix": [ 6051,-1406,-671,-4015,11505,2868,-1654,2667,6219 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": 4060 } // exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR }, { // Quality A, Replicated from rawimage.cc "make_model": "Panasonic DMC-G5", "dcraw_matrix": [ 7122,-2092,-419,-4643,11769,3283,-1363,2413,5944 ], // RT "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": 4060 } // exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR }, { // Quality A, Replicated from rawimage.cc "make_model": "Panasonic DMC-GF1", "dcraw_matrix": [ 7863,-2080,-668,-4623,12331,2578,-1020,2066,7266 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": [ 100, 200, 400, 800 ], "levels": 3920 }, // exif:4095 distribution peak at 3977 +/- up to 50 { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070 @@ -1483,21 +1521,21 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GF2", "dcraw_matrix": [ 7694,-1791,-745,-4917,12818,2332,-1221,2322,7197 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": 4050 } // exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR }, { // Quality A, Replicated from rawimage.cc "make_model": "Panasonic DMC-GF3", "dcraw_matrix": [ 8074,-1846,-861,-5026,12999,2239,-1320,2375,7422 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": 4050 } // exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR }, { // Quality A, Replicated from rawimage.cc "make_model": "Panasonic DMC-GH1", "dcraw_matrix": [ 6360,-1557,-375,-4201,11504,3086,-1378,2518,5843 ], // Colin Walker "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // exif:4095 distribution peak at 3982 +/- up to 50 { "iso": [ 1600, 3200 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070 @@ -1509,7 +1547,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know // "dcraw_matrix": [ 6855,-1765,-456,-4223,11600,2996,-1450,2602,5761 ], // Colin Walker - disabled due to problems with underwater "dcraw_matrix": [ 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 ], // Dcraw d65 "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": [ 100, 200, 400, 800 ], "levels": 3930 }, // exif:4095 distribution peak at 3982 +/- up to 50 { "iso": [ 1600, 3200, 6400, 12800 ], "levels": 4060 } // exif 4095, histogram peak 4095 and distribution down to 4070 @@ -1521,7 +1559,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GH3", "dcraw_matrix": [ 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 ], // dcp d65 "ranges": { - "black": 16, // 16 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 125, "levels": 3500 }, // gaussian 3600-4095 { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 @@ -1533,7 +1571,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GH4", "dcraw_matrix": [ 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 ], // dng_v8.5 d65 "ranges": { - "black": 16, // 16 is BL offstet. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 100, "levels": 2700 }, // gaussian center at 2870-2920 range +/- 150, exif 2111 { "iso": 125, "levels": 3100 }, // guessed @@ -1546,7 +1584,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GM1", "dcraw_matrix": [ 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 ], "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 125, "levels": 3100 }, // bell shape 3150-3650 - exif 2616 { "iso": 160, "levels": 3600 }, // guessed from relative GX7 data @@ -1559,7 +1597,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GM5", "dcraw_matrix": [ 8238,-3244,-679,-3921,11814,2384,-836,2022,5852 ], // dng_v8.7 d65 "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 100, "levels": 2800 }, // bell shape 2850-3250 - exif 2111 { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 @@ -1570,7 +1608,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": [ "Panasonic DMC-GX7", "Panasonic DMC-GF7", "Panasonic DMC-GF8" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], "ranges": { - "black": 15, // 15 is BL offstet. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 15 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 125, "levels": 3100 }, { "iso": 160, "levels": 3600 }, @@ -1583,7 +1621,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70", "Panasonic DMC-GX80", "Panasonic DMC-GX85" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.1 D65 "ranges": { - "black": 16, // 16 is BL offset. Dcraw/RT read the BLbase from exif and calculates total BL = BLbase+BLoffset + "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111 { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626 @@ -1595,7 +1633,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "make_model": "Panasonic DMC-GX8", "dcraw_matrix": [ 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 ], // DNG_v9.1.1 D65 "ranges": { - "black": 15, // 16 is BL offstet. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset + "black": 15, // 16 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset "white": [ { "iso": 100, "levels": 2800 }, // gaussian 2900-3200 exif_linearitylimit 2111 { "iso": 125, "levels": 3180 }, // guessed gaussian 3200-3600 exif_linearitylimit 2626 @@ -1608,7 +1646,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "dcraw_matrix": [ 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 ], // DNG_V8.7 d65 // "dcraw_matrix": [ 6538,-1614,-549,-5475,13096,2646,-1780,2799,5612 ], // calculated from DxO D50 "ranges": { - "black": 15, // 15 is BL offset calculated from exif data. + "black": 15, // 15 is BL offset. Dcraw/RT read the base BL from exif and calculates total BL = BLbase+BLoffset. "white": [ { "iso": 100, "levels": 2300 }, // gaussian 2400-2700 exif_linearitylimit 2111 { "iso": [ 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 From 9fccdd6ca539ffaa3c9520d6f7ff9fe8aa8a7279 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Mon, 30 May 2016 23:47:13 +0200 Subject: [PATCH 074/232] Automatically disable Auto-Fill when enabling LCP Disortion Correction, #1791 --- rtgui/lensgeom.cc | 16 ++++++++++++++++ rtgui/lensgeom.h | 1 + rtgui/lensprofile.cc | 10 ++++++++++ rtgui/lensprofile.h | 3 +++ rtgui/toolpanelcoord.cc | 1 + 5 files changed, 31 insertions(+) diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index 69c4737bc..d50a16f45 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -113,3 +113,19 @@ void LensGeometry::setBatchMode (bool batchMode) ToolPanel::setBatchMode (batchMode); removeIfThere (this, autoCrop); } + +void LensGeometry::disableAutoFillIfActive () +{ + + if (!batchMode) { + if (fill->get_active()) { + fillConn.block (true); + fill->set_active(false); + if (listener) { + listener->panelChanged (EvTransAutoFill, M("GENERAL_DISABLED")); + } + fillConn.block (false); + } + } + +} diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index f6b41b632..fe21feb6a 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -53,6 +53,7 @@ public: { rlistener = l; } + void disableAutoFillIfActive (); }; #endif diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index eda3992c3..5555d6dd7 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -142,6 +142,10 @@ void LensProfilePanel::write( rtengine::procparams::ProcParams* pp, ParamsEdited void LensProfilePanel::onLCPFileChanged() { + + // Disable Auto-Fill when enabling LCP Distortion Correction, #1791 + lensgeomLcpFill->disableAutoFillIfActive(); + lcpFileChanged = true; updateDisabled(lcpStore->isValidLCPFileName(fcbLCPFile->get_filename())); @@ -164,6 +168,12 @@ void LensProfilePanel::onLCPFileReset() void LensProfilePanel::onUseDistChanged() { + + // Disable Auto-Fill when enabling LCP Distortion Correction, #1791 + if (ckbUseDist->get_active()) { + lensgeomLcpFill->disableAutoFillIfActive(); + } + useDistChanged = true; if (listener) { diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 0397388d5..23d02b9a2 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -22,6 +22,7 @@ #include #include "toolpanel.h" #include "guiutils.h" +#include "lensgeom.h" class LensProfilePanel : public ToolParamBlock, public FoldableToolPanel { @@ -38,6 +39,7 @@ protected: void updateDisabled(bool enable); bool allowFocusDep; bool isRaw; + LensGeometry *lensgeomLcpFill; public: @@ -52,6 +54,7 @@ public: void onUseDistChanged(); void onUseVignChanged(); void onUseCAChanged(); + void setLensGeomRef( LensGeometry *foo) { lensgeomLcpFill = foo ;}; }; #endif diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index a9f78273e..a13073018 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -53,6 +53,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), editDataProvider(n colortoning = Gtk::manage (new ColorToning ()); lensgeom = Gtk::manage (new LensGeometry ()); lensProf = Gtk::manage (new LensProfilePanel ()); + lensProf->setLensGeomRef(lensgeom); distortion = Gtk::manage (new Distortion ()); rotate = Gtk::manage (new Rotate ()); vibrance = Gtk::manage (new Vibrance ()); From da86b8154ace0d21b746008ff0ae8b402a964c0c Mon Sep 17 00:00:00 2001 From: Pat David Date: Mon, 30 May 2016 21:43:06 -0500 Subject: [PATCH 075/232] Fix minor spelling & capitalization --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9dfd4c324..e90807b73 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RawTherapee is a powerful, cross-platform raw photo processing program, released ## Target audience -Rawtherapee is a [libre software](https://en.wikipedia.org/wiki/Free_software) designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who whish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere. +RawTherapee is a [libre software](https://en.wikipedia.org/wiki/Free_software) designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere. Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software. From b31225672ae3120cd976e24df8d3ce353320654c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 31 May 2016 23:47:01 +0200 Subject: [PATCH 076/232] Some new improvements to speed of curve generation (mainly to speedup thumb processing in file browser) --- rtengine/curves.cc | 139 +++++++++++++++------------------- rtengine/curves.h | 9 +-- rtengine/dcrop.cc | 2 +- rtengine/diagonalcurves.cc | 2 +- rtengine/improccoordinator.cc | 34 ++------- rtengine/improccoordinator.h | 3 +- rtengine/improcfun.cc | 2 +- rtengine/improcfun.h | 2 +- rtengine/rtthumbnail.cc | 19 ++--- rtengine/simpleprocess.cc | 19 ++--- 10 files changed, 88 insertions(+), 143 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index a5214e451..95185c4c8 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -212,7 +212,7 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints if (!curvePoints3.empty() && curvePoints3[0] > DCT_Linear && curvePoints3[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePoints3, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogramC /*&& histogramCropped*/) { + if (outBeforeCCurveHistogramC) { histogramC.compressTo(outBeforeCCurveHistogramC, 48000); } @@ -227,7 +227,7 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints if (!curvePoints2.empty() && curvePoints2[0] > DCT_Linear && curvePoints2[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogram /*&& histogramCropped*/) { + if (outBeforeCCurveHistogram) { histNeeded = true; } @@ -243,7 +243,7 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints if (!curvePoints1.empty() && curvePoints1[0] > DCT_Linear && curvePoints1[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePoints1, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogram /*&& histogramCropped*/) { + if (outBeforeCCurveHistogram) { histNeeded = true; } @@ -261,11 +261,8 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip) { + const float gamma_ = Color::sRGBGammaCurve; - constexpr float mul = 1.055; - constexpr float add = 0.055; - const float start = expf(gamma_ * logf( -add / ((1.0 / gamma_ - 1.0) * mul ))); - const float slope = mul * powf (start, 1.0 / gamma_ - 1) - add / start; outBeforeCCurveHistogrambw.clear(); bool histNeeded = false; @@ -275,12 +272,12 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std if (!curvePointsbw2.empty() && curvePointsbw2[0] > DCT_Linear && curvePointsbw2[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePointsbw2, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogrambw /*&& histogramCropped*/) { + if (outBeforeCCurveHistogrambw) { histNeeded = true; } if (!tcurve.isIdentity()) { - customToneCurvebw2.Set(tcurve, gamma_, start, slope, mul, add); + customToneCurvebw2.Set(tcurve, gamma_); } } @@ -290,12 +287,12 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std if (!curvePointsbw.empty() && curvePointsbw[0] > DCT_Linear && curvePointsbw[0] < DCT_Unchanged) { DiagonalCurve tcurve(curvePointsbw, CURVES_MIN_POLY_POINTS / skip); - if (outBeforeCCurveHistogrambw /*&& histogramCropped*/) { + if (outBeforeCCurveHistogrambw ) { histNeeded = true; } if (!tcurve.isIdentity()) { - customToneCurvebw1.Set(tcurve, gamma_, start, slope, mul, add); + customToneCurvebw1.Set(tcurve, gamma_); } } @@ -309,19 +306,18 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std // add curve Lab : C=f(L) void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip) { - bool needed = false; + clcutili = false; std::unique_ptr dCurve; if (!clcurvePoints.empty() && clcurvePoints[0] != 0) { dCurve = std::unique_ptr(new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { - needed = true; clcutili = true; } } - fillCurveArray(dCurve.get(), clCurve, skip, needed); + fillCurveArray(dCurve.get(), clCurve, skip, clcutili); } void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram) @@ -415,93 +411,68 @@ void CurveFactory::curveToning ( const std::vector& curvePoints, LUTf & //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void CurveFactory::complexsgnCurve (float adjustr, bool & autili, bool & butili, bool & ccutili, bool & cclutili, double saturation, double rstprotection, +void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutili, bool & cclutili, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, - const LUTu & histogramC, const LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, //for chroma int skip) { - bool needed = false; + autili = butili = ccutili = cclutili = false; std::unique_ptr dCurve; - int k = 48000; //32768*1.41 // create a curve if needed if (!acurvePoints.empty() && acurvePoints[0] != 0) { dCurve = std::unique_ptr(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { - needed = true; autili = true; } } - fillCurveArray(dCurve.get(), aoutCurve, skip, needed); + fillCurveArray(dCurve.get(), aoutCurve, skip, autili); dCurve = nullptr; //----------------------------------------------------- - needed = false; - if (!bcurvePoints.empty() && bcurvePoints[0] != 0) { dCurve = std::unique_ptr(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip)); if (dCurve && !dCurve->isIdentity()) { - needed = true; butili = true; } } - fillCurveArray(dCurve.get(), boutCurve, skip, needed); + fillCurveArray(dCurve.get(), boutCurve, skip, butili); dCurve = nullptr; //----------------------------------------------- - needed = false; - - if (outBeforeCCurveHistogram) { - outBeforeCCurveHistogram.clear(); - } if (!cccurvePoints.empty() && cccurvePoints[0] != 0) { dCurve = std::unique_ptr(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip)); - if (outBeforeCCurveHistogram) { - histogramC.compressTo(outBeforeCCurveHistogram, k * adjustr); - } - if (dCurve && !dCurve->isIdentity()) { - needed = true; ccutili = true; } } - fillCurveArray(dCurve.get(), satCurve, skip, needed); + fillCurveArray(dCurve.get(), satCurve, skip, ccutili); dCurve = nullptr; //---------------------------- - needed = false; - - if (outBeforeLCurveHistogram) { - outBeforeLCurveHistogram.clear(); - } if (!lccurvePoints.empty() && lccurvePoints[0] != 0) { dCurve = std::unique_ptr(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip)); - if (outBeforeLCurveHistogram) { - histogramLC.compressTo(outBeforeLCurveHistogram, k * adjustr); - } - if (dCurve && !dCurve->isIdentity()) { - needed = true; cclutili = true; } } - fillCurveArray(dCurve.get(), lhskCurve, skip, needed); + fillCurveArray(dCurve.get(), lhskCurve, skip, cclutili); + } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -512,7 +483,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double double shcompr, double br, double contr, procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, - LUTu & histogram, LUTu & histogramCropped, + LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & customToneCurve1, @@ -624,6 +595,7 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double } + // curve without contrast LUTf dcurve(0x10000); @@ -633,9 +605,9 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double float val = 1.f / 65535.f; float val2 = simplebasecurve (val, black, 0.015 * shcompr); shCurve[0] = CLIPD(val2) / val; - val = 0.0; // gamma correction - val = gamma (val, gamma_, start, slope, mul, add); + + val = Color::gammatab_srgb[0] / 65535.f; // apply brightness curve if (brightcurve) { @@ -645,26 +617,22 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double // store result in a temporary array dcurve[0] = CLIPD(val); -#ifdef _OPENMP - #pragma omp parallel for -#endif - for (int i = 1; i < 0x10000; i++) { float val = i / 65535.f; float val2 = simplebasecurve (val, black, 0.015 * shcompr); - shCurve[i] = CLIPD(val2) / val; + shCurve[i] = val2 / val; // gamma correction - val = gamma (val, gamma_, start, slope, mul, add); + val = Color::gammatab_srgb[i] / 65535.f; // apply brightness curve if (brightcurve) { - val = brightcurve->getVal (val); // TODO: getVal(double) is very slow! Optimize with a LUTf + val = CLIPD(brightcurve->getVal (val)); // TODO: getVal(double) is very slow! Optimize with a LUTf } // store result in a temporary array - dcurve[i] = CLIPD(val); + dcurve[i] = val; } brightcurve = nullptr; @@ -711,7 +679,6 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double for (int i = 0; i <= 0xffff; i++) { dcurve[i] = contrastcurve.getVal (dcurve[i]); } - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -724,10 +691,10 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double const DiagonalCurve tcurve(curvePoints2, CURVES_MIN_POLY_POINTS / skip); if (!tcurve.isIdentity()) { - customToneCurve2.Set(tcurve, gamma_, start, slope, mul, add); + customToneCurve2.Set(tcurve, gamma_); } - if (outBeforeCCurveHistogram /*&& histogramCropped*/) { + if (outBeforeCCurveHistogram ) { histNeeded = true; } } @@ -743,10 +710,10 @@ SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double const DiagonalCurve tcurve(curvePoints, CURVES_MIN_POLY_POINTS / skip); if (!tcurve.isIdentity()) { - customToneCurve1.Set(tcurve, gamma_, start, slope, mul, add); + customToneCurve1.Set(tcurve, gamma_); } - if (outBeforeCCurveHistogram /*&& histogramCropped*/) { + if (outBeforeCCurveHistogram) { histNeeded = true; } } @@ -797,9 +764,8 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (dcurve[i]); + val = tcurve->getVal (outCurve[i]); outCurve[i] = (32767.f * val); } } else { + // Skip the slow getval method if no curve is used (or an identity curve) // L values go up to 32767, last stop is for highlight overflow - for (int i = 0; i < 32768; i++) { - if (histNeeded) { - float hval = dcurve[i]; - int hi = (int)(255.f * hval); - outBeforeCCurveHistogram[hi] += histogram/*Cropped*/[i] ; - } - - outCurve[i] = 32767.f * dcurve[i]; + if(histNeeded) { + histogram.compressTo(outBeforeCCurveHistogram, 32768, outCurve); } + + outCurve *= 32767.f; + } for (int i = 32768; i < 32770; i++) { // set last two elements of lut to 32768 and 32769 to allow linear interpolation outCurve[i] = (float)i; } + } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1065,7 +1030,7 @@ void ToneCurve::Reset() } // Fill a LUT with X/Y, ranged 0xffff -void ToneCurve::Set(const Curve &pCurve, float gamma, float start, float slope, float mul, float add) +void ToneCurve::Set(const Curve &pCurve, float gamma) { lutToneCurve(65536); @@ -1073,7 +1038,21 @@ void ToneCurve::Set(const Curve &pCurve, float gamma, float start, float slope, for (int i = 0; i < 65536; i++) { lutToneCurve[i] = (float)pCurve.getVal(float(i) / 65535.f) * 65535.f; } + } else if(gamma == (float)Color::sRGBGammaCurve) { + // for sRGB gamma we can use luts, which is much faster + for (int i = 0; i < 65536; i++) { + float val = Color::gammatab_srgb[i] / 65535.f; + val = pCurve.getVal(val); + val = Color::igammatab_srgb[val * 65535.f]; + lutToneCurve[i] = val; + } + } else { + const float start = expf(gamma * logf( -0.055 / ((1.0 / gamma - 1.0) * 1.055 ))); + const float slope = 1.055 * powf (start, 1.0 / gamma - 1) - 0.055 / start; + const float mul = 1.055; + const float add = 0.055; + // apply gamma, that is 'pCurve' is defined with the given gamma and here we convert it to a curve in linear space for (int i = 0; i < 65536; i++) { float val = float(i) / 65535.f; diff --git a/rtengine/curves.h b/rtengine/curves.h index d5e1412eb..64bf3ed1a 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -278,9 +278,7 @@ public: public: static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, - - LUTu & histogram, LUTu & histogramCropped, - LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, + LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, int skip = 1); static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw, @@ -294,9 +292,8 @@ public: static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip); - static void complexsgnCurve ( float adjustr, bool & autili, bool & butili, bool & ccutili, bool & clcutili, double saturation, double rstprotection, const std::vector& acurvePoints, + static void complexsgnCurve ( bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve, - const LUTu & histogramC, const LUTu & histogramLC, LUTu & outBeforeCCurveHistogram, LUTu & outBeforeLCurveHistogram, ///for chroma int skip = 1); static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili); @@ -465,7 +462,7 @@ public: virtual ~ToneCurve() {}; void Reset(); - void Set(const Curve &pCurve, float gamma = 0, float start = 0, float slope = 0, float mul = 0, float add = 0); + void Set(const Curve &pCurve, float gamma = 0); operator bool (void) const { return lutToneCurve; diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 27104bde2..ca502b753 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -814,7 +814,7 @@ void Crop::update (int todo) LUTu dummy; int moderetinex; // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); - parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); + parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); parent->ipf.vibrance (labnCrop); if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 19c662c0b..a5505391e 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -340,7 +340,7 @@ double DiagonalCurve::getVal (double t) const // get the hash table entry by rounding the value (previously multiplied by "hashSize") unsigned short int i = (unsigned short int)(t * hashSize); - if (i > (hashSize + 1)) { + if (UNLIKELY(i > (hashSize + 1))) { //printf("\nOVERFLOW: hash #%d is used while seeking for value %.8f, corresponding polygon's point #%d (out of %d point) x value: %.8f\n\n", i, t, hash.at(i), poly_x.size(), poly_x[hash.at(i)]); printf("\nOVERFLOW: hash #%d is used while seeking for value %.8f\n\n", i, t); return t; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 4e099dc5c..2cdd389af 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -57,9 +57,7 @@ ImProcCoordinator::ImProcCoordinator () lhist16CAM(65536), lhist16CCAM(65536), lhist16RETI(65536), - histCropped(65536), - lhist16Clad(65536), - lhist16LClad(65536), lhist16LLClad(65536), + lhist16LClad(65536), histRed(256), histRedRaw(256), histGreen(256), histGreenRaw(256), histBlue(256), histBlueRaw(256), @@ -443,7 +441,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2, - vhist16, histCropped, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, scale == 1 ? 1 : 1); + vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, scale == 1 ? 1 : 1); CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, scale == 1 ? 1 : 1); CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, scale == 1 ? 1 : 1); @@ -591,35 +589,15 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) #endif lhist16 += lhist16thr; } - utili = false; CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, lhist16, lumacurve, histLCurve, scale == 1 ? 1 : 16, utili); } if (todo & M_LUMACURVE) { - autili = false; - butili = false; - ccutili = false; - cclutili = false; - clcutili = false; CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); - float adjustr = 1.0f; - - /* if (params.icm.working=="ProPhoto") {adjustr = adjustbg = 1.2f;}// 1.2 instead 1.0 because it's very rare to have C>170.. - else if (params.icm.working=="Adobe RGB") {adjustr = 1.8f; adjustbg = 1.4f;} - else if (params.icm.working=="sRGB") {adjustr = 2.0f; adjustbg = 1.7f;} - else if (params.icm.working=="WideGamut") {adjustr = adjustbg = 1.2f;} - else if (params.icm.working=="Beta RGB") {adjustr = adjustbg = 1.4f;} - else if (params.icm.working=="BestRGB") {adjustr = adjustbg = 1.4f;} - else if (params.icm.working=="BruceRGB") {adjustr = 1.8f; adjustbg = 1.5f;} - */ - - lhist16LLClad.clear(); - lhist16Clad.clear(); - CurveFactory::complexsgnCurve (adjustr, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, - params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, - lhist16Clad, lhist16LLClad, histCCurve, histLLCurve, scale == 1 ? 1 : 16); + CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, + params.labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, scale == 1 ? 1 : 16); } if (todo & (M_LUMINANCE + M_COLOR) ) { @@ -627,7 +605,9 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) progress ("Applying Color Boost...", 100 * readyphase / numofphases); // ipf.MSR(nprevl, nprevl->W, nprevl->H, 1); - ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLLCurve, histLCurve); + histCCurve.clear(); + histLCurve.clear(); + ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); ipf.vibrance(nprevl); if((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index d394f942c..428fe4922 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -110,8 +110,7 @@ protected: LUTu lhist16CAM; LUTu lhist16CCAM; LUTu lhist16RETI; - LUTu histCropped; - LUTu lhist16Clad, lhist16CLlad, lhist16LClad, lhist16LLClad; + LUTu lhist16CLlad, lhist16LClad; LUTu histRed, histRedRaw; LUTu histGreen, histGreenRaw; LUTu histBlue, histBlueRaw; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index ae7d370f3..42c1c27b6 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5383,7 +5383,7 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur -SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLLCurve, LUTu &histLCurve) +SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { int W = lold->W; int H = lold->H; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ea64ce4ab..20cac3325 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -254,7 +254,7 @@ public: void ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, int scalecd, int rtt); - void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve, LUTu &histLurve); + void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve); void vibrance (LabImage* lab);//Jacques' vibrance void colorCurve (LabImage* lold, LabImage* lnew); void sharpening (LabImage* lab, float** buffer, SharpeningParams &sharpenParam); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 15ceee77d..4399f7f49 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1001,7 +1001,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei params.toneCurve.shcompr, bright, contr, params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2, - hist16, dummy, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16); + hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16); LUTf rCurve; LUTf gCurve; @@ -1100,23 +1100,18 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei // luminance processing // ipf.EPDToneMap(labView,0,6); - bool utili = false; + bool utili; CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 16, utili); - bool clcutili = false; + bool clcutili; CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 16); - bool autili = false; - bool butili = false; - bool ccutili = false; - bool cclutili = false; - CurveFactory::complexsgnCurve (1.f, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, - params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, - dummy, dummy, dummy, dummy, - 16); + bool autili, butili, ccutili, cclutili; + CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, + params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, 16); - ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); + ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); ipf.vibrance(labView); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 951d0e6cc..1bf832bc0 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -791,7 +791,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2, - hist16, dummy, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 ); + hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 ); CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 1); @@ -915,22 +915,17 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } } - bool utili = false; + bool utili; CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, hist16, lumacurve, dummy, 1, utili); - bool clcutili = false; + bool clcutili; CurveFactory::curveCL(clcutili, params.labCurve.clcurve, clcurve, 1); - bool autili = false; - bool butili = false; - bool ccutili = false; - bool cclutili = false; - CurveFactory::complexsgnCurve (1.f, autili, butili, ccutili, cclutili, params.labCurve.chromaticity, params.labCurve.rstprotection, - params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve, - dummy, dummy, dummy, dummy, - 1); + bool autili, butili, 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); - ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy); + ipf.chromiLuminanceCurve (NULL, 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); From c63cd8dd76cbba86b3e818850ac4b876b4c66f7b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 1 Jun 2016 22:30:48 +0200 Subject: [PATCH 077/232] Apply white balance for thumbnails in float precision => more accurate and also faster than before with int precision --- rtengine/rtthumbnail.cc | 71 +++++++++++++---------------------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 4399f7f49..7cbd558de 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -37,7 +37,7 @@ #include "../rtgui/ppversion.h" #include "improccoordinator.h" #include -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" @@ -721,7 +721,6 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati void Thumbnail::init () { - RawImageSource::inverse33 (colorMatrix, iColorMatrix); //colorMatrix is rgb_cam memset (cam2xyz, 0, sizeof(cam2xyz)); @@ -831,24 +830,16 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei gm = camwbGreen / gm; bm = camwbBlue / bm; double mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - double logDefGain = log(defGain) / log(2.0); - int rmi, gmi, bmi; - // Since HL recovery is not rendered in thumbs -// if (!isRaw || !params.toneCurve.hrenabled) { - logDefGain = 0.0; - rmi = 1024.0 * rm * defGain / mul_lum; - gmi = 1024.0 * gm * defGain / mul_lum; - bmi = 1024.0 * bm * defGain / mul_lum; - /* } - else { - rmi = 1024.0 * rm / mul_lum; - gmi = 1024.0 * gm / mul_lum; - bmi = 1024.0 * bm / mul_lum; - }*/ + double logDefGain = 0.0; + float rmi, gmi, bmi; + + rmi = rm * defGain / mul_lum; + gmi = gm * defGain / mul_lum; + bmi = bm * defGain / mul_lum; // The RAW exposure is not reflected since it's done in preprocessing. If we only have e.g. the chached thumb, // that is already preprocessed. So we simulate the effect here roughly my modifying the exposure accordingly - if (isRaw && fabs(1.0 - params.raw.expos) > 0.001) { + if (isRaw) { rmi *= params.raw.expos; gmi *= params.raw.expos; bmi *= params.raw.expos; @@ -864,6 +855,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei rwidth = int(size_t(thumbImg->width) * size_t(rheight) / size_t(thumbImg->height)); } + Imagefloat* baseImg = resizeTo(rwidth, rheight, interp, thumbImg); if (params.coarse.rotate) { @@ -880,51 +872,34 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei baseImg->vflip (); } + // apply white balance and raw white point (simulated) - int val; - unsigned short val_; - - for (int i = 0; i < rheight; i++) + for (int i = 0; i < rheight; i++) { +#ifdef _OPENMP + #pragma omp simd +#endif for (int j = 0; j < rwidth; j++) { + float red = baseImg->r(i, j) * rmi; + baseImg->r(i, j) = CLIP(red); + float green = baseImg->g(i, j) * gmi; + baseImg->g(i, j) = CLIP(green); + float blue = baseImg->b(i, j) * bmi; + baseImg->b(i, j) = CLIP(blue); - baseImg->convertTo(baseImg->r(i, j), val_); - val = static_cast(val_) * rmi >> 10; - baseImg->r(i, j) = CLIP(val); - - baseImg->convertTo(baseImg->g(i, j), val_); - val = static_cast(val_) * gmi >> 10; - baseImg->g(i, j) = CLIP(val); - - baseImg->convertTo(baseImg->b(i, j), val_); - val = static_cast(val_) * bmi >> 10; - baseImg->b(i, j) = CLIP(val); } - - /* - // apply highlight recovery, if needed -- CURRENTLY BROKEN DUE TO INCOMPATIBLE DATA TYPES, BUT HL RECOVERY AREN'T COMPUTED FOR THUMBNAILS ANYWAY... - if (isRaw && params.toneCurve.hrenabled) { - int maxval = 65535 / defGain; - if (params.toneCurve.method=="Luminance" || params.toneCurve.method=="Color") - for (int i=0; ir[i], baseImg->g[i], baseImg->b[i], baseImg->r[i], baseImg->g[i], baseImg->b[i], rwidth, maxval); - else if (params.toneCurve.method=="CIELab blending") { - double icamToD50[3][3]; - RawImageSource::inverse33 (cam2xyz, icamToD50); - for (int i=0; ir[i], baseImg->g[i], baseImg->b[i], baseImg->r[i], baseImg->g[i], baseImg->b[i], rwidth, maxval, cam2xyz, icamToD50); - } - } - */ + } // if luma denoise has to be done for thumbnails, it should be right here // perform color space transformation + if (isRaw) { double pre_mul[3] = { redMultiplier, greenMultiplier, blueMultiplier }; RawImageSource::colorSpaceConversion (baseImg, params.icm, currWB, pre_mul, embProfile, camProfile, cam2xyz, camName ); } else { StdImageSource::colorSpaceConversion (baseImg, params.icm, embProfile, thumbImg->getSampleFormat()); } + int fw = baseImg->width; int fh = baseImg->height; //ColorTemp::CAT02 (baseImg, ¶ms) ;//perhaps not good! From f885b17439ca9ea15842f5a54b82e4974f21c9e7 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 2 Jun 2016 15:25:08 +0200 Subject: [PATCH 078/232] Small speedup for bilinear resize (used for thumbnails) --- rtengine/iimage.h | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index e7dd5865d..1f82ea3e6 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -818,33 +818,21 @@ public: } } } else if (interp == TI_Bilinear) { - for (int i = 0; i < nh; i++) { - int sy = i * height / nh; + float heightByNh = float(height) / float(nh); + float widthByNw = float(width) / float(nw); + float syf = 0.f; - if (sy >= height) { - sy = height - 1; - } + for (int i = 0; i < nh; i++, syf += heightByNh) { + int sy = syf; + float dy = syf - float(sy); + int ny = sy < height - 1 ? sy + 1 : sy; - float dy = float(i) * float(height) / float(nh) - float(sy); - int ny = sy + 1; + float sxf = 0.f; - if (ny >= height) { - ny = sy; - } - - for (int j = 0; j < nw; j++) { - int sx = j * width / nw; - - if (sx >= width) { - sx = width; - } - - float dx = float(j) * float(width) / float(nw) - float(sx); - int nx = sx + 1; - - if (nx >= width) { - nx = sx; - } + for (int j = 0; j < nw; j++, sxf += widthByNw) { + int sx = sxf; + float dx = sxf - float(sx); + int nx = sx < width - 1 ? sx + 1 : sx; convertTo(r(sy, sx) * (1.f - dx) * (1.f - dy) + r(sy, nx)*dx * (1.f - dy) + r(ny, sx) * (1.f - dx)*dy + r(ny, nx)*dx * dy, imgPtr->r(i, j)); convertTo(g(sy, sx) * (1.f - dx) * (1.f - dy) + g(sy, nx)*dx * (1.f - dy) + g(ny, sx) * (1.f - dx)*dy + g(ny, nx)*dx * dy, imgPtr->g(i, j)); From ba534817502c7f02930efb567c6dd6f74cfe995a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 2 Jun 2016 18:15:55 +0200 Subject: [PATCH 079/232] Disable #pragma omp simd statement for clang builds, fixes #3324 --- rtengine/LUT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 76bcf0ccd..27b742a58 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -262,7 +262,7 @@ public: LUT & operator+=(LUT &rhs) { if (rhs.size == this->size) { -#ifdef _OPENMP +#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 #pragma omp simd #endif From d719dd385e5c1ef2cbf6d46843cda8423649263f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 2 Jun 2016 23:10:57 +0200 Subject: [PATCH 080/232] Fix possible issues when building with clang --- rtengine/LUT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 63b6dc08a..24f883766 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -250,7 +250,7 @@ public: template::value>::type> LUT & operator*=(float factor) { -#ifdef _OPENMP +#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 #pragma omp simd #endif @@ -265,7 +265,7 @@ public: template::value>::type> LUT & operator/=(float divisor) { -#ifdef _OPENMP +#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 #pragma omp simd #endif From 21b9b15e45667f1fa4fcf3a2a630a69f7e0278a1 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Fri, 3 Jun 2016 14:00:26 +0200 Subject: [PATCH 081/232] Applied Floessie's changes to prevent mutex lock issues, PR #3318 issue #1791 --- rtgui/lensgeom.cc | 28 ++++++++++++++++++++-------- rtgui/lensgeom.h | 7 ++++++- rtgui/myflatcurve.cc | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index d50a16f45..1d39ced42 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -43,6 +43,11 @@ LensGeometry::LensGeometry () : FoldableToolPanel(this, "lensgeom", M("TP_LENSGE show_all (); } +LensGeometry::~LensGeometry () +{ + g_idle_remove_by_data(this); +} + void LensGeometry::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -116,16 +121,23 @@ void LensGeometry::setBatchMode (bool batchMode) void LensGeometry::disableAutoFillIfActive () { + g_idle_add(doDisableAutoFillIfActive, this); +} - if (!batchMode) { - if (fill->get_active()) { - fillConn.block (true); - fill->set_active(false); - if (listener) { - listener->panelChanged (EvTransAutoFill, M("GENERAL_DISABLED")); +int LensGeometry::doDisableAutoFillIfActive (void* data) +{ + GThreadLock lock; // Is this really needed? + + LensGeometry* const instance = static_cast(data); + + if (!instance->batchMode) { + if (instance->fill->get_active()) { + instance->fillConn.block (true); + instance->fill->set_active(false); + if (instance->listener) { + instance->listener->panelChanged (EvTransAutoFill, M("GENERAL_DISABLED")); } - fillConn.block (false); + instance->fillConn.block (false); } } - } diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index fe21feb6a..51a6e108c 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -32,11 +32,12 @@ protected: Gtk::CheckButton* fill; bool lastFill; sigc::connection fillConn; - ToolParamBlock* packBox; + ToolParamBlock* packBox; public: LensGeometry (); + ~LensGeometry (); Gtk::Box* getPackBox () { @@ -54,6 +55,10 @@ public: rlistener = l; } void disableAutoFillIfActive (); + +private: + static int doDisableAutoFillIfActive (void* data); + }; #endif diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index fe53565d2..0bc3bd533 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -1807,6 +1807,7 @@ void MyFlatCurve::setPoints (const std::vector& p) stopNumericalAdjustment(); FlatCurveType t = (FlatCurveType)p[ix++]; curve.type = t; + lit_point = -1; if (t == FCT_MinMaxCPoints) { curve.x.clear (); From 8e3c9bfdafc48cc6c8681f95b8d66ffbd78a0394 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 4 Jun 2016 12:15:06 +0200 Subject: [PATCH 082/232] Fix broken dcp tonecurve and lookup table --- rtengine/imagesource.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 52949756c..958956c60 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -109,7 +109,7 @@ public: virtual ImageData* getImageData () = 0; virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW() const = 0; - virtual DCPProfile* getDCP(ColorManagementParams cmp, ColorTemp &wb) + virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb) { return NULL; }; From e2a670c99247922f580b5d27a7502cf26c3ab30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 4 Jun 2016 17:47:19 +0200 Subject: [PATCH 083/232] Fix missing return value in LensGeometry::doDisableAutoFillIfActive() This should fix #3328. --- rtgui/lensgeom.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index 1d39ced42..1218c0fec 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -140,4 +140,6 @@ int LensGeometry::doDisableAutoFillIfActive (void* data) instance->fillConn.block (false); } } + + return 0; } From a520c937753af1597ed01438400aa34569b376b7 Mon Sep 17 00:00:00 2001 From: Floessie Date: Sat, 4 Jun 2016 21:07:41 +0200 Subject: [PATCH 084/232] Add Ingo's patch for #3304 --- rtengine/dcp.cc | 52 +++++++++++++++++------------------ rtengine/dcp.h | 21 +++++++------- rtengine/dcrop.cc | 6 ++-- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 6 ++-- rtengine/improcfun.cc | 8 +++--- rtengine/improcfun.h | 4 +-- rtengine/rawimagesource.cc | 6 ++-- rtengine/rawimagesource.h | 2 +- rtengine/rtthumbnail.cc | 5 ++-- rtengine/simpleprocess.cc | 6 ++-- 11 files changed, 63 insertions(+), 55 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 89eec3773..8e695e42b 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1551,61 +1551,61 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us } } -void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure) +void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut) { - applyState.useToneCurve = useToneCurve; - applyState.applyLookTable = applyLookTable; - applyState.blScale = 1.0; + asOut.useToneCurve = useToneCurve; + asOut.applyLookTable = applyLookTable; + asOut.blScale = 1.0; if (!aLookTable) { - applyState.applyLookTable = false; + asOut.applyLookTable = false; } if (!hasToneCurve) { - applyState.useToneCurve = false; + asOut.useToneCurve = false; } if (hasBaselineExposureOffset && applyBaselineExposure) { - applyState.blScale = powf(2, baselineExposureOffset); + asOut.blScale = powf(2, baselineExposureOffset); } if (workingSpace == "ProPhoto") { - applyState.alreadyProPhoto = true; + asOut.alreadyProPhoto = true; } else { - applyState.alreadyProPhoto = false; + asOut.alreadyProPhoto = false; TMatrix mWork; mWork = iccStore->workingSpaceMatrix (workingSpace); - memset(applyState.m2ProPhoto, 0, sizeof(applyState.m2ProPhoto)); + memset(asOut.m2ProPhoto, 0, sizeof(asOut.m2ProPhoto)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { - applyState.m2ProPhoto[i][j] += prophoto_xyz[i][k] * mWork[k][j]; + asOut.m2ProPhoto[i][j] += prophoto_xyz[i][k] * mWork[k][j]; } mWork = iccStore->workingSpaceInverseMatrix (workingSpace); - memset(applyState.m2Work, 0, sizeof(applyState.m2Work)); + memset(asOut.m2Work, 0, sizeof(asOut.m2Work)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { - applyState.m2Work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; + asOut.m2Work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; } } } -void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int height, int tileWidth) const +void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int height, int tileWidth, const dcpApplyState &asIn) const { #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) #define CLIP01(a) ((a)>0?((a)<1?(a):1):0) float exp_scale = 1.0; - exp_scale *= applyState.blScale; + exp_scale *= asIn.blScale; - if (!applyState.useToneCurve && !applyState.applyLookTable) { + if (!asIn.useToneCurve && !asIn.applyLookTable) { if (exp_scale == 1.0) { return; } @@ -1632,14 +1632,14 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int float newr, newg, newb; - if (applyState.alreadyProPhoto) { + if (asIn.alreadyProPhoto) { newr = r; newg = g; newb = b; } else { - newr = applyState.m2ProPhoto[0][0] * r + applyState.m2ProPhoto[0][1] * g + applyState.m2ProPhoto[0][2] * b; - newg = applyState.m2ProPhoto[1][0] * r + applyState.m2ProPhoto[1][1] * g + applyState.m2ProPhoto[1][2] * b; - newb = applyState.m2ProPhoto[2][0] * r + applyState.m2ProPhoto[2][1] * g + applyState.m2ProPhoto[2][2] * b; + newr = asIn.m2ProPhoto[0][0] * r + asIn.m2ProPhoto[0][1] * g + asIn.m2ProPhoto[0][2] * b; + newg = asIn.m2ProPhoto[1][0] * r + asIn.m2ProPhoto[1][1] * g + asIn.m2ProPhoto[1][2] * b; + newb = asIn.m2ProPhoto[2][0] * r + asIn.m2ProPhoto[2][1] * g + asIn.m2ProPhoto[2][2] * b; } // with looktable and tonecurve we need to clip @@ -1647,7 +1647,7 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int newg = FCLIP(newg); newb = FCLIP(newb); - if (applyState.applyLookTable) { + if (asIn.applyLookTable) { float h, s, v; Color::rgb2hsv(newr, newg, newb, h, s, v); h *= 6.f; // RT calculates in [0,1] @@ -1669,18 +1669,18 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int Color::hsv2rgb( h, s, v, newr, newg, newb); } - if (applyState.useToneCurve) { + if (asIn.useToneCurve) { toneCurve.Apply(newr, newg, newb); } - if (applyState.alreadyProPhoto) { + if (asIn.alreadyProPhoto) { rc[y * tileWidth + x] = newr; gc[y * tileWidth + x] = newg; bc[y * tileWidth + x] = newb; } else { - rc[y * tileWidth + x] = applyState.m2Work[0][0] * newr + applyState.m2Work[0][1] * newg + applyState.m2Work[0][2] * newb; - gc[y * tileWidth + x] = applyState.m2Work[1][0] * newr + applyState.m2Work[1][1] * newg + applyState.m2Work[1][2] * newb; - bc[y * tileWidth + x] = applyState.m2Work[2][0] * newr + applyState.m2Work[2][1] * newg + applyState.m2Work[2][2] * newb; + rc[y * tileWidth + x] = asIn.m2Work[0][0] * newr + asIn.m2Work[0][1] * newg + asIn.m2Work[0][2] * newb; + gc[y * tileWidth + x] = asIn.m2Work[1][0] * newr + asIn.m2Work[1][1] * newg + asIn.m2Work[1][2] * newb; + bc[y * tileWidth + x] = asIn.m2Work[2][0] * newr + asIn.m2Work[2][1] * newg + asIn.m2Work[2][2] * newb; } } } diff --git a/rtengine/dcp.h b/rtengine/dcp.h index f20f3543c..4b70445b2 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -59,14 +59,6 @@ class DCPProfile short iLightSource1, iLightSource2; AdobeToneCurve toneCurve; - struct { - double m2ProPhoto[3][3]; - double m2Work[3][3]; - bool alreadyProPhoto; - bool useToneCurve; - bool applyLookTable; - float blScale; - } applyState; void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; @@ -76,6 +68,15 @@ class DCPProfile void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; public: + struct dcpApplyState{ + double m2ProPhoto[3][3]; + double m2Work[3][3]; + bool alreadyProPhoto; + bool useToneCurve; + bool applyLookTable; + float blScale; + }; + DCPProfile(const Glib::ustring &fname); ~DCPProfile(); @@ -103,8 +104,8 @@ public: willInterpolate_ = willInterpolate; }; void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; - void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure); - void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth) const; + void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut); + void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const dcpApplyState &asIn) const; }; class DCPStore diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index ca502b753..e7c26f378 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -773,11 +773,13 @@ void Crop::update (int todo) if (todo & M_RGBCURVE) { double rrm, ggm, bbm; - DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB); + DCPProfile::dcpApplyState as; + DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as); + parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, satLimit , satLimitOpacity, 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); + parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as); } /*xref=000;yref=000; diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 958956c60..a1dee831f 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -109,7 +109,7 @@ public: virtual ImageData* getImageData () = 0; virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW() const = 0; - virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb) + virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::dcpApplyState &as) { return NULL; }; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 268e8421a..0f23483b6 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -535,9 +535,11 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) double ggm = 33.; double bbm = 33.; - DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB); + DCPProfile::dcpApplyState as; + DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as); + ipf.rgbProc (oprevi, oprevl, NULL, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation, - rCurve, gCurve, bCurve, satLimit , satLimitOpacity, 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); + rCurve, gCurve, bCurve, satLimit , satLimitOpacity, 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); if(params.blackwhite.enabled && params.blackwhite.autoc && abwListener) { if (settings->verbose) { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b578b897a..a95d7a06a 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2947,15 +2947,15 @@ filmlike_clip(float *r, float *g, float *b) void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf ) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ) { - rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, shmap, sat, rCurve, gCurve, bCurve, satLimit , satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf); + rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, shmap, sat, rCurve, gCurve, bCurve, satLimit , satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn); } // Process RGB image and convert to LAB space void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ) { Imagefloat *tmpImage = nullptr; @@ -3428,7 +3428,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (dcpProf) { - dcpProf->step2ApplyTile(rtemp, gtemp, btemp, tW - jstart, tH - istart, TS); + dcpProf->step2ApplyTile(rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); } for (int i = istart, ti = 0; i < tH; i++, ti++) { diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 20cac3325..f1ac78d31 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -232,11 +232,11 @@ public: void updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent); void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf); + const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ); void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, - double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf); + double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ); void labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ); void toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect); void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 984925145..7085e315f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -889,7 +889,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } } -DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb,DCPProfile::dcpApplyState &as) { DCPProfile *dcpProf = NULL; cmsHPROFILE dummy; @@ -898,8 +898,8 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp & if (dcpProf == NULL) { return NULL; } - - dcpProf->setStep2ApplyState(cmp.working, cmp.toneCurve, cmp.applyLookTable, cmp.applyBaselineExposureOffset); + + dcpProf->setStep2ApplyState(cmp.working, cmp.toneCurve, cmp.applyLookTable, cmp.applyBaselineExposureOffset, as); return dcpProf; } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index ec14d14c1..ee62ea3ad 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -184,7 +184,7 @@ public: } void getAutoExpHistogram (LUTu & histogram, int& histcompr); void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); - DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb); + DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::dcpApplyState &as); void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 7cbd558de..2539ee8be 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1041,15 +1041,16 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LabImage* labView = new LabImage (fw, fh); DCPProfile *dcpProf = nullptr; + DCPProfile::dcpApplyState as; if (isRaw) { cmsHPROFILE dummy; RawImageSource::findInputProfile(params.icm.input, nullptr, camName, &dcpProf, dummy); if (dcpProf) { - dcpProf->setStep2ApplyState(params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset); + dcpProf->setStep2ApplyState(params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset, as); } } - ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, 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); + ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, 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); // freeing up some memory customToneCurve1.Reset(); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 018ef18e6..138482403 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -853,8 +853,10 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) - DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB); - ipf.rgbProc (baseImg, labView, NULL, curve1, curve2, curve, shmap, 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); + DCPProfile::dcpApplyState as; + DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as); + + ipf.rgbProc (baseImg, labView, NULL, curve1, curve2, curve, shmap, 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); if (settings->verbose) { printf("Output image / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", autor, autog, autob); From e0ca8ecdff0fce955aae705415c7dd17d3653265 Mon Sep 17 00:00:00 2001 From: Floessie Date: Sat, 4 Jun 2016 22:43:09 +0200 Subject: [PATCH 085/232] First round of cleanups for `rtengine/dcp.*` - Sorted functions and methods - Moved local functions to anonymous namespace - Slightly modernized local functions - Reworked `DCPStore` and fixed memory leak Still coming: - Rework `DCPProfile` --- rtengine/dcp.cc | 1702 +++++++++++++++++++----------------- rtengine/dcp.h | 127 ++- rtengine/init.cc | 2 +- rtengine/rawimagesource.cc | 8 +- rtgui/icmpanel.cc | 14 +- 5 files changed, 946 insertions(+), 907 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 8e695e42b..fb672cd34 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include #include #include "dcp.h" @@ -29,6 +30,9 @@ using namespace std; using namespace rtengine; using namespace rtexif; +namespace +{ + static const float adobe_camera_raw_default_curve[] = { 0.00000f, 0.00078f, 0.00160f, 0.00242f, 0.00314f, 0.00385f, 0.00460f, 0.00539f, @@ -289,41 +293,81 @@ static const float adobe_camera_raw_default_curve[] = { 1.00000f }; +struct ruvt { + double r; + double u; + double v; + double t; +}; + +static const ruvt kTempTable [] = { + { 0, 0.18006, 0.26352, -0.24341 }, + { 10, 0.18066, 0.26589, -0.25479 }, + { 20, 0.18133, 0.26846, -0.26876 }, + { 30, 0.18208, 0.27119, -0.28539 }, + { 40, 0.18293, 0.27407, -0.30470 }, + { 50, 0.18388, 0.27709, -0.32675 }, + { 60, 0.18494, 0.28021, -0.35156 }, + { 70, 0.18611, 0.28342, -0.37915 }, + { 80, 0.18740, 0.28668, -0.40955 }, + { 90, 0.18880, 0.28997, -0.44278 }, + { 100, 0.19032, 0.29326, -0.47888 }, + { 125, 0.19462, 0.30141, -0.58204 }, + { 150, 0.19962, 0.30921, -0.70471 }, + { 175, 0.20525, 0.31647, -0.84901 }, + { 200, 0.21142, 0.32312, -1.0182 }, + { 225, 0.21807, 0.32909, -1.2168 }, + { 250, 0.22511, 0.33439, -1.4512 }, + { 275, 0.23247, 0.33904, -1.7298 }, + { 300, 0.24010, 0.34308, -2.0637 }, + { 325, 0.24702, 0.34655, -2.4681 }, + { 350, 0.25591, 0.34951, -2.9641 }, + { 375, 0.26400, 0.35200, -3.5814 }, + { 400, 0.27218, 0.35407, -4.3633 }, + { 425, 0.28039, 0.35577, -5.3762 }, + { 450, 0.28863, 0.35714, -6.7262 }, + { 475, 0.29685, 0.35823, -8.5955 }, + { 500, 0.30505, 0.35907, -11.324 }, + { 525, 0.31320, 0.35968, -15.628 }, + { 550, 0.32129, 0.36011, -23.325 }, + { 575, 0.32931, 0.36038, -40.770 }, + { 600, 0.33724, 0.36051, -116.45 } +}; + // This sRGB gamma is taken from DNG reference code, with the added linear extension past 1.0, as we run clipless here -static float sRGBGammaForward (const float x) +float sRGBGammaForward(float x) { - if (x <= 0.0031308) { - return x * 12.92; - } else if (x > 1.0) { - return 1.0 + (x - 1.0) * (1.055 * (1.0 / 2.4)); // linear extension - } else { - return 1.055 * pow (x, 1.0 / 2.4) - 0.055; - } -} -static float sRGBGammaInverse (const float y) -{ - if (y <= 0.0031308 * 12.92) { - return y * (1.0 / 12.92); - } else if (y > 1.0) { - return 1.0 + (y - 1.0) / (1.055 * (1.0 / 2.4)); - } else { - return pow ((y + 0.055) * (1.0 / 1.055), 2.4); - } + return + x <= 0.0031308f + ? x * 12.92f + : x > 1.0f + ? 1.0f + (x - 1.0f) * (1.055f * (1.0f / 2.4f)) // Linear extension + : 1.055f * pow(x, 1.0f / 2.4f) - 0.055f; } -static void Invert3x3(const double (*A)[3], double (*B)[3]) +float sRGBGammaInverse(float y) { + return + y <= 0.0031308f * 12.92f + ? y * (1.0f / 12.92f) + : y > 1.0f + ? 1.0f + (y - 1.0f) / (1.055f * (1.0f / 2.4f)) + : pow ((y + 0.055f) * (1.0f / 1.055f), 2.4f); +} - double a00 = A[0][0]; - double a01 = A[0][1]; - double a02 = A[0][2]; - double a10 = A[1][0]; - double a11 = A[1][1]; - double a12 = A[1][2]; - double a20 = A[2][0]; - double a21 = A[2][1]; - double a22 = A[2][2]; - double temp [3][3]; +void invert3x3(const double (*A)[3], double (*B)[3]) +{ + const double& a00 = A[0][0]; + const double& a01 = A[0][1]; + const double& a02 = A[0][2]; + const double& a10 = A[1][0]; + const double& a11 = A[1][1]; + const double& a12 = A[1][2]; + const double& a20 = A[2][0]; + const double& a21 = A[2][1]; + const double& a22 = A[2][2]; + + double temp[3][3]; temp[0][0] = a11 * a22 - a21 * a12; temp[0][1] = a21 * a02 - a01 * a22; @@ -335,30 +379,29 @@ static void Invert3x3(const double (*A)[3], double (*B)[3]) temp[2][1] = a20 * a01 - a00 * a21; temp[2][2] = a00 * a11 - a10 * a01; - double det = a00 * temp[0][0] + a01 * temp[1][0] + a02 * temp[2][0]; + const double det = a00 * temp[0][0] + a01 * temp[1][0] + a02 * temp[2][0]; if (fabs(det) < 1.0E-10) { - abort(); // can't be inverted, we shouldn't be dealing with such matrices + abort(); // Can't be inverted, we shouldn't be dealing with such matrices } - for (int j = 0; j < 3; j++) { - for (int k = 0; k < 3; k++) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { B[j][k] = temp[j][k] / det; } } } -static void Multiply3x3(const double (*A)[3], const double (*B)[3], double (*C)[3]) +void multiply3x3(const double (*A)[3], const double (*B)[3], double (*C)[3]) { - - // use temp to support having output same as input + // Use temp to support having output same as input double M[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) { M[i][j] = 0; - for (int k = 0; k < 3; k++) { + for (int k = 0; k < 3; ++k) { M[i][j] += A[i][k] * B[k][j]; } } @@ -367,14 +410,13 @@ static void Multiply3x3(const double (*A)[3], const double (*B)[3], double (*C)[ memcpy(C, M, 3 * 3 * sizeof(double)); } -static void Multiply3x3_v3(const double (*A)[3], const double B[3], double C[3]) +void multiply3x3_v3(const double (*A)[3], const double B[3], double C[3]) { + // Use temp to support having output same as input + double M[3] = {}; - // use temp to support having output same as input - double M[3] = { 0, 0, 0 }; - - 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) { M[i] += A[i][j] * B[j]; } } @@ -382,13 +424,12 @@ static void Multiply3x3_v3(const double (*A)[3], const double B[3], double C[3]) memcpy(C, M, 3 * sizeof(double)); } -static void Mix3x3(const double (*A)[3], double mulA, const double (*B)[3], double mulB, double (*C)[3]) +void mix3x3(const double (*A)[3], double mulA, const double (*B)[3], double mulB, double (*C)[3]) { - double M[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) { M[i][j] = A[i][j] * mulA + B[i][j] * mulB; } } @@ -396,18 +437,21 @@ static void Mix3x3(const double (*A)[3], double mulA, const double (*B)[3], doub memcpy(C, M, 3 * 3 * sizeof(double)); } -static void MapWhiteMatrix(const double white1[3], const double white2[3], double (*B)[3]) +void mapWhiteMatrix(const double white1[3], const double white2[3], double (*B)[3]) { + // Code adapted from dng_color_spec::MapWhiteMatrix - // code adapted from dng_color_spec::MapWhiteMatrix - - // Use the linearized Bradford adaptation matrix. - double Mb[3][3] = { { 0.8951, 0.2664, -0.1614 }, { -0.7502, 1.7135, 0.0367 }, { 0.0389, -0.0685, 1.0296 }}; + // Use the linearized Bradford adaptation matrix + const double Mb[3][3] = { + { 0.8951, 0.2664, -0.1614 }, + { -0.7502, 1.7135, 0.0367 }, + { 0.0389, -0.0685, 1.0296 } + }; double w1[3]; - Multiply3x3_v3(Mb, white1, w1); + multiply3x3_v3(Mb, white1, w1); double w2[3]; - Multiply3x3_v3(Mb, white2, w2); + multiply3x3_v3(Mb, white2, w2); // Negative white coordinates are kind of meaningless. w1[0] = std::max(w1[0], 0.0); @@ -418,23 +462,24 @@ static void MapWhiteMatrix(const double white1[3], const double white2[3], doubl w2[2] = std::max(w2[2], 0.0); // Limit scaling to something reasonable. - double A[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + double A[3][3] = {}; A[0][0] = std::max(0.1, std::min(w1[0] > 0.0 ? w2[0] / w1[0] : 10.0, 10.0)); A[1][1] = std::max(0.1, std::min(w1[1] > 0.0 ? w2[1] / w1[1] : 10.0, 10.0)); A[2][2] = std::max(0.1, std::min(w1[2] > 0.0 ? w2[2] / w1[2] : 10.0, 10.0)); double temp[3][3]; - Invert3x3(Mb, temp); - Multiply3x3(temp, A, temp); - Multiply3x3(temp, Mb, B); + invert3x3(Mb, temp); + multiply3x3(temp, A, temp); + multiply3x3(temp, Mb, B); } -static void XYZtoXY(const double XYZ[3], double XY[2]) +void XYZtoXY(const double XYZ[3], double XY[2]) { - double X = XYZ[0]; - double Y = XYZ[1]; - double Z = XYZ[2]; - double total = X + Y + Z; + const double& X = XYZ[0]; + const double& Y = XYZ[1]; + const double& Z = XYZ[2]; + + const double total = X + Y + Z; if (total > 0.0) { XY[0] = X / total; @@ -445,9 +490,10 @@ static void XYZtoXY(const double XYZ[3], double XY[2]) } } -static void XYtoXYZ(const double XY[2], double XYZ[3]) +void XYtoXYZ(const double XY[2], double XYZ[3]) { double temp[2] = { XY[0], XY[1] }; + // Restrict xy coord to someplace inside the range of real xy coordinates. // This prevents math from doing strange things when users specify // extreme temperature/tint coordinates. @@ -465,352 +511,94 @@ static void XYtoXYZ(const double XY[2], double XYZ[3]) XYZ[2] = (1.0 - temp[0] - temp[1]) / temp[1]; } -enum dngCalibrationIlluminant { - lsUnknown = 0, - lsDaylight = 1, - lsFluorescent = 2, - lsTungsten = 3, - lsFlash = 4, - lsFineWeather = 9, - lsCloudyWeather = 10, - lsShade = 11, - lsDaylightFluorescent = 12, // D 5700 - 7100K - lsDayWhiteFluorescent = 13, // N 4600 - 5500K - lsCoolWhiteFluorescent = 14, // W 3800 - 4500K - lsWhiteFluorescent = 15, // WW 3250 - 3800K - lsWarmWhiteFluorescent = 16, // L 2600 - 3250K - lsStandardLightA = 17, - lsStandardLightB = 18, - lsStandardLightC = 19, - lsD55 = 20, - lsD65 = 21, - lsD75 = 22, - lsD50 = 23, - lsISOStudioTungsten = 24, - lsOther = 255 -}; - -// should probably be moved to colortemp.cc -static double calibrationIlluminantToTemperature(int light) +double calibrationIlluminantToTemperature(int light) { + enum class LightSource { + UNKNOWN = 0, + DAYLIGHT = 1, + FLUORESCENT = 2, + TUNGSTEN = 3, + FLASH = 4, + FINE_WEATHER = 9, + CLOUDY_WEATHER = 10, + SHADE = 11, + DAYLIGHT_FLUORESCENT = 12, // D 5700 - 7100K + DAYWHITE_FLUORESCENT = 13, // N 4600 - 5500K + COOL_WHITE_FLUORESCENT = 14, // W 3800 - 4500K + WHITE_FLUORESCENT = 15, // WW 3250 - 3800K + WARM_WHITE_FLUORESCENT = 16, // L 2600 - 3250K + STANDARD_LIGHT_A = 17, + STANDARD_LIGHT_B = 18, + STANDARD_LIGHT_C = 19, + D55 = 20, + D65 = 21, + D75 = 22, + D50 = 23, + ISO_STUDIO_TUNGSTEN = 24, + OTHER = 255 + }; - // these temperatures are those found in DNG SDK reference code. - switch (light) { - case lsStandardLightA: - case lsTungsten: - return 2850.0; - - case lsISOStudioTungsten: - return 3200.0; - - case lsD50: - return 5000.0; - - case lsD55: - case lsDaylight: - case lsFineWeather: - case lsFlash: - case lsStandardLightB: - return 5500.0; - - case lsD65: - case lsStandardLightC: - case lsCloudyWeather: - return 6500.0; - - case lsD75: - case lsShade: - return 7500.0; - - case lsDaylightFluorescent: - return (5700.0 + 7100.0) * 0.5; - - case lsDayWhiteFluorescent: - return (4600.0 + 5500.0) * 0.5; - - case lsCoolWhiteFluorescent: - case lsFluorescent: - return (3800.0 + 4500.0) * 0.5; - - case lsWhiteFluorescent: - return (3250.0 + 3800.0) * 0.5; - - case lsWarmWhiteFluorescent: - return (2600.0 + 3250.0) * 0.5; - - default: - return 0.0; - } -} -void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const -{ - // code adapted from dng_color_spec::FindXYZtoCamera - // note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support) - // we do not support cameracalibration either - - double neutral[3]; // same as the DNG "AsShotNeutral" tag if white balance is Camera's own - { - /* A bit messy matrixing and conversions to get the neutral[] array from RT's own white balance which is stored in - sRGB space, while the DCP code needs multipliers in CameraRGB space */ - double r, g, b; - wb.getMultipliers(r, g, b); - - // camWbMatrix == imatrices.xyz_cam - double cam_xyz[3][3]; - Invert3x3(camWbMatrix, cam_xyz); - double cam_rgb[3][3]; - Multiply3x3(cam_xyz, xyz_sRGB, cam_rgb); - double camwb_red = cam_rgb[0][0] * r + cam_rgb[0][1] * g + cam_rgb[0][2] * b; - double camwb_green = cam_rgb[1][0] * r + cam_rgb[1][1] * g + cam_rgb[1][2] * b; - double camwb_blue = cam_rgb[2][0] * r + cam_rgb[2][1] * g + cam_rgb[2][2] * b; - neutral[0] = camwb_red / pre_mul[0]; - neutral[1] = camwb_green / pre_mul[1]; - neutral[2] = camwb_blue / pre_mul[2]; - double maxentry = 0; - - for (int i = 0; i < 3; i++) { - if (neutral[i] > maxentry) { - maxentry = neutral[i]; - } + // These temperatures are those found in DNG SDK reference code + switch (LightSource(light)) { + case LightSource::STANDARD_LIGHT_A: + case LightSource::TUNGSTEN: { + return 2850.0; } - for (int i = 0; i < 3; i++) { - neutral[i] /= maxentry; - } - } - - /* Calculate what the RGB multipliers corresponds to as a white XY coordinate, based on the - DCP ColorMatrix or ColorMatrices if dual-illuminant. This is the DNG reference code way to - do it, which is a bit different from RT's own white balance model at the time of writing. - When RT's white balance can make use of the DCP color matrices we could use that instead. */ - double white_xy[2]; - dngref_NeutralToXY(neutral, preferredIlluminant, white_xy); - - bool hasFwd1 = hasForwardMatrix1; - bool hasFwd2 = hasForwardMatrix2; - bool hasCol1 = hasColorMatrix1; - bool hasCol2 = hasColorMatrix2; - - if (preferredIlluminant == 1) { - if (hasFwd1) { - hasFwd2 = false; + case LightSource::ISO_STUDIO_TUNGSTEN: { + return 3200.0; } - if (hasCol1) { - hasCol2 = false; - } - } else if (preferredIlluminant == 2) { - if (hasFwd2) { - hasFwd1 = false; + case LightSource::D50: { + return 5000.0; } - if (hasCol2) { - hasCol1 = false; - } - } - - // mix if we have two matrices - double mix = 1.0; - - if ((hasCol1 && hasCol2) || (hasFwd1 && hasFwd2)) { - double wbtemp; - /* DNG ref way to convert XY to temperature, which affect matrix mixing. A different model here - typically does not affect the result too much, ie it's probably not strictly necessary to - use the DNG reference code here, but we do it for now. */ - dngref_XYCoord2Temperature(white_xy, &wbtemp, NULL); - - if (wbtemp <= temperature1) { - mix = 1.0; - } else if (wbtemp >= temperature2) { - mix = 0.0; - } else { - double invT = 1.0 / wbtemp; - mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); - } - } - - // Colormatrix - double mCol[3][3]; - - if (hasCol1 && hasCol2) { - // interpolate - if (mix >= 1.0) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); - } else if (mix <= 0.0) { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); - } else { - Mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); - } - } else if (hasCol1) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); - } else { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); - } - - /* - The exact position of the white XY coordinate affects the result very much, thus - it's important that the result is very similar or the same as DNG reference code. - Especially important is it that the raw-embedded "AsShot" multipliers is translated - to the same white XY coordinate as the DNG reference code, or else third party DCPs - will show incorrect color. - */ - - double white_xyz[3]; - XYtoXYZ(white_xy, white_xyz); - - double cam_xyz[3][3]; - - if (hasFwd1 || hasFwd2) { - // always prefer ForwardMatrix ahead of ColorMatrix - double mFwd[3][3]; - - if (hasFwd1 && hasFwd2) { - // interpolate - if (mix >= 1.0) { - memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); - } else if (mix <= 0.0) { - memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); - } else { - Mix3x3(mForwardMatrix1, mix, mForwardMatrix2, 1.0 - mix, mFwd); - } - } else if (hasFwd1) { - memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); - } else { - memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); + case LightSource::D55: + case LightSource::DAYLIGHT: + case LightSource::FINE_WEATHER: + case LightSource::FLASH: + case LightSource::STANDARD_LIGHT_B: { + return 5500.0; } - // adapted from dng_color_spec::SetWhiteXY - double CameraWhite[3]; - Multiply3x3_v3(mCol, white_xyz, CameraWhite); - - double whiteDiag[3][3] = {{CameraWhite[0], 0, 0}, {0, CameraWhite[1], 0}, {0, 0, CameraWhite[2]}}; - double whiteDiagInv[3][3]; - Invert3x3(whiteDiag, whiteDiagInv); - - double xyz_cam[3][3]; - Multiply3x3(mFwd, whiteDiagInv, xyz_cam); - Invert3x3(xyz_cam, cam_xyz); - } else { - double whiteMatrix[3][3]; - const double white_d50[3] = { 0.3457, 0.3585, 0.2958 }; // D50 - MapWhiteMatrix(white_d50, white_xyz, whiteMatrix); - Multiply3x3(mCol, whiteMatrix, cam_xyz); - } - - // convert cam_xyz (XYZ D50 to CameraRGB, "PCS to Camera" in DNG terminology) to mXYZCAM - - { - // This block can probably be simplified, seems unnecessary to pass through the sRGB matrix - // (probably dcraw legacy), it does no harm though as we don't clip anything. - int i, j, k; - - // Multiply out XYZ colorspace - double cam_rgb[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; - - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - for (k = 0; k < 3; k++) { - cam_rgb[i][j] += cam_xyz[i][k] * xyz_sRGB[k][j]; - } - - // Normalize cam_rgb so that: cam_rgb * (1,1,1) is (1,1,1,1) - double num; - - for (i = 0; i < 3; i++) { - for (num = j = 0; j < 3; j++) { - num += cam_rgb[i][j]; - } - - for (j = 0; j < 3; j++) { - cam_rgb[i][j] /= num; - } + case LightSource::D65: + case LightSource::STANDARD_LIGHT_C: + case LightSource::CLOUDY_WEATHER: { + return 6500.0; } - double rgb_cam[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; - RawImageSource::inverse33 (cam_rgb, rgb_cam); + case LightSource::D75: + case LightSource::SHADE: { + return 7500.0; + } - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) { - mXYZCAM[i][j] = 0; - } + case LightSource::DAYLIGHT_FLUORESCENT: { + return (5700.0 + 7100.0) * 0.5; + } - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - for (k = 0; k < 3; k++) { - mXYZCAM[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; - } + case LightSource::DAYWHITE_FLUORESCENT: { + return (4600.0 + 5500.0) * 0.5; + } + + case LightSource::COOL_WHITE_FLUORESCENT: + case LightSource::FLUORESCENT: { + return (3800.0 + 4500.0) * 0.5; + } + + case LightSource::WHITE_FLUORESCENT: { + return (3250.0 + 3800.0) * 0.5; + } + + case LightSource::WARM_WHITE_FLUORESCENT: { + return (2600.0 + 3250.0) * 0.5; + } + + default: { + return 0.0; + } } } -const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const -{ - - *deleteHandle = NULL; - - if (!aDeltas1) { - return NULL; - } - - if (!aDeltas2) { - return aDeltas1; - } - - if (preferredIlluminant == 1) { - return aDeltas1; - } else if (preferredIlluminant == 2) { - return aDeltas2; - } - - // Interpolate based on color temperature. - if (temperature1 <= 0.0 || temperature2 <= 0.0 || temperature1 == temperature2) { - return aDeltas1; - } - - bool reverseOrder = temperature1 > temperature2; - double t1, t2; - - if (reverseOrder) { - t1 = temperature2; - t2 = temperature1; - } else { - t1 = temperature1; - t2 = temperature2; - } - - double mix; - - if (wb.getTemp() <= t1) { - mix = 1.0; - } else if (wb.getTemp() >= t2) { - mix = 0.0; - } else { - double invT = 1.0 / wb.getTemp(); - mix = (invT - (1.0 / t2)) / ((1.0 / t1) - (1.0 / t2)); - } - - if (reverseOrder) { - mix = 1.0 - mix; - } - - if (mix >= 1.0) { - return aDeltas1; - } else if (mix <= 0.0) { - return aDeltas2; - } - - // Interpolate between the tables. - HSBModify *aDeltas = new HSBModify[DeltaInfo.iArrayCount]; - *deleteHandle = aDeltas; - float w1 = (float)mix; - float w2 = 1.0f - (float)mix; - - for (int i = 0; i < DeltaInfo.iArrayCount; i++) { - aDeltas[i].fHueShift = w1 * aDeltas1[i].fHueShift + w2 * aDeltas2[i].fHueShift; - aDeltas[i].fSatScale = w1 * aDeltas1[i].fSatScale + w2 * aDeltas2[i].fSatScale; - aDeltas[i].fValScale = w1 * aDeltas1[i].fValScale + w2 * aDeltas2[i].fValScale; - } - - return aDeltas; } DCPProfile::DCPProfile(const Glib::ustring &fname) @@ -825,20 +613,20 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) const int TagProfileToneCurve = 50940, TagBaselineExposureOffset = 51109; const int TagProfileCopyright = 50942; - aDeltas1 = aDeltas2 = aLookTable = NULL; + aDeltas1 = aDeltas2 = aLookTable = nullptr; FILE *pFile = g_fopen(fname.c_str (), "rb"); TagDirectory *tagDir = ExifManager::parseTIFF(pFile, false); Tag* tag = tagDir->getTag(TagCalibrationIlluminant1); - iLightSource1 = (tag != NULL ? tag->toInt(0, rtexif::SHORT) : -1); + iLightSource1 = (tag != nullptr ? tag->toInt(0, rtexif::SHORT) : -1); tag = tagDir->getTag(TagCalibrationIlluminant2); - iLightSource2 = (tag != NULL ? tag->toInt(0, rtexif::SHORT) : -1); + iLightSource2 = (tag != nullptr ? tag->toInt(0, rtexif::SHORT) : -1); temperature1 = calibrationIlluminantToTemperature(iLightSource1); temperature2 = calibrationIlluminantToTemperature(iLightSource2); - bool hasSecondHueSat = tagDir->getTag(TagProfileHueSatMapData2) != NULL; // some profiles have two matrices, but just one huesat + bool hasSecondHueSat = tagDir->getTag(TagProfileHueSatMapData2) != nullptr; // some profiles have two matrices, but just one huesat // Fetch Forward Matrices, if any hasForwardMatrix1 = false; @@ -891,13 +679,13 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) tag = tagDir->getTag(TagProfileLookTableDims); - if (tag != NULL) { + if (tag != nullptr) { LookInfo.iHueDivisions = tag->toInt(0); LookInfo.iSatDivisions = tag->toInt(4); LookInfo.iValDivisions = tag->toInt(8); tag = tagDir->getTag(TagProfileLookTableEncoding); - LookInfo.sRGBGamma = tag != NULL && tag->toInt(0); + LookInfo.sRGBGamma = tag != nullptr && tag->toInt(0); tag = tagDir->getTag(TagProfileLookTableData); LookInfo.iArrayCount = tag->getCount() / 3; @@ -923,13 +711,13 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) tag = tagDir->getTag(TagProfileHueSatMapDims); - if (tag != NULL) { + if (tag != nullptr) { DeltaInfo.iHueDivisions = tag->toInt(0); DeltaInfo.iSatDivisions = tag->toInt(4); DeltaInfo.iValDivisions = tag->toInt(8); tag = tagDir->getTag(TagProfileHueSatMapEncoding); - DeltaInfo.sRGBGamma = tag != NULL && tag->toInt(0); + DeltaInfo.sRGBGamma = tag != nullptr && tag->toInt(0); tag = tagDir->getTag(TagProfileHueSatMapData1); DeltaInfo.iArrayCount = tag->getCount() / 3; @@ -959,7 +747,7 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { - mColorMatrix2[row][col] = (tag != NULL ? (float)tag->toDouble((col + row * 3) * 8) : mColorMatrix1[row][col]); + mColorMatrix2[row][col] = (tag != nullptr ? (float)tag->toDouble((col + row * 3) * 8) : mColorMatrix1[row][col]); } } @@ -988,7 +776,7 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) // Read tone curve points, if any, but disable to RTs own profiles tag = tagDir->getTag(TagProfileToneCurve); - if (tag != NULL) { + if (tag != nullptr) { std::vector cPoints; cPoints.push_back(double(DCT_Spline)); // The first value is the curve type @@ -1014,10 +802,10 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) toneCurve.Set(rawCurve); hasToneCurve = true; } - } else if (tag == NULL) { + } else if (tag == nullptr) { tag = tagDir->getTag(TagProfileCopyright); - if (tag != NULL && tag->valueToString().find("Adobe Systems") != std::string::npos) { + if (tag != nullptr && tag->valueToString().find("Adobe Systems") != std::string::npos) { // an Adobe profile without tone curve is expected to have the Adobe Default Curve, we add that std::vector cPoints; cPoints.push_back(double(DCT_Spline)); @@ -1062,7 +850,7 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) } } - if (pFile != NULL) { + if (pFile != nullptr) { fclose(pFile); } @@ -1076,363 +864,30 @@ DCPProfile::~DCPProfile() delete[] aLookTable; } -void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const +bool DCPProfile::getHasToneCurve() const { - - // Apply the HueSatMap. Ported from Adobes reference implementation - float hueShift, satScale, valScale; - float vEncoded = v; - - if (ti.iValDivisions < 2) { // Optimize most common case of "2.5D" table. - float hScaled = h * ti.pc.hScale; - float sScaled = s * ti.pc.sScale; - - int hIndex0 = max((int)hScaled, 0); - int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); - - int hIndex1 = hIndex0 + 1; - - if (hIndex0 >= ti.pc.maxHueIndex0) { - hIndex0 = ti.pc.maxHueIndex0; - hIndex1 = 0; - } - - float hFract1 = hScaled - (float) hIndex0; - float sFract1 = sScaled - (float) sIndex0; - - float hFract0 = 1.0f - hFract1; - float sFract0 = 1.0f - sFract1; - - const HSBModify *entry00 = tableBase + hIndex0 * ti.pc.hueStep + sIndex0; - const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; - - float hueShift0 = hFract0 * entry00->fHueShift + hFract1 * entry01->fHueShift; - float satScale0 = hFract0 * entry00->fSatScale + hFract1 * entry01->fSatScale; - float valScale0 = hFract0 * entry00->fValScale + hFract1 * entry01->fValScale; - - entry00++; - entry01++; - - float hueShift1 = hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift; - - float satScale1 = hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale; - - float valScale1 = hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale; - - hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; - satScale = sFract0 * satScale0 + sFract1 * satScale1; - valScale = sFract0 * valScale0 + sFract1 * valScale1; - - } else { - - float hScaled = h * ti.pc.hScale; - float sScaled = s * ti.pc.sScale; - - if (ti.sRGBGamma) { - vEncoded = sRGBGammaForward(v); - } - - float vScaled = vEncoded * ti.pc.vScale; - - int hIndex0 = (int) hScaled; - int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); - int vIndex0 = max(min((int)vScaled, ti.pc.maxValIndex0), 0); - - int hIndex1 = hIndex0 + 1; - - if (hIndex0 >= ti.pc.maxHueIndex0) { - hIndex0 = ti.pc.maxHueIndex0; - hIndex1 = 0; - } - - float hFract1 = hScaled - (float) hIndex0; - float sFract1 = sScaled - (float) sIndex0; - float vFract1 = vScaled - (float) vIndex0; - - float hFract0 = 1.0f - hFract1; - float sFract0 = 1.0f - sFract1; - float vFract0 = 1.0f - vFract1; - - const HSBModify *entry00 = tableBase + vIndex0 * ti.pc.valStep + hIndex0 * ti.pc.hueStep + sIndex0; - - const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; - - const HSBModify *entry10 = entry00 + ti.pc.valStep; - const HSBModify *entry11 = entry01 + ti.pc.valStep; - - float hueShift0 = vFract0 * (hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift) + - vFract1 * (hFract0 * entry10->fHueShift + - hFract1 * entry11->fHueShift); - - float satScale0 = vFract0 * (hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale) + - vFract1 * (hFract0 * entry10->fSatScale + - hFract1 * entry11->fSatScale); - - float valScale0 = vFract0 * (hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale) + - vFract1 * (hFract0 * entry10->fValScale + - hFract1 * entry11->fValScale); - - entry00++; - entry01++; - entry10++; - entry11++; - - float hueShift1 = vFract0 * (hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift) + - vFract1 * (hFract0 * entry10->fHueShift + - hFract1 * entry11->fHueShift); - - float satScale1 = vFract0 * (hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale) + - vFract1 * (hFract0 * entry10->fSatScale + - hFract1 * entry11->fSatScale); - - float valScale1 = vFract0 * (hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale) + - vFract1 * (hFract0 * entry10->fValScale + - hFract1 * entry11->fValScale); - - hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; - satScale = sFract0 * satScale0 + sFract1 * satScale1; - valScale = sFract0 * valScale0 + sFract1 * valScale1; - } - - hueShift *= (6.0f / 360.0f); // Convert to internal hue range. - - h += hueShift; - s *= satScale; // no clipping here, we are RT float :-) - - if (ti.sRGBGamma) { - v = sRGBGammaInverse(vEncoded * valScale); - } else { - v *= valScale; - } + return hasToneCurve; } - -struct ruvt { - double r; - double u; - double v; - double t; +bool DCPProfile::getHasLookTable() const +{ + return !!aLookTable; +} +bool DCPProfile::getHasHueSatMap() const +{ + return !!aDeltas1; +} +bool DCPProfile::getHasBaselineExposureOffset() const +{ + return hasBaselineExposureOffset; +} +void DCPProfile::getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const +{ + i1 = iLightSource1; + i2 = iLightSource2; + temp1 = temperature1, temp2 = temperature2; + willInterpolate_ = willInterpolate; }; -static const double kTintScale = -3000.0; -static const ruvt kTempTable [] = { - { 0, 0.18006, 0.26352, -0.24341 }, - { 10, 0.18066, 0.26589, -0.25479 }, - { 20, 0.18133, 0.26846, -0.26876 }, - { 30, 0.18208, 0.27119, -0.28539 }, - { 40, 0.18293, 0.27407, -0.30470 }, - { 50, 0.18388, 0.27709, -0.32675 }, - { 60, 0.18494, 0.28021, -0.35156 }, - { 70, 0.18611, 0.28342, -0.37915 }, - { 80, 0.18740, 0.28668, -0.40955 }, - { 90, 0.18880, 0.28997, -0.44278 }, - { 100, 0.19032, 0.29326, -0.47888 }, - { 125, 0.19462, 0.30141, -0.58204 }, - { 150, 0.19962, 0.30921, -0.70471 }, - { 175, 0.20525, 0.31647, -0.84901 }, - { 200, 0.21142, 0.32312, -1.0182 }, - { 225, 0.21807, 0.32909, -1.2168 }, - { 250, 0.22511, 0.33439, -1.4512 }, - { 275, 0.23247, 0.33904, -1.7298 }, - { 300, 0.24010, 0.34308, -2.0637 }, - { 325, 0.24702, 0.34655, -2.4681 }, - { 350, 0.25591, 0.34951, -2.9641 }, - { 375, 0.26400, 0.35200, -3.5814 }, - { 400, 0.27218, 0.35407, -4.3633 }, - { 425, 0.28039, 0.35577, -5.3762 }, - { 450, 0.28863, 0.35714, -6.7262 }, - { 475, 0.29685, 0.35823, -8.5955 }, - { 500, 0.30505, 0.35907, -11.324 }, - { 525, 0.31320, 0.35968, -15.628 }, - { 550, 0.32129, 0.36011, -23.325 }, - { 575, 0.32931, 0.36038, -40.770 }, - { 600, 0.33724, 0.36051, -116.45 } -}; - -void DCPProfile::dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const -{ - double fTemperature = 0; - double fTint = 0; - - // Convert to uv space. - double u = 2.0 * whiteXY[0] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); - double v = 3.0 * whiteXY[1] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); - - // Search for line pair coordinate is between. - double last_dt = 0.0; - double last_dv = 0.0; - double last_du = 0.0; - - for (uint32_t index = 1; index <= 30; index++) { - // Convert slope to delta-u and delta-v, with length 1. - double du = 1.0; - double dv = kTempTable [index] . t; - double len = sqrt (1.0 + dv * dv); - du /= len; - dv /= len; - - // Find delta from black body point to test coordinate. - double uu = u - kTempTable [index] . u; - double vv = v - kTempTable [index] . v; - - // Find distance above or below line. - double dt = - uu * dv + vv * du; - - // If below line, we have found line pair. - if (dt <= 0.0 || index == 30) { - // Find fractional weight of two lines. - if (dt > 0.0) { - dt = 0.0; - } - - dt = -dt; - double f; - - if (index == 1) { - f = 0.0; - } else { - f = dt / (last_dt + dt); - } - - // Interpolate the temperature. - fTemperature = 1.0E6 / (kTempTable [index - 1] . r * f + - kTempTable [index ] . r * (1.0 - f)); - - // Find delta from black body point to test coordinate. - uu = u - (kTempTable [index - 1] . u * f + - kTempTable [index ] . u * (1.0 - f)); - vv = v - (kTempTable [index - 1] . v * f + - kTempTable [index ] . v * (1.0 - f)); - // Interpolate vectors along slope. - du = du * (1.0 - f) + last_du * f; - dv = dv * (1.0 - f) + last_dv * f; - len = sqrt (du * du + dv * dv); - du /= len; - dv /= len; - - // Find distance along slope. - fTint = (uu * du + vv * dv) * kTintScale; - break; - } - - // Try next line pair. - last_dt = dt; - last_du = du; - last_dv = dv; - } - - if (temp != NULL) { - *temp = fTemperature; - } - - if (tint != NULL) { - *tint = fTint; - } -} - -void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const -{ - - bool hasCol1 = hasColorMatrix1; - bool hasCol2 = hasColorMatrix2; - - if (preferredIlluminant == 1) { - if (hasCol1) { - hasCol2 = false; - } - } else if (preferredIlluminant == 2) { - if (hasCol2) { - hasCol1 = false; - } - } - - // mix if we have two matrices - double mix; - - if (hasCol1 && hasCol2) { - double wbtemp; - /* - Note: we're using DNG SDK reference code for XY to temperature translation to get the exact same mix as - the reference code does. - */ - dngref_XYCoord2Temperature(whiteXY, &wbtemp, NULL); - - if (wbtemp <= temperature1) { - mix = 1.0; - } else if (wbtemp >= temperature2) { - mix = 0.0; - } else { - double invT = 1.0 / wbtemp; - mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); - } - } - - // Interpolate the color matrix. - double mCol[3][3]; - - if (hasCol1 && hasCol2) { - // interpolate - if (mix >= 1.0) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); - } else if (mix <= 0.0) { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); - } else { - Mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); - } - } else if (hasCol1) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); - } else { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); - } - - memcpy(xyzToCamera, mCol, sizeof(mCol)); -} - -void DCPProfile::dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const -{ - const int kMaxPasses = 30; - double lastXY[2] = { 0.3457, 0.3585 }; // D50 - - for (int pass = 0; pass < kMaxPasses; pass++) { - double xyzToCamera[3][3]; - dngref_FindXYZtoCamera(lastXY, preferredIlluminant, xyzToCamera); - - double invM[3][3], nextXYZ[3], nextXY[2]; - Invert3x3(xyzToCamera, invM); - Multiply3x3_v3(invM, neutral, nextXYZ); - XYZtoXY(nextXYZ, nextXY); - - if (fabs(nextXY[0] - lastXY[0]) + - fabs(nextXY[1] - lastXY[1]) < 0.0000001) { - XY[0] = nextXY[0]; - XY[1] = nextXY[1]; - return; - } - - // If we reach the limit without converging, we are most likely - // in a two value oscillation. So take the average of the last - // two estimates and give up. - if (pass == kMaxPasses - 1) { - nextXY[0] = (lastXY[0] + nextXY[0]) * 0.5; - nextXY[1] = (lastXY[1] + nextXY[1]) * 0.5; - } - - lastXY[0] = nextXY[0]; - lastXY[1] = nextXY[1]; - } - - XY[0] = lastXY[0]; - XY[1] = lastXY[1]; -} - void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], bool useToneCurve, bool applyHueSatMap, bool applyLookTable) const { @@ -1687,101 +1142,696 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int } } -// Generates as singleton -DCPStore* DCPStore::getInstance() +void DCPProfile::dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const { - static DCPStore instance_; - return &instance_; + constexpr double kTintScale = -3000.0; + + double fTemperature = 0; + double fTint = 0; + + // Convert to uv space. + double u = 2.0 * whiteXY[0] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); + double v = 3.0 * whiteXY[1] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); + + // Search for line pair coordinate is between. + double last_dt = 0.0; + double last_dv = 0.0; + double last_du = 0.0; + + for (uint32_t index = 1; index <= 30; index++) { + // Convert slope to delta-u and delta-v, with length 1. + double du = 1.0; + double dv = kTempTable [index] . t; + double len = sqrt (1.0 + dv * dv); + du /= len; + dv /= len; + + // Find delta from black body point to test coordinate. + double uu = u - kTempTable [index] . u; + double vv = v - kTempTable [index] . v; + + // Find distance above or below line. + double dt = - uu * dv + vv * du; + + // If below line, we have found line pair. + if (dt <= 0.0 || index == 30) { + // Find fractional weight of two lines. + if (dt > 0.0) { + dt = 0.0; + } + + dt = -dt; + double f; + + if (index == 1) { + f = 0.0; + } else { + f = dt / (last_dt + dt); + } + + // Interpolate the temperature. + fTemperature = 1.0E6 / (kTempTable [index - 1] . r * f + + kTempTable [index ] . r * (1.0 - f)); + + // Find delta from black body point to test coordinate. + uu = u - (kTempTable [index - 1] . u * f + + kTempTable [index ] . u * (1.0 - f)); + vv = v - (kTempTable [index - 1] . v * f + + kTempTable [index ] . v * (1.0 - f)); + // Interpolate vectors along slope. + du = du * (1.0 - f) + last_du * f; + dv = dv * (1.0 - f) + last_dv * f; + len = sqrt (du * du + dv * dv); + du /= len; + dv /= len; + + // Find distance along slope. + fTint = (uu * du + vv * dv) * kTintScale; + break; + } + + // Try next line pair. + last_dt = dt; + last_du = du; + last_dv = dv; + } + + if (temp != nullptr) { + *temp = fTemperature; + } + + if (tint != nullptr) { + *tint = fTint; + } } -// Reads all profiles from the given profiles dir -void DCPStore::init (const Glib::ustring &rtProfileDir) +void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const { - MyMutex::MyLock lock(mtx); - fileStdProfiles.clear(); + bool hasCol1 = hasColorMatrix1; + bool hasCol2 = hasColorMatrix2; - if (rtProfileDir != "") { - std::deque qDirs; + if (preferredIlluminant == 1) { + if (hasCol1) { + hasCol2 = false; + } + } else if (preferredIlluminant == 2) { + if (hasCol2) { + hasCol1 = false; + } + } - qDirs.push_front(rtProfileDir); + // mix if we have two matrices + double mix; - while (!qDirs.empty()) { - // process directory - Glib::ustring dirname = qDirs.back(); - qDirs.pop_back(); + if (hasCol1 && hasCol2) { + double wbtemp; + /* + Note: we're using DNG SDK reference code for XY to temperature translation to get the exact same mix as + the reference code does. + */ + dngref_XYCoord2Temperature(whiteXY, &wbtemp, nullptr); - Glib::Dir* dir = NULL; + if (wbtemp <= temperature1) { + mix = 1.0; + } else if (wbtemp >= temperature2) { + mix = 0.0; + } else { + double invT = 1.0 / wbtemp; + mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); + } + } + + // Interpolate the color matrix. + double mCol[3][3]; + + if (hasCol1 && hasCol2) { + // interpolate + if (mix >= 1.0) { + memcpy(mCol, mColorMatrix1, sizeof(mCol)); + } else if (mix <= 0.0) { + memcpy(mCol, mColorMatrix2, sizeof(mCol)); + } else { + mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); + } + } else if (hasCol1) { + memcpy(mCol, mColorMatrix1, sizeof(mCol)); + } else { + memcpy(mCol, mColorMatrix2, sizeof(mCol)); + } + + memcpy(xyzToCamera, mCol, sizeof(mCol)); +} + +void DCPProfile::dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const +{ + const int kMaxPasses = 30; + double lastXY[2] = { 0.3457, 0.3585 }; // D50 + + for (int pass = 0; pass < kMaxPasses; pass++) { + double xyzToCamera[3][3]; + dngref_FindXYZtoCamera(lastXY, preferredIlluminant, xyzToCamera); + + double invM[3][3], nextXYZ[3], nextXY[2]; + invert3x3(xyzToCamera, invM); + multiply3x3_v3(invM, neutral, nextXYZ); + XYZtoXY(nextXYZ, nextXY); + + if (fabs(nextXY[0] - lastXY[0]) + + fabs(nextXY[1] - lastXY[1]) < 0.0000001) { + XY[0] = nextXY[0]; + XY[1] = nextXY[1]; + return; + } + + // If we reach the limit without converging, we are most likely + // in a two value oscillation. So take the average of the last + // two estimates and give up. + if (pass == kMaxPasses - 1) { + nextXY[0] = (lastXY[0] + nextXY[0]) * 0.5; + nextXY[1] = (lastXY[1] + nextXY[1]) * 0.5; + } + + lastXY[0] = nextXY[0]; + lastXY[1] = nextXY[1]; + } + + XY[0] = lastXY[0]; + XY[1] = lastXY[1]; +} + +void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const +{ + // code adapted from dng_color_spec::FindXYZtoCamera + // note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support) + // we do not support cameracalibration either + + double neutral[3]; // same as the DNG "AsShotNeutral" tag if white balance is Camera's own + { + /* A bit messy matrixing and conversions to get the neutral[] array from RT's own white balance which is stored in + sRGB space, while the DCP code needs multipliers in CameraRGB space */ + double r, g, b; + wb.getMultipliers(r, g, b); + + // camWbMatrix == imatrices.xyz_cam + double cam_xyz[3][3]; + invert3x3(camWbMatrix, cam_xyz); + double cam_rgb[3][3]; + multiply3x3(cam_xyz, xyz_sRGB, cam_rgb); + double camwb_red = cam_rgb[0][0] * r + cam_rgb[0][1] * g + cam_rgb[0][2] * b; + double camwb_green = cam_rgb[1][0] * r + cam_rgb[1][1] * g + cam_rgb[1][2] * b; + double camwb_blue = cam_rgb[2][0] * r + cam_rgb[2][1] * g + cam_rgb[2][2] * b; + neutral[0] = camwb_red / pre_mul[0]; + neutral[1] = camwb_green / pre_mul[1]; + neutral[2] = camwb_blue / pre_mul[2]; + double maxentry = 0; + + for (int i = 0; i < 3; i++) { + if (neutral[i] > maxentry) { + maxentry = neutral[i]; + } + } + + for (int i = 0; i < 3; i++) { + neutral[i] /= maxentry; + } + } + + /* Calculate what the RGB multipliers corresponds to as a white XY coordinate, based on the + DCP ColorMatrix or ColorMatrices if dual-illuminant. This is the DNG reference code way to + do it, which is a bit different from RT's own white balance model at the time of writing. + When RT's white balance can make use of the DCP color matrices we could use that instead. */ + double white_xy[2]; + dngref_NeutralToXY(neutral, preferredIlluminant, white_xy); + + bool hasFwd1 = hasForwardMatrix1; + bool hasFwd2 = hasForwardMatrix2; + bool hasCol1 = hasColorMatrix1; + bool hasCol2 = hasColorMatrix2; + + if (preferredIlluminant == 1) { + if (hasFwd1) { + hasFwd2 = false; + } + + if (hasCol1) { + hasCol2 = false; + } + } else if (preferredIlluminant == 2) { + if (hasFwd2) { + hasFwd1 = false; + } + + if (hasCol2) { + hasCol1 = false; + } + } + + // mix if we have two matrices + double mix = 1.0; + + if ((hasCol1 && hasCol2) || (hasFwd1 && hasFwd2)) { + double wbtemp; + /* DNG ref way to convert XY to temperature, which affect matrix mixing. A different model here + typically does not affect the result too much, ie it's probably not strictly necessary to + use the DNG reference code here, but we do it for now. */ + dngref_XYCoord2Temperature(white_xy, &wbtemp, nullptr); + + if (wbtemp <= temperature1) { + mix = 1.0; + } else if (wbtemp >= temperature2) { + mix = 0.0; + } else { + double invT = 1.0 / wbtemp; + mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); + } + } + + // Colormatrix + double mCol[3][3]; + + if (hasCol1 && hasCol2) { + // interpolate + if (mix >= 1.0) { + memcpy(mCol, mColorMatrix1, sizeof(mCol)); + } else if (mix <= 0.0) { + memcpy(mCol, mColorMatrix2, sizeof(mCol)); + } else { + mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); + } + } else if (hasCol1) { + memcpy(mCol, mColorMatrix1, sizeof(mCol)); + } else { + memcpy(mCol, mColorMatrix2, sizeof(mCol)); + } + + /* + The exact position of the white XY coordinate affects the result very much, thus + it's important that the result is very similar or the same as DNG reference code. + Especially important is it that the raw-embedded "AsShot" multipliers is translated + to the same white XY coordinate as the DNG reference code, or else third party DCPs + will show incorrect color. + */ + + double white_xyz[3]; + XYtoXYZ(white_xy, white_xyz); + + double cam_xyz[3][3]; + + if (hasFwd1 || hasFwd2) { + // always prefer ForwardMatrix ahead of ColorMatrix + double mFwd[3][3]; + + if (hasFwd1 && hasFwd2) { + // interpolate + if (mix >= 1.0) { + memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); + } else if (mix <= 0.0) { + memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); + } else { + mix3x3(mForwardMatrix1, mix, mForwardMatrix2, 1.0 - mix, mFwd); + } + } else if (hasFwd1) { + memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); + } else { + memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); + } + + // adapted from dng_color_spec::SetWhiteXY + double CameraWhite[3]; + multiply3x3_v3(mCol, white_xyz, CameraWhite); + + double whiteDiag[3][3] = {{CameraWhite[0], 0, 0}, {0, CameraWhite[1], 0}, {0, 0, CameraWhite[2]}}; + double whiteDiagInv[3][3]; + invert3x3(whiteDiag, whiteDiagInv); + + double xyz_cam[3][3]; + multiply3x3(mFwd, whiteDiagInv, xyz_cam); + invert3x3(xyz_cam, cam_xyz); + } else { + double whiteMatrix[3][3]; + const double white_d50[3] = { 0.3457, 0.3585, 0.2958 }; // D50 + mapWhiteMatrix(white_d50, white_xyz, whiteMatrix); + multiply3x3(mCol, whiteMatrix, cam_xyz); + } + + // convert cam_xyz (XYZ D50 to CameraRGB, "PCS to Camera" in DNG terminology) to mXYZCAM + + { + // This block can probably be simplified, seems unnecessary to pass through the sRGB matrix + // (probably dcraw legacy), it does no harm though as we don't clip anything. + int i, j, k; + + // Multiply out XYZ colorspace + double cam_rgb[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + for (k = 0; k < 3; k++) { + cam_rgb[i][j] += cam_xyz[i][k] * xyz_sRGB[k][j]; + } + + // Normalize cam_rgb so that: cam_rgb * (1,1,1) is (1,1,1,1) + double num; + + for (i = 0; i < 3; i++) { + for (num = j = 0; j < 3; j++) { + num += cam_rgb[i][j]; + } + + for (j = 0; j < 3; j++) { + cam_rgb[i][j] /= num; + } + } + + double rgb_cam[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + RawImageSource::inverse33 (cam_rgb, rgb_cam); + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) { + mXYZCAM[i][j] = 0; + } + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + for (k = 0; k < 3; k++) { + mXYZCAM[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; + } + } +} + +const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const +{ + + *deleteHandle = nullptr; + + if (!aDeltas1) { + return nullptr; + } + + if (!aDeltas2) { + return aDeltas1; + } + + if (preferredIlluminant == 1) { + return aDeltas1; + } else if (preferredIlluminant == 2) { + return aDeltas2; + } + + // Interpolate based on color temperature. + if (temperature1 <= 0.0 || temperature2 <= 0.0 || temperature1 == temperature2) { + return aDeltas1; + } + + bool reverseOrder = temperature1 > temperature2; + double t1, t2; + + if (reverseOrder) { + t1 = temperature2; + t2 = temperature1; + } else { + t1 = temperature1; + t2 = temperature2; + } + + double mix; + + if (wb.getTemp() <= t1) { + mix = 1.0; + } else if (wb.getTemp() >= t2) { + mix = 0.0; + } else { + double invT = 1.0 / wb.getTemp(); + mix = (invT - (1.0 / t2)) / ((1.0 / t1) - (1.0 / t2)); + } + + if (reverseOrder) { + mix = 1.0 - mix; + } + + if (mix >= 1.0) { + return aDeltas1; + } else if (mix <= 0.0) { + return aDeltas2; + } + + // Interpolate between the tables. + HSBModify *aDeltas = new HSBModify[DeltaInfo.iArrayCount]; + *deleteHandle = aDeltas; + float w1 = (float)mix; + float w2 = 1.0f - (float)mix; + + for (int i = 0; i < DeltaInfo.iArrayCount; i++) { + aDeltas[i].fHueShift = w1 * aDeltas1[i].fHueShift + w2 * aDeltas2[i].fHueShift; + aDeltas[i].fSatScale = w1 * aDeltas1[i].fSatScale + w2 * aDeltas2[i].fSatScale; + aDeltas[i].fValScale = w1 * aDeltas1[i].fValScale + w2 * aDeltas2[i].fValScale; + } + + return aDeltas; +} + +void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const +{ + + // Apply the HueSatMap. Ported from Adobes reference implementation + float hueShift, satScale, valScale; + float vEncoded = v; + + if (ti.iValDivisions < 2) { // Optimize most common case of "2.5D" table. + float hScaled = h * ti.pc.hScale; + float sScaled = s * ti.pc.sScale; + + int hIndex0 = max((int)hScaled, 0); + int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); + + int hIndex1 = hIndex0 + 1; + + if (hIndex0 >= ti.pc.maxHueIndex0) { + hIndex0 = ti.pc.maxHueIndex0; + hIndex1 = 0; + } + + float hFract1 = hScaled - (float) hIndex0; + float sFract1 = sScaled - (float) sIndex0; + + float hFract0 = 1.0f - hFract1; + float sFract0 = 1.0f - sFract1; + + const HSBModify *entry00 = tableBase + hIndex0 * ti.pc.hueStep + sIndex0; + const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; + + float hueShift0 = hFract0 * entry00->fHueShift + hFract1 * entry01->fHueShift; + float satScale0 = hFract0 * entry00->fSatScale + hFract1 * entry01->fSatScale; + float valScale0 = hFract0 * entry00->fValScale + hFract1 * entry01->fValScale; + + entry00++; + entry01++; + + float hueShift1 = hFract0 * entry00->fHueShift + + hFract1 * entry01->fHueShift; + + float satScale1 = hFract0 * entry00->fSatScale + + hFract1 * entry01->fSatScale; + + float valScale1 = hFract0 * entry00->fValScale + + hFract1 * entry01->fValScale; + + hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; + satScale = sFract0 * satScale0 + sFract1 * satScale1; + valScale = sFract0 * valScale0 + sFract1 * valScale1; + + } else { + + float hScaled = h * ti.pc.hScale; + float sScaled = s * ti.pc.sScale; + + if (ti.sRGBGamma) { + vEncoded = sRGBGammaForward(v); + } + + float vScaled = vEncoded * ti.pc.vScale; + + int hIndex0 = (int) hScaled; + int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); + int vIndex0 = max(min((int)vScaled, ti.pc.maxValIndex0), 0); + + int hIndex1 = hIndex0 + 1; + + if (hIndex0 >= ti.pc.maxHueIndex0) { + hIndex0 = ti.pc.maxHueIndex0; + hIndex1 = 0; + } + + float hFract1 = hScaled - (float) hIndex0; + float sFract1 = sScaled - (float) sIndex0; + float vFract1 = vScaled - (float) vIndex0; + + float hFract0 = 1.0f - hFract1; + float sFract0 = 1.0f - sFract1; + float vFract0 = 1.0f - vFract1; + + const HSBModify *entry00 = tableBase + vIndex0 * ti.pc.valStep + hIndex0 * ti.pc.hueStep + sIndex0; + + const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; + + const HSBModify *entry10 = entry00 + ti.pc.valStep; + const HSBModify *entry11 = entry01 + ti.pc.valStep; + + float hueShift0 = vFract0 * (hFract0 * entry00->fHueShift + + hFract1 * entry01->fHueShift) + + vFract1 * (hFract0 * entry10->fHueShift + + hFract1 * entry11->fHueShift); + + float satScale0 = vFract0 * (hFract0 * entry00->fSatScale + + hFract1 * entry01->fSatScale) + + vFract1 * (hFract0 * entry10->fSatScale + + hFract1 * entry11->fSatScale); + + float valScale0 = vFract0 * (hFract0 * entry00->fValScale + + hFract1 * entry01->fValScale) + + vFract1 * (hFract0 * entry10->fValScale + + hFract1 * entry11->fValScale); + + entry00++; + entry01++; + entry10++; + entry11++; + + float hueShift1 = vFract0 * (hFract0 * entry00->fHueShift + + hFract1 * entry01->fHueShift) + + vFract1 * (hFract0 * entry10->fHueShift + + hFract1 * entry11->fHueShift); + + float satScale1 = vFract0 * (hFract0 * entry00->fSatScale + + hFract1 * entry01->fSatScale) + + vFract1 * (hFract0 * entry10->fSatScale + + hFract1 * entry11->fSatScale); + + float valScale1 = vFract0 * (hFract0 * entry00->fValScale + + hFract1 * entry01->fValScale) + + vFract1 * (hFract0 * entry10->fValScale + + hFract1 * entry11->fValScale); + + hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; + satScale = sFract0 * satScale0 + sFract1 * satScale1; + valScale = sFract0 * valScale0 + sFract1 * valScale1; + } + + hueShift *= (6.0f / 360.0f); // Convert to internal hue range. + + h += hueShift; + s *= satScale; // no clipping here, we are RT float :-) + + if (ti.sRGBGamma) { + v = sRGBGammaInverse(vEncoded * valScale); + } else { + v *= valScale; + } +} + +DCPStore* DCPStore::getInstance() +{ + static DCPStore instance; + return &instance; +} + +void DCPStore::init(const Glib::ustring& rt_profile_dir) +{ + MyMutex::MyLock lock(mutex); + + file_std_profiles.clear(); + + if (!rt_profile_dir.empty()) { + std::deque dirs = { + rt_profile_dir + }; + + while (!dirs.empty()) { + // Process directory + Glib::ustring dirname = dirs.back(); + dirs.pop_back(); + + std::unique_ptr dir; try { - if (!Glib::file_test (dirname, Glib::FILE_TEST_IS_DIR)) { + if (!Glib::file_test(dirname, Glib::FILE_TEST_IS_DIR)) { return; } - dir = new Glib::Dir (dirname); - } catch (Glib::Exception& fe) { + dir.reset(new Glib::Dir(dirname)); + } catch (Glib::Exception& exception) { return; } - dirname = dirname + "/"; + dirname += '/'; - for (Glib::DirIterator i = dir->begin(); i != dir->end(); ++i) { - Glib::ustring fname = dirname + *i; - Glib::ustring sname = *i; + for (const Glib::ustring& sname : *dir) { + const Glib::ustring fname = dirname + sname; - // ignore directories - if (!Glib::file_test (fname, Glib::FILE_TEST_IS_DIR)) { - size_t lastdot = sname.find_last_of ('.'); + if (!Glib::file_test(fname, Glib::FILE_TEST_IS_DIR)) { + // File + const auto lastdot = sname.rfind('.'); - if (lastdot != Glib::ustring::npos && lastdot <= sname.size() - 4 && (!sname.casefold().compare (lastdot, 4, ".dcp"))) { - Glib::ustring camShortName = sname.substr(0, lastdot).uppercase(); - fileStdProfiles[camShortName] = fname; // they will be loaded and cached on demand + if ( + lastdot != Glib::ustring::npos + && lastdot <= sname.size() - 4 + && !sname.casefold().compare(lastdot, 4, ".dcp") + ) { + const Glib::ustring cam_short_name = sname.substr(0, lastdot).uppercase(); + file_std_profiles[cam_short_name] = fname; // They will be loaded and cached on demand } } else { - qDirs.push_front(fname); // for later scanning + // Directory + dirs.push_front(fname); } } - - delete dir; } } } -DCPProfile* DCPStore::getProfile (const Glib::ustring &filename) +bool DCPStore::isValidDCPFileName(const Glib::ustring& filename) const { - MyMutex::MyLock lock(mtx); - - std::map::iterator r = profileCache.find (filename); - - if (r != profileCache.end()) { - return r->second; - } - - // Add profile - profileCache[filename] = new DCPProfile(filename); - - return profileCache[filename]; -} - -DCPProfile* DCPStore::getStdProfile(const Glib::ustring &camShortName) -{ - Glib::ustring name2 = camShortName.uppercase(); - - // Warning: do NOT use map.find(), since it does not seem to work reliably here - for (std::map::iterator i = fileStdProfiles.begin(); i != fileStdProfiles.end(); i++) - if (name2 == (*i).first) { - return getProfile((*i).second); - } - - return NULL; -} - -bool DCPStore::isValidDCPFileName(const Glib::ustring &filename) const -{ - if (!Glib::file_test (filename, Glib::FILE_TEST_EXISTS) || Glib::file_test (filename, Glib::FILE_TEST_IS_DIR)) { + if (!Glib::file_test(filename, Glib::FILE_TEST_EXISTS) || Glib::file_test(filename, Glib::FILE_TEST_IS_DIR)) { return false; } - size_t pos = filename.find_last_of ('.'); - return pos > 0 && (!filename.casefold().compare (pos, 4, ".dcp") || !filename.casefold().compare (pos, 4, ".dng")); + const auto pos = filename.rfind('.'); + return + pos > 0 + && ( + !filename.casefold().compare(pos, 4, ".dcp") + || !filename.casefold().compare(pos, 4, ".dng") + ); +} + +DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const +{ + MyMutex::MyLock lock(mutex); + + const std::map::iterator r = profile_cache.find(filename); + + if (r != profile_cache.end()) { + return r->second; + } + + DCPProfile* const res = new DCPProfile(filename); + + // Add profile + profile_cache[filename] = res; + + return res; +} + +DCPProfile* DCPStore::getStdProfile(const Glib::ustring& cam_short_name) const +{ + const Glib::ustring name = cam_short_name.uppercase(); + + // Warning: do NOT use map.find(), since it does not seem to work reliably here + for (const auto& file_std_profile : file_std_profiles) + if (file_std_profile.first == name) { + return getProfile(file_std_profile.second); + } + + return nullptr; } diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 4b70445b2..2e47375c3 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -17,22 +17,47 @@ * along with RawTherapee. If not, see . */ -#ifndef _DCP_ -#define _DCP_ +#pragma once + +#include + +#include #include "imagefloat.h" #include "curves.h" #include "colortemp.h" + #include "../rtgui/threadutils.h" -#include -#include -//#include namespace rtengine { -class DCPProfile +class DCPProfile final { +public: + struct dcpApplyState{ + double m2ProPhoto[3][3]; + double m2Work[3][3]; + bool alreadyProPhoto; + bool useToneCurve; + bool applyLookTable; + float blScale; + }; + + DCPProfile(const Glib::ustring &fname); + ~DCPProfile(); + + bool getHasToneCurve() const; + bool getHasLookTable() const; + bool getHasHueSatMap() const; + bool getHasBaselineExposureOffset() const; + void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const; + + void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; + void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut); + void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const dcpApplyState &asIn) const; + +private: struct HSBModify { float fHueShift; float fSatScale; @@ -49,6 +74,13 @@ class DCPProfile } pc; }; + void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; + void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; + void dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const; + void MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; + const HSBModify* MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; + void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; + double mColorMatrix1[3][3], mColorMatrix2[3][3]; bool hasColorMatrix1, hasColorMatrix2, hasForwardMatrix1, hasForwardMatrix2, hasToneCurve, hasBaselineExposureOffset, willInterpolate; double mForwardMatrix1[3][3], mForwardMatrix2[3][3]; @@ -59,76 +91,33 @@ class DCPProfile short iLightSource1, iLightSource2; AdobeToneCurve toneCurve; - - void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; - void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; - void dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const; - void MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; - const HSBModify* MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; - void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; - -public: - struct dcpApplyState{ - double m2ProPhoto[3][3]; - double m2Work[3][3]; - bool alreadyProPhoto; - bool useToneCurve; - bool applyLookTable; - float blScale; - }; - - DCPProfile(const Glib::ustring &fname); - ~DCPProfile(); - - bool getHasToneCurve() const - { - return hasToneCurve; - } - bool getHasLookTable() const - { - return !!aLookTable; - } - bool getHasHueSatMap() const - { - return !!aDeltas1; - } - bool getHasBaselineExposureOffset() const - { - return hasBaselineExposureOffset; - } - void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const - { - i1 = iLightSource1; - i2 = iLightSource2; - temp1 = temperature1, temp2 = temperature2; - willInterpolate_ = willInterpolate; - }; - void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; - void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut); - void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const dcpApplyState &asIn) const; }; -class DCPStore +class DCPStore final { - MyMutex mtx; +public: + static DCPStore* getInstance(); + + DCPStore(const DCPStore& other) = delete; + DCPStore& operator =(const DCPStore& other) = delete; + + void init(const Glib::ustring& rt_profile_dir); + + bool isValidDCPFileName(const Glib::ustring& filename) const; + + DCPProfile* getProfile(const Glib::ustring& filename) const; + DCPProfile* getStdProfile(const Glib::ustring& camShortName) const; + +private: + DCPStore() = default; + + mutable MyMutex mutex; // these contain standard profiles from RT. keys are all in uppercase, file path is value - std::map fileStdProfiles; + std::map file_std_profiles; // Maps file name to profile as cache - std::map profileCache; - -public: - void init(const Glib::ustring &rtProfileDir); - - bool isValidDCPFileName(const Glib::ustring &filename) const; - - DCPProfile* getProfile(const Glib::ustring &filename); - DCPProfile* getStdProfile(const Glib::ustring &camShortName); - - static DCPStore* getInstance(); + mutable std::map profile_cache; }; -#define dcpStore DCPStore::getInstance() } -#endif diff --git a/rtengine/init.cc b/rtengine/init.cc index d2509b620..3b2c5fbdc 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -42,7 +42,7 @@ int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDi settings = s; iccStore->init (s->iccDirectory, baseDir + "/iccprofiles"); iccStore->findDefaultMonitorProfile(); - dcpStore->init (baseDir + "/dcpprofiles"); + DCPStore::getInstance()->init (baseDir + "/dcpprofiles"); CameraConstantsStore::getInstance ()->init (baseDir, userSettingsDir); profileStore.init (); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 7085e315f..400fdb3fe 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -898,7 +898,7 @@ DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp & if (dcpProf == NULL) { return NULL; } - + dcpProf->setStep2ApplyState(cmp.working, cmp.toneCurve, cmp.applyLookTable, cmp.applyBaselineExposureOffset, as); return dcpProf; } @@ -4085,7 +4085,7 @@ bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embed in = embedded; } else if (inProfile == "(cameraICC)") { // DCPs have higher quality, so use them first - *dcpProf = dcpStore->getStdProfile(camName); + *dcpProf = DCPStore::getInstance()->getStdProfile(camName); if (*dcpProf == NULL) { in = iccStore->getStdProfile(camName); @@ -4097,8 +4097,8 @@ bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embed normalName = inProfile.substr(5); } - if (dcpStore->isValidDCPFileName(normalName)) { - *dcpProf = dcpStore->getProfile(normalName); + if (DCPStore::getInstance()->isValidDCPFileName(normalName)) { + *dcpProf = DCPStore::getInstance()->getProfile(normalName); } if (*dcpProf == NULL) { diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index efce343c0..15a171efe 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -361,9 +361,9 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) DCPProfile* dcp = NULL; if(dcp_name == "(cameraICC)") { - dcp = dcpStore->getStdProfile(camName); - } else if (ifromfile->get_active() && dcpStore->isValidDCPFileName(dcp_name)) { - dcp = dcpStore->getProfile(dcp_name); + dcp = DCPStore::getInstance()->getStdProfile(camName); + } else if (ifromfile->get_active() && DCPStore::getInstance()->isValidDCPFileName(dcp_name)) { + dcp = DCPStore::getInstance()->getProfile(dcp_name); } if (dcp) { @@ -631,10 +631,10 @@ void ICMPanel::write (ProcParams* pp, ParamsEdited* pedited) DCPProfile* dcp = NULL; - if (ifromfile->get_active() && pp->icm.input.substr(0, 5) == "file:" && dcpStore->isValidDCPFileName(pp->icm.input.substr(5))) { - dcp = dcpStore->getProfile(pp->icm.input.substr(5)); + if (ifromfile->get_active() && pp->icm.input.substr(0, 5) == "file:" && DCPStore::getInstance()->isValidDCPFileName(pp->icm.input.substr(5))) { + dcp = DCPStore::getInstance()->getProfile(pp->icm.input.substr(5)); } else if(icameraICC->get_active()) { - dcp = dcpStore->getStdProfile(camName); + dcp = DCPStore::getInstance()->getStdProfile(camName); } if (dcp) { @@ -920,7 +920,7 @@ void ICMPanel::setRawMeta (bool raw, const rtengine::ImageData* pMeta) iembedded->set_active (!raw); icamera->set_sensitive (raw); camName = pMeta->getCamera(); - icameraICC->set_sensitive (raw && (iccStore->getStdProfile(pMeta->getCamera()) != NULL || dcpStore->getStdProfile(pMeta->getCamera()) != NULL)); + icameraICC->set_sensitive (raw && (iccStore->getStdProfile(pMeta->getCamera()) != NULL || DCPStore::getInstance()->getStdProfile(pMeta->getCamera()) != NULL)); iembedded->set_sensitive (!raw); enableListener (); From 2abd641c0669b922202c0276e68d1b4c0148d217 Mon Sep 17 00:00:00 2001 From: Floessie Date: Sun, 5 Jun 2016 21:30:51 +0200 Subject: [PATCH 086/232] Refactor `DCPProfile::DCPProfile()` - Rename members - Styling - C++11 Still to come: - All the rest of DCPProfile --- rtengine/dcp.cc | 553 ++++++++++++++++++---------------- rtengine/dcp.h | 68 +++-- rtengine/dcrop.cc | 2 +- rtengine/imagesource.h | 2 +- rtengine/improccoordinator.cc | 2 +- rtengine/improcfun.cc | 4 +- rtengine/improcfun.h | 4 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- rtengine/rtthumbnail.cc | 2 +- rtengine/simpleprocess.cc | 2 +- rtengine/utils.h | 12 +- 12 files changed, 358 insertions(+), 297 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index fb672cd34..f3ba11211 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -601,67 +601,86 @@ double calibrationIlluminantToTemperature(int light) } -DCPProfile::DCPProfile(const Glib::ustring &fname) +DCPProfile::DCPProfile(const Glib::ustring& filename) : + has_color_matrix_1(false), + has_color_matrix_2(false), + has_forward_matrix_1(false), + has_forward_matrix_2(false), + has_tone_curve(false), + has_baseline_exposure_offset(false), + will_interpolate(false), + baseline_exposure_offset(0.0), + deltas_1(nullptr), + deltas_2(nullptr), + look_table(nullptr) { - const int TIFFFloatSize = 4; - const int TagColorMatrix1 = 50721, TagColorMatrix2 = 50722, TagProfileHueSatMapDims = 50937; - const int TagForwardMatrix1 = 50964, TagForwardMatrix2 = 50965; - const int TagProfileHueSatMapData1 = 50938, TagProfileHueSatMapData2 = 50939; - const int TagCalibrationIlluminant1 = 50778, TagCalibrationIlluminant2 = 50779; - const int TagProfileLookTableData = 50982, TagProfileLookTableDims = 50981; // ProfileLookup is the low quality variant - const int TagProfileHueSatMapEncoding = 51107, TagProfileLookTableEncoding = 51108; - const int TagProfileToneCurve = 50940, TagBaselineExposureOffset = 51109; - const int TagProfileCopyright = 50942; + constexpr int tiff_float_size = 4; - aDeltas1 = aDeltas2 = aLookTable = nullptr; + enum class TagKey : int { + COLOR_MATRIX_1 = 50721, + COLOR_MATRIX_2 = 50722, + PROFILE_HUE_SAT_MAP_DIMS = 50937, + PROFILE_HUE_SAT_MAP_DATA_1 = 50938, + PROFILE_HUE_SAT_MAP_DATA_2 = 50939, + PROFILE_TONE_CURVE = 50940, + PROFILE_TONE_COPYRIGHT = 50942, + CALIBRATION_ILLUMINANT_1 = 50778, + CALIBRATION_ILLUMINANT_2 = 50779, + FORWARD_MATRIX_1 = 50964, + FORWARD_MATRIX_2 = 50965, + PROFILE_LOOK_TABLE_DIMS = 50981, // ProfileLookup is the low quality variant + PROFILE_LOOK_TABLE_DATA = 50982, + PROFILE_HUE_SAT_MAP_ENCODING = 51107, + PROFILE_LOOK_TABLE_ENCODING = 51108, + BASELINE_EXPOSURE_OFFSET = 51109 + }; - FILE *pFile = g_fopen(fname.c_str (), "rb"); + FILE* const file = g_fopen(filename.c_str(), "rb"); - TagDirectory *tagDir = ExifManager::parseTIFF(pFile, false); + std::unique_ptr tagDir(ExifManager::parseTIFF(file, false)); - Tag* tag = tagDir->getTag(TagCalibrationIlluminant1); - iLightSource1 = (tag != nullptr ? tag->toInt(0, rtexif::SHORT) : -1); - tag = tagDir->getTag(TagCalibrationIlluminant2); - iLightSource2 = (tag != nullptr ? tag->toInt(0, rtexif::SHORT) : -1); - temperature1 = calibrationIlluminantToTemperature(iLightSource1); - temperature2 = calibrationIlluminantToTemperature(iLightSource2); + Tag* tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_1)); + light_source_1 = + tag + ? tag->toInt(0, rtexif::SHORT) + : -1; + tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_2)); + light_source_2 = + tag + ? tag->toInt(0, rtexif::SHORT) + : -1; + temperature_1 = calibrationIlluminantToTemperature(light_source_1); + temperature_2 = calibrationIlluminantToTemperature(light_source_2); - bool hasSecondHueSat = tagDir->getTag(TagProfileHueSatMapData2) != nullptr; // some profiles have two matrices, but just one huesat + const bool has_second_hue_sat = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DATA_2)); // Some profiles have two matrices, but just one huesat // Fetch Forward Matrices, if any - hasForwardMatrix1 = false; - hasForwardMatrix2 = false; - hasColorMatrix1 = false; - hasColorMatrix2 = false; - hasToneCurve = false; - hasBaselineExposureOffset = false; - baselineExposureOffset = 0; - tag = tagDir->getTag(TagForwardMatrix1); + tag = tagDir->getTag(toUnderlying(TagKey::FORWARD_MATRIX_1)); if (tag) { - hasForwardMatrix1 = true; + has_forward_matrix_1 = true; - for (int row = 0; row < 3; row++) { - for (int col = 0; col < 3; col++) { - mForwardMatrix1[row][col] = (float)tag->toDouble((col + row * 3) * 8); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + forward_matrix_1[row][col] = tag->toDouble((col + row * 3) * 8); } } } - tag = tagDir->getTag(TagForwardMatrix2); + tag = tagDir->getTag(toUnderlying(TagKey::FORWARD_MATRIX_2)); if (tag) { - hasForwardMatrix2 = true; + has_forward_matrix_2 = true; - for (int row = 0; row < 3; row++) { - for (int col = 0; col < 3; col++) { - mForwardMatrix2[row][col] = (float)tag->toDouble((col + row * 3) * 8); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + forward_matrix_2[row][col] = tag->toDouble((col + row * 3) * 8); } } } - // Color Matrix (1 is always there) - tag = tagDir->getTag(TagColorMatrix1); + // Color Matrix (one is always there) + tag = tagDir->getTag(toUnderlying(TagKey::COLOR_MATRIX_1)); if (!tag) { // FIXME: better error handling @@ -669,223 +688,235 @@ DCPProfile::DCPProfile(const Glib::ustring &fname) abort(); } - hasColorMatrix1 = true; + has_color_matrix_1 = true; - for (int row = 0; row < 3; row++) { - for (int col = 0; col < 3; col++) { - mColorMatrix1[row][col] = (float)tag->toDouble((col + row * 3) * 8); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + color_matrix_1[row][col] = tag->toDouble((col + row * 3) * 8); } } - tag = tagDir->getTag(TagProfileLookTableDims); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_LOOK_TABLE_DIMS)); - if (tag != nullptr) { - LookInfo.iHueDivisions = tag->toInt(0); - LookInfo.iSatDivisions = tag->toInt(4); - LookInfo.iValDivisions = tag->toInt(8); + if (tag) { + look_info.hue_divisions = tag->toInt(0); + look_info.sat_divisions = tag->toInt(4); + look_info.val_divisions = tag->toInt(8); - tag = tagDir->getTag(TagProfileLookTableEncoding); - LookInfo.sRGBGamma = tag != nullptr && tag->toInt(0); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_LOOK_TABLE_ENCODING)); + look_info.srgb_gamma = tag && tag->toInt(0); - tag = tagDir->getTag(TagProfileLookTableData); - LookInfo.iArrayCount = tag->getCount() / 3; + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_LOOK_TABLE_DATA)); + look_info.array_count = tag->getCount() / 3; - aLookTable = new HSBModify[LookInfo.iArrayCount]; + look_table = new HSBModify[look_info.array_count]; - for (int i = 0; i < LookInfo.iArrayCount; i++) { - aLookTable[i].fHueShift = tag->toDouble((i * 3) * TIFFFloatSize); - aLookTable[i].fSatScale = tag->toDouble((i * 3 + 1) * TIFFFloatSize); - aLookTable[i].fValScale = tag->toDouble((i * 3 + 2) * TIFFFloatSize); + for (int i = 0; i < look_info.array_count; i++) { + look_table[i].hue_shift = tag->toDouble((i * 3) * tiff_float_size); + look_table[i].sat_scale = tag->toDouble((i * 3 + 1) * tiff_float_size); + look_table[i].val_scale = tag->toDouble((i * 3 + 2) * tiff_float_size); } - // precalculated constants for table application - LookInfo.pc.hScale = (LookInfo.iHueDivisions < 2) ? 0.0f : (LookInfo.iHueDivisions * (1.0f / 6.0f)); - LookInfo.pc.sScale = (float) (LookInfo.iSatDivisions - 1); - LookInfo.pc.vScale = (float) (LookInfo.iValDivisions - 1); - LookInfo.pc.maxHueIndex0 = LookInfo.iHueDivisions - 1; - LookInfo.pc.maxSatIndex0 = LookInfo.iSatDivisions - 2; - LookInfo.pc.maxValIndex0 = LookInfo.iValDivisions - 2; - LookInfo.pc.hueStep = LookInfo.iSatDivisions; - LookInfo.pc.valStep = LookInfo.iHueDivisions * LookInfo.pc.hueStep; + // Precalculated constants for table application + look_info.pc.h_scale = + look_info.hue_divisions < 2 + ? 0.0f + : static_cast(look_info.hue_divisions) / 6.0f; + look_info.pc.s_scale = look_info.sat_divisions - 1; + look_info.pc.v_scale = look_info.val_divisions - 1; + look_info.pc.maxHueIndex0 = look_info.hue_divisions - 1; + look_info.pc.maxSatIndex0 = look_info.sat_divisions - 2; + look_info.pc.maxValIndex0 = look_info.val_divisions - 2; + look_info.pc.hueStep = look_info.sat_divisions; + look_info.pc.valStep = look_info.hue_divisions * look_info.pc.hueStep; } - tag = tagDir->getTag(TagProfileHueSatMapDims); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DIMS)); - if (tag != nullptr) { - DeltaInfo.iHueDivisions = tag->toInt(0); - DeltaInfo.iSatDivisions = tag->toInt(4); - DeltaInfo.iValDivisions = tag->toInt(8); + if (tag) { + delta_info.hue_divisions = tag->toInt(0); + delta_info.sat_divisions = tag->toInt(4); + delta_info.val_divisions = tag->toInt(8); - tag = tagDir->getTag(TagProfileHueSatMapEncoding); - DeltaInfo.sRGBGamma = tag != nullptr && tag->toInt(0); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_ENCODING)); + delta_info.srgb_gamma = tag && tag->toInt(0); - tag = tagDir->getTag(TagProfileHueSatMapData1); - DeltaInfo.iArrayCount = tag->getCount() / 3; + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DATA_1)); + delta_info.array_count = tag->getCount() / 3; - aDeltas1 = new HSBModify[DeltaInfo.iArrayCount]; + deltas_1 = new HSBModify[delta_info.array_count]; - for (int i = 0; i < DeltaInfo.iArrayCount; i++) { - aDeltas1[i].fHueShift = tag->toDouble((i * 3) * TIFFFloatSize); - aDeltas1[i].fSatScale = tag->toDouble((i * 3 + 1) * TIFFFloatSize); - aDeltas1[i].fValScale = tag->toDouble((i * 3 + 2) * TIFFFloatSize); + for (int i = 0; i < delta_info.array_count; ++i) { + deltas_1[i].hue_shift = tag->toDouble((i * 3) * tiff_float_size); + deltas_1[i].sat_scale = tag->toDouble((i * 3 + 1) * tiff_float_size); + deltas_1[i].val_scale = tag->toDouble((i * 3 + 2) * tiff_float_size); } - DeltaInfo.pc.hScale = (DeltaInfo.iHueDivisions < 2) ? 0.0f : (DeltaInfo.iHueDivisions * (1.0f / 6.0f)); - DeltaInfo.pc.sScale = (float) (DeltaInfo.iSatDivisions - 1); - DeltaInfo.pc.vScale = (float) (DeltaInfo.iValDivisions - 1); - DeltaInfo.pc.maxHueIndex0 = DeltaInfo.iHueDivisions - 1; - DeltaInfo.pc.maxSatIndex0 = DeltaInfo.iSatDivisions - 2; - DeltaInfo.pc.maxValIndex0 = DeltaInfo.iValDivisions - 2; - DeltaInfo.pc.hueStep = DeltaInfo.iSatDivisions; - DeltaInfo.pc.valStep = DeltaInfo.iHueDivisions * DeltaInfo.pc.hueStep; + delta_info.pc.h_scale = + delta_info.hue_divisions < 2 + ? 0.0f + : static_cast(delta_info.hue_divisions) / 6.0f; + delta_info.pc.s_scale = delta_info.sat_divisions - 1; + delta_info.pc.v_scale = delta_info.val_divisions - 1; + delta_info.pc.maxHueIndex0 = delta_info.hue_divisions - 1; + delta_info.pc.maxSatIndex0 = delta_info.sat_divisions - 2; + delta_info.pc.maxValIndex0 = delta_info.val_divisions - 2; + delta_info.pc.hueStep = delta_info.sat_divisions; + delta_info.pc.valStep = delta_info.hue_divisions * delta_info.pc.hueStep; } - if (iLightSource2 != -1) { + if (light_source_2 != -1) { // Second matrix - tag = tagDir->getTag(TagColorMatrix2); - hasColorMatrix2 = true; + has_color_matrix_2 = true; - for (int row = 0; row < 3; row++) { - for (int col = 0; col < 3; col++) { - mColorMatrix2[row][col] = (tag != nullptr ? (float)tag->toDouble((col + row * 3) * 8) : mColorMatrix1[row][col]); + tag = tagDir->getTag(toUnderlying(TagKey::COLOR_MATRIX_2)); + + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + color_matrix_2[row][col] = + tag + ? tag->toDouble((col + row * 3) * 8) + : color_matrix_1[row][col]; } } // Second huesatmap - if (hasSecondHueSat) { - aDeltas2 = new HSBModify[DeltaInfo.iArrayCount]; + if (has_second_hue_sat) { + deltas_2 = new HSBModify[delta_info.array_count]; // Saturation maps. Need to be unwinded. - tag = tagDir->getTag(TagProfileHueSatMapData2); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DATA_2)); - for (int i = 0; i < DeltaInfo.iArrayCount; i++) { - aDeltas2[i].fHueShift = tag->toDouble((i * 3) * TIFFFloatSize); - aDeltas2[i].fSatScale = tag->toDouble((i * 3 + 1) * TIFFFloatSize); - aDeltas2[i].fValScale = tag->toDouble((i * 3 + 2) * TIFFFloatSize); + for (int i = 0; i < delta_info.array_count; ++i) { + deltas_2[i].hue_shift = tag->toDouble((i * 3) * tiff_float_size); + deltas_2[i].sat_scale = tag->toDouble((i * 3 + 1) * tiff_float_size); + deltas_2[i].val_scale = tag->toDouble((i * 3 + 2) * tiff_float_size); } } } - tag = tagDir->getTag(TagBaselineExposureOffset); + tag = tagDir->getTag(toUnderlying(TagKey::BASELINE_EXPOSURE_OFFSET)); if (tag) { - hasBaselineExposureOffset = true; - baselineExposureOffset = tag->toDouble(); + has_baseline_exposure_offset = true; + baseline_exposure_offset = tag->toDouble(); } // Read tone curve points, if any, but disable to RTs own profiles - tag = tagDir->getTag(TagProfileToneCurve); + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_TONE_CURVE)); - if (tag != nullptr) { - std::vector cPoints; - cPoints.push_back(double(DCT_Spline)); // The first value is the curve type + if (tag) { + std::vector curve_points = { + static_cast(DCT_Spline) // The first value is the curve type + }; - // push back each X/Y coordinates in a loop + // Push back each X/Y coordinates in a loop bool curve_is_linear = true; for (int i = 0; i < tag->getCount(); i += 2) { - double x = tag->toDouble((i + 0) * TIFFFloatSize); - double y = tag->toDouble((i + 1) * TIFFFloatSize); + const double x = tag->toDouble((i + 0) * tiff_float_size); + const double y = tag->toDouble((i + 1) * tiff_float_size); if (x != y) { curve_is_linear = false; } - cPoints.push_back( x ); - cPoints.push_back( y ); + curve_points.push_back(x); + curve_points.push_back(y); } if (!curve_is_linear) { // Create the curve - DiagonalCurve rawCurve(cPoints, CURVES_MIN_POLY_POINTS); - - toneCurve.Set(rawCurve); - hasToneCurve = true; + has_tone_curve = true; + tone_curve.Set(DiagonalCurve(curve_points, CURVES_MIN_POLY_POINTS)); } - } else if (tag == nullptr) { - tag = tagDir->getTag(TagProfileCopyright); + } else { + tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_TONE_COPYRIGHT)); - if (tag != nullptr && tag->valueToString().find("Adobe Systems") != std::string::npos) { - // an Adobe profile without tone curve is expected to have the Adobe Default Curve, we add that - std::vector cPoints; - cPoints.push_back(double(DCT_Spline)); - const size_t tc_len = sizeof(adobe_camera_raw_default_curve) / sizeof(adobe_camera_raw_default_curve[0]); + if (tag && tag->valueToString().find("Adobe Systems") != std::string::npos) { + // An Adobe profile without tone curve is expected to have the Adobe Default Curve, we add that + std::vector curve_points = { + static_cast(DCT_Spline) + }; - for (size_t i = 0; i < tc_len; i++) { - double x = (double)i / (tc_len - 1); - double y = (double)adobe_camera_raw_default_curve[i]; - cPoints.push_back( x ); - cPoints.push_back( y ); + constexpr size_t tc_len = sizeof(adobe_camera_raw_default_curve) / sizeof(adobe_camera_raw_default_curve[0]); + + for (size_t i = 0; i < tc_len; ++i) { + const double x = static_cast(i) / (tc_len - 1); + const double y = adobe_camera_raw_default_curve[i]; + curve_points.push_back(x); + curve_points.push_back(y); } - DiagonalCurve rawCurve(cPoints, CURVES_MIN_POLY_POINTS); - toneCurve.Set(rawCurve); - hasToneCurve = true; + has_tone_curve = true; + tone_curve.Set(DiagonalCurve(curve_points, CURVES_MIN_POLY_POINTS)); } } - willInterpolate = false; + will_interpolate = false; - if (hasForwardMatrix1) { - if (hasForwardMatrix2) { - if (memcmp(mForwardMatrix1, mForwardMatrix2, sizeof(mForwardMatrix1)) != 0) { - // common that forward matrices are the same! - willInterpolate = true; + if (has_forward_matrix_1) { + if (has_forward_matrix_2) { + if (memcmp(forward_matrix_1, forward_matrix_2, sizeof(forward_matrix_1)) != 0) { + // Common that forward matrices are the same! + will_interpolate = true; } - if (aDeltas1 && aDeltas2) { - // we assume tables are different - willInterpolate = true; + if (deltas_1 && deltas_2) { + // We assume tables are different + will_interpolate = true; } } } - if (hasColorMatrix1 && hasColorMatrix2) { - if (memcmp(mColorMatrix1, mColorMatrix2, sizeof(mColorMatrix1)) != 0) { - willInterpolate = true; + if (has_color_matrix_1 && has_color_matrix_2) { + if (memcmp(color_matrix_1, color_matrix_2, sizeof(color_matrix_1)) != 0) { + will_interpolate = true; } - if (aDeltas1 && aDeltas2) { - willInterpolate = true; + if (deltas_1 && deltas_2) { + will_interpolate = true; } } - if (pFile != nullptr) { - fclose(pFile); + if (file) { + fclose(file); } - - delete tagDir; } DCPProfile::~DCPProfile() { - delete[] aDeltas1; - delete[] aDeltas2; - delete[] aLookTable; + delete[] deltas_1; + delete[] deltas_2; + delete[] look_table; } bool DCPProfile::getHasToneCurve() const { - return hasToneCurve; + return has_tone_curve; } + bool DCPProfile::getHasLookTable() const { - return !!aLookTable; + return look_table; } + bool DCPProfile::getHasHueSatMap() const { - return !!aDeltas1; + return deltas_1; } + bool DCPProfile::getHasBaselineExposureOffset() const { - return hasBaselineExposureOffset; + return has_baseline_exposure_offset; } + void DCPProfile::getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const { - i1 = iLightSource1; - i2 = iLightSource2; - temp1 = temperature1, temp2 = temperature2; - willInterpolate_ = willInterpolate; + i1 = light_source_1; + i2 = light_source_2; + temp1 = temperature_1, temp2 = temperature_2; + willInterpolate_ = will_interpolate; }; void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], bool useToneCurve, bool applyHueSatMap, bool applyLookTable) const @@ -902,11 +933,11 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us applyHueSatMap = false; } - if (!aLookTable) { + if (!look_table) { applyLookTable = false; } - useToneCurve &= toneCurve; + useToneCurve &= tone_curve; if (!applyHueSatMap && !applyLookTable && !useToneCurve) { //===== The fast path: no LUT and not tone curve- Calculate matrix for direct conversion raw>working space @@ -969,11 +1000,11 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us h *= 6.f; // RT calculates in [0,1] if (applyHueSatMap) { - HSDApply(DeltaInfo, deltaBase, h, s, v); + HSDApply(delta_info, deltaBase, h, s, v); } if (applyLookTable) { - HSDApply(LookInfo, aLookTable, h, s, v); + HSDApply(look_info, look_table, h, s, v); } // RT range correction @@ -991,7 +1022,7 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us // tone curve if (useToneCurve) { - toneCurve.Apply(newr, newg, newb); + tone_curve.Apply(newr, newg, newb); } pImg->r(y, x) = m2Work[0][0] * newr + m2Work[0][1] * newg + m2Work[0][2] * newb; @@ -1006,23 +1037,23 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us } } -void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut) +void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut) { asOut.useToneCurve = useToneCurve; asOut.applyLookTable = applyLookTable; asOut.blScale = 1.0; - if (!aLookTable) { + if (!look_table) { asOut.applyLookTable = false; } - if (!hasToneCurve) { + if (!has_tone_curve) { asOut.useToneCurve = false; } - if (hasBaselineExposureOffset && applyBaselineExposure) { - asOut.blScale = powf(2, baselineExposureOffset); + if (has_baseline_exposure_offset && applyBaselineExposure) { + asOut.blScale = powf(2, baseline_exposure_offset); } if (workingSpace == "ProPhoto") { @@ -1051,7 +1082,7 @@ void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useT } } -void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int height, int tileWidth, const dcpApplyState &asIn) const +void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int height, int tileWidth, const ApplyState &asIn) const { #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) @@ -1107,7 +1138,7 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int Color::rgb2hsv(newr, newg, newb, h, s, v); h *= 6.f; // RT calculates in [0,1] - HSDApply(LookInfo, aLookTable, h, s, v); + HSDApply(look_info, look_table, h, s, v); s = CLIP01(s); v = CLIP01(v); @@ -1125,7 +1156,7 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int } if (asIn.useToneCurve) { - toneCurve.Apply(newr, newg, newb); + tone_curve.Apply(newr, newg, newb); } if (asIn.alreadyProPhoto) { @@ -1228,8 +1259,8 @@ void DCPProfile::dngref_XYCoord2Temperature(const double whiteXY[2], double *tem void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const { - bool hasCol1 = hasColorMatrix1; - bool hasCol2 = hasColorMatrix2; + bool hasCol1 = has_color_matrix_1; + bool hasCol2 = has_color_matrix_2; if (preferredIlluminant == 1) { if (hasCol1) { @@ -1252,13 +1283,13 @@ void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIl */ dngref_XYCoord2Temperature(whiteXY, &wbtemp, nullptr); - if (wbtemp <= temperature1) { + if (wbtemp <= temperature_1) { mix = 1.0; - } else if (wbtemp >= temperature2) { + } else if (wbtemp >= temperature_2) { mix = 0.0; } else { double invT = 1.0 / wbtemp; - mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); + mix = (invT - (1.0 / temperature_2)) / ((1.0 / temperature_1) - (1.0 / temperature_2)); } } @@ -1268,16 +1299,16 @@ void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIl if (hasCol1 && hasCol2) { // interpolate if (mix >= 1.0) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); + memcpy(mCol, color_matrix_1, sizeof(mCol)); } else if (mix <= 0.0) { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); + memcpy(mCol, color_matrix_2, sizeof(mCol)); } else { - mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); + mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, mCol); } } else if (hasCol1) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); + memcpy(mCol, color_matrix_1, sizeof(mCol)); } else { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); + memcpy(mCol, color_matrix_2, sizeof(mCol)); } memcpy(xyzToCamera, mCol, sizeof(mCol)); @@ -1364,10 +1395,10 @@ void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWb double white_xy[2]; dngref_NeutralToXY(neutral, preferredIlluminant, white_xy); - bool hasFwd1 = hasForwardMatrix1; - bool hasFwd2 = hasForwardMatrix2; - bool hasCol1 = hasColorMatrix1; - bool hasCol2 = hasColorMatrix2; + bool hasFwd1 = has_forward_matrix_1; + bool hasFwd2 = has_forward_matrix_2; + bool hasCol1 = has_color_matrix_1; + bool hasCol2 = has_color_matrix_2; if (preferredIlluminant == 1) { if (hasFwd1) { @@ -1397,13 +1428,13 @@ void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWb use the DNG reference code here, but we do it for now. */ dngref_XYCoord2Temperature(white_xy, &wbtemp, nullptr); - if (wbtemp <= temperature1) { + if (wbtemp <= temperature_1) { mix = 1.0; - } else if (wbtemp >= temperature2) { + } else if (wbtemp >= temperature_2) { mix = 0.0; } else { double invT = 1.0 / wbtemp; - mix = (invT - (1.0 / temperature2)) / ((1.0 / temperature1) - (1.0 / temperature2)); + mix = (invT - (1.0 / temperature_2)) / ((1.0 / temperature_1) - (1.0 / temperature_2)); } } @@ -1413,16 +1444,16 @@ void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWb if (hasCol1 && hasCol2) { // interpolate if (mix >= 1.0) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); + memcpy(mCol, color_matrix_1, sizeof(mCol)); } else if (mix <= 0.0) { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); + memcpy(mCol, color_matrix_2, sizeof(mCol)); } else { - mix3x3(mColorMatrix1, mix, mColorMatrix2, 1.0 - mix, mCol); + mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, mCol); } } else if (hasCol1) { - memcpy(mCol, mColorMatrix1, sizeof(mCol)); + memcpy(mCol, color_matrix_1, sizeof(mCol)); } else { - memcpy(mCol, mColorMatrix2, sizeof(mCol)); + memcpy(mCol, color_matrix_2, sizeof(mCol)); } /* @@ -1445,16 +1476,16 @@ void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWb if (hasFwd1 && hasFwd2) { // interpolate if (mix >= 1.0) { - memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); + memcpy(mFwd, forward_matrix_1, sizeof(mFwd)); } else if (mix <= 0.0) { - memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); + memcpy(mFwd, forward_matrix_2, sizeof(mFwd)); } else { - mix3x3(mForwardMatrix1, mix, mForwardMatrix2, 1.0 - mix, mFwd); + mix3x3(forward_matrix_1, mix, forward_matrix_2, 1.0 - mix, mFwd); } } else if (hasFwd1) { - memcpy(mFwd, mForwardMatrix1, sizeof(mFwd)); + memcpy(mFwd, forward_matrix_1, sizeof(mFwd)); } else { - memcpy(mFwd, mForwardMatrix2, sizeof(mFwd)); + memcpy(mFwd, forward_matrix_2, sizeof(mFwd)); } // adapted from dng_color_spec::SetWhiteXY @@ -1525,34 +1556,34 @@ const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int *deleteHandle = nullptr; - if (!aDeltas1) { + if (!deltas_1) { return nullptr; } - if (!aDeltas2) { - return aDeltas1; + if (!deltas_2) { + return deltas_1; } if (preferredIlluminant == 1) { - return aDeltas1; + return deltas_1; } else if (preferredIlluminant == 2) { - return aDeltas2; + return deltas_2; } // Interpolate based on color temperature. - if (temperature1 <= 0.0 || temperature2 <= 0.0 || temperature1 == temperature2) { - return aDeltas1; + if (temperature_1 <= 0.0 || temperature_2 <= 0.0 || temperature_1 == temperature_2) { + return deltas_1; } - bool reverseOrder = temperature1 > temperature2; + bool reverseOrder = temperature_1 > temperature_2; double t1, t2; if (reverseOrder) { - t1 = temperature2; - t2 = temperature1; + t1 = temperature_2; + t2 = temperature_1; } else { - t1 = temperature1; - t2 = temperature2; + t1 = temperature_1; + t2 = temperature_2; } double mix; @@ -1571,21 +1602,21 @@ const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int } if (mix >= 1.0) { - return aDeltas1; + return deltas_1; } else if (mix <= 0.0) { - return aDeltas2; + return deltas_2; } // Interpolate between the tables. - HSBModify *aDeltas = new HSBModify[DeltaInfo.iArrayCount]; + HSBModify *aDeltas = new HSBModify[delta_info.array_count]; *deleteHandle = aDeltas; float w1 = (float)mix; float w2 = 1.0f - (float)mix; - for (int i = 0; i < DeltaInfo.iArrayCount; i++) { - aDeltas[i].fHueShift = w1 * aDeltas1[i].fHueShift + w2 * aDeltas2[i].fHueShift; - aDeltas[i].fSatScale = w1 * aDeltas1[i].fSatScale + w2 * aDeltas2[i].fSatScale; - aDeltas[i].fValScale = w1 * aDeltas1[i].fValScale + w2 * aDeltas2[i].fValScale; + for (int i = 0; i < delta_info.array_count; i++) { + aDeltas[i].hue_shift = w1 * deltas_1[i].hue_shift + w2 * deltas_2[i].hue_shift; + aDeltas[i].sat_scale = w1 * deltas_1[i].sat_scale + w2 * deltas_2[i].sat_scale; + aDeltas[i].val_scale = w1 * deltas_1[i].val_scale + w2 * deltas_2[i].val_scale; } return aDeltas; @@ -1598,9 +1629,9 @@ void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, fl float hueShift, satScale, valScale; float vEncoded = v; - if (ti.iValDivisions < 2) { // Optimize most common case of "2.5D" table. - float hScaled = h * ti.pc.hScale; - float sScaled = s * ti.pc.sScale; + if (ti.val_divisions < 2) { // Optimize most common case of "2.5D" table. + float hScaled = h * ti.pc.h_scale; + float sScaled = s * ti.pc.s_scale; int hIndex0 = max((int)hScaled, 0); int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); @@ -1621,21 +1652,21 @@ void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, fl const HSBModify *entry00 = tableBase + hIndex0 * ti.pc.hueStep + sIndex0; const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; - float hueShift0 = hFract0 * entry00->fHueShift + hFract1 * entry01->fHueShift; - float satScale0 = hFract0 * entry00->fSatScale + hFract1 * entry01->fSatScale; - float valScale0 = hFract0 * entry00->fValScale + hFract1 * entry01->fValScale; + float hueShift0 = hFract0 * entry00->hue_shift + hFract1 * entry01->hue_shift; + float satScale0 = hFract0 * entry00->sat_scale + hFract1 * entry01->sat_scale; + float valScale0 = hFract0 * entry00->val_scale + hFract1 * entry01->val_scale; entry00++; entry01++; - float hueShift1 = hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift; + float hueShift1 = hFract0 * entry00->hue_shift + + hFract1 * entry01->hue_shift; - float satScale1 = hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale; + float satScale1 = hFract0 * entry00->sat_scale + + hFract1 * entry01->sat_scale; - float valScale1 = hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale; + float valScale1 = hFract0 * entry00->val_scale + + hFract1 * entry01->val_scale; hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; satScale = sFract0 * satScale0 + sFract1 * satScale1; @@ -1643,14 +1674,14 @@ void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, fl } else { - float hScaled = h * ti.pc.hScale; - float sScaled = s * ti.pc.sScale; + float hScaled = h * ti.pc.h_scale; + float sScaled = s * ti.pc.s_scale; - if (ti.sRGBGamma) { + if (ti.srgb_gamma) { vEncoded = sRGBGammaForward(v); } - float vScaled = vEncoded * ti.pc.vScale; + float vScaled = vEncoded * ti.pc.v_scale; int hIndex0 = (int) hScaled; int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); @@ -1678,40 +1709,40 @@ void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, fl const HSBModify *entry10 = entry00 + ti.pc.valStep; const HSBModify *entry11 = entry01 + ti.pc.valStep; - float hueShift0 = vFract0 * (hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift) + - vFract1 * (hFract0 * entry10->fHueShift + - hFract1 * entry11->fHueShift); + float hueShift0 = vFract0 * (hFract0 * entry00->hue_shift + + hFract1 * entry01->hue_shift) + + vFract1 * (hFract0 * entry10->hue_shift + + hFract1 * entry11->hue_shift); - float satScale0 = vFract0 * (hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale) + - vFract1 * (hFract0 * entry10->fSatScale + - hFract1 * entry11->fSatScale); + float satScale0 = vFract0 * (hFract0 * entry00->sat_scale + + hFract1 * entry01->sat_scale) + + vFract1 * (hFract0 * entry10->sat_scale + + hFract1 * entry11->sat_scale); - float valScale0 = vFract0 * (hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale) + - vFract1 * (hFract0 * entry10->fValScale + - hFract1 * entry11->fValScale); + float valScale0 = vFract0 * (hFract0 * entry00->val_scale + + hFract1 * entry01->val_scale) + + vFract1 * (hFract0 * entry10->val_scale + + hFract1 * entry11->val_scale); entry00++; entry01++; entry10++; entry11++; - float hueShift1 = vFract0 * (hFract0 * entry00->fHueShift + - hFract1 * entry01->fHueShift) + - vFract1 * (hFract0 * entry10->fHueShift + - hFract1 * entry11->fHueShift); + float hueShift1 = vFract0 * (hFract0 * entry00->hue_shift + + hFract1 * entry01->hue_shift) + + vFract1 * (hFract0 * entry10->hue_shift + + hFract1 * entry11->hue_shift); - float satScale1 = vFract0 * (hFract0 * entry00->fSatScale + - hFract1 * entry01->fSatScale) + - vFract1 * (hFract0 * entry10->fSatScale + - hFract1 * entry11->fSatScale); + float satScale1 = vFract0 * (hFract0 * entry00->sat_scale + + hFract1 * entry01->sat_scale) + + vFract1 * (hFract0 * entry10->sat_scale + + hFract1 * entry11->sat_scale); - float valScale1 = vFract0 * (hFract0 * entry00->fValScale + - hFract1 * entry01->fValScale) + - vFract1 * (hFract0 * entry10->fValScale + - hFract1 * entry11->fValScale); + float valScale1 = vFract0 * (hFract0 * entry00->val_scale + + hFract1 * entry01->val_scale) + + vFract1 * (hFract0 * entry10->val_scale + + hFract1 * entry11->val_scale); hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; satScale = sFract0 * satScale0 + sFract1 * satScale1; @@ -1723,7 +1754,7 @@ void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, fl h += hueShift; s *= satScale; // no clipping here, we are RT float :-) - if (ti.sRGBGamma) { + if (ti.srgb_gamma) { v = sRGBGammaInverse(vEncoded * valScale); } else { v *= valScale; diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 2e47375c3..1ab9d64b6 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -35,7 +35,7 @@ namespace rtengine class DCPProfile final { public: - struct dcpApplyState{ + struct ApplyState { double m2ProPhoto[3][3]; double m2Work[3][3]; bool alreadyProPhoto; @@ -44,33 +44,44 @@ public: float blScale; }; - DCPProfile(const Glib::ustring &fname); + DCPProfile(const Glib::ustring& filename); ~DCPProfile(); bool getHasToneCurve() const; bool getHasLookTable() const; bool getHasHueSatMap() const; bool getHasBaselineExposureOffset() const; + void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const; void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; - void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, dcpApplyState &asOut); - void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const dcpApplyState &asIn) const; + void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut); + void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const ApplyState &asIn) const; private: struct HSBModify { - float fHueShift; - float fSatScale; - float fValScale; + float hue_shift; + float sat_scale; + float val_scale; }; + struct HSDTableInfo { - int iHueDivisions, iSatDivisions, iValDivisions; - int iHueStep, iValStep, iArrayCount; - bool sRGBGamma; + int hue_divisions; + int sat_divisions; + int val_divisions; + int iHueStep; + int iValStep; + int array_count; + bool srgb_gamma; struct { - float hScale, sScale, vScale; - int maxHueIndex0, maxSatIndex0, maxValIndex0; - int hueStep, valStep; + float h_scale; + float s_scale; + float v_scale; + int maxHueIndex0; + int maxSatIndex0; + int maxValIndex0; + int hueStep; + int valStep; } pc; }; @@ -81,16 +92,29 @@ private: const HSBModify* MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; - double mColorMatrix1[3][3], mColorMatrix2[3][3]; - bool hasColorMatrix1, hasColorMatrix2, hasForwardMatrix1, hasForwardMatrix2, hasToneCurve, hasBaselineExposureOffset, willInterpolate; - double mForwardMatrix1[3][3], mForwardMatrix2[3][3]; - double temperature1, temperature2; - double baselineExposureOffset; - HSBModify *aDeltas1, *aDeltas2, *aLookTable; - HSDTableInfo DeltaInfo, LookInfo; - short iLightSource1, iLightSource2; + double color_matrix_1[3][3]; + double color_matrix_2[3][3]; + bool has_color_matrix_1; + bool has_color_matrix_2; + bool has_forward_matrix_1; + bool has_forward_matrix_2; + bool has_tone_curve; + bool has_baseline_exposure_offset; + bool will_interpolate; + double forward_matrix_1[3][3]; + double forward_matrix_2[3][3]; + double temperature_1; + double temperature_2; + double baseline_exposure_offset; + HSBModify* deltas_1; + HSBModify* deltas_2; + HSBModify* look_table; + HSDTableInfo delta_info; + HSDTableInfo look_info; + short light_source_1; + short light_source_2; - AdobeToneCurve toneCurve; + AdobeToneCurve tone_curve; }; class DCPStore final diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index e7c26f378..bfe9c1c9a 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -773,7 +773,7 @@ void Crop::update (int todo) if (todo & M_RGBCURVE) { double rrm, ggm, bbm; - DCPProfile::dcpApplyState as; + DCPProfile::ApplyState as; DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as); parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index a1dee831f..f252dc1bb 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -109,7 +109,7 @@ public: virtual ImageData* getImageData () = 0; virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW() const = 0; - virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::dcpApplyState &as) + virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as) { return NULL; }; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 0f23483b6..f585acacf 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -535,7 +535,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) double ggm = 33.; double bbm = 33.; - DCPProfile::dcpApplyState as; + DCPProfile::ApplyState as; DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as); ipf.rgbProc (oprevi, oprevl, NULL, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation, diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index a95d7a06a..264ff1e2a 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2947,7 +2947,7 @@ filmlike_clip(float *r, float *g, float *b) void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn ) { rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, shmap, sat, rCurve, gCurve, bCurve, satLimit , satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn); } @@ -2955,7 +2955,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Process RGB image and convert to LAB space void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ) + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn ) { Imagefloat *tmpImage = nullptr; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index f1ac78d31..ccc77ab9f 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -232,11 +232,11 @@ public: void updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent); void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ); + const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn ); void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, - double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::dcpApplyState &asIn ); + double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn ); void labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ); void toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect); void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 400fdb3fe..18da69117 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -889,7 +889,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } } -DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb,DCPProfile::dcpApplyState &as) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb,DCPProfile::ApplyState &as) { DCPProfile *dcpProf = NULL; cmsHPROFILE dummy; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index ee62ea3ad..2af26c702 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -184,7 +184,7 @@ public: } void getAutoExpHistogram (LUTu & histogram, int& histcompr); void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); - DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::dcpApplyState &as); + DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as); void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 2539ee8be..3913dc6ba 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1041,7 +1041,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LabImage* labView = new LabImage (fw, fh); DCPProfile *dcpProf = nullptr; - DCPProfile::dcpApplyState as; + DCPProfile::ApplyState as; if (isRaw) { cmsHPROFILE dummy; RawImageSource::findInputProfile(params.icm.input, nullptr, camName, &dcpProf, dummy); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 138482403..c11ac6452 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -853,7 +853,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) - DCPProfile::dcpApplyState as; + DCPProfile::ApplyState as; DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as); ipf.rgbProc (baseImg, labView, NULL, curve1, curve2, curve, shmap, 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); diff --git a/rtengine/utils.h b/rtengine/utils.h index 1e742ffb3..c46999219 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -16,8 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _SIMPLEUTILS_ -#define _SIMPLEUTILS_ +#pragma once + +#include namespace rtengine { @@ -35,5 +36,10 @@ void rotate (unsigned char* img, int& w, int& h, int deg); void hflip (unsigned char* img, int w, int h); void vflip (unsigned char* img, int w, int h); +template +typename std::underlying_type::type toUnderlying(ENUM value) +{ + return static_cast::type>(value); +} + } -#endif From 8ee8eb4ed6105e35f2cf8b635dd4b8dd66fd619c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 7 Jun 2016 21:04:12 +0200 Subject: [PATCH 087/232] Another bunch of cleanups - DCPProfile::apply() - DCPProfile::makeHueSatMap() - DCPProfile::hsdApply() - Refactoring More to come... --- rtengine/dcp.cc | 478 +++++++++++++++++++------------------ rtengine/dcp.h | 51 ++-- rtengine/rawimagesource.cc | 2 +- rtgui/icmpanel.cc | 17 +- 4 files changed, 283 insertions(+), 265 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index f3ba11211..ebe2d8aee 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + #include #include @@ -609,10 +610,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : has_tone_curve(false), has_baseline_exposure_offset(false), will_interpolate(false), - baseline_exposure_offset(0.0), - deltas_1(nullptr), - deltas_2(nullptr), - look_table(nullptr) + baseline_exposure_offset(0.0) { constexpr int tiff_float_size = 4; @@ -709,9 +707,9 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_LOOK_TABLE_DATA)); look_info.array_count = tag->getCount() / 3; - look_table = new HSBModify[look_info.array_count]; + look_table.resize(look_info.array_count); - for (int i = 0; i < look_info.array_count; i++) { + for (unsigned int i = 0; i < look_info.array_count; i++) { look_table[i].hue_shift = tag->toDouble((i * 3) * tiff_float_size); look_table[i].sat_scale = tag->toDouble((i * 3 + 1) * tiff_float_size); look_table[i].val_scale = tag->toDouble((i * 3 + 2) * tiff_float_size); @@ -724,11 +722,11 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : : static_cast(look_info.hue_divisions) / 6.0f; look_info.pc.s_scale = look_info.sat_divisions - 1; look_info.pc.v_scale = look_info.val_divisions - 1; - look_info.pc.maxHueIndex0 = look_info.hue_divisions - 1; - look_info.pc.maxSatIndex0 = look_info.sat_divisions - 2; - look_info.pc.maxValIndex0 = look_info.val_divisions - 2; - look_info.pc.hueStep = look_info.sat_divisions; - look_info.pc.valStep = look_info.hue_divisions * look_info.pc.hueStep; + look_info.pc.max_hue_index0 = look_info.hue_divisions - 1; + look_info.pc.max_sat_index0 = look_info.sat_divisions - 2; + look_info.pc.max_val_index0 = look_info.val_divisions - 2; + look_info.pc.hue_step = look_info.sat_divisions; + look_info.pc.val_step = look_info.hue_divisions * look_info.pc.hue_step; } tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DIMS)); @@ -744,9 +742,9 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DATA_1)); delta_info.array_count = tag->getCount() / 3; - deltas_1 = new HSBModify[delta_info.array_count]; + deltas_1.resize(delta_info.array_count); - for (int i = 0; i < delta_info.array_count; ++i) { + for (unsigned int i = 0; i < delta_info.array_count; ++i) { deltas_1[i].hue_shift = tag->toDouble((i * 3) * tiff_float_size); deltas_1[i].sat_scale = tag->toDouble((i * 3 + 1) * tiff_float_size); deltas_1[i].val_scale = tag->toDouble((i * 3 + 2) * tiff_float_size); @@ -758,11 +756,11 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : : static_cast(delta_info.hue_divisions) / 6.0f; delta_info.pc.s_scale = delta_info.sat_divisions - 1; delta_info.pc.v_scale = delta_info.val_divisions - 1; - delta_info.pc.maxHueIndex0 = delta_info.hue_divisions - 1; - delta_info.pc.maxSatIndex0 = delta_info.sat_divisions - 2; - delta_info.pc.maxValIndex0 = delta_info.val_divisions - 2; - delta_info.pc.hueStep = delta_info.sat_divisions; - delta_info.pc.valStep = delta_info.hue_divisions * delta_info.pc.hueStep; + delta_info.pc.max_hue_index0 = delta_info.hue_divisions - 1; + delta_info.pc.max_sat_index0 = delta_info.sat_divisions - 2; + delta_info.pc.max_val_index0 = delta_info.val_divisions - 2; + delta_info.pc.hue_step = delta_info.sat_divisions; + delta_info.pc.val_step = delta_info.hue_divisions * delta_info.pc.hue_step; } if (light_source_2 != -1) { @@ -782,7 +780,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : // Second huesatmap if (has_second_hue_sat) { - deltas_2 = new HSBModify[delta_info.array_count]; + deltas_2.resize(delta_info.array_count); // Saturation maps. Need to be unwinded. tag = tagDir->getTag(toUnderlying(TagKey::PROFILE_HUE_SAT_MAP_DATA_2)); @@ -862,7 +860,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : will_interpolate = true; } - if (deltas_1 && deltas_2) { + if (!deltas_1.empty() && !deltas_2.empty()) { // We assume tables are different will_interpolate = true; } @@ -874,7 +872,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : will_interpolate = true; } - if (deltas_1 && deltas_2) { + if (!deltas_1.empty() && !deltas_2.empty()) { will_interpolate = true; } } @@ -886,9 +884,6 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : DCPProfile::~DCPProfile() { - delete[] deltas_1; - delete[] deltas_2; - delete[] look_table; } bool DCPProfile::getHasToneCurve() const @@ -898,12 +893,12 @@ bool DCPProfile::getHasToneCurve() const bool DCPProfile::getHasLookTable() const { - return look_table; + return !look_table.empty(); } bool DCPProfile::getHasHueSatMap() const { - return deltas_1; + return !deltas_1.empty(); } bool DCPProfile::getHasBaselineExposureOffset() const @@ -911,100 +906,129 @@ bool DCPProfile::getHasBaselineExposureOffset() const return has_baseline_exposure_offset; } -void DCPProfile::getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const +DCPProfile::Illuminants DCPProfile::getIlluminants() const { - i1 = light_source_1; - i2 = light_source_2; - temp1 = temperature_1, temp2 = temperature_2; - willInterpolate_ = will_interpolate; -}; + return { + light_source_1, + light_source_2, + temperature_1, + temperature_2, + will_interpolate + }; +} -void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], bool useToneCurve, bool applyHueSatMap, bool applyLookTable) const +void DCPProfile::apply( + Imagefloat* img, + int preferred_illuminant, + const Glib::ustring& working_space, + const ColorTemp& white_balance, + double pre_mul[3], + double cam_wb_matrix[3][3], + bool use_tone_curve, + bool apply_hue_sat_map, + bool apply_look_table +) const { + const TMatrix work_matrix = iccStore->workingSpaceInverseMatrix(working_space); - TMatrix mWork = iccStore->workingSpaceInverseMatrix (workingSpace); + double xyz_cam[3][3]; // Camera RGB to XYZ D50 matrix + makeXyzCam(white_balance, pre_mul, cam_wb_matrix, preferred_illuminant, xyz_cam); - double mXYZCAM[3][3]; // Camera RGB to XYZ D50 matrix - MakeXYZCAM(wb, pre_mul, camWbMatrix, preferredIlluminant, mXYZCAM); - HSBModify *deleteTableHandle; - const HSBModify *deltaBase = MakeHueSatMap(wb, preferredIlluminant, &deleteTableHandle); + const std::vector delta_base = makeHueSatMap(white_balance, preferred_illuminant); - if (!deltaBase) { - applyHueSatMap = false; + if (delta_base.empty()) { + apply_hue_sat_map = false; } - if (!look_table) { - applyLookTable = false; + if (look_table.empty()) { + apply_look_table = false; } - useToneCurve &= tone_curve; + use_tone_curve = use_tone_curve && tone_curve; - if (!applyHueSatMap && !applyLookTable && !useToneCurve) { - //===== The fast path: no LUT and not tone curve- Calculate matrix for direct conversion raw>working space - double mat[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + if (!apply_hue_sat_map && !apply_look_table && !use_tone_curve) { + // The fast path: No LUT and not tone curve --> Calculate matrix for direct conversion raw>working space + double mat[3][3] = {}; - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) - for (int k = 0; k < 3; k++) { - mat[i][j] += mWork[i][k] * mXYZCAM[k][j]; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { + mat[i][j] += work_matrix[i][k] * xyz_cam[k][j]; } + } + } // Apply the matrix part +#ifdef _OPENMP #pragma omp parallel for +#endif + for (int y = 0; y < img->height; ++y) { + for (int x = 0; x < img->width; x++) { + const float& newr = mat[0][0] * img->r(y, x) + mat[0][1] * img->g(y, x) + mat[0][2] * img->b(y, x); + const float& newg = mat[1][0] * img->r(y, x) + mat[1][1] * img->g(y, x) + mat[1][2] * img->b(y, x); + const float& newb = mat[2][0] * img->r(y, x) + mat[2][1] * img->g(y, x) + mat[2][2] * img->b(y, x); - for (int y = 0; y < pImg->height; y++) { - float newr, newg, newb; - - for (int x = 0; x < pImg->width; x++) { - newr = mat[0][0] * pImg->r(y, x) + mat[0][1] * pImg->g(y, x) + mat[0][2] * pImg->b(y, x); - newg = mat[1][0] * pImg->r(y, x) + mat[1][1] * pImg->g(y, x) + mat[1][2] * pImg->b(y, x); - newb = mat[2][0] * pImg->r(y, x) + mat[2][1] * pImg->g(y, x) + mat[2][2] * pImg->b(y, x); - - pImg->r(y, x) = newr; - pImg->g(y, x) = newg; - pImg->b(y, x) = newb; + img->r(y, x) = newr; + img->g(y, x) = newg; + img->b(y, x) = newb; } } } else { - //===== LUT available- Calculate matrix for conversion raw>ProPhoto - double m2ProPhoto[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + // LUT available --> Calculate matrix for conversion raw>ProPhoto + double pro_photo[3][3] = {}; - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) - for (int k = 0; k < 3; k++) { - m2ProPhoto[i][j] += prophoto_xyz[i][k] * mXYZCAM[k][j]; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { + pro_photo[i][j] += prophoto_xyz[i][k] * xyz_cam[k][j]; } + } + } - double m2Work[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + double work[3][3] = {}; - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; j++) - for (int k = 0; k < 3; k++) { - m2Work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { + work[i][j] += work_matrix[i][k] * xyz_prophoto[k][j]; } + } + } - // Convert to prophoto and apply LUT + // Convert to ProPhoto and apply LUT +#ifdef _OPENMP #pragma omp parallel for +#endif + for (int y = 0; y < img->height; ++y) { + float h, s, v, hs, ss, vs; - for (int y = 0; y < pImg->height; y++) { - float newr, newg, newb, h, s, v, hs, ss, vs; + for (int x = 0; x < img->width; x++) { + float newr = pro_photo[0][0] * img->r(y, x) + pro_photo[0][1] * img->g(y, x) + pro_photo[0][2] * img->b(y, x); + float newg = pro_photo[1][0] * img->r(y, x) + pro_photo[1][1] * img->g(y, x) + pro_photo[1][2] * img->b(y, x); + float newb = pro_photo[2][0] * img->r(y, x) + pro_photo[2][1] * img->g(y, x) + pro_photo[2][2] * img->b(y, x); - for (int x = 0; x < pImg->width; x++) { - newr = m2ProPhoto[0][0] * pImg->r(y, x) + m2ProPhoto[0][1] * pImg->g(y, x) + m2ProPhoto[0][2] * pImg->b(y, x); - newg = m2ProPhoto[1][0] * pImg->r(y, x) + m2ProPhoto[1][1] * pImg->g(y, x) + m2ProPhoto[1][2] * pImg->b(y, x); - newb = m2ProPhoto[2][0] * pImg->r(y, x) + m2ProPhoto[2][1] * pImg->g(y, x) + m2ProPhoto[2][2] * pImg->b(y, x); - - // if point is in negative area, just the matrix, but not the LUT - if ((applyHueSatMap || applyLookTable) && newr >= 0 && newg >= 0 && newb >= 0) { + // If point is in negative area, just the matrix, but not the LUT + if ( + ( + apply_hue_sat_map + || apply_look_table + ) + && newr >= 0 + && newg >= 0 + && newb >= 0 + ) { + float h; + float s; + float v; Color::rgb2hsv(newr, newg, newb, h , s, v); - h *= 6.f; // RT calculates in [0,1] + h *= 6.0f; // RT calculates in [0,1] - if (applyHueSatMap) { - HSDApply(delta_info, deltaBase, h, s, v); + if (apply_hue_sat_map) { + hsdApply(delta_info, delta_base, h, s, v); } - if (applyLookTable) { - HSDApply(look_info, look_table, h, s, v); + if (apply_look_table) { + hsdApply(look_info, look_table, h, s, v); } // RT range correction @@ -1017,24 +1041,20 @@ void DCPProfile::Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::us } h /= 6.f; - Color::hsv2rgb( h, s, v, newr, newg, newb); + + Color::hsv2rgb(h, s, v, newr, newg, newb); } - // tone curve - if (useToneCurve) { + if (use_tone_curve) { tone_curve.Apply(newr, newg, newb); } - pImg->r(y, x) = m2Work[0][0] * newr + m2Work[0][1] * newg + m2Work[0][2] * newb; - pImg->g(y, x) = m2Work[1][0] * newr + m2Work[1][1] * newg + m2Work[1][2] * newb; - pImg->b(y, x) = m2Work[2][0] * newr + m2Work[2][1] * newg + m2Work[2][2] * newb; + img->r(y, x) = work[0][0] * newr + work[0][1] * newg + work[0][2] * newb; + img->g(y, x) = work[1][0] * newr + work[1][1] * newg + work[1][2] * newb; + img->b(y, x) = work[2][0] * newr + work[2][1] * newg + work[2][2] * newb; } } } - - if (deleteTableHandle) { - delete[] deleteTableHandle; - } } void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut) @@ -1044,7 +1064,7 @@ void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useT asOut.applyLookTable = applyLookTable; asOut.blScale = 1.0; - if (!look_table) { + if (look_table.empty()) { asOut.applyLookTable = false; } @@ -1138,7 +1158,7 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int Color::rgb2hsv(newr, newg, newb, h, s, v); h *= 6.f; // RT calculates in [0,1] - HSDApply(look_info, look_table, h, s, v); + hsdApply(look_info, look_table, h, s, v); s = CLIP01(s); v = CLIP01(v); @@ -1351,7 +1371,7 @@ void DCPProfile::dngref_NeutralToXY(double neutral[3], int preferredIlluminant, XY[1] = lastXY[1]; } -void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const +void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const { // code adapted from dng_color_spec::FindXYZtoCamera // note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support) @@ -1551,53 +1571,52 @@ void DCPProfile::MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWb } } -const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const +std::vector DCPProfile::makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const { - - *deleteHandle = nullptr; - - if (!deltas_1) { - return nullptr; + if (deltas_1.empty()) { + return std::vector(); } - if (!deltas_2) { + if (deltas_2.empty()) { return deltas_1; } - if (preferredIlluminant == 1) { + if (preferred_illuminant == 1) { return deltas_1; - } else if (preferredIlluminant == 2) { + } else if (preferred_illuminant == 2) { return deltas_2; } - // Interpolate based on color temperature. - if (temperature_1 <= 0.0 || temperature_2 <= 0.0 || temperature_1 == temperature_2) { + // Interpolate based on color temperature + if ( + temperature_1 <= 0.0 + || temperature_2 <= 0.0 + || temperature_1 == temperature_2 + ) { return deltas_1; } - bool reverseOrder = temperature_1 > temperature_2; - double t1, t2; - - if (reverseOrder) { - t1 = temperature_2; - t2 = temperature_1; - } else { - t1 = temperature_1; - t2 = temperature_2; - } + const bool reverse = temperature_1 > temperature_2; + const double t1 = + reverse + ? temperature_2 + : temperature_1; + const double t2 = + reverse + ? temperature_1 + : temperature_2; double mix; - - if (wb.getTemp() <= t1) { + if (white_balance.getTemp() <= t1) { mix = 1.0; - } else if (wb.getTemp() >= t2) { + } else if (white_balance.getTemp() >= t2) { mix = 0.0; } else { - double invT = 1.0 / wb.getTemp(); + const double invT = 1.0 / white_balance.getTemp(); mix = (invT - (1.0 / t2)) / ((1.0 / t1) - (1.0 / t2)); } - if (reverseOrder) { + if (reverse) { mix = 1.0 - mix; } @@ -1608,156 +1627,139 @@ const DCPProfile::HSBModify* DCPProfile::MakeHueSatMap(const ColorTemp &wb, int } // Interpolate between the tables. - HSBModify *aDeltas = new HSBModify[delta_info.array_count]; - *deleteHandle = aDeltas; - float w1 = (float)mix; - float w2 = 1.0f - (float)mix; + std::vector res(delta_info.array_count); - for (int i = 0; i < delta_info.array_count; i++) { - aDeltas[i].hue_shift = w1 * deltas_1[i].hue_shift + w2 * deltas_2[i].hue_shift; - aDeltas[i].sat_scale = w1 * deltas_1[i].sat_scale + w2 * deltas_2[i].sat_scale; - aDeltas[i].val_scale = w1 * deltas_1[i].val_scale + w2 * deltas_2[i].val_scale; + const float w1 = mix; + const float w2 = 1.0f - w1; + + for (unsigned int i = 0; i < delta_info.array_count; ++i) { + res[i].hue_shift = w1 * deltas_1[i].hue_shift + w2 * deltas_2[i].hue_shift; + res[i].sat_scale = w1 * deltas_1[i].sat_scale + w2 * deltas_2[i].sat_scale; + res[i].val_scale = w1 * deltas_1[i].val_scale + w2 * deltas_2[i].val_scale; } - return aDeltas; + return res; } -void DCPProfile::HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const +void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const { + // Apply the HueSatMap. Ported from Adobes reference implementation. + float hue_shift; + float sat_scale; + float val_scale; + float v_encoded = v; - // Apply the HueSatMap. Ported from Adobes reference implementation - float hueShift, satScale, valScale; - float vEncoded = v; + if (table_info.val_divisions < 2) { + // Optimize most common case of "2.5D" table + const float h_scaled = h * table_info.pc.h_scale; + const float s_scaled = s * table_info.pc.s_scale; - if (ti.val_divisions < 2) { // Optimize most common case of "2.5D" table. - float hScaled = h * ti.pc.h_scale; - float sScaled = s * ti.pc.s_scale; + int h_index0 = max(h_scaled, 0); + const int s_index0 = max(min(s_scaled, table_info.pc.max_sat_index0), 0); - int hIndex0 = max((int)hScaled, 0); - int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); + int h_index1 = h_index0 + 1; - int hIndex1 = hIndex0 + 1; - - if (hIndex0 >= ti.pc.maxHueIndex0) { - hIndex0 = ti.pc.maxHueIndex0; - hIndex1 = 0; + if (h_index0 >= table_info.pc.max_hue_index0) { + h_index0 = table_info.pc.max_hue_index0; + h_index1 = 0; } - float hFract1 = hScaled - (float) hIndex0; - float sFract1 = sScaled - (float) sIndex0; + const float h_fract1 = h_scaled - static_cast(h_index0); + const float s_fract1 = s_scaled - static_cast(s_index0); - float hFract0 = 1.0f - hFract1; - float sFract0 = 1.0f - sFract1; + const float h_fract0 = 1.0f - h_fract1; + const float s_fract0 = 1.0f - s_fract1; - const HSBModify *entry00 = tableBase + hIndex0 * ti.pc.hueStep + sIndex0; - const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; + std::vector::size_type e00_index = h_index0 * table_info.pc.hue_step + s_index0; + std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; - float hueShift0 = hFract0 * entry00->hue_shift + hFract1 * entry01->hue_shift; - float satScale0 = hFract0 * entry00->sat_scale + hFract1 * entry01->sat_scale; - float valScale0 = hFract0 * entry00->val_scale + hFract1 * entry01->val_scale; + const float hue_shift0 = h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift; + const float sat_scale0 = h_fract0 * table_base[e00_index].sat_scale + h_fract1 * table_base[e01_index].sat_scale; + const float val_scale0 = h_fract0 * table_base[e00_index].val_scale + h_fract1 * table_base[e01_index].val_scale; - entry00++; - entry01++; + ++e00_index; + ++e01_index; - float hueShift1 = hFract0 * entry00->hue_shift + - hFract1 * entry01->hue_shift; - - float satScale1 = hFract0 * entry00->sat_scale + - hFract1 * entry01->sat_scale; - - float valScale1 = hFract0 * entry00->val_scale + - hFract1 * entry01->val_scale; - - hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; - satScale = sFract0 * satScale0 + sFract1 * satScale1; - valScale = sFract0 * valScale0 + sFract1 * valScale1; + const float hueShift1 = h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift; + const float satScale1 = h_fract0 * table_base[e00_index].sat_scale + h_fract1 * table_base[e01_index].sat_scale; + const float valScale1 = h_fract0 * table_base[e00_index].val_scale + h_fract1 * table_base[e01_index].val_scale; + hue_shift = s_fract0 * hue_shift0 + s_fract1 * hueShift1; + sat_scale = s_fract0 * sat_scale0 + s_fract1 * satScale1; + val_scale = s_fract0 * val_scale0 + s_fract1 * valScale1; } else { + const float h_scaled = h * table_info.pc.h_scale; + const float s_scaled = s * table_info.pc.s_scale; - float hScaled = h * ti.pc.h_scale; - float sScaled = s * ti.pc.s_scale; - - if (ti.srgb_gamma) { - vEncoded = sRGBGammaForward(v); + if (table_info.srgb_gamma) { + v_encoded = sRGBGammaForward(v); } - float vScaled = vEncoded * ti.pc.v_scale; + const float v_scaled = v_encoded * table_info.pc.v_scale; - int hIndex0 = (int) hScaled; - int sIndex0 = max(min((int)sScaled, ti.pc.maxSatIndex0), 0); - int vIndex0 = max(min((int)vScaled, ti.pc.maxValIndex0), 0); + int h_index0 = (int) h_scaled; + const int s_index0 = max(min(s_scaled, table_info.pc.max_sat_index0), 0); + const int v_index0 = max(min(v_scaled, table_info.pc.max_val_index0), 0); - int hIndex1 = hIndex0 + 1; + int h_index1 = h_index0 + 1; - if (hIndex0 >= ti.pc.maxHueIndex0) { - hIndex0 = ti.pc.maxHueIndex0; - hIndex1 = 0; + if (h_index0 >= table_info.pc.max_hue_index0) { + h_index0 = table_info.pc.max_hue_index0; + h_index1 = 0; } - float hFract1 = hScaled - (float) hIndex0; - float sFract1 = sScaled - (float) sIndex0; - float vFract1 = vScaled - (float) vIndex0; + const float h_fract1 = h_scaled - static_cast(h_index0); + const float s_fract1 = s_scaled - static_cast(s_index0); + const float v_fract1 = v_scaled - static_cast(v_index0); - float hFract0 = 1.0f - hFract1; - float sFract0 = 1.0f - sFract1; - float vFract0 = 1.0f - vFract1; + const float h_fract0 = 1.0f - h_fract1; + const float s_fract0 = 1.0f - s_fract1; + const float v_fract0 = 1.0f - v_fract1; - const HSBModify *entry00 = tableBase + vIndex0 * ti.pc.valStep + hIndex0 * ti.pc.hueStep + sIndex0; + std::vector::size_type e00_index = v_index0 * table_info.pc.val_step + h_index0 * table_info.pc.hue_step + s_index0; + std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; + std::vector::size_type e10_index = e00_index + table_info.pc.val_step; + std::vector::size_type e11_index = e01_index + table_info.pc.val_step; - const HSBModify *entry01 = entry00 + (hIndex1 - hIndex0) * ti.pc.hueStep; + const float hueShift0 = + v_fract0 * (h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift) + + v_fract1 * (h_fract0 * table_base[e10_index].hue_shift + h_fract1 * table_base[e11_index].hue_shift); + const float satScale0 = + v_fract0 * (h_fract0 * table_base[e00_index].sat_scale + h_fract1 * table_base[e01_index].sat_scale) + + v_fract1 * (h_fract0 * table_base[e10_index].sat_scale + h_fract1 * table_base[e11_index].sat_scale); + const float valScale0 = + v_fract0 * (h_fract0 * table_base[e00_index].val_scale + h_fract1 * table_base[e01_index].val_scale) + + v_fract1 * (h_fract0 * table_base[e10_index].val_scale + h_fract1 * table_base[e11_index].val_scale); - const HSBModify *entry10 = entry00 + ti.pc.valStep; - const HSBModify *entry11 = entry01 + ti.pc.valStep; + ++e00_index; + ++e01_index; + ++e10_index; + ++e11_index; - float hueShift0 = vFract0 * (hFract0 * entry00->hue_shift + - hFract1 * entry01->hue_shift) + - vFract1 * (hFract0 * entry10->hue_shift + - hFract1 * entry11->hue_shift); + const float hueShift1 = + v_fract0 * (h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift) + + v_fract1 * (h_fract0 * table_base[e10_index].hue_shift + h_fract1 * table_base[e11_index].hue_shift); + const float satScale1 = + v_fract0 * (h_fract0 * table_base[e00_index].sat_scale + h_fract1 * table_base[e01_index].sat_scale) + + v_fract1 * (h_fract0 * table_base[e10_index].sat_scale + h_fract1 * table_base[e11_index].sat_scale); + const float valScale1 = + v_fract0 * (h_fract0 * table_base[e00_index].val_scale + h_fract1 * table_base[e01_index].val_scale) + + v_fract1 * (h_fract0 * table_base[e10_index].val_scale + h_fract1 * table_base[e11_index].val_scale); - float satScale0 = vFract0 * (hFract0 * entry00->sat_scale + - hFract1 * entry01->sat_scale) + - vFract1 * (hFract0 * entry10->sat_scale + - hFract1 * entry11->sat_scale); - - float valScale0 = vFract0 * (hFract0 * entry00->val_scale + - hFract1 * entry01->val_scale) + - vFract1 * (hFract0 * entry10->val_scale + - hFract1 * entry11->val_scale); - - entry00++; - entry01++; - entry10++; - entry11++; - - float hueShift1 = vFract0 * (hFract0 * entry00->hue_shift + - hFract1 * entry01->hue_shift) + - vFract1 * (hFract0 * entry10->hue_shift + - hFract1 * entry11->hue_shift); - - float satScale1 = vFract0 * (hFract0 * entry00->sat_scale + - hFract1 * entry01->sat_scale) + - vFract1 * (hFract0 * entry10->sat_scale + - hFract1 * entry11->sat_scale); - - float valScale1 = vFract0 * (hFract0 * entry00->val_scale + - hFract1 * entry01->val_scale) + - vFract1 * (hFract0 * entry10->val_scale + - hFract1 * entry11->val_scale); - - hueShift = sFract0 * hueShift0 + sFract1 * hueShift1; - satScale = sFract0 * satScale0 + sFract1 * satScale1; - valScale = sFract0 * valScale0 + sFract1 * valScale1; + hue_shift = s_fract0 * hueShift0 + s_fract1 * hueShift1; + sat_scale = s_fract0 * satScale0 + s_fract1 * satScale1; + val_scale = s_fract0 * valScale0 + s_fract1 * valScale1; } - hueShift *= (6.0f / 360.0f); // Convert to internal hue range. + hue_shift *= 6.0f / 360.0f; // Convert to internal hue range. - h += hueShift; - s *= satScale; // no clipping here, we are RT float :-) + h += hue_shift; + s *= sat_scale; // No clipping here, we are RT float :-) - if (ti.srgb_gamma) { - v = sRGBGammaInverse(vEncoded * valScale); + if (table_info.srgb_gamma) { + v = sRGBGammaInverse(v_encoded * val_scale); } else { - v *= valScale; + v *= val_scale; } } diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 1ab9d64b6..98dfff69a 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -20,6 +20,7 @@ #pragma once #include +#include #include @@ -44,6 +45,14 @@ public: float blScale; }; + struct Illuminants { + short light_source_1; + short light_source_2; + double temperature_1; + double temperature_2; + bool will_interpolate; + }; + DCPProfile(const Glib::ustring& filename); ~DCPProfile(); @@ -52,9 +61,19 @@ public: bool getHasHueSatMap() const; bool getHasBaselineExposureOffset() const; - void getIlluminants(int &i1, double &temp1, int &i2, double &temp2, bool &willInterpolate_) const; + Illuminants getIlluminants() const; - void Apply(Imagefloat *pImg, int preferredIlluminant, const Glib::ustring &workingSpace, const ColorTemp &wb, double pre_mul[3], double camMatrix[3][3], bool useToneCurve = false, bool applyHueSatMap = true, bool applyLookTable = false) const; + void apply( + Imagefloat* img, + int preferred_illuminant, + const Glib::ustring& working_space, + const ColorTemp& white_balance, + double pre_mul[3], + double cam_matrix[3][3], + bool use_tone_curve = false, + bool apply_hue_sat_map = true, + bool apply_look_table = false + ) const; void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut); void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const ApplyState &asIn) const; @@ -69,28 +88,28 @@ private: int hue_divisions; int sat_divisions; int val_divisions; - int iHueStep; - int iValStep; - int array_count; + int hue_step; + int val_step; + unsigned int array_count; bool srgb_gamma; struct { float h_scale; float s_scale; float v_scale; - int maxHueIndex0; - int maxSatIndex0; - int maxValIndex0; - int hueStep; - int valStep; + int max_hue_index0; + int max_sat_index0; + int max_val_index0; + int hue_step; + int val_step; } pc; }; void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; void dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const; - void MakeXYZCAM(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; - const HSBModify* MakeHueSatMap(const ColorTemp &wb, int preferredIlluminant, HSBModify **deleteHandle) const; - void HSDApply(const HSDTableInfo &ti, const HSBModify *tableBase, float &h, float &s, float &v) const; + void makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; + std::vector makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const; + void hsdApply(const HSDTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const; double color_matrix_1[3][3]; double color_matrix_2[3][3]; @@ -106,9 +125,9 @@ private: double temperature_1; double temperature_2; double baseline_exposure_offset; - HSBModify* deltas_1; - HSBModify* deltas_2; - HSBModify* look_table; + std::vector deltas_1; + std::vector deltas_2; + std::vector look_table; HSDTableInfo delta_info; HSDTableInfo look_info; short light_source_1; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 18da69117..16c7fb21b 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3727,7 +3727,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam if (dcpProf != NULL) { // DCP processing - dcpProf->Apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul, camMatrix, false, cmp.applyHueSatMap, false); + dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul, camMatrix, false, cmp.applyHueSatMap, false); return; } diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 15a171efe..cc2cbc039 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -385,24 +385,21 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) ckbApplyHueSatMap->set_sensitive (true); } - int i1, i2; - double temp1, temp2; - bool willInterpolate; - dcp->getIlluminants(i1, temp1, i2, temp2, willInterpolate); + const DCPProfile::Illuminants illuminants = dcp->getIlluminants(); - if (willInterpolate) { - if (dcpTemperatures[0] != temp1 || dcpTemperatures[1] != temp2) { + if (illuminants.will_interpolate) { + if (dcpTemperatures[0] != illuminants.temperature_1 || dcpTemperatures[1] != illuminants.temperature_2) { char tempstr1[64], tempstr2[64]; - sprintf(tempstr1, "%.0fK", temp1); - sprintf(tempstr2, "%.0fK", temp2); + sprintf(tempstr1, "%.0fK", illuminants.temperature_1); + sprintf(tempstr2, "%.0fK", illuminants.temperature_2); int curr_active = dcpIll->get_active_row_number(); ignoreDcpSignal = true; dcpIll->clear_items (); dcpIll->append_text (M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); dcpIll->append_text (tempstr1); dcpIll->append_text (tempstr2); - dcpTemperatures[0] = temp1; - dcpTemperatures[1] = temp2; + dcpTemperatures[0] = illuminants.temperature_1; + dcpTemperatures[1] = illuminants.temperature_2; dcpIll->set_active (curr_active); ignoreDcpSignal = false; } From 47aa3402aea3acb2d64d774fd70e09c24bf9f3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 9 Jun 2016 19:08:46 +0200 Subject: [PATCH 088/232] Finalize `dcp.*` cleanup (#3304) - Introduce DCPProfile::Triple and DCPProfile::Matrix - Hide DCPProfile::ApplyState internals - Refactor the rest --- rtengine/dcp.cc | 1287 ++++++++++++++++++------------------ rtengine/dcp.h | 65 +- rtengine/rawimagesource.cc | 14 +- 3 files changed, 704 insertions(+), 662 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index ebe2d8aee..775428a4e 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -17,7 +17,6 @@ * along with RawTherapee. If not, see . */ -#include #include #include "dcp.h" @@ -27,316 +26,14 @@ #include "improcfun.h" #include "rt_math.h" -using namespace std; using namespace rtengine; using namespace rtexif; namespace { -static const float adobe_camera_raw_default_curve[] = { - 0.00000f, 0.00078f, 0.00160f, 0.00242f, - 0.00314f, 0.00385f, 0.00460f, 0.00539f, - 0.00623f, 0.00712f, 0.00806f, 0.00906f, - 0.01012f, 0.01122f, 0.01238f, 0.01359f, - 0.01485f, 0.01616f, 0.01751f, 0.01890f, - 0.02033f, 0.02180f, 0.02331f, 0.02485f, - 0.02643f, 0.02804f, 0.02967f, 0.03134f, - 0.03303f, 0.03475f, 0.03648f, 0.03824f, - 0.04002f, 0.04181f, 0.04362f, 0.04545f, - 0.04730f, 0.04916f, 0.05103f, 0.05292f, - 0.05483f, 0.05675f, 0.05868f, 0.06063f, - 0.06259f, 0.06457f, 0.06655f, 0.06856f, - 0.07057f, 0.07259f, 0.07463f, 0.07668f, - 0.07874f, 0.08081f, 0.08290f, 0.08499f, - 0.08710f, 0.08921f, 0.09134f, 0.09348f, - 0.09563f, 0.09779f, 0.09996f, 0.10214f, - 0.10433f, 0.10652f, 0.10873f, 0.11095f, - 0.11318f, 0.11541f, 0.11766f, 0.11991f, - 0.12218f, 0.12445f, 0.12673f, 0.12902f, - 0.13132f, 0.13363f, 0.13595f, 0.13827f, - 0.14061f, 0.14295f, 0.14530f, 0.14765f, - 0.15002f, 0.15239f, 0.15477f, 0.15716f, - 0.15956f, 0.16197f, 0.16438f, 0.16680f, - 0.16923f, 0.17166f, 0.17410f, 0.17655f, - 0.17901f, 0.18148f, 0.18395f, 0.18643f, - 0.18891f, 0.19141f, 0.19391f, 0.19641f, - 0.19893f, 0.20145f, 0.20398f, 0.20651f, - 0.20905f, 0.21160f, 0.21416f, 0.21672f, - 0.21929f, 0.22185f, 0.22440f, 0.22696f, - 0.22950f, 0.23204f, 0.23458f, 0.23711f, - 0.23963f, 0.24215f, 0.24466f, 0.24717f, - 0.24967f, 0.25216f, 0.25465f, 0.25713f, - 0.25961f, 0.26208f, 0.26454f, 0.26700f, - 0.26945f, 0.27189f, 0.27433f, 0.27676f, - 0.27918f, 0.28160f, 0.28401f, 0.28641f, - 0.28881f, 0.29120f, 0.29358f, 0.29596f, - 0.29833f, 0.30069f, 0.30305f, 0.30540f, - 0.30774f, 0.31008f, 0.31241f, 0.31473f, - 0.31704f, 0.31935f, 0.32165f, 0.32395f, - 0.32623f, 0.32851f, 0.33079f, 0.33305f, - 0.33531f, 0.33756f, 0.33981f, 0.34205f, - 0.34428f, 0.34650f, 0.34872f, 0.35093f, - 0.35313f, 0.35532f, 0.35751f, 0.35969f, - 0.36187f, 0.36404f, 0.36620f, 0.36835f, - 0.37050f, 0.37264f, 0.37477f, 0.37689f, - 0.37901f, 0.38112f, 0.38323f, 0.38533f, - 0.38742f, 0.38950f, 0.39158f, 0.39365f, - 0.39571f, 0.39777f, 0.39982f, 0.40186f, - 0.40389f, 0.40592f, 0.40794f, 0.40996f, - 0.41197f, 0.41397f, 0.41596f, 0.41795f, - 0.41993f, 0.42191f, 0.42388f, 0.42584f, - 0.42779f, 0.42974f, 0.43168f, 0.43362f, - 0.43554f, 0.43747f, 0.43938f, 0.44129f, - 0.44319f, 0.44509f, 0.44698f, 0.44886f, - 0.45073f, 0.45260f, 0.45447f, 0.45632f, - 0.45817f, 0.46002f, 0.46186f, 0.46369f, - 0.46551f, 0.46733f, 0.46914f, 0.47095f, - 0.47275f, 0.47454f, 0.47633f, 0.47811f, - 0.47989f, 0.48166f, 0.48342f, 0.48518f, - 0.48693f, 0.48867f, 0.49041f, 0.49214f, - 0.49387f, 0.49559f, 0.49730f, 0.49901f, - 0.50072f, 0.50241f, 0.50410f, 0.50579f, - 0.50747f, 0.50914f, 0.51081f, 0.51247f, - 0.51413f, 0.51578f, 0.51742f, 0.51906f, - 0.52069f, 0.52232f, 0.52394f, 0.52556f, - 0.52717f, 0.52878f, 0.53038f, 0.53197f, - 0.53356f, 0.53514f, 0.53672f, 0.53829f, - 0.53986f, 0.54142f, 0.54297f, 0.54452f, - 0.54607f, 0.54761f, 0.54914f, 0.55067f, - 0.55220f, 0.55371f, 0.55523f, 0.55673f, - 0.55824f, 0.55973f, 0.56123f, 0.56271f, - 0.56420f, 0.56567f, 0.56715f, 0.56861f, - 0.57007f, 0.57153f, 0.57298f, 0.57443f, - 0.57587f, 0.57731f, 0.57874f, 0.58017f, - 0.58159f, 0.58301f, 0.58443f, 0.58583f, - 0.58724f, 0.58864f, 0.59003f, 0.59142f, - 0.59281f, 0.59419f, 0.59556f, 0.59694f, - 0.59830f, 0.59966f, 0.60102f, 0.60238f, - 0.60373f, 0.60507f, 0.60641f, 0.60775f, - 0.60908f, 0.61040f, 0.61173f, 0.61305f, - 0.61436f, 0.61567f, 0.61698f, 0.61828f, - 0.61957f, 0.62087f, 0.62216f, 0.62344f, - 0.62472f, 0.62600f, 0.62727f, 0.62854f, - 0.62980f, 0.63106f, 0.63232f, 0.63357f, - 0.63482f, 0.63606f, 0.63730f, 0.63854f, - 0.63977f, 0.64100f, 0.64222f, 0.64344f, - 0.64466f, 0.64587f, 0.64708f, 0.64829f, - 0.64949f, 0.65069f, 0.65188f, 0.65307f, - 0.65426f, 0.65544f, 0.65662f, 0.65779f, - 0.65897f, 0.66013f, 0.66130f, 0.66246f, - 0.66362f, 0.66477f, 0.66592f, 0.66707f, - 0.66821f, 0.66935f, 0.67048f, 0.67162f, - 0.67275f, 0.67387f, 0.67499f, 0.67611f, - 0.67723f, 0.67834f, 0.67945f, 0.68055f, - 0.68165f, 0.68275f, 0.68385f, 0.68494f, - 0.68603f, 0.68711f, 0.68819f, 0.68927f, - 0.69035f, 0.69142f, 0.69249f, 0.69355f, - 0.69461f, 0.69567f, 0.69673f, 0.69778f, - 0.69883f, 0.69988f, 0.70092f, 0.70196f, - 0.70300f, 0.70403f, 0.70506f, 0.70609f, - 0.70711f, 0.70813f, 0.70915f, 0.71017f, - 0.71118f, 0.71219f, 0.71319f, 0.71420f, - 0.71520f, 0.71620f, 0.71719f, 0.71818f, - 0.71917f, 0.72016f, 0.72114f, 0.72212f, - 0.72309f, 0.72407f, 0.72504f, 0.72601f, - 0.72697f, 0.72794f, 0.72890f, 0.72985f, - 0.73081f, 0.73176f, 0.73271f, 0.73365f, - 0.73460f, 0.73554f, 0.73647f, 0.73741f, - 0.73834f, 0.73927f, 0.74020f, 0.74112f, - 0.74204f, 0.74296f, 0.74388f, 0.74479f, - 0.74570f, 0.74661f, 0.74751f, 0.74842f, - 0.74932f, 0.75021f, 0.75111f, 0.75200f, - 0.75289f, 0.75378f, 0.75466f, 0.75555f, - 0.75643f, 0.75730f, 0.75818f, 0.75905f, - 0.75992f, 0.76079f, 0.76165f, 0.76251f, - 0.76337f, 0.76423f, 0.76508f, 0.76594f, - 0.76679f, 0.76763f, 0.76848f, 0.76932f, - 0.77016f, 0.77100f, 0.77183f, 0.77267f, - 0.77350f, 0.77432f, 0.77515f, 0.77597f, - 0.77680f, 0.77761f, 0.77843f, 0.77924f, - 0.78006f, 0.78087f, 0.78167f, 0.78248f, - 0.78328f, 0.78408f, 0.78488f, 0.78568f, - 0.78647f, 0.78726f, 0.78805f, 0.78884f, - 0.78962f, 0.79040f, 0.79118f, 0.79196f, - 0.79274f, 0.79351f, 0.79428f, 0.79505f, - 0.79582f, 0.79658f, 0.79735f, 0.79811f, - 0.79887f, 0.79962f, 0.80038f, 0.80113f, - 0.80188f, 0.80263f, 0.80337f, 0.80412f, - 0.80486f, 0.80560f, 0.80634f, 0.80707f, - 0.80780f, 0.80854f, 0.80926f, 0.80999f, - 0.81072f, 0.81144f, 0.81216f, 0.81288f, - 0.81360f, 0.81431f, 0.81503f, 0.81574f, - 0.81645f, 0.81715f, 0.81786f, 0.81856f, - 0.81926f, 0.81996f, 0.82066f, 0.82135f, - 0.82205f, 0.82274f, 0.82343f, 0.82412f, - 0.82480f, 0.82549f, 0.82617f, 0.82685f, - 0.82753f, 0.82820f, 0.82888f, 0.82955f, - 0.83022f, 0.83089f, 0.83155f, 0.83222f, - 0.83288f, 0.83354f, 0.83420f, 0.83486f, - 0.83552f, 0.83617f, 0.83682f, 0.83747f, - 0.83812f, 0.83877f, 0.83941f, 0.84005f, - 0.84069f, 0.84133f, 0.84197f, 0.84261f, - 0.84324f, 0.84387f, 0.84450f, 0.84513f, - 0.84576f, 0.84639f, 0.84701f, 0.84763f, - 0.84825f, 0.84887f, 0.84949f, 0.85010f, - 0.85071f, 0.85132f, 0.85193f, 0.85254f, - 0.85315f, 0.85375f, 0.85436f, 0.85496f, - 0.85556f, 0.85615f, 0.85675f, 0.85735f, - 0.85794f, 0.85853f, 0.85912f, 0.85971f, - 0.86029f, 0.86088f, 0.86146f, 0.86204f, - 0.86262f, 0.86320f, 0.86378f, 0.86435f, - 0.86493f, 0.86550f, 0.86607f, 0.86664f, - 0.86720f, 0.86777f, 0.86833f, 0.86889f, - 0.86945f, 0.87001f, 0.87057f, 0.87113f, - 0.87168f, 0.87223f, 0.87278f, 0.87333f, - 0.87388f, 0.87443f, 0.87497f, 0.87552f, - 0.87606f, 0.87660f, 0.87714f, 0.87768f, - 0.87821f, 0.87875f, 0.87928f, 0.87981f, - 0.88034f, 0.88087f, 0.88140f, 0.88192f, - 0.88244f, 0.88297f, 0.88349f, 0.88401f, - 0.88453f, 0.88504f, 0.88556f, 0.88607f, - 0.88658f, 0.88709f, 0.88760f, 0.88811f, - 0.88862f, 0.88912f, 0.88963f, 0.89013f, - 0.89063f, 0.89113f, 0.89163f, 0.89212f, - 0.89262f, 0.89311f, 0.89360f, 0.89409f, - 0.89458f, 0.89507f, 0.89556f, 0.89604f, - 0.89653f, 0.89701f, 0.89749f, 0.89797f, - 0.89845f, 0.89892f, 0.89940f, 0.89987f, - 0.90035f, 0.90082f, 0.90129f, 0.90176f, - 0.90222f, 0.90269f, 0.90316f, 0.90362f, - 0.90408f, 0.90454f, 0.90500f, 0.90546f, - 0.90592f, 0.90637f, 0.90683f, 0.90728f, - 0.90773f, 0.90818f, 0.90863f, 0.90908f, - 0.90952f, 0.90997f, 0.91041f, 0.91085f, - 0.91130f, 0.91173f, 0.91217f, 0.91261f, - 0.91305f, 0.91348f, 0.91392f, 0.91435f, - 0.91478f, 0.91521f, 0.91564f, 0.91606f, - 0.91649f, 0.91691f, 0.91734f, 0.91776f, - 0.91818f, 0.91860f, 0.91902f, 0.91944f, - 0.91985f, 0.92027f, 0.92068f, 0.92109f, - 0.92150f, 0.92191f, 0.92232f, 0.92273f, - 0.92314f, 0.92354f, 0.92395f, 0.92435f, - 0.92475f, 0.92515f, 0.92555f, 0.92595f, - 0.92634f, 0.92674f, 0.92713f, 0.92753f, - 0.92792f, 0.92831f, 0.92870f, 0.92909f, - 0.92947f, 0.92986f, 0.93025f, 0.93063f, - 0.93101f, 0.93139f, 0.93177f, 0.93215f, - 0.93253f, 0.93291f, 0.93328f, 0.93366f, - 0.93403f, 0.93440f, 0.93478f, 0.93515f, - 0.93551f, 0.93588f, 0.93625f, 0.93661f, - 0.93698f, 0.93734f, 0.93770f, 0.93807f, - 0.93843f, 0.93878f, 0.93914f, 0.93950f, - 0.93986f, 0.94021f, 0.94056f, 0.94092f, - 0.94127f, 0.94162f, 0.94197f, 0.94231f, - 0.94266f, 0.94301f, 0.94335f, 0.94369f, - 0.94404f, 0.94438f, 0.94472f, 0.94506f, - 0.94540f, 0.94573f, 0.94607f, 0.94641f, - 0.94674f, 0.94707f, 0.94740f, 0.94774f, - 0.94807f, 0.94839f, 0.94872f, 0.94905f, - 0.94937f, 0.94970f, 0.95002f, 0.95035f, - 0.95067f, 0.95099f, 0.95131f, 0.95163f, - 0.95194f, 0.95226f, 0.95257f, 0.95289f, - 0.95320f, 0.95351f, 0.95383f, 0.95414f, - 0.95445f, 0.95475f, 0.95506f, 0.95537f, - 0.95567f, 0.95598f, 0.95628f, 0.95658f, - 0.95688f, 0.95718f, 0.95748f, 0.95778f, - 0.95808f, 0.95838f, 0.95867f, 0.95897f, - 0.95926f, 0.95955f, 0.95984f, 0.96013f, - 0.96042f, 0.96071f, 0.96100f, 0.96129f, - 0.96157f, 0.96186f, 0.96214f, 0.96242f, - 0.96271f, 0.96299f, 0.96327f, 0.96355f, - 0.96382f, 0.96410f, 0.96438f, 0.96465f, - 0.96493f, 0.96520f, 0.96547f, 0.96574f, - 0.96602f, 0.96629f, 0.96655f, 0.96682f, - 0.96709f, 0.96735f, 0.96762f, 0.96788f, - 0.96815f, 0.96841f, 0.96867f, 0.96893f, - 0.96919f, 0.96945f, 0.96971f, 0.96996f, - 0.97022f, 0.97047f, 0.97073f, 0.97098f, - 0.97123f, 0.97149f, 0.97174f, 0.97199f, - 0.97223f, 0.97248f, 0.97273f, 0.97297f, - 0.97322f, 0.97346f, 0.97371f, 0.97395f, - 0.97419f, 0.97443f, 0.97467f, 0.97491f, - 0.97515f, 0.97539f, 0.97562f, 0.97586f, - 0.97609f, 0.97633f, 0.97656f, 0.97679f, - 0.97702f, 0.97725f, 0.97748f, 0.97771f, - 0.97794f, 0.97817f, 0.97839f, 0.97862f, - 0.97884f, 0.97907f, 0.97929f, 0.97951f, - 0.97973f, 0.97995f, 0.98017f, 0.98039f, - 0.98061f, 0.98082f, 0.98104f, 0.98125f, - 0.98147f, 0.98168f, 0.98189f, 0.98211f, - 0.98232f, 0.98253f, 0.98274f, 0.98295f, - 0.98315f, 0.98336f, 0.98357f, 0.98377f, - 0.98398f, 0.98418f, 0.98438f, 0.98458f, - 0.98478f, 0.98498f, 0.98518f, 0.98538f, - 0.98558f, 0.98578f, 0.98597f, 0.98617f, - 0.98636f, 0.98656f, 0.98675f, 0.98694f, - 0.98714f, 0.98733f, 0.98752f, 0.98771f, - 0.98789f, 0.98808f, 0.98827f, 0.98845f, - 0.98864f, 0.98882f, 0.98901f, 0.98919f, - 0.98937f, 0.98955f, 0.98973f, 0.98991f, - 0.99009f, 0.99027f, 0.99045f, 0.99063f, - 0.99080f, 0.99098f, 0.99115f, 0.99133f, - 0.99150f, 0.99167f, 0.99184f, 0.99201f, - 0.99218f, 0.99235f, 0.99252f, 0.99269f, - 0.99285f, 0.99302f, 0.99319f, 0.99335f, - 0.99351f, 0.99368f, 0.99384f, 0.99400f, - 0.99416f, 0.99432f, 0.99448f, 0.99464f, - 0.99480f, 0.99495f, 0.99511f, 0.99527f, - 0.99542f, 0.99558f, 0.99573f, 0.99588f, - 0.99603f, 0.99619f, 0.99634f, 0.99649f, - 0.99664f, 0.99678f, 0.99693f, 0.99708f, - 0.99722f, 0.99737f, 0.99751f, 0.99766f, - 0.99780f, 0.99794f, 0.99809f, 0.99823f, - 0.99837f, 0.99851f, 0.99865f, 0.99879f, - 0.99892f, 0.99906f, 0.99920f, 0.99933f, - 0.99947f, 0.99960f, 0.99974f, 0.99987f, - 1.00000f -}; - -struct ruvt { - double r; - double u; - double v; - double t; -}; - -static const ruvt kTempTable [] = { - { 0, 0.18006, 0.26352, -0.24341 }, - { 10, 0.18066, 0.26589, -0.25479 }, - { 20, 0.18133, 0.26846, -0.26876 }, - { 30, 0.18208, 0.27119, -0.28539 }, - { 40, 0.18293, 0.27407, -0.30470 }, - { 50, 0.18388, 0.27709, -0.32675 }, - { 60, 0.18494, 0.28021, -0.35156 }, - { 70, 0.18611, 0.28342, -0.37915 }, - { 80, 0.18740, 0.28668, -0.40955 }, - { 90, 0.18880, 0.28997, -0.44278 }, - { 100, 0.19032, 0.29326, -0.47888 }, - { 125, 0.19462, 0.30141, -0.58204 }, - { 150, 0.19962, 0.30921, -0.70471 }, - { 175, 0.20525, 0.31647, -0.84901 }, - { 200, 0.21142, 0.32312, -1.0182 }, - { 225, 0.21807, 0.32909, -1.2168 }, - { 250, 0.22511, 0.33439, -1.4512 }, - { 275, 0.23247, 0.33904, -1.7298 }, - { 300, 0.24010, 0.34308, -2.0637 }, - { 325, 0.24702, 0.34655, -2.4681 }, - { 350, 0.25591, 0.34951, -2.9641 }, - { 375, 0.26400, 0.35200, -3.5814 }, - { 400, 0.27218, 0.35407, -4.3633 }, - { 425, 0.28039, 0.35577, -5.3762 }, - { 450, 0.28863, 0.35714, -6.7262 }, - { 475, 0.29685, 0.35823, -8.5955 }, - { 500, 0.30505, 0.35907, -11.324 }, - { 525, 0.31320, 0.35968, -15.628 }, - { 550, 0.32129, 0.36011, -23.325 }, - { 575, 0.32931, 0.36038, -40.770 }, - { 600, 0.33724, 0.36051, -116.45 } -}; - // This sRGB gamma is taken from DNG reference code, with the added linear extension past 1.0, as we run clipless here -float sRGBGammaForward(float x) +float srgbGammaForward(float x) { return x <= 0.0031308f @@ -346,7 +43,7 @@ float sRGBGammaForward(float x) : 1.055f * pow(x, 1.0f / 2.4f) - 0.055f; } -float sRGBGammaInverse(float y) +float srgbGammaInverse(float y) { return y <= 0.0031308f * 12.92f @@ -356,17 +53,17 @@ float sRGBGammaInverse(float y) : pow ((y + 0.055f) * (1.0f / 1.055f), 2.4f); } -void invert3x3(const double (*A)[3], double (*B)[3]) +void invert3x3(const DCPProfile::Matrix& a, DCPProfile::Matrix& b) { - const double& a00 = A[0][0]; - const double& a01 = A[0][1]; - const double& a02 = A[0][2]; - const double& a10 = A[1][0]; - const double& a11 = A[1][1]; - const double& a12 = A[1][2]; - const double& a20 = A[2][0]; - const double& a21 = A[2][1]; - const double& a22 = A[2][2]; + const double& a00 = a[0][0]; + const double& a01 = a[0][1]; + const double& a02 = a[0][2]; + const double& a10 = a[1][0]; + const double& a11 = a[1][1]; + const double& a12 = a[1][2]; + const double& a20 = a[2][0]; + const double& a21 = a[2][1]; + const double& a22 = a[2][2]; double temp[3][3]; @@ -382,77 +79,77 @@ void invert3x3(const double (*A)[3], double (*B)[3]) const double det = a00 * temp[0][0] + a01 * temp[1][0] + a02 * temp[2][0]; - if (fabs(det) < 1.0E-10) { + if (fabs(det) < 1.0e-10) { abort(); // Can't be inverted, we shouldn't be dealing with such matrices } for (int j = 0; j < 3; ++j) { for (int k = 0; k < 3; ++k) { - B[j][k] = temp[j][k] / det; + b[j][k] = temp[j][k] / det; } } } -void multiply3x3(const double (*A)[3], const double (*B)[3], double (*C)[3]) +void multiply3x3(const DCPProfile::Matrix& a, const DCPProfile::Matrix& b, DCPProfile::Matrix& c) { // Use temp to support having output same as input - double M[3][3]; + DCPProfile::Matrix m; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - M[i][j] = 0; + m[i][j] = 0; for (int k = 0; k < 3; ++k) { - M[i][j] += A[i][k] * B[k][j]; + m[i][j] += a[i][k] * b[k][j]; } } } - memcpy(C, M, 3 * 3 * sizeof(double)); + c = m; } -void multiply3x3_v3(const double (*A)[3], const double B[3], double C[3]) +void multiply3x3_v3(const DCPProfile::Matrix& a, const DCPProfile::Triple& b, DCPProfile::Triple& c) { // Use temp to support having output same as input - double M[3] = {}; + DCPProfile::Triple m = {}; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - M[i] += A[i][j] * B[j]; + m[i] += a[i][j] * b[j]; } } - memcpy(C, M, 3 * sizeof(double)); + c = m; } -void mix3x3(const double (*A)[3], double mulA, const double (*B)[3], double mulB, double (*C)[3]) +void mix3x3(const DCPProfile::Matrix& a, double mul_a, const DCPProfile::Matrix& b, double mul_b, DCPProfile::Matrix& c) { - double M[3][3]; + DCPProfile::Matrix m; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - M[i][j] = A[i][j] * mulA + B[i][j] * mulB; + m[i][j] = a[i][j] * mul_a + b[i][j] * mul_b; } } - memcpy(C, M, 3 * 3 * sizeof(double)); + c = m; } -void mapWhiteMatrix(const double white1[3], const double white2[3], double (*B)[3]) +void mapWhiteMatrix(const DCPProfile::Triple& white1, const DCPProfile::Triple& white2, DCPProfile::Matrix& b) { // Code adapted from dng_color_spec::MapWhiteMatrix // Use the linearized Bradford adaptation matrix - const double Mb[3][3] = { + const DCPProfile::Matrix mb = {{ { 0.8951, 0.2664, -0.1614 }, { -0.7502, 1.7135, 0.0367 }, { 0.0389, -0.0685, 1.0296 } - }; + }}; - double w1[3]; - multiply3x3_v3(Mb, white1, w1); - double w2[3]; - multiply3x3_v3(Mb, white2, w2); + DCPProfile::Triple w1; + multiply3x3_v3(mb, white1, w1); + DCPProfile::Triple w2; + multiply3x3_v3(mb, white2, w2); // Negative white coordinates are kind of meaningless. w1[0] = std::max(w1[0], 0.0); @@ -463,37 +160,33 @@ void mapWhiteMatrix(const double white1[3], const double white2[3], double (*B)[ w2[2] = std::max(w2[2], 0.0); // Limit scaling to something reasonable. - double A[3][3] = {}; - A[0][0] = std::max(0.1, std::min(w1[0] > 0.0 ? w2[0] / w1[0] : 10.0, 10.0)); - A[1][1] = std::max(0.1, std::min(w1[1] > 0.0 ? w2[1] / w1[1] : 10.0, 10.0)); - A[2][2] = std::max(0.1, std::min(w1[2] > 0.0 ? w2[2] / w1[2] : 10.0, 10.0)); + DCPProfile::Matrix a = {}; + a[0][0] = std::max(0.1, std::min(w1[0] > 0.0 ? w2[0] / w1[0] : 10.0, 10.0)); + a[1][1] = std::max(0.1, std::min(w1[1] > 0.0 ? w2[1] / w1[1] : 10.0, 10.0)); + a[2][2] = std::max(0.1, std::min(w1[2] > 0.0 ? w2[2] / w1[2] : 10.0, 10.0)); - double temp[3][3]; - invert3x3(Mb, temp); - multiply3x3(temp, A, temp); - multiply3x3(temp, Mb, B); + DCPProfile::Matrix temp; + invert3x3(mb, temp); + multiply3x3(temp, a, temp); + multiply3x3(temp, mb, b); } -void XYZtoXY(const double XYZ[3], double XY[2]) +void xyzToXy(const DCPProfile::Triple& xyz, double xy[2]) { - const double& X = XYZ[0]; - const double& Y = XYZ[1]; - const double& Z = XYZ[2]; - - const double total = X + Y + Z; + const double total = xyz[0] + xyz[1] + xyz[2]; if (total > 0.0) { - XY[0] = X / total; - XY[1] = Y / total; + xy[0] = xyz[0] / total; + xy[1] = xyz[1] / total; } else { - XY[0] = 0.3457; - XY[1] = 0.3585; + xy[0] = 0.3457; + xy[1] = 0.3585; } } -void XYtoXYZ(const double XY[2], double XYZ[3]) +void xyToXyz(const double xy[2], DCPProfile::Triple& xyz) { - double temp[2] = { XY[0], XY[1] }; + double temp[2] = {xy[0], xy[1]}; // Restrict xy coord to someplace inside the range of real xy coordinates. // This prevents math from doing strange things when users specify @@ -507,9 +200,9 @@ void XYtoXYZ(const double XY[2], double XYZ[3]) temp[1] *= scale; } - XYZ[0] = temp[0] / temp[1]; - XYZ[1] = 1.0; - XYZ[2] = (1.0 - temp[0] - temp[1]) / temp[1]; + xyz[0] = temp[0] / temp[1]; + xyz[1] = 1.0; + xyz[2] = (1.0 - temp[0] - temp[1]) / temp[1]; } double calibrationIlluminantToTemperature(int light) @@ -600,6 +293,146 @@ double calibrationIlluminantToTemperature(int light) } } +void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) +{ + struct Ruvt { + double r; + double u; + double v; + double t; + }; + + static const Ruvt temp_table[] = { + { 0, 0.18006, 0.26352, -0.24341 }, + { 10, 0.18066, 0.26589, -0.25479 }, + { 20, 0.18133, 0.26846, -0.26876 }, + { 30, 0.18208, 0.27119, -0.28539 }, + { 40, 0.18293, 0.27407, -0.30470 }, + { 50, 0.18388, 0.27709, -0.32675 }, + { 60, 0.18494, 0.28021, -0.35156 }, + { 70, 0.18611, 0.28342, -0.37915 }, + { 80, 0.18740, 0.28668, -0.40955 }, + { 90, 0.18880, 0.28997, -0.44278 }, + { 100, 0.19032, 0.29326, -0.47888 }, + { 125, 0.19462, 0.30141, -0.58204 }, + { 150, 0.19962, 0.30921, -0.70471 }, + { 175, 0.20525, 0.31647, -0.84901 }, + { 200, 0.21142, 0.32312, -1.0182 }, + { 225, 0.21807, 0.32909, -1.2168 }, + { 250, 0.22511, 0.33439, -1.4512 }, + { 275, 0.23247, 0.33904, -1.7298 }, + { 300, 0.24010, 0.34308, -2.0637 }, + { 325, 0.24702, 0.34655, -2.4681 }, + { 350, 0.25591, 0.34951, -2.9641 }, + { 375, 0.26400, 0.35200, -3.5814 }, + { 400, 0.27218, 0.35407, -4.3633 }, + { 425, 0.28039, 0.35577, -5.3762 }, + { 450, 0.28863, 0.35714, -6.7262 }, + { 475, 0.29685, 0.35823, -8.5955 }, + { 500, 0.30505, 0.35907, -11.324 }, + { 525, 0.31320, 0.35968, -15.628 }, + { 550, 0.32129, 0.36011, -23.325 }, + { 575, 0.32931, 0.36038, -40.770 }, + { 600, 0.33724, 0.36051, -116.45 } + }; + + constexpr double tint_scale = -3000.0; + + double temperature = 0; + double computed_tint = 0; + + // Convert to uv space. + double u = 2.0 * white_xy[0] / (1.5 - white_xy[0] + 6.0 * white_xy[1]); + double v = 3.0 * white_xy[1] / (1.5 - white_xy[0] + 6.0 * white_xy[1]); + + // Search for line pair coordinate is between. + double last_dt = 0.0; + double last_dv = 0.0; + double last_du = 0.0; + + for (uint32_t index = 1; index <= 30; ++index) { + // Convert slope to delta-u and delta-v, with length 1. + double du = 1.0; + double dv = temp_table[index].t; + double len = sqrt(1.0 + dv * dv); + du /= len; + dv /= len; + + // Find delta from black body point to test coordinate. + double uu = u - temp_table[index].u; + double vv = v - temp_table[index].v; + + // Find distance above or below line. + double dt = -uu * dv + vv * du; + + // If below line, we have found line pair. + if (dt <= 0.0 || index == 30) { + // Find fractional weight of two lines. + if (dt > 0.0) { + dt = 0.0; + } + + dt = -dt; + + double f; + + if (index == 1) { + f = 0.0; + } else { + f = dt / (last_dt + dt); + } + + // Interpolate the temperature. + temperature = 1.0e6 / (temp_table[index - 1].r * f + temp_table[index].r * (1.0 - f)); + + // Find delta from black body point to test coordinate. + uu = u - (temp_table [index - 1].u * f + temp_table [index].u * (1.0 - f)); + vv = v - (temp_table [index - 1].v * f + temp_table [index].v * (1.0 - f)); + // Interpolate vectors along slope. + du = du * (1.0 - f) + last_du * f; + dv = dv * (1.0 - f) + last_dv * f; + len = sqrt (du * du + dv * dv); + du /= len; + dv /= len; + + // Find distance along slope. + computed_tint = (uu * du + vv * dv) * tint_scale; + break; + } + + // Try next line pair. + last_dt = dt; + last_du = du; + last_dv = dv; + } + + if (temp != nullptr) { + *temp = temperature; + } + + if (tint != nullptr) { + *tint = computed_tint; + } +} + +} + +struct DCPProfile::ApplyState::Data { + double pro_photo[3][3]; + double work[3][3]; + bool already_pro_photo; + bool use_tone_curve; + bool apply_look_table; + float bl_scale; +}; + +DCPProfile::ApplyState::ApplyState() : + data(new Data{}) +{ +} + +DCPProfile::ApplyState::~ApplyState() +{ } DCPProfile::DCPProfile(const Glib::ustring& filename) : @@ -633,6 +466,266 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : BASELINE_EXPOSURE_OFFSET = 51109 }; + static const float adobe_camera_raw_default_curve[] = { + 0.00000f, 0.00078f, 0.00160f, 0.00242f, + 0.00314f, 0.00385f, 0.00460f, 0.00539f, + 0.00623f, 0.00712f, 0.00806f, 0.00906f, + 0.01012f, 0.01122f, 0.01238f, 0.01359f, + 0.01485f, 0.01616f, 0.01751f, 0.01890f, + 0.02033f, 0.02180f, 0.02331f, 0.02485f, + 0.02643f, 0.02804f, 0.02967f, 0.03134f, + 0.03303f, 0.03475f, 0.03648f, 0.03824f, + 0.04002f, 0.04181f, 0.04362f, 0.04545f, + 0.04730f, 0.04916f, 0.05103f, 0.05292f, + 0.05483f, 0.05675f, 0.05868f, 0.06063f, + 0.06259f, 0.06457f, 0.06655f, 0.06856f, + 0.07057f, 0.07259f, 0.07463f, 0.07668f, + 0.07874f, 0.08081f, 0.08290f, 0.08499f, + 0.08710f, 0.08921f, 0.09134f, 0.09348f, + 0.09563f, 0.09779f, 0.09996f, 0.10214f, + 0.10433f, 0.10652f, 0.10873f, 0.11095f, + 0.11318f, 0.11541f, 0.11766f, 0.11991f, + 0.12218f, 0.12445f, 0.12673f, 0.12902f, + 0.13132f, 0.13363f, 0.13595f, 0.13827f, + 0.14061f, 0.14295f, 0.14530f, 0.14765f, + 0.15002f, 0.15239f, 0.15477f, 0.15716f, + 0.15956f, 0.16197f, 0.16438f, 0.16680f, + 0.16923f, 0.17166f, 0.17410f, 0.17655f, + 0.17901f, 0.18148f, 0.18395f, 0.18643f, + 0.18891f, 0.19141f, 0.19391f, 0.19641f, + 0.19893f, 0.20145f, 0.20398f, 0.20651f, + 0.20905f, 0.21160f, 0.21416f, 0.21672f, + 0.21929f, 0.22185f, 0.22440f, 0.22696f, + 0.22950f, 0.23204f, 0.23458f, 0.23711f, + 0.23963f, 0.24215f, 0.24466f, 0.24717f, + 0.24967f, 0.25216f, 0.25465f, 0.25713f, + 0.25961f, 0.26208f, 0.26454f, 0.26700f, + 0.26945f, 0.27189f, 0.27433f, 0.27676f, + 0.27918f, 0.28160f, 0.28401f, 0.28641f, + 0.28881f, 0.29120f, 0.29358f, 0.29596f, + 0.29833f, 0.30069f, 0.30305f, 0.30540f, + 0.30774f, 0.31008f, 0.31241f, 0.31473f, + 0.31704f, 0.31935f, 0.32165f, 0.32395f, + 0.32623f, 0.32851f, 0.33079f, 0.33305f, + 0.33531f, 0.33756f, 0.33981f, 0.34205f, + 0.34428f, 0.34650f, 0.34872f, 0.35093f, + 0.35313f, 0.35532f, 0.35751f, 0.35969f, + 0.36187f, 0.36404f, 0.36620f, 0.36835f, + 0.37050f, 0.37264f, 0.37477f, 0.37689f, + 0.37901f, 0.38112f, 0.38323f, 0.38533f, + 0.38742f, 0.38950f, 0.39158f, 0.39365f, + 0.39571f, 0.39777f, 0.39982f, 0.40186f, + 0.40389f, 0.40592f, 0.40794f, 0.40996f, + 0.41197f, 0.41397f, 0.41596f, 0.41795f, + 0.41993f, 0.42191f, 0.42388f, 0.42584f, + 0.42779f, 0.42974f, 0.43168f, 0.43362f, + 0.43554f, 0.43747f, 0.43938f, 0.44129f, + 0.44319f, 0.44509f, 0.44698f, 0.44886f, + 0.45073f, 0.45260f, 0.45447f, 0.45632f, + 0.45817f, 0.46002f, 0.46186f, 0.46369f, + 0.46551f, 0.46733f, 0.46914f, 0.47095f, + 0.47275f, 0.47454f, 0.47633f, 0.47811f, + 0.47989f, 0.48166f, 0.48342f, 0.48518f, + 0.48693f, 0.48867f, 0.49041f, 0.49214f, + 0.49387f, 0.49559f, 0.49730f, 0.49901f, + 0.50072f, 0.50241f, 0.50410f, 0.50579f, + 0.50747f, 0.50914f, 0.51081f, 0.51247f, + 0.51413f, 0.51578f, 0.51742f, 0.51906f, + 0.52069f, 0.52232f, 0.52394f, 0.52556f, + 0.52717f, 0.52878f, 0.53038f, 0.53197f, + 0.53356f, 0.53514f, 0.53672f, 0.53829f, + 0.53986f, 0.54142f, 0.54297f, 0.54452f, + 0.54607f, 0.54761f, 0.54914f, 0.55067f, + 0.55220f, 0.55371f, 0.55523f, 0.55673f, + 0.55824f, 0.55973f, 0.56123f, 0.56271f, + 0.56420f, 0.56567f, 0.56715f, 0.56861f, + 0.57007f, 0.57153f, 0.57298f, 0.57443f, + 0.57587f, 0.57731f, 0.57874f, 0.58017f, + 0.58159f, 0.58301f, 0.58443f, 0.58583f, + 0.58724f, 0.58864f, 0.59003f, 0.59142f, + 0.59281f, 0.59419f, 0.59556f, 0.59694f, + 0.59830f, 0.59966f, 0.60102f, 0.60238f, + 0.60373f, 0.60507f, 0.60641f, 0.60775f, + 0.60908f, 0.61040f, 0.61173f, 0.61305f, + 0.61436f, 0.61567f, 0.61698f, 0.61828f, + 0.61957f, 0.62087f, 0.62216f, 0.62344f, + 0.62472f, 0.62600f, 0.62727f, 0.62854f, + 0.62980f, 0.63106f, 0.63232f, 0.63357f, + 0.63482f, 0.63606f, 0.63730f, 0.63854f, + 0.63977f, 0.64100f, 0.64222f, 0.64344f, + 0.64466f, 0.64587f, 0.64708f, 0.64829f, + 0.64949f, 0.65069f, 0.65188f, 0.65307f, + 0.65426f, 0.65544f, 0.65662f, 0.65779f, + 0.65897f, 0.66013f, 0.66130f, 0.66246f, + 0.66362f, 0.66477f, 0.66592f, 0.66707f, + 0.66821f, 0.66935f, 0.67048f, 0.67162f, + 0.67275f, 0.67387f, 0.67499f, 0.67611f, + 0.67723f, 0.67834f, 0.67945f, 0.68055f, + 0.68165f, 0.68275f, 0.68385f, 0.68494f, + 0.68603f, 0.68711f, 0.68819f, 0.68927f, + 0.69035f, 0.69142f, 0.69249f, 0.69355f, + 0.69461f, 0.69567f, 0.69673f, 0.69778f, + 0.69883f, 0.69988f, 0.70092f, 0.70196f, + 0.70300f, 0.70403f, 0.70506f, 0.70609f, + 0.70711f, 0.70813f, 0.70915f, 0.71017f, + 0.71118f, 0.71219f, 0.71319f, 0.71420f, + 0.71520f, 0.71620f, 0.71719f, 0.71818f, + 0.71917f, 0.72016f, 0.72114f, 0.72212f, + 0.72309f, 0.72407f, 0.72504f, 0.72601f, + 0.72697f, 0.72794f, 0.72890f, 0.72985f, + 0.73081f, 0.73176f, 0.73271f, 0.73365f, + 0.73460f, 0.73554f, 0.73647f, 0.73741f, + 0.73834f, 0.73927f, 0.74020f, 0.74112f, + 0.74204f, 0.74296f, 0.74388f, 0.74479f, + 0.74570f, 0.74661f, 0.74751f, 0.74842f, + 0.74932f, 0.75021f, 0.75111f, 0.75200f, + 0.75289f, 0.75378f, 0.75466f, 0.75555f, + 0.75643f, 0.75730f, 0.75818f, 0.75905f, + 0.75992f, 0.76079f, 0.76165f, 0.76251f, + 0.76337f, 0.76423f, 0.76508f, 0.76594f, + 0.76679f, 0.76763f, 0.76848f, 0.76932f, + 0.77016f, 0.77100f, 0.77183f, 0.77267f, + 0.77350f, 0.77432f, 0.77515f, 0.77597f, + 0.77680f, 0.77761f, 0.77843f, 0.77924f, + 0.78006f, 0.78087f, 0.78167f, 0.78248f, + 0.78328f, 0.78408f, 0.78488f, 0.78568f, + 0.78647f, 0.78726f, 0.78805f, 0.78884f, + 0.78962f, 0.79040f, 0.79118f, 0.79196f, + 0.79274f, 0.79351f, 0.79428f, 0.79505f, + 0.79582f, 0.79658f, 0.79735f, 0.79811f, + 0.79887f, 0.79962f, 0.80038f, 0.80113f, + 0.80188f, 0.80263f, 0.80337f, 0.80412f, + 0.80486f, 0.80560f, 0.80634f, 0.80707f, + 0.80780f, 0.80854f, 0.80926f, 0.80999f, + 0.81072f, 0.81144f, 0.81216f, 0.81288f, + 0.81360f, 0.81431f, 0.81503f, 0.81574f, + 0.81645f, 0.81715f, 0.81786f, 0.81856f, + 0.81926f, 0.81996f, 0.82066f, 0.82135f, + 0.82205f, 0.82274f, 0.82343f, 0.82412f, + 0.82480f, 0.82549f, 0.82617f, 0.82685f, + 0.82753f, 0.82820f, 0.82888f, 0.82955f, + 0.83022f, 0.83089f, 0.83155f, 0.83222f, + 0.83288f, 0.83354f, 0.83420f, 0.83486f, + 0.83552f, 0.83617f, 0.83682f, 0.83747f, + 0.83812f, 0.83877f, 0.83941f, 0.84005f, + 0.84069f, 0.84133f, 0.84197f, 0.84261f, + 0.84324f, 0.84387f, 0.84450f, 0.84513f, + 0.84576f, 0.84639f, 0.84701f, 0.84763f, + 0.84825f, 0.84887f, 0.84949f, 0.85010f, + 0.85071f, 0.85132f, 0.85193f, 0.85254f, + 0.85315f, 0.85375f, 0.85436f, 0.85496f, + 0.85556f, 0.85615f, 0.85675f, 0.85735f, + 0.85794f, 0.85853f, 0.85912f, 0.85971f, + 0.86029f, 0.86088f, 0.86146f, 0.86204f, + 0.86262f, 0.86320f, 0.86378f, 0.86435f, + 0.86493f, 0.86550f, 0.86607f, 0.86664f, + 0.86720f, 0.86777f, 0.86833f, 0.86889f, + 0.86945f, 0.87001f, 0.87057f, 0.87113f, + 0.87168f, 0.87223f, 0.87278f, 0.87333f, + 0.87388f, 0.87443f, 0.87497f, 0.87552f, + 0.87606f, 0.87660f, 0.87714f, 0.87768f, + 0.87821f, 0.87875f, 0.87928f, 0.87981f, + 0.88034f, 0.88087f, 0.88140f, 0.88192f, + 0.88244f, 0.88297f, 0.88349f, 0.88401f, + 0.88453f, 0.88504f, 0.88556f, 0.88607f, + 0.88658f, 0.88709f, 0.88760f, 0.88811f, + 0.88862f, 0.88912f, 0.88963f, 0.89013f, + 0.89063f, 0.89113f, 0.89163f, 0.89212f, + 0.89262f, 0.89311f, 0.89360f, 0.89409f, + 0.89458f, 0.89507f, 0.89556f, 0.89604f, + 0.89653f, 0.89701f, 0.89749f, 0.89797f, + 0.89845f, 0.89892f, 0.89940f, 0.89987f, + 0.90035f, 0.90082f, 0.90129f, 0.90176f, + 0.90222f, 0.90269f, 0.90316f, 0.90362f, + 0.90408f, 0.90454f, 0.90500f, 0.90546f, + 0.90592f, 0.90637f, 0.90683f, 0.90728f, + 0.90773f, 0.90818f, 0.90863f, 0.90908f, + 0.90952f, 0.90997f, 0.91041f, 0.91085f, + 0.91130f, 0.91173f, 0.91217f, 0.91261f, + 0.91305f, 0.91348f, 0.91392f, 0.91435f, + 0.91478f, 0.91521f, 0.91564f, 0.91606f, + 0.91649f, 0.91691f, 0.91734f, 0.91776f, + 0.91818f, 0.91860f, 0.91902f, 0.91944f, + 0.91985f, 0.92027f, 0.92068f, 0.92109f, + 0.92150f, 0.92191f, 0.92232f, 0.92273f, + 0.92314f, 0.92354f, 0.92395f, 0.92435f, + 0.92475f, 0.92515f, 0.92555f, 0.92595f, + 0.92634f, 0.92674f, 0.92713f, 0.92753f, + 0.92792f, 0.92831f, 0.92870f, 0.92909f, + 0.92947f, 0.92986f, 0.93025f, 0.93063f, + 0.93101f, 0.93139f, 0.93177f, 0.93215f, + 0.93253f, 0.93291f, 0.93328f, 0.93366f, + 0.93403f, 0.93440f, 0.93478f, 0.93515f, + 0.93551f, 0.93588f, 0.93625f, 0.93661f, + 0.93698f, 0.93734f, 0.93770f, 0.93807f, + 0.93843f, 0.93878f, 0.93914f, 0.93950f, + 0.93986f, 0.94021f, 0.94056f, 0.94092f, + 0.94127f, 0.94162f, 0.94197f, 0.94231f, + 0.94266f, 0.94301f, 0.94335f, 0.94369f, + 0.94404f, 0.94438f, 0.94472f, 0.94506f, + 0.94540f, 0.94573f, 0.94607f, 0.94641f, + 0.94674f, 0.94707f, 0.94740f, 0.94774f, + 0.94807f, 0.94839f, 0.94872f, 0.94905f, + 0.94937f, 0.94970f, 0.95002f, 0.95035f, + 0.95067f, 0.95099f, 0.95131f, 0.95163f, + 0.95194f, 0.95226f, 0.95257f, 0.95289f, + 0.95320f, 0.95351f, 0.95383f, 0.95414f, + 0.95445f, 0.95475f, 0.95506f, 0.95537f, + 0.95567f, 0.95598f, 0.95628f, 0.95658f, + 0.95688f, 0.95718f, 0.95748f, 0.95778f, + 0.95808f, 0.95838f, 0.95867f, 0.95897f, + 0.95926f, 0.95955f, 0.95984f, 0.96013f, + 0.96042f, 0.96071f, 0.96100f, 0.96129f, + 0.96157f, 0.96186f, 0.96214f, 0.96242f, + 0.96271f, 0.96299f, 0.96327f, 0.96355f, + 0.96382f, 0.96410f, 0.96438f, 0.96465f, + 0.96493f, 0.96520f, 0.96547f, 0.96574f, + 0.96602f, 0.96629f, 0.96655f, 0.96682f, + 0.96709f, 0.96735f, 0.96762f, 0.96788f, + 0.96815f, 0.96841f, 0.96867f, 0.96893f, + 0.96919f, 0.96945f, 0.96971f, 0.96996f, + 0.97022f, 0.97047f, 0.97073f, 0.97098f, + 0.97123f, 0.97149f, 0.97174f, 0.97199f, + 0.97223f, 0.97248f, 0.97273f, 0.97297f, + 0.97322f, 0.97346f, 0.97371f, 0.97395f, + 0.97419f, 0.97443f, 0.97467f, 0.97491f, + 0.97515f, 0.97539f, 0.97562f, 0.97586f, + 0.97609f, 0.97633f, 0.97656f, 0.97679f, + 0.97702f, 0.97725f, 0.97748f, 0.97771f, + 0.97794f, 0.97817f, 0.97839f, 0.97862f, + 0.97884f, 0.97907f, 0.97929f, 0.97951f, + 0.97973f, 0.97995f, 0.98017f, 0.98039f, + 0.98061f, 0.98082f, 0.98104f, 0.98125f, + 0.98147f, 0.98168f, 0.98189f, 0.98211f, + 0.98232f, 0.98253f, 0.98274f, 0.98295f, + 0.98315f, 0.98336f, 0.98357f, 0.98377f, + 0.98398f, 0.98418f, 0.98438f, 0.98458f, + 0.98478f, 0.98498f, 0.98518f, 0.98538f, + 0.98558f, 0.98578f, 0.98597f, 0.98617f, + 0.98636f, 0.98656f, 0.98675f, 0.98694f, + 0.98714f, 0.98733f, 0.98752f, 0.98771f, + 0.98789f, 0.98808f, 0.98827f, 0.98845f, + 0.98864f, 0.98882f, 0.98901f, 0.98919f, + 0.98937f, 0.98955f, 0.98973f, 0.98991f, + 0.99009f, 0.99027f, 0.99045f, 0.99063f, + 0.99080f, 0.99098f, 0.99115f, 0.99133f, + 0.99150f, 0.99167f, 0.99184f, 0.99201f, + 0.99218f, 0.99235f, 0.99252f, 0.99269f, + 0.99285f, 0.99302f, 0.99319f, 0.99335f, + 0.99351f, 0.99368f, 0.99384f, 0.99400f, + 0.99416f, 0.99432f, 0.99448f, 0.99464f, + 0.99480f, 0.99495f, 0.99511f, 0.99527f, + 0.99542f, 0.99558f, 0.99573f, 0.99588f, + 0.99603f, 0.99619f, 0.99634f, 0.99649f, + 0.99664f, 0.99678f, 0.99693f, 0.99708f, + 0.99722f, 0.99737f, 0.99751f, 0.99766f, + 0.99780f, 0.99794f, 0.99809f, 0.99823f, + 0.99837f, 0.99851f, 0.99865f, 0.99879f, + 0.99892f, 0.99906f, 0.99920f, 0.99933f, + 0.99947f, 0.99960f, 0.99974f, 0.99987f, + 1.00000f + }; + FILE* const file = g_fopen(filename.c_str(), "rb"); std::unique_ptr tagDir(ExifManager::parseTIFF(file, false)); @@ -855,7 +948,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : if (has_forward_matrix_1) { if (has_forward_matrix_2) { - if (memcmp(forward_matrix_1, forward_matrix_2, sizeof(forward_matrix_1)) != 0) { + if (forward_matrix_1 != forward_matrix_2) { // Common that forward matrices are the same! will_interpolate = true; } @@ -868,7 +961,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : } if (has_color_matrix_1 && has_color_matrix_2) { - if (memcmp(color_matrix_1, color_matrix_2, sizeof(color_matrix_1)) != 0) { + if (color_matrix_1 != color_matrix_2) { will_interpolate = true; } @@ -922,8 +1015,8 @@ void DCPProfile::apply( int preferred_illuminant, const Glib::ustring& working_space, const ColorTemp& white_balance, - double pre_mul[3], - double cam_wb_matrix[3][3], + const Triple& pre_mul, + const Matrix& cam_wb_matrix, bool use_tone_curve, bool apply_hue_sat_map, bool apply_look_table @@ -931,10 +1024,10 @@ void DCPProfile::apply( { const TMatrix work_matrix = iccStore->workingSpaceInverseMatrix(working_space); - double xyz_cam[3][3]; // Camera RGB to XYZ D50 matrix + Matrix xyz_cam; // Camera RGB to XYZ D50 matrix makeXyzCam(white_balance, pre_mul, cam_wb_matrix, preferred_illuminant, xyz_cam); - const std::vector delta_base = makeHueSatMap(white_balance, preferred_illuminant); + const std::vector delta_base = makeHueSatMap(white_balance, preferred_illuminant); if (delta_base.empty()) { apply_hue_sat_map = false; @@ -1057,78 +1150,77 @@ void DCPProfile::apply( } } -void DCPProfile::setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut) +void DCPProfile::setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out) { - - asOut.useToneCurve = useToneCurve; - asOut.applyLookTable = applyLookTable; - asOut.blScale = 1.0; + as_out.data->use_tone_curve = use_tone_curve; + as_out.data->apply_look_table = apply_look_table; + as_out.data->bl_scale = 1.0; if (look_table.empty()) { - asOut.applyLookTable = false; + as_out.data->apply_look_table = false; } if (!has_tone_curve) { - asOut.useToneCurve = false; + as_out.data->use_tone_curve = false; } - if (has_baseline_exposure_offset && applyBaselineExposure) { - asOut.blScale = powf(2, baseline_exposure_offset); + if (has_baseline_exposure_offset && apply_baseline_exposure) { + as_out.data->bl_scale = powf(2, baseline_exposure_offset); } - if (workingSpace == "ProPhoto") { - asOut.alreadyProPhoto = true; + if (working_space == "ProPhoto") { + as_out.data->already_pro_photo = true; } else { - asOut.alreadyProPhoto = false; + as_out.data->already_pro_photo = false; TMatrix mWork; - mWork = iccStore->workingSpaceMatrix (workingSpace); - memset(asOut.m2ProPhoto, 0, sizeof(asOut.m2ProPhoto)); + mWork = iccStore->workingSpaceMatrix (working_space); + memset(as_out.data->pro_photo, 0, sizeof(as_out.data->pro_photo)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { - asOut.m2ProPhoto[i][j] += prophoto_xyz[i][k] * mWork[k][j]; + as_out.data->pro_photo[i][j] += prophoto_xyz[i][k] * mWork[k][j]; } - mWork = iccStore->workingSpaceInverseMatrix (workingSpace); - memset(asOut.m2Work, 0, sizeof(asOut.m2Work)); + mWork = iccStore->workingSpaceInverseMatrix (working_space); + memset(as_out.data->work, 0, sizeof(as_out.data->work)); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { - asOut.m2Work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; + as_out.data->work[i][j] += mWork[i][k] * xyz_prophoto[k][j]; } } } -void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int height, int tileWidth, const ApplyState &asIn) const +void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int height, int tile_width, const ApplyState& as_in) const { #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) #define CLIP01(a) ((a)>0?((a)<1?(a):1):0) float exp_scale = 1.0; - exp_scale *= asIn.blScale; + exp_scale *= as_in.data->bl_scale; - if (!asIn.useToneCurve && !asIn.applyLookTable) { + if (!as_in.data->use_tone_curve && !as_in.data->apply_look_table) { if (exp_scale == 1.0) { return; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - rc[y * tileWidth + x] *= exp_scale; - gc[y * tileWidth + x] *= exp_scale; - bc[y * tileWidth + x] *= exp_scale; + rc[y * tile_width + x] *= exp_scale; + gc[y * tile_width + x] *= exp_scale; + bc[y * tile_width + x] *= exp_scale; } } } else { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - float r = rc[y * tileWidth + x]; - float g = gc[y * tileWidth + x]; - float b = bc[y * tileWidth + x]; + float r = rc[y * tile_width + x]; + float g = gc[y * tile_width + x]; + float b = bc[y * tile_width + x]; if (exp_scale != 1.0) { r *= exp_scale; @@ -1138,14 +1230,14 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int float newr, newg, newb; - if (asIn.alreadyProPhoto) { + if (as_in.data->already_pro_photo) { newr = r; newg = g; newb = b; } else { - newr = asIn.m2ProPhoto[0][0] * r + asIn.m2ProPhoto[0][1] * g + asIn.m2ProPhoto[0][2] * b; - newg = asIn.m2ProPhoto[1][0] * r + asIn.m2ProPhoto[1][1] * g + asIn.m2ProPhoto[1][2] * b; - newb = asIn.m2ProPhoto[2][0] * r + asIn.m2ProPhoto[2][1] * g + asIn.m2ProPhoto[2][2] * b; + newr = as_in.data->pro_photo[0][0] * r + as_in.data->pro_photo[0][1] * g + as_in.data->pro_photo[0][2] * b; + newg = as_in.data->pro_photo[1][0] * r + as_in.data->pro_photo[1][1] * g + as_in.data->pro_photo[1][2] * b; + newb = as_in.data->pro_photo[2][0] * r + as_in.data->pro_photo[2][1] * g + as_in.data->pro_photo[2][2] * b; } // with looktable and tonecurve we need to clip @@ -1153,7 +1245,7 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int newg = FCLIP(newg); newb = FCLIP(newb); - if (asIn.applyLookTable) { + if (as_in.data->apply_look_table) { float h, s, v; Color::rgb2hsv(newr, newg, newb, h, s, v); h *= 6.f; // RT calculates in [0,1] @@ -1175,220 +1267,142 @@ void DCPProfile::step2ApplyTile(float *rc, float *gc, float *bc, int width, int Color::hsv2rgb( h, s, v, newr, newg, newb); } - if (asIn.useToneCurve) { + if (as_in.data->use_tone_curve) { tone_curve.Apply(newr, newg, newb); } - if (asIn.alreadyProPhoto) { - rc[y * tileWidth + x] = newr; - gc[y * tileWidth + x] = newg; - bc[y * tileWidth + x] = newb; + if (as_in.data->already_pro_photo) { + rc[y * tile_width + x] = newr; + gc[y * tile_width + x] = newg; + bc[y * tile_width + x] = newb; } else { - rc[y * tileWidth + x] = asIn.m2Work[0][0] * newr + asIn.m2Work[0][1] * newg + asIn.m2Work[0][2] * newb; - gc[y * tileWidth + x] = asIn.m2Work[1][0] * newr + asIn.m2Work[1][1] * newg + asIn.m2Work[1][2] * newb; - bc[y * tileWidth + x] = asIn.m2Work[2][0] * newr + asIn.m2Work[2][1] * newg + asIn.m2Work[2][2] * newb; + rc[y * tile_width + x] = as_in.data->work[0][0] * newr + as_in.data->work[0][1] * newg + as_in.data->work[0][2] * newb; + gc[y * tile_width + x] = as_in.data->work[1][0] * newr + as_in.data->work[1][1] * newg + as_in.data->work[1][2] * newb; + bc[y * tile_width + x] = as_in.data->work[2][0] * newr + as_in.data->work[2][1] * newg + as_in.data->work[2][2] * newb; } } } } } -void DCPProfile::dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const +void DCPProfile::findXyztoCamera(const double white_xy[2], int preferred_illuminant, Matrix& xyz_to_camera) const { - constexpr double kTintScale = -3000.0; + bool has_col_1 = has_color_matrix_1; + bool has_col_2 = has_color_matrix_2; - double fTemperature = 0; - double fTint = 0; - - // Convert to uv space. - double u = 2.0 * whiteXY[0] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); - double v = 3.0 * whiteXY[1] / (1.5 - whiteXY[0] + 6.0 * whiteXY[1]); - - // Search for line pair coordinate is between. - double last_dt = 0.0; - double last_dv = 0.0; - double last_du = 0.0; - - for (uint32_t index = 1; index <= 30; index++) { - // Convert slope to delta-u and delta-v, with length 1. - double du = 1.0; - double dv = kTempTable [index] . t; - double len = sqrt (1.0 + dv * dv); - du /= len; - dv /= len; - - // Find delta from black body point to test coordinate. - double uu = u - kTempTable [index] . u; - double vv = v - kTempTable [index] . v; - - // Find distance above or below line. - double dt = - uu * dv + vv * du; - - // If below line, we have found line pair. - if (dt <= 0.0 || index == 30) { - // Find fractional weight of two lines. - if (dt > 0.0) { - dt = 0.0; - } - - dt = -dt; - double f; - - if (index == 1) { - f = 0.0; - } else { - f = dt / (last_dt + dt); - } - - // Interpolate the temperature. - fTemperature = 1.0E6 / (kTempTable [index - 1] . r * f + - kTempTable [index ] . r * (1.0 - f)); - - // Find delta from black body point to test coordinate. - uu = u - (kTempTable [index - 1] . u * f + - kTempTable [index ] . u * (1.0 - f)); - vv = v - (kTempTable [index - 1] . v * f + - kTempTable [index ] . v * (1.0 - f)); - // Interpolate vectors along slope. - du = du * (1.0 - f) + last_du * f; - dv = dv * (1.0 - f) + last_dv * f; - len = sqrt (du * du + dv * dv); - du /= len; - dv /= len; - - // Find distance along slope. - fTint = (uu * du + vv * dv) * kTintScale; - break; + if (preferred_illuminant == 1) { + if (has_col_1) { + has_col_2 = false; } - - // Try next line pair. - last_dt = dt; - last_du = du; - last_dv = dv; - } - - if (temp != nullptr) { - *temp = fTemperature; - } - - if (tint != nullptr) { - *tint = fTint; - } -} - -void DCPProfile::dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const -{ - - bool hasCol1 = has_color_matrix_1; - bool hasCol2 = has_color_matrix_2; - - if (preferredIlluminant == 1) { - if (hasCol1) { - hasCol2 = false; - } - } else if (preferredIlluminant == 2) { - if (hasCol2) { - hasCol1 = false; + } else if (preferred_illuminant == 2) { + if (has_col_2) { + has_col_1 = false; } } - // mix if we have two matrices + // Mix if we have two matrices double mix; + Matrix col; - if (hasCol1 && hasCol2) { + if (has_col_1 && has_col_2) { double wbtemp; /* - Note: we're using DNG SDK reference code for XY to temperature translation to get the exact same mix as + Note: We're using DNG SDK reference code for XY to temperature translation to get the exact same mix as the reference code does. */ - dngref_XYCoord2Temperature(whiteXY, &wbtemp, nullptr); + xyCoordToTemperature(white_xy, &wbtemp, nullptr); if (wbtemp <= temperature_1) { mix = 1.0; } else if (wbtemp >= temperature_2) { mix = 0.0; } else { - double invT = 1.0 / wbtemp; + const double invT = 1.0 / wbtemp; mix = (invT - (1.0 / temperature_2)) / ((1.0 / temperature_1) - (1.0 / temperature_2)); } - } - // Interpolate the color matrix. - double mCol[3][3]; - - if (hasCol1 && hasCol2) { - // interpolate + // Interpolate if (mix >= 1.0) { - memcpy(mCol, color_matrix_1, sizeof(mCol)); + col = color_matrix_1; } else if (mix <= 0.0) { - memcpy(mCol, color_matrix_2, sizeof(mCol)); + col = color_matrix_2; } else { - mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, mCol); + mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, col); } - } else if (hasCol1) { - memcpy(mCol, color_matrix_1, sizeof(mCol)); + } else if (has_col_1) { + col = color_matrix_1; } else { - memcpy(mCol, color_matrix_2, sizeof(mCol)); + col = color_matrix_2; } - memcpy(xyzToCamera, mCol, sizeof(mCol)); + xyz_to_camera = col; } -void DCPProfile::dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const +void DCPProfile::neutralToXy(const Triple& neutral, int preferred_illuminant, double xy[2]) const { - const int kMaxPasses = 30; - double lastXY[2] = { 0.3457, 0.3585 }; // D50 + enum { + MAX_PASSES = 30 + }; - for (int pass = 0; pass < kMaxPasses; pass++) { - double xyzToCamera[3][3]; - dngref_FindXYZtoCamera(lastXY, preferredIlluminant, xyzToCamera); + double last_xy[2] = {0.3457, 0.3585}; // D50 - double invM[3][3], nextXYZ[3], nextXY[2]; - invert3x3(xyzToCamera, invM); - multiply3x3_v3(invM, neutral, nextXYZ); - XYZtoXY(nextXYZ, nextXY); + for (unsigned int pass = 0; pass < MAX_PASSES; ++pass) { + Matrix xyz_to_camera; + findXyztoCamera(last_xy, preferred_illuminant, xyz_to_camera); - if (fabs(nextXY[0] - lastXY[0]) + - fabs(nextXY[1] - lastXY[1]) < 0.0000001) { - XY[0] = nextXY[0]; - XY[1] = nextXY[1]; + Matrix inv_m; + Triple next_xyz; + double next_xy[2]; + invert3x3(xyz_to_camera, inv_m); + multiply3x3_v3(inv_m, neutral, next_xyz); + xyzToXy(next_xyz, next_xy); + + if (fabs(next_xy[0] - last_xy[0]) + + fabs(next_xy[1] - last_xy[1]) < 0.0000001) { + xy[0] = next_xy[0]; + xy[1] = next_xy[1]; return; } // If we reach the limit without converging, we are most likely // in a two value oscillation. So take the average of the last // two estimates and give up. - if (pass == kMaxPasses - 1) { - nextXY[0] = (lastXY[0] + nextXY[0]) * 0.5; - nextXY[1] = (lastXY[1] + nextXY[1]) * 0.5; + if (pass == MAX_PASSES - 1) { + next_xy[0] = (last_xy[0] + next_xy[0]) * 0.5; + next_xy[1] = (last_xy[1] + next_xy[1]) * 0.5; } - lastXY[0] = nextXY[0]; - lastXY[1] = nextXY[1]; + last_xy[0] = next_xy[0]; + last_xy[1] = next_xy[1]; } - XY[0] = lastXY[0]; - XY[1] = lastXY[1]; + xy[0] = last_xy[0]; + xy[1] = last_xy[1]; } -void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const +void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant, Matrix& xyz_cam) const { - // code adapted from dng_color_spec::FindXYZtoCamera - // note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support) - // we do not support cameracalibration either + // Code adapted from dng_color_spec::FindXYZtoCamera. + // Note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support), + // we do not support cameracalibration either. - double neutral[3]; // same as the DNG "AsShotNeutral" tag if white balance is Camera's own + Triple neutral; // Same as the DNG "AsShotNeutral" tag if white balance is Camera's own { /* A bit messy matrixing and conversions to get the neutral[] array from RT's own white balance which is stored in sRGB space, while the DCP code needs multipliers in CameraRGB space */ double r, g, b; - wb.getMultipliers(r, g, b); + white_balance.getMultipliers(r, g, b); // camWbMatrix == imatrices.xyz_cam - double cam_xyz[3][3]; - invert3x3(camWbMatrix, cam_xyz); - double cam_rgb[3][3]; - multiply3x3(cam_xyz, xyz_sRGB, cam_rgb); + Matrix cam_xyz; + invert3x3(cam_wb_matrix, cam_xyz); + Matrix cam_rgb; + constexpr Matrix xyz_srgb = {{ + {xyz_sRGB[0][0], xyz_sRGB[0][1], xyz_sRGB[0][2]}, + {xyz_sRGB[1][0], xyz_sRGB[1][1], xyz_sRGB[1][2]}, + {xyz_sRGB[2][0], xyz_sRGB[2][1], xyz_sRGB[2][2]} + }}; + multiply3x3(cam_xyz, xyz_srgb, cam_rgb); double camwb_red = cam_rgb[0][0] * r + cam_rgb[0][1] * g + cam_rgb[0][2] * b; double camwb_green = cam_rgb[1][0] * r + cam_rgb[1][1] * g + cam_rgb[1][2] * b; double camwb_blue = cam_rgb[2][0] * r + cam_rgb[2][1] * g + cam_rgb[2][2] * b; @@ -1413,40 +1427,40 @@ void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWb do it, which is a bit different from RT's own white balance model at the time of writing. When RT's white balance can make use of the DCP color matrices we could use that instead. */ double white_xy[2]; - dngref_NeutralToXY(neutral, preferredIlluminant, white_xy); + neutralToXy(neutral, preferred_illuminant, white_xy); - bool hasFwd1 = has_forward_matrix_1; - bool hasFwd2 = has_forward_matrix_2; - bool hasCol1 = has_color_matrix_1; - bool hasCol2 = has_color_matrix_2; + bool has_fwd_1 = has_forward_matrix_1; + bool has_fwd_2 = has_forward_matrix_2; + bool has_col_1 = has_color_matrix_1; + bool has_col_2 = has_color_matrix_2; - if (preferredIlluminant == 1) { - if (hasFwd1) { - hasFwd2 = false; + if (preferred_illuminant == 1) { + if (has_fwd_1) { + has_fwd_2 = false; } - if (hasCol1) { - hasCol2 = false; + if (has_col_1) { + has_col_2 = false; } - } else if (preferredIlluminant == 2) { - if (hasFwd2) { - hasFwd1 = false; + } else if (preferred_illuminant == 2) { + if (has_fwd_2) { + has_fwd_1 = false; } - if (hasCol2) { - hasCol1 = false; + if (has_col_2) { + has_col_1 = false; } } - // mix if we have two matrices + // Mix if we have two matrices double mix = 1.0; - if ((hasCol1 && hasCol2) || (hasFwd1 && hasFwd2)) { + if ((has_col_1 && has_col_2) || (has_fwd_1 && has_fwd_2)) { double wbtemp; /* DNG ref way to convert XY to temperature, which affect matrix mixing. A different model here typically does not affect the result too much, ie it's probably not strictly necessary to use the DNG reference code here, but we do it for now. */ - dngref_XYCoord2Temperature(white_xy, &wbtemp, nullptr); + xyCoordToTemperature(white_xy, &wbtemp, nullptr); if (wbtemp <= temperature_1) { mix = 1.0; @@ -1459,21 +1473,21 @@ void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWb } // Colormatrix - double mCol[3][3]; + Matrix color_matrix; - if (hasCol1 && hasCol2) { + if (has_col_1 && has_col_2) { // interpolate if (mix >= 1.0) { - memcpy(mCol, color_matrix_1, sizeof(mCol)); + color_matrix = color_matrix_1; } else if (mix <= 0.0) { - memcpy(mCol, color_matrix_2, sizeof(mCol)); + color_matrix = color_matrix_2; } else { - mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, mCol); + mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, color_matrix); } - } else if (hasCol1) { - memcpy(mCol, color_matrix_1, sizeof(mCol)); + } else if (has_col_1) { + color_matrix = color_matrix_1; } else { - memcpy(mCol, color_matrix_2, sizeof(mCol)); + color_matrix = color_matrix_2; } /* @@ -1484,49 +1498,53 @@ void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWb will show incorrect color. */ - double white_xyz[3]; - XYtoXYZ(white_xy, white_xyz); + Triple white_xyz; + xyToXyz(white_xy, white_xyz); - double cam_xyz[3][3]; + Matrix cam_xyz; - if (hasFwd1 || hasFwd2) { - // always prefer ForwardMatrix ahead of ColorMatrix - double mFwd[3][3]; + if (has_fwd_1 || has_fwd_2) { + // Always prefer ForwardMatrix to ColorMatrix + Matrix fwd; - if (hasFwd1 && hasFwd2) { - // interpolate + if (has_fwd_1 && has_fwd_2) { + // Interpolate if (mix >= 1.0) { - memcpy(mFwd, forward_matrix_1, sizeof(mFwd)); + fwd = forward_matrix_1; } else if (mix <= 0.0) { - memcpy(mFwd, forward_matrix_2, sizeof(mFwd)); + fwd = forward_matrix_2; } else { - mix3x3(forward_matrix_1, mix, forward_matrix_2, 1.0 - mix, mFwd); + mix3x3(forward_matrix_1, mix, forward_matrix_2, 1.0 - mix, fwd); } - } else if (hasFwd1) { - memcpy(mFwd, forward_matrix_1, sizeof(mFwd)); + } else if (has_fwd_1) { + fwd = forward_matrix_1; } else { - memcpy(mFwd, forward_matrix_2, sizeof(mFwd)); + fwd = forward_matrix_2; } // adapted from dng_color_spec::SetWhiteXY - double CameraWhite[3]; - multiply3x3_v3(mCol, white_xyz, CameraWhite); + Triple camera_white; + multiply3x3_v3(color_matrix, white_xyz, camera_white); - double whiteDiag[3][3] = {{CameraWhite[0], 0, 0}, {0, CameraWhite[1], 0}, {0, 0, CameraWhite[2]}}; - double whiteDiagInv[3][3]; - invert3x3(whiteDiag, whiteDiagInv); + const Matrix white_diag = {{ + {camera_white[0], 0, 0}, + {0, camera_white[1], 0}, + {0, 0, camera_white[2]} + }}; + Matrix white_diag_inv; + invert3x3(white_diag, white_diag_inv); - double xyz_cam[3][3]; - multiply3x3(mFwd, whiteDiagInv, xyz_cam); + Matrix xyz_cam; + multiply3x3(fwd, white_diag_inv, xyz_cam); invert3x3(xyz_cam, cam_xyz); } else { - double whiteMatrix[3][3]; - const double white_d50[3] = { 0.3457, 0.3585, 0.2958 }; // D50 - mapWhiteMatrix(white_d50, white_xyz, whiteMatrix); - multiply3x3(mCol, whiteMatrix, cam_xyz); + Matrix white_matrix; + const Triple white_d50 = {0.3457, 0.3585, 0.2958}; // D50 + mapWhiteMatrix(white_d50, white_xyz, white_matrix); + multiply3x3(color_matrix, white_matrix, cam_xyz); } - // convert cam_xyz (XYZ D50 to CameraRGB, "PCS to Camera" in DNG terminology) to mXYZCAM + // Convert cam_xyz (XYZ D50 to CameraRGB, "PCS to Camera" in DNG terminology) to mXYZCAM { // This block can probably be simplified, seems unnecessary to pass through the sRGB matrix @@ -1534,47 +1552,52 @@ void DCPProfile::makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWb int i, j, k; // Multiply out XYZ colorspace - double cam_rgb[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + double cam_rgb[3][3] = {}; - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - for (k = 0; k < 3; k++) { + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { cam_rgb[i][j] += cam_xyz[i][k] * xyz_sRGB[k][j]; } + } + } - // Normalize cam_rgb so that: cam_rgb * (1,1,1) is (1,1,1,1) + // Normalize cam_rgb so that cam_rgb * (1,1,1) is (1,1,1,1) double num; - for (i = 0; i < 3; i++) { - for (num = j = 0; j < 3; j++) { + for (i = 0; i < 3; ++i) { + for (num = j = 0; j < 3; ++j) { num += cam_rgb[i][j]; } - for (j = 0; j < 3; j++) { + for (j = 0; j < 3; ++j) { cam_rgb[i][j] /= num; } } - double rgb_cam[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; - RawImageSource::inverse33 (cam_rgb, rgb_cam); + double rgb_cam[3][3] = {}; + RawImageSource::inverse33(cam_rgb, rgb_cam); - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) { - mXYZCAM[i][j] = 0; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + xyz_cam[i][j] = 0; } + } - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - for (k = 0; k < 3; k++) { - mXYZCAM[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + xyz_cam[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; } + } + } } } -std::vector DCPProfile::makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const +std::vector DCPProfile::makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const { if (deltas_1.empty()) { - return std::vector(); + return std::vector(); } if (deltas_2.empty()) { @@ -1627,7 +1650,7 @@ std::vector DCPProfile::makeHueSatMap(const ColorTemp& wh } // Interpolate between the tables. - std::vector res(delta_info.array_count); + std::vector res(delta_info.array_count); const float w1 = mix; const float w2 = 1.0f - w1; @@ -1641,7 +1664,7 @@ std::vector DCPProfile::makeHueSatMap(const ColorTemp& wh return res; } -void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const +void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const { // Apply the HueSatMap. Ported from Adobes reference implementation. float hue_shift; @@ -1655,7 +1678,7 @@ void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector(h_scaled, 0); - const int s_index0 = max(min(s_scaled, table_info.pc.max_sat_index0), 0); + const int s_index0 = std::max(std::min(s_scaled, table_info.pc.max_sat_index0), 0); int h_index1 = h_index0 + 1; @@ -1670,8 +1693,8 @@ void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector::size_type e00_index = h_index0 * table_info.pc.hue_step + s_index0; - std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; + std::vector::size_type e00_index = h_index0 * table_info.pc.hue_step + s_index0; + std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; const float hue_shift0 = h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift; const float sat_scale0 = h_fract0 * table_base[e00_index].sat_scale + h_fract1 * table_base[e01_index].sat_scale; @@ -1692,14 +1715,14 @@ void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector(s_scaled, table_info.pc.max_sat_index0), 0); - const int v_index0 = max(min(v_scaled, table_info.pc.max_val_index0), 0); + const int s_index0 = std::max(std::min(s_scaled, table_info.pc.max_sat_index0), 0); + const int v_index0 = std::max(std::min(v_scaled, table_info.pc.max_val_index0), 0); int h_index1 = h_index0 + 1; @@ -1716,10 +1739,10 @@ void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector::size_type e00_index = v_index0 * table_info.pc.val_step + h_index0 * table_info.pc.hue_step + s_index0; - std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; - std::vector::size_type e10_index = e00_index + table_info.pc.val_step; - std::vector::size_type e11_index = e01_index + table_info.pc.val_step; + std::vector::size_type e00_index = v_index0 * table_info.pc.val_step + h_index0 * table_info.pc.hue_step + s_index0; + std::vector::size_type e01_index = e00_index + (h_index1 - h_index0) * table_info.pc.hue_step; + std::vector::size_type e10_index = e00_index + table_info.pc.val_step; + std::vector::size_type e11_index = e01_index + table_info.pc.val_step; const float hueShift0 = v_fract0 * (h_fract0 * table_base[e00_index].hue_shift + h_fract1 * table_base[e01_index].hue_shift) @@ -1757,7 +1780,7 @@ void DCPProfile::hsdApply(const HSDTableInfo& table_info, const std::vector #include +#include +#include #include @@ -36,13 +38,18 @@ namespace rtengine class DCPProfile final { public: - struct ApplyState { - double m2ProPhoto[3][3]; - double m2Work[3][3]; - bool alreadyProPhoto; - bool useToneCurve; - bool applyLookTable; - float blScale; + class ApplyState final + { + public: + ApplyState(); + ~ApplyState(); + + private: + struct Data; + + std::unique_ptr data; + + friend class DCPProfile; }; struct Illuminants { @@ -53,6 +60,9 @@ public: bool will_interpolate; }; + using Triple = std::array; + using Matrix = std::array; + DCPProfile(const Glib::ustring& filename); ~DCPProfile(); @@ -68,23 +78,23 @@ public: int preferred_illuminant, const Glib::ustring& working_space, const ColorTemp& white_balance, - double pre_mul[3], - double cam_matrix[3][3], + const Triple& pre_mul, + const Matrix& cam_wb_matrix, bool use_tone_curve = false, bool apply_hue_sat_map = true, bool apply_look_table = false ) const; - void setStep2ApplyState(const Glib::ustring &workingSpace, bool useToneCurve, bool applyLookTable, bool applyBaselineExposure, ApplyState &asOut); - void step2ApplyTile(float *r, float *g, float *b, int width, int height, int tileWidth, const ApplyState &asIn) const; + void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out); + void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const ApplyState& as_in) const; private: - struct HSBModify { + struct HsbModify { float hue_shift; float sat_scale; float val_scale; }; - struct HSDTableInfo { + struct HsdTableInfo { int hue_divisions; int sat_divisions; int val_divisions; @@ -104,15 +114,14 @@ private: } pc; }; - void dngref_XYCoord2Temperature(const double whiteXY[2], double *temp, double *tint) const; - void dngref_FindXYZtoCamera(const double whiteXY[2], int preferredIlluminant, double (*xyzToCamera)[3]) const; - void dngref_NeutralToXY(double neutral[3], int preferredIlluminant, double XY[2]) const; - void makeXyzCam(const ColorTemp &wb, double pre_mul[3], double camWbMatrix[3][3], int preferredIlluminant, double (*mXYZCAM)[3]) const; - std::vector makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const; - void hsdApply(const HSDTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const; + void findXyztoCamera(const double white_xy[2], int preferred_illuminant, Matrix& xyz_to_camera) const; + void neutralToXy(const Triple& neutral, int preferred_illuminant, double xy[2]) const; + void makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant, Matrix& xyz_cam) const; + std::vector makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const; + void hsdApply(const HsdTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const; - double color_matrix_1[3][3]; - double color_matrix_2[3][3]; + Matrix color_matrix_1; + Matrix color_matrix_2; bool has_color_matrix_1; bool has_color_matrix_2; bool has_forward_matrix_1; @@ -120,16 +129,16 @@ private: bool has_tone_curve; bool has_baseline_exposure_offset; bool will_interpolate; - double forward_matrix_1[3][3]; - double forward_matrix_2[3][3]; + Matrix forward_matrix_1; + Matrix forward_matrix_2; double temperature_1; double temperature_2; double baseline_exposure_offset; - std::vector deltas_1; - std::vector deltas_2; - std::vector look_table; - HSDTableInfo delta_info; - HSDTableInfo look_info; + std::vector deltas_1; + std::vector deltas_2; + std::vector look_table; + HsdTableInfo delta_info; + HsdTableInfo look_info; short light_source_1; short light_source_2; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 16c7fb21b..1c04f1af3 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -889,7 +889,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } } -DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb,DCPProfile::ApplyState &as) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as) { DCPProfile *dcpProf = NULL; cmsHPROFILE dummy; @@ -3727,7 +3727,17 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam if (dcpProf != NULL) { // DCP processing - dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul, camMatrix, false, cmp.applyHueSatMap, false); + const DCPProfile::Triple pre_mul_row = { + pre_mul[0], + pre_mul[1], + pre_mul[2] + }; + const DCPProfile::Matrix cam_matrix = {{ + {camMatrix[0][0], camMatrix[0][1], camMatrix[0][2]}, + {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, + {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} + }}; + dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, false, cmp.applyHueSatMap, false); return; } From cbbdc3e36fcf8b1f34421e56cea7b85a7209f39c Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Thu, 9 Jun 2016 20:38:46 +0200 Subject: [PATCH 089/232] Rawtherapee forgets checked Autofill-option, fixes #3332 --- rtgui/lensgeom.cc | 2 ++ rtgui/lensprofile.cc | 4 +++- rtgui/lensprofile.h | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index 1218c0fec..07f86542c 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -134,9 +134,11 @@ int LensGeometry::doDisableAutoFillIfActive (void* data) if (instance->fill->get_active()) { instance->fillConn.block (true); instance->fill->set_active(false); + if (instance->listener) { instance->listener->panelChanged (EvTransAutoFill, M("GENERAL_DISABLED")); } + instance->fillConn.block (false); } } diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 5555d6dd7..c24bc5cf0 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -67,7 +67,7 @@ LensProfilePanel::LensProfilePanel () : FoldableToolPanel(this, "lensprof", M("T conLCPFile = fcbLCPFile->signal_file_set().connect( sigc::mem_fun(*this, &LensProfilePanel::onLCPFileChanged), true); btnReset->signal_clicked().connect( sigc::mem_fun(*this, &LensProfilePanel::onLCPFileReset), true); - ckbUseDist->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseDistChanged) ); + conUseDist = ckbUseDist->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseDistChanged) ); ckbUseVign->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseVignChanged) ); ckbUseCA->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseCAChanged) ); @@ -77,6 +77,7 @@ LensProfilePanel::LensProfilePanel () : FoldableToolPanel(this, "lensprof", M("T void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { disableListener (); + conUseDist.block(true); if (!pp->lensProf.lcpFile.empty() && lcpStore->isValidLCPFileName(pp->lensProf.lcpFile)) { fcbLCPFile->set_filename (pp->lensProf.lcpFile); @@ -102,6 +103,7 @@ void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const Pa lcpFileChanged = useDistChanged = useVignChanged = useCAChanged = false; enableListener (); + conUseDist.block(false); } void LensProfilePanel::setRawMeta(bool raw, const rtengine::ImageMetaData* pMeta) diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index 23d02b9a2..cb3a5cc6c 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -54,7 +54,10 @@ public: void onUseDistChanged(); void onUseVignChanged(); void onUseCAChanged(); - void setLensGeomRef( LensGeometry *foo) { lensgeomLcpFill = foo ;}; + void setLensGeomRef( LensGeometry *foo) + { + lensgeomLcpFill = foo ; + }; }; #endif From b50de693a0f015f406a6a4ee307ed8673057fabf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 9 Jun 2016 21:49:13 +0200 Subject: [PATCH 090/232] Replace expensive dcp srgb gamma calculations by access to lookup table => no difference in output and much faster --- rtengine/color.cc | 15 ++++++++++----- rtengine/color.h | 2 ++ rtengine/dcp.cc | 7 +++++-- rtengine/improcfun.cc | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 4e180690e..c5874d110 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -38,7 +38,9 @@ LUTf Color::gamma2curve; LUTf Color::gammatab; LUTuc Color::gammatabThumb; LUTf Color::igammatab_srgb; +LUTf Color::igammatab_srgb1; LUTf Color::gammatab_srgb; +LUTf Color::gammatab_srgb1; // LUTf Color::igammatab_709; // LUTf Color::gammatab_709; LUTf Color::igammatab_55; @@ -143,7 +145,9 @@ void Color::init () gammatabThumb(maxindex, 0); igammatab_srgb(maxindex, 0); + igammatab_srgb1(maxindex, 0); gammatab_srgb(maxindex, 0); + gammatab_srgb1(maxindex, 0); igammatab_55(maxindex, 0); gammatab_55(maxindex, 0); igammatab_4(maxindex, 0); @@ -187,19 +191,20 @@ void Color::init () { for (int i = 0; i < maxindex; i++) { - gammatab_srgb[i] = 65535.0 * gamma2(i / 65535.0); + gammatab_srgb[i] = gammatab_srgb1[i] = gamma2(i / 65535.0); } - + gammatab_srgb *= 65535.f; gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags } #ifdef _OPENMP #pragma omp section #endif - +{ for (int i = 0; i < maxindex; i++) { - igammatab_srgb[i] = 65535.0 * igamma2 (i / 65535.0); + igammatab_srgb[i] = igammatab_srgb1[i] = igamma2 (i / 65535.0); } - + igammatab_srgb *= 65535.f; +} #ifdef _OPENMP #pragma omp section #endif diff --git a/rtengine/color.h b/rtengine/color.h index be7740e2a..31c361c86 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -129,7 +129,9 @@ public: // look-up tables for the standard srgb gamma and its inverse (filled by init()) static LUTf igammatab_srgb; + static LUTf igammatab_srgb1; static LUTf gammatab_srgb; + static LUTf gammatab_srgb1; static LUTf igammatab_55; static LUTf gammatab_55; static LUTf igammatab_4; diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 775428a4e..a42c80bf6 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -25,6 +25,8 @@ #include "rawimagesource.h" #include "improcfun.h" #include "rt_math.h" +#define BENCHMARK +#include "StopWatch.h" using namespace rtengine; using namespace rtexif; @@ -1022,6 +1024,7 @@ void DCPProfile::apply( bool apply_look_table ) const { + BENCHFUN const TMatrix work_matrix = iccStore->workingSpaceInverseMatrix(working_space); Matrix xyz_cam; // Camera RGB to XYZ D50 matrix @@ -1715,7 +1718,7 @@ void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector Date: Thu, 9 Jun 2016 23:17:34 +0200 Subject: [PATCH 091/232] Minor changes to docs, testing something. --- AUTHORS.txt | 2 +- RELEASE_NOTES.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 37ac98993..6aebfcf6e 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -33,7 +33,7 @@ Developement contributors, in last name alphabetical order: Ingo Weyrich Makoto Yoshida -Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name/nickname alphabetical order: +Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order: Marcin Bajor Thorsten Bartolomäus diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index c057d41a7..1c78bcd39 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -32,7 +32,8 @@ LIVE CHAT WITH USERS AND DEVELOPERS Network: freenode Server: chat.freenode.net Channel #rawtherapee -Or use freenode webchat to chat without installing anything: + +You can use freenode webchat to communicate without installing anything: http://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1 More information here: http://rawpedia.rawtherapee.com/IRC @@ -44,5 +45,5 @@ http://plus.google.com/106783532637761598368 REVISION HISTORY ---------------- The complete changelog is available at: -https://github.com/Beep6581/RawTherapee/commits/master +https://github.com/Beep6581/RawTherapee/commits/ From c086177032982c7e977c34ae467829b62fe96dcc Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 9 Jun 2016 23:42:32 +0200 Subject: [PATCH 092/232] Speedup for DCPProfile::apply --- rtengine/color.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/rtengine/color.h b/rtengine/color.h index 31c361c86..1e1cb9679 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -230,7 +230,36 @@ public: * @param v value channel [0 ; 1] (return value) */ static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v); + + static inline void rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v) + { + float var_Min = min(r, g, b); + float var_Max = max(r, g, b); + float del_Max = var_Max - var_Min; + v = var_Max / 65535.f; + + if (fabsf(del_Max) < 0.00001f) { + h = 0.f; + s = 0.f; + } else { + s = del_Max / var_Max; + + if ( r == var_Max ) { + h = (g - b) / del_Max; + } else if ( g == var_Max ) { + h = 2.f + (b - r) / del_Max; + } else { /*if ( b == var_Max ) */ + h = 4.f + (r - g) / del_Max; + } + + if ( h < 0.f ) { + h += 6.f; + } else if ( h > 6.f ) { + h -= 6.f; + } + } + } /** * @brief Convert hue saturation value in red green blue @@ -242,6 +271,45 @@ public: * @param b blue channel [0 ; 65535] (return value) */ static void hsv2rgb (float h, float s, float v, float &r, float &g, float &b); + +static inline void hsv2rgbdcp (float h, float s, float v, float &r, float &g, float &b) +{ + // special version for dcp which saves 1 division (in caller) and six multiplications (inside this function) + int i = h; // sector 0 to 5, floor() is very slow, and h is always >0 + float f = h - i; // fractional part of h + + v *= 65535.f; + float vs = v * s; + float p = v - vs; + float q = v - f * vs; + float t = p + v - q; + + if (i == 1) { + r = q; + g = v; + b = p; + } else if (i == 2) { + r = p; + g = v; + b = t; + } else if (i == 3) { + r = p; + g = q; + b = v; + } else if (i == 4) { + r = t; + g = p; + b = v; + } else if (i == 5) { + r = v; + g = p; + b = q; + } else { /*i==(0|6)*/ + r = v; + g = t; + b = p; + } +} static void hsv2rgb (float h, float s, float v, int &r, int &g, int &b); From 3aa9947a37a2ae4d66ff0f9b9e60488a873309db Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 9 Jun 2016 23:43:55 +0200 Subject: [PATCH 093/232] Forgot to add dcp.cc with last commit --- rtengine/dcp.cc | 41 ++++++++--------------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index a42c80bf6..722fec7cc 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1071,7 +1071,7 @@ void DCPProfile::apply( } } else { // LUT available --> Calculate matrix for conversion raw>ProPhoto - double pro_photo[3][3] = {}; + float pro_photo[3][3] = {}; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { @@ -1081,7 +1081,7 @@ void DCPProfile::apply( } } - double work[3][3] = {}; + float work[3][3] = {}; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { @@ -1093,56 +1093,31 @@ void DCPProfile::apply( // Convert to ProPhoto and apply LUT #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic,16) #endif for (int y = 0; y < img->height; ++y) { - float h, s, v, hs, ss, vs; - for (int x = 0; x < img->width; x++) { float newr = pro_photo[0][0] * img->r(y, x) + pro_photo[0][1] * img->g(y, x) + pro_photo[0][2] * img->b(y, x); float newg = pro_photo[1][0] * img->r(y, x) + pro_photo[1][1] * img->g(y, x) + pro_photo[1][2] * img->b(y, x); float newb = pro_photo[2][0] * img->r(y, x) + pro_photo[2][1] * img->g(y, x) + pro_photo[2][2] * img->b(y, x); // If point is in negative area, just the matrix, but not the LUT - if ( - ( - apply_hue_sat_map - || apply_look_table - ) - && newr >= 0 - && newg >= 0 - && newb >= 0 - ) { + if (newr >= 0 && newg >= 0 && newb >= 0) { float h; float s; float v; - Color::rgb2hsv(newr, newg, newb, h , s, v); - h *= 6.0f; // RT calculates in [0,1] + Color::rgb2hsvdcp(newr, newg, newb, h , s, v); - if (apply_hue_sat_map) { - hsdApply(delta_info, delta_base, h, s, v); - } - - if (apply_look_table) { - hsdApply(look_info, look_table, h, s, v); - } + hsdApply(delta_info, delta_base, h, s, v); // RT range correction if (h < 0.0f) { h += 6.0f; - } - - if (h >= 6.0f) { + } else if (h >= 6.0f) { h -= 6.0f; } - h /= 6.f; - - Color::hsv2rgb(h, s, v, newr, newg, newb); - } - - if (use_tone_curve) { - tone_curve.Apply(newr, newg, newb); + Color::hsv2rgbdcp(h, s, v, newr, newg, newb); } img->r(y, x) = work[0][0] * newr + work[0][1] * newg + work[0][2] * newb; From eedb9f39bcf8f04fdd2d99f923a3aab5c9738781 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 10 Jun 2016 00:20:03 +0200 Subject: [PATCH 094/232] Another 'small' speedup for dcp --- rtengine/dcp.cc | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 722fec7cc..19ccc2359 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -420,8 +420,8 @@ void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) } struct DCPProfile::ApplyState::Data { - double pro_photo[3][3]; - double work[3][3]; + float pro_photo[3][3]; + float work[3][3]; bool already_pro_photo; bool use_tone_curve; bool apply_look_table; @@ -1200,11 +1200,9 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int float g = gc[y * tile_width + x]; float b = bc[y * tile_width + x]; - if (exp_scale != 1.0) { - r *= exp_scale; - g *= exp_scale; - b *= exp_scale; - } + r *= exp_scale; + g *= exp_scale; + b *= exp_scale; float newr, newg, newb; @@ -1225,8 +1223,7 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int if (as_in.data->apply_look_table) { float h, s, v; - Color::rgb2hsv(newr, newg, newb, h, s, v); - h *= 6.f; // RT calculates in [0,1] + Color::rgb2hsvdcp(newr, newg, newb, h, s, v); hsdApply(look_info, look_table, h, s, v); s = CLIP01(s); @@ -1235,14 +1232,11 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int // RT range correction if (h < 0.0f) { h += 6.0f; - } - - if (h >= 6.0f) { + } else if (h >= 6.0f) { h -= 6.0f; } - h /= 6.f; - Color::hsv2rgb( h, s, v, newr, newg, newb); + Color::hsv2rgbdcp( h, s, v, newr, newg, newb); } if (as_in.data->use_tone_curve) { From a889396e44be0e8cfc5c41675ef40da59cb341d3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 10 Jun 2016 01:38:24 +0200 Subject: [PATCH 095/232] Fix compile bug, fixes #3340 --- rtengine/iccmatrices.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 292f45612..1b17cbaf6 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -54,7 +54,7 @@ const double sRGB_xyz[3][3] = {{3.13593293538656, -1.61878246026431, // Color space conversion to/from XYZ; color spaces adapted to D50 using Bradford transform -const double xyz_sRGB[3][3] = {{0.4360747, 0.3850649, 0.1430804}, +constexpr double xyz_sRGB[3][3] = {{0.4360747, 0.3850649, 0.1430804}, {0.2225045, 0.7168786, 0.0606169}, {0.0139322, 0.0971045, 0.7141733} }; From c541d6e182666b875fab3603782f8376dc99bcd6 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 10 Jun 2016 14:03:11 +0200 Subject: [PATCH 096/232] astyle - indent switch blocks. --- rawtherapee.astylerc | 1 + 1 file changed, 1 insertion(+) diff --git a/rawtherapee.astylerc b/rawtherapee.astylerc index 9c10d81cb..3a0b1ea2f 100644 --- a/rawtherapee.astylerc +++ b/rawtherapee.astylerc @@ -1,5 +1,6 @@ style=1tbs indent=spaces=4 +indent-switches break-blocks pad-oper convert-tabs From 49a6af275e7365e17b29112885010be883cf2e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 10 Jun 2016 16:19:55 +0200 Subject: [PATCH 097/232] Add some omitted `std::` prefixes in `dcp.cc` Those could hinder Marcin's SUSE builds. --- rtengine/dcp.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 775428a4e..e483a5248 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -79,7 +79,7 @@ void invert3x3(const DCPProfile::Matrix& a, DCPProfile::Matrix& b) const double det = a00 * temp[0][0] + a01 * temp[1][0] + a02 * temp[2][0]; - if (fabs(det) < 1.0e-10) { + if (std::fabs(det) < 1.0e-10) { abort(); // Can't be inverted, we shouldn't be dealing with such matrices } @@ -1357,8 +1357,7 @@ void DCPProfile::neutralToXy(const Triple& neutral, int preferred_illuminant, do multiply3x3_v3(inv_m, neutral, next_xyz); xyzToXy(next_xyz, next_xy); - if (fabs(next_xy[0] - last_xy[0]) + - fabs(next_xy[1] - last_xy[1]) < 0.0000001) { + if (std::fabs(next_xy[0] - last_xy[0]) + std::fabs(next_xy[1] - last_xy[1]) < 0.0000001) { xy[0] = next_xy[0]; xy[1] = next_xy[1]; return; @@ -1677,7 +1676,7 @@ void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector(h_scaled, 0); + int h_index0 = std::max(h_scaled, 0); const int s_index0 = std::max(std::min(s_scaled, table_info.pc.max_sat_index0), 0); int h_index1 = h_index0 + 1; @@ -1720,7 +1719,7 @@ void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector(h_scaled); const int s_index0 = std::max(std::min(s_scaled, table_info.pc.max_sat_index0), 0); const int v_index0 = std::max(std::min(v_scaled, table_info.pc.max_val_index0), 0); From b8749f8484555ab255ef5a53df0ec70164f86d7f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 10 Jun 2016 18:30:07 +0200 Subject: [PATCH 098/232] dcp speedup cleanup --- rtengine/color.h | 129 +++++++++++++++++++++---------------- rtengine/dcp.cc | 110 +++++++++++++------------------ rtengine/dcp.h | 4 +- rtengine/rawimagesource.cc | 2 +- 4 files changed, 120 insertions(+), 125 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 1e1cb9679..bf42140c5 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -230,34 +230,41 @@ public: * @param v value channel [0 ; 1] (return value) */ static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v); - - static inline void rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v) + + static inline bool rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v) { float var_Min = min(r, g, b); - float var_Max = max(r, g, b); - float del_Max = var_Max - var_Min; - v = var_Max / 65535.f; - if (fabsf(del_Max) < 0.00001f) { - h = 0.f; - s = 0.f; + if(var_Min < 0.f) { + return false; } else { - s = del_Max / var_Max; + float var_Max = max(r, g, b); + float del_Max = var_Max - var_Min; + v = var_Max / 65535.f; - if ( r == var_Max ) { - h = (g - b) / del_Max; - } else if ( g == var_Max ) { - h = 2.f + (b - r) / del_Max; - } else { /*if ( b == var_Max ) */ - h = 4.f + (r - g) / del_Max; + if (fabsf(del_Max) < 0.00001f) { + h = 0.f; + s = 0.f; + } else { + s = del_Max / var_Max; + + if ( r == var_Max ) { + h = (g - b) / del_Max; + } else if ( g == var_Max ) { + h = 2.f + (b - r) / del_Max; + } else { /*if ( b == var_Max ) */ + h = 4.f + (r - g) / del_Max; + } + + if ( h < 0.f ) { + h += 6.f; + } else if ( h > 6.f ) { + h -= 6.f; + } } - if ( h < 0.f ) { - h += 6.f; - } else if ( h > 6.f ) { - h -= 6.f; - } + return true; } } @@ -272,44 +279,56 @@ public: */ static void hsv2rgb (float h, float s, float v, float &r, float &g, float &b); -static inline void hsv2rgbdcp (float h, float s, float v, float &r, float &g, float &b) -{ - // special version for dcp which saves 1 division (in caller) and six multiplications (inside this function) - int i = h; // sector 0 to 5, floor() is very slow, and h is always >0 - float f = h - i; // fractional part of h + static inline void hsv2rgbdcp (float h, float s, float v, float &r, float &g, float &b) + { + // special version for dcp which saves 1 division (in caller) and six multiplications (inside this function) + int sector = h; // sector 0 to 5, floor() is very slow, and h is always >0 + float f = h - sector; // fractional part of h - v *= 65535.f; - float vs = v * s; - float p = v - vs; - float q = v - f * vs; - float t = p + v - q; + v *= 65535.f; + float vs = v * s; + float p = v - vs; + float q = v - f * vs; + float t = p + v - q; - if (i == 1) { - r = q; - g = v; - b = p; - } else if (i == 2) { - r = p; - g = v; - b = t; - } else if (i == 3) { - r = p; - g = q; - b = v; - } else if (i == 4) { - r = t; - g = p; - b = v; - } else if (i == 5) { - r = v; - g = p; - b = q; - } else { /*i==(0|6)*/ - r = v; - g = t; - b = p; + switch (sector) { + case 1: + r = q; + g = v; + b = p; + break; + + case 2: + r = p; + g = v; + b = t; + break; + + case 3: + r = p; + g = q; + b = v; + break; + + case 4: + r = t; + g = p; + b = v; + break; + + case 5: + r = v; + g = p; + b = q; + break; + + default: + r = v; + g = t; + b = p; + } } -} + static void hsv2rgb (float h, float s, float v, int &r, int &g, int &b); diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 19ccc2359..02cc8f0f4 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -35,25 +35,6 @@ namespace { // This sRGB gamma is taken from DNG reference code, with the added linear extension past 1.0, as we run clipless here -float srgbGammaForward(float x) -{ - return - x <= 0.0031308f - ? x * 12.92f - : x > 1.0f - ? 1.0f + (x - 1.0f) * (1.055f * (1.0f / 2.4f)) // Linear extension - : 1.055f * pow(x, 1.0f / 2.4f) - 0.055f; -} - -float srgbGammaInverse(float y) -{ - return - y <= 0.0031308f * 12.92f - ? y * (1.0f / 12.92f) - : y > 1.0f - ? 1.0f + (y - 1.0f) / (1.055f * (1.0f / 2.4f)) - : pow ((y + 0.055f) * (1.0f / 1.055f), 2.4f); -} void invert3x3(const DCPProfile::Matrix& a, DCPProfile::Matrix& b) { @@ -143,10 +124,11 @@ void mapWhiteMatrix(const DCPProfile::Triple& white1, const DCPProfile::Triple& // Use the linearized Bradford adaptation matrix const DCPProfile::Matrix mb = {{ - { 0.8951, 0.2664, -0.1614 }, - { -0.7502, 1.7135, 0.0367 }, - { 0.0389, -0.0685, 1.0296 } - }}; + { 0.8951, 0.2664, -0.1614 }, + { -0.7502, 1.7135, 0.0367 }, + { 0.0389, -0.0685, 1.0296 } + } + }; DCPProfile::Triple w1; multiply3x3_v3(mb, white1, w1); @@ -735,13 +717,13 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : Tag* tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_1)); light_source_1 = tag - ? tag->toInt(0, rtexif::SHORT) - : -1; + ? tag->toInt(0, rtexif::SHORT) + : -1; tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_2)); light_source_2 = tag - ? tag->toInt(0, rtexif::SHORT) - : -1; + ? tag->toInt(0, rtexif::SHORT) + : -1; temperature_1 = calibrationIlluminantToTemperature(light_source_1); temperature_2 = calibrationIlluminantToTemperature(light_source_2); @@ -813,8 +795,8 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : // Precalculated constants for table application look_info.pc.h_scale = look_info.hue_divisions < 2 - ? 0.0f - : static_cast(look_info.hue_divisions) / 6.0f; + ? 0.0f + : static_cast(look_info.hue_divisions) / 6.0f; look_info.pc.s_scale = look_info.sat_divisions - 1; look_info.pc.v_scale = look_info.val_divisions - 1; look_info.pc.max_hue_index0 = look_info.hue_divisions - 1; @@ -847,8 +829,8 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : delta_info.pc.h_scale = delta_info.hue_divisions < 2 - ? 0.0f - : static_cast(delta_info.hue_divisions) / 6.0f; + ? 0.0f + : static_cast(delta_info.hue_divisions) / 6.0f; delta_info.pc.s_scale = delta_info.sat_divisions - 1; delta_info.pc.v_scale = delta_info.val_divisions - 1; delta_info.pc.max_hue_index0 = delta_info.hue_divisions - 1; @@ -868,8 +850,8 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : for (int col = 0; col < 3; ++col) { color_matrix_2[row][col] = tag - ? tag->toDouble((col + row * 3) * 8) - : color_matrix_1[row][col]; + ? tag->toDouble((col + row * 3) * 8) + : color_matrix_1[row][col]; } } @@ -1019,9 +1001,7 @@ void DCPProfile::apply( const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, - bool use_tone_curve, - bool apply_hue_sat_map, - bool apply_look_table + bool apply_hue_sat_map ) const { BENCHFUN @@ -1036,15 +1016,9 @@ void DCPProfile::apply( apply_hue_sat_map = false; } - if (look_table.empty()) { - apply_look_table = false; - } - - use_tone_curve = use_tone_curve && tone_curve; - - if (!apply_hue_sat_map && !apply_look_table && !use_tone_curve) { - // The fast path: No LUT and not tone curve --> Calculate matrix for direct conversion raw>working space - double mat[3][3] = {}; + if (!apply_hue_sat_map) { + // The fast path: No LUT --> Calculate matrix for direct conversion raw -> working space + float mat[3][3] = {}; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { @@ -1058,6 +1032,7 @@ void DCPProfile::apply( #ifdef _OPENMP #pragma omp parallel for #endif + for (int y = 0; y < img->height; ++y) { for (int x = 0; x < img->width; x++) { const float& newr = mat[0][0] * img->r(y, x) + mat[0][1] * img->g(y, x) + mat[0][2] * img->b(y, x); @@ -1095,18 +1070,19 @@ void DCPProfile::apply( #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif + for (int y = 0; y < img->height; ++y) { for (int x = 0; x < img->width; x++) { float newr = pro_photo[0][0] * img->r(y, x) + pro_photo[0][1] * img->g(y, x) + pro_photo[0][2] * img->b(y, x); float newg = pro_photo[1][0] * img->r(y, x) + pro_photo[1][1] * img->g(y, x) + pro_photo[1][2] * img->b(y, x); float newb = pro_photo[2][0] * img->r(y, x) + pro_photo[2][1] * img->g(y, x) + pro_photo[2][2] * img->b(y, x); - // If point is in negative area, just the matrix, but not the LUT - if (newr >= 0 && newg >= 0 && newb >= 0) { - float h; - float s; - float v; - Color::rgb2hsvdcp(newr, newg, newb, h , s, v); + // If point is in negative area, just the matrix, but not the LUT. This is checked inside Color::rgb2hsvdcp + float h; + float s; + float v; + + if(Color::rgb2hsvdcp(newr, newg, newb, h , s, v)) { hsdApply(delta_info, delta_base, h, s, v); @@ -1178,11 +1154,10 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int #define FCLIP(a) ((a)>0.0?((a)<65535.5?(a):65535.5):0.0) #define CLIP01(a) ((a)>0?((a)<1?(a):1):0) - float exp_scale = 1.0; - exp_scale *= as_in.data->bl_scale; + float exp_scale = as_in.data->bl_scale; if (!as_in.data->use_tone_curve && !as_in.data->apply_look_table) { - if (exp_scale == 1.0) { + if (exp_scale == 1.f) { return; } @@ -1370,10 +1345,11 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu invert3x3(cam_wb_matrix, cam_xyz); Matrix cam_rgb; constexpr Matrix xyz_srgb = {{ - {xyz_sRGB[0][0], xyz_sRGB[0][1], xyz_sRGB[0][2]}, - {xyz_sRGB[1][0], xyz_sRGB[1][1], xyz_sRGB[1][2]}, - {xyz_sRGB[2][0], xyz_sRGB[2][1], xyz_sRGB[2][2]} - }}; + {xyz_sRGB[0][0], xyz_sRGB[0][1], xyz_sRGB[0][2]}, + {xyz_sRGB[1][0], xyz_sRGB[1][1], xyz_sRGB[1][2]}, + {xyz_sRGB[2][0], xyz_sRGB[2][1], xyz_sRGB[2][2]} + } + }; multiply3x3(cam_xyz, xyz_srgb, cam_rgb); double camwb_red = cam_rgb[0][0] * r + cam_rgb[0][1] * g + cam_rgb[0][2] * b; double camwb_green = cam_rgb[1][0] * r + cam_rgb[1][1] * g + cam_rgb[1][2] * b; @@ -1499,10 +1475,11 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu multiply3x3_v3(color_matrix, white_xyz, camera_white); const Matrix white_diag = {{ - {camera_white[0], 0, 0}, - {0, camera_white[1], 0}, - {0, 0, camera_white[2]} - }}; + {camera_white[0], 0, 0}, + {0, camera_white[1], 0}, + {0, 0, camera_white[2]} + } + }; Matrix white_diag_inv; invert3x3(white_diag, white_diag_inv); @@ -1594,14 +1571,15 @@ std::vector DCPProfile::makeHueSatMap(const ColorTemp& wh const bool reverse = temperature_1 > temperature_2; const double t1 = reverse - ? temperature_2 - : temperature_1; + ? temperature_2 + : temperature_1; const double t2 = reverse - ? temperature_1 - : temperature_2; + ? temperature_1 + : temperature_2; double mix; + if (white_balance.getTemp() <= t1) { mix = 1.0; } else if (white_balance.getTemp() >= t2) { diff --git a/rtengine/dcp.h b/rtengine/dcp.h index ace32869a..7db44950d 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -80,9 +80,7 @@ public: const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, - bool use_tone_curve = false, - bool apply_hue_sat_map = true, - bool apply_look_table = false + bool apply_hue_sat_map = true ) const; void setStep2ApplyState(const Glib::ustring& working_space, bool use_tone_curve, bool apply_look_table, bool apply_baseline_exposure, ApplyState& as_out); void step2ApplyTile(float* r, float* g, float* b, int width, int height, int tile_width, const ApplyState& as_in) const; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1c04f1af3..218ba9fe2 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3737,7 +3737,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} }}; - dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, false, cmp.applyHueSatMap, false); + dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, cmp.applyHueSatMap); return; } From 65306973b1d7288a92a669d4baf6803fcccd825a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 11 Jun 2016 22:18:59 +0200 Subject: [PATCH 099/232] Speedup for Flat-Field correction, fixes #3253, also introduces changed formatting to switch statements caused by new astyle profile --- rtengine/ffmanager.cc | 44 +- rtengine/rawimagesource.cc | 1247 +++++++++++++++++++----------------- rtengine/rawimagesource.h | 2 +- 3 files changed, 687 insertions(+), 606 deletions(-) diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 783c18bf7..c5461f3e9 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -18,12 +18,17 @@ */ #include "ffmanager.h" #include "../rtgui/options.h" -#include #include "rawimage.h" -#include -#include #include "imagedata.h" +#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } +#define med5(a0,a1,a2,a3,a4,median) { \ +p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; \ +PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ; \ +PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ; \ +PIX_SORT(p[1],p[2]) ; median=p[2] ;} + + namespace rtengine { @@ -200,8 +205,37 @@ void ffInfo::updateRawImage() ri->compress_image(); } } -} + if(ri) { + // apply median to avoid this step being executed each time a flat field gets applied + int H = ri->get_height(); + int W = ri->get_width(); + float *cfatmp = (float (*)) malloc (H * W * sizeof * cfatmp); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int i = 0; i < H; i++) { + int p[5], temp; + int iprev = i < 2 ? i + 2 : i - 2; + int inext = i > H - 3 ? i - 2 : i + 2; + + for (int j = 0; j < W; j++) { + int jprev = j < 2 ? j + 2 : j - 2; + int jnext = j > W - 3 ? j - 2 : j + 2; + + med5(ri->data[iprev][j], ri->data[i][jprev], ri->data[i][j], + ri->data[i][jnext], ri->data[inext][j], cfatmp[i * W + j]); + } + } + + memcpy(ri->data[0], cfatmp, W * H * sizeof(float)); + + free (cfatmp); + + } +} // ************************* class FFManager ********************************* @@ -210,6 +244,7 @@ void FFManager::init( Glib::ustring pathname ) std::vector names; auto dir = Gio::File::create_for_path (pathname); + if (!dir || !dir->query_exists()) { return; } @@ -287,6 +322,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool) Glib::ustring ext; auto lastdot = info->get_name ().find_last_of ('.'); + if (lastdot != Glib::ustring::npos) { ext = info->get_name ().substr (lastdot + 1); } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 1c04f1af3..c96456213 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,7 +37,7 @@ #include #endif #include "opthelper.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD @@ -49,32 +49,32 @@ namespace void rotateLine (const float* const line, rtengine::PlanarPtr &channel, const int tran, const int i, const int w, const int h) { switch(tran & TR_ROT) { - case TR_R180: - for (int j = 0; j < w; j++) { - channel(h - 1 - i, w - 1 - j) = line[j]; - } + case TR_R180: + for (int j = 0; j < w; j++) { + channel(h - 1 - i, w - 1 - j) = line[j]; + } - break; + break; - case TR_R90: - for (int j = 0; j < w; j++) { - channel(j, h - 1 - i) = line[j]; - } + case TR_R90: + for (int j = 0; j < w; j++) { + channel(j, h - 1 - i) = line[j]; + } - break; + break; - case TR_R270: - for (int j = 0; j < w; j++) { - channel(w - 1 - j, i) = line[j]; - } + case TR_R270: + for (int j = 0; j < w; j++) { + channel(w - 1 - j, i) = line[j]; + } - break; + break; - case TR_NONE: - default: - for (int j = 0; j < w; j++) { - channel(i, j) = line[j]; - } + case TR_NONE: + default: + for (int j = 0; j < w; j++) { + channel(i, j) = line[j]; + } } } @@ -96,60 +96,60 @@ void transLineFuji (const float* const red, const float* const green, const floa int end = min(h + fw - i, w - fw + i); switch(tran & TR_ROT) { - case TR_R180: - for (int j = start; j < end; j++) { - int y = i + j - fw; - int x = fw - i + j; + case TR_R180: + for (int j = start; j < end; j++) { + int y = i + j - fw; + int x = fw - i + j; - if (x >= 0 && y < image->height && y >= 0 && x < image->width) { - image->r(image->height - 1 - y, image->width - 1 - x) = red[j]; - image->g(image->height - 1 - y, image->width - 1 - x) = green[j]; - image->b(image->height - 1 - y, image->width - 1 - x) = blue[j]; + if (x >= 0 && y < image->height && y >= 0 && x < image->width) { + image->r(image->height - 1 - y, image->width - 1 - x) = red[j]; + image->g(image->height - 1 - y, image->width - 1 - x) = green[j]; + image->b(image->height - 1 - y, image->width - 1 - x) = blue[j]; + } } - } - break; + break; - case TR_R270: - for (int j = start; j < end; j++) { - int y = i + j - fw; - int x = fw - i + j; + case TR_R270: + for (int j = start; j < end; j++) { + int y = i + j - fw; + int x = fw - i + j; - if (x >= 0 && x < image->height && y >= 0 && y < image->width) { - image->r(image->height - 1 - x, y) = red[j]; - image->g(image->height - 1 - x, y) = green[j]; - image->b(image->height - 1 - x, y) = blue[j]; + if (x >= 0 && x < image->height && y >= 0 && y < image->width) { + image->r(image->height - 1 - x, y) = red[j]; + image->g(image->height - 1 - x, y) = green[j]; + image->b(image->height - 1 - x, y) = blue[j]; + } } - } - break; + break; - case TR_R90: - for (int j = start; j < end; j++) { - int y = i + j - fw; - int x = fw - i + j; + case TR_R90: + for (int j = start; j < end; j++) { + int y = i + j - fw; + int x = fw - i + j; - if (x >= 0 && y < image->width && y >= 0 && x < image->height) { - image->r(x, image->width - 1 - y) = red[j]; - image->g(x, image->width - 1 - y) = green[j]; - image->b(x, image->width - 1 - y) = blue[j]; + if (x >= 0 && y < image->width && y >= 0 && x < image->height) { + image->r(x, image->width - 1 - y) = red[j]; + image->g(x, image->width - 1 - y) = green[j]; + image->b(x, image->width - 1 - y) = blue[j]; + } } - } - break; + break; - case TR_NONE: - default: - for (int j = start; j < end; j++) { - int y = i + j - fw; - int x = fw - i + j; + case TR_NONE: + default: + for (int j = start; j < end; j++) { + int y = i + j - fw; + int x = fw - i + j; - if (x >= 0 && y < image->height && y >= 0 && x < image->width) { - image->r(y, x) = red[j]; - image->g(y, x) = green[j]; - image->b(y, x) = blue[j]; + if (x >= 0 && y < image->height && y >= 0 && x < image->width) { + image->r(y, x) = red[j]; + image->g(y, x) = green[j]; + image->b(y, x) = blue[j]; + } } - } } } @@ -161,250 +161,250 @@ void transLineD1x (const float* const red, const float* const green, const float // We do that in combination with coarse rotation switch(tran & TR_ROT) { - case TR_R180: // rotate 180 degree - for (int j = 0; j < imwidth; j++) { - image->r(2 * (imheight - 1 - i), imwidth - 1 - j) = red[j]; - image->g(2 * (imheight - 1 - i), imwidth - 1 - j) = green[j]; - image->b(2 * (imheight - 1 - i), imwidth - 1 - j) = blue[j]; - } - - if (i == 0) { + case TR_R180: // rotate 180 degree for (int j = 0; j < imwidth; j++) { - image->r(2 * imheight - 1, imwidth - 1 - j) = red[j]; - image->g(2 * imheight - 1, imwidth - 1 - j) = green[j]; - image->b(2 * imheight - 1, imwidth - 1 - j) = blue[j]; - } - } - - if (i == 1 || i == 2) { // linear interpolation - int row = 2 * imheight - 1 - 2 * i; - - for (int j = 0; j < imwidth; j++) { - int col = imwidth - 1 - j; - image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; - image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; - image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; + image->r(2 * (imheight - 1 - i), imwidth - 1 - j) = red[j]; + image->g(2 * (imheight - 1 - i), imwidth - 1 - j) = green[j]; + image->b(2 * (imheight - 1 - i), imwidth - 1 - j) = blue[j]; } - if(i == 2 && oddHeight) { - int row = 2 * imheight; + if (i == 0) { + for (int j = 0; j < imwidth; j++) { + image->r(2 * imheight - 1, imwidth - 1 - j) = red[j]; + image->g(2 * imheight - 1, imwidth - 1 - j) = green[j]; + image->b(2 * imheight - 1, imwidth - 1 - j) = blue[j]; + } + } + + if (i == 1 || i == 2) { // linear interpolation + int row = 2 * imheight - 1 - 2 * i; for (int j = 0; j < imwidth; j++) { int col = imwidth - 1 - j; - image->r(row, col) = (red[j] + image->r(row - 2, col)) / 2; - image->g(row, col) = (green[j] + image->g(row - 2, col)) / 2; - image->b(row, col) = (blue[j] + image->b(row - 2, col)) / 2; - } - } - } else if (i == imheight - 1 || i == imheight - 2) { - int row = 2 * imheight - 1 - 2 * i; - - for (int j = 0; j < imwidth; j++) { - int col = imwidth - 1 - j; - image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; - image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; - image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; - } - - row = 2 * imheight - 1 - 2 * i + 2; - - for (int j = 0; j < imwidth; j++) { - int col = imwidth - 1 - j; - image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; - image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; - image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; - } - } else if (i > 2 && i < imheight - 1) { // vertical bicubic interpolation - int row = 2 * imheight - 1 - 2 * i + 2; - - for (int j = 0; j < imwidth; j++) { - int col = imwidth - 1 - j; - image->r(row, col) = MAX(0.f, -0.0625f * (red[j] + image->r(row + 3, col)) + 0.5625f * (image->r(row - 1, col) + image->r(row + 1, col))); - 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) { - 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); - } - } - } - - break; - - case TR_R90: // rotate right - 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]; - image->b(j, 2 * imheight - 1) = blue[j]; - } - } - - for (int j = 0; j < imwidth; j++) { - image->r(j, 2 * (imheight - 1 - i)) = red[j]; - image->g(j, 2 * (imheight - 1 - i)) = green[j]; - image->b(j, 2 * (imheight - 1 - i)) = blue[j]; - } - - if (i == 1 || i == 2) { // linear interpolation - int col = 2 * imheight - 1 - 2 * i; - - for (int j = 0; j < imwidth; j++) { - image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; - 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) { - 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; - } - } - } else if (i == imheight - 1) { - int col = 2 * imheight - 1 - 2 * i; - - for (int j = 0; j < imwidth; j++) { - image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; - image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; - image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; - } - - col = 2 * imheight - 1 - 2 * i + 2; - - for (int j = 0; j < imwidth; j++) { - image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; - image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; - image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; - } - } else if (i > 2 && i < imheight - 1) { // vertical bicubic interpolation - int col = 2 * imheight - 1 - 2 * i + 2; - - for (int j = 0; j < imwidth; j++) { - image->r(j, col) = MAX(0.f, -0.0625f * (red[j] + image->r(j, col + 3)) + 0.5625f * (image->r(j, col - 1) + image->r(j, col + 1))); - 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) { - 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); - } - } - } - - break; - - case TR_R270: // rotate left - if (i == 0) { - for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { - image->r(row, 2 * i) = red[j]; - image->g(row, 2 * i) = green[j]; - image->b(row, 2 * i) = blue[j]; - } - } else if (i == 1 || i == 2) { // linear interpolation - for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { - image->r(row, 2 * i) = red[j]; - image->g(row, 2 * i) = green[j]; - image->b(row, 2 * i) = blue[j]; - image->r(row, 2 * i - 1) = (red[j] + image->r(row, 2 * i - 2)) * 0.5f; - image->g(row, 2 * i - 1) = (green[j] + image->g(row, 2 * i - 2)) * 0.5f; - image->b(row, 2 * i - 1) = (blue[j] + image->b(row, 2 * i - 2)) * 0.5f; - } - } else if (i > 0 && i < imheight) { // vertical bicubic interpolation - for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { - image->r(row, 2 * i - 3) = MAX(0.f, -0.0625f * (red[j] + image->r(row, 2 * i - 6)) + 0.5625f * (image->r(row, 2 * i - 2) + image->r(row, 2 * i - 4))); - 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) { - 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); + image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; + image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; + image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; } - image->r(row, 2 * i) = red[j]; - image->g(row, 2 * i) = green[j]; - image->b(row, 2 * i) = blue[j]; - } - } + if(i == 2 && oddHeight) { + int row = 2 * imheight; - if (i == imheight - 1) { - for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { - image->r(row, 2 * i - 1) = MAX(0.f, -0.0625f * (red[j] + image->r(row, 2 * i - 4)) + 0.5625f * (image->r(row, 2 * i) + image->r(row, 2 * i - 2))); - 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))); + for (int j = 0; j < imwidth; j++) { + int col = imwidth - 1 - j; + image->r(row, col) = (red[j] + image->r(row - 2, col)) / 2; + image->g(row, col) = (green[j] + image->g(row - 2, col)) / 2; + image->b(row, col) = (blue[j] + image->b(row - 2, col)) / 2; + } + } + } else if (i == imheight - 1 || i == imheight - 2) { + int row = 2 * imheight - 1 - 2 * i; - 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); + for (int j = 0; j < imwidth; j++) { + int col = imwidth - 1 - j; + image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; + image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; + image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; } - image->r(row, 2 * i + 1) = (red[j] + image->r(row, 2 * i - 1)) / 2; - image->g(row, 2 * i + 1) = (green[j] + image->g(row, 2 * i - 1)) / 2; - image->b(row, 2 * i + 1) = (blue[j] + image->b(row, 2 * i - 1)) / 2; + row = 2 * imheight - 1 - 2 * i + 2; - if (oddHeight) { - image->r(row, 2 * i + 2) = (red[j] + image->r(row, 2 * i - 2)) / 2; - image->g(row, 2 * i + 2) = (green[j] + image->g(row, 2 * i - 2)) / 2; - image->b(row, 2 * i + 2) = (blue[j] + image->b(row, 2 * i - 2)) / 2; + for (int j = 0; j < imwidth; j++) { + int col = imwidth - 1 - j; + image->r(row, col) = (red[j] + image->r(row + 1, col)) / 2; + image->g(row, col) = (green[j] + image->g(row + 1, col)) / 2; + image->b(row, col) = (blue[j] + image->b(row + 1, col)) / 2; + } + } else if (i > 2 && i < imheight - 1) { // vertical bicubic interpolation + int row = 2 * imheight - 1 - 2 * i + 2; + + for (int j = 0; j < imwidth; j++) { + int col = imwidth - 1 - j; + image->r(row, col) = MAX(0.f, -0.0625f * (red[j] + image->r(row + 3, col)) + 0.5625f * (image->r(row - 1, col) + image->r(row + 1, col))); + 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) { + 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); + } } } - } - break; + break; - case TR_NONE: // no coarse rotation - default: - rotateLine (red, image->r, tran, 2 * i, imwidth, imheight); - rotateLine (green, image->g, tran, 2 * i, imwidth, imheight); - rotateLine (blue, image->b, tran, 2 * i, imwidth, imheight); + case TR_R90: // rotate right + 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]; + image->b(j, 2 * imheight - 1) = blue[j]; + } + } - if (i == 1 || i == 2) { // linear interpolation for (int j = 0; j < imwidth; j++) { - image->r(2 * i - 1, j) = (red[j] + image->r(2 * i - 2, j)) / 2; - image->g(2 * i - 1, j) = (green[j] + image->g(2 * i - 2, j)) / 2; - image->b(2 * i - 1, j) = (blue[j] + image->b(2 * i - 2, j)) / 2; + image->r(j, 2 * (imheight - 1 - i)) = red[j]; + image->g(j, 2 * (imheight - 1 - i)) = green[j]; + image->b(j, 2 * (imheight - 1 - i)) = blue[j]; } - } else if (i > 2 && i < imheight) { // vertical bicubic interpolation - for (int j = 0; j < imwidth; j++) { - image->r(2 * i - 3, j) = MAX(0.f, -0.0625f * (red[j] + image->r(2 * i - 6, j)) + 0.5625f * (image->r(2 * i - 2, j) + image->r(2 * i - 4, j))); - 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) { - 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); + if (i == 1 || i == 2) { // linear interpolation + int col = 2 * imheight - 1 - 2 * i; + + for (int j = 0; j < imwidth; j++) { + image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; + 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) { + 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; + } } - } - } + } else if (i == imheight - 1) { + int col = 2 * imheight - 1 - 2 * i; - if (i == imheight - 1) { - for (int j = 0; j < imwidth; j++) { - image->r(2 * i - 1, j) = MAX(0.f, -0.0625f * (red[j] + image->r(2 * i - 4, j)) + 0.5625f * (image->r(2 * i, j) + image->r(2 * i - 2, j))); - 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) { - 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); + for (int j = 0; j < imwidth; j++) { + image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; + image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; + image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; } - image->r(2 * i + 1, j) = (red[j] + image->r(2 * i - 1, j)) / 2; - image->g(2 * i + 1, j) = (green[j] + image->g(2 * i - 1, j)) / 2; - image->b(2 * i + 1, j) = (blue[j] + image->b(2 * i - 1, j)) / 2; + col = 2 * imheight - 1 - 2 * i + 2; - if (oddHeight) { - image->r(2 * i + 2, j) = (red[j] + image->r(2 * i - 2, j)) / 2; - image->g(2 * i + 2, j) = (green[j] + image->g(2 * i - 2, j)) / 2; - image->b(2 * i + 2, j) = (blue[j] + image->b(2 * i - 2, j)) / 2; + for (int j = 0; j < imwidth; j++) { + image->r(j, col) = (red[j] + image->r(j, col + 1)) / 2; + image->g(j, col) = (green[j] + image->g(j, col + 1)) / 2; + image->b(j, col) = (blue[j] + image->b(j, col + 1)) / 2; + } + } else if (i > 2 && i < imheight - 1) { // vertical bicubic interpolation + int col = 2 * imheight - 1 - 2 * i + 2; + + for (int j = 0; j < imwidth; j++) { + image->r(j, col) = MAX(0.f, -0.0625f * (red[j] + image->r(j, col + 3)) + 0.5625f * (image->r(j, col - 1) + image->r(j, col + 1))); + 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) { + 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); + } + } + } + + break; + + case TR_R270: // rotate left + if (i == 0) { + for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { + image->r(row, 2 * i) = red[j]; + image->g(row, 2 * i) = green[j]; + image->b(row, 2 * i) = blue[j]; + } + } else if (i == 1 || i == 2) { // linear interpolation + for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { + image->r(row, 2 * i) = red[j]; + image->g(row, 2 * i) = green[j]; + image->b(row, 2 * i) = blue[j]; + image->r(row, 2 * i - 1) = (red[j] + image->r(row, 2 * i - 2)) * 0.5f; + image->g(row, 2 * i - 1) = (green[j] + image->g(row, 2 * i - 2)) * 0.5f; + image->b(row, 2 * i - 1) = (blue[j] + image->b(row, 2 * i - 2)) * 0.5f; + } + } else if (i > 0 && i < imheight) { // vertical bicubic interpolation + for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { + image->r(row, 2 * i - 3) = MAX(0.f, -0.0625f * (red[j] + image->r(row, 2 * i - 6)) + 0.5625f * (image->r(row, 2 * i - 2) + image->r(row, 2 * i - 4))); + 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) { + 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); + } + + image->r(row, 2 * i) = red[j]; + image->g(row, 2 * i) = green[j]; + image->b(row, 2 * i) = blue[j]; + } + } + + if (i == imheight - 1) { + for (int j = imwidth - 1, row = 0; j >= 0; j--, row++) { + image->r(row, 2 * i - 1) = MAX(0.f, -0.0625f * (red[j] + image->r(row, 2 * i - 4)) + 0.5625f * (image->r(row, 2 * i) + image->r(row, 2 * i - 2))); + 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) { + 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); + } + + image->r(row, 2 * i + 1) = (red[j] + image->r(row, 2 * i - 1)) / 2; + image->g(row, 2 * i + 1) = (green[j] + image->g(row, 2 * i - 1)) / 2; + image->b(row, 2 * i + 1) = (blue[j] + image->b(row, 2 * i - 1)) / 2; + + if (oddHeight) { + image->r(row, 2 * i + 2) = (red[j] + image->r(row, 2 * i - 2)) / 2; + image->g(row, 2 * i + 2) = (green[j] + image->g(row, 2 * i - 2)) / 2; + image->b(row, 2 * i + 2) = (blue[j] + image->b(row, 2 * i - 2)) / 2; + } + } + } + + break; + + case TR_NONE: // no coarse rotation + default: + rotateLine (red, image->r, tran, 2 * i, imwidth, imheight); + rotateLine (green, image->g, tran, 2 * i, imwidth, imheight); + rotateLine (blue, image->b, tran, 2 * i, imwidth, imheight); + + if (i == 1 || i == 2) { // linear interpolation + for (int j = 0; j < imwidth; j++) { + image->r(2 * i - 1, j) = (red[j] + image->r(2 * i - 2, j)) / 2; + image->g(2 * i - 1, j) = (green[j] + image->g(2 * i - 2, j)) / 2; + image->b(2 * i - 1, j) = (blue[j] + image->b(2 * i - 2, j)) / 2; + } + } else if (i > 2 && i < imheight) { // vertical bicubic interpolation + for (int j = 0; j < imwidth; j++) { + image->r(2 * i - 3, j) = MAX(0.f, -0.0625f * (red[j] + image->r(2 * i - 6, j)) + 0.5625f * (image->r(2 * i - 2, j) + image->r(2 * i - 4, j))); + 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) { + 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); + } + } + } + + if (i == imheight - 1) { + for (int j = 0; j < imwidth; j++) { + image->r(2 * i - 1, j) = MAX(0.f, -0.0625f * (red[j] + image->r(2 * i - 4, j)) + 0.5625f * (image->r(2 * i, j) + image->r(2 * i - 2, j))); + 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) { + 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); + } + + image->r(2 * i + 1, j) = (red[j] + image->r(2 * i - 1, j)) / 2; + image->g(2 * i + 1, j) = (green[j] + image->g(2 * i - 1, j)) / 2; + image->b(2 * i + 1, j) = (blue[j] + image->b(2 * i - 1, j)) / 2; + + if (oddHeight) { + image->r(2 * i + 2, j) = (red[j] + image->r(2 * i - 2, j)) / 2; + image->g(2 * i + 2, j) = (green[j] + image->g(2 * i - 2, j)) / 2; + image->b(2 * i + 2, j) = (blue[j] + image->b(2 * i - 2, j)) / 2; + } } } - } } } @@ -879,12 +879,12 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima // Colour correction (only when running on full resolution) if(pp.skip == 1) { switch(ri->getSensorType()) { - case ST_BAYER: - processFalseColorCorrection (image, raw.bayersensor.ccSteps); - break; + case ST_BAYER: + processFalseColorCorrection (image, raw.bayersensor.ccSteps); + break; - case ST_FUJI_XTRANS: - processFalseColorCorrection (image, raw.xtranssensor.ccSteps); + case ST_FUJI_XTRANS: + processFalseColorCorrection (image, raw.xtranssensor.ccSteps); } } } @@ -2673,8 +2673,8 @@ void RawImageSource::HLRecovery_Global(ToneCurveParams hrp) void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]) { - float (*cfablur); - cfablur = (float (*)) calloc (H * W, sizeof * cfablur); + BENCHFUN + float *cfablur = (float (*)) malloc (H * W * sizeof * cfablur); int BS = raw.ff_BlurRadius; BS += BS & 1; @@ -2683,9 +2683,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile cfaboxblur(riFlatFile, cfablur, 2 * BS, 0); } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::h_ff]) { cfaboxblur(riFlatFile, cfablur, 0, 2 * BS); - } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) + } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) { //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - { + //allocate buffer and pass it to cfaboxblur => saves two allocations/deallocations later in code cfaboxblur(riFlatFile, cfablur, BS, BS); //first do area blur to correct vignette } else { //(raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::area_ff]) cfaboxblur(riFlatFile, cfablur, BS, BS); @@ -2694,7 +2694,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile if(ri->getSensorType() == ST_BAYER) { float refcolor[2][2]; - //find center ave values by channel + //find centre average values by channel for (int m = 0; m < 2; m++) for (int n = 0; n < 2; n++) { int row = 2 * (H >> 2) + m; @@ -2763,27 +2763,47 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } - for (int m = 0; m < 2; m++) - for (int n = 0; n < 2; n++) { -#ifdef _OPENMP - #pragma omp parallel + int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; + int c4[2][2]; + c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + +#ifdef __SSE2__ + vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), + _mm_set_ps(refcolor[1][1], refcolor[1][0], refcolor[1][1], refcolor[1][0]) + }; + vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + }; + + vfloat epsv = F2V(1e-5f); #endif - { - int c = FC(m, n); - int c4 = ( c == 1 && !(m & 1) ) ? 3 : c; #ifdef _OPENMP - #pragma omp for + #pragma omp parallel for schedule(dynamic,16) #endif - for (int row = 0; row < H - m; row += 2) - { - for (int col = 0; col < W - n; col += 2) { - float vignettecorr = ( refcolor[m][n] / max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4]) ); - rawData[row + m][col + n] = (rawData[row + m][col + n] - black[c4]) * vignettecorr + black[c4]; - } - } - } + for (int row = 0; row < H; row ++) { + int col = 0; +#ifdef __SSE2__ + vfloat rowBlackv = blackv[row & 1]; + vfloat rowRefcolorv = refcolorv[row & 1]; + + for (; col < W - 3; col += 4) { + vfloat vignettecorrv = rowRefcolorv / vmaxf(epsv, LVFU(cfablur[(row) * W + col]) - rowBlackv); + vfloat valv = LVFU(rawData[row][col]); + valv -= rowBlackv; + STVFU(rawData[row][col], valv * vignettecorrv + rowBlackv); } + +#endif + + for (; col < W; col ++) { + float vignettecorr = refcolor[row & 1][col & 1] / max(1e-5f, cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]); + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; + } + } } else if(ri->getSensorType() == ST_FUJI_XTRANS) { float refcolor[3] = {0.f}; int cCount[3] = {0}; @@ -2866,32 +2886,52 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) { - float (*cfablur1); - cfablur1 = (float (*)) calloc (H * W, sizeof * cfablur1); - float (*cfablur2); - cfablur2 = (float (*)) calloc (H * W, sizeof * cfablur2); + float *cfablur1 = (float (*)) malloc (H * W * sizeof * cfablur1); + float *cfablur2 = (float (*)) malloc (H * W * sizeof * cfablur2); //slightly more complicated blur if trying to correct both vertical and horizontal anomalies cfaboxblur(riFlatFile, cfablur1, 0, 2 * BS); //now do horizontal blur cfaboxblur(riFlatFile, cfablur2, 2 * BS, 0); //now do vertical blur if(ri->getSensorType() == ST_BAYER) { - for (int m = 0; m < 2; m++) - for (int n = 0; n < 2; n++) { + int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; + int c4[2][2]; + c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + +#ifdef __SSE2__ + vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), + _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) + }; + + vfloat epsv = F2V(1e-5f); +#endif #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for schedule(dynamic,16) #endif - for (int row = 0; row < H - m; row += 2) { - int c = FC(row, 0); - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; + for (int row = 0; row < H; row ++) { + int col = 0; +#ifdef __SSE2__ + vfloat rowBlackv = blackv[row & 1]; - for (int col = 0; col < W - n; col += 2) { - float hlinecorr = (max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4]) / max(1e-5f, cfablur1[(row + m) * W + col + n] - black[c4]) ); - float vlinecorr = (max(1e-5f, cfablur[(row + m) * W + col + n] - black[c4]) / max(1e-5f, cfablur2[(row + m) * W + col + n] - black[c4]) ); - rawData[row + m][col + n] = ((rawData[row + m][col + n] - black[c4]) * hlinecorr * vlinecorr + black[c4]); - } - } + for (; col < W - 3; col += 4) { + vfloat linecorrv = SQRV(vmaxf(epsv, LVFU(cfablur[row * W + col]) - rowBlackv)) / + (vmaxf(epsv, LVFU(cfablur1[row * W + col]) - rowBlackv) * vmaxf(epsv, LVFU(cfablur2[row * W + col]) - rowBlackv)); + vfloat valv = LVFU(rawData[row][col]); + valv -= rowBlackv; + STVFU(rawData[row][col], valv * linecorrv + rowBlackv); } + +#endif + + for (; col < W; col ++) { + float linecorr = SQR(max(1e-5f, cfablur[row * W + col] - black[c4[row & 1][col & 1]])) / + (max(1e-5f, cfablur1[row * W + col] - black[c4[row & 1][col & 1]]) * max(1e-5f, cfablur2[row * W + col] - black[c4[row & 1][col & 1]])) ; + rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * linecorr + black[c4[row & 1][col & 1]]; + } + } } else if(ri->getSensorType() == ST_FUJI_XTRANS) { #ifdef _OPENMP #pragma omp parallel for @@ -3001,238 +3041,242 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } -SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW ) +SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) { + float *tmpBuffer = nullptr; + float *cfatmp = nullptr; + float *srcVertical = nullptr; + + if(boxH > 0 && boxW > 0) { + // we need a temporary buffer if we have to blur both directions + tmpBuffer = (float (*)) calloc (H * W, sizeof * tmpBuffer); + } + + if(boxH == 0) { + // if boxH == 0 we can skip the vertical blur and process the horizontal blur from riFlatFile to cfablur without using a temporary buffer + cfatmp = cfablur; + } else { + cfatmp = tmpBuffer; + } + + if(boxW == 0) { + // if boxW == 0 we can skip the horizontal blur and process the vertical blur from riFlatFile to cfablur without using a temporary buffer + srcVertical = riFlatFile->data[0]; + } else { + srcVertical = cfatmp; + } - float (*cfatmp); - cfatmp = (float (*)) calloc (H * W, sizeof * cfatmp); -// const float hotdeadthresh = 0.5; #ifdef _OPENMP #pragma omp parallel #endif { + + if(boxW > 0) { + //box blur cfa image; box size = BS + //horizontal blur #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif - for (int i = 0; i < H; i++) { - int iprev, inext, jprev, jnext; - int p[5], temp, median; + for (int row = 0; row < H; row++) { + int len = boxW / 2 + 1; + cfatmp[row * W + 0] = riFlatFile->data[row][0] / len; + cfatmp[row * W + 1] = riFlatFile->data[row][1] / len; - if (i < 2) { - iprev = i + 2; - } else { - iprev = i - 2; - } - - if (i > H - 3) { - inext = i - 2; - } else { - inext = i + 2; - } - - for (int j = 0; j < W; j++) { - if (j < 2) { - jprev = j + 2; - } else { - jprev = j - 2; + for (int j = 2; j <= boxW; j += 2) { + cfatmp[row * W + 0] += riFlatFile->data[row][j] / len; + cfatmp[row * W + 1] += riFlatFile->data[row][j + 1] / len; } - if (j > W - 3) { - jnext = j - 2; - } else { - jnext = j + 2; + for (int col = 2; col <= boxW; col += 2) { + cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len + riFlatFile->data[row][boxW + col]) / (len + 1); + cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len + riFlatFile->data[row][boxW + col + 1]) / (len + 1); + len ++; } - //med3x3(riFlatFile->data[iprev][jprev], riFlatFile->data[iprev][j], riFlatFile->data[iprev][jnext], - // riFlatFile->data[i][jprev], riFlatFile->data[i][j], riFlatFile->data[i][jnext], - // riFlatFile->data[inext][jprev], riFlatFile->data[inext][j], riFlatFile->data[inext][jnext], cfatmp[i*W+j]); - med5(riFlatFile->data[iprev][j], riFlatFile->data[i][jprev], riFlatFile->data[i][j], - riFlatFile->data[i][jnext], riFlatFile->data[inext][j], median); - -// if (riFlatFile->data[i][j]>hotdeadthresh*median || median>hotdeadthresh*riFlatFile->data[i][j]) { - if (((int)riFlatFile->data[i][j] << 1) > median || (median << 1) > riFlatFile->data[i][j]) { - cfatmp[i * W + j] = median; - } else { - cfatmp[i * W + j] = riFlatFile->data[i][j]; + for (int col = boxW + 2; col < W - boxW; col++) { + cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (riFlatFile->data[row][boxW + col] - cfatmp[row * W + col - boxW - 2]) / len; } + for (int col = W - boxW; col < W; col += 2) { + cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len - cfatmp[row * W + col - boxW - 2]) / (len - 1); + + if (col + 1 < W) { + cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len - cfatmp[row * W + col - boxW - 1]) / (len - 1); + } + + len --; + } } } - //box blur cfa image; box size = BS - //horizontal blur -#ifdef _OPENMP - #pragma omp for -#endif - - for (int row = 0; row < H; row++) { - int len = boxW / 2 + 1; - cfatmp[row * W + 0] = cfatmp[row * W + 0] / len; - cfatmp[row * W + 1] = cfatmp[row * W + 1] / len; - - for (int j = 2; j <= boxW; j += 2) { - cfatmp[row * W + 0] += cfatmp[row * W + j] / len; - cfatmp[row * W + 1] += cfatmp[row * W + j + 1] / len; - } - - for (int col = 2; col <= boxW; col += 2) { - cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len + cfatmp[row * W + boxW + col]) / (len + 1); - cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len + cfatmp[row * W + boxW + col + 1]) / (len + 1); - len ++; - } - - for (int col = boxW + 2; col < W - boxW; col++) { - cfatmp[row * W + col] = cfatmp[row * W + col - 2] + (cfatmp[row * W + boxW + col] - cfatmp[row * W + col - boxW - 2]) / len; - } - - for (int col = W - boxW; col < W; col += 2) { - cfatmp[row * W + col] = (cfatmp[row * W + col - 2] * len - cfatmp[row * W + col - boxW - 2]) / (len - 1); - - if (col + 1 < W) { - cfatmp[row * W + col + 1] = (cfatmp[row * W + col - 1] * len - cfatmp[row * W + col - boxW - 1]) / (len - 1); - } - - len --; - } - } - - //vertical blur + if(boxH > 0) { + //vertical blur #ifdef __SSE2__ - vfloat leninitv = F2V(boxH / 2 + 1); - vfloat onev = F2V( 1.0f ); - vfloat temp1v, temp2v, lenv, lenp1v, lenm1v; - int row; + vfloat leninitv = F2V(boxH / 2 + 1); + vfloat onev = F2V( 1.0f ); + vfloat temp1v, temp2v, temp3v, temp4v, lenv, lenp1v, lenm1v; + int row; #ifdef _OPENMP - #pragma omp for + #pragma omp for nowait #endif - for (int col = 0; col < W - 3; col += 4) { - lenv = leninitv; - temp1v = LVFU(cfatmp[0 * W + col]) / lenv; - temp2v = LVFU(cfatmp[1 * W + col]) / lenv; + for (int col = 0; col < W - 7; col += 8) { + lenv = leninitv; + temp1v = LVFU(srcVertical[0 * W + col]) / lenv; + temp2v = LVFU(srcVertical[1 * W + col]) / lenv; + temp3v = LVFU(srcVertical[0 * W + col + 4]) / lenv; + temp4v = LVFU(srcVertical[1 * W + col + 4]) / lenv; - for (int i = 2; i < boxH + 2; i += 2) { - temp1v += LVFU(cfatmp[i * W + col]) / lenv; - temp2v += LVFU(cfatmp[(i + 1) * W + col]) / lenv; - } - - STVFU(cfablur[0 * W + col], temp1v); - STVFU(cfablur[1 * W + col], temp2v); - - for (row = 2; row < boxH + 2; row += 2) { - lenp1v = lenv + onev; - temp1v = (temp1v * lenv + LVFU(cfatmp[(row + boxH) * W + col])) / lenp1v; - temp2v = (temp2v * lenv + LVFU(cfatmp[(row + boxH + 1) * W + col])) / lenp1v; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - lenv = lenp1v; - } - - for (; row < H - boxH - 1; row += 2) { - temp1v = temp1v + (LVFU(cfatmp[(row + boxH) * W + col]) - LVFU(cfatmp[(row - boxH - 2) * W + col])) / lenv; - temp2v = temp2v + (LVFU(cfatmp[(row + 1 + boxH) * W + col]) - LVFU(cfatmp[(row + 1 - boxH - 2) * W + col])) / lenv; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - } - - for(; row < H - boxH; row++) { - temp1v = temp1v + (LVFU(cfatmp[(row + boxH) * W + col]) - LVFU(cfatmp[(row - boxH - 2) * W + col])) / lenv; - STVFU(cfablur[row * W + col], temp1v); - vfloat swapv = temp1v; - temp1v = temp2v; - temp2v = swapv; - - } - - for (; row < H - 1; row += 2) { - lenm1v = lenv - onev; - temp1v = (temp1v * lenv - LVFU(cfatmp[(row - boxH - 2) * W + col])) / lenm1v; - temp2v = (temp2v * lenv - LVFU(cfatmp[(row - boxH - 1) * W + col])) / lenm1v; - STVFU(cfablur[row * W + col], temp1v); - STVFU(cfablur[(row + 1)*W + col], temp2v); - lenv = lenm1v; - } - - for(; row < H; row++) { - lenm1v = lenv - onev; - temp1v = (temp1v * lenv - LVFU(cfatmp[(row - boxH - 2) * W + col])) / lenm1v; - STVFU(cfablur[(row)*W + col], temp1v); - } - - } - - for (int col = W - (W % 4); col < W; col++) { - int len = boxH / 2 + 1; - cfablur[0 * W + col] = cfatmp[0 * W + col] / len; - cfablur[1 * W + col] = cfatmp[1 * W + col] / len; - - for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += cfatmp[i * W + col] / len; - cfablur[1 * W + col] += cfatmp[(i + 1) * W + col] / len; - } - - for (int row = 2; row < boxH + 2; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + cfatmp[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + cfatmp[(row + boxH + 1) * W + col]) / (len + 1); - len ++; - } - - for (int row = boxH + 2; row < H - boxH; row++) { - cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (cfatmp[(row + boxH) * W + col] - cfatmp[(row - boxH - 2) * W + col]) / len; - } - - for (int row = H - boxH; row < H; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - cfatmp[(row - boxH - 2) * W + col]) / (len - 1); - - if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - cfatmp[(row - boxH - 1) * W + col]) / (len - 1); + for (int i = 2; i < boxH + 2; i += 2) { + temp1v += LVFU(srcVertical[i * W + col]) / lenv; + temp2v += LVFU(srcVertical[(i + 1) * W + col]) / lenv; + temp3v += LVFU(srcVertical[i * W + col + 4]) / lenv; + temp4v += LVFU(srcVertical[(i + 1) * W + col + 4]) / lenv; + } + + STVFU(cfablur[0 * W + col], temp1v); + STVFU(cfablur[1 * W + col], temp2v); + STVFU(cfablur[0 * W + col + 4], temp3v); + STVFU(cfablur[1 * W + col + 4], temp4v); + + for (row = 2; row < boxH + 2; row += 2) { + lenp1v = lenv + onev; + temp1v = (temp1v * lenv + LVFU(srcVertical[(row + boxH) * W + col])) / lenp1v; + temp2v = (temp2v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col])) / lenp1v; + temp3v = (temp3v * lenv + LVFU(srcVertical[(row + boxH) * W + col + 4])) / lenp1v; + temp4v = (temp4v * lenv + LVFU(srcVertical[(row + boxH + 1) * W + col + 4])) / lenp1v; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + lenv = lenp1v; + } + + for (; row < H - boxH - 1; row += 2) { + temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; + temp2v = temp2v + (LVFU(srcVertical[(row + 1 + boxH) * W + col]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col])) / lenv; + temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; + temp4v = temp4v + (LVFU(srcVertical[(row + 1 + boxH) * W + col + 4]) - LVFU(srcVertical[(row + 1 - boxH - 2) * W + col + 4])) / lenv; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + } + + for(; row < H - boxH; row++) { + temp1v = temp1v + (LVFU(srcVertical[(row + boxH) * W + col]) - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenv; + temp3v = temp3v + (LVFU(srcVertical[(row + boxH) * W + col + 4]) - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenv; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[row * W + col + 4], temp3v); + vfloat swapv = temp1v; + temp1v = temp2v; + temp2v = swapv; + swapv = temp3v; + temp3v = temp4v; + temp4v = swapv; + } + + for (; row < H - 1; row += 2) { + lenm1v = lenv - onev; + temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; + temp2v = (temp2v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col])) / lenm1v; + temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; + temp4v = (temp4v * lenv - LVFU(srcVertical[(row - boxH - 1) * W + col + 4])) / lenm1v; + STVFU(cfablur[row * W + col], temp1v); + STVFU(cfablur[(row + 1)*W + col], temp2v); + STVFU(cfablur[row * W + col + 4], temp3v); + STVFU(cfablur[(row + 1)*W + col + 4], temp4v); + lenv = lenm1v; + } + + for(; row < H; row++) { + lenm1v = lenv - onev; + temp1v = (temp1v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col])) / lenm1v; + temp3v = (temp3v * lenv - LVFU(srcVertical[(row - boxH - 2) * W + col + 4])) / lenm1v; + STVFU(cfablur[(row)*W + col], temp1v); + STVFU(cfablur[(row)*W + col + 4], temp3v); } - len --; } - } + + #pragma omp single + + for (int col = W - (W % 8); col < W; col++) { + int len = boxH / 2 + 1; + cfablur[0 * W + col] = srcVertical[0 * W + col] / len; + cfablur[1 * W + col] = srcVertical[1 * W + col] / len; + + for (int i = 2; i < boxH + 2; i += 2) { + cfablur[0 * W + col] += srcVertical[i * W + col] / len; + cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; + } + + for (int row = 2; row < boxH + 2; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + len ++; + } + + for (int row = boxH + 2; row < H - boxH; row++) { + cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; + } + + for (int row = H - boxH; row < H; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); + + if (row + 1 < H) { + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + } + + len --; + } + } #else #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif - for (int col = 0; col < W; col++) { - int len = boxH / 2 + 1; - cfablur[0 * W + col] = cfatmp[0 * W + col] / len; - cfablur[1 * W + col] = cfatmp[1 * W + col] / len; + for (int col = 0; col < W; col++) { + int len = boxH / 2 + 1; + cfablur[0 * W + col] = srcVertical[0 * W + col] / len; + cfablur[1 * W + col] = srcVertical[1 * W + col] / len; - for (int i = 2; i < boxH + 2; i += 2) { - cfablur[0 * W + col] += cfatmp[i * W + col] / len; - cfablur[1 * W + col] += cfatmp[(i + 1) * W + col] / len; - } - - for (int row = 2; row < boxH + 2; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + cfatmp[(row + boxH) * W + col]) / (len + 1); - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + cfatmp[(row + boxH + 1) * W + col]) / (len + 1); - len ++; - } - - for (int row = boxH + 2; row < H - boxH; row++) { - cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (cfatmp[(row + boxH) * W + col] - cfatmp[(row - boxH - 2) * W + col]) / len; - } - - for (int row = H - boxH; row < H; row += 2) { - cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - cfatmp[(row - boxH - 2) * W + col]) / (len - 1); - - if (row + 1 < H) { - cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - cfatmp[(row - boxH - 1) * W + col]) / (len - 1); + for (int i = 2; i < boxH + 2; i += 2) { + cfablur[0 * W + col] += srcVertical[i * W + col] / len; + cfablur[1 * W + col] += srcVertical[(i + 1) * W + col] / len; } - len --; + for (int row = 2; row < boxH + 2; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len + srcVertical[(row + boxH) * W + col]) / (len + 1); + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len + srcVertical[(row + boxH + 1) * W + col]) / (len + 1); + len ++; + } + + for (int row = boxH + 2; row < H - boxH; row++) { + cfablur[row * W + col] = cfablur[(row - 2) * W + col] + (srcVertical[(row + boxH) * W + col] - srcVertical[(row - boxH - 2) * W + col]) / len; + } + + for (int row = H - boxH; row < H; row += 2) { + cfablur[row * W + col] = (cfablur[(row - 2) * W + col] * len - srcVertical[(row - boxH - 2) * W + col]) / (len - 1); + + if (row + 1 < H) { + cfablur[(row + 1)*W + col] = (cfablur[(row - 1) * W + col] * len - srcVertical[(row - boxH - 1) * W + col]) / (len - 1); + } + + len --; + } } - } #endif + } + } + + if(tmpBuffer) { + free (tmpBuffer); } - free (cfatmp); } @@ -3733,10 +3777,11 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam pre_mul[2] }; const DCPProfile::Matrix cam_matrix = {{ - {camMatrix[0][0], camMatrix[0][1], camMatrix[0][2]}, - {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, - {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} - }}; + {camMatrix[0][0], camMatrix[0][1], camMatrix[0][2]}, + {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, + {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} + } + }; dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, false, cmp.applyHueSatMap, false); return; } @@ -3844,32 +3889,32 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam lcmsMutex->lock (); switch (camera_icc_type) { - case CAMERA_ICC_TYPE_PHASE_ONE: - case CAMERA_ICC_TYPE_LEAF: { - // These profiles have a RGB to Lab cLUT, gives gamma 1.8 output, and expects a "film-like" curve on input - 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, NULL, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); + case CAMERA_ICC_TYPE_PHASE_ONE: + case CAMERA_ICC_TYPE_LEAF: { + // These profiles have a RGB to Lab cLUT, gives gamma 1.8 output, and expects a "film-like" curve on input + 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, NULL, TYPE_Lab_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - leaf_prophoto_mat[i][j] = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + leaf_prophoto_mat[i][j] = 0; - for (int k = 0; k < 3; k++) { - leaf_prophoto_mat[i][j] += prophoto_xyz[i][k] * camMatrix[k][j]; + for (int k = 0; k < 3; k++) { + leaf_prophoto_mat[i][j] += prophoto_xyz[i][k] * camMatrix[k][j]; + } } } + + break; } - break; - } - - 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 - break; + 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 + break; } lcmsMutex->unlock (); @@ -3927,45 +3972,45 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam } switch (camera_icc_type) { - case CAMERA_ICC_TYPE_PHASE_ONE: - // Here we apply a curve similar to Capture One's "Film Standard" + gamma, the reason is that the LUTs embedded in the - // ICCs are designed to work on such input, and if you provide it with a different curve you don't get as good result. - // We will revert this curve after we've made the color transform. However when we revert the curve, we'll notice that - // highlight rendering suffers due to that the LUT transform don't expand well, therefore we do a less compressed - // conversion too and mix them, this gives us the highest quality and most flexible result. - hl_buffer.data[3 * w + 0] = pow_F(r, 1.0 / 1.8); - hl_buffer.data[3 * w + 1] = pow_F(g, 1.0 / 1.8); - hl_buffer.data[3 * w + 2] = pow_F(b, 1.0 / 1.8); - r = phaseOneIccCurveInv->getVal(r); - g = phaseOneIccCurveInv->getVal(g); - b = phaseOneIccCurveInv->getVal(b); - break; + case CAMERA_ICC_TYPE_PHASE_ONE: + // Here we apply a curve similar to Capture One's "Film Standard" + gamma, the reason is that the LUTs embedded in the + // ICCs are designed to work on such input, and if you provide it with a different curve you don't get as good result. + // We will revert this curve after we've made the color transform. However when we revert the curve, we'll notice that + // highlight rendering suffers due to that the LUT transform don't expand well, therefore we do a less compressed + // conversion too and mix them, this gives us the highest quality and most flexible result. + hl_buffer.data[3 * w + 0] = pow_F(r, 1.0 / 1.8); + hl_buffer.data[3 * w + 1] = pow_F(g, 1.0 / 1.8); + hl_buffer.data[3 * w + 2] = pow_F(b, 1.0 / 1.8); + r = phaseOneIccCurveInv->getVal(r); + g = phaseOneIccCurveInv->getVal(g); + b = phaseOneIccCurveInv->getVal(b); + break; - case CAMERA_ICC_TYPE_LEAF: { - // Leaf profiles expect that the camera native RGB has been converted to Prophoto RGB - float newr = leaf_prophoto_mat[0][0] * r + leaf_prophoto_mat[0][1] * g + leaf_prophoto_mat[0][2] * b; - float newg = leaf_prophoto_mat[1][0] * r + leaf_prophoto_mat[1][1] * g + leaf_prophoto_mat[1][2] * b; - float newb = leaf_prophoto_mat[2][0] * r + leaf_prophoto_mat[2][1] * g + leaf_prophoto_mat[2][2] * b; - hl_buffer.data[3 * w + 0] = pow_F(newr, 1.0 / 1.8); - hl_buffer.data[3 * w + 1] = pow_F(newg, 1.0 / 1.8); - hl_buffer.data[3 * w + 2] = pow_F(newb, 1.0 / 1.8); - r = phaseOneIccCurveInv->getVal(newr); - g = phaseOneIccCurveInv->getVal(newg); - b = phaseOneIccCurveInv->getVal(newb); - break; - } + case CAMERA_ICC_TYPE_LEAF: { + // Leaf profiles expect that the camera native RGB has been converted to Prophoto RGB + float newr = leaf_prophoto_mat[0][0] * r + leaf_prophoto_mat[0][1] * g + leaf_prophoto_mat[0][2] * b; + float newg = leaf_prophoto_mat[1][0] * r + leaf_prophoto_mat[1][1] * g + leaf_prophoto_mat[1][2] * b; + float newb = leaf_prophoto_mat[2][0] * r + leaf_prophoto_mat[2][1] * g + leaf_prophoto_mat[2][2] * b; + hl_buffer.data[3 * w + 0] = pow_F(newr, 1.0 / 1.8); + hl_buffer.data[3 * w + 1] = pow_F(newg, 1.0 / 1.8); + hl_buffer.data[3 * w + 2] = pow_F(newb, 1.0 / 1.8); + r = phaseOneIccCurveInv->getVal(newr); + g = phaseOneIccCurveInv->getVal(newg); + b = phaseOneIccCurveInv->getVal(newb); + break; + } - case CAMERA_ICC_TYPE_NIKON: - // gamma 0.5 - r = sqrtf(r); - g = sqrtf(g); - b = sqrtf(b); - break; + case CAMERA_ICC_TYPE_NIKON: + // gamma 0.5 + r = sqrtf(r); + g = sqrtf(g); + b = sqrtf(b); + break; - case CAMERA_ICC_TYPE_GENERIC: - default: - // do nothing - break; + case CAMERA_ICC_TYPE_GENERIC: + default: + // do nothing + break; } *(p++) = r; @@ -4008,37 +4053,37 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam // restore pre-processing and/or add post-processing for the various ICC types switch (camera_icc_type) { - default: - break; + default: + break; - case CAMERA_ICC_TYPE_PHASE_ONE: - case CAMERA_ICC_TYPE_LEAF: { - // note the 1/1.8 gamma, it's the gamma that the profile has applied, which we must revert before we can revert the curve - r = phaseOneIccCurve->getVal(pow_F(r, 1.0 / 1.8)); - g = phaseOneIccCurve->getVal(pow_F(g, 1.0 / 1.8)); - b = phaseOneIccCurve->getVal(pow_F(b, 1.0 / 1.8)); - const float mix = 0.25; // may seem a low number, but remember this is linear space, mixing starts 2 stops from clipping - const float maxc = max(r, g, b); + case CAMERA_ICC_TYPE_PHASE_ONE: + case CAMERA_ICC_TYPE_LEAF: { + // note the 1/1.8 gamma, it's the gamma that the profile has applied, which we must revert before we can revert the curve + r = phaseOneIccCurve->getVal(pow_F(r, 1.0 / 1.8)); + g = phaseOneIccCurve->getVal(pow_F(g, 1.0 / 1.8)); + b = phaseOneIccCurve->getVal(pow_F(b, 1.0 / 1.8)); + const float mix = 0.25; // may seem a low number, but remember this is linear space, mixing starts 2 stops from clipping + const float maxc = max(r, g, b); - if (maxc > mix) { - float fac = (maxc - mix) / (1.0 - mix); - fac = sqrtf(sqrtf(fac)); // gamma 0.25 to mix in highlight render relatively quick - r = (1.0 - fac) * r + fac * hr; - g = (1.0 - fac) * g + fac * hg; - b = (1.0 - fac) * b + fac * hb; + if (maxc > mix) { + float fac = (maxc - mix) / (1.0 - mix); + fac = sqrtf(sqrtf(fac)); // gamma 0.25 to mix in highlight render relatively quick + r = (1.0 - fac) * r + fac * hr; + g = (1.0 - fac) * g + fac * hg; + b = (1.0 - fac) * b + fac * hb; + } + + break; } - break; - } - - case CAMERA_ICC_TYPE_NIKON: { - const float lineFac = -0.4; - const float lineSum = 1.35; - r *= r * lineFac + lineSum; - g *= g * lineFac + lineSum; - b *= b * lineFac + lineSum; - break; - } + case CAMERA_ICC_TYPE_NIKON: { + const float lineFac = -0.4; + const float lineSum = 1.35; + r *= r * lineFac + lineSum; + g *= g * lineFac + lineSum; + b *= b * lineFac + lineSum; + break; + } } // restore highlight scaling if any @@ -4372,7 +4417,7 @@ void RawImageSource::hlRecovery (std::string method, float* red, float* green, f void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) { - BENCHFUN +// BENCHFUN histcompr = 3; histogram(65536 >> histcompr); @@ -4426,7 +4471,7 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) // Histogram MUST be 256 in size; gamma is applied, blackpoint and gain also void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) { - BENCHFUN +// BENCHFUN histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear(); @@ -4590,7 +4635,7 @@ void RawImageSource::getRowStartEnd (int x, int &start, int &end) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void RawImageSource::getAutoWBMultipliers (double &rm, double &gm, double &bm) { - BENCHFUN +// BENCHFUN constexpr double clipHigh = 64000.0; if (ri->get_colors() == 1) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 2af26c702..c9e593e23 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -134,7 +134,7 @@ public: void processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]); void copyOriginalPixels(const RAWParams &raw, RawImage *ri, RawImage *riDark, RawImage *riFlatFile ); - void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW ); + void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw); // raw for cblack void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw); From 97dae796c6b4e65ddbc4ceb1d387cc9a5303b96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 12 Jun 2016 12:07:15 +0200 Subject: [PATCH 100/232] Additional cleanups for `dcp.*` (#3343) --- rtengine/dcp.cc | 367 ++++++++++++++++++----------------------- rtengine/dcp.h | 8 +- rtengine/iccmatrices.h | 202 +++++++++++++++-------- 3 files changed, 295 insertions(+), 282 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 02cc8f0f4..f02ba8aaa 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ +#include #include #include "dcp.h" @@ -36,104 +37,92 @@ namespace // This sRGB gamma is taken from DNG reference code, with the added linear extension past 1.0, as we run clipless here -void invert3x3(const DCPProfile::Matrix& a, DCPProfile::Matrix& b) +DCPProfile::Matrix invert3x3(const DCPProfile::Matrix& a) { - const double& a00 = a[0][0]; - const double& a01 = a[0][1]; - const double& a02 = a[0][2]; - const double& a10 = a[1][0]; - const double& a11 = a[1][1]; - const double& a12 = a[1][2]; - const double& a20 = a[2][0]; - const double& a21 = a[2][1]; - const double& a22 = a[2][2]; + const double res00 = a[1][1] * a[2][2] - a[2][1] * a[1][2]; + const double res10 = a[2][0] * a[1][2] - a[1][0] * a[2][2]; + const double res20 = a[1][0] * a[2][1] - a[2][0] * a[1][1]; - double temp[3][3]; + const double det = a[0][0] * res00 + a[0][1] * res10 + a[0][2] * res20; - temp[0][0] = a11 * a22 - a21 * a12; - temp[0][1] = a21 * a02 - a01 * a22; - temp[0][2] = a01 * a12 - a11 * a02; - temp[1][0] = a20 * a12 - a10 * a22; - temp[1][1] = a00 * a22 - a20 * a02; - temp[1][2] = a10 * a02 - a00 * a12; - temp[2][0] = a10 * a21 - a20 * a11; - temp[2][1] = a20 * a01 - a00 * a21; - temp[2][2] = a00 * a11 - a10 * a01; - - const double det = a00 * temp[0][0] + a01 * temp[1][0] + a02 * temp[2][0]; - - if (fabs(det) < 1.0e-10) { - abort(); // Can't be inverted, we shouldn't be dealing with such matrices + if (std::fabs(det) < 1.0e-10) { + std::cerr << "DCP matrix cannot be inverted! Expect weird output." << std::endl; + return a; } - for (int j = 0; j < 3; ++j) { - for (int k = 0; k < 3; ++k) { - b[j][k] = temp[j][k] / det; - } - } + DCPProfile::Matrix res; + + res[0][0] = res00 / det; + res[0][1] = (a[2][1] * a[0][2] - a[0][1] * a[2][2]) / det; + res[0][2] = (a[0][1] * a[1][2] - a[1][1] * a[0][2]) / det; + res[1][0] = res10 / det; + res[1][1] = (a[0][0] * a[2][2] - a[2][0] * a[0][2]) / det; + res[1][2] = (a[1][0] * a[0][2] - a[0][0] * a[1][2]) / det; + res[2][0] = res20 / det; + res[2][1] = (a[2][0] * a[0][1] - a[0][0] * a[2][1]) / det; + res[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) / det; + + return res; } -void multiply3x3(const DCPProfile::Matrix& a, const DCPProfile::Matrix& b, DCPProfile::Matrix& c) +DCPProfile::Matrix multiply3x3(const DCPProfile::Matrix& a, const DCPProfile::Matrix& b) { - // Use temp to support having output same as input - DCPProfile::Matrix m; + DCPProfile::Matrix res; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - m[i][j] = 0; + res[i][j] = 0; for (int k = 0; k < 3; ++k) { - m[i][j] += a[i][k] * b[k][j]; + res[i][j] += a[i][k] * b[k][j]; } } } - c = m; + return res; } -void multiply3x3_v3(const DCPProfile::Matrix& a, const DCPProfile::Triple& b, DCPProfile::Triple& c) +DCPProfile::Triple multiply3x3_v3(const DCPProfile::Matrix& a, const DCPProfile::Triple& b) { - // Use temp to support having output same as input - DCPProfile::Triple m = {}; + DCPProfile::Triple res = {}; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - m[i] += a[i][j] * b[j]; + res[i] += a[i][j] * b[j]; } } - c = m; + return res; } -void mix3x3(const DCPProfile::Matrix& a, double mul_a, const DCPProfile::Matrix& b, double mul_b, DCPProfile::Matrix& c) +DCPProfile::Matrix mix3x3(const DCPProfile::Matrix& a, double mul_a, const DCPProfile::Matrix& b, double mul_b) { - DCPProfile::Matrix m; + DCPProfile::Matrix res; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - m[i][j] = a[i][j] * mul_a + b[i][j] * mul_b; + res[i][j] = a[i][j] * mul_a + b[i][j] * mul_b; } } - c = m; + return res; } -void mapWhiteMatrix(const DCPProfile::Triple& white1, const DCPProfile::Triple& white2, DCPProfile::Matrix& b) +DCPProfile::Matrix mapWhiteMatrix(const DCPProfile::Triple& white1, const DCPProfile::Triple& white2) { // Code adapted from dng_color_spec::MapWhiteMatrix // Use the linearized Bradford adaptation matrix - const DCPProfile::Matrix mb = {{ + const DCPProfile::Matrix mb = { + { { 0.8951, 0.2664, -0.1614 }, { -0.7502, 1.7135, 0.0367 }, { 0.0389, -0.0685, 1.0296 } } }; - DCPProfile::Triple w1; - multiply3x3_v3(mb, white1, w1); - DCPProfile::Triple w2; - multiply3x3_v3(mb, white2, w2); + DCPProfile::Triple w1 = multiply3x3_v3(mb, white1); + DCPProfile::Triple w2 = multiply3x3_v3(mb, white2); // Negative white coordinates are kind of meaningless. w1[0] = std::max(w1[0], 0.0); @@ -149,44 +138,46 @@ void mapWhiteMatrix(const DCPProfile::Triple& white1, const DCPProfile::Triple& a[1][1] = std::max(0.1, std::min(w1[1] > 0.0 ? w2[1] / w1[1] : 10.0, 10.0)); a[2][2] = std::max(0.1, std::min(w1[2] > 0.0 ? w2[2] / w1[2] : 10.0, 10.0)); - DCPProfile::Matrix temp; - invert3x3(mb, temp); - multiply3x3(temp, a, temp); - multiply3x3(temp, mb, b); + return multiply3x3(multiply3x3(invert3x3(mb), a), mb); } -void xyzToXy(const DCPProfile::Triple& xyz, double xy[2]) +std::array xyzToXy(const DCPProfile::Triple& xyz) { const double total = xyz[0] + xyz[1] + xyz[2]; - if (total > 0.0) { - xy[0] = xyz[0] / total; - xy[1] = xyz[1] / total; - } else { - xy[0] = 0.3457; - xy[1] = 0.3585; - } + return + total > 0.0 + ? std::array{ + xyz[0] / total, + xyz[1] / total + } + : std::array{ + 0.3457, + 0.3585 + }; } -void xyToXyz(const double xy[2], DCPProfile::Triple& xyz) +DCPProfile::Triple xyToXyz(std::array xy) { - double temp[2] = {xy[0], xy[1]}; - // Restrict xy coord to someplace inside the range of real xy coordinates. // This prevents math from doing strange things when users specify // extreme temperature/tint coordinates. - temp[0] = std::max(0.000001, std::min(temp[0], 0.999999)); - temp[1] = std::max(0.000001, std::min(temp[1], 0.999999)); + xy[0] = std::max(0.000001, std::min(xy[0], 0.999999)); + xy[1] = std::max(0.000001, std::min(xy[1], 0.999999)); - if (temp[0] + temp[1] > 0.999999) { - double scale = 0.999999 / (temp[0] + temp[1]); - temp[0] *= scale; - temp[1] *= scale; + const double sum = xy[0] + xy[1]; + + if (sum > 0.999999) { + const double scale = 0.999999 / sum; + xy[0] *= scale; + xy[1] *= scale; } - xyz[0] = temp[0] / temp[1]; - xyz[1] = 1.0; - xyz[2] = (1.0 - temp[0] - temp[1]) / temp[1]; + return { + xy[0] / xy[1], + 1.0, + (1.0 - xy[0] - xy[1]) / xy[1] + }; } double calibrationIlluminantToTemperature(int light) @@ -277,7 +268,7 @@ double calibrationIlluminantToTemperature(int light) } } -void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) +double xyCoordToTemperature(const std::array& white_xy) { struct Ruvt { double r; @@ -322,8 +313,7 @@ void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) constexpr double tint_scale = -3000.0; - double temperature = 0; - double computed_tint = 0; + double res = 0; // Convert to uv space. double u = 2.0 * white_xy[0] / (1.5 - white_xy[0] + 6.0 * white_xy[1]); @@ -367,7 +357,7 @@ void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) } // Interpolate the temperature. - temperature = 1.0e6 / (temp_table[index - 1].r * f + temp_table[index].r * (1.0 - f)); + res = 1.0e6 / (temp_table[index - 1].r * f + temp_table[index].r * (1.0 - f)); // Find delta from black body point to test coordinate. uu = u - (temp_table [index - 1].u * f + temp_table [index].u * (1.0 - f)); @@ -378,9 +368,6 @@ void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) len = sqrt (du * du + dv * dv); du /= len; dv /= len; - - // Find distance along slope. - computed_tint = (uu * du + vv * dv) * tint_scale; break; } @@ -390,13 +377,7 @@ void xyCoordToTemperature(const double white_xy[2], double* temp, double* tint) last_dv = dv; } - if (temp != nullptr) { - *temp = temperature; - } - - if (tint != nullptr) { - *tint = computed_tint; - } + return res; } } @@ -758,9 +739,8 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : tag = tagDir->getTag(toUnderlying(TagKey::COLOR_MATRIX_1)); if (!tag) { - // FIXME: better error handling - fprintf(stderr, "Bad DCP, no ColorMatrix1\n"); - abort(); + std::cerr << "DCP '" << filename << "' is missing 'ColorMatrix1'. Skipped." << std::endl; + return; } has_color_matrix_1 = true; @@ -963,6 +943,11 @@ DCPProfile::~DCPProfile() { } +DCPProfile::operator bool() const +{ + return has_color_matrix_1; +} + bool DCPProfile::getHasToneCurve() const { return has_tone_curve; @@ -1007,8 +992,7 @@ void DCPProfile::apply( BENCHFUN const TMatrix work_matrix = iccStore->workingSpaceInverseMatrix(working_space); - Matrix xyz_cam; // Camera RGB to XYZ D50 matrix - makeXyzCam(white_balance, pre_mul, cam_wb_matrix, preferred_illuminant, xyz_cam); + const Matrix xyz_cam = makeXyzCam(white_balance, pre_mul, cam_wb_matrix, preferred_illuminant); // Camera RGB to XYZ D50 matrix const std::vector delta_base = makeHueSatMap(white_balance, preferred_illuminant); @@ -1232,7 +1216,7 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int } } -void DCPProfile::findXyztoCamera(const double white_xy[2], int preferred_illuminant, Matrix& xyz_to_camera) const +DCPProfile::Matrix DCPProfile::findXyztoCamera(const std::array& white_xy, int preferred_illuminant) const { bool has_col_1 = has_color_matrix_1; bool has_col_2 = has_color_matrix_2; @@ -1248,17 +1232,14 @@ void DCPProfile::findXyztoCamera(const double white_xy[2], int preferred_illumin } // Mix if we have two matrices - double mix; - Matrix col; - if (has_col_1 && has_col_2) { - double wbtemp; /* Note: We're using DNG SDK reference code for XY to temperature translation to get the exact same mix as the reference code does. */ - xyCoordToTemperature(white_xy, &wbtemp, nullptr); + const double wbtemp = xyCoordToTemperature(white_xy); + double mix; if (wbtemp <= temperature_1) { mix = 1.0; } else if (wbtemp >= temperature_2) { @@ -1270,45 +1251,36 @@ void DCPProfile::findXyztoCamera(const double white_xy[2], int preferred_illumin // Interpolate if (mix >= 1.0) { - col = color_matrix_1; + return color_matrix_1; } else if (mix <= 0.0) { - col = color_matrix_2; + return color_matrix_2; } else { - mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, col); + return mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix); } } else if (has_col_1) { - col = color_matrix_1; + return color_matrix_1; } else { - col = color_matrix_2; + return color_matrix_2; } - - xyz_to_camera = col; } -void DCPProfile::neutralToXy(const Triple& neutral, int preferred_illuminant, double xy[2]) const +std::array DCPProfile::neutralToXy(const Triple& neutral, int preferred_illuminant) const { enum { MAX_PASSES = 30 }; - double last_xy[2] = {0.3457, 0.3585}; // D50 + std::array last_xy = {0.3457, 0.3585}; // D50 for (unsigned int pass = 0; pass < MAX_PASSES; ++pass) { - Matrix xyz_to_camera; - findXyztoCamera(last_xy, preferred_illuminant, xyz_to_camera); + const Matrix& xyz_to_camera = findXyztoCamera(last_xy, preferred_illuminant); + const Matrix& inv_m = invert3x3(xyz_to_camera); + const Triple& next_xyz = multiply3x3_v3(inv_m, neutral); - Matrix inv_m; - Triple next_xyz; - double next_xy[2]; - invert3x3(xyz_to_camera, inv_m); - multiply3x3_v3(inv_m, neutral, next_xyz); - xyzToXy(next_xyz, next_xy); + std::array next_xy = xyzToXy(next_xyz); - if (fabs(next_xy[0] - last_xy[0]) + - fabs(next_xy[1] - last_xy[1]) < 0.0000001) { - xy[0] = next_xy[0]; - xy[1] = next_xy[1]; - return; + if (std::fabs(next_xy[0] - last_xy[0]) + std::fabs(next_xy[1] - last_xy[1]) < 0.0000001) { + return next_xy; } // If we reach the limit without converging, we are most likely @@ -1319,15 +1291,13 @@ void DCPProfile::neutralToXy(const Triple& neutral, int preferred_illuminant, do next_xy[1] = (last_xy[1] + next_xy[1]) * 0.5; } - last_xy[0] = next_xy[0]; - last_xy[1] = next_xy[1]; + last_xy = next_xy; } - xy[0] = last_xy[0]; - xy[1] = last_xy[1]; + return last_xy; } -void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant, Matrix& xyz_cam) const +DCPProfile::Matrix DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant) const { // Code adapted from dng_color_spec::FindXYZtoCamera. // Note that we do not support monochrome or colorplanes > 3 (no reductionMatrix support), @@ -1340,32 +1310,24 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu double r, g, b; white_balance.getMultipliers(r, g, b); - // camWbMatrix == imatrices.xyz_cam - Matrix cam_xyz; - invert3x3(cam_wb_matrix, cam_xyz); - Matrix cam_rgb; - constexpr Matrix xyz_srgb = {{ + constexpr Matrix xyz_srgb = { + { {xyz_sRGB[0][0], xyz_sRGB[0][1], xyz_sRGB[0][2]}, {xyz_sRGB[1][0], xyz_sRGB[1][1], xyz_sRGB[1][2]}, {xyz_sRGB[2][0], xyz_sRGB[2][1], xyz_sRGB[2][2]} } }; - multiply3x3(cam_xyz, xyz_srgb, cam_rgb); + const Matrix cam_rgb = multiply3x3(invert3x3(cam_wb_matrix), xyz_srgb); double camwb_red = cam_rgb[0][0] * r + cam_rgb[0][1] * g + cam_rgb[0][2] * b; double camwb_green = cam_rgb[1][0] * r + cam_rgb[1][1] * g + cam_rgb[1][2] * b; double camwb_blue = cam_rgb[2][0] * r + cam_rgb[2][1] * g + cam_rgb[2][2] * b; neutral[0] = camwb_red / pre_mul[0]; neutral[1] = camwb_green / pre_mul[1]; neutral[2] = camwb_blue / pre_mul[2]; - double maxentry = 0; - for (int i = 0; i < 3; i++) { - if (neutral[i] > maxentry) { - maxentry = neutral[i]; - } - } + const double maxentry = std::max({neutral[0], neutral[1], neutral[2]}); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 3; ++i) { neutral[i] /= maxentry; } } @@ -1374,8 +1336,7 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu DCP ColorMatrix or ColorMatrices if dual-illuminant. This is the DNG reference code way to do it, which is a bit different from RT's own white balance model at the time of writing. When RT's white balance can make use of the DCP color matrices we could use that instead. */ - double white_xy[2]; - neutralToXy(neutral, preferred_illuminant, white_xy); + const std::array white_xy = neutralToXy(neutral, preferred_illuminant); bool has_fwd_1 = has_forward_matrix_1; bool has_fwd_2 = has_forward_matrix_2; @@ -1404,18 +1365,17 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu double mix = 1.0; if ((has_col_1 && has_col_2) || (has_fwd_1 && has_fwd_2)) { - double wbtemp; /* DNG ref way to convert XY to temperature, which affect matrix mixing. A different model here typically does not affect the result too much, ie it's probably not strictly necessary to use the DNG reference code here, but we do it for now. */ - xyCoordToTemperature(white_xy, &wbtemp, nullptr); + const double wbtemp = xyCoordToTemperature(white_xy); if (wbtemp <= temperature_1) { mix = 1.0; } else if (wbtemp >= temperature_2) { mix = 0.0; } else { - double invT = 1.0 / wbtemp; + const double& invT = 1.0 / wbtemp; mix = (invT - (1.0 / temperature_2)) / ((1.0 / temperature_1) - (1.0 / temperature_2)); } } @@ -1430,7 +1390,7 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu } else if (mix <= 0.0) { color_matrix = color_matrix_2; } else { - mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix, color_matrix); + color_matrix = mix3x3(color_matrix_1, mix, color_matrix_2, 1.0 - mix); } } else if (has_col_1) { color_matrix = color_matrix_1; @@ -1446,8 +1406,7 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu will show incorrect color. */ - Triple white_xyz; - xyToXyz(white_xy, white_xyz); + const Triple white_xyz = xyToXyz(white_xy); Matrix cam_xyz; @@ -1462,7 +1421,7 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu } else if (mix <= 0.0) { fwd = forward_matrix_2; } else { - mix3x3(forward_matrix_1, mix, forward_matrix_2, 1.0 - mix, fwd); + fwd = mix3x3(forward_matrix_1, mix, forward_matrix_2, 1.0 - mix); } } else if (has_fwd_1) { fwd = forward_matrix_1; @@ -1471,76 +1430,66 @@ void DCPProfile::makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mu } // adapted from dng_color_spec::SetWhiteXY - Triple camera_white; - multiply3x3_v3(color_matrix, white_xyz, camera_white); - - const Matrix white_diag = {{ + const Triple camera_white = multiply3x3_v3(color_matrix, white_xyz); + const Matrix white_diag = { + { {camera_white[0], 0, 0}, {0, camera_white[1], 0}, {0, 0, camera_white[2]} } }; - Matrix white_diag_inv; - invert3x3(white_diag, white_diag_inv); - Matrix xyz_cam; - multiply3x3(fwd, white_diag_inv, xyz_cam); - invert3x3(xyz_cam, cam_xyz); + cam_xyz = invert3x3(multiply3x3(fwd, invert3x3(white_diag))); } else { - Matrix white_matrix; - const Triple white_d50 = {0.3457, 0.3585, 0.2958}; // D50 - mapWhiteMatrix(white_d50, white_xyz, white_matrix); - multiply3x3(color_matrix, white_matrix, cam_xyz); + constexpr Triple white_d50 = {0.3457, 0.3585, 0.2958}; // D50 + + cam_xyz = multiply3x3(color_matrix, mapWhiteMatrix(white_d50, white_xyz)); } // Convert cam_xyz (XYZ D50 to CameraRGB, "PCS to Camera" in DNG terminology) to mXYZCAM - { - // This block can probably be simplified, seems unnecessary to pass through the sRGB matrix - // (probably dcraw legacy), it does no harm though as we don't clip anything. - int i, j, k; + // This block can probably be simplified, seems unnecessary to pass through the sRGB matrix + // (probably dcraw legacy), it does no harm though as we don't clip anything. + int i, j, k; - // Multiply out XYZ colorspace - double cam_rgb[3][3] = {}; + // Multiply out XYZ colorspace + double cam_rgb[3][3] = {}; - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { - cam_rgb[i][j] += cam_xyz[i][k] * xyz_sRGB[k][j]; - } - } - } - - // Normalize cam_rgb so that cam_rgb * (1,1,1) is (1,1,1,1) - double num; - - for (i = 0; i < 3; ++i) { - for (num = j = 0; j < 3; ++j) { - num += cam_rgb[i][j]; - } - - for (j = 0; j < 3; ++j) { - cam_rgb[i][j] /= num; - } - } - - double rgb_cam[3][3] = {}; - RawImageSource::inverse33(cam_rgb, rgb_cam); - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - xyz_cam[i][j] = 0; - } - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - for (k = 0; k < 3; ++k) { - xyz_cam[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; - } + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + cam_rgb[i][j] += cam_xyz[i][k] * xyz_sRGB[k][j]; } } } + + // Normalize cam_rgb so that cam_rgb * (1,1,1) is (1,1,1,1) + double num; + + for (i = 0; i < 3; ++i) { + for (num = j = 0; j < 3; ++j) { + num += cam_rgb[i][j]; + } + + for (j = 0; j < 3; ++j) { + cam_rgb[i][j] /= num; + } + } + + double rgb_cam[3][3] = {}; + RawImageSource::inverse33(cam_rgb, rgb_cam); + + Matrix res = {}; + + for (i = 0; i < 3; ++i) { + for (j = 0; j < 3; ++j) { + for (k = 0; k < 3; ++k) { + res[i][j] += xyz_sRGB[i][k] * rgb_cam[k][j]; + } + } + } + + return res; } std::vector DCPProfile::makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const @@ -1670,7 +1619,7 @@ void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector(s_scaled, table_info.pc.max_sat_index0), 0); const int v_index0 = std::max(std::min(v_scaled, table_info.pc.max_val_index0), 0); @@ -1823,10 +1772,14 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const DCPProfile* const res = new DCPProfile(filename); - // Add profile - profile_cache[filename] = res; + if (*res) { + // Add profile + profile_cache[filename] = res; + return res; + } - return res; + delete res; + return nullptr; } DCPProfile* DCPStore::getStdProfile(const Glib::ustring& cam_short_name) const diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 7db44950d..11e368b80 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -66,6 +66,8 @@ public: DCPProfile(const Glib::ustring& filename); ~DCPProfile(); + explicit operator bool() const; + bool getHasToneCurve() const; bool getHasLookTable() const; bool getHasHueSatMap() const; @@ -112,9 +114,9 @@ private: } pc; }; - void findXyztoCamera(const double white_xy[2], int preferred_illuminant, Matrix& xyz_to_camera) const; - void neutralToXy(const Triple& neutral, int preferred_illuminant, double xy[2]) const; - void makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant, Matrix& xyz_cam) const; + Matrix findXyztoCamera(const std::array& white_xy, int preferred_illuminant) const; + std::array neutralToXy(const Triple& neutral, int preferred_illuminant) const; + Matrix makeXyzCam(const ColorTemp& white_balance, const Triple& pre_mul, const Matrix& cam_wb_matrix, int preferred_illuminant) const; std::vector makeHueSatMap(const ColorTemp& white_balance, int preferred_illuminant) const; void hsdApply(const HsdTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const; diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index 292f45612..a6fd8d9e6 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -20,184 +20,242 @@ #define _ICCMATRICES_ // Bradford transform between illuminants -const double d65_d50[3][3] = {{0.9555766, -0.0230393, 0.0631636}, +constexpr double d65_d50[3][3] = { + {0.9555766, -0.0230393, 0.0631636}, { -0.0282895, 1.0099416, 0.0210077}, {0.0122982, -0.0204830, 1.3299098} }; -const double d50_d65[3][3] = {{ 1.0478112, 0.0228866, -0.0501270}, +constexpr double d50_d65[3][3] = { + { 1.0478112, 0.0228866, -0.0501270}, {0.0295424, 0.9904844, -0.0170491}, { -0.0092345, 0.0150436, 0.7521316} }; // Color space conversion to/from XYZ; color spaces adapted to D65 -const double xyz_sRGBd65[3][3] = {{0.4124564, 0.3575761, 0.1804375}, +constexpr double xyz_sRGBd65[3][3] = { + {0.4124564, 0.3575761, 0.1804375}, {0.2126729, 0.7151522, 0.0721750}, // WARNING: the summ of this line is > 1.0 {0.0193339, 0.1191920, 0.9503041} }; -const double sRGBd65_xyz[3][3] = {{ 3.2404542, -1.5371385, -0.4985314}, +constexpr double sRGBd65_xyz[3][3] = { + { 3.2404542, -1.5371385, -0.4985314}, { -0.9692660, 1.8760108, 0.0415560}, {0.0556434, -0.2040259, 1.0572252} }; //%%%%%%%%%%%%%%%%%%%%%%%% // TEST using Gabor's matrices -/*const double xyz_sRGB[3][3] = {{0.435859, 0.385336, 0.143023}, +/*constexpr double xyz_sRGB[3][3] = { + {0.435859, 0.385336, 0.143023}, {0.222385, 0.717021, 0.0605936 }, {0.0139162, 0.0971389, 0.713817}}; -const double sRGB_xyz[3][3] = {{3.13593293538656, -1.61878246026431, -0.490913888760734}, +constexpr double sRGB_xyz[3][3] = { + {3.13593293538656, -1.61878246026431, -0.490913888760734}, {-0.978702373022194, 1.91609508555177, 0.0334453372795315}, {0.0720490013929888, -0.22919049060526, 1.40593851447263}};*/ //%%%%%%%%%%%%%%%%%%%%%%%% // Color space conversion to/from XYZ; color spaces adapted to D50 using Bradford transform -const double xyz_sRGB[3][3] = {{0.4360747, 0.3850649, 0.1430804}, +constexpr double xyz_sRGB[3][3] = { + {0.4360747, 0.3850649, 0.1430804}, {0.2225045, 0.7168786, 0.0606169}, {0.0139322, 0.0971045, 0.7141733} }; -const double sRGB_xyz[3][3] = {{3.1338561, -1.6168667, -0.4906146}, +constexpr double sRGB_xyz[3][3] = { + {3.1338561, -1.6168667, -0.4906146}, { -0.9787684, 1.9161415, 0.0334540}, {0.0719453, -0.2289914, 1.4052427} }; -const double xyz_adobe[3][3] = {{0.6097559, 0.2052401, 0.1492240}, +constexpr double xyz_adobe[3][3] = { + {0.6097559, 0.2052401, 0.1492240}, {0.3111242, 0.6256560, 0.0632197}, {0.0194811, 0.0608902, 0.7448387} }; -const double adobe_xyz[3][3] = {{1.9624274, -0.6105343, -0.3413404}, +constexpr double adobe_xyz[3][3] = { + {1.9624274, -0.6105343, -0.3413404}, { -0.9787684, 1.9161415, 0.0334540}, {0.0286869, -0.1406752, 1.3487655} }; -const double xyz_prophoto[3][3] = {{0.7976749, 0.1351917, 0.0313534}, +constexpr double xyz_prophoto[3][3] = { + {0.7976749, 0.1351917, 0.0313534}, {0.2880402, 0.7118741, 0.0000857}, {0.0000000, 0.0000000, 0.8252100} }; -const double prophoto_xyz[3][3] = {{1.3459433, -0.2556075, -0.0511118}, +constexpr double prophoto_xyz[3][3] = { + {1.3459433, -0.2556075, -0.0511118}, { -0.5445989, 1.5081673, 0.0205351}, {0.0000000, 0.0000000, 1.2118128} }; /* -const double xyz_rec2020[3][3] = {{0.636958, 0.144617, 0.168881}, +constexpr double xyz_rec2020[3][3] = { + {0.636958, 0.144617, 0.168881}, {0.262700, 0.677998, 0.059302}, {0.0000000, 0.028073, 1.060985} }; -const double rec2020_xyz[3][3] = {{1.716651, -0.355671, -0.253366}, +constexpr double rec2020_xyz[3][3] = { + {1.716651, -0.355671, -0.253366}, { -0.666684, 1.616481, 0.015769}, {0.017640, -0.042771, 0.942103} }; */ -const double xyz_rec2020[3][3] = {{0.6734241, 0.1656411, 0.1251286}, +constexpr double xyz_rec2020[3][3] = { + {0.6734241, 0.1656411, 0.1251286}, {0.2790177, 0.6753402, 0.0456377}, { -0.0019300, 0.0299784, 0.7973330} }; -const double rec2020_xyz[3][3] = {{1.6473376, -0.3935675, -0.2359961}, +constexpr double rec2020_xyz[3][3] = { + {1.6473376, -0.3935675, -0.2359961}, { -0.6826036, 1.6475887, 0.0128190}, {0.0296524, -0.0628993, 1.2531279} }; -const double xyz_widegamut[3][3] = {{0.7161046, 0.1009296, 0.1471858}, +constexpr double xyz_widegamut[3][3] = { + {0.7161046, 0.1009296, 0.1471858}, {0.2581874, 0.7249378, 0.0168748}, {0.0000000, 0.0517813, 0.7734287} }; -const double widegamut_xyz[3][3] = {{ 1.4628067, -0.1840623, -0.2743606}, +constexpr double widegamut_xyz[3][3] = { + { 1.4628067, -0.1840623, -0.2743606}, { -0.5217933, 1.4472381, 0.0677227}, {0.0349342, -0.0968930, 1.2884099} }; -const double xyz_bruce[3][3] = {{0.4941816, 0.3204834, 0.1495550}, +constexpr double xyz_bruce[3][3] = { + {0.4941816, 0.3204834, 0.1495550}, {0.2521531, 0.6844869, 0.0633600}, {0.0157886, 0.0629304, 0.7464909} }; -const double bruce_xyz[3][3] = {{2.6502856, -1.2014485, -0.4289936}, +constexpr double bruce_xyz[3][3] = { + {2.6502856, -1.2014485, -0.4289936}, { -0.9787684, 1.9161415, 0.0334540}, {0.0264570, -0.1361227, 1.3458542} }; -const double xyz_beta[3][3] = {{0.6712537, 0.1745834, 0.1183829}, +constexpr double xyz_beta[3][3] = { + {0.6712537, 0.1745834, 0.1183829}, {0.3032726, 0.6637861, 0.0329413}, {0.0000000, 0.0407010, 0.7845090} }; -const double beta_xyz[3][3] = {{1.6832270, -0.4282363, -0.2360185}, +constexpr double beta_xyz[3][3] = { + {1.6832270, -0.4282363, -0.2360185}, { -0.7710229, 1.7065571, 0.0446900}, {0.0400013, -0.0885376, 1.2723640} }; -const double xyz_best[3][3] = {{0.6326696, 0.2045558, 0.1269946}, +constexpr double xyz_best[3][3] = { + {0.6326696, 0.2045558, 0.1269946}, {0.2284569, 0.7373523, 0.0341908}, {0.0000000, 0.0095142, 0.8156958} }; -const double best_xyz[3][3] = {{1.7552599, -0.4836786, -0.2530000}, +constexpr double best_xyz[3][3] = { + {1.7552599, -0.4836786, -0.2530000}, { -0.5441336, 1.5068789, 0.0215528}, {0.0063467, -0.0175761, 1.2256959} }; -/*const double sRGB_d50[3][3] = {{0.4360520246092, 0.2224915978656, 0.0139291219896}, - {0.38508159282, 0.716886060114, 0.09709700166}, - {0.1430874138552, 0.0606214863936, 0.714185469944}}; +/* +constexpr double sRGB_d50[3][3] = { + {0.4360520246092, 0.2224915978656, 0.0139291219896}, + {0.38508159282, 0.716886060114, 0.09709700166}, + {0.1430874138552, 0.0606214863936, 0.714185469944} +}; -const double d50_sRGB[3][3] = {{3.13405134405167,-0.978762729953942, 0.0719425766617001}, - {-1.61702771153574,1.91614222810656, -0.228971178679309}, - {-0.49065220876631,0.0334496273068589, 1.40521830559074}};*/ +constexpr double d50_sRGB[3][3] = { + {3.13405134405167,-0.978762729953942, 0.0719425766617001}, + {-1.61702771153574,1.91614222810656, -0.228971178679309}, + {-0.49065220876631,0.0334496273068589, 1.40521830559074} +}; +*/ /* // Gabor's matrices -const double sRGB_d50[3][3] = {{0.435859, 0.222385, 0.0139162}, - {0.385336, 0.717021, 0.0971389}, - {0.143023, 0.0605936, 0.713817}}; +constexpr double sRGB_d50[3][3] = { + {0.435859, 0.222385, 0.0139162}, + {0.385336, 0.717021, 0.0971389}, + {0.143023, 0.0605936, 0.713817} +}; -const double d50_sRGB[3][3] = {{3.13593293538656, -0.978702373022194, 0.0720490013929888}, - {-1.61878246026431, 1.91609508555177, -0.22919049060526}, - {-0.490913888760734, 0.0334453372795315, 1.40593851447263}}; +constexpr double d50_sRGB[3][3] = { + {3.13593293538656, -0.978702373022194, 0.0720490013929888}, + {-1.61878246026431, 1.91609508555177, -0.22919049060526}, + {-0.490913888760734, 0.0334453372795315, 1.40593851447263} +}; -const double adobe_d50[3][3] = {{0.6097395054954, 0.3111142944042, 0.0194773131652}, - {0.2052518325737, 0.6256618480686, 0.0608872306106}, - {0.1492308013399, 0.0632241329247, 0.744846530711}}; -const double d50_adobe[3][3] = {{1.9624959949628, -0.978762712052774, 0.0286904764959749}, - {-0.610587687828765,1.91614073756734, -0.140667763143042}, - {-0.34136021627766, 0.0334501217627688, 1.34875045144924}}; -const double prophoto_d50[3][3] = {{0.797675, 0.288040, 0.000000}, - {0.135192, 0.711874, 0.000000}, - {0.0313534,0.000086, 0.825210}}; -const double d50_prophoto[3][3] = {{1.34594335079331, -0.544598514291158, 0}, - {-0.255608118122657, 1.50816768465213, 0}, - {-0.0511117387775285, 0.0205345459181255, 1.21181275069376}}; -const double widegamut_d50[3][3] = {{0.716105, 0.258187, 0.000000}, - {0.100930, 0.724938, 0.0517813}, - {0.147186, 0.0168748, 0.773429}}; -const double d50_widegamut[3][3] = {{1.46280597103052, -0.521792197260068, 0.0349341417298585}, - {-0.184062984909417, 1.44723786022891, -0.0968930022172314}, - {-0.27436071519732, 0.0677226440980744,1.28840945122198}}; -const double bruce_d50[3][3] = {{0.4941607255908, 0.2521412970174, 0.0157852934504}, - {0.3204990468435, 0.684494580042, 0.062927176507}, - {0.1495612990809, 0.0633643619597, 0.746498914581}}; -const double d50_bruce[3][3] = {{2.65042308164152, -0.978762745761462, 0.0264609493245811}, - {-1.20155941925411, 1.9161402914007, -0.136115844662896}, - {-0.42902228923717, 0.0334495071197919, 1.34583900936772}}; -const double beta_d50[3][3] = {{0.671254, 0.303273, 0.000000}, - {0.174583, 0.663786, 0.040701}, - {0.118383, 0.0329413, 0.784509}}; -const double d50_beta[3][3] = {{1.68322591962771, -0.771023599950842, 0.0400013658754702}, - {-0.428235060337656, 1.70655704781303, -0.0885376438040078}, - {-0.236018598193503, 0.0446902191738489,1.27236406897742}}; -const double best_d50[3][3] = {{0.632670, 0.228457, 0.000000}, - {0.204556, 0.737352, 0.00951424}, - {0.126995, 0.0341908, 0.815696}}; -const double d50_best[3][3] = {{1.75525923340349, -0.544133953997468, 0.00634675299435191}, - {-0.483679025800866, 1.50687975713407, -0.017576175021718}, - {-0.253000840399762, 0.0215532098817316,1.22569552576991}}; +constexpr double adobe_d50[3][3] = { + {0.6097395054954, 0.3111142944042, 0.0194773131652}, + {0.2052518325737, 0.6256618480686, 0.0608872306106}, + {0.1492308013399, 0.0632241329247, 0.744846530711} +}; +constexpr double d50_adobe[3][3] = { + {1.9624959949628, -0.978762712052774, 0.0286904764959749}, + {-0.610587687828765,1.91614073756734, -0.140667763143042}, + {-0.34136021627766, 0.0334501217627688, 1.34875045144924} +}; +constexpr double prophoto_d50[3][3] = { + {0.797675, 0.288040, 0.000000}, + {0.135192, 0.711874, 0.000000}, + {0.0313534,0.000086, 0.825210} +}; +constexpr double d50_prophoto[3][3] = { + {1.34594335079331, -0.544598514291158, 0}, + {-0.255608118122657, 1.50816768465213, 0}, + {-0.0511117387775285, 0.0205345459181255, 1.21181275069376} +}; +constexpr double widegamut_d50[3][3] = { + {0.716105, 0.258187, 0.000000}, + {0.100930, 0.724938, 0.0517813}, + {0.147186, 0.0168748, 0.773429} +}; +constexpr double d50_widegamut[3][3] = { + {1.46280597103052, -0.521792197260068, 0.0349341417298585}, + {-0.184062984909417, 1.44723786022891, -0.0968930022172314}, + {-0.27436071519732, 0.0677226440980744,1.28840945122198} +}; +constexpr double bruce_d50[3][3] = { + {0.4941607255908, 0.2521412970174, 0.0157852934504}, + {0.3204990468435, 0.684494580042, 0.062927176507}, + {0.1495612990809, 0.0633643619597, 0.746498914581} +}; +constexpr double d50_bruce[3][3] = { + {2.65042308164152, -0.978762745761462, 0.0264609493245811}, + {-1.20155941925411, 1.9161402914007, -0.136115844662896}, + {-0.42902228923717, 0.0334495071197919, 1.34583900936772} +}; +constexpr double beta_d50[3][3] = { + {0.671254, 0.303273, 0.000000}, + {0.174583, 0.663786, 0.040701}, + {0.118383, 0.0329413, 0.784509} +}; +constexpr double d50_beta[3][3] = { + {1.68322591962771, -0.771023599950842, 0.0400013658754702}, + {-0.428235060337656, 1.70655704781303, -0.0885376438040078}, + {-0.236018598193503, 0.0446902191738489,1.27236406897742} +}; +constexpr double best_d50[3][3] = { + {0.632670, 0.228457, 0.000000}, + {0.204556, 0.737352, 0.00951424}, + {0.126995, 0.0341908, 0.815696} +}; +constexpr double d50_best[3][3] = { + {1.75525923340349, -0.544133953997468, 0.00634675299435191}, + {-0.483679025800866, 1.50687975713407, -0.017576175021718}, + {-0.253000840399762, 0.0215532098817316,1.22569552576991} +}; */ #endif From 4a1fb9ae4a559331b8e8710bc56bc1a923d473cf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Jun 2016 12:55:54 +0200 Subject: [PATCH 101/232] removed wrong comment --- rtengine/rawimagesource.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index c96456213..b6444dd83 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2685,7 +2685,6 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile cfaboxblur(riFlatFile, cfablur, 0, 2 * BS); } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) { //slightly more complicated blur if trying to correct both vertical and horizontal anomalies - //allocate buffer and pass it to cfaboxblur => saves two allocations/deallocations later in code cfaboxblur(riFlatFile, cfablur, BS, BS); //first do area blur to correct vignette } else { //(raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::area_ff]) cfaboxblur(riFlatFile, cfablur, BS, BS); From a32e13400b3e8130ca3a17abf9bf17af17995dc5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Jun 2016 13:32:08 +0200 Subject: [PATCH 102/232] Removed stopwatches --- rtengine/dcp.cc | 4 +--- rtengine/improcfun.cc | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index f02ba8aaa..a597fa8db 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -26,8 +26,6 @@ #include "rawimagesource.h" #include "improcfun.h" #include "rt_math.h" -#define BENCHMARK -#include "StopWatch.h" using namespace rtengine; using namespace rtexif; @@ -989,7 +987,7 @@ void DCPProfile::apply( bool apply_hue_sat_map ) const { - BENCHFUN + const TMatrix work_matrix = iccStore->workingSpaceInverseMatrix(working_space); const Matrix xyz_cam = makeXyzCam(white_balance, pre_mul, cam_wb_matrix, preferred_illuminant); // Camera RGB to XYZ D50 matrix diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d458bc351..8da4f689a 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" From f794cf684b18a9c2ca9b4ac350a10fd1ed37fc90 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Jun 2016 18:13:01 +0200 Subject: [PATCH 103/232] Speedup for cr2 decode --- rtengine/dcraw.cc | 55 ++++++++++++++++++++++++++++++++--------------- rtengine/myfile.h | 2 +- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 8ebc073d1..c83016769 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -10,6 +10,8 @@ /*RT*/#define LOCALTIME /*RT*/#define DJGPP +#include "StopWatch.h" +#include "opthelper.h" /* dcraw.c -- Dave Coffin's raw photo decoder Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net @@ -551,13 +553,13 @@ int CLASS canon_s2is() return 0; } -unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) +inline unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) { /*RT static unsigned bitbuf=0; */ /*RT static int vbits=0, reset=0; */ unsigned c; - if (nbits > 25) return 0; + if (UNLIKELY(nbits > 25)) return 0; if (nbits < 0) return bitbuf = vbits = reset = 0; if (nbits == 0 || vbits < 0) return 0; @@ -828,7 +830,7 @@ int CLASS ljpeg_start (struct jhead *jh, int info_only) FORC(4) jh->huff[2+c] = jh->huff[1]; FORC(jh->sraw) jh->huff[1+c] = jh->huff[0]; } - jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4); + jh->row = (ushort *) calloc (2 * jh->wide*jh->clrs, 4); merror (jh->row, "ljpeg_start()"); return zero_after_ff = 1; } @@ -840,7 +842,7 @@ void CLASS ljpeg_end (struct jhead *jh) free (jh->row); } -int CLASS ljpeg_diff (ushort *huff) +inline int CLASS ljpeg_diff (ushort *huff) { int len, diff; @@ -867,7 +869,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) } getbits(-1); } - FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1); + FORC3 row[c] = (jh->row + ((jrow & 1) + 1) * (jh->wide*jh->clrs*((jrow+c) & 1))); for (col=0; col < jh->wide; col++) FORC(jh->clrs) { diff = ljpeg_diff (jh->huff[c]); @@ -875,8 +877,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) pred = spred; else if (col) pred = row[0][-jh->clrs]; else pred = (jh->vpred[c] += diff) - diff; - if (jrow && col) switch (jh->psv) { - case 1: break; + if (jh->psv != 1 && jrow && col) switch (jh->psv) { case 2: pred = row[1][0]; break; case 3: pred = row[1][-jh->clrs]; break; case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break; @@ -885,7 +886,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) case 7: pred = (pred + row[1][0]) >> 1; break; default: pred = 0; } - if ((**row = pred + diff) >> jh->bits) derror(); + if (UNLIKELY((**row = pred + diff) >> jh->bits)) derror(); if (c <= jh->sraw) spred = **row; row[0]++; row[1]++; } @@ -894,22 +895,40 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) void CLASS lossless_jpeg_load_raw() { - int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0; +StopWatch Stop1("decode"); struct jhead jh; - ushort *rp; if (!ljpeg_start (&jh, 0)) return; - jwide = jh.wide * jh.clrs; + int jwide = jh.wide * jh.clrs; + ushort *rp[2]; + rp[0] = ljpeg_row (0, &jh); + + for (int jrow=0; jrow < jh.high; jrow++) { +#ifdef _OPENMP +#pragma omp parallel sections +#endif +{ +#ifdef _OPENMP + #pragma omp section +#endif + { + if(jrow < jh.high - 1) + rp[(jrow + 1)&1] = ljpeg_row (jrow + 1, &jh); + } +#ifdef _OPENMP + #pragma omp section +#endif + { + int row=0, col=0; - for (jrow=0; jrow < jh.high; jrow++) { - rp = ljpeg_row (jrow, &jh); if (load_flags & 1) row = jrow & 1 ? height-1-jrow/2 : jrow/2; - for (jcol=0; jcol < jwide; jcol++) { - val = curve[*rp++]; + for (int jcol=0; jcol < jwide; jcol++) { + int val = curve[*rp[jrow&1]++]; if (cr2_slice[0]) { - jidx = jrow*jwide + jcol; - i = jidx / (cr2_slice[1]*raw_height); + int jidx = jrow*jwide + jcol; + int i = jidx / (cr2_slice[1]*raw_height); + int j; if ((j = i >= cr2_slice[0])) i = cr2_slice[0]; jidx -= i * (cr2_slice[1]*raw_height); @@ -922,6 +941,8 @@ void CLASS lossless_jpeg_load_raw() if (++col >= raw_width) col = (row++,0); } + } +} } ljpeg_end (&jh); } diff --git a/rtengine/myfile.h b/rtengine/myfile.h index 9e9039a7a..771dd7b84 100644 --- a/rtengine/myfile.h +++ b/rtengine/myfile.h @@ -79,7 +79,7 @@ inline void fseek (IMFILE* f, int p, int how) inline int fgetc (IMFILE* f) { - if (f->pos < f->size) { + if (LIKELY(f->pos < f->size)) { if (f->plistener && ++f->progress_current >= f->progress_next) { imfile_update_progress(f); } From c11465e46a1f8dd1acf2bcf8b1dbc7544abffcbc Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Jun 2016 20:56:55 +0200 Subject: [PATCH 104/232] Fix segfault when Flatfield blur radius == 0 --- rtengine/rawimagesource.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b6444dd83..9da266610 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3042,10 +3042,17 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) { + + if(boxW == 0 && boxH == 0) { // nothing to blur + memcpy(cfablur, riFlatFile->data[0], W*H*sizeof(float)); + return; + } + float *tmpBuffer = nullptr; float *cfatmp = nullptr; float *srcVertical = nullptr; + if(boxH > 0 && boxW > 0) { // we need a temporary buffer if we have to blur both directions tmpBuffer = (float (*)) calloc (H * W, sizeof * tmpBuffer); @@ -3065,7 +3072,6 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur srcVertical = cfatmp; } - #ifdef _OPENMP #pragma omp parallel #endif From 5703eb5ebcffd51000fcc7d434bde883c0dd12a5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 12 Jun 2016 21:03:44 +0200 Subject: [PATCH 105/232] Fix some compiler warnings --- rtengine/rawimagesource.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9da266610..818d494ac 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2762,8 +2762,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } - int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; - int c4[2][2]; + unsigned int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; + unsigned int c4[2][2]; c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; c4[1][0] = c[1][0]; @@ -2892,8 +2892,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile cfaboxblur(riFlatFile, cfablur2, 2 * BS, 0); //now do vertical blur if(ri->getSensorType() == ST_BAYER) { - int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; - int c4[2][2]; + unsigned int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; + unsigned int c4[2][2]; c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; c4[1][0] = c[1][0]; From 2fa1ad138e56efe14d088755cd09dc10e9d99391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 14 Jun 2016 22:08:03 +0200 Subject: [PATCH 106/232] Start median rework (#3346) - Added basic algorithms to `rtengine/median.h` - Converted first occurrences --- rtengine/FTblockDN.cc | 14 +- rtengine/PF_correct_RT.cc | 11 +- rtengine/dirpyrLab_denoise.cc | 751 ---------------------------------- rtengine/improcfun.h | 15 - rtengine/ipretinex.cc | 24 +- rtengine/median.h | 144 +++++-- rtengine/minmax.h | 76 ---- rtengine/rawimagesource.cc | 17 +- rtengine/rt_math.h | 18 +- 9 files changed, 142 insertions(+), 928 deletions(-) delete mode 100644 rtengine/dirpyrLab_denoise.cc delete mode 100644 rtengine/minmax.h diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 71c65cfb0..9f74d9f2c 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -22,7 +22,7 @@ // //////////////////////////////////////////////////////////////// -#include +#include #include #include "../rtgui/threadutils.h" #include "rtengine.h" @@ -36,6 +36,7 @@ #include "sleef.c" #include "opthelper.h" #include "cplx_wavelet_dec.h" +#include "median.h" #ifdef _OPENMP #include @@ -48,6 +49,8 @@ #define epsilon 0.001f/(TS*TS) //tolerance +#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } + #define med2(a0,a1,a2,a3,a4,median) { \ pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; \ PIX_SORT(pp[0],pp[1]) ; PIX_SORT(pp[3],pp[4]) ; PIX_SORT(pp[0],pp[3]) ;\ @@ -292,7 +295,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } } else if(medianType == MED_3X3STRONG) { - float pp[9], temp; int j; for (j = 0; j < border; j++) { @@ -300,7 +302,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } for (; j < width - border; j++) { - med3(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1], medianOut[i][j]); + medianOut[i][j] = median(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1]); } for(; j < width; j++) { @@ -1859,7 +1861,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } else for (int j = 1; j < wid - 1; j++) { - med3(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), tm[i][j]); //3x3 + tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1)); //3x3 } } } else { @@ -1922,7 +1924,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } else for (int j = 1; j < wid - 1; j++) { - med3(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), tm[i][j]); + tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1)); } } } else { @@ -1987,7 +1989,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } else for (int j = 1; j < wid - 1; j++) { - med3(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), tm[i][j]); + tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1)); } } } else { diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index fce4a14c0..e64c750bb 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -31,6 +31,7 @@ #include "../rtgui/myflatcurve.h" #include "rt_math.h" #include "opthelper.h" +#include "median.h" #ifdef _OPENMP #include @@ -766,7 +767,6 @@ SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, d #pragma omp parallel { int ip, in, jp, jn; - float pp[9], temp; #pragma omp for nowait //nowait because next loop inside this parallel region is independent on this one for (int i = 0; i < height; i++) { @@ -795,7 +795,7 @@ SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, d jn = j + 2; } - med3(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn], tmaa[i][j]); + tmaa[i][j] = median(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn]); } } @@ -827,7 +827,7 @@ SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, d jn = j + 2; } - med3(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn], tmbb[i][j]); + tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn]); } } } @@ -1374,7 +1374,6 @@ SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, d #pragma omp parallel { int ip, in, jp, jn; - float pp[9], temp; #pragma omp for nowait //nowait because next loop inside this parallel region is independent on this one for (int i = 0; i < height; i++) { @@ -1403,7 +1402,7 @@ SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, d jn = j + 2; } - med3(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn], tmaa[i][j]); + tmaa[i][j] = median(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn]); } } @@ -1435,7 +1434,7 @@ SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, d jn = j + 2; } - med3(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn], tmbb[i][j]); + tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn], tmbb[i][j]); } } } diff --git a/rtengine/dirpyrLab_denoise.cc b/rtengine/dirpyrLab_denoise.cc deleted file mode 100644 index ee434d75f..000000000 --- a/rtengine/dirpyrLab_denoise.cc +++ /dev/null @@ -1,751 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - * - * � 2010 Emil Martinec - * - */ - -#include -#include -#include "curves.h" -#include "labimage.h" -#include "improcfun.h" -#include "array2D.h" -#include "rt_math.h" - -#ifdef _OPENMP -#include -#endif - -#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000) - -#define DIRWT_L(i1,j1,i,j) ( rangefn_L[(data_fine->L[i1][j1]-data_fine->L[i][j]+32768)] ) - -#define DIRWT_AB(i1,j1,i,j) ( rangefn_ab[(data_fine->a[i1][j1]-data_fine->a[i][j]+32768)] * \ -rangefn_ab[(data_fine->L[i1][j1]-data_fine->L[i][j]+32768)] * \ -rangefn_ab[(data_fine->b[i1][j1]-data_fine->b[i][j]+32768)] ) - -//#define NRWT_L(a) (nrwt_l[a] ) - -#define NRWT_AB (nrwt_ab[(hipass[1]+32768)] * nrwt_ab[(hipass[2]+32768)]) - - -#define med3(a,b,c) (a(b)) {temp=(a);(a)=(b);(b)=temp;} } - -#define med3x3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ -p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; p[5]=a5; p[6]=a6; p[7]=a7; p[8]=a8; \ -PIX_SORT(p[1],p[2]); PIX_SORT(p[4],p[5]); PIX_SORT(p[7],p[8]); \ -PIX_SORT(p[0],p[1]); PIX_SORT(p[3],p[4]); PIX_SORT(p[6],p[7]); \ -PIX_SORT(p[1],p[2]); PIX_SORT(p[4],p[5]); PIX_SORT(p[7],p[8]); \ -PIX_SORT(p[0],p[3]); PIX_SORT(p[5],p[8]); PIX_SORT(p[4],p[7]); \ -PIX_SORT(p[3],p[6]); PIX_SORT(p[1],p[4]); PIX_SORT(p[2],p[5]); \ -PIX_SORT(p[4],p[7]); PIX_SORT(p[4],p[2]); PIX_SORT(p[6],p[4]); \ -PIX_SORT(p[4],p[2]); median=p[4];} //a4 is the median - - -namespace rtengine -{ - -static const int maxlevel = 4; - -//sequence of scales -//static const int scales[8] = {1,2,4,8,16,32,64,128}; -//sequence of pitches -//static const int pitches[8] = {1,1,1,1,1,1,1,1}; - -//sequence of scales -//static const int scales[8] = {1,1,1,1,1,1,1,1}; -//sequence of pitches -//static const int pitches[8] = {2,2,2,2,2,2,2,2}; - -//sequence of scales -//static const int scales[8] = {1,1,2,2,4,4,8,8}; -//sequence of pitches -//static const int pitches[8] = {2,1,2,1,2,1,2,1}; - -//sequence of scales -static const int scales[8] = {1, 1, 2, 4, 8, 16, 32, 64}; -//sequence of pitches -static const int pitches[8] = {2, 1, 1, 1, 1, 1, 1, 1}; - -//pitch is spacing of subsampling -//scale is spacing of directional averaging weights -//example 1: no subsampling at any level -- pitch=1, scale=2^n -//example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level -//example 3: no subsampling at first level, subsampling by 2 thereafter -- -// pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter - - - - -void ImProcFunctions :: dirpyrLab_denoise(LabImage * src, LabImage * dst, const procparams::DirPyrDenoiseParams & dnparams ) -{ - float gam = dnparams.gamma / 3.0; - //float gam = 2.0;//min(3.0, 0.1*fabs(c[4])/3.0+0.001); - float gamthresh = 0.03; - float gamslope = exp(log((double)gamthresh) / gam) / gamthresh; - - LUTf gamcurve(65536, 0); - - //DiagonalCurve* lumacurve = new DiagonalCurve (dnparams.lumcurve, CURVES_MIN_POLY_POINTS); - //DiagonalCurve* chromacurve = new DiagonalCurve (dnparams.chromcurve, CURVES_MIN_POLY_POINTS); - //LUTf Lcurve(65536); - //LUTf abcurve(65536); - for (int i = 0; i < 65536; i++) { - int g = (int)(CurveFactory::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 65535.0); - gamcurve[i] = CLIP(g); - /*float val = (float)i/65535.0; - float Lval = (2*(lumacurve->getVal(val))); - float abval = (2*(chromacurve->getVal(val))); - - Lcurve[i] = SQR(Lval); - abcurve[i] = SQR(abval); - if (i % 1000 ==0) printf("%d Lmult=%f abmult=%f \n",i,Lcurve[i],abcurve[i]);*/ - } - - //delete lumacurve; - //delete chromacurve; - - - - //#pragma omp parallel for if (multiThread) - for (int i = 0; i < src->H; i++) { - for (int j = 0; j < src->W; j++) { - //src->L[i][j] = CurveFactory::flinterp(gamcurve,src->L[i][j]); - src->L[i][j] = gamcurve[src->L[i][j]]; - } - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - - LUTf rangefn_L(65536); - LUTf nrwt_l(65536); - - LUTf rangefn_ab(65536); - LUTf nrwt_ab(65536); - - //set up NR weight functions - - //gamma correction for chroma in shadows - float nrwtl_norm = ((CurveFactory::gamma((double)65535.0 / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) - - (CurveFactory::gamma((double)75535.0 / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0))); - - for (int i = 0; i < 65536; i++) { - nrwt_l[i] = ((CurveFactory::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) - - CurveFactory::gamma((double)(i + 10000) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) ) / nrwtl_norm; - //if (i % 100 ==0) printf("%d %f \n",i,nrwt_l[i]); - } - - float tonefactor = nrwt_l[32768]; - - float noise_L = 10.0 * dnparams.luma; - float noisevar_L = SQR(noise_L); - - float noise_ab = 100.0 * dnparams.chroma; - float noisevar_ab = SQR(noise_ab); - - - //set up range functions - for (int i = 0; i < 65536; i++) { - rangefn_L[i] = (( exp(-(double)fabs(i - 32768) * tonefactor / (1.0 + noise_L)) * (1.0 + noisevar_L) / ((double)(i - 32768) * (double)(i - 32768) + noisevar_L + 1.0))); - } - - for (int i = 0; i < 65536; i++) { - rangefn_ab[i] = (( exp(-(double)fabs(i - 32768) * tonefactor / (1.0 + 3 * noise_ab)) * (1.0 + noisevar_ab) / ((double)(i - 32768) * (double)(i - 32768) + noisevar_ab + 1.0))); - } - - - for (int i = 0; i < 65536; i++) { - nrwt_ab[i] = ((1.0 + abs(i - 32768) / (1.0 + 8 * noise_ab)) * exp(-(double)fabs(i - 32768) / (1.0 + 8 * noise_ab) ) ); - } - - - //for (int i=0; i<65536; i+=100) printf("%d %d \n",i,gamcurve[i]); - - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - - int level; - - LabImage * dirpyrLablo[maxlevel]; - int w = (int)((src->W - 1) / pitches[0]) + 1; - int h = (int)((src->H - 1) / pitches[0]) + 1; - dirpyrLablo[0] = new LabImage(w, h); - - for (level = 1; level < maxlevel; level++) { - w = (int)((w - 1) / pitches[level]) + 1; - h = (int)((h - 1) / pitches[level]) + 1; - dirpyrLablo[level] = new LabImage(w, h); - }; - - - ////////////////////////////////////////////////////////////////////////////// - - - // c[0] = luma = noise_L - // c[1] = chroma = noise_ab - // c[2] decrease of noise var with scale - // c[3] radius of domain blur at each level - // c[4] shadow smoothing - // c[5] edge preservation - - level = 0; - - int scale = scales[level]; - - int pitch = pitches[level]; - - //int thresh = 10 * c[8]; - //impulse_nr (src, src, m_w1, m_h1, thresh, noisevar); - - dirpyr(src, dirpyrLablo[0], 0, rangefn_L, rangefn_ab, pitch, scale, dnparams.luma, dnparams.chroma ); - - level = 1; - - while(level < maxlevel) { - scale = scales[level]; - pitch = pitches[level]; - - dirpyr(dirpyrLablo[level - 1], dirpyrLablo[level], level, rangefn_L, rangefn_ab, pitch, scale, dnparams.luma, dnparams.chroma ); - - level ++; - } - - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - - for(int level = maxlevel - 1; level > 0; level--) { - - int scale = scales[level]; - int pitch = pitches[level]; - idirpyr(dirpyrLablo[level], dirpyrLablo[level - 1], level, rangefn_L, nrwt_l, nrwt_ab, pitch, scale, dnparams.luma, dnparams.chroma/*, Lcurve, abcurve*/ ); - } - - - scale = scales[0]; - pitch = pitches[0]; - - // freeing as much memory as possible since the next call to idirpyr will need lots - for(int i = 1; i < maxlevel; i++) { - delete dirpyrLablo[i]; - } - - idirpyr(dirpyrLablo[0], dst, 0, rangefn_L, nrwt_l, nrwt_ab, pitch, scale, dnparams.luma, dnparams.chroma/*, Lcurve, abcurve*/ ); - - // freeing the last bunch of memory - delete dirpyrLablo[0]; - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - float igam = 1 / gam; - float igamthresh = gamthresh * gamslope; - float igamslope = 1 / gamslope; - - for (int i = 0; i < 65536; i++) { - gamcurve[i] = (CurveFactory::gamma((float)i / 65535.0, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0); - } - - - if (dnparams.luma > 0) { - for (int i = 0; i < dst->H; i++) - for (int j = 0; j < dst->W; j++) { - dst->L[i][j] = gamcurve[dst->L[i][j]]; - } - } else { - for (int i = 0; i < dst->H; i++) - for (int j = 0; j < dst->W; j++) { - dst->L[i][j] = gamcurve[src->L[i][j]]; - } - } - -} - -void ImProcFunctions::dirpyr(LabImage* data_fine, LabImage* data_coarse, int level, - LUTf & rangefn_L, LUTf & rangefn_ab, int pitch, int scale, - const int luma, const int chroma ) -{ - - //pitch is spacing of subsampling - //scale is spacing of directional averaging weights - //example 1: no subsampling at any level -- pitch=1, scale=2^n - //example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level - //example 3: no subsampling at first level, subsampling by 2 thereafter -- - // pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter - - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // calculate weights, compute directionally weighted average - - int width = data_fine->W; - int height = data_fine->H; - - //generate domain kernel - int halfwin = 3;//min(ceil(2*sig),3); - int scalewin = halfwin * scale; - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int i = 0; i < height; i += pitch ) { - int i1 = i / pitch; - - for(int j = 0, j1 = 0; j < width; j += pitch, j1++) { - float dirwt_l, dirwt_ab, norm_l, norm_ab; - //float lops,aops,bops; - float Lout, aout, bout; - norm_l = norm_ab = 0;//if we do want to include the input pixel in the sum - Lout = 0; - aout = 0; - bout = 0; - - for(int inbr = (i - scalewin); inbr <= (i + scalewin); inbr += scale) { - if (inbr < 0 || inbr > height - 1) { - continue; - } - - for (int jnbr = (j - scalewin); jnbr <= (j + scalewin); jnbr += scale) { - if (jnbr < 0 || jnbr > width - 1) { - continue; - } - - dirwt_l = DIRWT_L(inbr, jnbr, i, j); - dirwt_ab = DIRWT_AB(inbr, jnbr, i, j); - Lout += dirwt_l * data_fine->L[inbr][jnbr]; - aout += dirwt_ab * data_fine->a[inbr][jnbr]; - bout += dirwt_ab * data_fine->b[inbr][jnbr]; - norm_l += dirwt_l; - norm_ab += dirwt_ab; - } - } - - //lops = Lout/norm;//diagnostic - //aops = aout/normab;//diagnostic - //bops = bout/normab;//diagnostic - - data_coarse->L[i1][j1] = Lout / norm_l; //low pass filter - data_coarse->a[i1][j1] = aout / norm_ab; - data_coarse->b[i1][j1] = bout / norm_ab; - - - /*if (level<2 && i>0 && i0 && jL[i-1][j-1], data_fine->L[i-1][j], data_fine->L[i-1][j+1], \ - data_fine->L[i][j-1], data_fine->L[i][j], data_fine->L[i][j+1], \ - data_fine->L[i+1][j-1], data_fine->L[i+1][j], data_fine->L[i+1][j+1]); - //med3x3(data_fine->L[i-1][j-1], data_fine->L[i-1][j], data_fine->L[i-1][j+1], \ - data_fine->L[i][j-1], data_fine->L[i][j], data_fine->L[i][j+1], \ - data_fine->L[i+1][j-1], data_fine->L[i+1][j], data_fine->L[i+1][j+1],Lmed); - - data_coarse->L[i1][j1] = Lhmf; - }*/ - } - } - - - - -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void ImProcFunctions::idirpyr(LabImage* data_coarse, LabImage* data_fine, int level, LUTf &rangefn_L, LUTf & nrwt_l, LUTf & nrwt_ab, - int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/ ) -{ - - int width = data_fine->W; - int height = data_fine->H; - - array2D nrfactorL (width, height); - - //float eps = 0.0; - - // c[0] noise_L - // c[1] noise_ab (relative to noise_L) - // c[2] decrease of noise var with scale - // c[3] radius of domain blur at each level - // c[4] shadow smoothing - - float noisevar_L = 4 * SQR(25.0 * luma); - float noisevar_ab = 2 * SQR(100.0 * chroma); - float scalefactor = 1.0 / pow(2.0, (level + 1) * 2); //change the last 2 to 1 for longer tail of higher scale NR - - noisevar_L *= scalefactor; - - // for coarsest level, take non-subsampled lopass image and subtract from lopass_fine to generate hipass image - - // denoise hipass image, add back into lopass_fine to generate denoised image at fine scale - - // now iterate: - // (1) take denoised image at level n, expand and smooth using gradient weights from lopass image at level n-1 - // the result is the smoothed image at level n-1 - // (2) subtract smoothed image at level n-1 from lopass image at level n-1 to make hipass image at level n-1 - // (3) denoise the hipass image at level n-1 - // (4) add the denoised image at level n-1 to the smoothed image at level n-1 to make the denoised image at level n-1 - - // note that the coarsest level amounts to skipping step (1) and doing (2,3,4). - // in other words, skip step one if pitch=1 - - // step (1) - - if (pitch == 1) { - - // step (1-2-3-4) - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) - { - float hipass[3], hpffluct[3], tonefactor, nrfactor; - - tonefactor = (nrwt_l[data_coarse->L[i][j]]); - - hipass[1] = data_fine->a[i][j] - data_coarse->a[i][j]; - hipass[2] = data_fine->b[i][j] - data_coarse->b[i][j]; - - //Wiener filter - //luma - if (level < 2) { - hipass[0] = data_fine->L[i][j] - data_coarse->L[i][j]; - hpffluct[0] = SQR(hipass[0]) + SQR(hipass[1]) + SQR(hipass[2]) + 0.001; - nrfactorL[i][j] = (1.0 + hpffluct[0]) / (1.0 + hpffluct[0] + noisevar_L /* * Lcurve[data_coarse->L[i][j]]*/); - //hipass[0] *= hpffluct[0]/(hpffluct[0]+noisevar_L); - //data_fine->L[i][j] = CLIP(hipass[0]+data_coarse->L[i][j]); - } - - //chroma - //hipass[1] = data_fine->a[i][j]-data_coarse->a[i][j]; - //hipass[2] = data_fine->b[i][j]-data_coarse->b[i][j]; - hpffluct[1] = SQR(hipass[1] * tonefactor) + 0.001; - hpffluct[2] = SQR(hipass[2] * tonefactor) + 0.001; - nrfactor = (hpffluct[1] + hpffluct[2]) / ((hpffluct[1] + hpffluct[2]) + noisevar_ab * NRWT_AB); - - hipass[1] *= nrfactor; - hipass[2] *= nrfactor; - - data_fine->a[i][j] = hipass[1] + data_coarse->a[i][j]; - data_fine->b[i][j] = hipass[2] + data_coarse->b[i][j]; - } - - if (level < 2) - { -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - - float dirwt_l, norm_l; - float nrfctrave = 0; - norm_l = 0;//if we do want to include the input pixel in the sum - - for(int inbr = max(0, i - 1); inbr <= min(height - 1, i + 1); inbr++) { - for (int jnbr = max(0, j - 1); jnbr <= min(width - 1, j + 1); jnbr++) { - dirwt_l = DIRWT_L(inbr, jnbr, i, j); - nrfctrave += dirwt_l * nrfactorL[inbr][jnbr]; - norm_l += dirwt_l; - } - } - - nrfctrave /= norm_l; - //nrfctrave = nrfactorL[i][j]; - //nrfctrave=1; - - float hipass[3]; - - //luma - - /*if (i>0 && i0 && jL[i][j] - data_coarse->L[i][j]); - //hipass[0] = median*(data_fine->L[i][j]-data_coarse->L[i][j]); - //hipass[0] = nrfactorL[i][j]*(data_fine->L[i][j]-data_coarse->L[i][j]); - data_fine->L[i][j] = CLIP(hipass[0] + data_coarse->L[i][j]); - - //chroma - //hipass[1] = nrfactorab[i][j]*(data_fine->a[i][j]-data_coarse->a[i][j]); - //hipass[2] = nrfactorab[i][j]*(data_fine->b[i][j]-data_coarse->b[i][j]); - - //data_fine->a[i][j] = hipass[1]+data_coarse->a[i][j]; - //data_fine->b[i][j] = hipass[2]+data_coarse->b[i][j]; - } - }//end of luminance correction - - - - }//end of pitch=1 - - } else {//pitch>1 - - LabImage* smooth; - - smooth = new LabImage(width, height); -#ifdef _OPENMP - #pragma omp parallel -#endif - - { - -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i += pitch) { - int ix = i / pitch; - - for(int j = 0, jx = 0; j < width; j += pitch, jx++) { - - //copy common pixels - smooth->L[i][j] = data_coarse->L[ix][jx]; - smooth->a[i][j] = data_coarse->a[ix][jx]; - smooth->b[i][j] = data_coarse->b[ix][jx]; - } - } - - //if (pitch>1) {//pitch=2; step (1) expand coarse image, fill in missing data -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height - 1; i += 2) - for(int j = 0; j < width - 1; j += 2) { - //do midpoint first - double norm = 0.0, wtdsum[3] = {0.0, 0.0, 0.0}; - - //wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0; - for(int ix = i; ix < min(height, i + 3); ix += 2) - for (int jx = j; jx < min(width, j + 3); jx += 2) { - wtdsum[0] += smooth->L[ix][jx]; - wtdsum[1] += smooth->a[ix][jx]; - wtdsum[2] += smooth->b[ix][jx]; - norm++; - } - - norm = 1 / norm; - smooth->L[i + 1][j + 1] = wtdsum[0] * norm; - smooth->a[i + 1][j + 1] = wtdsum[1] * norm; - smooth->b[i + 1][j + 1] = wtdsum[2] * norm; - } - -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height - 1; i += 2) - for(int j = 0; j < width - 1; j += 2) { - //now right neighbor - if (j + 1 == width) { - continue; - } - - double norm = 0.0, wtdsum[3] = {0.0, 0.0, 0.0}; - - for (int jx = j; jx < min(width, j + 3); jx += 2) { - wtdsum[0] += smooth->L[i][jx]; - wtdsum[1] += smooth->a[i][jx]; - wtdsum[2] += smooth->b[i][jx]; - norm++; - } - - for (int ix = max(0, i - 1); ix < min(height, i + 2); ix += 2) { - wtdsum[0] += smooth->L[ix][j + 1]; - wtdsum[1] += smooth->a[ix][j + 1]; - wtdsum[2] += smooth->b[ix][j + 1]; - norm++; - } - - norm = 1 / norm; - smooth->L[i][j + 1] = wtdsum[0] * norm; - smooth->a[i][j + 1] = wtdsum[1] * norm; - smooth->b[i][j + 1] = wtdsum[2] * norm; - - //now down neighbor - if (i + 1 == height) { - continue; - } - - norm = 0.0; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; - - for (int ix = i; ix < min(height, i + 3); ix += 2) { - wtdsum[0] += smooth->L[ix][j]; - wtdsum[1] += smooth->a[ix][j]; - wtdsum[2] += smooth->b[ix][j]; - norm++; - } - - for (int jx = max(0, j - 1); jx < min(width, j + 2); jx += 2) { - wtdsum[0] += smooth->L[i + 1][jx]; - wtdsum[1] += smooth->a[i + 1][jx]; - wtdsum[2] += smooth->b[i + 1][jx]; - norm++; - } - - norm = 1 / norm; - smooth->L[i + 1][j] = wtdsum[0] * norm; - smooth->a[i + 1][j] = wtdsum[1] * norm; - smooth->b[i + 1][j] = wtdsum[2] * norm; - - } - -#ifdef _OPENMP - #pragma omp for -#endif - - // step (2-3-4) - for( int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - - float tonefactor = (nrwt_l[smooth->L[i][j]]); - //double wtdsum[3], norm; - float hipass[3], hpffluct[3], nrfactor; - - hipass[1] = data_fine->a[i][j] - smooth->a[i][j]; - hipass[2] = data_fine->b[i][j] - smooth->b[i][j]; - - //Wiener filter - //luma - if (level < 2) { - hipass[0] = data_fine->L[i][j] - smooth->L[i][j]; - hpffluct[0] = SQR(hipass[0]) + SQR(hipass[1]) + SQR(hipass[2]) + 0.001; - nrfactorL[i][j] = (1.0 + hpffluct[0]) / (1.0 + hpffluct[0] + noisevar_L /* * Lcurve[smooth->L[i][j]]*/); - //hipass[0] *= hpffluct[0]/(hpffluct[0]+noisevar_L); - //data_fine->L[i][j] = CLIP(hipass[0]+smooth->L[i][j]); - } - - //chroma - //hipass[1] = data_fine->a[i][j]-smooth->a[i][j]; - //hipass[2] = data_fine->b[i][j]-smooth->b[i][j]; - hpffluct[1] = SQR(hipass[1] * tonefactor) + 0.001; - hpffluct[2] = SQR(hipass[2] * tonefactor) + 0.001; - nrfactor = (hpffluct[1] + hpffluct[2]) / ((hpffluct[1] + hpffluct[2]) + noisevar_ab * NRWT_AB /* * abcurve[smooth->L[i][j]]*/); - - hipass[1] *= nrfactor; - hipass[2] *= nrfactor; - - data_fine->a[i][j] = hipass[1] + smooth->a[i][j]; - data_fine->b[i][j] = hipass[2] + smooth->b[i][j]; - } - - - if (level < 2) { -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - - float dirwt_l, norm_l; - float nrfctrave = 0; - norm_l = 0;//if we do want to include the input pixel in the sum - - for(int inbr = (i - pitch); inbr <= (i + pitch); inbr += pitch) { - if (inbr < 0 || inbr > height - 1) { - continue; - } - - for (int jnbr = (j - pitch); jnbr <= (j + pitch); jnbr += pitch) { - if (jnbr < 0 || jnbr > width - 1) { - continue; - } - - dirwt_l = DIRWT_L(inbr, jnbr, i, j); - nrfctrave += dirwt_l * nrfactorL[inbr][jnbr]; - norm_l += dirwt_l; - } - } - - nrfctrave /= norm_l; - //nrfctrave = nrfactorL[i][j]; - //nrfctrave=1; - - - float hipass[3]; - - //luma - - /*if (i>0 && i0 && jL[i][j] - smooth->L[i][j]); - //hipass[0] = median*(data_fine->L[i][j]-smooth->L[i][j]); - //hipass[0] = nrfactorL[i][j]*(data_fine->L[i][j]-data_coarse->L[i][j]); - data_fine->L[i][j] = CLIP(hipass[0] + smooth->L[i][j]); - - - //chroma - //hipass[1] = nrfactorab[i][j]*(data_fine->a[i][j]-data_coarse->a[i][j]); - //hipass[2] = nrfactorab[i][j]*(data_fine->b[i][j]-data_coarse->b[i][j]); - - //data_fine->a[i][j] = hipass[1]+data_coarse->a[i][j]; - //data_fine->b[i][j] = hipass[2]+data_coarse->b[i][j]; - } - }//end of luminance correction - - - } // end parallel - delete smooth; - }//end of pitch>1 - -} - - -#undef DIRWT_L -#undef DIRWT_AB - -//#undef NRWT_L -#undef NRWT_AB - -} - diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index ccc77ab9f..4d03e2747 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -35,20 +35,6 @@ #include "cplx_wavelet_dec.h" #include "pipettebuffer.h" -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } - -#define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[1]); PIX_SORT(pp[3],pp[4]); PIX_SORT(pp[6],pp[7]); \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[3]); PIX_SORT(pp[5],pp[8]); PIX_SORT(pp[4],pp[7]); \ -PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \ -PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \ -PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median - - - namespace rtengine { @@ -292,7 +278,6 @@ public: // pyramid denoise procparams::DirPyrDenoiseParams dnparams; - void dirpyrLab_denoise(LabImage * src, LabImage * dst, const procparams::DirPyrDenoiseParams & dnparams );//Emil's directional pyramid denoise void dirpyr (LabImage* data_fine, LabImage* data_coarse, int level, LUTf &rangefn_L, LUTf &rangefn_ab, int pitch, int scale, const int luma, int chroma ); void idirpyr (LabImage* data_coarse, LabImage* data_fine, int level, LUTf &rangefn_L, LUTf & nrwt_l, LUTf & nrwt_ab, diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 6773e7a12..06f779875 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -36,30 +36,20 @@ */ -#include -#include -#include -#include +#include +#include +#include +#include #include "rtengine.h" #include "gauss.h" #include "rawimagesource.h" #include "improcfun.h" #include "opthelper.h" +#include "median.h" #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) -#define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[1]); PIX_SORT(pp[3],pp[4]); PIX_SORT(pp[6],pp[7]); \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[3]); PIX_SORT(pp[5],pp[8]); PIX_SORT(pp[4],pp[7]); \ -PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \ -PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \ -PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median - - namespace { void retinex_scales( float* scales, int nscales, int mode, int s, float high) @@ -629,10 +619,8 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e #endif for (int i = borderL; i < hei - borderL; i++) { - float pp[9], temp; - for (int j = borderL; j < wid - borderL; j++) { - med3(luminance[i][j], luminance[i - 1][j], luminance[i + 1][j], luminance[i][j + 1], luminance[i][j - 1], luminance[i - 1][j - 1], luminance[i - 1][j + 1], luminance[i + 1][j - 1], luminance[i + 1][j + 1], tmL[i][j]); //3x3 + tmL[i][j] = median(luminance[i][j], luminance[i - 1][j], luminance[i + 1][j], luminance[i][j + 1], luminance[i][j - 1], luminance[i - 1][j - 1], luminance[i - 1][j + 1], luminance[i + 1][j - 1], luminance[i + 1][j + 1]); //3x3 } } diff --git a/rtengine/median.h b/rtengine/median.h index d5e88d9de..800c3767f 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -16,26 +16,100 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rt_math.h" + +#pragma once + +#include +#include + +#include "opthelper.h" + +template +T median(std::array array) +{ + const typename std::array::iterator middle = array.begin() + array.size() / 2; + std::nth_element(array.begin(), middle, array.end()); + + return + array.size() % 2 + ? ((*middle + *std::min_element(middle + 1, array.end())) / static_cast(2)) + : *middle; +} + +template +T median(T arg, ARGS... args) +{ + return median(std::array{std::move(arg), std::move(args)...}); +} + +template +inline T median3(T a, T b, T c) +{ + return std::max(std::min(a, b), std::min(c, std::max(a, b))); +} + +template<> +inline vfloat median3(vfloat a, vfloat b, vfloat c) +{ + return vmaxf(vminf(a, b), vminf(c, vmaxf(a, b))); +} + +// See http://stackoverflow.com/questions/480960/code-to-calculate-median-of-five-in-c-sharp +template +inline T median5(T a, T b, T c, T d, T e) +{ + if (b < a) { + std::swap(a, b); + } + if (d < c) { + std::swap(c, d); + } + + if (c < a) { + std::swap(b, d); + c = a; + } + + a = e; + + if (b < a) { + std::swap(a, b); + } + + if (a < c) { + std::swap(b, d); + a = c; + } + + return std::min(a, d); +} + +template<> +inline vfloat median5(vfloat a, vfloat b, vfloat c, vfloat d, vfloat e) +{ + const vfloat f = vmaxf(vminf(a, b), vminf(c, d)); + const vfloat g = vminf(vmaxf(a, b), vmaxf(c, d)); + return median3(e, f, g); +} // middle 4 of 6 elements, #define MIDDLE4OF6(s0,s1,s2,s3,s4,s5,d0,d1,d2,d3,d4,d5,temp) \ {\ -d1 = min(s1,s2);\ -d2 = max(s1,s2);\ -d0 = min(s0,d2);\ -d2 = max(s0,d2);\ -temp = min(d0,d1);\ -d1 = max(d0,d1);\ +d1 = std::min(s1,s2);\ +d2 = std::max(s1,s2);\ +d0 = std::min(s0,d2);\ +d2 = std::max(s0,d2);\ +temp = std::min(d0,d1);\ +d1 = std::max(d0,d1);\ d0 = temp;\ -d4 = min(s4,s5);\ -d5 = max(s4,s5);\ -d3 = min(s3,d5);\ -d5 = max(s3,d5);\ -temp = min(d3,d4);\ -d4 = max(d3,d4);\ -d3 = max(d0,temp);\ -d2 = min(d2,d5);\ +d4 = std::min(s4,s5);\ +d5 = std::max(s4,s5);\ +d3 = std::min(s3,d5);\ +d5 = std::max(s3,d5);\ +temp = std::min(d3,d4);\ +d4 = std::max(d3,d4);\ +d3 = std::max(d0,temp);\ +d2 = std::min(d2,d5);\ } // middle 4 of 6 elements, vectorized @@ -61,27 +135,27 @@ d2 = vminf(d2,d5);\ #define MEDIAN7(s0,s1,s2,s3,s4,s5,s6,t0,t1,t2,t3,t4,t5,t6,median) \ {\ -t0 = min(s0,s5);\ -t5 = max(s0,s5);\ -t3 = max(t0,s3);\ -t0 = min(t0,s3);\ -t1 = min(s1,s6);\ -t6 = max(s1,s6);\ -t2 = min(s2,s4);\ -t4 = max(s2,s4);\ -t1 = max(t0,t1);\ -median = min(t3,t5);\ -t5 = max(t3,t5);\ +t0 = std::min(s0,s5);\ +t5 = std::max(s0,s5);\ +t3 = std::max(t0,s3);\ +t0 = std::min(t0,s3);\ +t1 = std::min(s1,s6);\ +t6 = std::max(s1,s6);\ +t2 = std::min(s2,s4);\ +t4 = std::max(s2,s4);\ +t1 = std::max(t0,t1);\ +median = std::min(t3,t5);\ +t5 = std::max(t3,t5);\ t3 = median;\ -median = min(t2,t6);\ -t6 = max(t2,t6);\ -t3 = max(median,t3);\ -t3 = min(t3,t6);\ -t4 = min(t4,t5);\ -median = min(t1,t4);\ -t4 = max(t1,t4);\ -t3 = max(median,t3);\ -median = min(t3,t4);\ +median = std::min(t2,t6);\ +t6 = std::max(t2,t6);\ +t3 = std::max(median,t3);\ +t3 = std::min(t3,t6);\ +t4 = std::min(t4,t5);\ +median = std::min(t1,t4);\ +t4 = std::max(t1,t4);\ +t3 = std::max(median,t3);\ +median = std::min(t3,t4);\ } #define VMEDIAN7(s0,s1,s2,s3,s4,s5,s6,t0,t1,t2,t3,t4,t5,t6,median) \ diff --git a/rtengine/minmax.h b/rtengine/minmax.h deleted file mode 100644 index 69e939b72..000000000 --- a/rtengine/minmax.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -#define MINMAX3(a,b,c,min,max) \ -{ \ -if ((a)<(b)) { \ - if ((b)<(c)) { \ - (min) = (a); \ - (max) = (c); \ - } \ - else { \ - (max) = (b); \ - if ((a)<(c)) \ - (min) = (a); \ - else \ - (min) = (c); \ - } \ -} else { \ - if ((b)>(c)) { \ - (min) = (c); \ - (max) = (a); \ - } \ - else { \ - (min) = (b); \ - if ((a)>(c)) \ - (max) = (a); \ - else \ - (max) = (c); \ - } \ -} \ -} - -#define MIN3(a,b,c,min) \ -{ \ -if ((a)<(b)) { \ - if ((a)<(c)) \ - (min) = (a); \ - else \ - (min) = (c); \ -} else { \ - if ((b)>(c)) \ - (min) = (c); \ - else \ - (min) = (b); \ -} \ -} - -#define MAX3(a,b,c,min) \ -{ \ -if ((a)>(b)) { \ - if ((a)>(c)) \ - (max) = (a); \ - else \ - (max) = (c); \ -} else { \ - if ((b)<(c)) \ - (max) = (c); \ - else \ - (max) = (b); \ -} \ -} diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 218ba9fe2..7be671560 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -33,6 +33,7 @@ #include "dcp.h" #include "rt_math.h" #include "improcfun.h" +#include "median.h" #ifdef _OPENMP #include #endif @@ -433,13 +434,6 @@ PIX_SORT(p[3],p[6]); PIX_SORT(p[1],p[4]); PIX_SORT(p[2],p[5]); \ PIX_SORT(p[4],p[7]); PIX_SORT(p[4],p[2]); PIX_SORT(p[6],p[4]); \ PIX_SORT(p[4],p[2]); median=p[4];} //a4 is the median -#define med5(a0,a1,a2,a3,a4,median) { \ -p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; \ -PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ; \ -PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ; \ -PIX_SORT(p[1],p[2]) ; median=p[2] ;} - - RawImageSource::RawImageSource () : ImageSource() , plistener(NULL) @@ -3018,7 +3012,7 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur for (int i = 0; i < H; i++) { int iprev, inext, jprev, jnext; - int p[5], temp, median; + int med; if (i < 2) { iprev = i + 2; @@ -3048,12 +3042,11 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur //med3x3(riFlatFile->data[iprev][jprev], riFlatFile->data[iprev][j], riFlatFile->data[iprev][jnext], // riFlatFile->data[i][jprev], riFlatFile->data[i][j], riFlatFile->data[i][jnext], // riFlatFile->data[inext][jprev], riFlatFile->data[inext][j], riFlatFile->data[inext][jnext], cfatmp[i*W+j]); - med5(riFlatFile->data[iprev][j], riFlatFile->data[i][jprev], riFlatFile->data[i][j], - riFlatFile->data[i][jnext], riFlatFile->data[inext][j], median); + med = median(riFlatFile->data[iprev][j], riFlatFile->data[i][jprev], riFlatFile->data[i][j], riFlatFile->data[i][jnext], riFlatFile->data[inext][j]); // if (riFlatFile->data[i][j]>hotdeadthresh*median || median>hotdeadthresh*riFlatFile->data[i][j]) { - if (((int)riFlatFile->data[i][j] << 1) > median || (median << 1) > riFlatFile->data[i][j]) { - cfatmp[i * W + j] = median; + if (((int)riFlatFile->data[i][j] << 1) > med || (med << 1) > riFlatFile->data[i][j]) { + cfatmp[i * W + j] = med; } else { cfatmp[i * W + j] = riFlatFile->data[i][j]; } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 898f1397c..702fb5360 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -11,10 +11,10 @@ static const float MAXVALF = float(MAXVAL); // float version of MAXVAL static const double MAXVALD = double(MAXVAL); // double version of MAXVAL template -inline const _Tp SQR (_Tp x) +inline _Tp SQR (_Tp x) { // return std::pow(x,2); Slower than: - return (x * x); + return x * x; } template @@ -31,13 +31,13 @@ inline const _Tp& max(const _Tp& a, const _Tp& b) template -inline const _Tp LIM(const _Tp& a, const _Tp& b, const _Tp& c) +inline const _Tp& LIM(const _Tp& a, const _Tp& b, const _Tp& c) { return std::max(b, std::min(a, c)); } template -inline const _Tp LIM01(const _Tp& a) +inline _Tp LIM01(const _Tp& a) { return std::max(_Tp(0), std::min(a, _Tp(1))); } @@ -49,7 +49,7 @@ inline const _Tp ULIM(const _Tp& a, const _Tp& b, const _Tp& c) } template -inline const _Tp CLIP(const _Tp& a) +inline _Tp CLIP(const _Tp& a) { return LIM(a, static_cast<_Tp>(0), static_cast<_Tp>(MAXVAL)); } @@ -80,7 +80,7 @@ inline const _Tp& max(const _Tp& a, const _Tp& b, const _Tp& c, const _Tp& d) } template -inline const _Tp intp(const _Tp a, const _Tp b, const _Tp c) +inline _Tp intp(_Tp a, _Tp b, _Tp c) { // calculate a * b + (1 - a) * c // following is valid: @@ -90,19 +90,19 @@ inline const _Tp intp(const _Tp a, const _Tp b, const _Tp c) } template -T norm1(const T& x, const T& y) +inline T norm1(const T& x, const T& y) { return std::abs(x) + std::abs(y); } template -T norm2(const T& x, const T& y) +inline T norm2(const T& x, const T& y) { return std::sqrt(x * x + y * y); } template< typename T > -T norminf(const T& x, const T& y) +inline T norminf(const T& x, const T& y) { return std::max(std::abs(x), std::abs(y)); } From 45a572e65bd93439ac76680fc4c948fcc2268615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 15 Jun 2016 21:26:19 +0200 Subject: [PATCH 107/232] Add general 7-arguments-median (#3346) This was found on http://www.cs.hut.fi/~cessu/selection/, tested, inlined, and optimized. Needs at most 10 compares. --- rtengine/median.h | 187 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 176 insertions(+), 11 deletions(-) diff --git a/rtengine/median.h b/rtengine/median.h index 800c3767f..36794f87b 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -25,38 +25,38 @@ #include "opthelper.h" template -T median(std::array array) +inline T median(std::array array) { - const typename std::array::iterator middle = array.begin() + array.size() / 2; + const typename std::array::iterator middle = array.begin() + N / 2; std::nth_element(array.begin(), middle, array.end()); return - array.size() % 2 - ? ((*middle + *std::min_element(middle + 1, array.end())) / static_cast(2)) - : *middle; + N % 2 + ? *middle + : ((*middle + *std::max_element(array.begin(), middle)) / static_cast(2)); } template -T median(T arg, ARGS... args) +inline T median(T arg, ARGS... args) { return median(std::array{std::move(arg), std::move(args)...}); } template -inline T median3(T a, T b, T c) +inline T median(T a, T b, T c) { return std::max(std::min(a, b), std::min(c, std::max(a, b))); } template<> -inline vfloat median3(vfloat a, vfloat b, vfloat c) +inline vfloat median(vfloat a, vfloat b, vfloat c) { return vmaxf(vminf(a, b), vminf(c, vmaxf(a, b))); } // See http://stackoverflow.com/questions/480960/code-to-calculate-median-of-five-in-c-sharp template -inline T median5(T a, T b, T c, T d, T e) +inline T median(T a, T b, T c, T d, T e) { if (b < a) { std::swap(a, b); @@ -85,11 +85,176 @@ inline T median5(T a, T b, T c, T d, T e) } template<> -inline vfloat median5(vfloat a, vfloat b, vfloat c, vfloat d, vfloat e) +inline vfloat median(vfloat a, vfloat b, vfloat c, vfloat d, vfloat e) { const vfloat f = vmaxf(vminf(a, b), vminf(c, d)); const vfloat g = vminf(vmaxf(a, b), vmaxf(c, d)); - return median3(e, f, g); + return median(e, f, g); +} + +// See http://www.cs.hut.fi/~cessu/selection/V_7_4 +// Hand unrolled algorithm by Flössie ;) +template +inline T median(T a, T b, T c, T d, T e, T f, T g) +{ + if (b < a) { + std::swap(a, b); + } + + if (d < c) { + std::swap(b, c); + std::swap(b, d); + } else { + std::swap(b, c); + } + + if (b < a) { + std::swap(a, b); + } else { + std::swap(c, d); + } + + if (e < d) { + std::swap(c, d); + std::swap(c, e); + + if (c < b) { + std::swap(b, c); + + if (g < f) { + std::swap(d, g); + std::swap(e, g); + std::swap(f, g); + } else { + std::swap(d, f); + std::swap(e, f); + } + + if (g < c) { + std::swap(a, d); + + if (d < b) { + std::swap(a, b); + } else { + std::swap(a, d); + b = d; + } + + if (g < f) { + return std::max(a, g); + } + + return std::max(b, f); + } + + if (f < d) { + std::swap(d, f); + } + + if (d < c) { + return std::min(c, f); + } + + return std::min(d, e); + } + + if (d < c) { + std::swap(c, e); + + if (f < b) { + if (g < b) { + return b; + } + + return std::min(d, g); + } + + if (g < f) { + std::swap(e, g); + std::swap(f, g); + } else { + std::swap(e, f); + } + + if (e < d) { + return std::min(d, g); + } + + return std::min(e, f); + } + + if (g < f) { + std::swap(f, g); + } + + std::swap(e, f); + + if (e < c) { + if (g < b) { + return b; + } + + return std::min(c, g); + } + + if (d < e) { + return std::min(d, f); + } + + return std::min(e, f); + } + + if (d < b) { + std::swap(b, d); + } else { + std::swap(c, e); + } + + if (e < d) { + std::swap(d, e); + + if (f < b) { + if (g < b) { + return b; + } + + return std::min(d, g); + } + + if (g < f) { + std::swap(e, g); + std::swap(f, g); + } else { + std::swap(e, f); + } + + if (e < d) { + return std::min(d, g); + } + + return std::min(e, f); + } + + if (g < f) { + std::swap(c, g); + std::swap(f, g); + } else { + std::swap(c, f); + } + + if (c < d) { + if (g < b) { + return b; + } + + return std::min(d, g); + } + + if (e < c) { + return std::min(e, f); + } + + return std::min(c, f); } // middle 4 of 6 elements, From b8b98e0924400d69be5e8630f318a4d5a3a9bcae Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 17 Jun 2016 15:55:20 +0200 Subject: [PATCH 108/232] Disabled StopWatch --- rtengine/rawimagesource.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 818d494ac..acb79f8eb 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,7 +37,7 @@ #include #endif #include "opthelper.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD From d4f8c1f9d1d442cd30515151f050ecca202bdbde Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 17 Jun 2016 16:59:14 +0200 Subject: [PATCH 109/232] Removed StopWatch and updated dcraw.patch file --- rtengine/dcraw.cc | 2 - rtengine/dcraw.patch | 249 +++++++++++++++++++++++++++++++------------ 2 files changed, 179 insertions(+), 72 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index c83016769..ed7b43c19 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -10,7 +10,6 @@ /*RT*/#define LOCALTIME /*RT*/#define DJGPP -#include "StopWatch.h" #include "opthelper.h" /* dcraw.c -- Dave Coffin's raw photo decoder @@ -895,7 +894,6 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) void CLASS lossless_jpeg_load_raw() { -StopWatch Stop1("decode"); struct jhead jh; if (!ljpeg_start (&jh, 0)) return; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 2b4ee4102..a3c0a354f 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,6 +1,6 @@ ---- dcraw.c 2016-05-29 22:32:01.173135400 +0200 -+++ dcraw.cc 2016-05-29 21:57:44.144527700 +0200 -@@ -1,3 +1,15 @@ +--- dcraw.c 2016-06-17 13:44:42 +0000 ++++ dcraw.cc 2016-06-17 14:49:21 +0000 +@@ -1,3 +1,16 @@ +/*RT*/#include +/*RT*/#include +/*RT*/#undef MAX @@ -13,10 +13,11 @@ +/*RT*/#define LOCALTIME +/*RT*/#define DJGPP + ++#include "opthelper.h" /* dcraw.c -- Dave Coffin's raw photo decoder Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net -@@ -29,17 +41,17 @@ +@@ -29,17 +42,17 @@ #define _GNU_SOURCE #endif #define _USE_MATH_DEFINES @@ -44,7 +45,7 @@ #include #if defined(DJGPP) || defined(__MINGW32__) -@@ -54,7 +66,6 @@ +@@ -54,7 +67,6 @@ #ifdef WIN32 #include #include @@ -52,7 +53,7 @@ #define snprintf _snprintf #define strcasecmp stricmp #define strncasecmp strnicmp -@@ -89,89 +100,38 @@ +@@ -89,89 +101,38 @@ #define _(String) (String) #endif @@ -157,7 +158,7 @@ #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } /* -@@ -247,6 +207,7 @@ +@@ -247,6 +208,7 @@ if (filters == 1) return filter[(row+top_margin)&15][(col+left_margin)&15]; if (filters == 9) return xtrans[(row+6) % 6][(col+6) % 6]; @@ -165,7 +166,7 @@ return FC(row,col); } -@@ -289,6 +250,7 @@ +@@ -289,6 +251,7 @@ fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); } data_error++; @@ -173,7 +174,7 @@ } ushort CLASS sget2 (uchar *s) -@@ -362,7 +324,7 @@ +@@ -362,7 +325,7 @@ { if (fread (pixel, 2, count, ifp) < count) derror(); if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) @@ -182,12 +183,12 @@ } void CLASS cubic_spline (const int *x_, const int *y_, const int len) -@@ -589,10 +551,10 @@ +@@ -589,13 +552,13 @@ return 0; } -unsigned CLASS getbithuff (int nbits, ushort *huff) -+unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) ++inline unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) { - static unsigned bitbuf=0; - static int vbits=0, reset=0; @@ -195,8 +196,12 @@ +/*RT static int vbits=0, reset=0; */ unsigned c; - if (nbits > 25) return 0; -@@ -805,9 +767,13 @@ +- if (nbits > 25) return 0; ++ if (UNLIKELY(nbits > 25)) return 0; + if (nbits < 0) + return bitbuf = vbits = reset = 0; + if (nbits == 0 || vbits < 0) return 0; +@@ -805,9 +768,13 @@ FORC(2) free (huff[c]); } @@ -212,7 +217,7 @@ }; int CLASS ljpeg_start (struct jhead *jh, int info_only) -@@ -828,9 +794,9 @@ +@@ -828,9 +795,9 @@ switch (tag) { case 0xffc3: jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; @@ -224,7 +229,111 @@ jh->bits = data[0]; jh->high = data[1] << 8 | data[2]; jh->wide = data[3] << 8 | data[4]; -@@ -1124,8 +1090,7 @@ +@@ -862,7 +829,7 @@ + FORC(4) jh->huff[2+c] = jh->huff[1]; + FORC(jh->sraw) jh->huff[1+c] = jh->huff[0]; + } +- jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4); ++ jh->row = (ushort *) calloc (2 * jh->wide*jh->clrs, 4); + merror (jh->row, "ljpeg_start()"); + return zero_after_ff = 1; + } +@@ -874,7 +841,7 @@ + free (jh->row); + } + +-int CLASS ljpeg_diff (ushort *huff) ++inline int CLASS ljpeg_diff (ushort *huff) + { + int len, diff; + +@@ -901,7 +868,7 @@ + } + getbits(-1); + } +- FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1); ++ FORC3 row[c] = (jh->row + ((jrow & 1) + 1) * (jh->wide*jh->clrs*((jrow+c) & 1))); + for (col=0; col < jh->wide; col++) + FORC(jh->clrs) { + diff = ljpeg_diff (jh->huff[c]); +@@ -909,8 +876,7 @@ + pred = spred; + else if (col) pred = row[0][-jh->clrs]; + else pred = (jh->vpred[c] += diff) - diff; +- if (jrow && col) switch (jh->psv) { +- case 1: break; ++ if (jh->psv != 1 && jrow && col) switch (jh->psv) { + case 2: pred = row[1][0]; break; + case 3: pred = row[1][-jh->clrs]; break; + case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break; +@@ -919,7 +885,7 @@ + case 7: pred = (pred + row[1][0]) >> 1; break; + default: pred = 0; + } +- if ((**row = pred + diff) >> jh->bits) derror(); ++ if (UNLIKELY((**row = pred + diff) >> jh->bits)) derror(); + if (c <= jh->sraw) spred = **row; + row[0]++; row[1]++; + } +@@ -928,22 +894,39 @@ + + void CLASS lossless_jpeg_load_raw() + { +- int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0; + struct jhead jh; +- ushort *rp; + + if (!ljpeg_start (&jh, 0)) return; +- jwide = jh.wide * jh.clrs; ++ int jwide = jh.wide * jh.clrs; ++ ushort *rp[2]; ++ rp[0] = ljpeg_row (0, &jh); ++ ++ for (int jrow=0; jrow < jh.high; jrow++) { ++#ifdef _OPENMP ++#pragma omp parallel sections ++#endif ++{ ++#ifdef _OPENMP ++ #pragma omp section ++#endif ++ { ++ if(jrow < jh.high - 1) ++ rp[(jrow + 1)&1] = ljpeg_row (jrow + 1, &jh); ++ } ++#ifdef _OPENMP ++ #pragma omp section ++#endif ++ { ++ int row=0, col=0; + +- for (jrow=0; jrow < jh.high; jrow++) { +- rp = ljpeg_row (jrow, &jh); + if (load_flags & 1) + row = jrow & 1 ? height-1-jrow/2 : jrow/2; +- for (jcol=0; jcol < jwide; jcol++) { +- val = curve[*rp++]; ++ for (int jcol=0; jcol < jwide; jcol++) { ++ int val = curve[*rp[jrow&1]++]; + if (cr2_slice[0]) { +- jidx = jrow*jwide + jcol; +- i = jidx / (cr2_slice[1]*raw_height); ++ int jidx = jrow*jwide + jcol; ++ int i = jidx / (cr2_slice[1]*raw_height); ++ int j; + if ((j = i >= cr2_slice[0])) + i = cr2_slice[0]; + jidx -= i * (cr2_slice[1]*raw_height); +@@ -956,6 +939,8 @@ + if (++col >= raw_width) + col = (row++,0); + } ++ } ++} + } + ljpeg_end (&jh); + } +@@ -1124,8 +1109,7 @@ if (++col >= tile_width || col >= raw_width) row += 1 + (col = 0); } @@ -234,7 +343,7 @@ fseek (ifp, save+4, SEEK_SET); if ((tcol += tile_width) >= raw_width) trow += tile_length + (tcol = 0); -@@ -1332,14 +1297,14 @@ +@@ -1332,14 +1316,14 @@ int i, nz; char tail[424]; @@ -251,7 +360,7 @@ void CLASS ppm_thumb() { -@@ -1701,10 +1666,10 @@ +@@ -1701,10 +1685,10 @@ } } @@ -265,7 +374,7 @@ unsigned c; if (nbits == -1) -@@ -1779,6 +1744,338 @@ +@@ -1779,6 +1763,338 @@ maximum = 0xfffc - ph1.black; } @@ -604,7 +713,7 @@ void CLASS hasselblad_load_raw() { struct jhead jh; -@@ -2002,10 +2299,10 @@ +@@ -2002,10 +2318,10 @@ maximum = curve[0x3ff]; } @@ -618,7 +727,7 @@ int byte; if (!nbits) return vbits=0; -@@ -2188,7 +2485,7 @@ +@@ -2188,7 +2504,7 @@ void CLASS kodak_radc_load_raw() { @@ -627,7 +736,7 @@ 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8, 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8, 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8, -@@ -2294,11 +2591,11 @@ +@@ -2294,11 +2610,11 @@ METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo) { @@ -641,7 +750,7 @@ cinfo->src->next_input_byte = jpeg_buffer; cinfo->src->bytes_in_buffer = nbytes; return TRUE; -@@ -2648,10 +2945,9 @@ +@@ -2648,10 +2964,9 @@ maximum = (1 << (thumb_misc & 31)) - 1; } @@ -654,7 +763,7 @@ if (start) { for (p=0; p < 4; p++) pad[p] = key = key * 48828125 + 1; -@@ -2736,11 +3032,13 @@ +@@ -2736,11 +3051,13 @@ bit += 7; } for (i=0; i < 16; i++, col+=2) @@ -669,7 +778,7 @@ } void CLASS samsung_load_raw() -@@ -3038,7 +3336,7 @@ +@@ -3038,7 +3355,7 @@ void CLASS foveon_decoder (unsigned size, unsigned code) { @@ -678,7 +787,7 @@ struct decode *cur; int i, len; -@@ -3135,7 +3433,7 @@ +@@ -3135,7 +3452,7 @@ pred[c] += diff[dindex->leaf]; if (pred[c] >> 16 && ~pred[c] >> 16) derror(); } @@ -687,7 +796,7 @@ } } } -@@ -3746,6 +4044,8 @@ +@@ -3746,6 +4063,8 @@ if (load_raw == &CLASS phase_one_load_raw || load_raw == &CLASS phase_one_load_raw_c) phase_one_correct(); @@ -696,7 +805,7 @@ if (fuji_width) { for (row=0; row < raw_height-top_margin*2; row++) { for (col=0; col < fuji_width << !fuji_layout; col++) { -@@ -3761,10 +4061,13 @@ +@@ -3761,10 +4080,13 @@ } } } else { @@ -712,7 +821,7 @@ if (mask[0][3] > 0) goto mask_set; if (load_raw == &CLASS canon_load_raw || load_raw == &CLASS lossless_jpeg_load_raw) { -@@ -4366,239 +4669,8 @@ +@@ -4366,239 +4688,8 @@ } } @@ -953,7 +1062,7 @@ void CLASS cielab (ushort rgb[3], short lab[3]) { -@@ -4864,112 +4936,7 @@ +@@ -4864,112 +4955,7 @@ } #undef fcol @@ -971,7 +1080,7 @@ - char (*homo)[TS][TS], *buffer; - - if (verbose) fprintf (stderr,_("AHD interpolation...\n")); -- + - cielab (0,0); - border_interpolate(5); - buffer = (char *) malloc (26*TS*TS); @@ -979,7 +1088,7 @@ - rgb = (ushort(*)[TS][TS][3]) buffer; - lab = (short (*)[TS][TS][3])(buffer + 12*TS*TS); - homo = (char (*)[TS][TS]) (buffer + 24*TS*TS); - +- - for (top=2; top < height-5; top += TS-6) - for (left=2; left < width-5; left += TS-6) { - @@ -1066,7 +1175,7 @@ #undef TS void CLASS median_filter() -@@ -5139,7 +5106,7 @@ +@@ -5139,7 +5125,7 @@ } } @@ -1075,7 +1184,7 @@ void CLASS parse_makernote (int base, int uptag) { -@@ -5244,6 +5211,11 @@ +@@ -5244,6 +5230,11 @@ tag |= uptag << 16; if (tag == 2 && strstr(make,"NIKON") && !iso_speed) iso_speed = (get2(),get2()); @@ -1087,7 +1196,7 @@ if (tag == 4 && len > 26 && len < 35) { if ((i=(get4(),get2())) != 0x7fff && !iso_speed) iso_speed = 50 * pow (2, i/32.0 - 4); -@@ -5296,12 +5268,16 @@ +@@ -5296,12 +5287,16 @@ cam_mul[2] = get4() << 2; } } @@ -1105,7 +1214,7 @@ if (tag == 0x1d) while ((c = fgetc(ifp)) && c != EOF) serial = serial*10 + (isdigit(c) ? c - '0' : c % 10); -@@ -5491,14 +5467,14 @@ +@@ -5491,14 +5486,14 @@ while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { @@ -1123,7 +1232,7 @@ shutter = pow (2, expo); break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; -@@ -5667,28 +5643,33 @@ +@@ -5667,28 +5662,33 @@ } } @@ -1163,7 +1272,7 @@ entries = get2(); if (entries > 512) return 1; while (entries--) { -@@ -5758,7 +5739,8 @@ +@@ -5758,7 +5758,8 @@ fgets (make, 64, ifp); break; case 272: /* Model */ @@ -1173,7 +1282,7 @@ break; case 280: /* Panasonic RW2 offset */ if (type != 4) break; -@@ -5818,6 +5800,9 @@ +@@ -5818,6 +5819,9 @@ case 315: /* Artist */ fread (artist, 64, 1, ifp); break; @@ -1183,7 +1292,7 @@ case 322: /* TileWidth */ tiff_ifd[ifd].tile_width = getint(type); break; -@@ -5833,6 +5818,9 @@ +@@ -5833,6 +5837,9 @@ is_raw = 5; } break; @@ -1193,7 +1302,7 @@ case 330: /* SubIFDs */ if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) { load_raw = &CLASS sony_arw_load_raw; -@@ -5846,6 +5834,9 @@ +@@ -5846,6 +5853,9 @@ fseek (ifp, i+4, SEEK_SET); } break; @@ -1203,7 +1312,7 @@ case 400: strcpy (make, "Sarnoff"); maximum = 0xfff; -@@ -6063,12 +6054,21 @@ +@@ -6063,12 +6073,21 @@ case 61450: cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ @@ -1231,7 +1340,7 @@ case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ for (num=i=0; i < (len & 0xffff); i++) -@@ -6085,13 +6085,13 @@ +@@ -6085,13 +6104,13 @@ case 50721: /* ColorMatrix1 */ case 50722: /* ColorMatrix2 */ FORCC for (j=0; j < 3; j++) @@ -1247,7 +1356,7 @@ break; case 50727: /* AnalogBalance */ FORCC ab[c] = getreal(type); -@@ -6114,6 +6114,11 @@ +@@ -6114,6 +6133,11 @@ case 50752: read_shorts (cr2_slice, 3); break; @@ -1259,7 +1368,7 @@ case 50829: /* ActiveArea */ top_margin = getint(type); left_margin = getint(type); -@@ -6146,21 +6151,27 @@ +@@ -6146,21 +6170,27 @@ fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; @@ -1295,7 +1404,7 @@ cam_xyz_coeff (cmatrix, cam_xyz); } if (asn[0]) { -@@ -6168,13 +6179,14 @@ +@@ -6168,13 +6198,14 @@ FORCC cam_mul[c] = 1 / asn[c]; } if (!use_cm) @@ -1311,7 +1420,7 @@ fseek (ifp, base, SEEK_SET); order = get2(); -@@ -6206,6 +6218,7 @@ +@@ -6206,6 +6237,7 @@ shutter = tiff_ifd[i].shutter; tiff_ifd[i].shutter = shutter; } @@ -1319,7 +1428,7 @@ for (i=0; i < tiff_nifds; i++) { if (max_samp < tiff_ifd[i].samples) max_samp = tiff_ifd[i].samples; -@@ -6266,7 +6279,12 @@ +@@ -6266,7 +6298,12 @@ case 8: load_raw = &CLASS eight_bit_load_raw; break; case 12: if (tiff_ifd[raw].phint == 2) load_flags = 6; @@ -1333,7 +1442,7 @@ case 14: load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && -@@ -6305,6 +6323,7 @@ +@@ -6305,6 +6342,7 @@ case 32803: load_raw = &CLASS kodak_65000_load_raw; } case 32867: case 34892: break; @@ -1341,7 +1450,7 @@ default: is_raw = 0; } if (!dng_version) -@@ -6390,7 +6409,7 @@ +@@ -6390,7 +6428,7 @@ { const char *file, *ext; char *jname, *jfile, *jext; @@ -1350,7 +1459,7 @@ ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); -@@ -6412,13 +6431,14 @@ +@@ -6412,13 +6450,14 @@ } else while (isdigit(*--jext)) { if (*jext != '9') { @@ -1367,7 +1476,7 @@ if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); parse_tiff (12); -@@ -6693,6 +6713,7 @@ +@@ -6693,6 +6732,7 @@ load_raw = ph1.format < 3 ? &CLASS phase_one_load_raw : &CLASS phase_one_load_raw_c; maximum = 0xffff; @@ -1375,7 +1484,7 @@ strcpy (make, "Phase One"); if (model[0]) return; switch (raw_height) { -@@ -6761,7 +6782,11 @@ +@@ -6761,7 +6801,11 @@ order = get2(); hlen = get4(); if (get4() == 0x48454150) /* "HEAP" */ @@ -1387,7 +1496,7 @@ if (parse_tiff (save+6)) apply_tiff(); fseek (ifp, save+len, SEEK_SET); } -@@ -7033,7 +7058,8 @@ +@@ -7033,7 +7077,8 @@ { static const struct { const char *prefix; @@ -1397,7 +1506,7 @@ } table[] = { { "AgfaPhoto DC-833m", 0, 0, /* DJC */ { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, -@@ -7977,12 +8003,12 @@ +@@ -7977,12 +8022,12 @@ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, @@ -1412,7 +1521,7 @@ { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, -@@ -8088,6 +8114,33 @@ +@@ -8088,6 +8133,33 @@ } break; } @@ -1446,7 +1555,7 @@ } void CLASS simple_coeff (int index) -@@ -8410,7 +8463,7 @@ +@@ -8410,7 +8482,7 @@ tiff_flip = flip = filters = UINT_MAX; /* unknown */ raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; maximum = height = width = top_margin = left_margin = 0; @@ -1455,7 +1564,7 @@ iso_speed = shutter = aperture = focal_len = unique_id = 0; tiff_nifds = 0; memset (tiff_ifd, 0, sizeof tiff_ifd); -@@ -8442,13 +8495,20 @@ +@@ -8442,13 +8514,20 @@ fread (head, 1, 32, ifp); fseek (ifp, 0, SEEK_END); flen = fsize = ftell(ifp); @@ -1478,7 +1587,7 @@ parse_ciff (hlen, flen-hlen, 0); load_raw = &CLASS canon_load_raw; } else if (parse_tiff(0)) apply_tiff(); -@@ -8494,6 +8554,7 @@ +@@ -8494,6 +8573,7 @@ fseek (ifp, 100+28*(shot_select > 0), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); @@ -1486,7 +1595,7 @@ apply_tiff(); } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); -@@ -8607,9 +8668,10 @@ +@@ -8607,9 +8687,10 @@ if (make[0] == 0) parse_smal (0, flen); if (make[0] == 0) { parse_jpeg(0); @@ -1500,7 +1609,7 @@ strcpy (make, "OmniVision"); data_offset = ftell(ifp) + 0x8000-32; width = raw_width; -@@ -8618,6 +8680,7 @@ +@@ -8618,6 +8699,7 @@ filters = 0x16161616; } else is_raw = 0; } @@ -1508,7 +1617,7 @@ for (i=0; i < sizeof corp / sizeof *corp; i++) if (strcasestr (make, corp[i])) /* Simplify company names */ -@@ -8649,7 +8712,7 @@ +@@ -8649,7 +8731,7 @@ if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) @@ -1517,7 +1626,7 @@ if (width >= 4960 && !strncmp(model,"K-5",3)) { left_margin = 10; width = 4950; filters = 0x16161616; } if (width == 4736 && !strcmp(model,"K-7")) -@@ -8669,6 +8732,7 @@ +@@ -8669,6 +8751,7 @@ case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; @@ -1525,7 +1634,7 @@ case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; } -@@ -8725,6 +8789,7 @@ +@@ -8725,6 +8808,7 @@ if (height > width) pixel_aspect = 2; filters = 0; simple_coeff(0); @@ -1533,7 +1642,7 @@ } else if (!strcmp(make,"Canon") && tiff_bps == 15) { switch (width) { case 3344: width -= 66; -@@ -9034,24 +9099,53 @@ +@@ -9034,24 +9118,53 @@ if (load_raw == &CLASS lossless_jpeg_load_raw) load_raw = &CLASS hasselblad_load_raw; if (raw_width == 7262) { @@ -1592,7 +1701,7 @@ } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); -@@ -9109,6 +9203,7 @@ +@@ -9109,6 +9222,7 @@ filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { @@ -1600,7 +1709,7 @@ if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { -@@ -9126,6 +9221,7 @@ +@@ -9126,6 +9240,7 @@ } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; @@ -1608,7 +1717,7 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -9357,6 +9453,18 @@ +@@ -9357,6 +9472,18 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1627,7 +1736,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9371,9 +9479,9 @@ +@@ -9371,9 +9498,9 @@ if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; @@ -1639,7 +1748,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -9452,199 +9560,250 @@ +@@ -9452,199 +9579,250 @@ } #endif @@ -2073,7 +2182,7 @@ struct tiff_tag { ushort tag, type; int count; -@@ -9667,594 +9826,11 @@ +@@ -9667,594 +9845,11 @@ char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; From 88685c66f6b2c82810b8ed40b7078424c69d2fd9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 17 Jun 2016 17:56:34 +0200 Subject: [PATCH 110/232] SSS3 code to speedup save to 8bit formats (mainly for 8bit tiff and jpeg) --- rtengine/image16.cc | 121 ++++++++++++++++++++++++++++++++++++-------- rtengine/imageio.cc | 9 ++-- 2 files changed, 104 insertions(+), 26 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 8ba88bd4c..56f3a4290 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -56,8 +56,85 @@ void Image16::getScanline (int row, unsigned char* buffer, int bps) } } else if (bps == 8) { int ix = 0; + int i = 0; +#ifdef __SSSE3__ + // process 48 values using SSSE3. Looks like a lot of code, but it only needs about one instruction per value, whereas scalar version needs about five instructions per value + vmask reduceWord2Bytev = _mm_set_epi8(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 15, 13, 11, 9, 7, 5, 3, 1); + // we need fivev and sixv to reduce the number of registers used for permutation masks from 9 to 6 + vint fivev = _mm_set1_epi8(5); + vint sixv = _mm_set1_epi8(6); - for (int i = 0; i < width; i++) { + for (; i < width - 15; i += 16, ix += 48) { + // generate initial shuffle masks. Gaps are set to 0xf0 to allow calculating subsequent masks from previous ones + vint redmaskv = _mm_set_epi8(5, 0xf0, 0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0); + vint greenmaskv = _mm_set_epi8(0xf0, 0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0, 0xf0); + vint bluemaskv = _mm_set_epi8(0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0, 0xf0, 0xf0); + + // load first 8 values for each colour + vint red1v = _mm_loadu_si128((__m128i*)&r(row, i)); + vint green1v = _mm_loadu_si128((__m128i*)&g(row, i)); + vint blue1v = _mm_loadu_si128((__m128i*)&b(row, i)); + + // load second 8 values for each colour + vint red2v = _mm_loadu_si128((__m128i*)&r(row, i + 8)); + vint green2v = _mm_loadu_si128((__m128i*)&g(row, i + 8)); + vint blue2v = _mm_loadu_si128((__m128i*)&b(row, i + 8)); + + // shuffle the high bytes of the values to the lower 64 bit of the register + red1v = _mm_shuffle_epi8(red1v, reduceWord2Bytev); + green1v = _mm_shuffle_epi8(green1v, reduceWord2Bytev); + blue1v = _mm_shuffle_epi8(blue1v, reduceWord2Bytev); + + // shuffle the high bytes of the values to the lower 64 bit of the register + red2v = _mm_shuffle_epi8(red2v, reduceWord2Bytev); + green2v = _mm_shuffle_epi8(green2v, reduceWord2Bytev); + blue2v = _mm_shuffle_epi8(blue2v, reduceWord2Bytev); + + // mix first and second 8 values of each colour together + red1v = (vint)_mm_shuffle_pd((__m128d)red1v, (__m128d)red2v, 0); + green1v = (vint)_mm_shuffle_pd((__m128d)green1v, (__m128d)green2v, 0); + blue1v = (vint)_mm_shuffle_pd((__m128d)blue1v, (__m128d)blue2v, 0); + + // now we have the input in registers => let's generate the output + + // first we need r0g0b0r1g1b1r2g2b2r3g3b3r4g4b4r5 + vint destv = _mm_shuffle_epi8(red1v, redmaskv); + vint greenv = _mm_shuffle_epi8(green1v, greenmaskv); + destv = _mm_or_si128(destv, greenv); + vint bluev = _mm_shuffle_epi8(blue1v, bluemaskv); + destv = _mm_or_si128(destv, bluev); + _mm_storeu_si128((__m128i*) & (buffer[ix]), destv); + + // then we need g5b5r6g6b6r7g7b7r8g8b8r9g9b9raga + // we can calculate the shuffle masks from previous ones => needs only 6 instead of 9 registers to handle the 9 different shuffle masks + vint tempmaskv = _mm_add_epi8(redmaskv, fivev); + redmaskv = _mm_add_epi8(bluemaskv, sixv); + bluemaskv = _mm_add_epi8(greenmaskv, fivev); + greenmaskv = tempmaskv; + destv = _mm_shuffle_epi8(red1v, redmaskv); + greenv = _mm_shuffle_epi8(green1v, greenmaskv); + destv = _mm_or_si128(destv, greenv); + bluev = _mm_shuffle_epi8(blue1v, bluemaskv); + destv = _mm_or_si128(destv, bluev); + _mm_storeu_si128((__m128i*) & (buffer[ix + 16]), destv); + + // and last one is barbgbbbrcgcbcrdgdbdregeberfgfbf + // we can calculate the shuffle masks from previous ones => needs only 6 instead of 9 registers to handle the 9 different shuffle masks + tempmaskv = _mm_add_epi8(greenmaskv, fivev); + greenmaskv = _mm_add_epi8(redmaskv, fivev); + redmaskv = _mm_add_epi8(bluemaskv, sixv); + bluemaskv = tempmaskv; + destv = _mm_shuffle_epi8(red1v, redmaskv); + greenv = _mm_shuffle_epi8(green1v, greenmaskv); + destv = _mm_or_si128(destv, greenv); + bluev = _mm_shuffle_epi8(blue1v, bluemaskv); + destv = _mm_or_si128(destv, bluev); + _mm_storeu_si128((__m128i*) & (buffer[ix + 32]), destv); + } + +#endif + + for (; i < width; i++) { buffer[ix++] = r(row, i) >> 8; buffer[ix++] = g(row, i) >> 8; buffer[ix++] = b(row, i) >> 8; @@ -80,34 +157,34 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa assert(!minValue); switch (sampleFormat) { - case (IIOSF_UNSIGNED_CHAR): { - int ix = 0; + case (IIOSF_UNSIGNED_CHAR): { + int ix = 0; - for (int i = 0; i < width; i++) { - r(row, i) = (unsigned short)(buffer[ix++]) << 8; - g(row, i) = (unsigned short)(buffer[ix++]) << 8; - b(row, i) = (unsigned short)(buffer[ix++]) << 8; + for (int i = 0; i < width; i++) { + r(row, i) = (unsigned short)(buffer[ix++]) << 8; + g(row, i) = (unsigned short)(buffer[ix++]) << 8; + b(row, i) = (unsigned short)(buffer[ix++]) << 8; + } + + break; } - break; - } + case (IIOSF_UNSIGNED_SHORT): { + unsigned short* sbuffer = (unsigned short*) buffer; + int ix = 0; - case (IIOSF_UNSIGNED_SHORT): { - unsigned short* sbuffer = (unsigned short*) buffer; - int ix = 0; + for (int i = 0; i < width; i++) { + r(row, i) = sbuffer[ix++]; + g(row, i) = sbuffer[ix++]; + b(row, i) = sbuffer[ix++]; + } - for (int i = 0; i < width; i++) { - r(row, i) = sbuffer[ix++]; - g(row, i) = sbuffer[ix++]; - b(row, i) = sbuffer[ix++]; + break; } - break; - } - - default: - // Other type are ignored, but could be implemented if necessary - break; + default: + // Other type are ignored, but could be implemented if necessary + break; } /* diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 4fa5a5a93..2c779a99b 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -41,7 +41,8 @@ #include "color.h" #include "jpeg.h" - +#define BENCHMARK +#include "StopWatch.h" using namespace std; using namespace rtengine; using namespace rtengine::procparams; @@ -917,7 +918,7 @@ int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool s int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) { - +BENCHFUN FILE *file = g_fopen_withBinaryAndLock (fname); if (!file) { @@ -1011,7 +1012,7 @@ int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) // Quality 0..100, subsampling: 1=low quality, 2=medium, 3=high int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) { - +BENCHFUN FILE *file = g_fopen_withBinaryAndLock (fname); if (!file) { @@ -1198,7 +1199,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) { - +BENCHFUN //TODO: Handling 32 bits floating point output images! bool writeOk = true; int width = getW (); From aab8bad3916cb6fba9e0da78e21693712e004d42 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 18 Jun 2016 14:04:00 +0200 Subject: [PATCH 111/232] Let the compiler optimize instead of using handwritten SSSE3 code, same speed --- rtengine/image16.cc | 117 ++++++++++---------------------------------- 1 file changed, 25 insertions(+), 92 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 56f3a4290..5f03ede9b 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -23,6 +23,29 @@ #include #include "rtengine.h" +namespace +{ + +void getScanline8 (uint16_t *red, uint16_t *green, uint16_t *blue, int width, unsigned char* buffer) +{ + for (int i = 0, ix = 0; i < width; i++) { + buffer[ix++] = red[i] >> 8; + buffer[ix++] = green[i] >> 8; + buffer[ix++] = blue[i] >> 8; + } +} + +void getScanline16 (uint16_t *red, uint16_t *green, uint16_t *blue, int width, unsigned short* buffer) +{ + for (int i = 0, ix = 0; i < width; i++) { + buffer[ix++] = red[i]; + buffer[ix++] = green[i]; + buffer[ix++] = blue[i]; + } +} + +} + using namespace rtengine; Image16::Image16 () @@ -46,99 +69,9 @@ void Image16::getScanline (int row, unsigned char* buffer, int bps) } if (bps == 16) { - int ix = 0; - unsigned short* sbuffer = (unsigned short*) buffer; - - for (int i = 0; i < width; i++) { - sbuffer[ix++] = r(row, i); - sbuffer[ix++] = g(row, i); - sbuffer[ix++] = b(row, i); - } + getScanline16 (&r(row, 0), &g(row, 0), &b(row, 0), width, (unsigned short*)buffer); } else if (bps == 8) { - int ix = 0; - int i = 0; -#ifdef __SSSE3__ - // process 48 values using SSSE3. Looks like a lot of code, but it only needs about one instruction per value, whereas scalar version needs about five instructions per value - vmask reduceWord2Bytev = _mm_set_epi8(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 15, 13, 11, 9, 7, 5, 3, 1); - // we need fivev and sixv to reduce the number of registers used for permutation masks from 9 to 6 - vint fivev = _mm_set1_epi8(5); - vint sixv = _mm_set1_epi8(6); - - for (; i < width - 15; i += 16, ix += 48) { - // generate initial shuffle masks. Gaps are set to 0xf0 to allow calculating subsequent masks from previous ones - vint redmaskv = _mm_set_epi8(5, 0xf0, 0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0); - vint greenmaskv = _mm_set_epi8(0xf0, 0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0, 0xf0); - vint bluemaskv = _mm_set_epi8(0xf0, 4, 0xf0, 0xf0, 3, 0xf0, 0xf0, 2, 0xf0, 0xf0, 1, 0xf0, 0xf0, 0, 0xf0, 0xf0); - - // load first 8 values for each colour - vint red1v = _mm_loadu_si128((__m128i*)&r(row, i)); - vint green1v = _mm_loadu_si128((__m128i*)&g(row, i)); - vint blue1v = _mm_loadu_si128((__m128i*)&b(row, i)); - - // load second 8 values for each colour - vint red2v = _mm_loadu_si128((__m128i*)&r(row, i + 8)); - vint green2v = _mm_loadu_si128((__m128i*)&g(row, i + 8)); - vint blue2v = _mm_loadu_si128((__m128i*)&b(row, i + 8)); - - // shuffle the high bytes of the values to the lower 64 bit of the register - red1v = _mm_shuffle_epi8(red1v, reduceWord2Bytev); - green1v = _mm_shuffle_epi8(green1v, reduceWord2Bytev); - blue1v = _mm_shuffle_epi8(blue1v, reduceWord2Bytev); - - // shuffle the high bytes of the values to the lower 64 bit of the register - red2v = _mm_shuffle_epi8(red2v, reduceWord2Bytev); - green2v = _mm_shuffle_epi8(green2v, reduceWord2Bytev); - blue2v = _mm_shuffle_epi8(blue2v, reduceWord2Bytev); - - // mix first and second 8 values of each colour together - red1v = (vint)_mm_shuffle_pd((__m128d)red1v, (__m128d)red2v, 0); - green1v = (vint)_mm_shuffle_pd((__m128d)green1v, (__m128d)green2v, 0); - blue1v = (vint)_mm_shuffle_pd((__m128d)blue1v, (__m128d)blue2v, 0); - - // now we have the input in registers => let's generate the output - - // first we need r0g0b0r1g1b1r2g2b2r3g3b3r4g4b4r5 - vint destv = _mm_shuffle_epi8(red1v, redmaskv); - vint greenv = _mm_shuffle_epi8(green1v, greenmaskv); - destv = _mm_or_si128(destv, greenv); - vint bluev = _mm_shuffle_epi8(blue1v, bluemaskv); - destv = _mm_or_si128(destv, bluev); - _mm_storeu_si128((__m128i*) & (buffer[ix]), destv); - - // then we need g5b5r6g6b6r7g7b7r8g8b8r9g9b9raga - // we can calculate the shuffle masks from previous ones => needs only 6 instead of 9 registers to handle the 9 different shuffle masks - vint tempmaskv = _mm_add_epi8(redmaskv, fivev); - redmaskv = _mm_add_epi8(bluemaskv, sixv); - bluemaskv = _mm_add_epi8(greenmaskv, fivev); - greenmaskv = tempmaskv; - destv = _mm_shuffle_epi8(red1v, redmaskv); - greenv = _mm_shuffle_epi8(green1v, greenmaskv); - destv = _mm_or_si128(destv, greenv); - bluev = _mm_shuffle_epi8(blue1v, bluemaskv); - destv = _mm_or_si128(destv, bluev); - _mm_storeu_si128((__m128i*) & (buffer[ix + 16]), destv); - - // and last one is barbgbbbrcgcbcrdgdbdregeberfgfbf - // we can calculate the shuffle masks from previous ones => needs only 6 instead of 9 registers to handle the 9 different shuffle masks - tempmaskv = _mm_add_epi8(greenmaskv, fivev); - greenmaskv = _mm_add_epi8(redmaskv, fivev); - redmaskv = _mm_add_epi8(bluemaskv, sixv); - bluemaskv = tempmaskv; - destv = _mm_shuffle_epi8(red1v, redmaskv); - greenv = _mm_shuffle_epi8(green1v, greenmaskv); - destv = _mm_or_si128(destv, greenv); - bluev = _mm_shuffle_epi8(blue1v, bluemaskv); - destv = _mm_or_si128(destv, bluev); - _mm_storeu_si128((__m128i*) & (buffer[ix + 32]), destv); - } - -#endif - - for (; i < width; i++) { - buffer[ix++] = r(row, i) >> 8; - buffer[ix++] = g(row, i) >> 8; - buffer[ix++] = b(row, i) >> 8; - } + getScanline8 (&r(row, 0), &g(row, 0), &b(row, 0), width, buffer); } } From e4a7287650de4010905e285c27a90e48660345fd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 18 Jun 2016 16:04:54 +0200 Subject: [PATCH 112/232] Removed StopWatches and cleaned code --- rtengine/image16.cc | 17 ++++++++--------- rtengine/imageio.cc | 16 +++++++++------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 5f03ede9b..937e2d19d 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -19,14 +19,13 @@ #include "image16.h" #include "imagefloat.h" #include "image8.h" -#include #include #include "rtengine.h" namespace { -void getScanline8 (uint16_t *red, uint16_t *green, uint16_t *blue, int width, unsigned char* buffer) +void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) { for (int i = 0, ix = 0; i < width; i++) { buffer[ix++] = red[i] >> 8; @@ -35,7 +34,7 @@ void getScanline8 (uint16_t *red, uint16_t *green, uint16_t *blue, int width, un } } -void getScanline16 (uint16_t *red, uint16_t *green, uint16_t *blue, int width, unsigned short* buffer) +void getScanline16 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned short* buffer) { for (int i = 0, ix = 0; i < width; i++) { buffer[ix++] = red[i]; @@ -64,14 +63,14 @@ Image16::~Image16 () void Image16::getScanline (int row, unsigned char* buffer, int bps) { - if (data == NULL) { + if (data == nullptr) { return; } if (bps == 16) { - getScanline16 (&r(row, 0), &g(row, 0), &b(row, 0), width, (unsigned short*)buffer); + getScanline16 (r(row), g(row), b(row), width, (unsigned short*)buffer); } else if (bps == 8) { - getScanline8 (&r(row, 0), &g(row, 0), &b(row, 0), width, buffer); + getScanline8 (r(row), g(row), b(row), width, buffer); } } @@ -82,11 +81,11 @@ void Image16::getScanline (int row, unsigned char* buffer, int bps) void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) { - if (data == NULL) { + if (data == nullptr) { return; } - // For optimization purpose, we're assuming that this class never have to provide min/max bound + // For optimization purpose, we're assuming that this class never has to provide min/max bounds assert(!minValue); switch (sampleFormat) { @@ -116,7 +115,7 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa } default: - // Other type are ignored, but could be implemented if necessary + // Other types are ignored, but could be implemented if necessary break; } diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 2c779a99b..3ad8faee0 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -41,8 +41,7 @@ #include "color.h" #include "jpeg.h" -#define BENCHMARK -#include "StopWatch.h" + using namespace std; using namespace rtengine; using namespace rtengine::procparams; @@ -62,6 +61,7 @@ FILE* g_fopen_withBinaryAndLock(const Glib::ustring& fname) std::unique_ptr wfname (reinterpret_cast(g_utf8_to_utf16 (fname.c_str (), -1, NULL, NULL, NULL)), g_free); HANDLE hFile = CreateFileW ( wfname.get (), GENERIC_READ | GENERIC_WRITE, 0 /* no sharing allowed */, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { f = _fdopen (_open_osfhandle ((intptr_t)hFile, 0), "wb"); } @@ -918,7 +918,7 @@ int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool s int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) { -BENCHFUN + FILE *file = g_fopen_withBinaryAndLock (fname); if (!file) { @@ -1012,7 +1012,7 @@ BENCHFUN // Quality 0..100, subsampling: 1=low quality, 2=medium, 3=high int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) { -BENCHFUN + FILE *file = g_fopen_withBinaryAndLock (fname); if (!file) { @@ -1199,7 +1199,7 @@ BENCHFUN int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) { -BENCHFUN + //TODO: Handling 32 bits floating point output images! bool writeOk = true; int width = getW (); @@ -1228,9 +1228,11 @@ BENCHFUN // buffer for the exif and iptc int bufferSize = 165535; //TODO: Is it really 165535... or 65535 ? - if(profileData) + + if(profileData) { bufferSize += profileLength; - + } + unsigned char* buffer = new unsigned char[bufferSize]; unsigned char* iptcdata = NULL; unsigned int iptclen = 0; From 0189a99e1c12b7e52b907e60724c932087feeca0 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 19 Jun 2016 17:02:07 +0200 Subject: [PATCH 113/232] Updated all lens interpreters with data from exiftool-10.20 --- rtexif/canonattribs.cc | 48 ++++++++++++++++++------- rtexif/nikonattribs.cc | 33 ++++++++++++++--- rtexif/olympusattribs.cc | 6 ++++ rtexif/pentaxattribs.cc | 9 ++++- rtexif/sonyminoltaattribs.cc | 68 ++++++++++++++++++++++++++++++------ 5 files changed, 136 insertions(+), 28 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 981798732..edacb214e 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -593,6 +593,8 @@ public: choices.insert(p_t(44, "Canon EF 90-300mm f/4.5-5.6")); choices.insert(p_t(45, "Canon EF-S 18-55mm f/3.5-5.6 [II]")); choices.insert(p_t(46, "Canon EF 28-90mm f/4-5.6")); + choices.insert(p_t(47, "Zeiss Milvus 35mm f/2 or 50mm f/2")); + choices.insert(p_t(47, "Zeiss Milvus 50mm f/2 Makro")); choices.insert(p_t(48, "Canon EF-S 18-55mm f/3.5-5.6 IS")); choices.insert(p_t(49, "Canon EF-S 55-250mm f/4-5.6 IS")); choices.insert(p_t(50, "Canon EF-S 18-200mm f/3.5-5.6 IS")); @@ -626,9 +628,9 @@ public: choices.insert(p_t(137, "Sigma 18-250mm f/3.5-6.3 DC OS HSM")); choices.insert(p_t(137, "Sigma 24-70mm f/2.8 IF EX DG HSM")); choices.insert(p_t(137, "Sigma 18-125mm f/3.8-5.6 DC OS HSM")); - choices.insert(p_t(137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM")); + choices.insert(p_t(137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C")); choices.insert(p_t(137, "Sigma 17-50mm f/2.8 OS HSM")); - choices.insert(p_t(137, "Sigma 18-200mm f/3.5-6.3 II DC OS HSM")); + choices.insert(p_t(137, "Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]")); choices.insert(p_t(137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD")); choices.insert(p_t(137, "Sigma 8-16mm f/4.5-5.6 DC HSM")); choices.insert(p_t(137, "Tamron SP 17-50mm f/2.8 XR Di II VC")); @@ -642,7 +644,8 @@ public: choices.insert(p_t(140, "Canon EF 500mm f/4.5L")); choices.insert(p_t(141, "Canon EF 500mm f/4.5L")); choices.insert(p_t(142, "Canon EF 300mm f/2.8L IS")); - choices.insert(p_t(143, "Canon EF 500mm f/4L IS")); + choices.insert(p_t(143, "Canon EF 500mm f/4L IS or Sigma Lens")); + choices.insert(p_t(143, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM")); choices.insert(p_t(144, "Canon EF 35-135mm f/4-5.6 USM")); choices.insert(p_t(145, "Canon EF 100-300mm f/4.5-5.6 USM")); choices.insert(p_t(146, "Canon EF 70-210mm f/3.5-4.5 USM")); @@ -665,15 +668,18 @@ public: choices.insert(p_t(153, "Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro")); choices.insert(p_t(153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14")); choices.insert(p_t(153, "Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro")); - choices.insert(p_t(154, "Canon EF 20mm f/2.8 USM")); + choices.insert(p_t(154, "Canon EF 20mm f/2.8 USM or Zeiss Lens")); + choices.insert(p_t(154, "Zeiss Milvus 21mm f/2.8")); choices.insert(p_t(155, "Canon EF 85mm f/1.8 USM")); choices.insert(p_t(156, "Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens")); choices.insert(p_t(156, "Tamron SP 70-300mm f/4.0-5.6 Di VC USD")); + choices.insert(p_t(156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF")); choices.insert(p_t(160, "Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens")); choices.insert(p_t(160, "Tamron AF 19-35mm f/3.5-4.5")); choices.insert(p_t(160, "Tokina AT-X 124 AF Pro DX 12-24mm f/4")); choices.insert(p_t(160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye")); choices.insert(p_t(160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8")); + choices.insert(p_t(160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8")); choices.insert(p_t(161, "Canon EF 28-70mm f/2.8L or Sigma or Tamron Lens")); choices.insert(p_t(161, "Sigma 24-70mm f/2.8 EX")); choices.insert(p_t(161, "Sigma 28-70mm f/2.8 EX")); @@ -688,7 +694,8 @@ public: choices.insert(p_t(165, "Canon EF 70-200mm f/2.8 L")); choices.insert(p_t(166, "Canon EF 70-200mm f/2.8 L + 1.4x")); choices.insert(p_t(167, "Canon EF 70-200mm f/2.8 L + 2x")); - choices.insert(p_t(168, "Canon EF 28mm f/1.8 USM")); + choices.insert(p_t(168, "Canon EF 28mm f/1.8 USM or Sigma Lens")); + choices.insert(p_t(168, "Sigma 50-100mm f/1.8 DC HSM | A")); choices.insert(p_t(169, "Canon EF 17-35mm f/2.8L or Sigma Lens")); choices.insert(p_t(169, "Sigma 18-200mm f/3.5-6.3 DC OS")); choices.insert(p_t(169, "Sigma 15-30mm f/3.5-4.5 EX DG Aspherical")); @@ -704,25 +711,32 @@ public: choices.insert(p_t(173, "Canon EF 180mm Macro f/3.5L or Sigma Lens")); choices.insert(p_t(173, "Sigma 180mm EX HSM Macro f/3.5")); choices.insert(p_t(173, "Sigma APO Macro 150mm f/2.8 EX DG HSM")); - choices.insert(p_t(174, "Canon EF 135mm f/2L or Sigma Lens")); + choices.insert(p_t(174, "Canon EF 135mm f/2L or Other Lens")); choices.insert(p_t(174, "Sigma 70-200mm f/2.8 EX DG APO OS HSM")); choices.insert(p_t(174, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM")); choices.insert(p_t(174, "Sigma 150-500mm f/5-6.3 APO DG OS HSM")); + choices.insert(p_t(174, "Zeiss Milvus 100mm f/2 Makro")); choices.insert(p_t(175, "Canon EF 400mm f/2.8L")); choices.insert(p_t(176, "Canon EF 24-85mm f/3.5-4.5 USM")); choices.insert(p_t(177, "Canon EF 300mm f/4L IS")); choices.insert(p_t(178, "Canon EF 28-135mm f/3.5-5.6 IS")); choices.insert(p_t(179, "Canon EF 24mm f/1.4L")); - choices.insert(p_t(180, "Canon EF 35mm f/1.4L or Sigma Lens")); + choices.insert(p_t(180, "Canon EF 35mm f/1.4L or Other Lens")); choices.insert(p_t(180, "Sigma 50mm f/1.4 DG HSM | A")); choices.insert(p_t(180, "Sigma 24mm f/1.4 DG HSM | A")); - choices.insert(p_t(181, "Canon EF 100-400mm f/4.5-5.6L IS + 1.4x")); - choices.insert(p_t(182, "Canon EF 100-400mm f/4.5-5.6L IS + 2x")); + choices.insert(p_t(180, "Zeiss Milvus 50mm f/1.4")); + choices.insert(p_t(180, "Zeiss Milvus 85mm f/1.4")); + choices.insert(p_t(180, "Zeiss Otus 28mm f/1.4 ZE")); + choices.insert(p_t(181, "Canon EF 100-400mm f/4.5-5.6L IS + 1.4x or Sigma Lens")); + choices.insert(p_t(181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x")); + choices.insert(p_t(182, "Canon EF 100-400mm f/4.5-5.6L IS + 2x or Sigma Lens")); + choices.insert(p_t(182, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x")); choices.insert(p_t(183, "Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens")); choices.insert(p_t(183, "Sigma 150mm f/2.8 EX DG OS HSM APO Macro")); choices.insert(p_t(183, "Sigma 105mm f/2.8 EX DG OS HSM Macro")); choices.insert(p_t(183, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro")); choices.insert(p_t(183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C")); + choices.insert(p_t(183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S")); choices.insert(p_t(184, "Canon EF 400mm f/2.8L + 2x")); choices.insert(p_t(185, "Canon EF 600mm f/4L IS")); choices.insert(p_t(186, "Canon EF 70-200mm f/4L")); @@ -751,6 +765,8 @@ public: choices.insert(p_t(213, "Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens")); choices.insert(p_t(213, "Tamron SP 150-600mm f/5-6.3 Di VC USD")); choices.insert(p_t(213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro")); + choices.insert(p_t(213, "Tamron SP 35mm f/1.8 Di VC USD")); + choices.insert(p_t(213, "Tamron SP 45mm f/1.8 Di VC USD")); choices.insert(p_t(214, "Canon EF-S 18-55mm f/3.5-5.6 USM")); choices.insert(p_t(215, "Canon EF 55-200mm f/4.5-5.6 II USM")); choices.insert(p_t(217, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD")); @@ -765,7 +781,7 @@ public: choices.insert(p_t(232, "Canon EF 70-300mm f/4.5-5.6 DO IS USM")); choices.insert(p_t(233, "Canon EF 28-300mm f/3.5-5.6L IS")); choices.insert(p_t(234, "Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens")); - choices.insert(p_t(234, "Tokina AT-X 12-28mm f/4 PRO DX")); + choices.insert(p_t(234, "Tokina AT-X 12-28 PRO DX 12-28mm f/4")); choices.insert(p_t(235, "Canon EF-S 10-22mm f/3.5-4.5 USM")); choices.insert(p_t(236, "Canon EF-S 60mm f/2.8 Macro USM")); choices.insert(p_t(237, "Canon EF 24-105mm f/4L IS")); @@ -779,9 +795,11 @@ public: choices.insert(p_t(245, "Canon EF 70-200mm f/4L IS + 2.8x")); choices.insert(p_t(246, "Canon EF 16-35mm f/2.8L II")); choices.insert(p_t(247, "Canon EF 14mm f/2.8L II USM")); - choices.insert(p_t(248, "Canon EF 200mm f/2L IS")); + choices.insert(p_t(248, "Canon EF 200mm f/2L IS or Sigma Lens")); + choices.insert(p_t(248, "Sigma 24-35mm f/2 DG HSM | A")); choices.insert(p_t(249, "Canon EF 800mm f/5.6L IS")); - choices.insert(p_t(250, "Canon EF 24 f/1.4L II")); + choices.insert(p_t(250, "Canon EF 24mm f/1.4L II or Sigma Lens")); + choices.insert(p_t(250, "Sigma 20mm f/1.4 DG HSM | A")); choices.insert(p_t(251, "Canon EF 70-200mm f/2.8L IS II USM")); choices.insert(p_t(252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x")); choices.insert(p_t(253, "Canon EF 70-200mm f/2.8L IS II USM + 2x")); @@ -807,6 +825,8 @@ public: choices.insert(p_t(507, "Canon EF 16-35mm f/4L IS USM")); choices.insert(p_t(508, "Canon EF 11-24mm f/4L USM")); choices.insert(p_t(747, "Canon EF 100-400mm f/4.5-5.6L IS II USM")); + choices.insert(p_t(748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x")); + choices.insert(p_t(750, "Canon EF 35mm f/1.4L II USM")); choices.insert(p_t(4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM")); choices.insert(p_t(4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens")); choices.insert(p_t(4143, "Tamron 18-200mm f/3.5-6.3 Di III VC")); @@ -818,8 +838,12 @@ public: choices.insert(p_t(4149, "Canon EF-M 55-200mm f/4.5-6.3 IS STM")); choices.insert(p_t(4150, "Canon EF-S 10-18mm f/4.5-5.6 IS STM")); choices.insert(p_t(4152, "Canon EF 24-105mm f/3.5-5.6 IS STM")); + choices.insert(p_t(4153, "Canon EF-M 15-45mm f/3.5-6.3 IS STM")); choices.insert(p_t(4154, "Canon EF-S 24mm f/2.8 STM")); + choices.insert(p_t(4155, "Canon EF-M 28mm f/3.5 Macro IS STM ")); choices.insert(p_t(4156, "Canon EF 50mm f/1.8 STM")); + choices.insert(p_t(36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM")); + choices.insert(p_t(65535, "n/a")); } virtual std::string toString (Tag* t) diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index facb13a36..db55725fa 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -329,6 +329,8 @@ public: lenses["00 00 48 48 53 53 00 01"] = "Loreo 40mm f/11-22 3D Lens in a Cap 9005"; lenses["00 36 1C 2D 34 3C 00 06"] = "Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)"; lenses["00 3C 1F 37 30 30 00 06"] = "Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)"; + lenses["00 3C 2B 44 30 30 00 06"] = "Tokina AT-X 17-35 f/4 PRO FX (AF 17-35mm f/4)"; + lenses["00 3C 5C 80 30 30 00 0E"] = "Tokina AT-X 70-200 f/4 FX VCM-S (AF 70-200mm f/4)"; lenses["00 3E 80 A0 38 3F 00 02"] = "Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)"; lenses["00 3F 2D 80 2B 40 00 06"] = "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)"; lenses["00 3F 2D 80 2C 40 00 06"] = "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)"; @@ -354,10 +356,13 @@ public: lenses["00 48 29 3C 24 24 00 06"] = "Tokina AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)"; lenses["00 48 29 50 24 24 00 06"] = "Tokina AT-X 165 PRO DX (AF 16-50mm f/2.8)"; lenses["00 48 32 32 24 24 00 00"] = "Carl Zeiss Distagon T* 2.8/21 ZF.2"; + lenses["00 48 37 5C 24 24 00 06"] = "Tokina AT-X 24-70 f/2.8 PRO FX (AF 24-70mm f/2.8)"; + lenses["00 48 3C 3C 24 24 00 00"] = "Voigtlander Color Skopar 28mm f/2.8 SL II"; lenses["00 48 3C 60 24 24 00 02"] = "Tokina AT-X 280 AF PRO (AF 28-80mm f/2.8)"; lenses["00 48 3C 6A 24 24 00 02"] = "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)"; lenses["00 48 50 50 18 18 00 00"] = "Nikkor H 50mm f/2"; lenses["00 48 50 72 24 24 00 06"] = "Tokina AT-X 535 PRO DX (AF 50-135mm f/2.8)"; + lenses["00 48 5C 80 30 30 00 0E"] = "Tokina AT-X 70-200 f/4 FX VCM-S (AF 70-200mm f/4)"; lenses["00 48 5C 8E 30 3C 00 06"] = "Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)"; lenses["00 48 68 68 24 24 00 00"] = "Series E 100mm f/2.8"; lenses["00 48 80 80 30 30 00 00"] = "Nikkor 200mm f/4 AiS"; @@ -367,7 +372,7 @@ public: lenses["00 53 2B 50 24 24 00 06"] = "Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)"; lenses["00 54 2B 50 24 24 00 06"] = "Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)"; lenses["00 54 3C 3C 18 18 00 00"] = "Carl Zeiss Distagon T* 2/28 ZF.2"; - lenses["00 54 44 44 0C 0C 00 00"] = "Nikkor 35mm f/1.4 AiS"; + lenses["00 54 44 44 0C 0C 00 00"] = "Carl Zeiss Distagon T* 1.4/35 ZF.2"; lenses["00 54 44 44 18 18 00 00"] = "Carl Zeiss Distagon T* 2/35 ZF.2"; lenses["00 54 48 48 18 18 00 00"] = "Voigtlander Ultron 40mm f/2 SLII Aspherical"; lenses["00 54 50 50 0C 0C 00 00"] = "Carl Zeiss Planar T* 1.4/50 ZF.2"; @@ -378,11 +383,13 @@ public: lenses["00 54 62 62 0C 0C 00 00"] = "Carl Zeiss Planar T* 1.4/85 ZF.2"; lenses["00 54 68 68 18 18 00 00"] = "Carl Zeiss Makro-Planar T* 2/100 ZF.2"; lenses["00 54 68 68 24 24 00 02"] = "Tokina AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)"; + lenses["00 54 72 72 18 18 00 00"] = "Carl Zeiss Apo Sonnar T* 2/135 ZF.2"; lenses["00 54 8E 8E 24 24 00 02"] = "Tokina AT-X 300 AF PRO (AF 300mm f/2.8)"; lenses["00 57 50 50 14 14 00 00"] = "Nikkor 50mm f/1.8 AI"; lenses["00 58 64 64 20 20 00 00"] = "Soligor C/D Macro MC 90mm f/2.5"; lenses["01 00 00 00 00 00 02 00"] = "TC-16A"; lenses["01 00 00 00 00 00 08 00"] = "TC-16A"; + lenses["01 54 62 62 0C 0C 00 00"] = "Zeiss Otus 1.4/85"; lenses["01 58 50 50 14 14 02 00"] = "AF Nikkor 50mm f/1.8"; lenses["01 58 50 50 14 14 05 00"] = "AF Nikkor 50mm f/1.8"; lenses["02 2F 98 98 3D 3D 02 00"] = "Sigma APO 400mm f/5.6"; @@ -611,12 +618,17 @@ public: lenses["4E 48 72 72 18 18 51 02"] = "AF DC-Nikkor 135mm f/2D"; lenses["4F 40 37 5C 2C 3C 53 06"] = "IX-Nikkor 24-70mm f/3.5-5.6"; lenses["50 48 56 7C 30 3C 54 06"] = "IX-Nikkor 60-180mm f/4-5.6"; + lenses["52 54 44 44 18 18 00 00"] = "Zeiss Milvus 35mm f/2"; lenses["53 48 60 80 24 24 57 02"] = "AF Zoom-Nikkor 80-200mm f/2.8D ED"; lenses["53 48 60 80 24 24 60 02"] = "AF Zoom-Nikkor 80-200mm f/2.8D ED"; + lenses["53 54 50 50 0C 0C 00 00"] = "Zeiss Milvus 50mm f/1.4"; lenses["54 44 5C 7C 34 3C 58 02"] = "AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED"; lenses["54 44 5C 7C 34 3C 61 02"] = "AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED"; + lenses["54 54 50 50 18 18 00 00"] = "Zeiss Milvus 50mm f/2 Macro"; + lenses["55 54 62 62 0C 0C 00 00"] = "Zeiss Milvus 85mm f/1.4"; lenses["56 3C 5C 8E 30 3C 1C 02"] = "Sigma 70-300mm f/4-5.6 APO Macro Super II"; lenses["56 48 5C 8E 30 3C 5A 02"] = "AF Zoom-Nikkor 70-300mm f/4-5.6D ED"; + lenses["56 54 68 68 18 18 00 00"] = "Zeiss Milvus 100mm f/2 Macro"; lenses["59 48 98 98 24 24 5D 02"] = "AF-S Nikkor 400mm f/2.8D IF-ED"; lenses["59 48 98 98 24 24 E1 02"] = "AF-S Nikkor 400mm f/2.8D IF-ED + TC-17E"; lenses["59 48 98 98 24 24 F1 02"] = "AF-S Nikkor 400mm f/2.8D IF-ED + TC-14E"; @@ -664,6 +676,7 @@ public: lenses["7A 47 2B 5C 24 34 4B 06"] = "Sigma 17-70mm f/2.8-4.5 DC Macro Asp. IF HSM"; lenses["7A 47 50 76 24 24 4B 06"] = "Sigma 50-150mm f/2.8 EX APO DC HSM"; lenses["7A 48 1C 29 24 24 7E 06"] = "Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)"; + lenses["7A 48 1C 30 24 24 7E 06"] = "Tokina AT-X 11-20 f/2.8 PRO DX (AF 11-20mm f/2.8)"; lenses["7A 48 2B 5C 24 34 4B 06"] = "Sigma 17-70mm f/2.8-4.5 DC Macro Asp. IF HSM"; lenses["7A 48 2D 50 24 24 4B 06"] = "Sigma 18-50mm f/2.8 EX DC Macro"; lenses["7A 48 5C 80 24 24 4B 06"] = "Sigma 70-200mm f/2.8 EX APO DG Macro HSM II"; @@ -676,6 +689,7 @@ public: lenses["80 48 1A 1A 24 24 85 06"] = "AF DX Fisheye-Nikkor 10.5mm f/2.8G ED"; lenses["81 34 76 A6 38 40 4B 0E"] = "Sigma 150-600mm f/5-6.3 DG OS HSM | S"; lenses["81 54 80 80 18 18 86 0E"] = "AF-S VR Nikkor 200mm f/2G IF-ED"; + lenses["82 34 76 A6 38 40 4B 0E"] = "Sigma 150-600mm f/5-6.3 DG OS HSM | C"; lenses["82 48 8E 8E 24 24 87 0E"] = "AF-S VR Nikkor 300mm f/2.8G IF-ED"; lenses["83 00 B0 B0 5A 5A 88 04"] = "FSA-L2, EDG 65, 800mm f/13 G"; lenses["88 54 50 50 0C 0C 4B 06"] = "Sigma 50mm f/1.4 DG HSM | A"; @@ -687,7 +701,7 @@ public: lenses["8B 4C 2D 44 14 14 4B 06"] = "Sigma 18-35mm f/1.8 DC HSM"; lenses["8C 40 2D 53 2C 3C 8E 06"] = "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED"; lenses["8D 44 5C 8E 34 3C 8F 0E"] = "AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED"; - lenses["8E 3C 2B 5C 24 30 4B 0E"] = "Sigma 17-70mm f/2.8-4 DC Macro OS HSM Contemporary"; + lenses["8E 3C 2B 5C 24 30 4B 0E"] = "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"; lenses["8F 40 2D 72 2C 3C 91 06"] = "AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED"; lenses["8F 48 2B 50 24 24 4B 0E"] = "Sigma 17-50mm f/2.8 EX DC OS HSM"; lenses["90 3B 53 80 30 3C 92 0E"] = "AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED"; @@ -726,7 +740,7 @@ public: lenses["A1 40 18 37 2C 34 A3 06"] = "AF-S DX Nikkor 10-24mm f/3.5-4.5G ED"; lenses["A1 41 19 31 2C 2C 4B 06"] = "Sigma 10-20mm f/3.5 EX DC HSM"; lenses["A1 54 55 55 0C 0C BC 06"] = "AF-S Nikkor 58mm f/1.4G"; - lenses["A2 40 2D 53 2C 3C BD 0E"] = "AF-S DX VR Nikkor 18-55mm f/3.5-5.6G II"; + lenses["A2 40 2D 53 2C 3C BD 0E"] = "AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II"; lenses["A2 48 5C 80 24 24 A4 0E"] = "AF-S Nikkor 70-200mm f/2.8G ED VR II"; lenses["A3 3C 29 44 30 30 A5 0E"] = "AF-S Nikkor 16-35mm f/4G ED VR"; lenses["A3 3C 5C 8E 30 3C 4B 0E"] = "Sigma 70-300mm f/4-5.6 DG OS"; @@ -735,9 +749,10 @@ public: lenses["A4 54 37 37 0C 0C A6 06"] = "AF-S Nikkor 24mm f/1.4G ED"; lenses["A5 40 2D 88 2C 40 4B 0E"] = "Sigma 18-250mm f/3.5-6.3 DC OS HSM"; lenses["A5 40 3C 8E 2C 3C A7 0E"] = "AF-S Nikkor 28-300mm f/3.5-5.6G ED VR"; - lenses["A5 4C 44 44 14 14 C0 06"] = "AF-S Nikkor 35mm f/1.8G"; + lenses["A5 4C 44 44 14 14 C0 06"] = "AF-S Nikkor 35mm f/1.8G ED"; lenses["A6 48 37 5C 24 24 4B 06"] = "Sigma 24-70mm f/2.8 IF EX DG HSM"; lenses["A6 48 8E 8E 24 24 A8 0E"] = "AF-S VR Nikkor 300mm f/2.8G IF-ED II"; + lenses["A6 48 98 98 24 24 C1 0E"] = "AF-S Nikkor 400mm f/2.8E FL ED VR"; lenses["A7 3C 53 80 30 3C C2 0E"] = "AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II"; lenses["A7 49 80 A0 24 24 4B 06"] = "Sigma APO 200-500mm f/2.8 EX DG"; lenses["A7 4B 62 62 2C 2C A9 0E"] = "AF-S DX Micro Nikkor 85mm f/3.5G ED VR"; @@ -748,9 +763,16 @@ public: lenses["A9 54 80 80 18 18 AB 0E"] = "AF-S Nikkor 200mm f/2G ED VR II"; lenses["AA 3C 37 6E 30 30 AC 0E"] = "AF-S Nikkor 24-120mm f/4G ED VR"; lenses["AA 48 37 5C 24 24 C5 4E"] = "AF-S Nikkor 24-70mm f/2.8E ED VR"; + lenses["AB 3C A0 A0 30 30 C6 4E"] = "AF-S Nikkor 500mm f/4E FL ED VR"; lenses["AC 38 53 8E 34 3C AE 0E"] = "AF-S DX VR Nikkor 55-300mm f/4.5-5.6G ED"; + lenses["AC 3C A6 A6 30 30 C7 4E"] = "AF-S Nikkor 600mm f/4E FL ED VR"; lenses["AD 3C 2D 8E 2C 3C AF 0E"] = "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"; + lenses["AD 48 28 60 24 30 C8 0E"] = "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"; + lenses["AD 48 28 60 24 30 C8 4E"] = "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"; + lenses["AE 3C 80 A0 3C 3C C9 0E"] = "AF-S Nikkor 200-500mm f/5.6E ED VR"; + lenses["AE 3C 80 A0 3C 3C C9 4E"] = "AF-S Nikkor 200-500mm f/5.6E ED VR"; lenses["AE 54 62 62 0C 0C B0 06"] = "AF-S Nikkor 85mm f/1.4G"; + lenses["AF 4C 37 37 14 14 CC 06"] = "AF-S Nikkor 24mm f/1.8G ED"; lenses["AF 54 44 44 0C 0C B1 06"] = "AF-S Nikkor 35mm f/1.4G"; lenses["B0 4C 50 50 14 14 B2 06"] = "AF-S Nikkor 50mm f/1.8G"; lenses["B1 48 48 48 24 24 B3 06"] = "AF-S DX Micro Nikkor 40mm f/2.8G"; @@ -758,9 +780,11 @@ public: lenses["B3 4C 62 62 14 14 B5 06"] = "AF-S Nikkor 85mm f/1.8G"; lenses["B4 40 37 62 2C 34 B6 0E"] = "AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"; lenses["B5 4C 3C 3C 14 14 B7 06"] = "AF-S Nikkor 28mm f/1.8G"; + lenses["B6 3C B0 B0 3C 3C B8 0E"] = "AF-S VR Nikkor 800mm f/5.6E FL ED"; lenses["B6 48 37 56 24 24 1C 02"] = "Sigma 24-60mm f/2.8 EX DG"; lenses["B7 44 60 98 34 3C B9 0E"] = "AF-S Nikkor 80-400mm f/4.5-5.6G ED VR"; lenses["B8 40 2D 44 2C 34 BA 06"] = "AF-S Nikkor 18-35mm f/3.5-4.5G ED"; + lenses["CC 4C 50 68 14 14 4B 06"] = "Sigma 50-100mm f/1.8 DC HSM | A"; lenses["CD 3D 2D 70 2E 3C 4B 0E"] = "Sigma 18-125mm f/3.8-5.6 DC OS HSM"; lenses["CE 34 76 A0 38 40 4B 0E"] = "Sigma 150-500mm f/5-6.3 DG OS APO HSM"; lenses["CF 38 6E 98 34 3C 4B 0E"] = "Sigma APO 120-400mm f/4.5-5.6 DG OS HSM"; @@ -771,6 +795,7 @@ public: lenses["E3 54 50 50 24 24 35 02"] = "Sigma Macro 50mm f/2.8 EX DG"; lenses["E5 54 6A 6A 24 24 35 02"] = "Sigma Macro 105mm f/2.8 EX DG"; lenses["E6 41 3C 8E 2C 40 1C 02"] = "Sigma 28-300mm f/3.5-6.3 DG Macro"; + lenses["E8 4C 44 44 14 14 DF 0E"] = "Tamron SP 35mm f/1.8 VC"; lenses["E9 48 27 3E 24 24 DF 0E"] = "Tamron SP 15-30mm f/2.8 Di VC USD (A012)"; lenses["E9 54 37 5C 24 24 1C 02"] = "Sigma 24-70mm f/2.8 EX DG Macro"; lenses["EA 40 29 8E 2C 40 DF 0E"] = "Tamron AF 16-300mm f/3.5-6.3 Di II VC PZD (B016)"; diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index 8ec17b90a..608b04cfe 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -120,6 +120,7 @@ public: lenses["00 23 00"] = "Olympus Zuiko Digital ED 14-42mm f/3.5-5.6"; lenses["00 23 10"] = "Olympus M.Zuiko Digital ED 7-14mm f/2.8 Pro"; lenses["00 24 00"] = "Olympus Zuiko Digital ED 40-150mm f/4.0-5.6"; + lenses["00 24 10"] = "Olympus M.Zuiko Digital ED 300mm f/4.0 IS Pro"; lenses["00 25 10"] = "Olympus M.Zuiko Digital ED 8mm f/1.8 Fisheye Pro"; lenses["00 30 00"] = "Olympus Zuiko Digital ED 50-200mm f/2.8-3.5 SWD"; lenses["00 31 00"] = "Olympus Zuiko Digital ED 12-60mm f/2.8-4.0 SWD"; @@ -138,6 +139,7 @@ public: lenses["01 05 00"] = "Sigma 30mm f/1.4 EX DC HSM"; lenses["01 05 10"] = "Sigma 60mm f/2.8 DN | A"; lenses["01 06 00"] = "Sigma APO 50-500mm f/4.0-6.3 EX DG HSM"; + lenses["01 06 10"] = "Sigma 30mm f/1.4 DC DN | C"; lenses["01 07 00"] = "Sigma Macro 105mm f/2.8 EX DG"; lenses["01 08 00"] = "Sigma APO Macro 150mm f/2.8 EX DG HSM"; lenses["01 09 00"] = "Sigma 18-50mm f/2.8 EX DC Macro"; @@ -176,8 +178,12 @@ public: lenses["02 20 10"] = "Lumix G Vario 12-32mm f/3.5-5.6 Asph. Mega OIS"; lenses["02 21 10"] = "Leica DG Nocticron 42.5mm f/1.2 Asph. Power OIS"; lenses["02 22 10"] = "Leica DG Summilux 15mm f/1.7 Asph."; + lenses["02 23 10"] = "Lumix G Vario 35-100mm f/4.0-5.6 Asph. Mega OIS"; lenses["02 24 10"] = "Lumix G Macro 30mm f/2.8 Asph. Mega OIS"; lenses["02 25 10"] = "Lumix G 42.5mm f/1.7 Asph. Power OIS"; + lenses["02 26 10"] = "Lumix G 25mm f/1.7 Asph."; + lenses["02 27 10"] = "Leica DG Vario-Elmar 100-400mm f/4.0-6.3 Asph. Power OIS"; + lenses["02 28 10"] = "Lumix G Vario 12-60mm f/3.5-5.6 Asph. Power OIS"; lenses["03 01 00"] = "Leica D Vario Elmarit 14-50mm f/2.8-3.5 Asph."; lenses["03 02 00"] = "Leica D Summilux 25mm f/1.4 Asph."; lenses["05 01 10"] = "Tamron 14-150mm f/3.5-5.8 Di III"; diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 8f183cd09..d350a1c92 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -701,6 +701,7 @@ public: choices.insert(p_t(256 * 3 + 44, "Sigma 12-24mm f/4.5-5.6 EX DG")); choices.insert(p_t(256 * 3 + 44, "Sigma 17-70mm f/2.8-4.5 DC Macro")); choices.insert(p_t(256 * 3 + 44, "Sigma 18-50mm f/3.5-5.6 DC")); + choices.insert(p_t(256 * 3 + 44, "Sigma 17-35mm f/2.8-4 EX DG")); choices.insert(p_t(256 * 3 + 44, "Tamron 35-90mm f/4 AF")); choices.insert(p_t(256 * 3 + 46, "Sigma or Samsung Lens (3 46)")); choices.insert(p_t(256 * 3 + 46, "Sigma APO 70-200mm f/2.8 EX")); @@ -873,11 +874,16 @@ public: choices.insert(p_t(256 * 8 + 27, "Sigma 18-200mm f/3.5-6.3 II DC HSM")); choices.insert(p_t(256 * 8 + 28, "Sigma 18-250mm f/3.5-6.3 DC Macro HSM")); choices.insert(p_t(256 * 8 + 29, "Sigma 35mm f/1.4 DG HSM")); - choices.insert(p_t(256 * 8 + 30, "Sigma 17-70mm f/2.8-4 DC Macro HSM Contemporary")); + choices.insert(p_t(256 * 8 + 30, "Sigma 17-70mm f/2.8-4 DC Macro HSM | C")); choices.insert(p_t(256 * 8 + 31, "Sigma 18-35mm f/1.8 DC HSM")); choices.insert(p_t(256 * 8 + 32, "Sigma 30mm f/1.4 DC HSM | A")); + choices.insert(p_t(256 * 8 + 34, "Sigma 18-300mm f/3.5-6.3 DC Macro HSM")); choices.insert(p_t(256 * 8 + 59, "HD PENTAX-D FA 150-450mm f/4.5-5.6 ED DC AW")); choices.insert(p_t(256 * 8 + 60, "HD PENTAX-D FA* 70-200mm f/2.8 ED DC AW")); + choices.insert(p_t(256 * 8 + 61, "HD PENTAX-D FA 28-105mm f/3.5-5.6 ED DC WR")); + 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 + 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")); choices.insert(p_t(256 * 8 + 199, "HD PENTAX-DA 18-50mm f/4-5.6 DC WR RE")); choices.insert(p_t(256 * 8 + 200, "HD PENTAX-DA 16-85mm f/3.5-5.6 ED DC WR")); @@ -915,6 +921,7 @@ public: choices.insert(p_t(256 * 11 + 14, "smc PENTAX-FA 645 55-110mm f/5.6")); choices.insert(p_t(256 * 11 + 16, "smc PENTAX-FA 645 33-55mm f/4.5 AL")); choices.insert(p_t(256 * 11 + 17, "smc PENTAX-FA 645 150-300mm f/5.6 ED [IF]")); + choices.insert(p_t(256 * 11 + 21, "HD PENTAX-D FA 645 35mm f/3.5 AL [IF]")); choices.insert(p_t(256 * 13 + 18, "smc PENTAX-D FA 645 55mm f/2.8 AL [IF] SDM AW")); choices.insert(p_t(256 * 13 + 19, "smc PENTAX-D FA 645 25mm f/4 AL [IF] SDM AW")); choices.insert(p_t(256 * 13 + 20, "HD PENTAX-D FA 645 90mm f/2.8 ED AW SR")); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index ea8fc0b49..c3f1d3355 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -611,7 +611,7 @@ public: choices.insert(p_t(55, "Sony DT 18-55mm f/3.5-5.6 SAM (SAL1855) or SAM II")); choices.insert(p_t(55, "Sony DT 18-55mm f/3.5-5.6 SAM II (SAL18552)")); choices.insert(p_t(56, "Sony DT 55-200mm f/4-5.6 SAM (SAL55200-2)")); - choices.insert(p_t(57, "Sony DT 50mm f/1.8 SAM (SAL50F18) or Tamron Lens")); + choices.insert(p_t(57, "Sony DT 50mm f/1.8 SAM (SAL50F18) or Tamron Lens or Commlite CM-EF-NEX adapter")); choices.insert(p_t(57, "Tamron SP AF 60mm f/2 Di II LD [IF] Macro 1:1")); choices.insert(p_t(57, "Tamron 18-270mm f/3.5-6.3 Di II PZD")); choices.insert(p_t(58, "Sony DT 30mm f/2.8 Macro SAM (SAL30M28)")); @@ -648,6 +648,7 @@ public: choices.insert(p_t(128, "Tamron AF 28-105mm f/4-5.6 [IF]")); choices.insert(p_t(128, "Sigma 35mm f/1.4 DG HSM")); choices.insert(p_t(128, "Sigma 18-35mm f/1.8 DC HSM")); + choices.insert(p_t(128, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM")); choices.insert(p_t(129, "Tamron Lens (129)")); choices.insert(p_t(129, "Tamron 200-400mm f/5.6 LD")); choices.insert(p_t(129, "Tamron 70-300mm f/4-5.6 LD")); @@ -675,6 +676,7 @@ public: choices.insert(p_t(255, "Tamron SP AF 70-200mm f/2.8 Di LD IF Macro")); choices.insert(p_t(255, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical IF")); choices.insert(p_t(255, "Tamron AF 90-300mm f/4.5-5.6 Telemacro")); + choices.insert(p_t(1868, "Sigma MC-11 Adapter")); choices.insert(p_t(2550, "Minolta AF 50mm f/1.7")); choices.insert(p_t(2551, "Minolta AF 35-70mm f/4 or Other Lens")); choices.insert(p_t(2551, "Sigma UC AF 28-70mm f/3.5-4.5")); @@ -723,7 +725,7 @@ public: choices.insert(p_t(2563, "Sigma 400mm f/5.6 APO")); choices.insert(p_t(2564, "Minolta AF 50mm f/2.8 Macro or Sigma Lens")); choices.insert(p_t(2564, "Sigma 50mm f/2.8 EX Macro")); - choices.insert(p_t(2565, "Minolta AF 600mm f/4")); + choices.insert(p_t(2565, "Minolta AF 600mm f/4 APO")); choices.insert(p_t(2566, "Minolta AF 24mm f/2.8 or Sigma Lens")); choices.insert(p_t(2566, "Sigma 17-35mm f/2.8-4 EX Aspherical")); choices.insert(p_t(2572, "Minolta/Sony AF 500mm f/8 Reflex")); @@ -749,7 +751,7 @@ public: choices.insert(p_t(2590, "Minolta AF 600mm f/4 HS-APO G + Minolta AF 1.4x APO")); choices.insert(p_t(2591, "Minolta AF 35mm f/1.4")); choices.insert(p_t(2592, "Minolta AF 85mm f/1.4 G (D)")); - choices.insert(p_t(2593, "Minolta AF 200mm f/2.8 G APO")); + choices.insert(p_t(2593, "Minolta AF 200mm f/2.8 APO")); choices.insert(p_t(2594, "Minolta AF 3x-1x f/1.7-2.8 Macro")); choices.insert(p_t(2596, "Minolta AF 28mm f/2")); choices.insert(p_t(2597, "Minolta AF 35mm f/2 [New]")); @@ -771,7 +773,7 @@ public: choices.insert(p_t(2620, "Minolta AF 28-70mm f/2.8 G")); choices.insert(p_t(2621, "Minolta AF 100-300mm f/4.5-5.6 xi")); choices.insert(p_t(2624, "Minolta AF 35-80mm f/4-5.6 Power Zoom")); - choices.insert(p_t(2628, "Minolta AF 80-200mm f/2.8 G")); + choices.insert(p_t(2628, "Minolta AF 80-200mm f/2.8 HS-APO G")); choices.insert(p_t(2629, "Minolta AF 85mm f/1.4 New")); choices.insert(p_t(2631, "Minolta/Sony AF 100-300mm f/4.5-5.6 APO")); choices.insert(p_t(2632, "Minolta AF 24-50mm f/4 New")); @@ -795,7 +797,8 @@ public: choices.insert(p_t(4585, "Tamron SP AF 300mm f/2.8 LD IF")); choices.insert(p_t(4586, "Tamron SP AF 35-105mm f/2.8 LD Aspherical IF")); choices.insert(p_t(4587, "Tamron AF 70-210mm f/2.8 SP LD")); - choices.insert(p_t(6118, "Metabones Canon EF Adapter")); + choices.insert(p_t(4812, "Metabones Canon EF Speed Booster Ultra")); + choices.insert(p_t(6118, "Canon EF Adapter")); choices.insert(p_t(6553, "E-Mount, T-Mount, Other Lens or no lens")); choices.insert(p_t(6553, "Sony E 16mm f/2.8")); choices.insert(p_t(6553, "Sony E 18-55mm f/3.5-5.6 OSS")); @@ -824,14 +827,22 @@ public: choices.insert(p_t(6553, "Sony FE 24-240mm f/3.5-6.3 OSS")); choices.insert(p_t(6553, "Sony FE 28mm f/2")); choices.insert(p_t(6553, "Sony FE PZ 28-135mm f/4 G OSS")); + choices.insert(p_t(6553, "Sony FE 24-70mm f/2.8 GM")); + choices.insert(p_t(6553, "Sony FE 85mm f/1.4 GM")); + choices.insert(p_t(6553, "Sony FE 50mm f/1.8")); choices.insert(p_t(6553, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)")); choices.insert(p_t(6553, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)")); + choices.insert(p_t(6553, "Sony FE 70-300mm f/4.5-5.6 G OSS")); + choices.insert(p_t(6553, "Sony FE 70-200mm f/2.8 GM OSS")); choices.insert(p_t(6553, "Sigma 19mm f/2.8 [EX] DN")); choices.insert(p_t(6553, "Sigma 30mm f/2.8 [EX] DN")); choices.insert(p_t(6553, "Sigma 60mm f/2.8 DN")); + choices.insert(p_t(6553, "Sigma 30mm f/1.4 DC DN | C")); choices.insert(p_t(6553, "Tamron 18-200mm f/3.5-6.3 Di III VC")); choices.insert(p_t(6553, "Zeiss Batis 25mm f/2")); choices.insert(p_t(6553, "Zeiss Batis 85mm f/1.8")); + choices.insert(p_t(6553, "Zeiss Batis 18mm f/2.8")); + choices.insert(p_t(6553, "Zeiss Loxia 21mm f/2.8")); choices.insert(p_t(6553, "Zeiss Loxia 35mm f/2")); choices.insert(p_t(6553, "Zeiss Loxia 50mm f/2")); choices.insert(p_t(6553, "Zeiss Touit 12mm f/2.8")); @@ -844,6 +855,7 @@ public: choices.insert(p_t(6553, "Pentacon Auto 135mm f/2.8")); choices.insert(p_t(6553, "Pentacon Auto 29mm f/2.8")); choices.insert(p_t(6553, "Helios 44-2 58mm f/2.0")); + choices.insert(p_t(18688, "Sigma MC-11 Adapter")); choices.insert(p_t(25501, "Minolta AF 50mm f/1.7")); choices.insert(p_t(25511, "Minolta AF 35-70mm f/4 or Other Lens")); choices.insert(p_t(25511, "Sigma UC AF 28-70mm f/3.5-4.5")); @@ -892,7 +904,7 @@ public: choices.insert(p_t(25631, "Sigma 400mm f/5.6 APO")); choices.insert(p_t(25641, "Minolta AF 50mm f/2.8 Macro or Sigma Lens")); choices.insert(p_t(25641, "Sigma 50mm f/2.8 EX Macro")); - choices.insert(p_t(25651, "Minolta AF 600mm f/4")); + choices.insert(p_t(25651, "Minolta AF 600mm f/4 APO")); choices.insert(p_t(25661, "Minolta AF 24mm f/2.8 or Sigma Lens")); choices.insert(p_t(25661, "Sigma 17-35mm f/2.8-4 EX Aspherical")); choices.insert(p_t(25721, "Minolta/Sony AF 500mm f/8 Reflex")); @@ -918,7 +930,7 @@ public: choices.insert(p_t(25901, "Minolta AF 600mm f/4 HS-APO G + Minolta AF 1.4x APO")); choices.insert(p_t(25911, "Minolta AF 35mm f/1.4")); choices.insert(p_t(25921, "Minolta AF 85mm f/1.4 G (D)")); - choices.insert(p_t(25931, "Minolta AF 200mm f/2.8 G APO")); + choices.insert(p_t(25931, "Minolta AF 200mm f/2.8 APO")); choices.insert(p_t(25941, "Minolta AF 3x-1x f/1.7-2.8 Macro")); choices.insert(p_t(25961, "Minolta AF 28mm f/2")); choices.insert(p_t(25971, "Minolta AF 35mm f/2 [New]")); @@ -940,7 +952,7 @@ public: choices.insert(p_t(26201, "Minolta AF 28-70mm f/2.8 G")); choices.insert(p_t(26211, "Minolta AF 100-300mm f/4.5-5.6 xi")); choices.insert(p_t(26241, "Minolta AF 35-80mm f/4-5.6 Power Zoom")); - choices.insert(p_t(26281, "Minolta AF 80-200mm f/2.8 G")); + choices.insert(p_t(26281, "Minolta AF 80-200mm f/2.8 HS-APO G")); choices.insert(p_t(26291, "Minolta AF 85mm f/1.4 New")); choices.insert(p_t(26311, "Minolta/Sony AF 100-300mm f/4.5-5.6 APO")); choices.insert(p_t(26321, "Minolta AF 24-50mm f/4 New")); @@ -964,7 +976,8 @@ public: choices.insert(p_t(45851, "Tamron SP AF 300mm f/2.8 LD IF")); choices.insert(p_t(45861, "Tamron SP AF 35-105mm f/2.8 LD Aspherical IF")); choices.insert(p_t(45871, "Tamron AF 70-210mm f/2.8 SP LD")); - choices.insert(p_t(61184, "Metabones Canon EF Adapter")); + choices.insert(p_t(48128, "Metabones Canon EF Speed Booster Ultra")); + choices.insert(p_t(61184, "Canon EF Adapter")); choices.insert(p_t(65535, "E-Mount, T-Mount, Other Lens or no lens")); choices.insert(p_t(65535, "Sony E 16mm f/2.8")); choices.insert(p_t(65535, "Sony E 18-55mm f/3.5-5.6 OSS")); @@ -993,14 +1006,22 @@ public: choices.insert(p_t(65535, "Sony FE 24-240mm f/3.5-6.3 OSS")); choices.insert(p_t(65535, "Sony FE 28mm f/2")); choices.insert(p_t(65535, "Sony FE PZ 28-135mm f/4 G OSS")); + choices.insert(p_t(65535, "Sony FE 24-70mm f/2.8 GM")); + choices.insert(p_t(65535, "Sony FE 85mm f/1.4 GM")); + choices.insert(p_t(65535, "Sony FE 50mm f/1.8")); choices.insert(p_t(65535, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)")); choices.insert(p_t(65535, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)")); + choices.insert(p_t(65535, "Sony FE 70-300mm f/4.5-5.6 G OSS")); + choices.insert(p_t(65535, "Sony FE 70-200mm f/2.8 GM OSS")); choices.insert(p_t(65535, "Sigma 19mm f/2.8 [EX] DN")); choices.insert(p_t(65535, "Sigma 30mm f/2.8 [EX] DN")); choices.insert(p_t(65535, "Sigma 60mm f/2.8 DN")); + choices.insert(p_t(65535, "Sigma 30mm f/1.4 DC DN | C")); choices.insert(p_t(65535, "Tamron 18-200mm f/3.5-6.3 Di III VC")); choices.insert(p_t(65535, "Zeiss Batis 25mm f/2")); choices.insert(p_t(65535, "Zeiss Batis 85mm f/1.8")); + choices.insert(p_t(65535, "Zeiss Batis 18mm f/2.8")); + choices.insert(p_t(65535, "Zeiss Loxia 21mm f/2.8")); choices.insert(p_t(65535, "Zeiss Loxia 35mm f/2")); choices.insert(p_t(65535, "Zeiss Loxia 50mm f/2")); choices.insert(p_t(65535, "Zeiss Touit 12mm f/2.8")); @@ -1060,8 +1081,8 @@ public: choices.insert(p_t(3, "Sony LA-EA3 Adapter")); choices.insert(p_t(6, "Sony LA-EA4 Adapter")); choices.insert(p_t(44, "Metabones Canon EF Smart Adapter")); - choices.insert(p_t(78, "Metabones Canon EF Smart Adapter Mark III or IV")); - choices.insert(p_t(234, "Adapter only - no lens attached")); + choices.insert(p_t(78, "Metabones Canon EF Smart Adapter Mark III or Other Adapter")); + choices.insert(p_t(234, "Metabones Canon EF Smart Adapter Mark IV")); choices.insert(p_t(239, "Metabones Canon EF Speed Booster")); choices.insert(p_t(32784, "Sony E 16mm f/2.8")); choices.insert(p_t(32785, "Sony E 18-55mm f/3.5-5.6 OSS")); @@ -1090,10 +1111,35 @@ public: choices.insert(p_t(32815, "Sony FE 24-240mm f/3.5-6.3 OSS")); choices.insert(p_t(32816, "Sony FE 28mm f/2")); choices.insert(p_t(32817, "Sony FE PZ 28-135mm f/4 G OSS")); + choices.insert(p_t(32821, "Sony FE 24-70mm f/2.8 GM")); + choices.insert(p_t(32823, "Sony FE 85mm f/1.4 GM")); + choices.insert(p_t(32824, "Sony FE 50mm f/1.8")); choices.insert(p_t(32826, "Sony FE 21mm f/2.8 (SEL28F20 + SEL075UWC)")); choices.insert(p_t(32827, "Sony FE 16mm f/3.5 Fisheye (SEL28F20 + SEL057FEC)")); + choices.insert(p_t(32828, "Sony FE 70-300mm f/4.5-5.6 G OSS")); + choices.insert(p_t(32830, "Sony FE 70-200mm f/2.8 GM OSS")); + choices.insert(p_t(49201, "Zeiss Touit 12mm f/2.8")); + choices.insert(p_t(49202, "Zeiss Touit 32mm f/1.8")); + choices.insert(p_t(49203, "Zeiss Touit 50mm f/2.8 Macro")); choices.insert(p_t(49216, "Zeiss Batis 25mm f/2")); choices.insert(p_t(49217, "Zeiss Batis 85mm f/1.8")); + choices.insert(p_t(49218, "Zeiss Batis 18mm f/2.8")); + choices.insert(p_t(49232, "Zeiss Loxia 50mm f/2")); + choices.insert(p_t(49233, "Zeiss Loxia 35mm f/2")); + choices.insert(p_t(49234, "Zeiss Loxia 21mm f/2.8")); + choices.insert(p_t(50480, "Sigma 30mm f/1.4 DC DN | C 016")); + choices.insert(p_t(50481, "Sigma 50mm f/1.4 DG HSM | A 014 + MC-11")); + choices.insert(p_t(50482, "Sigma 18-300mm f/3.5-6.3 DC MACRO OS HSM | C 014 + MC-11")); + choices.insert(p_t(50483, "Sigma 18-35mm f/1.8 DC HSM | A 013 + MC-11")); + choices.insert(p_t(50484, "Sigma 24-35mm f/2 DG HSM | A 015 + MC-11")); + choices.insert(p_t(50486, "Sigma 150-600mm f/5-6.3 DG OS HSM | C 015 + MC-11")); + choices.insert(p_t(50487, "Sigma 20mm f/1.4 DG HSM | A 015 + MC-11")); + choices.insert(p_t(50488, "Sigma 35mm f/1.4 DG HSM | A 012 + MC-11")); + choices.insert(p_t(50489, "Sigma 150-600mm f/5-6.3 DG OS HSM | S 014 + MC-11")); + choices.insert(p_t(50490, "Sigma 120-300mm f/2.8 DG OS HSM | S 013 + MC-11")); + choices.insert(p_t(50492, "Sigma 24-105mm f/4 DG OS HSM | A 013 + MC-11")); + choices.insert(p_t(50493, "Sigma 17-70mm f/2.8-4 DC MACRO OS HSM | C 013 + MC-11")); + choices.insert(p_t(50495, "Sigma 50-100mm f/1.8 DC HSM | A 016 + MC-11")); } virtual std::string toString (Tag* t) From d82956bbe5df9cba8366f00660c8ac356e1e9a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 21 Jun 2016 20:50:42 +0200 Subject: [PATCH 114/232] Add optimized median25 and kill old macros (#3346) --- rtengine/FTblockDN.cc | 320 +++++--------- rtengine/ipwavelet.cc | 25 +- rtengine/median.h | 833 +++++++++++++++++++++++++++---------- rtengine/rawimagesource.cc | 30 +- 4 files changed, 723 insertions(+), 485 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 9f74d9f2c..03e1f15b4 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -49,54 +49,6 @@ #define epsilon 0.001f/(TS*TS) //tolerance -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } - -#define med2(a0,a1,a2,a3,a4,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; \ -PIX_SORT(pp[0],pp[1]) ; PIX_SORT(pp[3],pp[4]) ; PIX_SORT(pp[0],pp[3]) ;\ -PIX_SORT(pp[1],pp[4]) ; PIX_SORT(pp[1],pp[2]) ; PIX_SORT(pp[2],pp[3]) ;\ -PIX_SORT(pp[1],pp[2]) ; median=pp[2] ;} - -#define med5(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; pp[9]=a9; pp[10]=a10; pp[11]=a11; pp[12]=a12; \ -pp[13]=a13; pp[14]=a14; pp[15]=a15; pp[16]=a16; pp[17]=a17; pp[18]=a18; pp[19]=a19; pp[20]=a20; pp[21]=a21; pp[22]=a22; pp[23]=a23; pp[24]=a24; \ -PIX_SORT(pp[0], pp[1]) ; PIX_SORT(pp[3], pp[4]) ; PIX_SORT(pp[2], pp[4]) ;\ -PIX_SORT(pp[2], pp[3]) ; PIX_SORT(pp[6], pp[7]) ; PIX_SORT(pp[5], pp[7]) ;\ -PIX_SORT(pp[5], pp[6]) ; PIX_SORT(pp[9], pp[10]) ; PIX_SORT(pp[8], pp[10]) ;\ -PIX_SORT(pp[8], pp[9]) ; PIX_SORT(pp[12], pp[13]) ; PIX_SORT(pp[11], pp[13]) ;\ -PIX_SORT(pp[11], pp[12]) ; PIX_SORT(pp[15], pp[16]) ; PIX_SORT(pp[14], pp[16]) ;\ -PIX_SORT(pp[14], pp[15]) ; PIX_SORT(pp[18], pp[19]) ; PIX_SORT(pp[17], pp[19]) ;\ -PIX_SORT(pp[17], pp[18]) ; PIX_SORT(pp[21], pp[22]) ; PIX_SORT(pp[20], pp[22]) ;\ -PIX_SORT(pp[20], pp[21]) ; PIX_SORT(pp[23], pp[24]) ; PIX_SORT(pp[2], pp[5]) ;\ -PIX_SORT(pp[3], pp[6]) ; PIX_SORT(pp[0], pp[6]) ; PIX_SORT(pp[0], pp[3]) ;\ -PIX_SORT(pp[4], pp[7]) ; PIX_SORT(pp[1], pp[7]) ; PIX_SORT(pp[1], pp[4]) ;\ -PIX_SORT(pp[11], pp[14]) ; PIX_SORT(pp[8], pp[14]) ; PIX_SORT(pp[8], pp[11]) ;\ -PIX_SORT(pp[12], pp[15]) ; PIX_SORT(pp[9], pp[15]) ; PIX_SORT(pp[9], pp[12]) ;\ -PIX_SORT(pp[13], pp[16]) ; PIX_SORT(pp[10], pp[16]) ; PIX_SORT(pp[10], pp[13]) ;\ -PIX_SORT(pp[20], pp[23]) ; PIX_SORT(pp[17], pp[23]) ; PIX_SORT(pp[17], pp[20]) ;\ -PIX_SORT(pp[21], pp[24]) ; PIX_SORT(pp[18], pp[24]) ; PIX_SORT(pp[18], pp[21]) ;\ -PIX_SORT(pp[19], pp[22]) ; PIX_SORT(pp[8], pp[17]) ; PIX_SORT(pp[9], pp[18]) ;\ -PIX_SORT(pp[0], pp[18]) ; PIX_SORT(pp[0], pp[9]) ; PIX_SORT(pp[10], pp[19]) ;\ -PIX_SORT(pp[1], pp[19]) ; PIX_SORT(pp[1], pp[10]) ; PIX_SORT(pp[11], pp[20]) ;\ -PIX_SORT(pp[2], pp[20]) ; PIX_SORT(pp[2], pp[11]) ; PIX_SORT(pp[12], pp[21]) ;\ -PIX_SORT(pp[3], pp[21]) ; PIX_SORT(pp[3], pp[12]) ; PIX_SORT(pp[13], pp[22]) ;\ -PIX_SORT(pp[4], pp[22]) ; PIX_SORT(pp[4], pp[13]) ; PIX_SORT(pp[14], pp[23]) ;\ -PIX_SORT(pp[5], pp[23]) ; PIX_SORT(pp[5], pp[14]) ; PIX_SORT(pp[15], pp[24]) ;\ -PIX_SORT(pp[6], pp[24]) ; PIX_SORT(pp[6], pp[15]) ; PIX_SORT(pp[7], pp[16]) ;\ -PIX_SORT(pp[7], pp[19]) ; PIX_SORT(pp[13], pp[21]) ; PIX_SORT(pp[15], pp[23]) ;\ -PIX_SORT(pp[7], pp[13]) ; PIX_SORT(pp[7], pp[15]) ; PIX_SORT(pp[1], pp[9]) ;\ -PIX_SORT(pp[3], pp[11]) ; PIX_SORT(pp[5], pp[17]) ; PIX_SORT(pp[11], pp[17]) ;\ -PIX_SORT(pp[9], pp[17]) ; PIX_SORT(pp[4], pp[10]) ; PIX_SORT(pp[6], pp[12]) ;\ -PIX_SORT(pp[7], pp[14]) ; PIX_SORT(pp[4], pp[6]) ; PIX_SORT(pp[4], pp[7]) ;\ -PIX_SORT(pp[12], pp[14]) ; PIX_SORT(pp[10], pp[14]) ; PIX_SORT(pp[6], pp[7]) ;\ -PIX_SORT(pp[10], pp[12]) ; PIX_SORT(pp[6], pp[10]) ; PIX_SORT(pp[6], pp[17]) ;\ -PIX_SORT(pp[12], pp[17]) ; PIX_SORT(pp[7], pp[17]) ; PIX_SORT(pp[7], pp[10]) ;\ -PIX_SORT(pp[12], pp[18]) ; PIX_SORT(pp[7], pp[12]) ; PIX_SORT(pp[10], pp[18]) ;\ -PIX_SORT(pp[12], pp[20]) ; PIX_SORT(pp[10], pp[20]) ; PIX_SORT(pp[10], pp[12]) ;\ -median=pp[12];} - -#define ELEM_FLOAT_SWAP(a,b) { register float t=(a);(a)=(b);(b)=t; } - namespace rtengine { @@ -120,72 +72,6 @@ namespace rtengine extern const Settings* settings; -// Median calculation using quicksort -float fq_sort2(float arr[], int n) -{ - int low = 0; - int high = n - 1; - int median = (low + high) / 2; - - for (;;) { - if (high <= low) { - return arr[median] ; - } - - if (high == low + 1) { - if (arr[low] > arr[high]) { - ELEM_FLOAT_SWAP(arr[low], arr[high]) ; - } - - return arr[median] ; - } - - int middle = (low + high) / 2; - - if (arr[middle] > arr[high]) { - ELEM_FLOAT_SWAP(arr[middle], arr[high]) ; - } - - if (arr[low] > arr[high]) { - ELEM_FLOAT_SWAP(arr[low], arr[high]) ; - } - - if (arr[middle] > arr[low]) { - ELEM_FLOAT_SWAP(arr[middle], arr[low]) ; - } - - ELEM_FLOAT_SWAP(arr[middle], arr[low + 1]) ; - int ll = low + 1; - int hh = high; - - for (;;) { - do { - ll++; - } while (arr[low] > arr[ll]) ; - - do { - hh--; - } while (arr[hh] > arr[low]) ; - - if (hh < ll) { - break; - } - - ELEM_FLOAT_SWAP(arr[ll], arr[hh]) ; - } - - ELEM_FLOAT_SWAP(arr[low], arr[hh]) ; - - if (hh <= median) { - low = ll; - } - - if (hh >= median) { - high = hh - 1; - } - } -} - float media(float *elements, int N) { @@ -211,7 +97,7 @@ float media(float *elements, int N) void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const mediantype medianType, const int iterations, const int numThreads, float **buffer) { - int border = 1, numElements, middleElement; + int border = 1; switch(medianType) { case MED_3X3SOFT: @@ -229,14 +115,10 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, case MED_7X7: border = 3; - numElements = 49; - middleElement = 24; break; default: // includes MED_9X9 border = 4; - numElements = 81; - middleElement = 40; } float **allocBuffer = NULL; @@ -280,7 +162,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for (int i = border; i < height - border; i++) { if(medianType == MED_3X3SOFT) { - float pp[5], temp; int j; for (j = 0; j < border; j++) { @@ -288,7 +169,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } for (; j < width - border; j++) { - med2(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1], medianOut[i][j]); + medianOut[i][j] = median(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1]); } for(; j < width; j++) { @@ -309,7 +190,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } } else if(medianType == MED_5X5SOFT) { - float pp[13]; int j; for (j = 0; j < border; j++) { @@ -317,28 +197,27 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } for (; j < width - border; j++) { - pp[0] = medianIn[i][j]; - pp[1] = medianIn[i - 1][j]; - pp[2] = medianIn[i + 1][j]; - pp[3] = medianIn[i][j + 1]; - pp[4] = medianIn[i][j - 1]; - pp[5] = medianIn[i - 1][j - 1]; - pp[6] = medianIn[i - 1][j + 1]; - pp[7] = medianIn[i + 1][j - 1]; - pp[8] = medianIn[i + 1][j + 1]; - pp[9] = medianIn[i + 2][j]; - pp[10] = medianIn[i - 2][j]; - pp[11] = medianIn[i][j + 2]; - pp[12] = medianIn[i][j - 2]; - fq_sort2(pp, 13); - medianOut[i][j] = pp[6]; + medianOut[i][j] = median( + medianIn[i][j], + medianIn[i - 1][j], + medianIn[i + 1][j], + medianIn[i][j + 1], + medianIn[i][j - 1], + medianIn[i - 1][j - 1], + medianIn[i - 1][j + 1], + medianIn[i + 1][j - 1], + medianIn[i + 1][j + 1], + medianIn[i + 2][j], + medianIn[i - 2][j], + medianIn[i][j + 2], + medianIn[i][j - 2] + ); } for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } } else if(medianType == MED_5X5STRONG) { - float pp[25], temp; int j; for (j = 0; j < border; j++) { @@ -346,17 +225,16 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } for (; j < width - border; j++) { - med5(medianIn[i][j], medianIn[i - 1][j], medianIn[i + 1][j], medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1], + medianOut[i][j] = median(medianIn[i][j], medianIn[i - 1][j], medianIn[i + 1][j], medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1], medianIn[i - 2][j], medianIn[i + 2][j], medianIn[i][j + 2], medianIn[i][j - 2], medianIn[i - 2][j - 2], medianIn[i - 2][j + 2], medianIn[i + 2][j - 2], medianIn[i + 2][j + 2], - medianIn[i - 2][j + 1], medianIn[i + 2][j + 1], medianIn[i - 1][j + 2], medianIn[i - 1][j - 2], medianIn[i - 2][j - 1], medianIn[i + 2][j - 1], medianIn[i + 1][j + 2], medianIn[i + 1][j - 2], - medianOut[i][j]); + medianIn[i - 2][j + 1], medianIn[i + 2][j + 1], medianIn[i - 1][j + 2], medianIn[i - 1][j - 2], medianIn[i - 2][j - 1], medianIn[i + 2][j - 1], medianIn[i + 1][j + 2], medianIn[i + 1][j - 2]); } for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else {// includes MED_7X7 and MED_9X9 - float pp[81]; + } else if (medianType == MED_7X7) { + std::array pp = {}; int j; for (j = 0; j < border; j++) { @@ -373,8 +251,31 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } } - fq_sort2(pp, numElements); - medianOut[i][j] = pp[middleElement]; + medianOut[i][j] = median(pp); + } + + for(; j < width; j++) { + medianOut[i][j] = medianIn[i][j]; + } + } else { // includes MED_9X9 + std::array pp = {}; + int j; + + for (j = 0; j < border; j++) { + medianOut[i][j] = medianIn[i][j]; + } + + for (; j < width - border; j++) { + int kk = 0; + + for (int ii = -border; ii <= border; ii++) { + for (int jj = -border; jj <= border; jj++) { + kk++; + pp[kk] = medianIn[i + ii][j + jj]; + } + } + + medianOut[i][j] = median(pp); } for(; j < width; j++) { @@ -1853,11 +1754,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; i++) { - float pp[9], temp; - if(methmed == 0) for (int j = 1; j < wid - 1; j++) { - med2(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), tm[i][j]); //3x3 soft + tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1)); //3x3 soft } else for (int j = 1; j < wid - 1; j++) { @@ -1869,34 +1768,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int i = 2; i < hei - 2; i++) { - float pp[25]; - if(methmed == 3) { - float temp; - for (int j = 2; j < wid - 2; j++) { - med5(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), + tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), - source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2), - tm[i][j]);//5x5 + source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 } } else for (int j = 2; j < wid - 2; j++) { - pp[0] = source->r(i, j); - pp[1] = source->r(i - 1, j); - pp[2] = source->r(i + 1, j); - pp[3] = source->r(i, j + 1); - pp[4] = source->r(i, j - 1); - pp[5] = source->r(i - 1, j - 1); - pp[6] = source->r(i - 1, j + 1); - pp[7] = source->r(i + 1, j - 1); - pp[8] = source->r(i + 1, j + 1); - pp[9] = source->r(i + 2, j); - pp[10] = source->r(i - 2, j); - pp[11] = source->r(i, j + 2); - pp[12] = source->r(i, j - 2); - fq_sort2(pp, 13); - tm[i][j] = pp[6]; //5x5 soft + tm[i][j] = median( + source->r(i, j), + source->r(i - 1, j), + source->r(i + 1, j), + source->r(i, j + 1), + source->r(i, j - 1), + source->r(i - 1, j - 1), + source->r(i - 1, j + 1), + source->r(i + 1, j - 1), + source->r(i + 1, j + 1), + source->r(i + 2, j), + source->r(i - 2, j), + source->r(i, j + 2), + source->r(i, j - 2) + ); // 5x5 soft } } } @@ -1916,11 +1810,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; i++) { - float pp[9], temp; - if(methmed == 0) for (int j = 1; j < wid - 1; j++) { - med2(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), tm[i][j]); + tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1)); } else for (int j = 1; j < wid - 1; j++) { @@ -1932,34 +1824,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int i = 2; i < hei - 2; i++) { - float pp[25]; - if(methmed == 3) { - float temp; - for (int j = 2; j < wid - 2; j++) { - med5(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), + tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), - source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2), - tm[i][j]);//5x5 + source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 } } else for (int j = 2; j < wid - 2; j++) { - pp[0] = source->b(i, j); - pp[1] = source->b(i - 1, j); - pp[2] = source->b(i + 1, j); - pp[3] = source->b(i, j + 1); - pp[4] = source->b(i, j - 1); - pp[5] = source->b(i - 1, j - 1); - pp[6] = source->b(i - 1, j + 1); - pp[7] = source->b(i + 1, j - 1); - pp[8] = source->b(i + 1, j + 1); - pp[9] = source->b(i + 2, j); - pp[10] = source->b(i - 2, j); - pp[11] = source->b(i, j + 2); - pp[12] = source->b(i, j - 2); - fq_sort2(pp, 13); - tm[i][j] = pp[6]; //5x5 soft + tm[i][j] = median( + source->b(i, j), + source->b(i - 1, j), + source->b(i + 1, j), + source->b(i, j + 1), + source->b(i, j - 1), + source->b(i - 1, j - 1), + source->b(i - 1, j + 1), + source->b(i + 1, j - 1), + source->b(i + 1, j + 1), + source->b(i + 2, j), + source->b(i - 2, j), + source->b(i, j + 2), + source->b(i, j - 2) + ); // 5x5 soft } } } @@ -1981,11 +1868,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; i++) { - float pp[9], temp; - if(methmed == 0) for (int j = 1; j < wid - 1; j++) { - med2(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), tm[i][j]); + tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1)); } else for (int j = 1; j < wid - 1; j++) { @@ -1997,34 +1882,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int i = 2; i < hei - 2; i++) { - float pp[25]; - if(methmed == 3) { - float temp; - for (int j = 2; j < wid - 2; j++) { - med5(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), + tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), - source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2), - tm[i][j]);//5x5 + source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 } } else for (int j = 2; j < wid - 2; j++) { - pp[0] = source->g(i, j); - pp[1] = source->g(i - 1, j); - pp[2] = source->g(i + 1, j); - pp[3] = source->g(i, j + 1); - pp[4] = source->g(i, j - 1); - pp[5] = source->g(i - 1, j - 1); - pp[6] = source->g(i - 1, j + 1); - pp[7] = source->g(i + 1, j - 1); - pp[8] = source->g(i + 1, j + 1); - pp[9] = source->g(i + 2, j); - pp[10] = source->g(i - 2, j); - pp[11] = source->g(i, j + 2); - pp[12] = source->g(i, j - 2); - fq_sort2(pp, 13); - tm[i][j] = pp[6]; //5x5 soft + tm[i][j] = median( + source->g(i, j), + source->g(i - 1, j), + source->g(i + 1, j), + source->g(i, j + 1), + source->g(i, j - 1), + source->g(i - 1, j - 1), + source->g(i - 1, j + 1), + source->g(i + 1, j - 1), + source->g(i + 1, j + 1), + source->g(i + 2, j), + source->g(i - 2, j), + source->g(i, j + 2), + source->g(i, j - 2) + ); // 5x5 soft } } } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4e433b453..c1535dd38 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -37,6 +37,7 @@ #include "mytime.h" #include "sleef.c" #include "opthelper.h" +#include "median.h" #include "EdgePreservingDecomposition.h" #ifdef _OPENMP @@ -50,26 +51,6 @@ #define fTS ((TS/2+1)) // second dimension of Fourier tiles #define blkrad 1 // radius of block averaging -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } - -#define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[1]); PIX_SORT(pp[3],pp[4]); PIX_SORT(pp[6],pp[7]); \ -PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \ -PIX_SORT(pp[0],pp[3]); PIX_SORT(pp[5],pp[8]); PIX_SORT(pp[4],pp[7]); \ -PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \ -PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \ -PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median - - -#define med2(a0,a1,a2,a3,a4,median) { \ -pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; \ -PIX_SORT(pp[0],pp[1]) ; PIX_SORT(pp[3],pp[4]) ; PIX_SORT(pp[0],pp[3]) ;\ -PIX_SORT(pp[1],pp[4]) ; PIX_SORT(pp[1],pp[2]) ; PIX_SORT(pp[2],pp[3]) ;\ -PIX_SORT(pp[1],pp[2]) ; median=pp[2] ;} - - #define epsilon 0.001f/(TS*TS) //tolerance @@ -827,11 +808,9 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int #endif for (int i = 1; i < hei - 1; i++) { - float pp[9], temp; - 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 - med3(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], tmL[i][j]); //3x3 + 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 } } } diff --git a/rtengine/median.h b/rtengine/median.h index 36794f87b..13a79e381 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -36,227 +36,630 @@ inline T median(std::array array) : ((*middle + *std::max_element(array.begin(), middle)) / static_cast(2)); } +template +inline T median(std::array array) +{ + return std::max(std::min(array[0], array[1]), std::min(array[2], std::max(array[0], array[1]))); +} + +template<> +inline vfloat median(std::array array) +{ + return vmaxf(vminf(array[0], array[1]), vminf(array[2], vmaxf(array[0], array[1]))); +} + +template +inline T median(std::array array) +{ + T tmp = std::min(array[0], array[1]); + array[1] = std::max(array[0], array[1]); + array[0] = tmp; + tmp = std::min(array[3], array[4]); + array[4] = std::max(array[3], array[4]); + array[3] = std::max(array[0], tmp); + array[1] = std::min(array[1], array[4]); + tmp = std::min(array[1], array[2]); + array[2] = std::max(array[1], array[2]); + array[1] = tmp; + tmp = std::min(array[2], array[3]); + return std::max(array[1], tmp); +} + +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[0], array[1]); + array[1] = vmaxf(array[0], array[1]); + array[0] = tmp; + tmp = vminf(array[3], array[4]); + array[4] = vmaxf(array[3], array[4]); + array[3] = vmaxf(array[0], tmp); + array[1] = vminf(array[1], array[4]); + tmp = vminf(array[1], array[2]); + array[2] = vmaxf(array[1], array[2]); + array[1] = tmp; + tmp = vminf(array[2], array[3]); + return vmaxf(array[1], tmp); +} + +template +inline T median(std::array array) +{ + T tmp = std::min(array[0], array[5]); + array[5] = std::max(array[0], array[5]); + array[0] = tmp; + tmp = std::min(array[0], array[3]); + array[3] = std::max(array[0], array[3]); + array[0] = tmp; + tmp = std::min(array[1], array[6]); + array[6] = std::max(array[1], array[6]); + array[1] = tmp; + tmp = std::min(array[2], array[4]); + array[4] = std::max(array[2], array[4]); + array[2] = tmp; + array[1] = std::max(array[0], array[1]); + tmp = std::min(array[3], array[5]); + array[5] = std::max(array[3], array[5]); + array[3] = tmp; + tmp = std::min(array[2], array[6]); + array[6] = std::max(array[2], array[6]); + array[3] = std::max(tmp, array[3]); + array[3] = std::min(array[3], array[6]); + tmp = std::min(array[4], array[5]); + array[4] = std::max(array[1], tmp); + tmp = std::min(array[1], tmp); + array[3] = std::max(tmp, array[3]); + return std::min(array[3], array[4]); +} + +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[0], array[5]); + array[5] = vmaxf(array[0], array[5]); + array[0] = tmp; + tmp = vminf(array[0], array[3]); + array[3] = vmaxf(array[0], array[3]); + array[0] = tmp; + tmp = vminf(array[1], array[6]); + array[6] = vmaxf(array[1], array[6]); + array[1] = tmp; + tmp = vminf(array[2], array[4]); + array[4] = vmaxf(array[2], array[4]); + array[2] = tmp; + array[1] = vmaxf(array[0], array[1]); + tmp = vminf(array[3], array[5]); + array[5] = vmaxf(array[3], array[5]); + array[3] = tmp; + tmp = vminf(array[2], array[6]); + array[6] = vmaxf(array[2], array[6]); + array[3] = vmaxf(tmp, array[3]); + array[3] = vminf(array[3], array[6]); + tmp = vminf(array[4], array[5]); + array[4] = vmaxf(array[1], tmp); + tmp = vminf(array[1], tmp); + array[3] = vmaxf(tmp, array[3]); + return vminf(array[3], array[4]); +} + +template +inline T median(std::array array) +{ + T tmp = std::min(array[1], array[2]); + array[2] = std::max(array[1], array[2]); + array[1] = tmp; + tmp = std::min(array[4], array[5]); + array[5] = std::max(array[4], array[5]); + array[4] = tmp; + tmp = std::min(array[7], array[8]); + array[8] = std::max(array[7], array[8]); + array[7] = tmp; + tmp = std::min(array[0], array[1]); + array[1] = std::max(array[0], array[1]); + array[0] = tmp; + tmp = std::min(array[3], array[4]); + array[4] = std::max(array[3], array[4]); + array[3] = tmp; + tmp = std::min(array[6], array[7]); + array[7] = std::max(array[6], array[7]); + array[6] = tmp; + tmp = std::min(array[1], array[2]); + array[2] = std::max(array[1], array[2]); + array[1] = tmp; + tmp = std::min(array[4], array[5]); + array[5] = std::max(array[4], array[5]); + array[4] = tmp; + tmp = std::min(array[7], array[8]); + array[8] = std::max(array[7], array[8]); + array[3] = std::max(array[0], array[3]); + array[5] = std::min(array[5], array[8]); + array[7] = std::max(array[4], tmp); + tmp = std::min(array[4], tmp); + array[6] = std::max(array[3], array[6]); + array[4] = std::max(array[1], tmp); + array[2] = std::min(array[2], array[5]); + array[4] = std::min(array[4], array[7]); + tmp = std::min(array[4], array[2]); + array[2] = std::max(array[4], array[2]); + array[4] = std::max(array[6], tmp); + return std::min(array[4], array[2]); +} + +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[1], array[2]); + array[2] = vmaxf(array[1], array[2]); + array[1] = tmp; + tmp = vminf(array[4], array[5]); + array[5] = vmaxf(array[4], array[5]); + array[4] = tmp; + tmp = vminf(array[7], array[8]); + array[8] = vmaxf(array[7], array[8]); + array[7] = tmp; + tmp = vminf(array[0], array[1]); + array[1] = vmaxf(array[0], array[1]); + array[0] = tmp; + tmp = vminf(array[3], array[4]); + array[4] = vmaxf(array[3], array[4]); + array[3] = tmp; + tmp = vminf(array[6], array[7]); + array[7] = vmaxf(array[6], array[7]); + array[6] = tmp; + tmp = vminf(array[1], array[2]); + array[2] = vmaxf(array[1], array[2]); + array[1] = tmp; + tmp = vminf(array[4], array[5]); + array[5] = vmaxf(array[4], array[5]); + array[4] = tmp; + tmp = vminf(array[7], array[8]); + array[8] = vmaxf(array[7], array[8]); + array[3] = vmaxf(array[0], array[3]); + array[5] = vminf(array[5], array[8]); + array[7] = vmaxf(array[4], tmp); + tmp = vminf(array[4], tmp); + array[6] = vmaxf(array[3], array[6]); + array[4] = vmaxf(array[1], tmp); + array[2] = vminf(array[2], array[5]); + array[4] = vminf(array[4], array[7]); + tmp = vminf(array[4], array[2]); + array[2] = vmaxf(array[4], array[2]); + array[4] = vmaxf(array[6], tmp); + return vminf(array[4], array[2]); +} + +template +inline T median(std::array array) +{ + T tmp = std::min(array[0], array[1]); + array[1] = std::max(array[0], array[1]); + array[0] = tmp; + tmp = std::min(array[3], array[4]); + array[4] = std::max(array[3], array[4]); + array[3] = tmp; + tmp = std::min(array[2], array[4]); + array[4] = std::max(array[2], array[4]); + array[2] = std::min(tmp, array[3]); + array[3] = std::max(tmp, array[3]); + tmp = std::min(array[6], array[7]); + array[7] = std::max(array[6], array[7]); + array[6] = tmp; + tmp = std::min(array[5], array[7]); + array[7] = std::max(array[5], array[7]); + array[5] = std::min(tmp, array[6]); + array[6] = std::max(tmp, array[6]); + tmp = std::min(array[9], array[10]); + array[10] = std::max(array[9], array[10]); + array[9] = tmp; + tmp = std::min(array[8], array[10]); + array[10] = std::max(array[8], array[10]); + array[8] = std::min(tmp, array[9]); + array[9] = std::max(tmp, array[9]); + tmp = std::min(array[12], array[13]); + array[13] = std::max(array[12], array[13]); + array[12] = tmp; + tmp = std::min(array[11], array[13]); + array[13] = std::max(array[11], array[13]); + array[11] = std::min(tmp, array[12]); + array[12] = std::max(tmp, array[12]); + tmp = std::min(array[15], array[16]); + array[16] = std::max(array[15], array[16]); + array[15] = tmp; + tmp = std::min(array[14], array[16]); + array[16] = std::max(array[14], array[16]); + array[14] = std::min(tmp, array[15]); + array[15] = std::max(tmp, array[15]); + tmp = std::min(array[18], array[19]); + array[19] = std::max(array[18], array[19]); + array[18] = tmp; + tmp = std::min(array[17], array[19]); + array[19] = std::max(array[17], array[19]); + array[17] = std::min(tmp, array[18]); + array[18] = std::max(tmp, array[18]); + tmp = std::min(array[21], array[22]); + array[22] = std::max(array[21], array[22]); + array[21] = tmp; + tmp = std::min(array[20], array[22]); + array[22] = std::max(array[20], array[22]); + array[20] = std::min(tmp, array[21]); + array[21] = std::max(tmp, array[21]); + tmp = std::min(array[23], array[24]); + array[24] = std::max(array[23], array[24]); + array[23] = tmp; + tmp = std::min(array[2], array[5]); + array[5] = std::max(array[2], array[5]); + array[2] = tmp; + tmp = std::min(array[3], array[6]); + array[6] = std::max(array[3], array[6]); + array[3] = tmp; + tmp = std::min(array[0], array[6]); + array[6] = std::max(array[0], array[6]); + array[0] = std::min(tmp, array[3]); + array[3] = std::max(tmp, array[3]); + tmp = std::min(array[4], array[7]); + array[7] = std::max(array[4], array[7]); + array[4] = tmp; + tmp = std::min(array[1], array[7]); + array[7] = std::max(array[1], array[7]); + array[1] = std::min(tmp, array[4]); + array[4] = std::max(tmp, array[4]); + tmp = std::min(array[11], array[14]); + array[14] = std::max(array[11], array[14]); + array[11] = tmp; + tmp = std::min(array[8], array[14]); + array[14] = std::max(array[8], array[14]); + array[8] = std::min(tmp, array[11]); + array[11] = std::max(tmp, array[11]); + tmp = std::min(array[12], array[15]); + array[15] = std::max(array[12], array[15]); + array[12] = tmp; + tmp = std::min(array[9], array[15]); + array[15] = std::max(array[9], array[15]); + array[9] = std::min(tmp, array[12]); + array[12] = std::max(tmp, array[12]); + tmp = std::min(array[13], array[16]); + array[16] = std::max(array[13], array[16]); + array[13] = tmp; + tmp = std::min(array[10], array[16]); + array[16] = std::max(array[10], array[16]); + array[10] = std::min(tmp, array[13]); + array[13] = std::max(tmp, array[13]); + tmp = std::min(array[20], array[23]); + array[23] = std::max(array[20], array[23]); + array[20] = tmp; + tmp = std::min(array[17], array[23]); + array[23] = std::max(array[17], array[23]); + array[17] = std::min(tmp, array[20]); + array[20] = std::max(tmp, array[20]); + tmp = std::min(array[21], array[24]); + array[24] = std::max(array[21], array[24]); + array[21] = tmp; + tmp = std::min(array[18], array[24]); + array[24] = std::max(array[18], array[24]); + array[18] = std::min(tmp, array[21]); + array[21] = std::max(tmp, array[21]); + tmp = std::min(array[19], array[22]); + array[22] = std::max(array[19], array[22]); + array[19] = tmp; + array[17] = std::max(array[8], array[17]); + tmp = std::min(array[9], array[18]); + array[18] = std::max(array[9], array[18]); + array[9] = tmp; + tmp = std::min(array[0], array[18]); + array[18] = std::max(array[0], array[18]); + array[9] = std::max(tmp, array[9]); + tmp = std::min(array[10], array[19]); + array[19] = std::max(array[10], array[19]); + array[10] = tmp; + tmp = std::min(array[1], array[19]); + array[19] = std::max(array[1], array[19]); + array[1] = std::min(tmp, array[10]); + array[10] = std::max(tmp, array[10]); + tmp = std::min(array[11], array[20]); + array[20] = std::max(array[11], array[20]); + array[11] = tmp; + tmp = std::min(array[2], array[20]); + array[20] = std::max(array[2], array[20]); + array[11] = std::max(tmp, array[11]); + tmp = std::min(array[12], array[21]); + array[21] = std::max(array[12], array[21]); + array[12] = tmp; + tmp = std::min(array[3], array[21]); + array[21] = std::max(array[3], array[21]); + array[3] = std::min(tmp, array[12]); + array[12] = std::max(tmp, array[12]); + tmp = std::min(array[13], array[22]); + array[22] = std::max(array[13], array[22]); + array[4] = std::min(array[4], array[22]); + array[13] = std::max(array[4], tmp); + tmp = std::min(array[4], tmp); + array[4] = tmp; + tmp = std::min(array[14], array[23]); + array[23] = std::max(array[14], array[23]); + array[14] = tmp; + tmp = std::min(array[5], array[23]); + array[23] = std::max(array[5], array[23]); + array[5] = std::min(tmp, array[14]); + array[14] = std::max(tmp, array[14]); + tmp = std::min(array[15], array[24]); + array[24] = std::max(array[15], array[24]); + array[15] = tmp; + array[6] = std::min(array[6], array[24]); + tmp = std::min(array[6], array[15]); + array[15] = std::max(array[6], array[15]); + array[6] = tmp; + tmp = std::min(array[7], array[16]); + array[7] = std::min(tmp, array[19]); + tmp = std::min(array[13], array[21]); + array[15] = std::min(array[15], array[23]); + tmp = std::min(array[7], tmp); + array[7] = std::min(tmp, array[15]); + array[9] = std::max(array[1], array[9]); + array[11] = std::max(array[3], array[11]); + array[17] = std::max(array[5], array[17]); + array[17] = std::max(array[11], array[17]); + array[17] = std::max(array[9], array[17]); + tmp = std::min(array[4], array[10]); + array[10] = std::max(array[4], array[10]); + array[4] = tmp; + tmp = std::min(array[6], array[12]); + array[12] = std::max(array[6], array[12]); + array[6] = tmp; + tmp = std::min(array[7], array[14]); + array[14] = std::max(array[7], array[14]); + array[7] = tmp; + tmp = std::min(array[4], array[6]); + array[6] = std::max(array[4], array[6]); + array[7] = std::max(tmp, array[7]); + tmp = std::min(array[12], array[14]); + array[14] = std::max(array[12], array[14]); + array[12] = tmp; + array[10] = std::min(array[10], array[14]); + tmp = std::min(array[6], array[7]); + array[7] = std::max(array[6], array[7]); + array[6] = tmp; + tmp = std::min(array[10], array[12]); + array[12] = std::max(array[10], array[12]); + array[10] = std::max(array[6], tmp); + tmp = std::min(array[6], tmp); + array[17] = std::max(tmp, array[17]); + tmp = std::min(array[12], array[17]); + array[17] = std::max(array[12], array[17]); + array[12] = tmp; + array[7] = std::min(array[7], array[17]); + tmp = std::min(array[7], array[10]); + array[10] = std::max(array[7], array[10]); + array[7] = tmp; + tmp = std::min(array[12], array[18]); + array[18] = std::max(array[12], array[18]); + array[12] = std::max(array[7], tmp); + array[10] = std::min(array[10], array[18]); + tmp = std::min(array[12], array[20]); + array[20] = std::max(array[12], array[20]); + array[12] = tmp; + tmp = std::min(array[10], array[20]); + return std::max(tmp, array[12]); +} + +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[0], array[1]); + array[1] = vmaxf(array[0], array[1]); + array[0] = tmp; + tmp = vminf(array[3], array[4]); + array[4] = vmaxf(array[3], array[4]); + array[3] = tmp; + tmp = vminf(array[2], array[4]); + array[4] = vmaxf(array[2], array[4]); + array[2] = vminf(tmp, array[3]); + array[3] = vmaxf(tmp, array[3]); + tmp = vminf(array[6], array[7]); + array[7] = vmaxf(array[6], array[7]); + array[6] = tmp; + tmp = vminf(array[5], array[7]); + array[7] = vmaxf(array[5], array[7]); + array[5] = vminf(tmp, array[6]); + array[6] = vmaxf(tmp, array[6]); + tmp = vminf(array[9], array[10]); + array[10] = vmaxf(array[9], array[10]); + array[9] = tmp; + tmp = vminf(array[8], array[10]); + array[10] = vmaxf(array[8], array[10]); + array[8] = vminf(tmp, array[9]); + array[9] = vmaxf(tmp, array[9]); + tmp = vminf(array[12], array[13]); + array[13] = vmaxf(array[12], array[13]); + array[12] = tmp; + tmp = vminf(array[11], array[13]); + array[13] = vmaxf(array[11], array[13]); + array[11] = vminf(tmp, array[12]); + array[12] = vmaxf(tmp, array[12]); + tmp = vminf(array[15], array[16]); + array[16] = vmaxf(array[15], array[16]); + array[15] = tmp; + tmp = vminf(array[14], array[16]); + array[16] = vmaxf(array[14], array[16]); + array[14] = vminf(tmp, array[15]); + array[15] = vmaxf(tmp, array[15]); + tmp = vminf(array[18], array[19]); + array[19] = vmaxf(array[18], array[19]); + array[18] = tmp; + tmp = vminf(array[17], array[19]); + array[19] = vmaxf(array[17], array[19]); + array[17] = vminf(tmp, array[18]); + array[18] = vmaxf(tmp, array[18]); + tmp = vminf(array[21], array[22]); + array[22] = vmaxf(array[21], array[22]); + array[21] = tmp; + tmp = vminf(array[20], array[22]); + array[22] = vmaxf(array[20], array[22]); + array[20] = vminf(tmp, array[21]); + array[21] = vmaxf(tmp, array[21]); + tmp = vminf(array[23], array[24]); + array[24] = vmaxf(array[23], array[24]); + array[23] = tmp; + tmp = vminf(array[2], array[5]); + array[5] = vmaxf(array[2], array[5]); + array[2] = tmp; + tmp = vminf(array[3], array[6]); + array[6] = vmaxf(array[3], array[6]); + array[3] = tmp; + tmp = vminf(array[0], array[6]); + array[6] = vmaxf(array[0], array[6]); + array[0] = vminf(tmp, array[3]); + array[3] = vmaxf(tmp, array[3]); + tmp = vminf(array[4], array[7]); + array[7] = vmaxf(array[4], array[7]); + array[4] = tmp; + tmp = vminf(array[1], array[7]); + array[7] = vmaxf(array[1], array[7]); + array[1] = vminf(tmp, array[4]); + array[4] = vmaxf(tmp, array[4]); + tmp = vminf(array[11], array[14]); + array[14] = vmaxf(array[11], array[14]); + array[11] = tmp; + tmp = vminf(array[8], array[14]); + array[14] = vmaxf(array[8], array[14]); + array[8] = vminf(tmp, array[11]); + array[11] = vmaxf(tmp, array[11]); + tmp = vminf(array[12], array[15]); + array[15] = vmaxf(array[12], array[15]); + array[12] = tmp; + tmp = vminf(array[9], array[15]); + array[15] = vmaxf(array[9], array[15]); + array[9] = vminf(tmp, array[12]); + array[12] = vmaxf(tmp, array[12]); + tmp = vminf(array[13], array[16]); + array[16] = vmaxf(array[13], array[16]); + array[13] = tmp; + tmp = vminf(array[10], array[16]); + array[16] = vmaxf(array[10], array[16]); + array[10] = vminf(tmp, array[13]); + array[13] = vmaxf(tmp, array[13]); + tmp = vminf(array[20], array[23]); + array[23] = vmaxf(array[20], array[23]); + array[20] = tmp; + tmp = vminf(array[17], array[23]); + array[23] = vmaxf(array[17], array[23]); + array[17] = vminf(tmp, array[20]); + array[20] = vmaxf(tmp, array[20]); + tmp = vminf(array[21], array[24]); + array[24] = vmaxf(array[21], array[24]); + array[21] = tmp; + tmp = vminf(array[18], array[24]); + array[24] = vmaxf(array[18], array[24]); + array[18] = vminf(tmp, array[21]); + array[21] = vmaxf(tmp, array[21]); + tmp = vminf(array[19], array[22]); + array[22] = vmaxf(array[19], array[22]); + array[19] = tmp; + array[17] = vmaxf(array[8], array[17]); + tmp = vminf(array[9], array[18]); + array[18] = vmaxf(array[9], array[18]); + array[9] = tmp; + tmp = vminf(array[0], array[18]); + array[18] = vmaxf(array[0], array[18]); + array[9] = vmaxf(tmp, array[9]); + tmp = vminf(array[10], array[19]); + array[19] = vmaxf(array[10], array[19]); + array[10] = tmp; + tmp = vminf(array[1], array[19]); + array[19] = vmaxf(array[1], array[19]); + array[1] = vminf(tmp, array[10]); + array[10] = vmaxf(tmp, array[10]); + tmp = vminf(array[11], array[20]); + array[20] = vmaxf(array[11], array[20]); + array[11] = tmp; + tmp = vminf(array[2], array[20]); + array[20] = vmaxf(array[2], array[20]); + array[11] = vmaxf(tmp, array[11]); + tmp = vminf(array[12], array[21]); + array[21] = vmaxf(array[12], array[21]); + array[12] = tmp; + tmp = vminf(array[3], array[21]); + array[21] = vmaxf(array[3], array[21]); + array[3] = vminf(tmp, array[12]); + array[12] = vmaxf(tmp, array[12]); + tmp = vminf(array[13], array[22]); + array[22] = vmaxf(array[13], array[22]); + array[4] = vminf(array[4], array[22]); + array[13] = vmaxf(array[4], tmp); + tmp = vminf(array[4], tmp); + array[4] = tmp; + tmp = vminf(array[14], array[23]); + array[23] = vmaxf(array[14], array[23]); + array[14] = tmp; + tmp = vminf(array[5], array[23]); + array[23] = vmaxf(array[5], array[23]); + array[5] = vminf(tmp, array[14]); + array[14] = vmaxf(tmp, array[14]); + tmp = vminf(array[15], array[24]); + array[24] = vmaxf(array[15], array[24]); + array[15] = tmp; + array[6] = vminf(array[6], array[24]); + tmp = vminf(array[6], array[15]); + array[15] = vmaxf(array[6], array[15]); + array[6] = tmp; + tmp = vminf(array[7], array[16]); + array[7] = vminf(tmp, array[19]); + tmp = vminf(array[13], array[21]); + array[15] = vminf(array[15], array[23]); + tmp = vminf(array[7], tmp); + array[7] = vminf(tmp, array[15]); + array[9] = vmaxf(array[1], array[9]); + array[11] = vmaxf(array[3], array[11]); + array[17] = vmaxf(array[5], array[17]); + array[17] = vmaxf(array[11], array[17]); + array[17] = vmaxf(array[9], array[17]); + tmp = vminf(array[4], array[10]); + array[10] = vmaxf(array[4], array[10]); + array[4] = tmp; + tmp = vminf(array[6], array[12]); + array[12] = vmaxf(array[6], array[12]); + array[6] = tmp; + tmp = vminf(array[7], array[14]); + array[14] = vmaxf(array[7], array[14]); + array[7] = tmp; + tmp = vminf(array[4], array[6]); + array[6] = vmaxf(array[4], array[6]); + array[7] = vmaxf(tmp, array[7]); + tmp = vminf(array[12], array[14]); + array[14] = vmaxf(array[12], array[14]); + array[12] = tmp; + array[10] = vminf(array[10], array[14]); + tmp = vminf(array[6], array[7]); + array[7] = vmaxf(array[6], array[7]); + array[6] = tmp; + tmp = vminf(array[10], array[12]); + array[12] = vmaxf(array[10], array[12]); + array[10] = vmaxf(array[6], tmp); + tmp = vminf(array[6], tmp); + array[17] = vmaxf(tmp, array[17]); + tmp = vminf(array[12], array[17]); + array[17] = vmaxf(array[12], array[17]); + array[12] = tmp; + array[7] = vminf(array[7], array[17]); + tmp = vminf(array[7], array[10]); + array[10] = vmaxf(array[7], array[10]); + array[7] = tmp; + tmp = vminf(array[12], array[18]); + array[18] = vmaxf(array[12], array[18]); + array[12] = vmaxf(array[7], tmp); + array[10] = vminf(array[10], array[18]); + tmp = vminf(array[12], array[20]); + array[20] = vmaxf(array[12], array[20]); + array[12] = tmp; + tmp = vminf(array[10], array[20]); + return vmaxf(tmp, array[12]); +} + template inline T median(T arg, ARGS... args) { return median(std::array{std::move(arg), std::move(args)...}); } -template -inline T median(T a, T b, T c) -{ - return std::max(std::min(a, b), std::min(c, std::max(a, b))); -} - -template<> -inline vfloat median(vfloat a, vfloat b, vfloat c) -{ - return vmaxf(vminf(a, b), vminf(c, vmaxf(a, b))); -} - -// See http://stackoverflow.com/questions/480960/code-to-calculate-median-of-five-in-c-sharp -template -inline T median(T a, T b, T c, T d, T e) -{ - if (b < a) { - std::swap(a, b); - } - if (d < c) { - std::swap(c, d); - } - - if (c < a) { - std::swap(b, d); - c = a; - } - - a = e; - - if (b < a) { - std::swap(a, b); - } - - if (a < c) { - std::swap(b, d); - a = c; - } - - return std::min(a, d); -} - -template<> -inline vfloat median(vfloat a, vfloat b, vfloat c, vfloat d, vfloat e) -{ - const vfloat f = vmaxf(vminf(a, b), vminf(c, d)); - const vfloat g = vminf(vmaxf(a, b), vmaxf(c, d)); - return median(e, f, g); -} - -// See http://www.cs.hut.fi/~cessu/selection/V_7_4 -// Hand unrolled algorithm by Flössie ;) -template -inline T median(T a, T b, T c, T d, T e, T f, T g) -{ - if (b < a) { - std::swap(a, b); - } - - if (d < c) { - std::swap(b, c); - std::swap(b, d); - } else { - std::swap(b, c); - } - - if (b < a) { - std::swap(a, b); - } else { - std::swap(c, d); - } - - if (e < d) { - std::swap(c, d); - std::swap(c, e); - - if (c < b) { - std::swap(b, c); - - if (g < f) { - std::swap(d, g); - std::swap(e, g); - std::swap(f, g); - } else { - std::swap(d, f); - std::swap(e, f); - } - - if (g < c) { - std::swap(a, d); - - if (d < b) { - std::swap(a, b); - } else { - std::swap(a, d); - b = d; - } - - if (g < f) { - return std::max(a, g); - } - - return std::max(b, f); - } - - if (f < d) { - std::swap(d, f); - } - - if (d < c) { - return std::min(c, f); - } - - return std::min(d, e); - } - - if (d < c) { - std::swap(c, e); - - if (f < b) { - if (g < b) { - return b; - } - - return std::min(d, g); - } - - if (g < f) { - std::swap(e, g); - std::swap(f, g); - } else { - std::swap(e, f); - } - - if (e < d) { - return std::min(d, g); - } - - return std::min(e, f); - } - - if (g < f) { - std::swap(f, g); - } - - std::swap(e, f); - - if (e < c) { - if (g < b) { - return b; - } - - return std::min(c, g); - } - - if (d < e) { - return std::min(d, f); - } - - return std::min(e, f); - } - - if (d < b) { - std::swap(b, d); - } else { - std::swap(c, e); - } - - if (e < d) { - std::swap(d, e); - - if (f < b) { - if (g < b) { - return b; - } - - return std::min(d, g); - } - - if (g < f) { - std::swap(e, g); - std::swap(f, g); - } else { - std::swap(e, f); - } - - if (e < d) { - return std::min(d, g); - } - - return std::min(e, f); - } - - if (g < f) { - std::swap(c, g); - std::swap(f, g); - } else { - std::swap(c, f); - } - - if (c < d) { - if (g < b) { - return b; - } - - return std::min(d, g); - } - - if (e < c) { - return std::min(e, f); - } - - return std::min(c, f); -} - // middle 4 of 6 elements, #define MIDDLE4OF6(s0,s1,s2,s3,s4,s5,d0,d1,d2,d3,d4,d5,temp) \ {\ diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 7be671560..fa05e34c3 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -422,18 +422,6 @@ extern const Settings* settings; #define ABS(a) ((a)<0?-(a):(a)) #define DIST(a,b) (ABS(a-b)) -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } - -#define med3x3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \ -p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; p[5]=a5; p[6]=a6; p[7]=a7; p[8]=a8; \ -PIX_SORT(p[1],p[2]); PIX_SORT(p[4],p[5]); PIX_SORT(p[7],p[8]); \ -PIX_SORT(p[0],p[1]); PIX_SORT(p[3],p[4]); PIX_SORT(p[6],p[7]); \ -PIX_SORT(p[1],p[2]); PIX_SORT(p[4],p[5]); PIX_SORT(p[7],p[8]); \ -PIX_SORT(p[0],p[3]); PIX_SORT(p[5],p[8]); PIX_SORT(p[4],p[7]); \ -PIX_SORT(p[3],p[6]); PIX_SORT(p[1],p[4]); PIX_SORT(p[2],p[5]); \ -PIX_SORT(p[4],p[7]); PIX_SORT(p[4],p[2]); PIX_SORT(p[6],p[4]); \ -PIX_SORT(p[4],p[2]); median=p[4];} //a4 is the median - RawImageSource::RawImageSource () : ImageSource() , plistener(NULL) @@ -1333,12 +1321,10 @@ SSEFUNCTION int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thres #endif for (int i = 2; i < H - 2; i++) { - float p[9], temp; // we need this for med3x3 macro - for (int j = 2; j < W - 2; j++) { - med3x3(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], - rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], - rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2], temp); + const float& temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], + rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], + rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); cfablur[i * W + j] = rawData[i][j] - temp; } } @@ -3039,9 +3025,6 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur jnext = j + 2; } - //med3x3(riFlatFile->data[iprev][jprev], riFlatFile->data[iprev][j], riFlatFile->data[iprev][jnext], - // riFlatFile->data[i][jprev], riFlatFile->data[i][j], riFlatFile->data[i][jnext], - // riFlatFile->data[inext][jprev], riFlatFile->data[inext][j], riFlatFile->data[inext][jnext], cfatmp[i*W+j]); med = median(riFlatFile->data[iprev][j], riFlatFile->data[i][jprev], riFlatFile->data[i][j], riFlatFile->data[i][jnext], riFlatFile->data[inext][j]); // if (riFlatFile->data[i][j]>hotdeadthresh*median || median>hotdeadthresh*riFlatFile->data[i][j]) { @@ -5148,11 +5131,4 @@ void RawImageSource::cleanup () delete phaseOneIccCurveInv; } -#undef PIX_SORT -#undef med3x3 - } /* namespace */ - -#undef PIX_SORT -#undef med3x3 - From cb05456746066b05fd9504ac3a3cb545a5b0debe Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 24 Jun 2016 14:47:46 +0200 Subject: [PATCH 115/232] Fix broken decode for files from Sony DSC-RX1RM2, fixes #3358 --- rtengine/dcraw.cc | 16 +++++++++------- rtengine/dcraw.patch | 45 +++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ed7b43c19..bae38b193 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9316,13 +9316,15 @@ konica_400z: width -= 6; } else if (!strcmp(make,"Sony") && raw_width == 7392) { width -= 30; - } else if (!strcmp(make,"Sony") && raw_width == 8000) { - width -= 32; - if (!strncmp(model,"DSC",3)) { - tiff_bps = 14; - load_raw = &CLASS unpacked_load_raw; - black = 512; - } +// this was introduced with update to dcraw 9.27 +// but led to broken decode for compressed files from Sony DSC-RX1RM2 +// } else if (!strcmp(make,"Sony") && raw_width == 8000) { +// width -= 32; +// if (!strncmp(model,"DSC",3)) { +// tiff_bps = 14; +// load_raw = &CLASS unpacked_load_raw; +// black = 512; +// } } else if (!strcmp(model,"DSLR-A100")) { if (width == 3880) { height--; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index a3c0a354f..baa0af282 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2016-06-17 13:44:42 +0000 -+++ dcraw.cc 2016-06-17 14:49:21 +0000 +--- dcraw.c 2016-06-24 11:50:34 +0000 ++++ dcraw.cc 2016-06-24 12:40:36 +0000 @@ -1,3 +1,16 @@ +/*RT*/#include +/*RT*/#include @@ -1013,11 +1013,11 @@ - int dir[5] = { 1, width, -1, -width, 1 }; - int row, col, diff[2], guess[2], c, d, i; - ushort (*pix)[4]; -+/* RT: delete interpolation functions */ - +- - border_interpolate(3); - if (verbose) fprintf (stderr,_("PPG interpolation...\n")); -- ++/* RT: delete interpolation functions */ + -/* Fill in the green layer with gradients and pattern recognition: */ - for (row=3; row < height-3; row++) - for (col=3+(FC(row,3) & 1), c=FC(row,col); col < width-3; col+=2) { @@ -1080,7 +1080,7 @@ - char (*homo)[TS][TS], *buffer; - - if (verbose) fprintf (stderr,_("AHD interpolation...\n")); - +- - cielab (0,0); - border_interpolate(5); - buffer = (char *) malloc (26*TS*TS); @@ -1091,7 +1091,7 @@ - - for (top=2; top < height-5; top += TS-6) - for (left=2; left < width-5; left += TS-6) { -- + -/* Interpolate green horizontally and vertically: */ - for (row=top; row < top+TS && row < height-2; row++) { - col = left + (FC(row,left) & 1); @@ -1717,7 +1717,30 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -9357,6 +9472,18 @@ +@@ -9201,13 +9316,15 @@ + width -= 6; + } else if (!strcmp(make,"Sony") && raw_width == 7392) { + width -= 30; +- } else if (!strcmp(make,"Sony") && raw_width == 8000) { +- width -= 32; +- if (!strncmp(model,"DSC",3)) { +- tiff_bps = 14; +- load_raw = &CLASS unpacked_load_raw; +- black = 512; +- } ++// this was introduced with update to dcraw 9.27 ++// but led to broken decode for compressed files from Sony DSC-RX1RM2 ++// } else if (!strcmp(make,"Sony") && raw_width == 8000) { ++// width -= 32; ++// if (!strncmp(model,"DSC",3)) { ++// tiff_bps = 14; ++// load_raw = &CLASS unpacked_load_raw; ++// black = 512; ++// } + } else if (!strcmp(model,"DSLR-A100")) { + if (width == 3880) { + height--; +@@ -9357,6 +9474,18 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1736,7 +1759,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9371,9 +9498,9 @@ +@@ -9371,9 +9500,9 @@ if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; @@ -1748,7 +1771,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -9452,199 +9579,250 @@ +@@ -9452,199 +9581,250 @@ } #endif @@ -2182,7 +2205,7 @@ struct tiff_tag { ushort tag, type; int count; -@@ -9667,594 +9845,11 @@ +@@ -9667,594 +9847,11 @@ char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; From 787a8927370e1fca8adb8323208f0cc7a87a9bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 26 Jun 2016 15:14:45 +0200 Subject: [PATCH 116/232] Make further use of `median()` and replace `ULIM` and `ULIMV` (#3346) --- rtengine/amaze_demosaic_RT.cc | 21 ++-- rtengine/demosaic_algos.cc | 177 +++++++++++----------------------- rtengine/median.h | 61 ++---------- rtengine/rawimagesource.cc | 13 ++- rtengine/rt_math.h | 6 -- rtengine/sleefsseavx.c | 6 -- 6 files changed, 85 insertions(+), 199 deletions(-) diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 6da291303..a34e8e7f7 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -32,6 +32,7 @@ #include "../rtgui/multilangmgr.h" #include "sleef.c" #include "opthelper.h" +#include "median.h" #include "StopWatch.h" namespace rtengine @@ -552,7 +553,7 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, vfloat hwtv = onev + temp2v / ( epsv + Ginthv + LVF( cfa[indx])); vmask hcdmask = vmaskf_gt( nsgnv * hcdv, ZEROV ); vfloat hcdoldv = hcdv; - vfloat tempv = nsgnv * (LVF(cfa[indx]) - ULIMV( Ginthv, LVFU(cfa[indx - 1]), LVFU(cfa[indx + 1]) )); + vfloat tempv = nsgnv * (LVF(cfa[indx]) - median( Ginthv, LVFU(cfa[indx - 1]), LVFU(cfa[indx + 1]) )); hcdv = vself( vmaskf_lt( temp2v, -(LVF(cfa[indx]) + Ginthv)), tempv, vintpf(hwtv, hcdv, tempv)); hcdv = vself( hcdmask, hcdv, hcdoldv ); hcdv = vself( vmaskf_gt( Ginthv, clip_ptv), tempv, hcdv); @@ -563,7 +564,7 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, vfloat vwtv = onev + temp2v / ( epsv + Gintvv + LVF( cfa[indx])); vmask vcdmask = vmaskf_gt( nsgnv * vcdv, ZEROV ); vfloat vcdoldv = vcdv; - tempv = nsgnv * (LVF(cfa[indx]) - ULIMV( Gintvv, LVF(cfa[indx - v1]), LVF(cfa[indx + v1]) )); + tempv = nsgnv * (LVF(cfa[indx]) - median( Gintvv, LVF(cfa[indx - v1]), LVF(cfa[indx + v1]) )); vcdv = vself( vmaskf_lt( temp2v, -(LVF(cfa[indx]) + Gintvv)), tempv, vintpf(vwtv, vcdv, tempv)); vcdv = vself( vcdmask, vcdv, vcdoldv ); vcdv = vself( vmaskf_gt( Gintvv, clip_ptv), tempv, vcdv); @@ -1071,13 +1072,13 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, vfloat rbmv = (wtsev * rbnwv + wtnwv * rbsev) / (wtsev + wtnwv); - temp1v = ULIMV(rbmv , LC2VFU(cfa[indx - m1]), LC2VFU(cfa[indx + m1])); + temp1v = median(rbmv , LC2VFU(cfa[indx - m1]), LC2VFU(cfa[indx + m1])); vfloat wtv = vmul2f(cfav - rbmv) / (epsv + rbmv + cfav); temp2v = vintpf(wtv, rbmv, temp1v); temp2v = vself(vmaskf_lt(rbmv + rbmv, cfav), temp1v, temp2v); temp2v = vself(vmaskf_lt(rbmv, cfav), temp2v, rbmv); - STVFU(rbm[indx1], vself(vmaskf_gt(temp2v, clip_ptv), ULIMV(temp2v , LC2VFU(cfa[indx - m1]), LC2VFU(cfa[indx + m1])), temp2v )); + STVFU(rbm[indx1], vself(vmaskf_gt(temp2v, clip_ptv), median(temp2v , LC2VFU(cfa[indx - m1]), LC2VFU(cfa[indx + m1])), temp2v )); temp1v = LC2VFU(cfa[indx + p1]); @@ -1096,13 +1097,13 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, vfloat rbpv = (wtnev * rbswv + wtswv * rbnev) / (wtnev + wtswv); - temp1v = ULIMV(rbpv , LC2VFU(cfa[indx - p1]), LC2VFU(cfa[indx + p1])); + temp1v = median(rbpv , LC2VFU(cfa[indx - p1]), LC2VFU(cfa[indx + p1])); wtv = vmul2f(cfav - rbpv) / (epsv + rbpv + cfav); temp2v = vintpf(wtv, rbpv, temp1v); temp2v = vself(vmaskf_lt(rbpv + rbpv, cfav), temp1v, temp2v); temp2v = vself(vmaskf_lt(rbpv, cfav), temp2v, rbpv); - STVFU(rbp[indx1], vself(vmaskf_gt(temp2v, clip_ptv), ULIMV(temp2v , LC2VFU(cfa[indx - p1]), LC2VFU(cfa[indx + p1])), temp2v )); + STVFU(rbp[indx1], vself(vmaskf_gt(temp2v, clip_ptv), median(temp2v , LC2VFU(cfa[indx - p1]), LC2VFU(cfa[indx + p1])), temp2v )); vfloat rbvarmv = epssqv + (gausseven0v * (LVFU(Dgrbsq1m[(indx - v1) >> 1]) + LVFU(Dgrbsq1m[(indx - 1) >> 1]) + LVFU(Dgrbsq1m[(indx + 1) >> 1]) + LVFU(Dgrbsq1m[(indx + v1) >> 1])) + gausseven1v * (LVFU(Dgrbsq1m[(indx - v2 - 1) >> 1]) + LVFU(Dgrbsq1m[(indx - v2 + 1) >> 1]) + LVFU(Dgrbsq1m[(indx - 2 - v1) >> 1]) + LVFU(Dgrbsq1m[(indx + 2 - v1) >> 1]) + @@ -1254,12 +1255,12 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, gdv = vself(vmaskf_lt(vabsf(onev - crdv), arthreshv), gdv, gd2v); vfloat Gintvv = (LC2VFU(dirwts0[indx - v1]) * gdv + LC2VFU(dirwts0[indx + v1]) * guv) / (LC2VFU(dirwts0[indx + v1]) + LC2VFU(dirwts0[indx - v1])); - vfloat Gint1v = ULIMV(Gintvv , LC2VFU(cfa[indx - v1]), LC2VFU(cfa[indx + v1])); + vfloat Gint1v = median(Gintvv , LC2VFU(cfa[indx - v1]), LC2VFU(cfa[indx + v1])); vfloat vwtv = vmul2f(rbintv - Gintvv) / (epsv + Gintvv + rbintv); vfloat Gint2v = vintpf(vwtv, Gintvv, Gint1v); Gint1v = vself(vmaskf_lt(vmul2f(Gintvv), rbintv), Gint1v, Gint2v); Gintvv = vself(vmaskf_lt(Gintvv, rbintv), Gint1v, Gintvv); - Gintvv = vself(vmaskf_gt(Gintvv, clip_ptv), ULIMV(Gintvv, LC2VFU(cfa[indx - v1]), LC2VFU(cfa[indx + v1])), Gintvv); + Gintvv = vself(vmaskf_gt(Gintvv, clip_ptv), median(Gintvv, LC2VFU(cfa[indx - v1]), LC2VFU(cfa[indx + v1])), Gintvv); vfloat crlv = vmul2f(LC2VFU(cfa[indx - 1])) / (epsv + rbintv + LVFU(rbint[(indx1 - 1)])); vfloat glv = rbintv * crlv; @@ -1272,12 +1273,12 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, grv = vself(vmaskf_lt(vabsf(onev - crrv), arthreshv), grv, gr2v); vfloat Ginthv = (LC2VFU(dirwts1[indx - 1]) * grv + LC2VFU(dirwts1[indx + 1]) * glv) / (LC2VFU(dirwts1[indx - 1]) + LC2VFU(dirwts1[indx + 1])); - vfloat Gint1h = ULIMV(Ginthv , LC2VFU(cfa[indx - 1]), LC2VFU(cfa[indx + 1])); + vfloat Gint1h = median(Ginthv , LC2VFU(cfa[indx - 1]), LC2VFU(cfa[indx + 1])); vfloat hwtv = vmul2f(rbintv - Ginthv) / (epsv + Ginthv + rbintv); vfloat Gint2h = vintpf(hwtv, Ginthv, Gint1h); Gint1h = vself(vmaskf_lt(vmul2f(Ginthv), rbintv), Gint1h, Gint2h); Ginthv = vself(vmaskf_lt(Ginthv, rbintv), Gint1h, Ginthv); - Ginthv = vself(vmaskf_gt(Ginthv, clip_ptv), ULIMV(Ginthv, LC2VFU(cfa[indx - 1]), LC2VFU(cfa[indx + 1])), Ginthv); + Ginthv = vself(vmaskf_gt(Ginthv, clip_ptv), median(Ginthv, LC2VFU(cfa[indx - 1]), LC2VFU(cfa[indx + 1])), Ginthv); vfloat greenv = vself(copymask, vintpf(LVFU(hvwt[indx1]), Gintvv, Ginthv), LC2VFU(rgbgreen[indx])); STC2VFU(rgbgreen[indx], greenv); diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 72f801bab..b5e05ba53 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -36,6 +36,7 @@ #include "procparams.h" #include "sleef.c" #include "opthelper.h" +#include "median.h" //#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP @@ -58,9 +59,6 @@ namespace rtengine #define x00625(a) xdivf(a, 4) #define x0125(a) xdivf(a, 3) - -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } -#define PIX_SORTV(av,bv) tempv = _mm_min_ps(av,bv); bv = _mm_max_ps(av,bv); av = tempv; extern const Settings* settings; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -929,7 +927,7 @@ void RawImageSource::ppg_demosaic() } d = dir[i = diff[0] > diff[1]]; - pix[0][1] = ULIM(static_cast(guess[i] >> 2), pix[d][1], pix[-d][1]); + pix[0][1] = median(static_cast(guess[i] >> 2), pix[d][1], pix[-d][1]); } if(plistener) { @@ -1253,8 +1251,8 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus" for (col = 6 + (FC(row, 2) & 1), indx = row * width + col, c = FC(row, col) / 2; col < u - 6; col += 2, indx += 2) { f[0] = 1.f + 78.f * SQR((float)dif[indx][0]) + 69.f * (SQR((float) dif[indx - v][0]) + SQR((float)dif[indx + v][0])) + 51.f * (SQR((float)dif[indx - x][0]) + SQR((float)dif[indx + x][0])) + 21.f * (SQR((float)dif[indx - z][0]) + SQR((float)dif[indx + z][0])) - 6.f * SQR((float)dif[indx - v][0] + dif[indx][0] + dif[indx + v][0]) - 10.f * (SQR((float)dif[indx - x][0] + dif[indx - v][0] + dif[indx][0]) + SQR((float)dif[indx][0] + dif[indx + v][0] + dif[indx + x][0])) - 7.f * (SQR((float)dif[indx - z][0] + dif[indx - x][0] + dif[indx - v][0]) + SQR((float)dif[indx + v][0] + dif[indx + x][0] + dif[indx + z][0])); f[1] = 1.f + 78.f * SQR((float)dif[indx][1]) + 69.f * (SQR((float)dif[indx - 2][1]) + SQR((float)dif[indx + 2][1])) + 51.f * (SQR((float)dif[indx - 4][1]) + SQR((float)dif[indx + 4][1])) + 21.f * (SQR((float)dif[indx - 6][1]) + SQR((float)dif[indx + 6][1])) - 6.f * SQR((float)dif[indx - 2][1] + dif[indx][1] + dif[indx + 2][1]) - 10.f * (SQR((float)dif[indx - 4][1] + dif[indx - 2][1] + dif[indx][1]) + SQR((float)dif[indx][1] + dif[indx + 2][1] + dif[indx + 4][1])) - 7.f * (SQR((float)dif[indx - 6][1] + dif[indx - 4][1] + dif[indx - 2][1]) + SQR((float)dif[indx + 2][1] + dif[indx + 4][1] + dif[indx + 6][1])); - g[0] = ULIM(0.725f * dif[indx][0] + 0.1375f * dif[indx - v][0] + 0.1375f * dif[indx + v][0], dif[indx - v][0], dif[indx + v][0]); - g[1] = ULIM(0.725f * dif[indx][1] + 0.1375f * dif[indx - 2][1] + 0.1375f * dif[indx + 2][1], dif[indx - 2][1], dif[indx + 2][1]); + g[0] = median(0.725f * dif[indx][0] + 0.1375f * dif[indx - v][0] + 0.1375f * dif[indx + v][0], static_cast(dif[indx - v][0]), static_cast(dif[indx + v][0])); + g[1] = median(0.725f * dif[indx][1] + 0.1375f * dif[indx - 2][1] + 0.1375f * dif[indx + 2][1], static_cast(dif[indx - 2][1]), static_cast(dif[indx + 2][1])); chr[indx][c] = (f[1] * g[0] + f[0] * g[1]) / (f[0] + f[1]); } @@ -1268,10 +1266,10 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus" f[1] = 1.f / (float)(1.f + fabs((float)chr[indx - u + 1][c] - chr[indx + u - 1][c]) + fabs((float)chr[indx - u + 1][c] - chr[indx - w + 3][c]) + fabs((float)chr[indx + u - 1][c] - chr[indx - w + 3][c])); f[2] = 1.f / (float)(1.f + fabs((float)chr[indx + u - 1][c] - chr[indx - u + 1][c]) + fabs((float)chr[indx + u - 1][c] - chr[indx + w + 3][c]) + fabs((float)chr[indx - u + 1][c] - chr[indx + w - 3][c])); f[3] = 1.f / (float)(1.f + fabs((float)chr[indx + u + 1][c] - chr[indx - u - 1][c]) + fabs((float)chr[indx + u + 1][c] - chr[indx + w - 3][c]) + fabs((float)chr[indx - u - 1][c] - chr[indx + w + 3][c])); - g[0] = ULIM(chr[indx - u - 1][c], chr[indx - w - 1][c], chr[indx - u - 3][c]); - g[1] = ULIM(chr[indx - u + 1][c], chr[indx - w + 1][c], chr[indx - u + 3][c]); - g[2] = ULIM(chr[indx + u - 1][c], chr[indx + w - 1][c], chr[indx + u - 3][c]); - g[3] = ULIM(chr[indx + u + 1][c], chr[indx + w + 1][c], chr[indx + u + 3][c]); + g[0] = median(chr[indx - u - 1][c], chr[indx - w - 1][c], chr[indx - u - 3][c]); + g[1] = median(chr[indx - u + 1][c], chr[indx - w + 1][c], chr[indx - u + 3][c]); + g[2] = median(chr[indx + u - 1][c], chr[indx + w - 1][c], chr[indx + u - 3][c]); + g[3] = median(chr[indx + u + 1][c], chr[indx + w + 1][c], chr[indx + u + 3][c]); chr[indx][c] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); image[indx][1] = CLIP(image[indx][2 - d] + chr[indx][1 - c]); image[indx][d] = CLIP(image[indx][1] - chr[indx][c]); @@ -1459,7 +1457,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i float Y = v0 + xdiv2f(rix[0][0]); if (rix[4][0] > 1.75f * Y) { - rix[0][0] = ULIM(rix[0][0], rix[4][ -1], rix[4][ 1]); + rix[0][0] = median(rix[0][0], rix[4][ -1], rix[4][ 1]); } else { rix[0][0] = LIM(rix[0][0], 0.0f, 1.0f); } @@ -1471,7 +1469,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i Y = v0 + xdiv2f(rix[1][0]); if (rix[4][0] > 1.75f * Y) { - rix[1][0] = ULIM(rix[1][0], rix[4][-w1], rix[4][w1]); + rix[1][0] = median(rix[1][0], rix[4][-w1], rix[4][w1]); } else { rix[1][0] = LIM(rix[1][0], 0.0f, 1.0f); } @@ -1764,43 +1762,22 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i int d = c + 3 - (c == 0 ? 0 : 1); int cc = 1; #ifdef __SSE2__ - __m128 p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v, tempv; for (; cc < cc1 - 4; cc += 4) { rix[d] = qix[d] + rr * cc1 + cc; rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - p1v = LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]); - p2v = LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]); - p3v = LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]); - p4v = LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]); - p5v = LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]); - p6v = LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]); - p7v = LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]); - p8v = LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]); - p9v = LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]); - // Sort for median of 9 values - PIX_SORTV(p2v, p3v); - PIX_SORTV(p5v, p6v); - PIX_SORTV(p8v, p9v); - PIX_SORTV(p1v, p2v); - PIX_SORTV(p4v, p5v); - PIX_SORTV(p7v, p8v); - PIX_SORTV(p2v, p3v); - PIX_SORTV(p5v, p6v); - PIX_SORTV(p8v, p9v); - p4v = _mm_max_ps(p1v, p4v); - p6v = _mm_min_ps(p6v, p9v); - PIX_SORTV(p5v, p8v); - p7v = _mm_max_ps(p4v, p7v); - p5v = _mm_max_ps(p5v, p2v); - p3v = _mm_min_ps(p3v, p6v); - p5v = _mm_min_ps(p5v, p8v); - PIX_SORTV(p5v, p3v); - p5v = _mm_max_ps(p7v, p5v); - p5v = _mm_min_ps(p3v, p5v); - _mm_storeu_ps(&rix[d][0], p5v); + const __m128 p1v = LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]); + const __m128 p2v = LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]); + const __m128 p3v = LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]); + const __m128 p4v = LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]); + const __m128 p5v = LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]); + const __m128 p6v = LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]); + const __m128 p7v = LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]); + const __m128 p8v = LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]); + const __m128 p9v = LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]); + _mm_storeu_ps(&rix[d][0], median(p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v)); } #endif @@ -1811,36 +1788,16 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - float p1 = rix[c][-w1 - 1] - rix[1][-w1 - 1]; - float p2 = rix[c][-w1] - rix[1][-w1]; - float p3 = rix[c][-w1 + 1] - rix[1][-w1 + 1]; - float p4 = rix[c][ -1] - rix[1][ -1]; - float p5 = rix[c][ 0] - rix[1][ 0]; - float p6 = rix[c][ 1] - rix[1][ 1]; - float p7 = rix[c][ w1 - 1] - rix[1][ w1 - 1]; - float p8 = rix[c][ w1] - rix[1][ w1]; - float p9 = rix[c][ w1 + 1] - rix[1][ w1 + 1]; - // Sort for median of 9 values - PIX_SORT(p2, p3); - PIX_SORT(p5, p6); - PIX_SORT(p8, p9); - PIX_SORT(p1, p2); - PIX_SORT(p4, p5); - PIX_SORT(p7, p8); - PIX_SORT(p2, p3); - PIX_SORT(p5, p6); - PIX_SORT(p8, p9); - PIX_SORT(p1, p4); - PIX_SORT(p6, p9); - PIX_SORT(p5, p8); - PIX_SORT(p4, p7); - PIX_SORT(p2, p5); - PIX_SORT(p3, p6); - PIX_SORT(p5, p8); - PIX_SORT(p5, p3); - PIX_SORT(p7, p5); - PIX_SORT(p5, p3); - rix[d][0] = p5; + const float p1 = rix[c][-w1 - 1] - rix[1][-w1 - 1]; + const float p2 = rix[c][-w1] - rix[1][-w1]; + const float p3 = rix[c][-w1 + 1] - rix[1][-w1 + 1]; + const float p4 = rix[c][ -1] - rix[1][ -1]; + const float p5 = rix[c][ 0] - rix[1][ 0]; + const float p6 = rix[c][ 1] - rix[1][ 1]; + const float p7 = rix[c][ w1 - 1] - rix[1][ w1 - 1]; + const float p8 = rix[c][ w1] - rix[1][ w1]; + const float p9 = rix[c][ w1 + 1] - rix[1][ w1 + 1]; + rix[d][0] = median(p1, p2, p3, p4, p5, p6, p7, p8, p9); } } } @@ -2158,8 +2115,8 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) egv = LIMV(epssqv + c78v * SQRV(LVFU(hdif[indx1])) + c69v * (SQRV(LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]))) + c51v * (SQRV(LVFU(hdif[indx1 - h2])) + SQRV(LVFU(hdif[indx1 + h2]))) + c21v * (SQRV(LVFU(hdif[indx1 - h3])) + SQRV(LVFU(hdif[indx1 + h3]))) - c6v * SQRV(LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1])) - c10v * (SQRV(LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1])) + SQRV(LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]))) - c7v * (SQRV(LVFU(hdif[indx1 - h3]) + LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]) + LVFU(hdif[indx1 + h3]))), zerov, onev); //Limit chrominance using H/V neighbourhood - nvv = ULIMV(d725v * LVFU(vdif[indx1]) + d1375v * LVFU(vdif[indx1 - v1]) + d1375v * LVFU(vdif[indx1 + v1]), LVFU(vdif[indx1 - v1]), LVFU(vdif[indx1 + v1])); - evv = ULIMV(d725v * LVFU(hdif[indx1]) + d1375v * LVFU(hdif[indx1 - h1]) + d1375v * LVFU(hdif[indx1 + h1]), LVFU(hdif[indx1 - h1]), LVFU(hdif[indx1 + h1])); + nvv = median(d725v * LVFU(vdif[indx1]) + d1375v * LVFU(vdif[indx1 - v1]) + d1375v * LVFU(vdif[indx1 + v1]), LVFU(vdif[indx1 - v1]), LVFU(vdif[indx1 + v1])); + evv = median(d725v * LVFU(hdif[indx1]) + d1375v * LVFU(hdif[indx1 - h1]) + d1375v * LVFU(hdif[indx1 + h1]), LVFU(hdif[indx1 - h1]), LVFU(hdif[indx1 + h1])); //Chrominance estimation tempv = (egv * nvv + ngv * evv) / (ngv + egv); _mm_storeu_ps(&(chr[d][indx1]), tempv); @@ -2176,8 +2133,8 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) eg = LIM(epssq + 78.0f * SQR(hdif[indx1]) + 69.0f * (SQR(hdif[indx1 - h1]) + SQR(hdif[indx1 + h1])) + 51.0f * (SQR(hdif[indx1 - h2]) + SQR(hdif[indx1 + h2])) + 21.0f * (SQR(hdif[indx1 - h3]) + SQR(hdif[indx1 + h3])) - 6.0f * SQR(hdif[indx1 - h1] + hdif[indx1] + hdif[indx1 + h1]) - 10.0f * (SQR(hdif[indx1 - h2] + hdif[indx1 - h1] + hdif[indx1]) + SQR(hdif[indx1] + hdif[indx1 + h1] + hdif[indx1 + h2])) - 7.0f * (SQR(hdif[indx1 - h3] + hdif[indx1 - h2] + hdif[indx1 - h1]) + SQR(hdif[indx1 + h1] + hdif[indx1 + h2] + hdif[indx1 + h3])), 0.f, 1.f); //Limit chrominance using H/V neighbourhood - nv = ULIM(0.725f * vdif[indx1] + 0.1375f * vdif[indx1 - v1] + 0.1375f * vdif[indx1 + v1], vdif[indx1 - v1], vdif[indx1 + v1]); - ev = ULIM(0.725f * hdif[indx1] + 0.1375f * hdif[indx1 - h1] + 0.1375f * hdif[indx1 + h1], hdif[indx1 - h1], hdif[indx1 + h1]); + nv = median(0.725f * vdif[indx1] + 0.1375f * vdif[indx1 - v1] + 0.1375f * vdif[indx1 + v1], vdif[indx1 - v1], vdif[indx1 + v1]); + ev = median(0.725f * hdif[indx1] + 0.1375f * hdif[indx1 - h1] + 0.1375f * hdif[indx1 + h1], hdif[indx1 - h1], hdif[indx1 + h1]); //Chrominance estimation chr[d][indx1] = (eg * nv + ng * ev) / (ng + eg); //Green channel population @@ -2207,10 +2164,10 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) swgv = onev / (epsv + vabsf(LVFU(chr[c][(indx + v1 - h1) >> 1]) - LVFU(chr[c][(indx + v3 + h3) >> 1])) + vabsf(LVFU(chr[c][(indx - v1 + h1) >> 1]) - LVFU(chr[c][(indx + v3 - h3) >> 1]))); segv = onev / (epsv + vabsf(LVFU(chr[c][(indx + v1 + h1) >> 1]) - LVFU(chr[c][(indx + v3 - h3) >> 1])) + vabsf(LVFU(chr[c][(indx - v1 - h1) >> 1]) - LVFU(chr[c][(indx + v3 + h3) >> 1]))); //Limit NW,NE,SW,SE Color differences - nwvv = ULIMV(LVFU(chr[c][(indx - v1 - h1) >> 1]), LVFU(chr[c][(indx - v3 - h1) >> 1]), LVFU(chr[c][(indx - v1 - h3) >> 1])); - nevv = ULIMV(LVFU(chr[c][(indx - v1 + h1) >> 1]), LVFU(chr[c][(indx - v3 + h1) >> 1]), LVFU(chr[c][(indx - v1 + h3) >> 1])); - swvv = ULIMV(LVFU(chr[c][(indx + v1 - h1) >> 1]), LVFU(chr[c][(indx + v3 - h1) >> 1]), LVFU(chr[c][(indx + v1 - h3) >> 1])); - sevv = ULIMV(LVFU(chr[c][(indx + v1 + h1) >> 1]), LVFU(chr[c][(indx + v3 + h1) >> 1]), LVFU(chr[c][(indx + v1 + h3) >> 1])); + nwvv = median(LVFU(chr[c][(indx - v1 - h1) >> 1]), LVFU(chr[c][(indx - v3 - h1) >> 1]), LVFU(chr[c][(indx - v1 - h3) >> 1])); + nevv = median(LVFU(chr[c][(indx - v1 + h1) >> 1]), LVFU(chr[c][(indx - v3 + h1) >> 1]), LVFU(chr[c][(indx - v1 + h3) >> 1])); + swvv = median(LVFU(chr[c][(indx + v1 - h1) >> 1]), LVFU(chr[c][(indx + v3 - h1) >> 1]), LVFU(chr[c][(indx + v1 - h3) >> 1])); + sevv = median(LVFU(chr[c][(indx + v1 + h1) >> 1]), LVFU(chr[c][(indx + v3 + h1) >> 1]), LVFU(chr[c][(indx + v1 + h3) >> 1])); //Interpolate chrominance: R@B and B@R tempv = (nwgv * nwvv + negv * nevv + swgv * swvv + segv * sevv) / (nwgv + negv + swgv + segv); _mm_storeu_ps( &(chr[c][indx >> 1]), tempv); @@ -2223,10 +2180,10 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) swg = 1.0f / (eps + fabsf(chr[c][(indx + v1 - h1) >> 1] - chr[c][(indx + v3 + h3) >> 1]) + fabsf(chr[c][(indx - v1 + h1) >> 1] - chr[c][(indx + v3 - h3) >> 1])); seg = 1.0f / (eps + fabsf(chr[c][(indx + v1 + h1) >> 1] - chr[c][(indx + v3 - h3) >> 1]) + fabsf(chr[c][(indx - v1 - h1) >> 1] - chr[c][(indx + v3 + h3) >> 1])); //Limit NW,NE,SW,SE Color differences - nwv = ULIM(chr[c][(indx - v1 - h1) >> 1], chr[c][(indx - v3 - h1) >> 1], chr[c][(indx - v1 - h3) >> 1]); - nev = ULIM(chr[c][(indx - v1 + h1) >> 1], chr[c][(indx - v3 + h1) >> 1], chr[c][(indx - v1 + h3) >> 1]); - swv = ULIM(chr[c][(indx + v1 - h1) >> 1], chr[c][(indx + v3 - h1) >> 1], chr[c][(indx + v1 - h3) >> 1]); - sev = ULIM(chr[c][(indx + v1 + h1) >> 1], chr[c][(indx + v3 + h1) >> 1], chr[c][(indx + v1 + h3) >> 1]); + nwv = median(chr[c][(indx - v1 - h1) >> 1], chr[c][(indx - v3 - h1) >> 1], chr[c][(indx - v1 - h3) >> 1]); + nev = median(chr[c][(indx - v1 + h1) >> 1], chr[c][(indx - v3 + h1) >> 1], chr[c][(indx - v1 + h3) >> 1]); + swv = median(chr[c][(indx + v1 - h1) >> 1], chr[c][(indx + v3 - h1) >> 1], chr[c][(indx + v1 - h3) >> 1]); + sev = median(chr[c][(indx + v1 + h1) >> 1], chr[c][(indx + v3 + h1) >> 1], chr[c][(indx + v1 + h3) >> 1]); //Interpolate chrominance: R@B and B@R chr[c][indx >> 1] = (nwg * nwv + neg * nev + swg * swv + seg * sev) / (nwg + neg + swg + seg); } @@ -2730,10 +2687,10 @@ void RawImageSource::ahd_demosaic(int winx, int winy, int winw, int winh) pix = image + (row * width + col); val = 0.25 * ((pix[-1][1] + pix[0][c] + pix[1][1]) * 2 - pix[-2][c] - pix[2][c]) ; - rgb[0][row - top][col - left][1] = ULIM(static_cast(val), pix[-1][1], pix[1][1]); + rgb[0][row - top][col - left][1] = median(static_cast(val), pix[-1][1], pix[1][1]); val = 0.25 * ((pix[-width][1] + pix[0][c] + pix[width][1]) * 2 - pix[-2 * width][c] - pix[2 * width][c]) ; - rgb[1][row - top][col - left][1] = ULIM(static_cast(val), pix[-width][1], pix[width][1]); + rgb[1][row - top][col - left][1] = median(static_cast(val), pix[-width][1], pix[width][1]); } } @@ -3215,39 +3172,21 @@ void RawImageSource::refinement_lassus(int PassCount) g[4] = (f[0] * g[0] + f[1] * g[1] + f[2] * g[2] + f[3] * g[3]) / (f[0] + f[1] + f[2] + f[3]); - float p[9]; - p[0] = (pix[-u - 1][1] - pix[-u - 1][c]); - p[1] = (pix[-u + 0][1] - pix[-u + 0][c]); - p[2] = (pix[-u + 1][1] - pix[-u + 1][c]); - p[3] = (pix[+0 - 1][1] - pix[+0 - 1][c]); - p[4] = (pix[+0 + 0][1] - pix[+0 + 0][c]); - p[5] = (pix[+0 + 1][1] - pix[+0 + 1][c]); - p[6] = (pix[+u - 1][1] - pix[+u - 1][c]); - p[7] = (pix[+u + 0][1] - pix[+u + 0][c]); - p[8] = (pix[+u + 1][1] - pix[+u + 1][c]); + const std::array p = { + pix[-u - 1][1] - pix[-u - 1][c], + pix[-u + 0][1] - pix[-u + 0][c], + pix[-u + 1][1] - pix[-u + 1][c], + pix[+0 - 1][1] - pix[+0 - 1][c], + pix[+0 + 0][1] - pix[+0 + 0][c], + pix[+0 + 1][1] - pix[+0 + 1][c], + pix[+u - 1][1] - pix[+u - 1][c], + pix[+u + 0][1] - pix[+u + 0][c], + pix[+u + 1][1] - pix[+u + 1][c] + }; - // sort p[] - float temp; // used in PIX_SORT macro; - PIX_SORT(p[1], p[2]); - PIX_SORT(p[4], p[5]); - PIX_SORT(p[7], p[8]); - PIX_SORT(p[0], p[1]); - PIX_SORT(p[3], p[4]); - PIX_SORT(p[6], p[7]); - PIX_SORT(p[1], p[2]); - PIX_SORT(p[4], p[5]); - PIX_SORT(p[7], p[8]); - PIX_SORT(p[0], p[3]); - PIX_SORT(p[5], p[8]); - PIX_SORT(p[4], p[7]); - PIX_SORT(p[3], p[6]); - PIX_SORT(p[1], p[4]); - PIX_SORT(p[2], p[5]); - PIX_SORT(p[4], p[7]); - PIX_SORT(p[4], p[2]); - PIX_SORT(p[6], p[4]); - PIX_SORT(p[4], p[2]); - pix[0][c] = LIM(pix[0][1] - (1.30f * g[4] - 0.30f * (pix[0][1] - pix[0][c])), 0.99f * (pix[0][1] - p[4]), 1.01f * (pix[0][1] - p[4])); + const float med = median(p); + + pix[0][c] = LIM(pix[0][1] - (1.30f * g[4] - 0.30f * (pix[0][1] - pix[0][c])), 0.99f * (pix[0][1] - med), 1.01f * (pix[0][1] - med)); } } diff --git a/rtengine/median.h b/rtengine/median.h index 13a79e381..8ac572179 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -42,11 +42,13 @@ inline T median(std::array array) return std::max(std::min(array[0], array[1]), std::min(array[2], std::max(array[0], array[1]))); } +#ifdef __SSE2__ template<> inline vfloat median(std::array array) { return vmaxf(vminf(array[0], array[1]), vminf(array[2], vmaxf(array[0], array[1]))); } +#endif template inline T median(std::array array) @@ -65,6 +67,7 @@ inline T median(std::array array) return std::max(array[1], tmp); } +#ifdef __SSE2__ template<> inline vfloat median(std::array array) { @@ -81,6 +84,7 @@ inline vfloat median(std::array array) tmp = vminf(array[2], array[3]); return vmaxf(array[1], tmp); } +#endif template inline T median(std::array array) @@ -112,6 +116,7 @@ inline T median(std::array array) return std::min(array[3], array[4]); } +#ifdef __SSE2__ template<> inline vfloat median(std::array array) { @@ -141,6 +146,7 @@ inline vfloat median(std::array array) array[3] = vmaxf(tmp, array[3]); return vminf(array[3], array[4]); } +#endif template inline T median(std::array array) @@ -185,6 +191,7 @@ inline T median(std::array array) return std::min(array[4], array[2]); } +#ifdef __SSE2__ template<> inline vfloat median(std::array array) { @@ -227,6 +234,7 @@ inline vfloat median(std::array array) array[4] = vmaxf(array[6], tmp); return vminf(array[4], array[2]); } +#endif template inline T median(std::array array) @@ -441,6 +449,7 @@ inline T median(std::array array) return std::max(tmp, array[12]); } +#ifdef __SSE2__ template<> inline vfloat median(std::array array) { @@ -653,6 +662,7 @@ inline vfloat median(std::array array) tmp = vminf(array[10], array[20]); return vmaxf(tmp, array[12]); } +#endif template inline T median(T arg, ARGS... args) @@ -699,54 +709,3 @@ d4 = vmaxf(d3,d4);\ d3 = vmaxf(d0,temp);\ d2 = vminf(d2,d5);\ } - - -#define MEDIAN7(s0,s1,s2,s3,s4,s5,s6,t0,t1,t2,t3,t4,t5,t6,median) \ -{\ -t0 = std::min(s0,s5);\ -t5 = std::max(s0,s5);\ -t3 = std::max(t0,s3);\ -t0 = std::min(t0,s3);\ -t1 = std::min(s1,s6);\ -t6 = std::max(s1,s6);\ -t2 = std::min(s2,s4);\ -t4 = std::max(s2,s4);\ -t1 = std::max(t0,t1);\ -median = std::min(t3,t5);\ -t5 = std::max(t3,t5);\ -t3 = median;\ -median = std::min(t2,t6);\ -t6 = std::max(t2,t6);\ -t3 = std::max(median,t3);\ -t3 = std::min(t3,t6);\ -t4 = std::min(t4,t5);\ -median = std::min(t1,t4);\ -t4 = std::max(t1,t4);\ -t3 = std::max(median,t3);\ -median = std::min(t3,t4);\ -} - -#define VMEDIAN7(s0,s1,s2,s3,s4,s5,s6,t0,t1,t2,t3,t4,t5,t6,median) \ -{\ -t0 = vminf(s0,s5);\ -t5 = vmaxf(s0,s5);\ -t3 = vmaxf(t0,s3);\ -t0 = vminf(t0,s3);\ -t1 = vminf(s1,s6);\ -t6 = vmaxf(s1,s6);\ -t2 = vminf(s2,s4);\ -t4 = vmaxf(s2,s4);\ -t1 = vmaxf(t0,t1);\ -median = vminf(t3,t5);\ -t5 = vmaxf(t3,t5);\ -t3 = median;\ -median = vminf(t2,t6);\ -t6 = vmaxf(t2,t6);\ -t3 = vmaxf(median,t3);\ -t3 = vminf(t3,t6);\ -t4 = vminf(t4,t5);\ -median = vminf(t1,t4);\ -t4 = vmaxf(t1,t4);\ -t3 = vmaxf(median,t3);\ -median = vminf(t3,t4);\ -} diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index fa05e34c3..5d3566126 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3483,12 +3483,11 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D for (int j = 1; j < W - 2; j += 2) { post1[0] = _mm_setr_ps(rbconv_I[px][j + 1], rbconv_Q[px][j + 1], 0, 0), post1[1] = _mm_setr_ps(rbconv_I[cx][j + 1], rbconv_Q[cx][j + 1], 0, 0), post1[2] = _mm_setr_ps(rbconv_I[nx][j + 1], rbconv_Q[nx][j + 1], 0, 0); VMIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - vfloat medianval; - VMEDIAN7(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], medianval); + vfloat medianval = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); rbout_I[cx][j] = medianval[0]; rbout_Q[cx][j] = medianval[1]; post2[0] = _mm_setr_ps(rbconv_I[px][j + 2], rbconv_Q[px][j + 2], 0, 0), post2[1] = _mm_setr_ps(rbconv_I[cx][j + 2], rbconv_Q[cx][j + 2], 0, 0), post2[2] = _mm_setr_ps(rbconv_I[nx][j + 2], rbconv_Q[nx][j + 2], 0, 0); - VMEDIAN7(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], medianval); + medianval = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); rbout_I[cx][j + 1] = medianval[0]; rbout_Q[cx][j + 1] = medianval[1]; std::swap(pre1, post1); @@ -3513,9 +3512,9 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D for (int j = 1; j < W - 2; j += 2) { post1[0] = rbconv_I[px][j + 1], post1[1] = rbconv_I[cx][j + 1], post1[2] = rbconv_I[nx][j + 1]; MIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - MEDIAN7(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], rbout_I[cx][j]); + rbout_I[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); post2[0] = rbconv_I[px][j + 2], post2[1] = rbconv_I[cx][j + 2], post2[2] = rbconv_I[nx][j + 2]; - MEDIAN7(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], rbout_I[cx][j + 1]); + rbout_I[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); std::swap(pre1, post1); std::swap(pre2, post2); } @@ -3534,9 +3533,9 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D for (int j = 1; j < W - 2; j += 2) { post1[0] = rbconv_Q[px][j + 1], post1[1] = rbconv_Q[cx][j + 1], post1[2] = rbconv_Q[nx][j + 1]; MIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - MEDIAN7(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], rbout_Q[cx][j]); + rbout_Q[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); post2[0] = rbconv_Q[px][j + 2], post2[1] = rbconv_Q[cx][j + 2], post2[2] = rbconv_Q[nx][j + 2]; - MEDIAN7(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4], temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], rbout_Q[cx][j + 1]); + rbout_Q[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); std::swap(pre1, post1); std::swap(pre2, post2); } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 702fb5360..0836c8be7 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -42,12 +42,6 @@ inline _Tp LIM01(const _Tp& a) return std::max(_Tp(0), std::min(a, _Tp(1))); } -template -inline const _Tp ULIM(const _Tp& a, const _Tp& b, const _Tp& c) -{ - return ((b < c) ? LIM(a, b, c) : LIM(a, c, b)); -} - template inline _Tp CLIP(const _Tp& a) { diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index 1d15e1e41..a9f49f143 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -1334,12 +1334,6 @@ static INLINE vfloat LIMV( vfloat a, vfloat b, vfloat c ) { return vmaxf( b, vminf(a,c)); } -static INLINE vfloat ULIMV( vfloat a, vfloat b, vfloat c ){ - // made to clamp a in range [b,c] but in fact it's also the median of a,b,c, which means that the result is independent on order of arguments - // ULIMV(a,b,c) = ULIMV(a,c,b) = ULIMV(b,a,c) = ULIMV(b,c,a) = ULIMV(c,a,b) = ULIMV(c,b,a) - return vmaxf(vminf(a,b), vminf(vmaxf(a,b),c)); -} - static INLINE vfloat SQRV(vfloat a){ return a * a; } From 1275659a91164567dce8cf559432ddabb30ebc45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 26 Jun 2016 15:28:04 +0200 Subject: [PATCH 117/232] Removed another `pixSort()` and improved two places (#3346) --- rtengine/CA_correct_RT.cc | 51 ++++++++++---------------------------- rtengine/demosaic_algos.cc | 45 +++++++++++++++++---------------- 2 files changed, 37 insertions(+), 59 deletions(-) diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index ab0b95a27..64bb19113 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -26,6 +26,7 @@ #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" +#include "median.h" namespace { @@ -106,14 +107,6 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) //end of linear equation solver //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -inline void pixSort(float &a, float &b) { - if (a > b) { - float temp = a; - a = b; - b = temp; - } -} - } using namespace std; @@ -630,36 +623,18 @@ void RawImageSource::CA_correct_RT(const double cared, const double cablue, cons float bstemp[2]; for (int dir = 0; dir < 2; dir++) { //temporary storage for median filter - float p[9]; - p[0] = blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir]; - p[1] = blockshifts[(vblock - 1) * hblsz + hblock][c][dir]; - p[2] = blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir]; - p[3] = blockshifts[(vblock) * hblsz + hblock - 1][c][dir]; - p[4] = blockshifts[(vblock) * hblsz + hblock][c][dir]; - p[5] = blockshifts[(vblock) * hblsz + hblock + 1][c][dir]; - p[6] = blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir]; - p[7] = blockshifts[(vblock + 1) * hblsz + hblock][c][dir]; - p[8] = blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir]; - pixSort(p[1], p[2]); - pixSort(p[4], p[5]); - pixSort(p[7], p[8]); - pixSort(p[0], p[1]); - pixSort(p[3], p[4]); - pixSort(p[6], p[7]); - pixSort(p[1], p[2]); - pixSort(p[4], p[5]); - pixSort(p[7], p[8]); - pixSort(p[0], p[3]); - pixSort(p[5], p[8]); - pixSort(p[4], p[7]); - pixSort(p[3], p[6]); - pixSort(p[1], p[4]); - pixSort(p[2], p[5]); - pixSort(p[4], p[7]); - pixSort(p[4], p[2]); - pixSort(p[6], p[4]); - pixSort(p[4], p[2]); - bstemp[dir] = p[4]; + const std::array p = { + blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock) * hblsz + hblock][c][dir], + blockshifts[(vblock) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir] + }; + bstemp[dir] = median(p); } //now prepare coefficient matrix; use only data points within caautostrength/2 std devs of zero diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index b5e05ba53..fd4a16fd1 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1768,36 +1768,39 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - const __m128 p1v = LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]); - const __m128 p2v = LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]); - const __m128 p3v = LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]); - const __m128 p4v = LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]); - const __m128 p5v = LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]); - const __m128 p6v = LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]); - const __m128 p7v = LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]); - const __m128 p8v = LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]); - const __m128 p9v = LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]); - _mm_storeu_ps(&rix[d][0], median(p1v, p2v, p3v, p4v, p5v, p6v, p7v, p8v, p9v)); + const std::array p = { + LVFU(rix[c][-w1 - 1]) - LVFU(rix[1][-w1 - 1]), + LVFU(rix[c][-w1]) - LVFU(rix[1][-w1]), + LVFU(rix[c][-w1 + 1]) - LVFU(rix[1][-w1 + 1]), + LVFU(rix[c][ -1]) - LVFU(rix[1][ -1]), + LVFU(rix[c][ 0]) - LVFU(rix[1][ 0]), + LVFU(rix[c][ 1]) - LVFU(rix[1][ 1]), + LVFU(rix[c][ w1 - 1]) - LVFU(rix[1][ w1 - 1]), + LVFU(rix[c][ w1]) - LVFU(rix[1][ w1]), + LVFU(rix[c][ w1 + 1]) - LVFU(rix[1][ w1 + 1]) + }; + _mm_storeu_ps(&rix[d][0], median(p)); } #endif for (; cc < cc1 - 1; cc++) { - float temp; rix[d] = qix[d] + rr * cc1 + cc; rix[c] = qix[c] + rr * cc1 + cc; rix[1] = qix[1] + rr * cc1 + cc; // Assign 3x3 differential color values - const float p1 = rix[c][-w1 - 1] - rix[1][-w1 - 1]; - const float p2 = rix[c][-w1] - rix[1][-w1]; - const float p3 = rix[c][-w1 + 1] - rix[1][-w1 + 1]; - const float p4 = rix[c][ -1] - rix[1][ -1]; - const float p5 = rix[c][ 0] - rix[1][ 0]; - const float p6 = rix[c][ 1] - rix[1][ 1]; - const float p7 = rix[c][ w1 - 1] - rix[1][ w1 - 1]; - const float p8 = rix[c][ w1] - rix[1][ w1]; - const float p9 = rix[c][ w1 + 1] - rix[1][ w1 + 1]; - rix[d][0] = median(p1, p2, p3, p4, p5, p6, p7, p8, p9); + const std::array p = { + rix[c][-w1 - 1] - rix[1][-w1 - 1], + rix[c][-w1] - rix[1][-w1], + rix[c][-w1 + 1] - rix[1][-w1 + 1], + rix[c][ -1] - rix[1][ -1], + rix[c][ 0] - rix[1][ 0], + rix[c][ 1] - rix[1][ 1], + rix[c][ w1 - 1] - rix[1][ w1 - 1], + rix[c][ w1] - rix[1][ w1], + rix[c][ w1 + 1] - rix[1][ w1 + 1] + }; + rix[d][0] = median(p); } } } From a3bfd035fa8e149a3f40c791e1e00da0bda3304e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 27 Jun 2016 21:00:18 +0200 Subject: [PATCH 118/232] Fix bug found by @heckflosse (#3346) --- rtengine/PF_correct_RT.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index e64c750bb..6864e28ec 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -1434,7 +1434,7 @@ SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, d jn = j + 2; } - tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn], tmbb[i][j]); + tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn]); } } } From 5cbff43191462c2ddc2c1afe25fca08243bb7d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 28 Jun 2016 21:49:07 +0200 Subject: [PATCH 119/232] Finalize `median.h` - Added median 13, 49, and 81 - Integrated Ingo's SSE optimization for "5x5 strong" - Converted `MIDDLE4OF6` - Refactored `enum mediantype` --- rtengine/FTblockDN.cc | 82 +- rtengine/improcfun.h | 11 +- rtengine/median.h | 5636 +++++++++++++++++++++++++++++++++++- rtengine/rawimagesource.cc | 25 +- 4 files changed, 5663 insertions(+), 91 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 03e1f15b4..d5cf00787 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -95,29 +95,29 @@ float media(float *elements, int N) return elements[N >> 1]; } -void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const mediantype medianType, const int iterations, const int numThreads, float **buffer) +void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) { int border = 1; - switch(medianType) { - case MED_3X3SOFT: - case MED_3X3STRONG: + switch (medianType) { + case Median::SIZE_3X3_SOFT: + case Median::SIZE_3X3_STRONG: border = 1; break; - case MED_5X5SOFT: + case Median::SIZE_5X5_SOFT: border = 2; break; - case MED_5X5STRONG: + case Median::SIZE_5X5_STRONG: border = 2; break; - case MED_7X7: + case Median::SIZE_7X7: border = 3; break; - default: // includes MED_9X9 + default: // includes Median::SIZE_9X9 border = 4; } @@ -157,11 +157,11 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } #ifdef _OPENMP - #pragma omp parallel for num_threads(numThreads) if(numThreads>1) + #pragma omp parallel for num_threads(numThreads) if(numThreads>1) schedule(dynamic,16) #endif for (int i = border; i < height - border; i++) { - if(medianType == MED_3X3SOFT) { + if (medianType == Median::SIZE_3X3_SOFT) { int j; for (j = 0; j < border; j++) { @@ -175,7 +175,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else if(medianType == MED_3X3STRONG) { + } else if (medianType == Median::SIZE_3X3_STRONG) { int j; for (j = 0; j < border; j++) { @@ -189,7 +189,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else if(medianType == MED_5X5SOFT) { + } else if (medianType == Median::SIZE_5X5_SOFT) { int j; for (j = 0; j < border; j++) { @@ -217,13 +217,21 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else if(medianType == MED_5X5STRONG) { + } else if(medianType == Median::SIZE_5X5_STRONG) { int j; for (j = 0; j < border; j++) { medianOut[i][j] = medianIn[i][j]; } +#ifdef __SSE2__ + for (; j < width - border - 3; j += 4) { + STVFU(medianOut[i][j], median(LVFU(medianIn[i][j]), LVFU(medianIn[i - 1][j]), LVFU(medianIn[i + 1][j]), LVFU(medianIn[i][j + 1]), LVFU(medianIn[i][j - 1]), LVFU(medianIn[i - 1][j - 1]), LVFU(medianIn[i - 1][j + 1]), LVFU(medianIn[i + 1][j - 1]), LVFU(medianIn[i + 1][j + 1]), + LVFU(medianIn[i - 2][j]), LVFU(medianIn[i + 2][j]), LVFU(medianIn[i][j + 2]), LVFU(medianIn[i][j - 2]), LVFU(medianIn[i - 2][j - 2]), LVFU(medianIn[i - 2][j + 2]), LVFU(medianIn[i + 2][j - 2]), LVFU(medianIn[i + 2][j + 2]), + LVFU(medianIn[i - 2][j + 1]), LVFU(medianIn[i + 2][j + 1]), LVFU(medianIn[i - 1][j + 2]), LVFU(medianIn[i - 1][j - 2]), LVFU(medianIn[i - 2][j - 1]), LVFU(medianIn[i + 2][j - 1]), LVFU(medianIn[i + 1][j + 2]), LVFU(medianIn[i + 1][j - 2]))); + } +#endif + for (; j < width - border; j++) { medianOut[i][j] = median(medianIn[i][j], medianIn[i - 1][j], medianIn[i + 1][j], medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1], medianIn[i - 2][j], medianIn[i + 2][j], medianIn[i][j + 2], medianIn[i][j - 2], medianIn[i - 2][j - 2], medianIn[i - 2][j + 2], medianIn[i + 2][j - 2], medianIn[i + 2][j + 2], @@ -233,8 +241,8 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else if (medianType == MED_7X7) { - std::array pp = {}; + } else if (medianType == Median::SIZE_7X7) { + std::array pp; int j; for (j = 0; j < border; j++) { @@ -257,8 +265,8 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, for(; j < width; j++) { medianOut[i][j] = medianIn[i][j]; } - } else { // includes MED_9X9 - std::array pp = {}; + } else { // includes Median::SIZE_9X9 + std::array pp; int j; for (j = 0; j < border; j++) { @@ -1230,50 +1238,50 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef tmL[i] = new float[wid]; } - mediantype medianTypeL = MED_3X3SOFT; - mediantype medianTypeAB = MED_3X3SOFT; + Median medianTypeL = Median::SIZE_3X3_SOFT; + Median medianTypeAB = Median::SIZE_3X3_SOFT; if(dnparams.medmethod == "soft") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_3X3SOFT; + medianTypeL = medianTypeAB = Median::SIZE_3X3_SOFT; } else { - medianTypeL = MED_3X3SOFT; - medianTypeAB = MED_3X3SOFT; + medianTypeL = Median::SIZE_3X3_SOFT; + medianTypeAB = Median::SIZE_3X3_SOFT; } } else if(dnparams.medmethod == "33") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_3X3STRONG; + medianTypeL = medianTypeAB = Median::SIZE_3X3_STRONG; } else { - medianTypeL = MED_3X3SOFT; - medianTypeAB = MED_3X3STRONG; + medianTypeL = Median::SIZE_3X3_SOFT; + medianTypeAB = Median::SIZE_3X3_STRONG; } } else if(dnparams.medmethod == "55soft") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_5X5SOFT; + medianTypeL = medianTypeAB = Median::SIZE_5X5_SOFT; } else { - medianTypeL = MED_3X3SOFT; - medianTypeAB = MED_5X5SOFT; + medianTypeL = Median::SIZE_3X3_SOFT; + medianTypeAB = Median::SIZE_5X5_SOFT; } } else if(dnparams.medmethod == "55") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_5X5STRONG; + medianTypeL = medianTypeAB = Median::SIZE_5X5_STRONG; } else { - medianTypeL = MED_3X3STRONG; - medianTypeAB = MED_5X5STRONG; + medianTypeL = Median::SIZE_3X3_STRONG; + medianTypeAB = Median::SIZE_5X5_STRONG; } } else if(dnparams.medmethod == "77") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_7X7; + medianTypeL = medianTypeAB = Median::SIZE_7X7; } else { - medianTypeL = MED_3X3STRONG; - medianTypeAB = MED_7X7; + medianTypeL = Median::SIZE_3X3_STRONG; + medianTypeAB = Median::SIZE_7X7; } } else if(dnparams.medmethod == "99") { if(metchoice != 4) { - medianTypeL = medianTypeAB = MED_9X9; + medianTypeL = medianTypeAB = Median::SIZE_9X9; } else { - medianTypeL = MED_5X5SOFT; - medianTypeAB = MED_9X9; + medianTypeL = Median::SIZE_5X5_SOFT; + medianTypeAB = Median::SIZE_9X9; } } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 4d03e2747..b1a52a9f7 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -184,6 +184,14 @@ class ImProcFunctions public: + enum class Median { + SIZE_3X3_SOFT, + SIZE_3X3_STRONG, + SIZE_5X5_SOFT, + SIZE_5X5_STRONG, + SIZE_7X7, + SIZE_9X9 + }; double lumimul[3]; // float chau; @@ -310,8 +318,7 @@ public: - enum mediantype {MED_3X3SOFT, MED_3X3STRONG, MED_5X5SOFT, MED_5X5STRONG, MED_7X7, MED_9X9}; - void Median_Denoise( float **src, float **dst, int width, int height, mediantype medianType, int iterations, int numThreads, float **buffer = NULL); + void Median_Denoise( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = NULL); void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & ctNoisCurve , const NoiseCurve & ctNoisCCcurve , float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi); void RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope); void RGB_denoise_info(Imagefloat * src, Imagefloat * calclum, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); diff --git a/rtengine/median.h b/rtengine/median.h index 8ac572179..8c65180ba 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -236,6 +236,200 @@ inline vfloat median(std::array array) } #endif +template +inline T median(std::array array) +{ + T tmp = std::min(array[1], array[7]); + array[7] = std::max(array[1], array[7]); + array[1] = tmp; + tmp = std::min(array[9], array[11]); + array[11] = std::max(array[9], array[11]); + array[9] = tmp; + tmp = std::min(array[3], array[4]); + array[4] = std::max(array[3], array[4]); + array[3] = tmp; + tmp = std::min(array[5], array[8]); + array[8] = std::max(array[5], array[8]); + array[5] = tmp; + tmp = std::min(array[0], array[12]); + array[12] = std::max(array[0], array[12]); + array[0] = tmp; + tmp = std::min(array[2], array[6]); + array[6] = std::max(array[2], array[6]); + array[2] = tmp; + tmp = std::min(array[0], array[1]); + array[1] = std::max(array[0], array[1]); + array[0] = tmp; + tmp = std::min(array[2], array[3]); + array[3] = std::max(array[2], array[3]); + array[2] = tmp; + tmp = std::min(array[4], array[6]); + array[6] = std::max(array[4], array[6]); + array[4] = tmp; + tmp = std::min(array[8], array[11]); + array[11] = std::max(array[8], array[11]); + array[8] = tmp; + tmp = std::min(array[7], array[12]); + array[12] = std::max(array[7], array[12]); + array[7] = tmp; + tmp = std::min(array[5], array[9]); + array[9] = std::max(array[5], array[9]); + array[5] = tmp; + tmp = std::min(array[0], array[2]); + array[2] = std::max(array[0], array[2]); + array[0] = tmp; + tmp = std::min(array[3], array[7]); + array[7] = std::max(array[3], array[7]); + array[3] = tmp; + tmp = std::min(array[10], array[11]); + array[11] = std::max(array[10], array[11]); + array[10] = tmp; + tmp = std::min(array[1], array[4]); + array[4] = std::max(array[1], array[4]); + array[1] = tmp; + tmp = std::min(array[6], array[12]); + array[12] = std::max(array[6], array[12]); + array[6] = tmp; + tmp = std::min(array[7], array[8]); + array[8] = std::max(array[7], array[8]); + array[7] = tmp; + array[11] = std::min(array[11], array[12]); + tmp = std::min(array[4], array[9]); + array[9] = std::max(array[4], array[9]); + array[4] = tmp; + tmp = std::min(array[6], array[10]); + array[10] = std::max(array[6], array[10]); + array[6] = tmp; + tmp = std::min(array[3], array[4]); + array[4] = std::max(array[3], array[4]); + array[3] = tmp; + tmp = std::min(array[5], array[6]); + array[6] = std::max(array[5], array[6]); + array[5] = tmp; + array[8] = std::min(array[8], array[9]); + array[10] = std::min(array[10], array[11]); + tmp = std::min(array[1], array[7]); + array[7] = std::max(array[1], array[7]); + array[1] = tmp; + tmp = std::min(array[2], array[6]); + array[6] = std::max(array[2], array[6]); + array[2] = tmp; + array[3] = std::max(array[1], array[3]); + tmp = std::min(array[4], array[7]); + array[7] = std::max(array[4], array[7]); + array[4] = tmp; + array[8] = std::min(array[8], array[10]); + array[5] = std::max(array[0], array[5]); + array[5] = std::max(array[2], array[5]); + tmp = std::min(array[6], array[8]); + array[8] = std::max(array[6], array[8]); + array[5] = std::max(array[3], array[5]); + array[7] = std::min(array[7], array[8]); + array[6] = std::max(array[4], tmp); + tmp = std::min(array[4], tmp); + array[5] = std::max(tmp, array[5]); + array[6] = std::min(array[6], array[7]); + return std::max(array[5], array[6]); +} + +#ifdef __SSE2__ +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[1], array[7]); + array[7] = vmaxf(array[1], array[7]); + array[1] = tmp; + tmp = vminf(array[9], array[11]); + array[11] = vmaxf(array[9], array[11]); + array[9] = tmp; + tmp = vminf(array[3], array[4]); + array[4] = vmaxf(array[3], array[4]); + array[3] = tmp; + tmp = vminf(array[5], array[8]); + array[8] = vmaxf(array[5], array[8]); + array[5] = tmp; + tmp = vminf(array[0], array[12]); + array[12] = vmaxf(array[0], array[12]); + array[0] = tmp; + tmp = vminf(array[2], array[6]); + array[6] = vmaxf(array[2], array[6]); + array[2] = tmp; + tmp = vminf(array[0], array[1]); + array[1] = vmaxf(array[0], array[1]); + array[0] = tmp; + tmp = vminf(array[2], array[3]); + array[3] = vmaxf(array[2], array[3]); + array[2] = tmp; + tmp = vminf(array[4], array[6]); + array[6] = vmaxf(array[4], array[6]); + array[4] = tmp; + tmp = vminf(array[8], array[11]); + array[11] = vmaxf(array[8], array[11]); + array[8] = tmp; + tmp = vminf(array[7], array[12]); + array[12] = vmaxf(array[7], array[12]); + array[7] = tmp; + tmp = vminf(array[5], array[9]); + array[9] = vmaxf(array[5], array[9]); + array[5] = tmp; + tmp = vminf(array[0], array[2]); + array[2] = vmaxf(array[0], array[2]); + array[0] = tmp; + tmp = vminf(array[3], array[7]); + array[7] = vmaxf(array[3], array[7]); + array[3] = tmp; + tmp = vminf(array[10], array[11]); + array[11] = vmaxf(array[10], array[11]); + array[10] = tmp; + tmp = vminf(array[1], array[4]); + array[4] = vmaxf(array[1], array[4]); + array[1] = tmp; + tmp = vminf(array[6], array[12]); + array[12] = vmaxf(array[6], array[12]); + array[6] = tmp; + tmp = vminf(array[7], array[8]); + array[8] = vmaxf(array[7], array[8]); + array[7] = tmp; + array[11] = vminf(array[11], array[12]); + tmp = vminf(array[4], array[9]); + array[9] = vmaxf(array[4], array[9]); + array[4] = tmp; + tmp = vminf(array[6], array[10]); + array[10] = vmaxf(array[6], array[10]); + array[6] = tmp; + tmp = vminf(array[3], array[4]); + array[4] = vmaxf(array[3], array[4]); + array[3] = tmp; + tmp = vminf(array[5], array[6]); + array[6] = vmaxf(array[5], array[6]); + array[5] = tmp; + array[8] = vminf(array[8], array[9]); + array[10] = vminf(array[10], array[11]); + tmp = vminf(array[1], array[7]); + array[7] = vmaxf(array[1], array[7]); + array[1] = tmp; + tmp = vminf(array[2], array[6]); + array[6] = vmaxf(array[2], array[6]); + array[2] = tmp; + array[3] = vmaxf(array[1], array[3]); + tmp = vminf(array[4], array[7]); + array[7] = vmaxf(array[4], array[7]); + array[4] = tmp; + array[8] = vminf(array[8], array[10]); + array[5] = vmaxf(array[0], array[5]); + array[5] = vmaxf(array[2], array[5]); + tmp = vminf(array[6], array[8]); + array[8] = vmaxf(array[6], array[8]); + array[5] = vmaxf(array[3], array[5]); + array[7] = vminf(array[7], array[8]); + array[6] = vmaxf(array[4], tmp); + tmp = vminf(array[4], tmp); + array[5] = vmaxf(tmp, array[5]); + array[6] = vminf(array[6], array[7]); + return vmaxf(array[5], array[6]); +} +#endif + template inline T median(std::array array) { @@ -664,48 +858,5418 @@ inline vfloat median(std::array array) } #endif +template +inline T median(std::array array) +{ + T tmp = std::min(array[0], array[32]); + array[32] = std::max(array[0], array[32]); + array[0] = tmp; + tmp = std::min(array[1], array[33]); + array[33] = std::max(array[1], array[33]); + array[1] = tmp; + tmp = std::min(array[2], array[34]); + array[34] = std::max(array[2], array[34]); + array[2] = tmp; + tmp = std::min(array[3], array[35]); + array[35] = std::max(array[3], array[35]); + array[3] = tmp; + tmp = std::min(array[4], array[36]); + array[36] = std::max(array[4], array[36]); + array[4] = tmp; + tmp = std::min(array[5], array[37]); + array[37] = std::max(array[5], array[37]); + array[5] = tmp; + tmp = std::min(array[6], array[38]); + array[38] = std::max(array[6], array[38]); + array[6] = tmp; + tmp = std::min(array[7], array[39]); + array[39] = std::max(array[7], array[39]); + array[7] = tmp; + tmp = std::min(array[8], array[40]); + array[40] = std::max(array[8], array[40]); + array[8] = tmp; + tmp = std::min(array[9], array[41]); + array[41] = std::max(array[9], array[41]); + array[9] = tmp; + tmp = std::min(array[10], array[42]); + array[42] = std::max(array[10], array[42]); + array[10] = tmp; + tmp = std::min(array[11], array[43]); + array[43] = std::max(array[11], array[43]); + array[11] = tmp; + tmp = std::min(array[12], array[44]); + array[44] = std::max(array[12], array[44]); + array[12] = tmp; + tmp = std::min(array[13], array[45]); + array[45] = std::max(array[13], array[45]); + array[13] = tmp; + tmp = std::min(array[14], array[46]); + array[46] = std::max(array[14], array[46]); + array[14] = tmp; + tmp = std::min(array[15], array[47]); + array[47] = std::max(array[15], array[47]); + array[15] = tmp; + tmp = std::min(array[16], array[48]); + array[48] = std::max(array[16], array[48]); + array[16] = tmp; + tmp = std::min(array[0], array[16]); + array[16] = std::max(array[0], array[16]); + array[0] = tmp; + tmp = std::min(array[1], array[17]); + array[17] = std::max(array[1], array[17]); + array[1] = tmp; + tmp = std::min(array[2], array[18]); + array[18] = std::max(array[2], array[18]); + array[2] = tmp; + tmp = std::min(array[3], array[19]); + array[19] = std::max(array[3], array[19]); + array[3] = tmp; + tmp = std::min(array[4], array[20]); + array[20] = std::max(array[4], array[20]); + array[4] = tmp; + tmp = std::min(array[5], array[21]); + array[21] = std::max(array[5], array[21]); + array[5] = tmp; + tmp = std::min(array[6], array[22]); + array[22] = std::max(array[6], array[22]); + array[6] = tmp; + tmp = std::min(array[7], array[23]); + array[23] = std::max(array[7], array[23]); + array[7] = tmp; + tmp = std::min(array[8], array[24]); + array[24] = std::max(array[8], array[24]); + array[8] = tmp; + tmp = std::min(array[9], array[25]); + array[25] = std::max(array[9], array[25]); + array[9] = tmp; + tmp = std::min(array[10], array[26]); + array[26] = std::max(array[10], array[26]); + array[10] = tmp; + tmp = std::min(array[11], array[27]); + array[27] = std::max(array[11], array[27]); + array[11] = tmp; + tmp = std::min(array[12], array[28]); + array[28] = std::max(array[12], array[28]); + array[12] = tmp; + tmp = std::min(array[13], array[29]); + array[29] = std::max(array[13], array[29]); + array[13] = tmp; + tmp = std::min(array[14], array[30]); + array[30] = std::max(array[14], array[30]); + array[14] = tmp; + tmp = std::min(array[15], array[31]); + array[31] = std::max(array[15], array[31]); + array[15] = tmp; + tmp = std::min(array[32], array[48]); + array[48] = std::max(array[32], array[48]); + array[32] = tmp; + tmp = std::min(array[16], array[32]); + array[32] = std::max(array[16], array[32]); + array[16] = tmp; + tmp = std::min(array[17], array[33]); + array[33] = std::max(array[17], array[33]); + array[17] = tmp; + tmp = std::min(array[18], array[34]); + array[34] = std::max(array[18], array[34]); + array[18] = tmp; + tmp = std::min(array[19], array[35]); + array[35] = std::max(array[19], array[35]); + array[19] = tmp; + tmp = std::min(array[20], array[36]); + array[36] = std::max(array[20], array[36]); + array[20] = tmp; + tmp = std::min(array[21], array[37]); + array[37] = std::max(array[21], array[37]); + array[21] = tmp; + tmp = std::min(array[22], array[38]); + array[38] = std::max(array[22], array[38]); + array[22] = tmp; + tmp = std::min(array[23], array[39]); + array[39] = std::max(array[23], array[39]); + array[23] = tmp; + tmp = std::min(array[24], array[40]); + array[40] = std::max(array[24], array[40]); + array[24] = tmp; + tmp = std::min(array[25], array[41]); + array[41] = std::max(array[25], array[41]); + array[25] = tmp; + tmp = std::min(array[26], array[42]); + array[42] = std::max(array[26], array[42]); + array[26] = tmp; + tmp = std::min(array[27], array[43]); + array[43] = std::max(array[27], array[43]); + array[27] = tmp; + tmp = std::min(array[28], array[44]); + array[44] = std::max(array[28], array[44]); + array[28] = tmp; + tmp = std::min(array[29], array[45]); + array[45] = std::max(array[29], array[45]); + array[29] = tmp; + tmp = std::min(array[30], array[46]); + array[46] = std::max(array[30], array[46]); + array[30] = tmp; + tmp = std::min(array[31], array[47]); + array[47] = std::max(array[31], array[47]); + array[31] = tmp; + tmp = std::min(array[0], array[8]); + array[8] = std::max(array[0], array[8]); + array[0] = tmp; + tmp = std::min(array[1], array[9]); + array[9] = std::max(array[1], array[9]); + array[1] = tmp; + tmp = std::min(array[2], array[10]); + array[10] = std::max(array[2], array[10]); + array[2] = tmp; + tmp = std::min(array[3], array[11]); + array[11] = std::max(array[3], array[11]); + array[3] = tmp; + tmp = std::min(array[4], array[12]); + array[12] = std::max(array[4], array[12]); + array[4] = tmp; + tmp = std::min(array[5], array[13]); + array[13] = std::max(array[5], array[13]); + array[5] = tmp; + tmp = std::min(array[6], array[14]); + array[14] = std::max(array[6], array[14]); + array[6] = tmp; + tmp = std::min(array[7], array[15]); + array[15] = std::max(array[7], array[15]); + array[7] = tmp; + tmp = std::min(array[16], array[24]); + array[24] = std::max(array[16], array[24]); + array[16] = tmp; + tmp = std::min(array[17], array[25]); + array[25] = std::max(array[17], array[25]); + array[17] = tmp; + tmp = std::min(array[18], array[26]); + array[26] = std::max(array[18], array[26]); + array[18] = tmp; + tmp = std::min(array[19], array[27]); + array[27] = std::max(array[19], array[27]); + array[19] = tmp; + tmp = std::min(array[20], array[28]); + array[28] = std::max(array[20], array[28]); + array[20] = tmp; + tmp = std::min(array[21], array[29]); + array[29] = std::max(array[21], array[29]); + array[21] = tmp; + tmp = std::min(array[22], array[30]); + array[30] = std::max(array[22], array[30]); + array[22] = tmp; + tmp = std::min(array[23], array[31]); + array[31] = std::max(array[23], array[31]); + array[23] = tmp; + tmp = std::min(array[32], array[40]); + array[40] = std::max(array[32], array[40]); + array[32] = tmp; + tmp = std::min(array[33], array[41]); + array[41] = std::max(array[33], array[41]); + array[33] = tmp; + tmp = std::min(array[34], array[42]); + array[42] = std::max(array[34], array[42]); + array[34] = tmp; + tmp = std::min(array[35], array[43]); + array[43] = std::max(array[35], array[43]); + array[35] = tmp; + tmp = std::min(array[36], array[44]); + array[44] = std::max(array[36], array[44]); + array[36] = tmp; + tmp = std::min(array[37], array[45]); + array[45] = std::max(array[37], array[45]); + array[37] = tmp; + tmp = std::min(array[38], array[46]); + array[46] = std::max(array[38], array[46]); + array[38] = tmp; + tmp = std::min(array[39], array[47]); + array[47] = std::max(array[39], array[47]); + array[39] = tmp; + tmp = std::min(array[8], array[32]); + array[32] = std::max(array[8], array[32]); + array[8] = tmp; + tmp = std::min(array[9], array[33]); + array[33] = std::max(array[9], array[33]); + array[9] = tmp; + tmp = std::min(array[10], array[34]); + array[34] = std::max(array[10], array[34]); + array[10] = tmp; + tmp = std::min(array[11], array[35]); + array[35] = std::max(array[11], array[35]); + array[11] = tmp; + tmp = std::min(array[12], array[36]); + array[36] = std::max(array[12], array[36]); + array[12] = tmp; + tmp = std::min(array[13], array[37]); + array[37] = std::max(array[13], array[37]); + array[13] = tmp; + tmp = std::min(array[14], array[38]); + array[38] = std::max(array[14], array[38]); + array[14] = tmp; + tmp = std::min(array[15], array[39]); + array[39] = std::max(array[15], array[39]); + array[15] = tmp; + tmp = std::min(array[24], array[48]); + array[48] = std::max(array[24], array[48]); + array[24] = tmp; + tmp = std::min(array[8], array[16]); + array[16] = std::max(array[8], array[16]); + array[8] = tmp; + tmp = std::min(array[9], array[17]); + array[17] = std::max(array[9], array[17]); + array[9] = tmp; + tmp = std::min(array[10], array[18]); + array[18] = std::max(array[10], array[18]); + array[10] = tmp; + tmp = std::min(array[11], array[19]); + array[19] = std::max(array[11], array[19]); + array[11] = tmp; + tmp = std::min(array[12], array[20]); + array[20] = std::max(array[12], array[20]); + array[12] = tmp; + tmp = std::min(array[13], array[21]); + array[21] = std::max(array[13], array[21]); + array[13] = tmp; + tmp = std::min(array[14], array[22]); + array[22] = std::max(array[14], array[22]); + array[14] = tmp; + tmp = std::min(array[15], array[23]); + array[23] = std::max(array[15], array[23]); + array[15] = tmp; + tmp = std::min(array[24], array[32]); + array[32] = std::max(array[24], array[32]); + array[24] = tmp; + tmp = std::min(array[25], array[33]); + array[33] = std::max(array[25], array[33]); + array[25] = tmp; + tmp = std::min(array[26], array[34]); + array[34] = std::max(array[26], array[34]); + array[26] = tmp; + tmp = std::min(array[27], array[35]); + array[35] = std::max(array[27], array[35]); + array[27] = tmp; + tmp = std::min(array[28], array[36]); + array[36] = std::max(array[28], array[36]); + array[28] = tmp; + tmp = std::min(array[29], array[37]); + array[37] = std::max(array[29], array[37]); + array[29] = tmp; + tmp = std::min(array[30], array[38]); + array[38] = std::max(array[30], array[38]); + array[30] = tmp; + tmp = std::min(array[31], array[39]); + array[39] = std::max(array[31], array[39]); + array[31] = tmp; + tmp = std::min(array[40], array[48]); + array[48] = std::max(array[40], array[48]); + array[40] = tmp; + tmp = std::min(array[0], array[4]); + array[4] = std::max(array[0], array[4]); + array[0] = tmp; + tmp = std::min(array[1], array[5]); + array[5] = std::max(array[1], array[5]); + array[1] = tmp; + tmp = std::min(array[2], array[6]); + array[6] = std::max(array[2], array[6]); + array[2] = tmp; + tmp = std::min(array[3], array[7]); + array[7] = std::max(array[3], array[7]); + array[3] = tmp; + tmp = std::min(array[8], array[12]); + array[12] = std::max(array[8], array[12]); + array[8] = tmp; + tmp = std::min(array[9], array[13]); + array[13] = std::max(array[9], array[13]); + array[9] = tmp; + tmp = std::min(array[10], array[14]); + array[14] = std::max(array[10], array[14]); + array[10] = tmp; + tmp = std::min(array[11], array[15]); + array[15] = std::max(array[11], array[15]); + array[11] = tmp; + tmp = std::min(array[16], array[20]); + array[20] = std::max(array[16], array[20]); + array[16] = tmp; + tmp = std::min(array[17], array[21]); + array[21] = std::max(array[17], array[21]); + array[17] = tmp; + tmp = std::min(array[18], array[22]); + array[22] = std::max(array[18], array[22]); + array[18] = tmp; + tmp = std::min(array[19], array[23]); + array[23] = std::max(array[19], array[23]); + array[19] = tmp; + tmp = std::min(array[24], array[28]); + array[28] = std::max(array[24], array[28]); + array[24] = tmp; + tmp = std::min(array[25], array[29]); + array[29] = std::max(array[25], array[29]); + array[25] = tmp; + tmp = std::min(array[26], array[30]); + array[30] = std::max(array[26], array[30]); + array[26] = tmp; + tmp = std::min(array[27], array[31]); + array[31] = std::max(array[27], array[31]); + array[27] = tmp; + tmp = std::min(array[32], array[36]); + array[36] = std::max(array[32], array[36]); + array[32] = tmp; + tmp = std::min(array[33], array[37]); + array[37] = std::max(array[33], array[37]); + array[33] = tmp; + tmp = std::min(array[34], array[38]); + array[38] = std::max(array[34], array[38]); + array[34] = tmp; + tmp = std::min(array[35], array[39]); + array[39] = std::max(array[35], array[39]); + array[35] = tmp; + tmp = std::min(array[40], array[44]); + array[44] = std::max(array[40], array[44]); + array[40] = tmp; + tmp = std::min(array[41], array[45]); + array[45] = std::max(array[41], array[45]); + array[41] = tmp; + tmp = std::min(array[42], array[46]); + array[46] = std::max(array[42], array[46]); + array[42] = tmp; + tmp = std::min(array[43], array[47]); + array[47] = std::max(array[43], array[47]); + array[43] = tmp; + tmp = std::min(array[4], array[32]); + array[32] = std::max(array[4], array[32]); + array[4] = tmp; + tmp = std::min(array[5], array[33]); + array[33] = std::max(array[5], array[33]); + array[5] = tmp; + tmp = std::min(array[6], array[34]); + array[34] = std::max(array[6], array[34]); + array[6] = tmp; + tmp = std::min(array[7], array[35]); + array[35] = std::max(array[7], array[35]); + array[7] = tmp; + tmp = std::min(array[12], array[40]); + array[40] = std::max(array[12], array[40]); + array[12] = tmp; + tmp = std::min(array[13], array[41]); + array[41] = std::max(array[13], array[41]); + array[13] = tmp; + tmp = std::min(array[14], array[42]); + array[42] = std::max(array[14], array[42]); + array[14] = tmp; + tmp = std::min(array[15], array[43]); + array[43] = std::max(array[15], array[43]); + array[15] = tmp; + tmp = std::min(array[20], array[48]); + array[48] = std::max(array[20], array[48]); + array[20] = tmp; + tmp = std::min(array[4], array[16]); + array[16] = std::max(array[4], array[16]); + array[4] = tmp; + tmp = std::min(array[5], array[17]); + array[17] = std::max(array[5], array[17]); + array[5] = tmp; + tmp = std::min(array[6], array[18]); + array[18] = std::max(array[6], array[18]); + array[6] = tmp; + tmp = std::min(array[7], array[19]); + array[19] = std::max(array[7], array[19]); + array[7] = tmp; + tmp = std::min(array[12], array[24]); + array[24] = std::max(array[12], array[24]); + array[12] = tmp; + tmp = std::min(array[13], array[25]); + array[25] = std::max(array[13], array[25]); + array[13] = tmp; + tmp = std::min(array[14], array[26]); + array[26] = std::max(array[14], array[26]); + array[14] = tmp; + tmp = std::min(array[15], array[27]); + array[27] = std::max(array[15], array[27]); + array[15] = tmp; + tmp = std::min(array[20], array[32]); + array[32] = std::max(array[20], array[32]); + array[20] = tmp; + tmp = std::min(array[21], array[33]); + array[33] = std::max(array[21], array[33]); + array[21] = tmp; + tmp = std::min(array[22], array[34]); + array[34] = std::max(array[22], array[34]); + array[22] = tmp; + tmp = std::min(array[23], array[35]); + array[35] = std::max(array[23], array[35]); + array[23] = tmp; + tmp = std::min(array[28], array[40]); + array[40] = std::max(array[28], array[40]); + array[28] = tmp; + tmp = std::min(array[29], array[41]); + array[41] = std::max(array[29], array[41]); + array[29] = tmp; + tmp = std::min(array[30], array[42]); + array[42] = std::max(array[30], array[42]); + array[30] = tmp; + tmp = std::min(array[31], array[43]); + array[43] = std::max(array[31], array[43]); + array[31] = tmp; + tmp = std::min(array[36], array[48]); + array[48] = std::max(array[36], array[48]); + array[36] = tmp; + tmp = std::min(array[4], array[8]); + array[8] = std::max(array[4], array[8]); + array[4] = tmp; + tmp = std::min(array[5], array[9]); + array[9] = std::max(array[5], array[9]); + array[5] = tmp; + tmp = std::min(array[6], array[10]); + array[10] = std::max(array[6], array[10]); + array[6] = tmp; + tmp = std::min(array[7], array[11]); + array[11] = std::max(array[7], array[11]); + array[7] = tmp; + tmp = std::min(array[12], array[16]); + array[16] = std::max(array[12], array[16]); + array[12] = tmp; + tmp = std::min(array[13], array[17]); + array[17] = std::max(array[13], array[17]); + array[13] = tmp; + tmp = std::min(array[14], array[18]); + array[18] = std::max(array[14], array[18]); + array[14] = tmp; + tmp = std::min(array[15], array[19]); + array[19] = std::max(array[15], array[19]); + array[15] = tmp; + tmp = std::min(array[20], array[24]); + array[24] = std::max(array[20], array[24]); + array[20] = tmp; + tmp = std::min(array[21], array[25]); + array[25] = std::max(array[21], array[25]); + array[21] = tmp; + tmp = std::min(array[22], array[26]); + array[26] = std::max(array[22], array[26]); + array[22] = tmp; + tmp = std::min(array[23], array[27]); + array[27] = std::max(array[23], array[27]); + array[23] = tmp; + tmp = std::min(array[28], array[32]); + array[32] = std::max(array[28], array[32]); + array[28] = tmp; + tmp = std::min(array[29], array[33]); + array[33] = std::max(array[29], array[33]); + array[29] = tmp; + tmp = std::min(array[30], array[34]); + array[34] = std::max(array[30], array[34]); + array[30] = tmp; + tmp = std::min(array[31], array[35]); + array[35] = std::max(array[31], array[35]); + array[31] = tmp; + tmp = std::min(array[36], array[40]); + array[40] = std::max(array[36], array[40]); + array[36] = tmp; + tmp = std::min(array[37], array[41]); + array[41] = std::max(array[37], array[41]); + array[37] = tmp; + tmp = std::min(array[38], array[42]); + array[42] = std::max(array[38], array[42]); + array[38] = tmp; + tmp = std::min(array[39], array[43]); + array[43] = std::max(array[39], array[43]); + array[39] = tmp; + tmp = std::min(array[44], array[48]); + array[48] = std::max(array[44], array[48]); + array[44] = tmp; + tmp = std::min(array[0], array[2]); + array[2] = std::max(array[0], array[2]); + array[0] = tmp; + tmp = std::min(array[1], array[3]); + array[3] = std::max(array[1], array[3]); + array[1] = tmp; + tmp = std::min(array[4], array[6]); + array[6] = std::max(array[4], array[6]); + array[4] = tmp; + tmp = std::min(array[5], array[7]); + array[7] = std::max(array[5], array[7]); + array[5] = tmp; + tmp = std::min(array[8], array[10]); + array[10] = std::max(array[8], array[10]); + array[8] = tmp; + tmp = std::min(array[9], array[11]); + array[11] = std::max(array[9], array[11]); + array[9] = tmp; + tmp = std::min(array[12], array[14]); + array[14] = std::max(array[12], array[14]); + array[12] = tmp; + tmp = std::min(array[13], array[15]); + array[15] = std::max(array[13], array[15]); + array[13] = tmp; + tmp = std::min(array[16], array[18]); + array[18] = std::max(array[16], array[18]); + array[16] = tmp; + tmp = std::min(array[17], array[19]); + array[19] = std::max(array[17], array[19]); + array[17] = tmp; + tmp = std::min(array[20], array[22]); + array[22] = std::max(array[20], array[22]); + array[20] = tmp; + tmp = std::min(array[21], array[23]); + array[23] = std::max(array[21], array[23]); + array[21] = tmp; + tmp = std::min(array[24], array[26]); + array[26] = std::max(array[24], array[26]); + array[24] = tmp; + tmp = std::min(array[25], array[27]); + array[27] = std::max(array[25], array[27]); + array[25] = tmp; + tmp = std::min(array[28], array[30]); + array[30] = std::max(array[28], array[30]); + array[28] = tmp; + tmp = std::min(array[29], array[31]); + array[31] = std::max(array[29], array[31]); + array[29] = tmp; + tmp = std::min(array[32], array[34]); + array[34] = std::max(array[32], array[34]); + array[32] = tmp; + tmp = std::min(array[33], array[35]); + array[35] = std::max(array[33], array[35]); + array[33] = tmp; + tmp = std::min(array[36], array[38]); + array[38] = std::max(array[36], array[38]); + array[36] = tmp; + tmp = std::min(array[37], array[39]); + array[39] = std::max(array[37], array[39]); + array[37] = tmp; + tmp = std::min(array[40], array[42]); + array[42] = std::max(array[40], array[42]); + array[40] = tmp; + tmp = std::min(array[41], array[43]); + array[43] = std::max(array[41], array[43]); + array[41] = tmp; + tmp = std::min(array[44], array[46]); + array[46] = std::max(array[44], array[46]); + array[44] = tmp; + tmp = std::min(array[45], array[47]); + array[47] = std::max(array[45], array[47]); + array[45] = tmp; + tmp = std::min(array[2], array[32]); + array[32] = std::max(array[2], array[32]); + array[2] = tmp; + tmp = std::min(array[3], array[33]); + array[33] = std::max(array[3], array[33]); + array[3] = tmp; + tmp = std::min(array[6], array[36]); + array[36] = std::max(array[6], array[36]); + array[6] = tmp; + tmp = std::min(array[7], array[37]); + array[37] = std::max(array[7], array[37]); + array[7] = tmp; + tmp = std::min(array[10], array[40]); + array[40] = std::max(array[10], array[40]); + array[10] = tmp; + tmp = std::min(array[11], array[41]); + array[41] = std::max(array[11], array[41]); + array[11] = tmp; + tmp = std::min(array[14], array[44]); + array[44] = std::max(array[14], array[44]); + array[14] = tmp; + tmp = std::min(array[15], array[45]); + array[45] = std::max(array[15], array[45]); + array[15] = tmp; + tmp = std::min(array[18], array[48]); + array[48] = std::max(array[18], array[48]); + array[18] = tmp; + tmp = std::min(array[2], array[16]); + array[16] = std::max(array[2], array[16]); + array[2] = tmp; + tmp = std::min(array[3], array[17]); + array[17] = std::max(array[3], array[17]); + array[3] = tmp; + tmp = std::min(array[6], array[20]); + array[20] = std::max(array[6], array[20]); + array[6] = tmp; + tmp = std::min(array[7], array[21]); + array[21] = std::max(array[7], array[21]); + array[7] = tmp; + tmp = std::min(array[10], array[24]); + array[24] = std::max(array[10], array[24]); + array[10] = tmp; + tmp = std::min(array[11], array[25]); + array[25] = std::max(array[11], array[25]); + array[11] = tmp; + tmp = std::min(array[14], array[28]); + array[28] = std::max(array[14], array[28]); + array[14] = tmp; + tmp = std::min(array[15], array[29]); + array[29] = std::max(array[15], array[29]); + array[15] = tmp; + tmp = std::min(array[18], array[32]); + array[32] = std::max(array[18], array[32]); + array[18] = tmp; + tmp = std::min(array[19], array[33]); + array[33] = std::max(array[19], array[33]); + array[19] = tmp; + tmp = std::min(array[22], array[36]); + array[36] = std::max(array[22], array[36]); + array[22] = tmp; + tmp = std::min(array[23], array[37]); + array[37] = std::max(array[23], array[37]); + array[23] = tmp; + tmp = std::min(array[26], array[40]); + array[40] = std::max(array[26], array[40]); + array[26] = tmp; + tmp = std::min(array[27], array[41]); + array[41] = std::max(array[27], array[41]); + array[27] = tmp; + tmp = std::min(array[30], array[44]); + array[44] = std::max(array[30], array[44]); + array[30] = tmp; + tmp = std::min(array[31], array[45]); + array[45] = std::max(array[31], array[45]); + array[31] = tmp; + tmp = std::min(array[34], array[48]); + array[48] = std::max(array[34], array[48]); + array[34] = tmp; + tmp = std::min(array[2], array[8]); + array[8] = std::max(array[2], array[8]); + array[2] = tmp; + tmp = std::min(array[3], array[9]); + array[9] = std::max(array[3], array[9]); + array[3] = tmp; + tmp = std::min(array[6], array[12]); + array[12] = std::max(array[6], array[12]); + array[6] = tmp; + tmp = std::min(array[7], array[13]); + array[13] = std::max(array[7], array[13]); + array[7] = tmp; + tmp = std::min(array[10], array[16]); + array[16] = std::max(array[10], array[16]); + array[10] = tmp; + tmp = std::min(array[11], array[17]); + array[17] = std::max(array[11], array[17]); + array[11] = tmp; + tmp = std::min(array[14], array[20]); + array[20] = std::max(array[14], array[20]); + array[14] = tmp; + tmp = std::min(array[15], array[21]); + array[21] = std::max(array[15], array[21]); + array[15] = tmp; + tmp = std::min(array[18], array[24]); + array[24] = std::max(array[18], array[24]); + array[18] = tmp; + tmp = std::min(array[19], array[25]); + array[25] = std::max(array[19], array[25]); + array[19] = tmp; + tmp = std::min(array[22], array[28]); + array[28] = std::max(array[22], array[28]); + array[22] = tmp; + tmp = std::min(array[23], array[29]); + array[29] = std::max(array[23], array[29]); + array[23] = tmp; + tmp = std::min(array[26], array[32]); + array[32] = std::max(array[26], array[32]); + array[26] = tmp; + tmp = std::min(array[27], array[33]); + array[33] = std::max(array[27], array[33]); + array[27] = tmp; + tmp = std::min(array[30], array[36]); + array[36] = std::max(array[30], array[36]); + array[30] = tmp; + tmp = std::min(array[31], array[37]); + array[37] = std::max(array[31], array[37]); + array[31] = tmp; + tmp = std::min(array[34], array[40]); + array[40] = std::max(array[34], array[40]); + array[34] = tmp; + tmp = std::min(array[35], array[41]); + array[41] = std::max(array[35], array[41]); + array[35] = tmp; + tmp = std::min(array[38], array[44]); + array[44] = std::max(array[38], array[44]); + array[38] = tmp; + tmp = std::min(array[39], array[45]); + array[45] = std::max(array[39], array[45]); + array[39] = tmp; + tmp = std::min(array[42], array[48]); + array[48] = std::max(array[42], array[48]); + array[42] = tmp; + tmp = std::min(array[2], array[4]); + array[4] = std::max(array[2], array[4]); + array[2] = tmp; + tmp = std::min(array[3], array[5]); + array[5] = std::max(array[3], array[5]); + array[3] = tmp; + tmp = std::min(array[6], array[8]); + array[8] = std::max(array[6], array[8]); + array[6] = tmp; + tmp = std::min(array[7], array[9]); + array[9] = std::max(array[7], array[9]); + array[7] = tmp; + tmp = std::min(array[10], array[12]); + array[12] = std::max(array[10], array[12]); + array[10] = tmp; + tmp = std::min(array[11], array[13]); + array[13] = std::max(array[11], array[13]); + array[11] = tmp; + tmp = std::min(array[14], array[16]); + array[16] = std::max(array[14], array[16]); + array[14] = tmp; + tmp = std::min(array[15], array[17]); + array[17] = std::max(array[15], array[17]); + array[15] = tmp; + tmp = std::min(array[18], array[20]); + array[20] = std::max(array[18], array[20]); + array[18] = tmp; + tmp = std::min(array[19], array[21]); + array[21] = std::max(array[19], array[21]); + array[19] = tmp; + tmp = std::min(array[22], array[24]); + array[24] = std::max(array[22], array[24]); + array[22] = tmp; + tmp = std::min(array[23], array[25]); + array[25] = std::max(array[23], array[25]); + array[23] = tmp; + tmp = std::min(array[26], array[28]); + array[28] = std::max(array[26], array[28]); + array[26] = tmp; + tmp = std::min(array[27], array[29]); + array[29] = std::max(array[27], array[29]); + array[27] = tmp; + tmp = std::min(array[30], array[32]); + array[32] = std::max(array[30], array[32]); + array[30] = tmp; + tmp = std::min(array[31], array[33]); + array[33] = std::max(array[31], array[33]); + array[31] = tmp; + tmp = std::min(array[34], array[36]); + array[36] = std::max(array[34], array[36]); + array[34] = tmp; + tmp = std::min(array[35], array[37]); + array[37] = std::max(array[35], array[37]); + array[35] = tmp; + tmp = std::min(array[38], array[40]); + array[40] = std::max(array[38], array[40]); + array[38] = tmp; + tmp = std::min(array[39], array[41]); + array[41] = std::max(array[39], array[41]); + array[39] = tmp; + tmp = std::min(array[42], array[44]); + array[44] = std::max(array[42], array[44]); + array[42] = tmp; + tmp = std::min(array[43], array[45]); + array[45] = std::max(array[43], array[45]); + array[43] = tmp; + tmp = std::min(array[46], array[48]); + array[48] = std::max(array[46], array[48]); + array[46] = tmp; + array[1] = std::max(array[0], array[1]); + array[3] = std::max(array[2], array[3]); + array[5] = std::max(array[4], array[5]); + array[7] = std::max(array[6], array[7]); + array[9] = std::max(array[8], array[9]); + array[11] = std::max(array[10], array[11]); + array[13] = std::max(array[12], array[13]); + array[15] = std::max(array[14], array[15]); + array[17] = std::max(array[16], array[17]); + array[19] = std::max(array[18], array[19]); + array[21] = std::max(array[20], array[21]); + array[23] = std::max(array[22], array[23]); + array[24] = std::min(array[24], array[25]); + array[26] = std::min(array[26], array[27]); + array[28] = std::min(array[28], array[29]); + array[30] = std::min(array[30], array[31]); + array[32] = std::min(array[32], array[33]); + array[34] = std::min(array[34], array[35]); + array[36] = std::min(array[36], array[37]); + array[38] = std::min(array[38], array[39]); + array[40] = std::min(array[40], array[41]); + array[42] = std::min(array[42], array[43]); + array[44] = std::min(array[44], array[45]); + array[46] = std::min(array[46], array[47]); + array[32] = std::max(array[1], array[32]); + array[34] = std::max(array[3], array[34]); + array[36] = std::max(array[5], array[36]); + array[38] = std::max(array[7], array[38]); + array[9] = std::min(array[9], array[40]); + array[11] = std::min(array[11], array[42]); + array[13] = std::min(array[13], array[44]); + array[15] = std::min(array[15], array[46]); + array[17] = std::min(array[17], array[48]); + array[24] = std::max(array[9], array[24]); + array[26] = std::max(array[11], array[26]); + array[28] = std::max(array[13], array[28]); + array[30] = std::max(array[15], array[30]); + array[17] = std::min(array[17], array[32]); + array[19] = std::min(array[19], array[34]); + array[21] = std::min(array[21], array[36]); + array[23] = std::min(array[23], array[38]); + array[24] = std::max(array[17], array[24]); + array[26] = std::max(array[19], array[26]); + array[21] = std::min(array[21], array[28]); + array[23] = std::min(array[23], array[30]); + array[24] = std::max(array[21], array[24]); + array[23] = std::min(array[23], array[26]); + return std::max(array[23], array[24]); +} + +#ifdef __SSE2__ +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[0], array[32]); + array[32] = vmaxf(array[0], array[32]); + array[0] = tmp; + tmp = vminf(array[1], array[33]); + array[33] = vmaxf(array[1], array[33]); + array[1] = tmp; + tmp = vminf(array[2], array[34]); + array[34] = vmaxf(array[2], array[34]); + array[2] = tmp; + tmp = vminf(array[3], array[35]); + array[35] = vmaxf(array[3], array[35]); + array[3] = tmp; + tmp = vminf(array[4], array[36]); + array[36] = vmaxf(array[4], array[36]); + array[4] = tmp; + tmp = vminf(array[5], array[37]); + array[37] = vmaxf(array[5], array[37]); + array[5] = tmp; + tmp = vminf(array[6], array[38]); + array[38] = vmaxf(array[6], array[38]); + array[6] = tmp; + tmp = vminf(array[7], array[39]); + array[39] = vmaxf(array[7], array[39]); + array[7] = tmp; + tmp = vminf(array[8], array[40]); + array[40] = vmaxf(array[8], array[40]); + array[8] = tmp; + tmp = vminf(array[9], array[41]); + array[41] = vmaxf(array[9], array[41]); + array[9] = tmp; + tmp = vminf(array[10], array[42]); + array[42] = vmaxf(array[10], array[42]); + array[10] = tmp; + tmp = vminf(array[11], array[43]); + array[43] = vmaxf(array[11], array[43]); + array[11] = tmp; + tmp = vminf(array[12], array[44]); + array[44] = vmaxf(array[12], array[44]); + array[12] = tmp; + tmp = vminf(array[13], array[45]); + array[45] = vmaxf(array[13], array[45]); + array[13] = tmp; + tmp = vminf(array[14], array[46]); + array[46] = vmaxf(array[14], array[46]); + array[14] = tmp; + tmp = vminf(array[15], array[47]); + array[47] = vmaxf(array[15], array[47]); + array[15] = tmp; + tmp = vminf(array[16], array[48]); + array[48] = vmaxf(array[16], array[48]); + array[16] = tmp; + tmp = vminf(array[0], array[16]); + array[16] = vmaxf(array[0], array[16]); + array[0] = tmp; + tmp = vminf(array[1], array[17]); + array[17] = vmaxf(array[1], array[17]); + array[1] = tmp; + tmp = vminf(array[2], array[18]); + array[18] = vmaxf(array[2], array[18]); + array[2] = tmp; + tmp = vminf(array[3], array[19]); + array[19] = vmaxf(array[3], array[19]); + array[3] = tmp; + tmp = vminf(array[4], array[20]); + array[20] = vmaxf(array[4], array[20]); + array[4] = tmp; + tmp = vminf(array[5], array[21]); + array[21] = vmaxf(array[5], array[21]); + array[5] = tmp; + tmp = vminf(array[6], array[22]); + array[22] = vmaxf(array[6], array[22]); + array[6] = tmp; + tmp = vminf(array[7], array[23]); + array[23] = vmaxf(array[7], array[23]); + array[7] = tmp; + tmp = vminf(array[8], array[24]); + array[24] = vmaxf(array[8], array[24]); + array[8] = tmp; + tmp = vminf(array[9], array[25]); + array[25] = vmaxf(array[9], array[25]); + array[9] = tmp; + tmp = vminf(array[10], array[26]); + array[26] = vmaxf(array[10], array[26]); + array[10] = tmp; + tmp = vminf(array[11], array[27]); + array[27] = vmaxf(array[11], array[27]); + array[11] = tmp; + tmp = vminf(array[12], array[28]); + array[28] = vmaxf(array[12], array[28]); + array[12] = tmp; + tmp = vminf(array[13], array[29]); + array[29] = vmaxf(array[13], array[29]); + array[13] = tmp; + tmp = vminf(array[14], array[30]); + array[30] = vmaxf(array[14], array[30]); + array[14] = tmp; + tmp = vminf(array[15], array[31]); + array[31] = vmaxf(array[15], array[31]); + array[15] = tmp; + tmp = vminf(array[32], array[48]); + array[48] = vmaxf(array[32], array[48]); + array[32] = tmp; + tmp = vminf(array[16], array[32]); + array[32] = vmaxf(array[16], array[32]); + array[16] = tmp; + tmp = vminf(array[17], array[33]); + array[33] = vmaxf(array[17], array[33]); + array[17] = tmp; + tmp = vminf(array[18], array[34]); + array[34] = vmaxf(array[18], array[34]); + array[18] = tmp; + tmp = vminf(array[19], array[35]); + array[35] = vmaxf(array[19], array[35]); + array[19] = tmp; + tmp = vminf(array[20], array[36]); + array[36] = vmaxf(array[20], array[36]); + array[20] = tmp; + tmp = vminf(array[21], array[37]); + array[37] = vmaxf(array[21], array[37]); + array[21] = tmp; + tmp = vminf(array[22], array[38]); + array[38] = vmaxf(array[22], array[38]); + array[22] = tmp; + tmp = vminf(array[23], array[39]); + array[39] = vmaxf(array[23], array[39]); + array[23] = tmp; + tmp = vminf(array[24], array[40]); + array[40] = vmaxf(array[24], array[40]); + array[24] = tmp; + tmp = vminf(array[25], array[41]); + array[41] = vmaxf(array[25], array[41]); + array[25] = tmp; + tmp = vminf(array[26], array[42]); + array[42] = vmaxf(array[26], array[42]); + array[26] = tmp; + tmp = vminf(array[27], array[43]); + array[43] = vmaxf(array[27], array[43]); + array[27] = tmp; + tmp = vminf(array[28], array[44]); + array[44] = vmaxf(array[28], array[44]); + array[28] = tmp; + tmp = vminf(array[29], array[45]); + array[45] = vmaxf(array[29], array[45]); + array[29] = tmp; + tmp = vminf(array[30], array[46]); + array[46] = vmaxf(array[30], array[46]); + array[30] = tmp; + tmp = vminf(array[31], array[47]); + array[47] = vmaxf(array[31], array[47]); + array[31] = tmp; + tmp = vminf(array[0], array[8]); + array[8] = vmaxf(array[0], array[8]); + array[0] = tmp; + tmp = vminf(array[1], array[9]); + array[9] = vmaxf(array[1], array[9]); + array[1] = tmp; + tmp = vminf(array[2], array[10]); + array[10] = vmaxf(array[2], array[10]); + array[2] = tmp; + tmp = vminf(array[3], array[11]); + array[11] = vmaxf(array[3], array[11]); + array[3] = tmp; + tmp = vminf(array[4], array[12]); + array[12] = vmaxf(array[4], array[12]); + array[4] = tmp; + tmp = vminf(array[5], array[13]); + array[13] = vmaxf(array[5], array[13]); + array[5] = tmp; + tmp = vminf(array[6], array[14]); + array[14] = vmaxf(array[6], array[14]); + array[6] = tmp; + tmp = vminf(array[7], array[15]); + array[15] = vmaxf(array[7], array[15]); + array[7] = tmp; + tmp = vminf(array[16], array[24]); + array[24] = vmaxf(array[16], array[24]); + array[16] = tmp; + tmp = vminf(array[17], array[25]); + array[25] = vmaxf(array[17], array[25]); + array[17] = tmp; + tmp = vminf(array[18], array[26]); + array[26] = vmaxf(array[18], array[26]); + array[18] = tmp; + tmp = vminf(array[19], array[27]); + array[27] = vmaxf(array[19], array[27]); + array[19] = tmp; + tmp = vminf(array[20], array[28]); + array[28] = vmaxf(array[20], array[28]); + array[20] = tmp; + tmp = vminf(array[21], array[29]); + array[29] = vmaxf(array[21], array[29]); + array[21] = tmp; + tmp = vminf(array[22], array[30]); + array[30] = vmaxf(array[22], array[30]); + array[22] = tmp; + tmp = vminf(array[23], array[31]); + array[31] = vmaxf(array[23], array[31]); + array[23] = tmp; + tmp = vminf(array[32], array[40]); + array[40] = vmaxf(array[32], array[40]); + array[32] = tmp; + tmp = vminf(array[33], array[41]); + array[41] = vmaxf(array[33], array[41]); + array[33] = tmp; + tmp = vminf(array[34], array[42]); + array[42] = vmaxf(array[34], array[42]); + array[34] = tmp; + tmp = vminf(array[35], array[43]); + array[43] = vmaxf(array[35], array[43]); + array[35] = tmp; + tmp = vminf(array[36], array[44]); + array[44] = vmaxf(array[36], array[44]); + array[36] = tmp; + tmp = vminf(array[37], array[45]); + array[45] = vmaxf(array[37], array[45]); + array[37] = tmp; + tmp = vminf(array[38], array[46]); + array[46] = vmaxf(array[38], array[46]); + array[38] = tmp; + tmp = vminf(array[39], array[47]); + array[47] = vmaxf(array[39], array[47]); + array[39] = tmp; + tmp = vminf(array[8], array[32]); + array[32] = vmaxf(array[8], array[32]); + array[8] = tmp; + tmp = vminf(array[9], array[33]); + array[33] = vmaxf(array[9], array[33]); + array[9] = tmp; + tmp = vminf(array[10], array[34]); + array[34] = vmaxf(array[10], array[34]); + array[10] = tmp; + tmp = vminf(array[11], array[35]); + array[35] = vmaxf(array[11], array[35]); + array[11] = tmp; + tmp = vminf(array[12], array[36]); + array[36] = vmaxf(array[12], array[36]); + array[12] = tmp; + tmp = vminf(array[13], array[37]); + array[37] = vmaxf(array[13], array[37]); + array[13] = tmp; + tmp = vminf(array[14], array[38]); + array[38] = vmaxf(array[14], array[38]); + array[14] = tmp; + tmp = vminf(array[15], array[39]); + array[39] = vmaxf(array[15], array[39]); + array[15] = tmp; + tmp = vminf(array[24], array[48]); + array[48] = vmaxf(array[24], array[48]); + array[24] = tmp; + tmp = vminf(array[8], array[16]); + array[16] = vmaxf(array[8], array[16]); + array[8] = tmp; + tmp = vminf(array[9], array[17]); + array[17] = vmaxf(array[9], array[17]); + array[9] = tmp; + tmp = vminf(array[10], array[18]); + array[18] = vmaxf(array[10], array[18]); + array[10] = tmp; + tmp = vminf(array[11], array[19]); + array[19] = vmaxf(array[11], array[19]); + array[11] = tmp; + tmp = vminf(array[12], array[20]); + array[20] = vmaxf(array[12], array[20]); + array[12] = tmp; + tmp = vminf(array[13], array[21]); + array[21] = vmaxf(array[13], array[21]); + array[13] = tmp; + tmp = vminf(array[14], array[22]); + array[22] = vmaxf(array[14], array[22]); + array[14] = tmp; + tmp = vminf(array[15], array[23]); + array[23] = vmaxf(array[15], array[23]); + array[15] = tmp; + tmp = vminf(array[24], array[32]); + array[32] = vmaxf(array[24], array[32]); + array[24] = tmp; + tmp = vminf(array[25], array[33]); + array[33] = vmaxf(array[25], array[33]); + array[25] = tmp; + tmp = vminf(array[26], array[34]); + array[34] = vmaxf(array[26], array[34]); + array[26] = tmp; + tmp = vminf(array[27], array[35]); + array[35] = vmaxf(array[27], array[35]); + array[27] = tmp; + tmp = vminf(array[28], array[36]); + array[36] = vmaxf(array[28], array[36]); + array[28] = tmp; + tmp = vminf(array[29], array[37]); + array[37] = vmaxf(array[29], array[37]); + array[29] = tmp; + tmp = vminf(array[30], array[38]); + array[38] = vmaxf(array[30], array[38]); + array[30] = tmp; + tmp = vminf(array[31], array[39]); + array[39] = vmaxf(array[31], array[39]); + array[31] = tmp; + tmp = vminf(array[40], array[48]); + array[48] = vmaxf(array[40], array[48]); + array[40] = tmp; + tmp = vminf(array[0], array[4]); + array[4] = vmaxf(array[0], array[4]); + array[0] = tmp; + tmp = vminf(array[1], array[5]); + array[5] = vmaxf(array[1], array[5]); + array[1] = tmp; + tmp = vminf(array[2], array[6]); + array[6] = vmaxf(array[2], array[6]); + array[2] = tmp; + tmp = vminf(array[3], array[7]); + array[7] = vmaxf(array[3], array[7]); + array[3] = tmp; + tmp = vminf(array[8], array[12]); + array[12] = vmaxf(array[8], array[12]); + array[8] = tmp; + tmp = vminf(array[9], array[13]); + array[13] = vmaxf(array[9], array[13]); + array[9] = tmp; + tmp = vminf(array[10], array[14]); + array[14] = vmaxf(array[10], array[14]); + array[10] = tmp; + tmp = vminf(array[11], array[15]); + array[15] = vmaxf(array[11], array[15]); + array[11] = tmp; + tmp = vminf(array[16], array[20]); + array[20] = vmaxf(array[16], array[20]); + array[16] = tmp; + tmp = vminf(array[17], array[21]); + array[21] = vmaxf(array[17], array[21]); + array[17] = tmp; + tmp = vminf(array[18], array[22]); + array[22] = vmaxf(array[18], array[22]); + array[18] = tmp; + tmp = vminf(array[19], array[23]); + array[23] = vmaxf(array[19], array[23]); + array[19] = tmp; + tmp = vminf(array[24], array[28]); + array[28] = vmaxf(array[24], array[28]); + array[24] = tmp; + tmp = vminf(array[25], array[29]); + array[29] = vmaxf(array[25], array[29]); + array[25] = tmp; + tmp = vminf(array[26], array[30]); + array[30] = vmaxf(array[26], array[30]); + array[26] = tmp; + tmp = vminf(array[27], array[31]); + array[31] = vmaxf(array[27], array[31]); + array[27] = tmp; + tmp = vminf(array[32], array[36]); + array[36] = vmaxf(array[32], array[36]); + array[32] = tmp; + tmp = vminf(array[33], array[37]); + array[37] = vmaxf(array[33], array[37]); + array[33] = tmp; + tmp = vminf(array[34], array[38]); + array[38] = vmaxf(array[34], array[38]); + array[34] = tmp; + tmp = vminf(array[35], array[39]); + array[39] = vmaxf(array[35], array[39]); + array[35] = tmp; + tmp = vminf(array[40], array[44]); + array[44] = vmaxf(array[40], array[44]); + array[40] = tmp; + tmp = vminf(array[41], array[45]); + array[45] = vmaxf(array[41], array[45]); + array[41] = tmp; + tmp = vminf(array[42], array[46]); + array[46] = vmaxf(array[42], array[46]); + array[42] = tmp; + tmp = vminf(array[43], array[47]); + array[47] = vmaxf(array[43], array[47]); + array[43] = tmp; + tmp = vminf(array[4], array[32]); + array[32] = vmaxf(array[4], array[32]); + array[4] = tmp; + tmp = vminf(array[5], array[33]); + array[33] = vmaxf(array[5], array[33]); + array[5] = tmp; + tmp = vminf(array[6], array[34]); + array[34] = vmaxf(array[6], array[34]); + array[6] = tmp; + tmp = vminf(array[7], array[35]); + array[35] = vmaxf(array[7], array[35]); + array[7] = tmp; + tmp = vminf(array[12], array[40]); + array[40] = vmaxf(array[12], array[40]); + array[12] = tmp; + tmp = vminf(array[13], array[41]); + array[41] = vmaxf(array[13], array[41]); + array[13] = tmp; + tmp = vminf(array[14], array[42]); + array[42] = vmaxf(array[14], array[42]); + array[14] = tmp; + tmp = vminf(array[15], array[43]); + array[43] = vmaxf(array[15], array[43]); + array[15] = tmp; + tmp = vminf(array[20], array[48]); + array[48] = vmaxf(array[20], array[48]); + array[20] = tmp; + tmp = vminf(array[4], array[16]); + array[16] = vmaxf(array[4], array[16]); + array[4] = tmp; + tmp = vminf(array[5], array[17]); + array[17] = vmaxf(array[5], array[17]); + array[5] = tmp; + tmp = vminf(array[6], array[18]); + array[18] = vmaxf(array[6], array[18]); + array[6] = tmp; + tmp = vminf(array[7], array[19]); + array[19] = vmaxf(array[7], array[19]); + array[7] = tmp; + tmp = vminf(array[12], array[24]); + array[24] = vmaxf(array[12], array[24]); + array[12] = tmp; + tmp = vminf(array[13], array[25]); + array[25] = vmaxf(array[13], array[25]); + array[13] = tmp; + tmp = vminf(array[14], array[26]); + array[26] = vmaxf(array[14], array[26]); + array[14] = tmp; + tmp = vminf(array[15], array[27]); + array[27] = vmaxf(array[15], array[27]); + array[15] = tmp; + tmp = vminf(array[20], array[32]); + array[32] = vmaxf(array[20], array[32]); + array[20] = tmp; + tmp = vminf(array[21], array[33]); + array[33] = vmaxf(array[21], array[33]); + array[21] = tmp; + tmp = vminf(array[22], array[34]); + array[34] = vmaxf(array[22], array[34]); + array[22] = tmp; + tmp = vminf(array[23], array[35]); + array[35] = vmaxf(array[23], array[35]); + array[23] = tmp; + tmp = vminf(array[28], array[40]); + array[40] = vmaxf(array[28], array[40]); + array[28] = tmp; + tmp = vminf(array[29], array[41]); + array[41] = vmaxf(array[29], array[41]); + array[29] = tmp; + tmp = vminf(array[30], array[42]); + array[42] = vmaxf(array[30], array[42]); + array[30] = tmp; + tmp = vminf(array[31], array[43]); + array[43] = vmaxf(array[31], array[43]); + array[31] = tmp; + tmp = vminf(array[36], array[48]); + array[48] = vmaxf(array[36], array[48]); + array[36] = tmp; + tmp = vminf(array[4], array[8]); + array[8] = vmaxf(array[4], array[8]); + array[4] = tmp; + tmp = vminf(array[5], array[9]); + array[9] = vmaxf(array[5], array[9]); + array[5] = tmp; + tmp = vminf(array[6], array[10]); + array[10] = vmaxf(array[6], array[10]); + array[6] = tmp; + tmp = vminf(array[7], array[11]); + array[11] = vmaxf(array[7], array[11]); + array[7] = tmp; + tmp = vminf(array[12], array[16]); + array[16] = vmaxf(array[12], array[16]); + array[12] = tmp; + tmp = vminf(array[13], array[17]); + array[17] = vmaxf(array[13], array[17]); + array[13] = tmp; + tmp = vminf(array[14], array[18]); + array[18] = vmaxf(array[14], array[18]); + array[14] = tmp; + tmp = vminf(array[15], array[19]); + array[19] = vmaxf(array[15], array[19]); + array[15] = tmp; + tmp = vminf(array[20], array[24]); + array[24] = vmaxf(array[20], array[24]); + array[20] = tmp; + tmp = vminf(array[21], array[25]); + array[25] = vmaxf(array[21], array[25]); + array[21] = tmp; + tmp = vminf(array[22], array[26]); + array[26] = vmaxf(array[22], array[26]); + array[22] = tmp; + tmp = vminf(array[23], array[27]); + array[27] = vmaxf(array[23], array[27]); + array[23] = tmp; + tmp = vminf(array[28], array[32]); + array[32] = vmaxf(array[28], array[32]); + array[28] = tmp; + tmp = vminf(array[29], array[33]); + array[33] = vmaxf(array[29], array[33]); + array[29] = tmp; + tmp = vminf(array[30], array[34]); + array[34] = vmaxf(array[30], array[34]); + array[30] = tmp; + tmp = vminf(array[31], array[35]); + array[35] = vmaxf(array[31], array[35]); + array[31] = tmp; + tmp = vminf(array[36], array[40]); + array[40] = vmaxf(array[36], array[40]); + array[36] = tmp; + tmp = vminf(array[37], array[41]); + array[41] = vmaxf(array[37], array[41]); + array[37] = tmp; + tmp = vminf(array[38], array[42]); + array[42] = vmaxf(array[38], array[42]); + array[38] = tmp; + tmp = vminf(array[39], array[43]); + array[43] = vmaxf(array[39], array[43]); + array[39] = tmp; + tmp = vminf(array[44], array[48]); + array[48] = vmaxf(array[44], array[48]); + array[44] = tmp; + tmp = vminf(array[0], array[2]); + array[2] = vmaxf(array[0], array[2]); + array[0] = tmp; + tmp = vminf(array[1], array[3]); + array[3] = vmaxf(array[1], array[3]); + array[1] = tmp; + tmp = vminf(array[4], array[6]); + array[6] = vmaxf(array[4], array[6]); + array[4] = tmp; + tmp = vminf(array[5], array[7]); + array[7] = vmaxf(array[5], array[7]); + array[5] = tmp; + tmp = vminf(array[8], array[10]); + array[10] = vmaxf(array[8], array[10]); + array[8] = tmp; + tmp = vminf(array[9], array[11]); + array[11] = vmaxf(array[9], array[11]); + array[9] = tmp; + tmp = vminf(array[12], array[14]); + array[14] = vmaxf(array[12], array[14]); + array[12] = tmp; + tmp = vminf(array[13], array[15]); + array[15] = vmaxf(array[13], array[15]); + array[13] = tmp; + tmp = vminf(array[16], array[18]); + array[18] = vmaxf(array[16], array[18]); + array[16] = tmp; + tmp = vminf(array[17], array[19]); + array[19] = vmaxf(array[17], array[19]); + array[17] = tmp; + tmp = vminf(array[20], array[22]); + array[22] = vmaxf(array[20], array[22]); + array[20] = tmp; + tmp = vminf(array[21], array[23]); + array[23] = vmaxf(array[21], array[23]); + array[21] = tmp; + tmp = vminf(array[24], array[26]); + array[26] = vmaxf(array[24], array[26]); + array[24] = tmp; + tmp = vminf(array[25], array[27]); + array[27] = vmaxf(array[25], array[27]); + array[25] = tmp; + tmp = vminf(array[28], array[30]); + array[30] = vmaxf(array[28], array[30]); + array[28] = tmp; + tmp = vminf(array[29], array[31]); + array[31] = vmaxf(array[29], array[31]); + array[29] = tmp; + tmp = vminf(array[32], array[34]); + array[34] = vmaxf(array[32], array[34]); + array[32] = tmp; + tmp = vminf(array[33], array[35]); + array[35] = vmaxf(array[33], array[35]); + array[33] = tmp; + tmp = vminf(array[36], array[38]); + array[38] = vmaxf(array[36], array[38]); + array[36] = tmp; + tmp = vminf(array[37], array[39]); + array[39] = vmaxf(array[37], array[39]); + array[37] = tmp; + tmp = vminf(array[40], array[42]); + array[42] = vmaxf(array[40], array[42]); + array[40] = tmp; + tmp = vminf(array[41], array[43]); + array[43] = vmaxf(array[41], array[43]); + array[41] = tmp; + tmp = vminf(array[44], array[46]); + array[46] = vmaxf(array[44], array[46]); + array[44] = tmp; + tmp = vminf(array[45], array[47]); + array[47] = vmaxf(array[45], array[47]); + array[45] = tmp; + tmp = vminf(array[2], array[32]); + array[32] = vmaxf(array[2], array[32]); + array[2] = tmp; + tmp = vminf(array[3], array[33]); + array[33] = vmaxf(array[3], array[33]); + array[3] = tmp; + tmp = vminf(array[6], array[36]); + array[36] = vmaxf(array[6], array[36]); + array[6] = tmp; + tmp = vminf(array[7], array[37]); + array[37] = vmaxf(array[7], array[37]); + array[7] = tmp; + tmp = vminf(array[10], array[40]); + array[40] = vmaxf(array[10], array[40]); + array[10] = tmp; + tmp = vminf(array[11], array[41]); + array[41] = vmaxf(array[11], array[41]); + array[11] = tmp; + tmp = vminf(array[14], array[44]); + array[44] = vmaxf(array[14], array[44]); + array[14] = tmp; + tmp = vminf(array[15], array[45]); + array[45] = vmaxf(array[15], array[45]); + array[15] = tmp; + tmp = vminf(array[18], array[48]); + array[48] = vmaxf(array[18], array[48]); + array[18] = tmp; + tmp = vminf(array[2], array[16]); + array[16] = vmaxf(array[2], array[16]); + array[2] = tmp; + tmp = vminf(array[3], array[17]); + array[17] = vmaxf(array[3], array[17]); + array[3] = tmp; + tmp = vminf(array[6], array[20]); + array[20] = vmaxf(array[6], array[20]); + array[6] = tmp; + tmp = vminf(array[7], array[21]); + array[21] = vmaxf(array[7], array[21]); + array[7] = tmp; + tmp = vminf(array[10], array[24]); + array[24] = vmaxf(array[10], array[24]); + array[10] = tmp; + tmp = vminf(array[11], array[25]); + array[25] = vmaxf(array[11], array[25]); + array[11] = tmp; + tmp = vminf(array[14], array[28]); + array[28] = vmaxf(array[14], array[28]); + array[14] = tmp; + tmp = vminf(array[15], array[29]); + array[29] = vmaxf(array[15], array[29]); + array[15] = tmp; + tmp = vminf(array[18], array[32]); + array[32] = vmaxf(array[18], array[32]); + array[18] = tmp; + tmp = vminf(array[19], array[33]); + array[33] = vmaxf(array[19], array[33]); + array[19] = tmp; + tmp = vminf(array[22], array[36]); + array[36] = vmaxf(array[22], array[36]); + array[22] = tmp; + tmp = vminf(array[23], array[37]); + array[37] = vmaxf(array[23], array[37]); + array[23] = tmp; + tmp = vminf(array[26], array[40]); + array[40] = vmaxf(array[26], array[40]); + array[26] = tmp; + tmp = vminf(array[27], array[41]); + array[41] = vmaxf(array[27], array[41]); + array[27] = tmp; + tmp = vminf(array[30], array[44]); + array[44] = vmaxf(array[30], array[44]); + array[30] = tmp; + tmp = vminf(array[31], array[45]); + array[45] = vmaxf(array[31], array[45]); + array[31] = tmp; + tmp = vminf(array[34], array[48]); + array[48] = vmaxf(array[34], array[48]); + array[34] = tmp; + tmp = vminf(array[2], array[8]); + array[8] = vmaxf(array[2], array[8]); + array[2] = tmp; + tmp = vminf(array[3], array[9]); + array[9] = vmaxf(array[3], array[9]); + array[3] = tmp; + tmp = vminf(array[6], array[12]); + array[12] = vmaxf(array[6], array[12]); + array[6] = tmp; + tmp = vminf(array[7], array[13]); + array[13] = vmaxf(array[7], array[13]); + array[7] = tmp; + tmp = vminf(array[10], array[16]); + array[16] = vmaxf(array[10], array[16]); + array[10] = tmp; + tmp = vminf(array[11], array[17]); + array[17] = vmaxf(array[11], array[17]); + array[11] = tmp; + tmp = vminf(array[14], array[20]); + array[20] = vmaxf(array[14], array[20]); + array[14] = tmp; + tmp = vminf(array[15], array[21]); + array[21] = vmaxf(array[15], array[21]); + array[15] = tmp; + tmp = vminf(array[18], array[24]); + array[24] = vmaxf(array[18], array[24]); + array[18] = tmp; + tmp = vminf(array[19], array[25]); + array[25] = vmaxf(array[19], array[25]); + array[19] = tmp; + tmp = vminf(array[22], array[28]); + array[28] = vmaxf(array[22], array[28]); + array[22] = tmp; + tmp = vminf(array[23], array[29]); + array[29] = vmaxf(array[23], array[29]); + array[23] = tmp; + tmp = vminf(array[26], array[32]); + array[32] = vmaxf(array[26], array[32]); + array[26] = tmp; + tmp = vminf(array[27], array[33]); + array[33] = vmaxf(array[27], array[33]); + array[27] = tmp; + tmp = vminf(array[30], array[36]); + array[36] = vmaxf(array[30], array[36]); + array[30] = tmp; + tmp = vminf(array[31], array[37]); + array[37] = vmaxf(array[31], array[37]); + array[31] = tmp; + tmp = vminf(array[34], array[40]); + array[40] = vmaxf(array[34], array[40]); + array[34] = tmp; + tmp = vminf(array[35], array[41]); + array[41] = vmaxf(array[35], array[41]); + array[35] = tmp; + tmp = vminf(array[38], array[44]); + array[44] = vmaxf(array[38], array[44]); + array[38] = tmp; + tmp = vminf(array[39], array[45]); + array[45] = vmaxf(array[39], array[45]); + array[39] = tmp; + tmp = vminf(array[42], array[48]); + array[48] = vmaxf(array[42], array[48]); + array[42] = tmp; + tmp = vminf(array[2], array[4]); + array[4] = vmaxf(array[2], array[4]); + array[2] = tmp; + tmp = vminf(array[3], array[5]); + array[5] = vmaxf(array[3], array[5]); + array[3] = tmp; + tmp = vminf(array[6], array[8]); + array[8] = vmaxf(array[6], array[8]); + array[6] = tmp; + tmp = vminf(array[7], array[9]); + array[9] = vmaxf(array[7], array[9]); + array[7] = tmp; + tmp = vminf(array[10], array[12]); + array[12] = vmaxf(array[10], array[12]); + array[10] = tmp; + tmp = vminf(array[11], array[13]); + array[13] = vmaxf(array[11], array[13]); + array[11] = tmp; + tmp = vminf(array[14], array[16]); + array[16] = vmaxf(array[14], array[16]); + array[14] = tmp; + tmp = vminf(array[15], array[17]); + array[17] = vmaxf(array[15], array[17]); + array[15] = tmp; + tmp = vminf(array[18], array[20]); + array[20] = vmaxf(array[18], array[20]); + array[18] = tmp; + tmp = vminf(array[19], array[21]); + array[21] = vmaxf(array[19], array[21]); + array[19] = tmp; + tmp = vminf(array[22], array[24]); + array[24] = vmaxf(array[22], array[24]); + array[22] = tmp; + tmp = vminf(array[23], array[25]); + array[25] = vmaxf(array[23], array[25]); + array[23] = tmp; + tmp = vminf(array[26], array[28]); + array[28] = vmaxf(array[26], array[28]); + array[26] = tmp; + tmp = vminf(array[27], array[29]); + array[29] = vmaxf(array[27], array[29]); + array[27] = tmp; + tmp = vminf(array[30], array[32]); + array[32] = vmaxf(array[30], array[32]); + array[30] = tmp; + tmp = vminf(array[31], array[33]); + array[33] = vmaxf(array[31], array[33]); + array[31] = tmp; + tmp = vminf(array[34], array[36]); + array[36] = vmaxf(array[34], array[36]); + array[34] = tmp; + tmp = vminf(array[35], array[37]); + array[37] = vmaxf(array[35], array[37]); + array[35] = tmp; + tmp = vminf(array[38], array[40]); + array[40] = vmaxf(array[38], array[40]); + array[38] = tmp; + tmp = vminf(array[39], array[41]); + array[41] = vmaxf(array[39], array[41]); + array[39] = tmp; + tmp = vminf(array[42], array[44]); + array[44] = vmaxf(array[42], array[44]); + array[42] = tmp; + tmp = vminf(array[43], array[45]); + array[45] = vmaxf(array[43], array[45]); + array[43] = tmp; + tmp = vminf(array[46], array[48]); + array[48] = vmaxf(array[46], array[48]); + array[46] = tmp; + array[1] = vmaxf(array[0], array[1]); + array[3] = vmaxf(array[2], array[3]); + array[5] = vmaxf(array[4], array[5]); + array[7] = vmaxf(array[6], array[7]); + array[9] = vmaxf(array[8], array[9]); + array[11] = vmaxf(array[10], array[11]); + array[13] = vmaxf(array[12], array[13]); + array[15] = vmaxf(array[14], array[15]); + array[17] = vmaxf(array[16], array[17]); + array[19] = vmaxf(array[18], array[19]); + array[21] = vmaxf(array[20], array[21]); + array[23] = vmaxf(array[22], array[23]); + array[24] = vminf(array[24], array[25]); + array[26] = vminf(array[26], array[27]); + array[28] = vminf(array[28], array[29]); + array[30] = vminf(array[30], array[31]); + array[32] = vminf(array[32], array[33]); + array[34] = vminf(array[34], array[35]); + array[36] = vminf(array[36], array[37]); + array[38] = vminf(array[38], array[39]); + array[40] = vminf(array[40], array[41]); + array[42] = vminf(array[42], array[43]); + array[44] = vminf(array[44], array[45]); + array[46] = vminf(array[46], array[47]); + array[32] = vmaxf(array[1], array[32]); + array[34] = vmaxf(array[3], array[34]); + array[36] = vmaxf(array[5], array[36]); + array[38] = vmaxf(array[7], array[38]); + array[9] = vminf(array[9], array[40]); + array[11] = vminf(array[11], array[42]); + array[13] = vminf(array[13], array[44]); + array[15] = vminf(array[15], array[46]); + array[17] = vminf(array[17], array[48]); + array[24] = vmaxf(array[9], array[24]); + array[26] = vmaxf(array[11], array[26]); + array[28] = vmaxf(array[13], array[28]); + array[30] = vmaxf(array[15], array[30]); + array[17] = vminf(array[17], array[32]); + array[19] = vminf(array[19], array[34]); + array[21] = vminf(array[21], array[36]); + array[23] = vminf(array[23], array[38]); + array[24] = vmaxf(array[17], array[24]); + array[26] = vmaxf(array[19], array[26]); + array[21] = vminf(array[21], array[28]); + array[23] = vminf(array[23], array[30]); + array[24] = vmaxf(array[21], array[24]); + array[23] = vminf(array[23], array[26]); + return vmaxf(array[23], array[24]); +} +#endif + +template +inline T median(std::array array) +{ + T tmp = std::min(array[0], array[64]); + array[64] = std::max(array[0], array[64]); + array[0] = tmp; + tmp = std::min(array[1], array[65]); + array[65] = std::max(array[1], array[65]); + array[1] = tmp; + tmp = std::min(array[2], array[66]); + array[66] = std::max(array[2], array[66]); + array[2] = tmp; + tmp = std::min(array[3], array[67]); + array[67] = std::max(array[3], array[67]); + array[3] = tmp; + tmp = std::min(array[4], array[68]); + array[68] = std::max(array[4], array[68]); + array[4] = tmp; + tmp = std::min(array[5], array[69]); + array[69] = std::max(array[5], array[69]); + array[5] = tmp; + tmp = std::min(array[6], array[70]); + array[70] = std::max(array[6], array[70]); + array[6] = tmp; + tmp = std::min(array[7], array[71]); + array[71] = std::max(array[7], array[71]); + array[7] = tmp; + tmp = std::min(array[8], array[72]); + array[72] = std::max(array[8], array[72]); + array[8] = tmp; + tmp = std::min(array[9], array[73]); + array[73] = std::max(array[9], array[73]); + array[9] = tmp; + tmp = std::min(array[10], array[74]); + array[74] = std::max(array[10], array[74]); + array[10] = tmp; + tmp = std::min(array[11], array[75]); + array[75] = std::max(array[11], array[75]); + array[11] = tmp; + tmp = std::min(array[12], array[76]); + array[76] = std::max(array[12], array[76]); + array[12] = tmp; + tmp = std::min(array[13], array[77]); + array[77] = std::max(array[13], array[77]); + array[13] = tmp; + tmp = std::min(array[14], array[78]); + array[78] = std::max(array[14], array[78]); + array[14] = tmp; + tmp = std::min(array[15], array[79]); + array[79] = std::max(array[15], array[79]); + array[15] = tmp; + tmp = std::min(array[16], array[80]); + array[80] = std::max(array[16], array[80]); + array[16] = tmp; + tmp = std::min(array[0], array[32]); + array[32] = std::max(array[0], array[32]); + array[0] = tmp; + tmp = std::min(array[1], array[33]); + array[33] = std::max(array[1], array[33]); + array[1] = tmp; + tmp = std::min(array[2], array[34]); + array[34] = std::max(array[2], array[34]); + array[2] = tmp; + tmp = std::min(array[3], array[35]); + array[35] = std::max(array[3], array[35]); + array[3] = tmp; + tmp = std::min(array[4], array[36]); + array[36] = std::max(array[4], array[36]); + array[4] = tmp; + tmp = std::min(array[5], array[37]); + array[37] = std::max(array[5], array[37]); + array[5] = tmp; + tmp = std::min(array[6], array[38]); + array[38] = std::max(array[6], array[38]); + array[6] = tmp; + tmp = std::min(array[7], array[39]); + array[39] = std::max(array[7], array[39]); + array[7] = tmp; + tmp = std::min(array[8], array[40]); + array[40] = std::max(array[8], array[40]); + array[8] = tmp; + tmp = std::min(array[9], array[41]); + array[41] = std::max(array[9], array[41]); + array[9] = tmp; + tmp = std::min(array[10], array[42]); + array[42] = std::max(array[10], array[42]); + array[10] = tmp; + tmp = std::min(array[11], array[43]); + array[43] = std::max(array[11], array[43]); + array[11] = tmp; + tmp = std::min(array[12], array[44]); + array[44] = std::max(array[12], array[44]); + array[12] = tmp; + tmp = std::min(array[13], array[45]); + array[45] = std::max(array[13], array[45]); + array[13] = tmp; + tmp = std::min(array[14], array[46]); + array[46] = std::max(array[14], array[46]); + array[14] = tmp; + tmp = std::min(array[15], array[47]); + array[47] = std::max(array[15], array[47]); + array[15] = tmp; + tmp = std::min(array[16], array[48]); + array[48] = std::max(array[16], array[48]); + array[16] = tmp; + tmp = std::min(array[17], array[49]); + array[49] = std::max(array[17], array[49]); + array[17] = tmp; + tmp = std::min(array[18], array[50]); + array[50] = std::max(array[18], array[50]); + array[18] = tmp; + tmp = std::min(array[19], array[51]); + array[51] = std::max(array[19], array[51]); + array[19] = tmp; + tmp = std::min(array[20], array[52]); + array[52] = std::max(array[20], array[52]); + array[20] = tmp; + tmp = std::min(array[21], array[53]); + array[53] = std::max(array[21], array[53]); + array[21] = tmp; + tmp = std::min(array[22], array[54]); + array[54] = std::max(array[22], array[54]); + array[22] = tmp; + tmp = std::min(array[23], array[55]); + array[55] = std::max(array[23], array[55]); + array[23] = tmp; + tmp = std::min(array[24], array[56]); + array[56] = std::max(array[24], array[56]); + array[24] = tmp; + tmp = std::min(array[25], array[57]); + array[57] = std::max(array[25], array[57]); + array[25] = tmp; + tmp = std::min(array[26], array[58]); + array[58] = std::max(array[26], array[58]); + array[26] = tmp; + tmp = std::min(array[27], array[59]); + array[59] = std::max(array[27], array[59]); + array[27] = tmp; + tmp = std::min(array[28], array[60]); + array[60] = std::max(array[28], array[60]); + array[28] = tmp; + tmp = std::min(array[29], array[61]); + array[61] = std::max(array[29], array[61]); + array[29] = tmp; + tmp = std::min(array[30], array[62]); + array[62] = std::max(array[30], array[62]); + array[30] = tmp; + tmp = std::min(array[31], array[63]); + array[63] = std::max(array[31], array[63]); + array[31] = tmp; + tmp = std::min(array[32], array[64]); + array[64] = std::max(array[32], array[64]); + array[32] = tmp; + tmp = std::min(array[33], array[65]); + array[65] = std::max(array[33], array[65]); + array[33] = tmp; + tmp = std::min(array[34], array[66]); + array[66] = std::max(array[34], array[66]); + array[34] = tmp; + tmp = std::min(array[35], array[67]); + array[67] = std::max(array[35], array[67]); + array[35] = tmp; + tmp = std::min(array[36], array[68]); + array[68] = std::max(array[36], array[68]); + array[36] = tmp; + tmp = std::min(array[37], array[69]); + array[69] = std::max(array[37], array[69]); + array[37] = tmp; + tmp = std::min(array[38], array[70]); + array[70] = std::max(array[38], array[70]); + array[38] = tmp; + tmp = std::min(array[39], array[71]); + array[71] = std::max(array[39], array[71]); + array[39] = tmp; + tmp = std::min(array[40], array[72]); + array[72] = std::max(array[40], array[72]); + array[40] = tmp; + tmp = std::min(array[41], array[73]); + array[73] = std::max(array[41], array[73]); + array[41] = tmp; + tmp = std::min(array[42], array[74]); + array[74] = std::max(array[42], array[74]); + array[42] = tmp; + tmp = std::min(array[43], array[75]); + array[75] = std::max(array[43], array[75]); + array[43] = tmp; + tmp = std::min(array[44], array[76]); + array[76] = std::max(array[44], array[76]); + array[44] = tmp; + tmp = std::min(array[45], array[77]); + array[77] = std::max(array[45], array[77]); + array[45] = tmp; + tmp = std::min(array[46], array[78]); + array[78] = std::max(array[46], array[78]); + array[46] = tmp; + tmp = std::min(array[47], array[79]); + array[79] = std::max(array[47], array[79]); + array[47] = tmp; + tmp = std::min(array[48], array[80]); + array[80] = std::max(array[48], array[80]); + array[48] = tmp; + tmp = std::min(array[0], array[16]); + array[16] = std::max(array[0], array[16]); + array[0] = tmp; + tmp = std::min(array[1], array[17]); + array[17] = std::max(array[1], array[17]); + array[1] = tmp; + tmp = std::min(array[2], array[18]); + array[18] = std::max(array[2], array[18]); + array[2] = tmp; + tmp = std::min(array[3], array[19]); + array[19] = std::max(array[3], array[19]); + array[3] = tmp; + tmp = std::min(array[4], array[20]); + array[20] = std::max(array[4], array[20]); + array[4] = tmp; + tmp = std::min(array[5], array[21]); + array[21] = std::max(array[5], array[21]); + array[5] = tmp; + tmp = std::min(array[6], array[22]); + array[22] = std::max(array[6], array[22]); + array[6] = tmp; + tmp = std::min(array[7], array[23]); + array[23] = std::max(array[7], array[23]); + array[7] = tmp; + tmp = std::min(array[8], array[24]); + array[24] = std::max(array[8], array[24]); + array[8] = tmp; + tmp = std::min(array[9], array[25]); + array[25] = std::max(array[9], array[25]); + array[9] = tmp; + tmp = std::min(array[10], array[26]); + array[26] = std::max(array[10], array[26]); + array[10] = tmp; + tmp = std::min(array[11], array[27]); + array[27] = std::max(array[11], array[27]); + array[11] = tmp; + tmp = std::min(array[12], array[28]); + array[28] = std::max(array[12], array[28]); + array[12] = tmp; + tmp = std::min(array[13], array[29]); + array[29] = std::max(array[13], array[29]); + array[13] = tmp; + tmp = std::min(array[14], array[30]); + array[30] = std::max(array[14], array[30]); + array[14] = tmp; + tmp = std::min(array[15], array[31]); + array[31] = std::max(array[15], array[31]); + array[15] = tmp; + tmp = std::min(array[32], array[48]); + array[48] = std::max(array[32], array[48]); + array[32] = tmp; + tmp = std::min(array[33], array[49]); + array[49] = std::max(array[33], array[49]); + array[33] = tmp; + tmp = std::min(array[34], array[50]); + array[50] = std::max(array[34], array[50]); + array[34] = tmp; + tmp = std::min(array[35], array[51]); + array[51] = std::max(array[35], array[51]); + array[35] = tmp; + tmp = std::min(array[36], array[52]); + array[52] = std::max(array[36], array[52]); + array[36] = tmp; + tmp = std::min(array[37], array[53]); + array[53] = std::max(array[37], array[53]); + array[37] = tmp; + tmp = std::min(array[38], array[54]); + array[54] = std::max(array[38], array[54]); + array[38] = tmp; + tmp = std::min(array[39], array[55]); + array[55] = std::max(array[39], array[55]); + array[39] = tmp; + tmp = std::min(array[40], array[56]); + array[56] = std::max(array[40], array[56]); + array[40] = tmp; + tmp = std::min(array[41], array[57]); + array[57] = std::max(array[41], array[57]); + array[41] = tmp; + tmp = std::min(array[42], array[58]); + array[58] = std::max(array[42], array[58]); + array[42] = tmp; + tmp = std::min(array[43], array[59]); + array[59] = std::max(array[43], array[59]); + array[43] = tmp; + tmp = std::min(array[44], array[60]); + array[60] = std::max(array[44], array[60]); + array[44] = tmp; + tmp = std::min(array[45], array[61]); + array[61] = std::max(array[45], array[61]); + array[45] = tmp; + tmp = std::min(array[46], array[62]); + array[62] = std::max(array[46], array[62]); + array[46] = tmp; + tmp = std::min(array[47], array[63]); + array[63] = std::max(array[47], array[63]); + array[47] = tmp; + tmp = std::min(array[64], array[80]); + array[80] = std::max(array[64], array[80]); + array[64] = tmp; + tmp = std::min(array[16], array[64]); + array[64] = std::max(array[16], array[64]); + array[16] = tmp; + tmp = std::min(array[17], array[65]); + array[65] = std::max(array[17], array[65]); + array[17] = tmp; + tmp = std::min(array[18], array[66]); + array[66] = std::max(array[18], array[66]); + array[18] = tmp; + tmp = std::min(array[19], array[67]); + array[67] = std::max(array[19], array[67]); + array[19] = tmp; + tmp = std::min(array[20], array[68]); + array[68] = std::max(array[20], array[68]); + array[20] = tmp; + tmp = std::min(array[21], array[69]); + array[69] = std::max(array[21], array[69]); + array[21] = tmp; + tmp = std::min(array[22], array[70]); + array[70] = std::max(array[22], array[70]); + array[22] = tmp; + tmp = std::min(array[23], array[71]); + array[71] = std::max(array[23], array[71]); + array[23] = tmp; + tmp = std::min(array[24], array[72]); + array[72] = std::max(array[24], array[72]); + array[24] = tmp; + tmp = std::min(array[25], array[73]); + array[73] = std::max(array[25], array[73]); + array[25] = tmp; + tmp = std::min(array[26], array[74]); + array[74] = std::max(array[26], array[74]); + array[26] = tmp; + tmp = std::min(array[27], array[75]); + array[75] = std::max(array[27], array[75]); + array[27] = tmp; + tmp = std::min(array[28], array[76]); + array[76] = std::max(array[28], array[76]); + array[28] = tmp; + tmp = std::min(array[29], array[77]); + array[77] = std::max(array[29], array[77]); + array[29] = tmp; + tmp = std::min(array[30], array[78]); + array[78] = std::max(array[30], array[78]); + array[30] = tmp; + tmp = std::min(array[31], array[79]); + array[79] = std::max(array[31], array[79]); + array[31] = tmp; + tmp = std::min(array[16], array[32]); + array[32] = std::max(array[16], array[32]); + array[16] = tmp; + tmp = std::min(array[17], array[33]); + array[33] = std::max(array[17], array[33]); + array[17] = tmp; + tmp = std::min(array[18], array[34]); + array[34] = std::max(array[18], array[34]); + array[18] = tmp; + tmp = std::min(array[19], array[35]); + array[35] = std::max(array[19], array[35]); + array[19] = tmp; + tmp = std::min(array[20], array[36]); + array[36] = std::max(array[20], array[36]); + array[20] = tmp; + tmp = std::min(array[21], array[37]); + array[37] = std::max(array[21], array[37]); + array[21] = tmp; + tmp = std::min(array[22], array[38]); + array[38] = std::max(array[22], array[38]); + array[22] = tmp; + tmp = std::min(array[23], array[39]); + array[39] = std::max(array[23], array[39]); + array[23] = tmp; + tmp = std::min(array[24], array[40]); + array[40] = std::max(array[24], array[40]); + array[24] = tmp; + tmp = std::min(array[25], array[41]); + array[41] = std::max(array[25], array[41]); + array[25] = tmp; + tmp = std::min(array[26], array[42]); + array[42] = std::max(array[26], array[42]); + array[26] = tmp; + tmp = std::min(array[27], array[43]); + array[43] = std::max(array[27], array[43]); + array[27] = tmp; + tmp = std::min(array[28], array[44]); + array[44] = std::max(array[28], array[44]); + array[28] = tmp; + tmp = std::min(array[29], array[45]); + array[45] = std::max(array[29], array[45]); + array[29] = tmp; + tmp = std::min(array[30], array[46]); + array[46] = std::max(array[30], array[46]); + array[30] = tmp; + tmp = std::min(array[31], array[47]); + array[47] = std::max(array[31], array[47]); + array[31] = tmp; + tmp = std::min(array[48], array[64]); + array[64] = std::max(array[48], array[64]); + array[48] = tmp; + tmp = std::min(array[49], array[65]); + array[65] = std::max(array[49], array[65]); + array[49] = tmp; + tmp = std::min(array[50], array[66]); + array[66] = std::max(array[50], array[66]); + array[50] = tmp; + tmp = std::min(array[51], array[67]); + array[67] = std::max(array[51], array[67]); + array[51] = tmp; + tmp = std::min(array[52], array[68]); + array[68] = std::max(array[52], array[68]); + array[52] = tmp; + tmp = std::min(array[53], array[69]); + array[69] = std::max(array[53], array[69]); + array[53] = tmp; + tmp = std::min(array[54], array[70]); + array[70] = std::max(array[54], array[70]); + array[54] = tmp; + tmp = std::min(array[55], array[71]); + array[71] = std::max(array[55], array[71]); + array[55] = tmp; + tmp = std::min(array[56], array[72]); + array[72] = std::max(array[56], array[72]); + array[56] = tmp; + tmp = std::min(array[57], array[73]); + array[73] = std::max(array[57], array[73]); + array[57] = tmp; + tmp = std::min(array[58], array[74]); + array[74] = std::max(array[58], array[74]); + array[58] = tmp; + tmp = std::min(array[59], array[75]); + array[75] = std::max(array[59], array[75]); + array[59] = tmp; + tmp = std::min(array[60], array[76]); + array[76] = std::max(array[60], array[76]); + array[60] = tmp; + tmp = std::min(array[61], array[77]); + array[77] = std::max(array[61], array[77]); + array[61] = tmp; + tmp = std::min(array[62], array[78]); + array[78] = std::max(array[62], array[78]); + array[62] = tmp; + tmp = std::min(array[63], array[79]); + array[79] = std::max(array[63], array[79]); + array[63] = tmp; + tmp = std::min(array[0], array[8]); + array[8] = std::max(array[0], array[8]); + array[0] = tmp; + tmp = std::min(array[1], array[9]); + array[9] = std::max(array[1], array[9]); + array[1] = tmp; + tmp = std::min(array[2], array[10]); + array[10] = std::max(array[2], array[10]); + array[2] = tmp; + tmp = std::min(array[3], array[11]); + array[11] = std::max(array[3], array[11]); + array[3] = tmp; + tmp = std::min(array[4], array[12]); + array[12] = std::max(array[4], array[12]); + array[4] = tmp; + tmp = std::min(array[5], array[13]); + array[13] = std::max(array[5], array[13]); + array[5] = tmp; + tmp = std::min(array[6], array[14]); + array[14] = std::max(array[6], array[14]); + array[6] = tmp; + tmp = std::min(array[7], array[15]); + array[15] = std::max(array[7], array[15]); + array[7] = tmp; + tmp = std::min(array[16], array[24]); + array[24] = std::max(array[16], array[24]); + array[16] = tmp; + tmp = std::min(array[17], array[25]); + array[25] = std::max(array[17], array[25]); + array[17] = tmp; + tmp = std::min(array[18], array[26]); + array[26] = std::max(array[18], array[26]); + array[18] = tmp; + tmp = std::min(array[19], array[27]); + array[27] = std::max(array[19], array[27]); + array[19] = tmp; + tmp = std::min(array[20], array[28]); + array[28] = std::max(array[20], array[28]); + array[20] = tmp; + tmp = std::min(array[21], array[29]); + array[29] = std::max(array[21], array[29]); + array[21] = tmp; + tmp = std::min(array[22], array[30]); + array[30] = std::max(array[22], array[30]); + array[22] = tmp; + tmp = std::min(array[23], array[31]); + array[31] = std::max(array[23], array[31]); + array[23] = tmp; + tmp = std::min(array[32], array[40]); + array[40] = std::max(array[32], array[40]); + array[32] = tmp; + tmp = std::min(array[33], array[41]); + array[41] = std::max(array[33], array[41]); + array[33] = tmp; + tmp = std::min(array[34], array[42]); + array[42] = std::max(array[34], array[42]); + array[34] = tmp; + tmp = std::min(array[35], array[43]); + array[43] = std::max(array[35], array[43]); + array[35] = tmp; + tmp = std::min(array[36], array[44]); + array[44] = std::max(array[36], array[44]); + array[36] = tmp; + tmp = std::min(array[37], array[45]); + array[45] = std::max(array[37], array[45]); + array[37] = tmp; + tmp = std::min(array[38], array[46]); + array[46] = std::max(array[38], array[46]); + array[38] = tmp; + tmp = std::min(array[39], array[47]); + array[47] = std::max(array[39], array[47]); + array[39] = tmp; + tmp = std::min(array[48], array[56]); + array[56] = std::max(array[48], array[56]); + array[48] = tmp; + tmp = std::min(array[49], array[57]); + array[57] = std::max(array[49], array[57]); + array[49] = tmp; + tmp = std::min(array[50], array[58]); + array[58] = std::max(array[50], array[58]); + array[50] = tmp; + tmp = std::min(array[51], array[59]); + array[59] = std::max(array[51], array[59]); + array[51] = tmp; + tmp = std::min(array[52], array[60]); + array[60] = std::max(array[52], array[60]); + array[52] = tmp; + tmp = std::min(array[53], array[61]); + array[61] = std::max(array[53], array[61]); + array[53] = tmp; + tmp = std::min(array[54], array[62]); + array[62] = std::max(array[54], array[62]); + array[54] = tmp; + tmp = std::min(array[55], array[63]); + array[63] = std::max(array[55], array[63]); + array[55] = tmp; + tmp = std::min(array[64], array[72]); + array[72] = std::max(array[64], array[72]); + array[64] = tmp; + tmp = std::min(array[65], array[73]); + array[73] = std::max(array[65], array[73]); + array[65] = tmp; + tmp = std::min(array[66], array[74]); + array[74] = std::max(array[66], array[74]); + array[66] = tmp; + tmp = std::min(array[67], array[75]); + array[75] = std::max(array[67], array[75]); + array[67] = tmp; + tmp = std::min(array[68], array[76]); + array[76] = std::max(array[68], array[76]); + array[68] = tmp; + tmp = std::min(array[69], array[77]); + array[77] = std::max(array[69], array[77]); + array[69] = tmp; + tmp = std::min(array[70], array[78]); + array[78] = std::max(array[70], array[78]); + array[70] = tmp; + tmp = std::min(array[71], array[79]); + array[79] = std::max(array[71], array[79]); + array[71] = tmp; + tmp = std::min(array[8], array[64]); + array[64] = std::max(array[8], array[64]); + array[8] = tmp; + tmp = std::min(array[9], array[65]); + array[65] = std::max(array[9], array[65]); + array[9] = tmp; + tmp = std::min(array[10], array[66]); + array[66] = std::max(array[10], array[66]); + array[10] = tmp; + tmp = std::min(array[11], array[67]); + array[67] = std::max(array[11], array[67]); + array[11] = tmp; + tmp = std::min(array[12], array[68]); + array[68] = std::max(array[12], array[68]); + array[12] = tmp; + tmp = std::min(array[13], array[69]); + array[69] = std::max(array[13], array[69]); + array[13] = tmp; + tmp = std::min(array[14], array[70]); + array[70] = std::max(array[14], array[70]); + array[14] = tmp; + tmp = std::min(array[15], array[71]); + array[71] = std::max(array[15], array[71]); + array[15] = tmp; + tmp = std::min(array[24], array[80]); + array[80] = std::max(array[24], array[80]); + array[24] = tmp; + tmp = std::min(array[8], array[32]); + array[32] = std::max(array[8], array[32]); + array[8] = tmp; + tmp = std::min(array[9], array[33]); + array[33] = std::max(array[9], array[33]); + array[9] = tmp; + tmp = std::min(array[10], array[34]); + array[34] = std::max(array[10], array[34]); + array[10] = tmp; + tmp = std::min(array[11], array[35]); + array[35] = std::max(array[11], array[35]); + array[11] = tmp; + tmp = std::min(array[12], array[36]); + array[36] = std::max(array[12], array[36]); + array[12] = tmp; + tmp = std::min(array[13], array[37]); + array[37] = std::max(array[13], array[37]); + array[13] = tmp; + tmp = std::min(array[14], array[38]); + array[38] = std::max(array[14], array[38]); + array[14] = tmp; + tmp = std::min(array[15], array[39]); + array[39] = std::max(array[15], array[39]); + array[15] = tmp; + tmp = std::min(array[24], array[48]); + array[48] = std::max(array[24], array[48]); + array[24] = tmp; + tmp = std::min(array[25], array[49]); + array[49] = std::max(array[25], array[49]); + array[25] = tmp; + tmp = std::min(array[26], array[50]); + array[50] = std::max(array[26], array[50]); + array[26] = tmp; + tmp = std::min(array[27], array[51]); + array[51] = std::max(array[27], array[51]); + array[27] = tmp; + tmp = std::min(array[28], array[52]); + array[52] = std::max(array[28], array[52]); + array[28] = tmp; + tmp = std::min(array[29], array[53]); + array[53] = std::max(array[29], array[53]); + array[29] = tmp; + tmp = std::min(array[30], array[54]); + array[54] = std::max(array[30], array[54]); + array[30] = tmp; + tmp = std::min(array[31], array[55]); + array[55] = std::max(array[31], array[55]); + array[31] = tmp; + tmp = std::min(array[40], array[64]); + array[64] = std::max(array[40], array[64]); + array[40] = tmp; + tmp = std::min(array[41], array[65]); + array[65] = std::max(array[41], array[65]); + array[41] = tmp; + tmp = std::min(array[42], array[66]); + array[66] = std::max(array[42], array[66]); + array[42] = tmp; + tmp = std::min(array[43], array[67]); + array[67] = std::max(array[43], array[67]); + array[43] = tmp; + tmp = std::min(array[44], array[68]); + array[68] = std::max(array[44], array[68]); + array[44] = tmp; + tmp = std::min(array[45], array[69]); + array[69] = std::max(array[45], array[69]); + array[45] = tmp; + tmp = std::min(array[46], array[70]); + array[70] = std::max(array[46], array[70]); + array[46] = tmp; + tmp = std::min(array[47], array[71]); + array[71] = std::max(array[47], array[71]); + array[47] = tmp; + tmp = std::min(array[56], array[80]); + array[80] = std::max(array[56], array[80]); + array[56] = tmp; + tmp = std::min(array[8], array[16]); + array[16] = std::max(array[8], array[16]); + array[8] = tmp; + tmp = std::min(array[9], array[17]); + array[17] = std::max(array[9], array[17]); + array[9] = tmp; + tmp = std::min(array[10], array[18]); + array[18] = std::max(array[10], array[18]); + array[10] = tmp; + tmp = std::min(array[11], array[19]); + array[19] = std::max(array[11], array[19]); + array[11] = tmp; + tmp = std::min(array[12], array[20]); + array[20] = std::max(array[12], array[20]); + array[12] = tmp; + tmp = std::min(array[13], array[21]); + array[21] = std::max(array[13], array[21]); + array[13] = tmp; + tmp = std::min(array[14], array[22]); + array[22] = std::max(array[14], array[22]); + array[14] = tmp; + tmp = std::min(array[15], array[23]); + array[23] = std::max(array[15], array[23]); + array[15] = tmp; + tmp = std::min(array[24], array[32]); + array[32] = std::max(array[24], array[32]); + array[24] = tmp; + tmp = std::min(array[25], array[33]); + array[33] = std::max(array[25], array[33]); + array[25] = tmp; + tmp = std::min(array[26], array[34]); + array[34] = std::max(array[26], array[34]); + array[26] = tmp; + tmp = std::min(array[27], array[35]); + array[35] = std::max(array[27], array[35]); + array[27] = tmp; + tmp = std::min(array[28], array[36]); + array[36] = std::max(array[28], array[36]); + array[28] = tmp; + tmp = std::min(array[29], array[37]); + array[37] = std::max(array[29], array[37]); + array[29] = tmp; + tmp = std::min(array[30], array[38]); + array[38] = std::max(array[30], array[38]); + array[30] = tmp; + tmp = std::min(array[31], array[39]); + array[39] = std::max(array[31], array[39]); + array[31] = tmp; + tmp = std::min(array[40], array[48]); + array[48] = std::max(array[40], array[48]); + array[40] = tmp; + tmp = std::min(array[41], array[49]); + array[49] = std::max(array[41], array[49]); + array[41] = tmp; + tmp = std::min(array[42], array[50]); + array[50] = std::max(array[42], array[50]); + array[42] = tmp; + tmp = std::min(array[43], array[51]); + array[51] = std::max(array[43], array[51]); + array[43] = tmp; + tmp = std::min(array[44], array[52]); + array[52] = std::max(array[44], array[52]); + array[44] = tmp; + tmp = std::min(array[45], array[53]); + array[53] = std::max(array[45], array[53]); + array[45] = tmp; + tmp = std::min(array[46], array[54]); + array[54] = std::max(array[46], array[54]); + array[46] = tmp; + tmp = std::min(array[47], array[55]); + array[55] = std::max(array[47], array[55]); + array[47] = tmp; + tmp = std::min(array[56], array[64]); + array[64] = std::max(array[56], array[64]); + array[56] = tmp; + tmp = std::min(array[57], array[65]); + array[65] = std::max(array[57], array[65]); + array[57] = tmp; + tmp = std::min(array[58], array[66]); + array[66] = std::max(array[58], array[66]); + array[58] = tmp; + tmp = std::min(array[59], array[67]); + array[67] = std::max(array[59], array[67]); + array[59] = tmp; + tmp = std::min(array[60], array[68]); + array[68] = std::max(array[60], array[68]); + array[60] = tmp; + tmp = std::min(array[61], array[69]); + array[69] = std::max(array[61], array[69]); + array[61] = tmp; + tmp = std::min(array[62], array[70]); + array[70] = std::max(array[62], array[70]); + array[62] = tmp; + tmp = std::min(array[63], array[71]); + array[71] = std::max(array[63], array[71]); + array[63] = tmp; + tmp = std::min(array[72], array[80]); + array[80] = std::max(array[72], array[80]); + array[72] = tmp; + tmp = std::min(array[0], array[4]); + array[4] = std::max(array[0], array[4]); + array[0] = tmp; + tmp = std::min(array[1], array[5]); + array[5] = std::max(array[1], array[5]); + array[1] = tmp; + tmp = std::min(array[2], array[6]); + array[6] = std::max(array[2], array[6]); + array[2] = tmp; + tmp = std::min(array[3], array[7]); + array[7] = std::max(array[3], array[7]); + array[3] = tmp; + tmp = std::min(array[8], array[12]); + array[12] = std::max(array[8], array[12]); + array[8] = tmp; + tmp = std::min(array[9], array[13]); + array[13] = std::max(array[9], array[13]); + array[9] = tmp; + tmp = std::min(array[10], array[14]); + array[14] = std::max(array[10], array[14]); + array[10] = tmp; + tmp = std::min(array[11], array[15]); + array[15] = std::max(array[11], array[15]); + array[11] = tmp; + tmp = std::min(array[16], array[20]); + array[20] = std::max(array[16], array[20]); + array[16] = tmp; + tmp = std::min(array[17], array[21]); + array[21] = std::max(array[17], array[21]); + array[17] = tmp; + tmp = std::min(array[18], array[22]); + array[22] = std::max(array[18], array[22]); + array[18] = tmp; + tmp = std::min(array[19], array[23]); + array[23] = std::max(array[19], array[23]); + array[19] = tmp; + tmp = std::min(array[24], array[28]); + array[28] = std::max(array[24], array[28]); + array[24] = tmp; + tmp = std::min(array[25], array[29]); + array[29] = std::max(array[25], array[29]); + array[25] = tmp; + tmp = std::min(array[26], array[30]); + array[30] = std::max(array[26], array[30]); + array[26] = tmp; + tmp = std::min(array[27], array[31]); + array[31] = std::max(array[27], array[31]); + array[27] = tmp; + tmp = std::min(array[32], array[36]); + array[36] = std::max(array[32], array[36]); + array[32] = tmp; + tmp = std::min(array[33], array[37]); + array[37] = std::max(array[33], array[37]); + array[33] = tmp; + tmp = std::min(array[34], array[38]); + array[38] = std::max(array[34], array[38]); + array[34] = tmp; + tmp = std::min(array[35], array[39]); + array[39] = std::max(array[35], array[39]); + array[35] = tmp; + tmp = std::min(array[40], array[44]); + array[44] = std::max(array[40], array[44]); + array[40] = tmp; + tmp = std::min(array[41], array[45]); + array[45] = std::max(array[41], array[45]); + array[41] = tmp; + tmp = std::min(array[42], array[46]); + array[46] = std::max(array[42], array[46]); + array[42] = tmp; + tmp = std::min(array[43], array[47]); + array[47] = std::max(array[43], array[47]); + array[43] = tmp; + tmp = std::min(array[48], array[52]); + array[52] = std::max(array[48], array[52]); + array[48] = tmp; + tmp = std::min(array[49], array[53]); + array[53] = std::max(array[49], array[53]); + array[49] = tmp; + tmp = std::min(array[50], array[54]); + array[54] = std::max(array[50], array[54]); + array[50] = tmp; + tmp = std::min(array[51], array[55]); + array[55] = std::max(array[51], array[55]); + array[51] = tmp; + tmp = std::min(array[56], array[60]); + array[60] = std::max(array[56], array[60]); + array[56] = tmp; + tmp = std::min(array[57], array[61]); + array[61] = std::max(array[57], array[61]); + array[57] = tmp; + tmp = std::min(array[58], array[62]); + array[62] = std::max(array[58], array[62]); + array[58] = tmp; + tmp = std::min(array[59], array[63]); + array[63] = std::max(array[59], array[63]); + array[59] = tmp; + tmp = std::min(array[64], array[68]); + array[68] = std::max(array[64], array[68]); + array[64] = tmp; + tmp = std::min(array[65], array[69]); + array[69] = std::max(array[65], array[69]); + array[65] = tmp; + tmp = std::min(array[66], array[70]); + array[70] = std::max(array[66], array[70]); + array[66] = tmp; + tmp = std::min(array[67], array[71]); + array[71] = std::max(array[67], array[71]); + array[67] = tmp; + tmp = std::min(array[72], array[76]); + array[76] = std::max(array[72], array[76]); + array[72] = tmp; + tmp = std::min(array[73], array[77]); + array[77] = std::max(array[73], array[77]); + array[73] = tmp; + tmp = std::min(array[74], array[78]); + array[78] = std::max(array[74], array[78]); + array[74] = tmp; + tmp = std::min(array[75], array[79]); + array[79] = std::max(array[75], array[79]); + array[75] = tmp; + tmp = std::min(array[4], array[64]); + array[64] = std::max(array[4], array[64]); + array[4] = tmp; + tmp = std::min(array[5], array[65]); + array[65] = std::max(array[5], array[65]); + array[5] = tmp; + tmp = std::min(array[6], array[66]); + array[66] = std::max(array[6], array[66]); + array[6] = tmp; + tmp = std::min(array[7], array[67]); + array[67] = std::max(array[7], array[67]); + array[7] = tmp; + tmp = std::min(array[12], array[72]); + array[72] = std::max(array[12], array[72]); + array[12] = tmp; + tmp = std::min(array[13], array[73]); + array[73] = std::max(array[13], array[73]); + array[13] = tmp; + tmp = std::min(array[14], array[74]); + array[74] = std::max(array[14], array[74]); + array[14] = tmp; + tmp = std::min(array[15], array[75]); + array[75] = std::max(array[15], array[75]); + array[15] = tmp; + tmp = std::min(array[20], array[80]); + array[80] = std::max(array[20], array[80]); + array[20] = tmp; + tmp = std::min(array[4], array[32]); + array[32] = std::max(array[4], array[32]); + array[4] = tmp; + tmp = std::min(array[5], array[33]); + array[33] = std::max(array[5], array[33]); + array[5] = tmp; + tmp = std::min(array[6], array[34]); + array[34] = std::max(array[6], array[34]); + array[6] = tmp; + tmp = std::min(array[7], array[35]); + array[35] = std::max(array[7], array[35]); + array[7] = tmp; + tmp = std::min(array[12], array[40]); + array[40] = std::max(array[12], array[40]); + array[12] = tmp; + tmp = std::min(array[13], array[41]); + array[41] = std::max(array[13], array[41]); + array[13] = tmp; + tmp = std::min(array[14], array[42]); + array[42] = std::max(array[14], array[42]); + array[14] = tmp; + tmp = std::min(array[15], array[43]); + array[43] = std::max(array[15], array[43]); + array[15] = tmp; + tmp = std::min(array[20], array[48]); + array[48] = std::max(array[20], array[48]); + array[20] = tmp; + tmp = std::min(array[21], array[49]); + array[49] = std::max(array[21], array[49]); + array[21] = tmp; + tmp = std::min(array[22], array[50]); + array[50] = std::max(array[22], array[50]); + array[22] = tmp; + tmp = std::min(array[23], array[51]); + array[51] = std::max(array[23], array[51]); + array[23] = tmp; + tmp = std::min(array[28], array[56]); + array[56] = std::max(array[28], array[56]); + array[28] = tmp; + tmp = std::min(array[29], array[57]); + array[57] = std::max(array[29], array[57]); + array[29] = tmp; + tmp = std::min(array[30], array[58]); + array[58] = std::max(array[30], array[58]); + array[30] = tmp; + tmp = std::min(array[31], array[59]); + array[59] = std::max(array[31], array[59]); + array[31] = tmp; + tmp = std::min(array[36], array[64]); + array[64] = std::max(array[36], array[64]); + array[36] = tmp; + tmp = std::min(array[37], array[65]); + array[65] = std::max(array[37], array[65]); + array[37] = tmp; + tmp = std::min(array[38], array[66]); + array[66] = std::max(array[38], array[66]); + array[38] = tmp; + tmp = std::min(array[39], array[67]); + array[67] = std::max(array[39], array[67]); + array[39] = tmp; + tmp = std::min(array[44], array[72]); + array[72] = std::max(array[44], array[72]); + array[44] = tmp; + tmp = std::min(array[45], array[73]); + array[73] = std::max(array[45], array[73]); + array[45] = tmp; + tmp = std::min(array[46], array[74]); + array[74] = std::max(array[46], array[74]); + array[46] = tmp; + tmp = std::min(array[47], array[75]); + array[75] = std::max(array[47], array[75]); + array[47] = tmp; + tmp = std::min(array[52], array[80]); + array[80] = std::max(array[52], array[80]); + array[52] = tmp; + tmp = std::min(array[4], array[16]); + array[16] = std::max(array[4], array[16]); + array[4] = tmp; + tmp = std::min(array[5], array[17]); + array[17] = std::max(array[5], array[17]); + array[5] = tmp; + tmp = std::min(array[6], array[18]); + array[18] = std::max(array[6], array[18]); + array[6] = tmp; + tmp = std::min(array[7], array[19]); + array[19] = std::max(array[7], array[19]); + array[7] = tmp; + tmp = std::min(array[12], array[24]); + array[24] = std::max(array[12], array[24]); + array[12] = tmp; + tmp = std::min(array[13], array[25]); + array[25] = std::max(array[13], array[25]); + array[13] = tmp; + tmp = std::min(array[14], array[26]); + array[26] = std::max(array[14], array[26]); + array[14] = tmp; + tmp = std::min(array[15], array[27]); + array[27] = std::max(array[15], array[27]); + array[15] = tmp; + tmp = std::min(array[20], array[32]); + array[32] = std::max(array[20], array[32]); + array[20] = tmp; + tmp = std::min(array[21], array[33]); + array[33] = std::max(array[21], array[33]); + array[21] = tmp; + tmp = std::min(array[22], array[34]); + array[34] = std::max(array[22], array[34]); + array[22] = tmp; + tmp = std::min(array[23], array[35]); + array[35] = std::max(array[23], array[35]); + array[23] = tmp; + tmp = std::min(array[28], array[40]); + array[40] = std::max(array[28], array[40]); + array[28] = tmp; + tmp = std::min(array[29], array[41]); + array[41] = std::max(array[29], array[41]); + array[29] = tmp; + tmp = std::min(array[30], array[42]); + array[42] = std::max(array[30], array[42]); + array[30] = tmp; + tmp = std::min(array[31], array[43]); + array[43] = std::max(array[31], array[43]); + array[31] = tmp; + tmp = std::min(array[36], array[48]); + array[48] = std::max(array[36], array[48]); + array[36] = tmp; + tmp = std::min(array[37], array[49]); + array[49] = std::max(array[37], array[49]); + array[37] = tmp; + tmp = std::min(array[38], array[50]); + array[50] = std::max(array[38], array[50]); + array[38] = tmp; + tmp = std::min(array[39], array[51]); + array[51] = std::max(array[39], array[51]); + array[39] = tmp; + tmp = std::min(array[44], array[56]); + array[56] = std::max(array[44], array[56]); + array[44] = tmp; + tmp = std::min(array[45], array[57]); + array[57] = std::max(array[45], array[57]); + array[45] = tmp; + tmp = std::min(array[46], array[58]); + array[58] = std::max(array[46], array[58]); + array[46] = tmp; + tmp = std::min(array[47], array[59]); + array[59] = std::max(array[47], array[59]); + array[47] = tmp; + tmp = std::min(array[52], array[64]); + array[64] = std::max(array[52], array[64]); + array[52] = tmp; + tmp = std::min(array[53], array[65]); + array[65] = std::max(array[53], array[65]); + array[53] = tmp; + tmp = std::min(array[54], array[66]); + array[66] = std::max(array[54], array[66]); + array[54] = tmp; + tmp = std::min(array[55], array[67]); + array[67] = std::max(array[55], array[67]); + array[55] = tmp; + tmp = std::min(array[60], array[72]); + array[72] = std::max(array[60], array[72]); + array[60] = tmp; + tmp = std::min(array[61], array[73]); + array[73] = std::max(array[61], array[73]); + array[61] = tmp; + tmp = std::min(array[62], array[74]); + array[74] = std::max(array[62], array[74]); + array[62] = tmp; + tmp = std::min(array[63], array[75]); + array[75] = std::max(array[63], array[75]); + array[63] = tmp; + tmp = std::min(array[68], array[80]); + array[80] = std::max(array[68], array[80]); + array[68] = tmp; + tmp = std::min(array[4], array[8]); + array[8] = std::max(array[4], array[8]); + array[4] = tmp; + tmp = std::min(array[5], array[9]); + array[9] = std::max(array[5], array[9]); + array[5] = tmp; + tmp = std::min(array[6], array[10]); + array[10] = std::max(array[6], array[10]); + array[6] = tmp; + tmp = std::min(array[7], array[11]); + array[11] = std::max(array[7], array[11]); + array[7] = tmp; + tmp = std::min(array[12], array[16]); + array[16] = std::max(array[12], array[16]); + array[12] = tmp; + tmp = std::min(array[13], array[17]); + array[17] = std::max(array[13], array[17]); + array[13] = tmp; + tmp = std::min(array[14], array[18]); + array[18] = std::max(array[14], array[18]); + array[14] = tmp; + tmp = std::min(array[15], array[19]); + array[19] = std::max(array[15], array[19]); + array[15] = tmp; + tmp = std::min(array[20], array[24]); + array[24] = std::max(array[20], array[24]); + array[20] = tmp; + tmp = std::min(array[21], array[25]); + array[25] = std::max(array[21], array[25]); + array[21] = tmp; + tmp = std::min(array[22], array[26]); + array[26] = std::max(array[22], array[26]); + array[22] = tmp; + tmp = std::min(array[23], array[27]); + array[27] = std::max(array[23], array[27]); + array[23] = tmp; + tmp = std::min(array[28], array[32]); + array[32] = std::max(array[28], array[32]); + array[28] = tmp; + tmp = std::min(array[29], array[33]); + array[33] = std::max(array[29], array[33]); + array[29] = tmp; + tmp = std::min(array[30], array[34]); + array[34] = std::max(array[30], array[34]); + array[30] = tmp; + tmp = std::min(array[31], array[35]); + array[35] = std::max(array[31], array[35]); + array[31] = tmp; + tmp = std::min(array[36], array[40]); + array[40] = std::max(array[36], array[40]); + array[36] = tmp; + tmp = std::min(array[37], array[41]); + array[41] = std::max(array[37], array[41]); + array[37] = tmp; + tmp = std::min(array[38], array[42]); + array[42] = std::max(array[38], array[42]); + array[38] = tmp; + tmp = std::min(array[39], array[43]); + array[43] = std::max(array[39], array[43]); + array[39] = tmp; + tmp = std::min(array[44], array[48]); + array[48] = std::max(array[44], array[48]); + array[44] = tmp; + tmp = std::min(array[45], array[49]); + array[49] = std::max(array[45], array[49]); + array[45] = tmp; + tmp = std::min(array[46], array[50]); + array[50] = std::max(array[46], array[50]); + array[46] = tmp; + tmp = std::min(array[47], array[51]); + array[51] = std::max(array[47], array[51]); + array[47] = tmp; + tmp = std::min(array[52], array[56]); + array[56] = std::max(array[52], array[56]); + array[52] = tmp; + tmp = std::min(array[53], array[57]); + array[57] = std::max(array[53], array[57]); + array[53] = tmp; + tmp = std::min(array[54], array[58]); + array[58] = std::max(array[54], array[58]); + array[54] = tmp; + tmp = std::min(array[55], array[59]); + array[59] = std::max(array[55], array[59]); + array[55] = tmp; + tmp = std::min(array[60], array[64]); + array[64] = std::max(array[60], array[64]); + array[60] = tmp; + tmp = std::min(array[61], array[65]); + array[65] = std::max(array[61], array[65]); + array[61] = tmp; + tmp = std::min(array[62], array[66]); + array[66] = std::max(array[62], array[66]); + array[62] = tmp; + tmp = std::min(array[63], array[67]); + array[67] = std::max(array[63], array[67]); + array[63] = tmp; + tmp = std::min(array[68], array[72]); + array[72] = std::max(array[68], array[72]); + array[68] = tmp; + tmp = std::min(array[69], array[73]); + array[73] = std::max(array[69], array[73]); + array[69] = tmp; + tmp = std::min(array[70], array[74]); + array[74] = std::max(array[70], array[74]); + array[70] = tmp; + tmp = std::min(array[71], array[75]); + array[75] = std::max(array[71], array[75]); + array[71] = tmp; + tmp = std::min(array[76], array[80]); + array[80] = std::max(array[76], array[80]); + array[76] = tmp; + tmp = std::min(array[0], array[2]); + array[2] = std::max(array[0], array[2]); + array[0] = tmp; + tmp = std::min(array[1], array[3]); + array[3] = std::max(array[1], array[3]); + array[1] = tmp; + tmp = std::min(array[4], array[6]); + array[6] = std::max(array[4], array[6]); + array[4] = tmp; + tmp = std::min(array[5], array[7]); + array[7] = std::max(array[5], array[7]); + array[5] = tmp; + tmp = std::min(array[8], array[10]); + array[10] = std::max(array[8], array[10]); + array[8] = tmp; + tmp = std::min(array[9], array[11]); + array[11] = std::max(array[9], array[11]); + array[9] = tmp; + tmp = std::min(array[12], array[14]); + array[14] = std::max(array[12], array[14]); + array[12] = tmp; + tmp = std::min(array[13], array[15]); + array[15] = std::max(array[13], array[15]); + array[13] = tmp; + tmp = std::min(array[16], array[18]); + array[18] = std::max(array[16], array[18]); + array[16] = tmp; + tmp = std::min(array[17], array[19]); + array[19] = std::max(array[17], array[19]); + array[17] = tmp; + tmp = std::min(array[20], array[22]); + array[22] = std::max(array[20], array[22]); + array[20] = tmp; + tmp = std::min(array[21], array[23]); + array[23] = std::max(array[21], array[23]); + array[21] = tmp; + tmp = std::min(array[24], array[26]); + array[26] = std::max(array[24], array[26]); + array[24] = tmp; + tmp = std::min(array[25], array[27]); + array[27] = std::max(array[25], array[27]); + array[25] = tmp; + tmp = std::min(array[28], array[30]); + array[30] = std::max(array[28], array[30]); + array[28] = tmp; + tmp = std::min(array[29], array[31]); + array[31] = std::max(array[29], array[31]); + array[29] = tmp; + tmp = std::min(array[32], array[34]); + array[34] = std::max(array[32], array[34]); + array[32] = tmp; + tmp = std::min(array[33], array[35]); + array[35] = std::max(array[33], array[35]); + array[33] = tmp; + tmp = std::min(array[36], array[38]); + array[38] = std::max(array[36], array[38]); + array[36] = tmp; + tmp = std::min(array[37], array[39]); + array[39] = std::max(array[37], array[39]); + array[37] = tmp; + tmp = std::min(array[40], array[42]); + array[42] = std::max(array[40], array[42]); + array[40] = tmp; + tmp = std::min(array[41], array[43]); + array[43] = std::max(array[41], array[43]); + array[41] = tmp; + tmp = std::min(array[44], array[46]); + array[46] = std::max(array[44], array[46]); + array[44] = tmp; + tmp = std::min(array[45], array[47]); + array[47] = std::max(array[45], array[47]); + array[45] = tmp; + tmp = std::min(array[48], array[50]); + array[50] = std::max(array[48], array[50]); + array[48] = tmp; + tmp = std::min(array[49], array[51]); + array[51] = std::max(array[49], array[51]); + array[49] = tmp; + tmp = std::min(array[52], array[54]); + array[54] = std::max(array[52], array[54]); + array[52] = tmp; + tmp = std::min(array[53], array[55]); + array[55] = std::max(array[53], array[55]); + array[53] = tmp; + tmp = std::min(array[56], array[58]); + array[58] = std::max(array[56], array[58]); + array[56] = tmp; + tmp = std::min(array[57], array[59]); + array[59] = std::max(array[57], array[59]); + array[57] = tmp; + tmp = std::min(array[60], array[62]); + array[62] = std::max(array[60], array[62]); + array[60] = tmp; + tmp = std::min(array[61], array[63]); + array[63] = std::max(array[61], array[63]); + array[61] = tmp; + tmp = std::min(array[64], array[66]); + array[66] = std::max(array[64], array[66]); + array[64] = tmp; + tmp = std::min(array[65], array[67]); + array[67] = std::max(array[65], array[67]); + array[65] = tmp; + tmp = std::min(array[68], array[70]); + array[70] = std::max(array[68], array[70]); + array[68] = tmp; + tmp = std::min(array[69], array[71]); + array[71] = std::max(array[69], array[71]); + array[69] = tmp; + tmp = std::min(array[72], array[74]); + array[74] = std::max(array[72], array[74]); + array[72] = tmp; + tmp = std::min(array[73], array[75]); + array[75] = std::max(array[73], array[75]); + array[73] = tmp; + tmp = std::min(array[76], array[78]); + array[78] = std::max(array[76], array[78]); + array[76] = tmp; + tmp = std::min(array[77], array[79]); + array[79] = std::max(array[77], array[79]); + array[77] = tmp; + tmp = std::min(array[2], array[64]); + array[64] = std::max(array[2], array[64]); + array[2] = tmp; + tmp = std::min(array[3], array[65]); + array[65] = std::max(array[3], array[65]); + array[3] = tmp; + tmp = std::min(array[6], array[68]); + array[68] = std::max(array[6], array[68]); + array[6] = tmp; + tmp = std::min(array[7], array[69]); + array[69] = std::max(array[7], array[69]); + array[7] = tmp; + tmp = std::min(array[10], array[72]); + array[72] = std::max(array[10], array[72]); + array[10] = tmp; + tmp = std::min(array[11], array[73]); + array[73] = std::max(array[11], array[73]); + array[11] = tmp; + tmp = std::min(array[14], array[76]); + array[76] = std::max(array[14], array[76]); + array[14] = tmp; + tmp = std::min(array[15], array[77]); + array[77] = std::max(array[15], array[77]); + array[15] = tmp; + tmp = std::min(array[18], array[80]); + array[80] = std::max(array[18], array[80]); + array[18] = tmp; + tmp = std::min(array[2], array[32]); + array[32] = std::max(array[2], array[32]); + array[2] = tmp; + tmp = std::min(array[3], array[33]); + array[33] = std::max(array[3], array[33]); + array[3] = tmp; + tmp = std::min(array[6], array[36]); + array[36] = std::max(array[6], array[36]); + array[6] = tmp; + tmp = std::min(array[7], array[37]); + array[37] = std::max(array[7], array[37]); + array[7] = tmp; + tmp = std::min(array[10], array[40]); + array[40] = std::max(array[10], array[40]); + array[10] = tmp; + tmp = std::min(array[11], array[41]); + array[41] = std::max(array[11], array[41]); + array[11] = tmp; + tmp = std::min(array[14], array[44]); + array[44] = std::max(array[14], array[44]); + array[14] = tmp; + tmp = std::min(array[15], array[45]); + array[45] = std::max(array[15], array[45]); + array[15] = tmp; + tmp = std::min(array[18], array[48]); + array[48] = std::max(array[18], array[48]); + array[18] = tmp; + tmp = std::min(array[19], array[49]); + array[49] = std::max(array[19], array[49]); + array[19] = tmp; + tmp = std::min(array[22], array[52]); + array[52] = std::max(array[22], array[52]); + array[22] = tmp; + tmp = std::min(array[23], array[53]); + array[53] = std::max(array[23], array[53]); + array[23] = tmp; + tmp = std::min(array[26], array[56]); + array[56] = std::max(array[26], array[56]); + array[26] = tmp; + tmp = std::min(array[27], array[57]); + array[57] = std::max(array[27], array[57]); + array[27] = tmp; + tmp = std::min(array[30], array[60]); + array[60] = std::max(array[30], array[60]); + array[30] = tmp; + tmp = std::min(array[31], array[61]); + array[61] = std::max(array[31], array[61]); + array[31] = tmp; + tmp = std::min(array[34], array[64]); + array[64] = std::max(array[34], array[64]); + array[34] = tmp; + tmp = std::min(array[35], array[65]); + array[65] = std::max(array[35], array[65]); + array[35] = tmp; + tmp = std::min(array[38], array[68]); + array[68] = std::max(array[38], array[68]); + array[38] = tmp; + tmp = std::min(array[39], array[69]); + array[69] = std::max(array[39], array[69]); + array[39] = tmp; + tmp = std::min(array[42], array[72]); + array[72] = std::max(array[42], array[72]); + array[42] = tmp; + tmp = std::min(array[43], array[73]); + array[73] = std::max(array[43], array[73]); + array[43] = tmp; + tmp = std::min(array[46], array[76]); + array[76] = std::max(array[46], array[76]); + array[46] = tmp; + tmp = std::min(array[47], array[77]); + array[77] = std::max(array[47], array[77]); + array[47] = tmp; + tmp = std::min(array[50], array[80]); + array[80] = std::max(array[50], array[80]); + array[50] = tmp; + tmp = std::min(array[2], array[16]); + array[16] = std::max(array[2], array[16]); + array[2] = tmp; + tmp = std::min(array[3], array[17]); + array[17] = std::max(array[3], array[17]); + array[3] = tmp; + tmp = std::min(array[6], array[20]); + array[20] = std::max(array[6], array[20]); + array[6] = tmp; + tmp = std::min(array[7], array[21]); + array[21] = std::max(array[7], array[21]); + array[7] = tmp; + tmp = std::min(array[10], array[24]); + array[24] = std::max(array[10], array[24]); + array[10] = tmp; + tmp = std::min(array[11], array[25]); + array[25] = std::max(array[11], array[25]); + array[11] = tmp; + tmp = std::min(array[14], array[28]); + array[28] = std::max(array[14], array[28]); + array[14] = tmp; + tmp = std::min(array[15], array[29]); + array[29] = std::max(array[15], array[29]); + array[15] = tmp; + tmp = std::min(array[18], array[32]); + array[32] = std::max(array[18], array[32]); + array[18] = tmp; + tmp = std::min(array[19], array[33]); + array[33] = std::max(array[19], array[33]); + array[19] = tmp; + tmp = std::min(array[22], array[36]); + array[36] = std::max(array[22], array[36]); + array[22] = tmp; + tmp = std::min(array[23], array[37]); + array[37] = std::max(array[23], array[37]); + array[23] = tmp; + tmp = std::min(array[26], array[40]); + array[40] = std::max(array[26], array[40]); + array[26] = tmp; + tmp = std::min(array[27], array[41]); + array[41] = std::max(array[27], array[41]); + array[27] = tmp; + tmp = std::min(array[30], array[44]); + array[44] = std::max(array[30], array[44]); + array[30] = tmp; + tmp = std::min(array[31], array[45]); + array[45] = std::max(array[31], array[45]); + array[31] = tmp; + tmp = std::min(array[34], array[48]); + array[48] = std::max(array[34], array[48]); + array[34] = tmp; + tmp = std::min(array[35], array[49]); + array[49] = std::max(array[35], array[49]); + array[35] = tmp; + tmp = std::min(array[38], array[52]); + array[52] = std::max(array[38], array[52]); + array[38] = tmp; + tmp = std::min(array[39], array[53]); + array[53] = std::max(array[39], array[53]); + array[39] = tmp; + tmp = std::min(array[42], array[56]); + array[56] = std::max(array[42], array[56]); + array[42] = tmp; + tmp = std::min(array[43], array[57]); + array[57] = std::max(array[43], array[57]); + array[43] = tmp; + tmp = std::min(array[46], array[60]); + array[60] = std::max(array[46], array[60]); + array[46] = tmp; + tmp = std::min(array[47], array[61]); + array[61] = std::max(array[47], array[61]); + array[47] = tmp; + tmp = std::min(array[50], array[64]); + array[64] = std::max(array[50], array[64]); + array[50] = tmp; + tmp = std::min(array[51], array[65]); + array[65] = std::max(array[51], array[65]); + array[51] = tmp; + tmp = std::min(array[54], array[68]); + array[68] = std::max(array[54], array[68]); + array[54] = tmp; + tmp = std::min(array[55], array[69]); + array[69] = std::max(array[55], array[69]); + array[55] = tmp; + tmp = std::min(array[58], array[72]); + array[72] = std::max(array[58], array[72]); + array[58] = tmp; + tmp = std::min(array[59], array[73]); + array[73] = std::max(array[59], array[73]); + array[59] = tmp; + tmp = std::min(array[62], array[76]); + array[76] = std::max(array[62], array[76]); + array[62] = tmp; + tmp = std::min(array[63], array[77]); + array[77] = std::max(array[63], array[77]); + array[63] = tmp; + tmp = std::min(array[66], array[80]); + array[80] = std::max(array[66], array[80]); + array[66] = tmp; + tmp = std::min(array[2], array[8]); + array[8] = std::max(array[2], array[8]); + array[2] = tmp; + tmp = std::min(array[3], array[9]); + array[9] = std::max(array[3], array[9]); + array[3] = tmp; + tmp = std::min(array[6], array[12]); + array[12] = std::max(array[6], array[12]); + array[6] = tmp; + tmp = std::min(array[7], array[13]); + array[13] = std::max(array[7], array[13]); + array[7] = tmp; + tmp = std::min(array[10], array[16]); + array[16] = std::max(array[10], array[16]); + array[10] = tmp; + tmp = std::min(array[11], array[17]); + array[17] = std::max(array[11], array[17]); + array[11] = tmp; + tmp = std::min(array[14], array[20]); + array[20] = std::max(array[14], array[20]); + array[14] = tmp; + tmp = std::min(array[15], array[21]); + array[21] = std::max(array[15], array[21]); + array[15] = tmp; + tmp = std::min(array[18], array[24]); + array[24] = std::max(array[18], array[24]); + array[18] = tmp; + tmp = std::min(array[19], array[25]); + array[25] = std::max(array[19], array[25]); + array[19] = tmp; + tmp = std::min(array[22], array[28]); + array[28] = std::max(array[22], array[28]); + array[22] = tmp; + tmp = std::min(array[23], array[29]); + array[29] = std::max(array[23], array[29]); + array[23] = tmp; + tmp = std::min(array[26], array[32]); + array[32] = std::max(array[26], array[32]); + array[26] = tmp; + tmp = std::min(array[27], array[33]); + array[33] = std::max(array[27], array[33]); + array[27] = tmp; + tmp = std::min(array[30], array[36]); + array[36] = std::max(array[30], array[36]); + array[30] = tmp; + tmp = std::min(array[31], array[37]); + array[37] = std::max(array[31], array[37]); + array[31] = tmp; + tmp = std::min(array[34], array[40]); + array[40] = std::max(array[34], array[40]); + array[34] = tmp; + tmp = std::min(array[35], array[41]); + array[41] = std::max(array[35], array[41]); + array[35] = tmp; + tmp = std::min(array[38], array[44]); + array[44] = std::max(array[38], array[44]); + array[38] = tmp; + tmp = std::min(array[39], array[45]); + array[45] = std::max(array[39], array[45]); + array[39] = tmp; + tmp = std::min(array[42], array[48]); + array[48] = std::max(array[42], array[48]); + array[42] = tmp; + tmp = std::min(array[43], array[49]); + array[49] = std::max(array[43], array[49]); + array[43] = tmp; + tmp = std::min(array[46], array[52]); + array[52] = std::max(array[46], array[52]); + array[46] = tmp; + tmp = std::min(array[47], array[53]); + array[53] = std::max(array[47], array[53]); + array[47] = tmp; + tmp = std::min(array[50], array[56]); + array[56] = std::max(array[50], array[56]); + array[50] = tmp; + tmp = std::min(array[51], array[57]); + array[57] = std::max(array[51], array[57]); + array[51] = tmp; + tmp = std::min(array[54], array[60]); + array[60] = std::max(array[54], array[60]); + array[54] = tmp; + tmp = std::min(array[55], array[61]); + array[61] = std::max(array[55], array[61]); + array[55] = tmp; + tmp = std::min(array[58], array[64]); + array[64] = std::max(array[58], array[64]); + array[58] = tmp; + tmp = std::min(array[59], array[65]); + array[65] = std::max(array[59], array[65]); + array[59] = tmp; + tmp = std::min(array[62], array[68]); + array[68] = std::max(array[62], array[68]); + array[62] = tmp; + tmp = std::min(array[63], array[69]); + array[69] = std::max(array[63], array[69]); + array[63] = tmp; + tmp = std::min(array[66], array[72]); + array[72] = std::max(array[66], array[72]); + array[66] = tmp; + tmp = std::min(array[67], array[73]); + array[73] = std::max(array[67], array[73]); + array[67] = tmp; + tmp = std::min(array[70], array[76]); + array[76] = std::max(array[70], array[76]); + array[70] = tmp; + tmp = std::min(array[71], array[77]); + array[77] = std::max(array[71], array[77]); + array[71] = tmp; + tmp = std::min(array[74], array[80]); + array[80] = std::max(array[74], array[80]); + array[74] = tmp; + tmp = std::min(array[2], array[4]); + array[4] = std::max(array[2], array[4]); + array[2] = tmp; + tmp = std::min(array[3], array[5]); + array[5] = std::max(array[3], array[5]); + array[3] = tmp; + tmp = std::min(array[6], array[8]); + array[8] = std::max(array[6], array[8]); + array[6] = tmp; + tmp = std::min(array[7], array[9]); + array[9] = std::max(array[7], array[9]); + array[7] = tmp; + tmp = std::min(array[10], array[12]); + array[12] = std::max(array[10], array[12]); + array[10] = tmp; + tmp = std::min(array[11], array[13]); + array[13] = std::max(array[11], array[13]); + array[11] = tmp; + tmp = std::min(array[14], array[16]); + array[16] = std::max(array[14], array[16]); + array[14] = tmp; + tmp = std::min(array[15], array[17]); + array[17] = std::max(array[15], array[17]); + array[15] = tmp; + tmp = std::min(array[18], array[20]); + array[20] = std::max(array[18], array[20]); + array[18] = tmp; + tmp = std::min(array[19], array[21]); + array[21] = std::max(array[19], array[21]); + array[19] = tmp; + tmp = std::min(array[22], array[24]); + array[24] = std::max(array[22], array[24]); + array[22] = tmp; + tmp = std::min(array[23], array[25]); + array[25] = std::max(array[23], array[25]); + array[23] = tmp; + tmp = std::min(array[26], array[28]); + array[28] = std::max(array[26], array[28]); + array[26] = tmp; + tmp = std::min(array[27], array[29]); + array[29] = std::max(array[27], array[29]); + array[27] = tmp; + tmp = std::min(array[30], array[32]); + array[32] = std::max(array[30], array[32]); + array[30] = tmp; + tmp = std::min(array[31], array[33]); + array[33] = std::max(array[31], array[33]); + array[31] = tmp; + tmp = std::min(array[34], array[36]); + array[36] = std::max(array[34], array[36]); + array[34] = tmp; + tmp = std::min(array[35], array[37]); + array[37] = std::max(array[35], array[37]); + array[35] = tmp; + tmp = std::min(array[38], array[40]); + array[40] = std::max(array[38], array[40]); + array[38] = tmp; + tmp = std::min(array[39], array[41]); + array[41] = std::max(array[39], array[41]); + array[39] = tmp; + tmp = std::min(array[42], array[44]); + array[44] = std::max(array[42], array[44]); + array[42] = tmp; + tmp = std::min(array[43], array[45]); + array[45] = std::max(array[43], array[45]); + array[43] = tmp; + tmp = std::min(array[46], array[48]); + array[48] = std::max(array[46], array[48]); + array[46] = tmp; + tmp = std::min(array[47], array[49]); + array[49] = std::max(array[47], array[49]); + array[47] = tmp; + tmp = std::min(array[50], array[52]); + array[52] = std::max(array[50], array[52]); + array[50] = tmp; + tmp = std::min(array[51], array[53]); + array[53] = std::max(array[51], array[53]); + array[51] = tmp; + tmp = std::min(array[54], array[56]); + array[56] = std::max(array[54], array[56]); + array[54] = tmp; + tmp = std::min(array[55], array[57]); + array[57] = std::max(array[55], array[57]); + array[55] = tmp; + tmp = std::min(array[58], array[60]); + array[60] = std::max(array[58], array[60]); + array[58] = tmp; + tmp = std::min(array[59], array[61]); + array[61] = std::max(array[59], array[61]); + array[59] = tmp; + tmp = std::min(array[62], array[64]); + array[64] = std::max(array[62], array[64]); + array[62] = tmp; + tmp = std::min(array[63], array[65]); + array[65] = std::max(array[63], array[65]); + array[63] = tmp; + tmp = std::min(array[66], array[68]); + array[68] = std::max(array[66], array[68]); + array[66] = tmp; + tmp = std::min(array[67], array[69]); + array[69] = std::max(array[67], array[69]); + array[67] = tmp; + tmp = std::min(array[70], array[72]); + array[72] = std::max(array[70], array[72]); + array[70] = tmp; + tmp = std::min(array[71], array[73]); + array[73] = std::max(array[71], array[73]); + array[71] = tmp; + tmp = std::min(array[74], array[76]); + array[76] = std::max(array[74], array[76]); + array[74] = tmp; + tmp = std::min(array[75], array[77]); + array[77] = std::max(array[75], array[77]); + array[75] = tmp; + tmp = std::min(array[78], array[80]); + array[80] = std::max(array[78], array[80]); + array[78] = tmp; + array[1] = std::max(array[0], array[1]); + array[3] = std::max(array[2], array[3]); + array[5] = std::max(array[4], array[5]); + array[7] = std::max(array[6], array[7]); + array[9] = std::max(array[8], array[9]); + array[11] = std::max(array[10], array[11]); + array[13] = std::max(array[12], array[13]); + array[15] = std::max(array[14], array[15]); + array[17] = std::max(array[16], array[17]); + array[19] = std::max(array[18], array[19]); + array[21] = std::max(array[20], array[21]); + array[23] = std::max(array[22], array[23]); + array[25] = std::max(array[24], array[25]); + array[27] = std::max(array[26], array[27]); + array[29] = std::max(array[28], array[29]); + array[31] = std::max(array[30], array[31]); + array[33] = std::max(array[32], array[33]); + array[35] = std::max(array[34], array[35]); + array[37] = std::max(array[36], array[37]); + array[39] = std::max(array[38], array[39]); + array[40] = std::min(array[40], array[41]); + array[42] = std::min(array[42], array[43]); + array[44] = std::min(array[44], array[45]); + array[46] = std::min(array[46], array[47]); + array[48] = std::min(array[48], array[49]); + array[50] = std::min(array[50], array[51]); + array[52] = std::min(array[52], array[53]); + array[54] = std::min(array[54], array[55]); + array[56] = std::min(array[56], array[57]); + array[58] = std::min(array[58], array[59]); + array[60] = std::min(array[60], array[61]); + array[62] = std::min(array[62], array[63]); + array[64] = std::min(array[64], array[65]); + array[66] = std::min(array[66], array[67]); + array[68] = std::min(array[68], array[69]); + array[70] = std::min(array[70], array[71]); + array[72] = std::min(array[72], array[73]); + array[74] = std::min(array[74], array[75]); + array[76] = std::min(array[76], array[77]); + array[78] = std::min(array[78], array[79]); + array[64] = std::max(array[1], array[64]); + array[66] = std::max(array[3], array[66]); + array[68] = std::max(array[5], array[68]); + array[70] = std::max(array[7], array[70]); + array[9] = std::min(array[9], array[72]); + array[11] = std::min(array[11], array[74]); + array[13] = std::min(array[13], array[76]); + array[15] = std::min(array[15], array[78]); + array[17] = std::min(array[17], array[80]); + array[40] = std::max(array[9], array[40]); + array[42] = std::max(array[11], array[42]); + array[44] = std::max(array[13], array[44]); + array[46] = std::max(array[15], array[46]); + array[48] = std::max(array[17], array[48]); + array[50] = std::max(array[19], array[50]); + array[52] = std::max(array[21], array[52]); + array[54] = std::max(array[23], array[54]); + array[25] = std::min(array[25], array[56]); + array[27] = std::min(array[27], array[58]); + array[29] = std::min(array[29], array[60]); + array[31] = std::min(array[31], array[62]); + array[33] = std::min(array[33], array[64]); + array[35] = std::min(array[35], array[66]); + array[37] = std::min(array[37], array[68]); + array[39] = std::min(array[39], array[70]); + array[40] = std::max(array[25], array[40]); + array[42] = std::max(array[27], array[42]); + array[44] = std::max(array[29], array[44]); + array[46] = std::max(array[31], array[46]); + array[33] = std::min(array[33], array[48]); + array[35] = std::min(array[35], array[50]); + array[37] = std::min(array[37], array[52]); + array[39] = std::min(array[39], array[54]); + array[40] = std::max(array[33], array[40]); + array[42] = std::max(array[35], array[42]); + array[37] = std::min(array[37], array[44]); + array[39] = std::min(array[39], array[46]); + array[40] = std::max(array[37], array[40]); + array[39] = std::min(array[39], array[42]); + return std::max(array[39], array[40]); +} + +#ifdef __SSE2__ +template<> +inline vfloat median(std::array array) +{ + vfloat tmp = vminf(array[0], array[64]); + array[64] = vmaxf(array[0], array[64]); + array[0] = tmp; + tmp = vminf(array[1], array[65]); + array[65] = vmaxf(array[1], array[65]); + array[1] = tmp; + tmp = vminf(array[2], array[66]); + array[66] = vmaxf(array[2], array[66]); + array[2] = tmp; + tmp = vminf(array[3], array[67]); + array[67] = vmaxf(array[3], array[67]); + array[3] = tmp; + tmp = vminf(array[4], array[68]); + array[68] = vmaxf(array[4], array[68]); + array[4] = tmp; + tmp = vminf(array[5], array[69]); + array[69] = vmaxf(array[5], array[69]); + array[5] = tmp; + tmp = vminf(array[6], array[70]); + array[70] = vmaxf(array[6], array[70]); + array[6] = tmp; + tmp = vminf(array[7], array[71]); + array[71] = vmaxf(array[7], array[71]); + array[7] = tmp; + tmp = vminf(array[8], array[72]); + array[72] = vmaxf(array[8], array[72]); + array[8] = tmp; + tmp = vminf(array[9], array[73]); + array[73] = vmaxf(array[9], array[73]); + array[9] = tmp; + tmp = vminf(array[10], array[74]); + array[74] = vmaxf(array[10], array[74]); + array[10] = tmp; + tmp = vminf(array[11], array[75]); + array[75] = vmaxf(array[11], array[75]); + array[11] = tmp; + tmp = vminf(array[12], array[76]); + array[76] = vmaxf(array[12], array[76]); + array[12] = tmp; + tmp = vminf(array[13], array[77]); + array[77] = vmaxf(array[13], array[77]); + array[13] = tmp; + tmp = vminf(array[14], array[78]); + array[78] = vmaxf(array[14], array[78]); + array[14] = tmp; + tmp = vminf(array[15], array[79]); + array[79] = vmaxf(array[15], array[79]); + array[15] = tmp; + tmp = vminf(array[16], array[80]); + array[80] = vmaxf(array[16], array[80]); + array[16] = tmp; + tmp = vminf(array[0], array[32]); + array[32] = vmaxf(array[0], array[32]); + array[0] = tmp; + tmp = vminf(array[1], array[33]); + array[33] = vmaxf(array[1], array[33]); + array[1] = tmp; + tmp = vminf(array[2], array[34]); + array[34] = vmaxf(array[2], array[34]); + array[2] = tmp; + tmp = vminf(array[3], array[35]); + array[35] = vmaxf(array[3], array[35]); + array[3] = tmp; + tmp = vminf(array[4], array[36]); + array[36] = vmaxf(array[4], array[36]); + array[4] = tmp; + tmp = vminf(array[5], array[37]); + array[37] = vmaxf(array[5], array[37]); + array[5] = tmp; + tmp = vminf(array[6], array[38]); + array[38] = vmaxf(array[6], array[38]); + array[6] = tmp; + tmp = vminf(array[7], array[39]); + array[39] = vmaxf(array[7], array[39]); + array[7] = tmp; + tmp = vminf(array[8], array[40]); + array[40] = vmaxf(array[8], array[40]); + array[8] = tmp; + tmp = vminf(array[9], array[41]); + array[41] = vmaxf(array[9], array[41]); + array[9] = tmp; + tmp = vminf(array[10], array[42]); + array[42] = vmaxf(array[10], array[42]); + array[10] = tmp; + tmp = vminf(array[11], array[43]); + array[43] = vmaxf(array[11], array[43]); + array[11] = tmp; + tmp = vminf(array[12], array[44]); + array[44] = vmaxf(array[12], array[44]); + array[12] = tmp; + tmp = vminf(array[13], array[45]); + array[45] = vmaxf(array[13], array[45]); + array[13] = tmp; + tmp = vminf(array[14], array[46]); + array[46] = vmaxf(array[14], array[46]); + array[14] = tmp; + tmp = vminf(array[15], array[47]); + array[47] = vmaxf(array[15], array[47]); + array[15] = tmp; + tmp = vminf(array[16], array[48]); + array[48] = vmaxf(array[16], array[48]); + array[16] = tmp; + tmp = vminf(array[17], array[49]); + array[49] = vmaxf(array[17], array[49]); + array[17] = tmp; + tmp = vminf(array[18], array[50]); + array[50] = vmaxf(array[18], array[50]); + array[18] = tmp; + tmp = vminf(array[19], array[51]); + array[51] = vmaxf(array[19], array[51]); + array[19] = tmp; + tmp = vminf(array[20], array[52]); + array[52] = vmaxf(array[20], array[52]); + array[20] = tmp; + tmp = vminf(array[21], array[53]); + array[53] = vmaxf(array[21], array[53]); + array[21] = tmp; + tmp = vminf(array[22], array[54]); + array[54] = vmaxf(array[22], array[54]); + array[22] = tmp; + tmp = vminf(array[23], array[55]); + array[55] = vmaxf(array[23], array[55]); + array[23] = tmp; + tmp = vminf(array[24], array[56]); + array[56] = vmaxf(array[24], array[56]); + array[24] = tmp; + tmp = vminf(array[25], array[57]); + array[57] = vmaxf(array[25], array[57]); + array[25] = tmp; + tmp = vminf(array[26], array[58]); + array[58] = vmaxf(array[26], array[58]); + array[26] = tmp; + tmp = vminf(array[27], array[59]); + array[59] = vmaxf(array[27], array[59]); + array[27] = tmp; + tmp = vminf(array[28], array[60]); + array[60] = vmaxf(array[28], array[60]); + array[28] = tmp; + tmp = vminf(array[29], array[61]); + array[61] = vmaxf(array[29], array[61]); + array[29] = tmp; + tmp = vminf(array[30], array[62]); + array[62] = vmaxf(array[30], array[62]); + array[30] = tmp; + tmp = vminf(array[31], array[63]); + array[63] = vmaxf(array[31], array[63]); + array[31] = tmp; + tmp = vminf(array[32], array[64]); + array[64] = vmaxf(array[32], array[64]); + array[32] = tmp; + tmp = vminf(array[33], array[65]); + array[65] = vmaxf(array[33], array[65]); + array[33] = tmp; + tmp = vminf(array[34], array[66]); + array[66] = vmaxf(array[34], array[66]); + array[34] = tmp; + tmp = vminf(array[35], array[67]); + array[67] = vmaxf(array[35], array[67]); + array[35] = tmp; + tmp = vminf(array[36], array[68]); + array[68] = vmaxf(array[36], array[68]); + array[36] = tmp; + tmp = vminf(array[37], array[69]); + array[69] = vmaxf(array[37], array[69]); + array[37] = tmp; + tmp = vminf(array[38], array[70]); + array[70] = vmaxf(array[38], array[70]); + array[38] = tmp; + tmp = vminf(array[39], array[71]); + array[71] = vmaxf(array[39], array[71]); + array[39] = tmp; + tmp = vminf(array[40], array[72]); + array[72] = vmaxf(array[40], array[72]); + array[40] = tmp; + tmp = vminf(array[41], array[73]); + array[73] = vmaxf(array[41], array[73]); + array[41] = tmp; + tmp = vminf(array[42], array[74]); + array[74] = vmaxf(array[42], array[74]); + array[42] = tmp; + tmp = vminf(array[43], array[75]); + array[75] = vmaxf(array[43], array[75]); + array[43] = tmp; + tmp = vminf(array[44], array[76]); + array[76] = vmaxf(array[44], array[76]); + array[44] = tmp; + tmp = vminf(array[45], array[77]); + array[77] = vmaxf(array[45], array[77]); + array[45] = tmp; + tmp = vminf(array[46], array[78]); + array[78] = vmaxf(array[46], array[78]); + array[46] = tmp; + tmp = vminf(array[47], array[79]); + array[79] = vmaxf(array[47], array[79]); + array[47] = tmp; + tmp = vminf(array[48], array[80]); + array[80] = vmaxf(array[48], array[80]); + array[48] = tmp; + tmp = vminf(array[0], array[16]); + array[16] = vmaxf(array[0], array[16]); + array[0] = tmp; + tmp = vminf(array[1], array[17]); + array[17] = vmaxf(array[1], array[17]); + array[1] = tmp; + tmp = vminf(array[2], array[18]); + array[18] = vmaxf(array[2], array[18]); + array[2] = tmp; + tmp = vminf(array[3], array[19]); + array[19] = vmaxf(array[3], array[19]); + array[3] = tmp; + tmp = vminf(array[4], array[20]); + array[20] = vmaxf(array[4], array[20]); + array[4] = tmp; + tmp = vminf(array[5], array[21]); + array[21] = vmaxf(array[5], array[21]); + array[5] = tmp; + tmp = vminf(array[6], array[22]); + array[22] = vmaxf(array[6], array[22]); + array[6] = tmp; + tmp = vminf(array[7], array[23]); + array[23] = vmaxf(array[7], array[23]); + array[7] = tmp; + tmp = vminf(array[8], array[24]); + array[24] = vmaxf(array[8], array[24]); + array[8] = tmp; + tmp = vminf(array[9], array[25]); + array[25] = vmaxf(array[9], array[25]); + array[9] = tmp; + tmp = vminf(array[10], array[26]); + array[26] = vmaxf(array[10], array[26]); + array[10] = tmp; + tmp = vminf(array[11], array[27]); + array[27] = vmaxf(array[11], array[27]); + array[11] = tmp; + tmp = vminf(array[12], array[28]); + array[28] = vmaxf(array[12], array[28]); + array[12] = tmp; + tmp = vminf(array[13], array[29]); + array[29] = vmaxf(array[13], array[29]); + array[13] = tmp; + tmp = vminf(array[14], array[30]); + array[30] = vmaxf(array[14], array[30]); + array[14] = tmp; + tmp = vminf(array[15], array[31]); + array[31] = vmaxf(array[15], array[31]); + array[15] = tmp; + tmp = vminf(array[32], array[48]); + array[48] = vmaxf(array[32], array[48]); + array[32] = tmp; + tmp = vminf(array[33], array[49]); + array[49] = vmaxf(array[33], array[49]); + array[33] = tmp; + tmp = vminf(array[34], array[50]); + array[50] = vmaxf(array[34], array[50]); + array[34] = tmp; + tmp = vminf(array[35], array[51]); + array[51] = vmaxf(array[35], array[51]); + array[35] = tmp; + tmp = vminf(array[36], array[52]); + array[52] = vmaxf(array[36], array[52]); + array[36] = tmp; + tmp = vminf(array[37], array[53]); + array[53] = vmaxf(array[37], array[53]); + array[37] = tmp; + tmp = vminf(array[38], array[54]); + array[54] = vmaxf(array[38], array[54]); + array[38] = tmp; + tmp = vminf(array[39], array[55]); + array[55] = vmaxf(array[39], array[55]); + array[39] = tmp; + tmp = vminf(array[40], array[56]); + array[56] = vmaxf(array[40], array[56]); + array[40] = tmp; + tmp = vminf(array[41], array[57]); + array[57] = vmaxf(array[41], array[57]); + array[41] = tmp; + tmp = vminf(array[42], array[58]); + array[58] = vmaxf(array[42], array[58]); + array[42] = tmp; + tmp = vminf(array[43], array[59]); + array[59] = vmaxf(array[43], array[59]); + array[43] = tmp; + tmp = vminf(array[44], array[60]); + array[60] = vmaxf(array[44], array[60]); + array[44] = tmp; + tmp = vminf(array[45], array[61]); + array[61] = vmaxf(array[45], array[61]); + array[45] = tmp; + tmp = vminf(array[46], array[62]); + array[62] = vmaxf(array[46], array[62]); + array[46] = tmp; + tmp = vminf(array[47], array[63]); + array[63] = vmaxf(array[47], array[63]); + array[47] = tmp; + tmp = vminf(array[64], array[80]); + array[80] = vmaxf(array[64], array[80]); + array[64] = tmp; + tmp = vminf(array[16], array[64]); + array[64] = vmaxf(array[16], array[64]); + array[16] = tmp; + tmp = vminf(array[17], array[65]); + array[65] = vmaxf(array[17], array[65]); + array[17] = tmp; + tmp = vminf(array[18], array[66]); + array[66] = vmaxf(array[18], array[66]); + array[18] = tmp; + tmp = vminf(array[19], array[67]); + array[67] = vmaxf(array[19], array[67]); + array[19] = tmp; + tmp = vminf(array[20], array[68]); + array[68] = vmaxf(array[20], array[68]); + array[20] = tmp; + tmp = vminf(array[21], array[69]); + array[69] = vmaxf(array[21], array[69]); + array[21] = tmp; + tmp = vminf(array[22], array[70]); + array[70] = vmaxf(array[22], array[70]); + array[22] = tmp; + tmp = vminf(array[23], array[71]); + array[71] = vmaxf(array[23], array[71]); + array[23] = tmp; + tmp = vminf(array[24], array[72]); + array[72] = vmaxf(array[24], array[72]); + array[24] = tmp; + tmp = vminf(array[25], array[73]); + array[73] = vmaxf(array[25], array[73]); + array[25] = tmp; + tmp = vminf(array[26], array[74]); + array[74] = vmaxf(array[26], array[74]); + array[26] = tmp; + tmp = vminf(array[27], array[75]); + array[75] = vmaxf(array[27], array[75]); + array[27] = tmp; + tmp = vminf(array[28], array[76]); + array[76] = vmaxf(array[28], array[76]); + array[28] = tmp; + tmp = vminf(array[29], array[77]); + array[77] = vmaxf(array[29], array[77]); + array[29] = tmp; + tmp = vminf(array[30], array[78]); + array[78] = vmaxf(array[30], array[78]); + array[30] = tmp; + tmp = vminf(array[31], array[79]); + array[79] = vmaxf(array[31], array[79]); + array[31] = tmp; + tmp = vminf(array[16], array[32]); + array[32] = vmaxf(array[16], array[32]); + array[16] = tmp; + tmp = vminf(array[17], array[33]); + array[33] = vmaxf(array[17], array[33]); + array[17] = tmp; + tmp = vminf(array[18], array[34]); + array[34] = vmaxf(array[18], array[34]); + array[18] = tmp; + tmp = vminf(array[19], array[35]); + array[35] = vmaxf(array[19], array[35]); + array[19] = tmp; + tmp = vminf(array[20], array[36]); + array[36] = vmaxf(array[20], array[36]); + array[20] = tmp; + tmp = vminf(array[21], array[37]); + array[37] = vmaxf(array[21], array[37]); + array[21] = tmp; + tmp = vminf(array[22], array[38]); + array[38] = vmaxf(array[22], array[38]); + array[22] = tmp; + tmp = vminf(array[23], array[39]); + array[39] = vmaxf(array[23], array[39]); + array[23] = tmp; + tmp = vminf(array[24], array[40]); + array[40] = vmaxf(array[24], array[40]); + array[24] = tmp; + tmp = vminf(array[25], array[41]); + array[41] = vmaxf(array[25], array[41]); + array[25] = tmp; + tmp = vminf(array[26], array[42]); + array[42] = vmaxf(array[26], array[42]); + array[26] = tmp; + tmp = vminf(array[27], array[43]); + array[43] = vmaxf(array[27], array[43]); + array[27] = tmp; + tmp = vminf(array[28], array[44]); + array[44] = vmaxf(array[28], array[44]); + array[28] = tmp; + tmp = vminf(array[29], array[45]); + array[45] = vmaxf(array[29], array[45]); + array[29] = tmp; + tmp = vminf(array[30], array[46]); + array[46] = vmaxf(array[30], array[46]); + array[30] = tmp; + tmp = vminf(array[31], array[47]); + array[47] = vmaxf(array[31], array[47]); + array[31] = tmp; + tmp = vminf(array[48], array[64]); + array[64] = vmaxf(array[48], array[64]); + array[48] = tmp; + tmp = vminf(array[49], array[65]); + array[65] = vmaxf(array[49], array[65]); + array[49] = tmp; + tmp = vminf(array[50], array[66]); + array[66] = vmaxf(array[50], array[66]); + array[50] = tmp; + tmp = vminf(array[51], array[67]); + array[67] = vmaxf(array[51], array[67]); + array[51] = tmp; + tmp = vminf(array[52], array[68]); + array[68] = vmaxf(array[52], array[68]); + array[52] = tmp; + tmp = vminf(array[53], array[69]); + array[69] = vmaxf(array[53], array[69]); + array[53] = tmp; + tmp = vminf(array[54], array[70]); + array[70] = vmaxf(array[54], array[70]); + array[54] = tmp; + tmp = vminf(array[55], array[71]); + array[71] = vmaxf(array[55], array[71]); + array[55] = tmp; + tmp = vminf(array[56], array[72]); + array[72] = vmaxf(array[56], array[72]); + array[56] = tmp; + tmp = vminf(array[57], array[73]); + array[73] = vmaxf(array[57], array[73]); + array[57] = tmp; + tmp = vminf(array[58], array[74]); + array[74] = vmaxf(array[58], array[74]); + array[58] = tmp; + tmp = vminf(array[59], array[75]); + array[75] = vmaxf(array[59], array[75]); + array[59] = tmp; + tmp = vminf(array[60], array[76]); + array[76] = vmaxf(array[60], array[76]); + array[60] = tmp; + tmp = vminf(array[61], array[77]); + array[77] = vmaxf(array[61], array[77]); + array[61] = tmp; + tmp = vminf(array[62], array[78]); + array[78] = vmaxf(array[62], array[78]); + array[62] = tmp; + tmp = vminf(array[63], array[79]); + array[79] = vmaxf(array[63], array[79]); + array[63] = tmp; + tmp = vminf(array[0], array[8]); + array[8] = vmaxf(array[0], array[8]); + array[0] = tmp; + tmp = vminf(array[1], array[9]); + array[9] = vmaxf(array[1], array[9]); + array[1] = tmp; + tmp = vminf(array[2], array[10]); + array[10] = vmaxf(array[2], array[10]); + array[2] = tmp; + tmp = vminf(array[3], array[11]); + array[11] = vmaxf(array[3], array[11]); + array[3] = tmp; + tmp = vminf(array[4], array[12]); + array[12] = vmaxf(array[4], array[12]); + array[4] = tmp; + tmp = vminf(array[5], array[13]); + array[13] = vmaxf(array[5], array[13]); + array[5] = tmp; + tmp = vminf(array[6], array[14]); + array[14] = vmaxf(array[6], array[14]); + array[6] = tmp; + tmp = vminf(array[7], array[15]); + array[15] = vmaxf(array[7], array[15]); + array[7] = tmp; + tmp = vminf(array[16], array[24]); + array[24] = vmaxf(array[16], array[24]); + array[16] = tmp; + tmp = vminf(array[17], array[25]); + array[25] = vmaxf(array[17], array[25]); + array[17] = tmp; + tmp = vminf(array[18], array[26]); + array[26] = vmaxf(array[18], array[26]); + array[18] = tmp; + tmp = vminf(array[19], array[27]); + array[27] = vmaxf(array[19], array[27]); + array[19] = tmp; + tmp = vminf(array[20], array[28]); + array[28] = vmaxf(array[20], array[28]); + array[20] = tmp; + tmp = vminf(array[21], array[29]); + array[29] = vmaxf(array[21], array[29]); + array[21] = tmp; + tmp = vminf(array[22], array[30]); + array[30] = vmaxf(array[22], array[30]); + array[22] = tmp; + tmp = vminf(array[23], array[31]); + array[31] = vmaxf(array[23], array[31]); + array[23] = tmp; + tmp = vminf(array[32], array[40]); + array[40] = vmaxf(array[32], array[40]); + array[32] = tmp; + tmp = vminf(array[33], array[41]); + array[41] = vmaxf(array[33], array[41]); + array[33] = tmp; + tmp = vminf(array[34], array[42]); + array[42] = vmaxf(array[34], array[42]); + array[34] = tmp; + tmp = vminf(array[35], array[43]); + array[43] = vmaxf(array[35], array[43]); + array[35] = tmp; + tmp = vminf(array[36], array[44]); + array[44] = vmaxf(array[36], array[44]); + array[36] = tmp; + tmp = vminf(array[37], array[45]); + array[45] = vmaxf(array[37], array[45]); + array[37] = tmp; + tmp = vminf(array[38], array[46]); + array[46] = vmaxf(array[38], array[46]); + array[38] = tmp; + tmp = vminf(array[39], array[47]); + array[47] = vmaxf(array[39], array[47]); + array[39] = tmp; + tmp = vminf(array[48], array[56]); + array[56] = vmaxf(array[48], array[56]); + array[48] = tmp; + tmp = vminf(array[49], array[57]); + array[57] = vmaxf(array[49], array[57]); + array[49] = tmp; + tmp = vminf(array[50], array[58]); + array[58] = vmaxf(array[50], array[58]); + array[50] = tmp; + tmp = vminf(array[51], array[59]); + array[59] = vmaxf(array[51], array[59]); + array[51] = tmp; + tmp = vminf(array[52], array[60]); + array[60] = vmaxf(array[52], array[60]); + array[52] = tmp; + tmp = vminf(array[53], array[61]); + array[61] = vmaxf(array[53], array[61]); + array[53] = tmp; + tmp = vminf(array[54], array[62]); + array[62] = vmaxf(array[54], array[62]); + array[54] = tmp; + tmp = vminf(array[55], array[63]); + array[63] = vmaxf(array[55], array[63]); + array[55] = tmp; + tmp = vminf(array[64], array[72]); + array[72] = vmaxf(array[64], array[72]); + array[64] = tmp; + tmp = vminf(array[65], array[73]); + array[73] = vmaxf(array[65], array[73]); + array[65] = tmp; + tmp = vminf(array[66], array[74]); + array[74] = vmaxf(array[66], array[74]); + array[66] = tmp; + tmp = vminf(array[67], array[75]); + array[75] = vmaxf(array[67], array[75]); + array[67] = tmp; + tmp = vminf(array[68], array[76]); + array[76] = vmaxf(array[68], array[76]); + array[68] = tmp; + tmp = vminf(array[69], array[77]); + array[77] = vmaxf(array[69], array[77]); + array[69] = tmp; + tmp = vminf(array[70], array[78]); + array[78] = vmaxf(array[70], array[78]); + array[70] = tmp; + tmp = vminf(array[71], array[79]); + array[79] = vmaxf(array[71], array[79]); + array[71] = tmp; + tmp = vminf(array[8], array[64]); + array[64] = vmaxf(array[8], array[64]); + array[8] = tmp; + tmp = vminf(array[9], array[65]); + array[65] = vmaxf(array[9], array[65]); + array[9] = tmp; + tmp = vminf(array[10], array[66]); + array[66] = vmaxf(array[10], array[66]); + array[10] = tmp; + tmp = vminf(array[11], array[67]); + array[67] = vmaxf(array[11], array[67]); + array[11] = tmp; + tmp = vminf(array[12], array[68]); + array[68] = vmaxf(array[12], array[68]); + array[12] = tmp; + tmp = vminf(array[13], array[69]); + array[69] = vmaxf(array[13], array[69]); + array[13] = tmp; + tmp = vminf(array[14], array[70]); + array[70] = vmaxf(array[14], array[70]); + array[14] = tmp; + tmp = vminf(array[15], array[71]); + array[71] = vmaxf(array[15], array[71]); + array[15] = tmp; + tmp = vminf(array[24], array[80]); + array[80] = vmaxf(array[24], array[80]); + array[24] = tmp; + tmp = vminf(array[8], array[32]); + array[32] = vmaxf(array[8], array[32]); + array[8] = tmp; + tmp = vminf(array[9], array[33]); + array[33] = vmaxf(array[9], array[33]); + array[9] = tmp; + tmp = vminf(array[10], array[34]); + array[34] = vmaxf(array[10], array[34]); + array[10] = tmp; + tmp = vminf(array[11], array[35]); + array[35] = vmaxf(array[11], array[35]); + array[11] = tmp; + tmp = vminf(array[12], array[36]); + array[36] = vmaxf(array[12], array[36]); + array[12] = tmp; + tmp = vminf(array[13], array[37]); + array[37] = vmaxf(array[13], array[37]); + array[13] = tmp; + tmp = vminf(array[14], array[38]); + array[38] = vmaxf(array[14], array[38]); + array[14] = tmp; + tmp = vminf(array[15], array[39]); + array[39] = vmaxf(array[15], array[39]); + array[15] = tmp; + tmp = vminf(array[24], array[48]); + array[48] = vmaxf(array[24], array[48]); + array[24] = tmp; + tmp = vminf(array[25], array[49]); + array[49] = vmaxf(array[25], array[49]); + array[25] = tmp; + tmp = vminf(array[26], array[50]); + array[50] = vmaxf(array[26], array[50]); + array[26] = tmp; + tmp = vminf(array[27], array[51]); + array[51] = vmaxf(array[27], array[51]); + array[27] = tmp; + tmp = vminf(array[28], array[52]); + array[52] = vmaxf(array[28], array[52]); + array[28] = tmp; + tmp = vminf(array[29], array[53]); + array[53] = vmaxf(array[29], array[53]); + array[29] = tmp; + tmp = vminf(array[30], array[54]); + array[54] = vmaxf(array[30], array[54]); + array[30] = tmp; + tmp = vminf(array[31], array[55]); + array[55] = vmaxf(array[31], array[55]); + array[31] = tmp; + tmp = vminf(array[40], array[64]); + array[64] = vmaxf(array[40], array[64]); + array[40] = tmp; + tmp = vminf(array[41], array[65]); + array[65] = vmaxf(array[41], array[65]); + array[41] = tmp; + tmp = vminf(array[42], array[66]); + array[66] = vmaxf(array[42], array[66]); + array[42] = tmp; + tmp = vminf(array[43], array[67]); + array[67] = vmaxf(array[43], array[67]); + array[43] = tmp; + tmp = vminf(array[44], array[68]); + array[68] = vmaxf(array[44], array[68]); + array[44] = tmp; + tmp = vminf(array[45], array[69]); + array[69] = vmaxf(array[45], array[69]); + array[45] = tmp; + tmp = vminf(array[46], array[70]); + array[70] = vmaxf(array[46], array[70]); + array[46] = tmp; + tmp = vminf(array[47], array[71]); + array[71] = vmaxf(array[47], array[71]); + array[47] = tmp; + tmp = vminf(array[56], array[80]); + array[80] = vmaxf(array[56], array[80]); + array[56] = tmp; + tmp = vminf(array[8], array[16]); + array[16] = vmaxf(array[8], array[16]); + array[8] = tmp; + tmp = vminf(array[9], array[17]); + array[17] = vmaxf(array[9], array[17]); + array[9] = tmp; + tmp = vminf(array[10], array[18]); + array[18] = vmaxf(array[10], array[18]); + array[10] = tmp; + tmp = vminf(array[11], array[19]); + array[19] = vmaxf(array[11], array[19]); + array[11] = tmp; + tmp = vminf(array[12], array[20]); + array[20] = vmaxf(array[12], array[20]); + array[12] = tmp; + tmp = vminf(array[13], array[21]); + array[21] = vmaxf(array[13], array[21]); + array[13] = tmp; + tmp = vminf(array[14], array[22]); + array[22] = vmaxf(array[14], array[22]); + array[14] = tmp; + tmp = vminf(array[15], array[23]); + array[23] = vmaxf(array[15], array[23]); + array[15] = tmp; + tmp = vminf(array[24], array[32]); + array[32] = vmaxf(array[24], array[32]); + array[24] = tmp; + tmp = vminf(array[25], array[33]); + array[33] = vmaxf(array[25], array[33]); + array[25] = tmp; + tmp = vminf(array[26], array[34]); + array[34] = vmaxf(array[26], array[34]); + array[26] = tmp; + tmp = vminf(array[27], array[35]); + array[35] = vmaxf(array[27], array[35]); + array[27] = tmp; + tmp = vminf(array[28], array[36]); + array[36] = vmaxf(array[28], array[36]); + array[28] = tmp; + tmp = vminf(array[29], array[37]); + array[37] = vmaxf(array[29], array[37]); + array[29] = tmp; + tmp = vminf(array[30], array[38]); + array[38] = vmaxf(array[30], array[38]); + array[30] = tmp; + tmp = vminf(array[31], array[39]); + array[39] = vmaxf(array[31], array[39]); + array[31] = tmp; + tmp = vminf(array[40], array[48]); + array[48] = vmaxf(array[40], array[48]); + array[40] = tmp; + tmp = vminf(array[41], array[49]); + array[49] = vmaxf(array[41], array[49]); + array[41] = tmp; + tmp = vminf(array[42], array[50]); + array[50] = vmaxf(array[42], array[50]); + array[42] = tmp; + tmp = vminf(array[43], array[51]); + array[51] = vmaxf(array[43], array[51]); + array[43] = tmp; + tmp = vminf(array[44], array[52]); + array[52] = vmaxf(array[44], array[52]); + array[44] = tmp; + tmp = vminf(array[45], array[53]); + array[53] = vmaxf(array[45], array[53]); + array[45] = tmp; + tmp = vminf(array[46], array[54]); + array[54] = vmaxf(array[46], array[54]); + array[46] = tmp; + tmp = vminf(array[47], array[55]); + array[55] = vmaxf(array[47], array[55]); + array[47] = tmp; + tmp = vminf(array[56], array[64]); + array[64] = vmaxf(array[56], array[64]); + array[56] = tmp; + tmp = vminf(array[57], array[65]); + array[65] = vmaxf(array[57], array[65]); + array[57] = tmp; + tmp = vminf(array[58], array[66]); + array[66] = vmaxf(array[58], array[66]); + array[58] = tmp; + tmp = vminf(array[59], array[67]); + array[67] = vmaxf(array[59], array[67]); + array[59] = tmp; + tmp = vminf(array[60], array[68]); + array[68] = vmaxf(array[60], array[68]); + array[60] = tmp; + tmp = vminf(array[61], array[69]); + array[69] = vmaxf(array[61], array[69]); + array[61] = tmp; + tmp = vminf(array[62], array[70]); + array[70] = vmaxf(array[62], array[70]); + array[62] = tmp; + tmp = vminf(array[63], array[71]); + array[71] = vmaxf(array[63], array[71]); + array[63] = tmp; + tmp = vminf(array[72], array[80]); + array[80] = vmaxf(array[72], array[80]); + array[72] = tmp; + tmp = vminf(array[0], array[4]); + array[4] = vmaxf(array[0], array[4]); + array[0] = tmp; + tmp = vminf(array[1], array[5]); + array[5] = vmaxf(array[1], array[5]); + array[1] = tmp; + tmp = vminf(array[2], array[6]); + array[6] = vmaxf(array[2], array[6]); + array[2] = tmp; + tmp = vminf(array[3], array[7]); + array[7] = vmaxf(array[3], array[7]); + array[3] = tmp; + tmp = vminf(array[8], array[12]); + array[12] = vmaxf(array[8], array[12]); + array[8] = tmp; + tmp = vminf(array[9], array[13]); + array[13] = vmaxf(array[9], array[13]); + array[9] = tmp; + tmp = vminf(array[10], array[14]); + array[14] = vmaxf(array[10], array[14]); + array[10] = tmp; + tmp = vminf(array[11], array[15]); + array[15] = vmaxf(array[11], array[15]); + array[11] = tmp; + tmp = vminf(array[16], array[20]); + array[20] = vmaxf(array[16], array[20]); + array[16] = tmp; + tmp = vminf(array[17], array[21]); + array[21] = vmaxf(array[17], array[21]); + array[17] = tmp; + tmp = vminf(array[18], array[22]); + array[22] = vmaxf(array[18], array[22]); + array[18] = tmp; + tmp = vminf(array[19], array[23]); + array[23] = vmaxf(array[19], array[23]); + array[19] = tmp; + tmp = vminf(array[24], array[28]); + array[28] = vmaxf(array[24], array[28]); + array[24] = tmp; + tmp = vminf(array[25], array[29]); + array[29] = vmaxf(array[25], array[29]); + array[25] = tmp; + tmp = vminf(array[26], array[30]); + array[30] = vmaxf(array[26], array[30]); + array[26] = tmp; + tmp = vminf(array[27], array[31]); + array[31] = vmaxf(array[27], array[31]); + array[27] = tmp; + tmp = vminf(array[32], array[36]); + array[36] = vmaxf(array[32], array[36]); + array[32] = tmp; + tmp = vminf(array[33], array[37]); + array[37] = vmaxf(array[33], array[37]); + array[33] = tmp; + tmp = vminf(array[34], array[38]); + array[38] = vmaxf(array[34], array[38]); + array[34] = tmp; + tmp = vminf(array[35], array[39]); + array[39] = vmaxf(array[35], array[39]); + array[35] = tmp; + tmp = vminf(array[40], array[44]); + array[44] = vmaxf(array[40], array[44]); + array[40] = tmp; + tmp = vminf(array[41], array[45]); + array[45] = vmaxf(array[41], array[45]); + array[41] = tmp; + tmp = vminf(array[42], array[46]); + array[46] = vmaxf(array[42], array[46]); + array[42] = tmp; + tmp = vminf(array[43], array[47]); + array[47] = vmaxf(array[43], array[47]); + array[43] = tmp; + tmp = vminf(array[48], array[52]); + array[52] = vmaxf(array[48], array[52]); + array[48] = tmp; + tmp = vminf(array[49], array[53]); + array[53] = vmaxf(array[49], array[53]); + array[49] = tmp; + tmp = vminf(array[50], array[54]); + array[54] = vmaxf(array[50], array[54]); + array[50] = tmp; + tmp = vminf(array[51], array[55]); + array[55] = vmaxf(array[51], array[55]); + array[51] = tmp; + tmp = vminf(array[56], array[60]); + array[60] = vmaxf(array[56], array[60]); + array[56] = tmp; + tmp = vminf(array[57], array[61]); + array[61] = vmaxf(array[57], array[61]); + array[57] = tmp; + tmp = vminf(array[58], array[62]); + array[62] = vmaxf(array[58], array[62]); + array[58] = tmp; + tmp = vminf(array[59], array[63]); + array[63] = vmaxf(array[59], array[63]); + array[59] = tmp; + tmp = vminf(array[64], array[68]); + array[68] = vmaxf(array[64], array[68]); + array[64] = tmp; + tmp = vminf(array[65], array[69]); + array[69] = vmaxf(array[65], array[69]); + array[65] = tmp; + tmp = vminf(array[66], array[70]); + array[70] = vmaxf(array[66], array[70]); + array[66] = tmp; + tmp = vminf(array[67], array[71]); + array[71] = vmaxf(array[67], array[71]); + array[67] = tmp; + tmp = vminf(array[72], array[76]); + array[76] = vmaxf(array[72], array[76]); + array[72] = tmp; + tmp = vminf(array[73], array[77]); + array[77] = vmaxf(array[73], array[77]); + array[73] = tmp; + tmp = vminf(array[74], array[78]); + array[78] = vmaxf(array[74], array[78]); + array[74] = tmp; + tmp = vminf(array[75], array[79]); + array[79] = vmaxf(array[75], array[79]); + array[75] = tmp; + tmp = vminf(array[4], array[64]); + array[64] = vmaxf(array[4], array[64]); + array[4] = tmp; + tmp = vminf(array[5], array[65]); + array[65] = vmaxf(array[5], array[65]); + array[5] = tmp; + tmp = vminf(array[6], array[66]); + array[66] = vmaxf(array[6], array[66]); + array[6] = tmp; + tmp = vminf(array[7], array[67]); + array[67] = vmaxf(array[7], array[67]); + array[7] = tmp; + tmp = vminf(array[12], array[72]); + array[72] = vmaxf(array[12], array[72]); + array[12] = tmp; + tmp = vminf(array[13], array[73]); + array[73] = vmaxf(array[13], array[73]); + array[13] = tmp; + tmp = vminf(array[14], array[74]); + array[74] = vmaxf(array[14], array[74]); + array[14] = tmp; + tmp = vminf(array[15], array[75]); + array[75] = vmaxf(array[15], array[75]); + array[15] = tmp; + tmp = vminf(array[20], array[80]); + array[80] = vmaxf(array[20], array[80]); + array[20] = tmp; + tmp = vminf(array[4], array[32]); + array[32] = vmaxf(array[4], array[32]); + array[4] = tmp; + tmp = vminf(array[5], array[33]); + array[33] = vmaxf(array[5], array[33]); + array[5] = tmp; + tmp = vminf(array[6], array[34]); + array[34] = vmaxf(array[6], array[34]); + array[6] = tmp; + tmp = vminf(array[7], array[35]); + array[35] = vmaxf(array[7], array[35]); + array[7] = tmp; + tmp = vminf(array[12], array[40]); + array[40] = vmaxf(array[12], array[40]); + array[12] = tmp; + tmp = vminf(array[13], array[41]); + array[41] = vmaxf(array[13], array[41]); + array[13] = tmp; + tmp = vminf(array[14], array[42]); + array[42] = vmaxf(array[14], array[42]); + array[14] = tmp; + tmp = vminf(array[15], array[43]); + array[43] = vmaxf(array[15], array[43]); + array[15] = tmp; + tmp = vminf(array[20], array[48]); + array[48] = vmaxf(array[20], array[48]); + array[20] = tmp; + tmp = vminf(array[21], array[49]); + array[49] = vmaxf(array[21], array[49]); + array[21] = tmp; + tmp = vminf(array[22], array[50]); + array[50] = vmaxf(array[22], array[50]); + array[22] = tmp; + tmp = vminf(array[23], array[51]); + array[51] = vmaxf(array[23], array[51]); + array[23] = tmp; + tmp = vminf(array[28], array[56]); + array[56] = vmaxf(array[28], array[56]); + array[28] = tmp; + tmp = vminf(array[29], array[57]); + array[57] = vmaxf(array[29], array[57]); + array[29] = tmp; + tmp = vminf(array[30], array[58]); + array[58] = vmaxf(array[30], array[58]); + array[30] = tmp; + tmp = vminf(array[31], array[59]); + array[59] = vmaxf(array[31], array[59]); + array[31] = tmp; + tmp = vminf(array[36], array[64]); + array[64] = vmaxf(array[36], array[64]); + array[36] = tmp; + tmp = vminf(array[37], array[65]); + array[65] = vmaxf(array[37], array[65]); + array[37] = tmp; + tmp = vminf(array[38], array[66]); + array[66] = vmaxf(array[38], array[66]); + array[38] = tmp; + tmp = vminf(array[39], array[67]); + array[67] = vmaxf(array[39], array[67]); + array[39] = tmp; + tmp = vminf(array[44], array[72]); + array[72] = vmaxf(array[44], array[72]); + array[44] = tmp; + tmp = vminf(array[45], array[73]); + array[73] = vmaxf(array[45], array[73]); + array[45] = tmp; + tmp = vminf(array[46], array[74]); + array[74] = vmaxf(array[46], array[74]); + array[46] = tmp; + tmp = vminf(array[47], array[75]); + array[75] = vmaxf(array[47], array[75]); + array[47] = tmp; + tmp = vminf(array[52], array[80]); + array[80] = vmaxf(array[52], array[80]); + array[52] = tmp; + tmp = vminf(array[4], array[16]); + array[16] = vmaxf(array[4], array[16]); + array[4] = tmp; + tmp = vminf(array[5], array[17]); + array[17] = vmaxf(array[5], array[17]); + array[5] = tmp; + tmp = vminf(array[6], array[18]); + array[18] = vmaxf(array[6], array[18]); + array[6] = tmp; + tmp = vminf(array[7], array[19]); + array[19] = vmaxf(array[7], array[19]); + array[7] = tmp; + tmp = vminf(array[12], array[24]); + array[24] = vmaxf(array[12], array[24]); + array[12] = tmp; + tmp = vminf(array[13], array[25]); + array[25] = vmaxf(array[13], array[25]); + array[13] = tmp; + tmp = vminf(array[14], array[26]); + array[26] = vmaxf(array[14], array[26]); + array[14] = tmp; + tmp = vminf(array[15], array[27]); + array[27] = vmaxf(array[15], array[27]); + array[15] = tmp; + tmp = vminf(array[20], array[32]); + array[32] = vmaxf(array[20], array[32]); + array[20] = tmp; + tmp = vminf(array[21], array[33]); + array[33] = vmaxf(array[21], array[33]); + array[21] = tmp; + tmp = vminf(array[22], array[34]); + array[34] = vmaxf(array[22], array[34]); + array[22] = tmp; + tmp = vminf(array[23], array[35]); + array[35] = vmaxf(array[23], array[35]); + array[23] = tmp; + tmp = vminf(array[28], array[40]); + array[40] = vmaxf(array[28], array[40]); + array[28] = tmp; + tmp = vminf(array[29], array[41]); + array[41] = vmaxf(array[29], array[41]); + array[29] = tmp; + tmp = vminf(array[30], array[42]); + array[42] = vmaxf(array[30], array[42]); + array[30] = tmp; + tmp = vminf(array[31], array[43]); + array[43] = vmaxf(array[31], array[43]); + array[31] = tmp; + tmp = vminf(array[36], array[48]); + array[48] = vmaxf(array[36], array[48]); + array[36] = tmp; + tmp = vminf(array[37], array[49]); + array[49] = vmaxf(array[37], array[49]); + array[37] = tmp; + tmp = vminf(array[38], array[50]); + array[50] = vmaxf(array[38], array[50]); + array[38] = tmp; + tmp = vminf(array[39], array[51]); + array[51] = vmaxf(array[39], array[51]); + array[39] = tmp; + tmp = vminf(array[44], array[56]); + array[56] = vmaxf(array[44], array[56]); + array[44] = tmp; + tmp = vminf(array[45], array[57]); + array[57] = vmaxf(array[45], array[57]); + array[45] = tmp; + tmp = vminf(array[46], array[58]); + array[58] = vmaxf(array[46], array[58]); + array[46] = tmp; + tmp = vminf(array[47], array[59]); + array[59] = vmaxf(array[47], array[59]); + array[47] = tmp; + tmp = vminf(array[52], array[64]); + array[64] = vmaxf(array[52], array[64]); + array[52] = tmp; + tmp = vminf(array[53], array[65]); + array[65] = vmaxf(array[53], array[65]); + array[53] = tmp; + tmp = vminf(array[54], array[66]); + array[66] = vmaxf(array[54], array[66]); + array[54] = tmp; + tmp = vminf(array[55], array[67]); + array[67] = vmaxf(array[55], array[67]); + array[55] = tmp; + tmp = vminf(array[60], array[72]); + array[72] = vmaxf(array[60], array[72]); + array[60] = tmp; + tmp = vminf(array[61], array[73]); + array[73] = vmaxf(array[61], array[73]); + array[61] = tmp; + tmp = vminf(array[62], array[74]); + array[74] = vmaxf(array[62], array[74]); + array[62] = tmp; + tmp = vminf(array[63], array[75]); + array[75] = vmaxf(array[63], array[75]); + array[63] = tmp; + tmp = vminf(array[68], array[80]); + array[80] = vmaxf(array[68], array[80]); + array[68] = tmp; + tmp = vminf(array[4], array[8]); + array[8] = vmaxf(array[4], array[8]); + array[4] = tmp; + tmp = vminf(array[5], array[9]); + array[9] = vmaxf(array[5], array[9]); + array[5] = tmp; + tmp = vminf(array[6], array[10]); + array[10] = vmaxf(array[6], array[10]); + array[6] = tmp; + tmp = vminf(array[7], array[11]); + array[11] = vmaxf(array[7], array[11]); + array[7] = tmp; + tmp = vminf(array[12], array[16]); + array[16] = vmaxf(array[12], array[16]); + array[12] = tmp; + tmp = vminf(array[13], array[17]); + array[17] = vmaxf(array[13], array[17]); + array[13] = tmp; + tmp = vminf(array[14], array[18]); + array[18] = vmaxf(array[14], array[18]); + array[14] = tmp; + tmp = vminf(array[15], array[19]); + array[19] = vmaxf(array[15], array[19]); + array[15] = tmp; + tmp = vminf(array[20], array[24]); + array[24] = vmaxf(array[20], array[24]); + array[20] = tmp; + tmp = vminf(array[21], array[25]); + array[25] = vmaxf(array[21], array[25]); + array[21] = tmp; + tmp = vminf(array[22], array[26]); + array[26] = vmaxf(array[22], array[26]); + array[22] = tmp; + tmp = vminf(array[23], array[27]); + array[27] = vmaxf(array[23], array[27]); + array[23] = tmp; + tmp = vminf(array[28], array[32]); + array[32] = vmaxf(array[28], array[32]); + array[28] = tmp; + tmp = vminf(array[29], array[33]); + array[33] = vmaxf(array[29], array[33]); + array[29] = tmp; + tmp = vminf(array[30], array[34]); + array[34] = vmaxf(array[30], array[34]); + array[30] = tmp; + tmp = vminf(array[31], array[35]); + array[35] = vmaxf(array[31], array[35]); + array[31] = tmp; + tmp = vminf(array[36], array[40]); + array[40] = vmaxf(array[36], array[40]); + array[36] = tmp; + tmp = vminf(array[37], array[41]); + array[41] = vmaxf(array[37], array[41]); + array[37] = tmp; + tmp = vminf(array[38], array[42]); + array[42] = vmaxf(array[38], array[42]); + array[38] = tmp; + tmp = vminf(array[39], array[43]); + array[43] = vmaxf(array[39], array[43]); + array[39] = tmp; + tmp = vminf(array[44], array[48]); + array[48] = vmaxf(array[44], array[48]); + array[44] = tmp; + tmp = vminf(array[45], array[49]); + array[49] = vmaxf(array[45], array[49]); + array[45] = tmp; + tmp = vminf(array[46], array[50]); + array[50] = vmaxf(array[46], array[50]); + array[46] = tmp; + tmp = vminf(array[47], array[51]); + array[51] = vmaxf(array[47], array[51]); + array[47] = tmp; + tmp = vminf(array[52], array[56]); + array[56] = vmaxf(array[52], array[56]); + array[52] = tmp; + tmp = vminf(array[53], array[57]); + array[57] = vmaxf(array[53], array[57]); + array[53] = tmp; + tmp = vminf(array[54], array[58]); + array[58] = vmaxf(array[54], array[58]); + array[54] = tmp; + tmp = vminf(array[55], array[59]); + array[59] = vmaxf(array[55], array[59]); + array[55] = tmp; + tmp = vminf(array[60], array[64]); + array[64] = vmaxf(array[60], array[64]); + array[60] = tmp; + tmp = vminf(array[61], array[65]); + array[65] = vmaxf(array[61], array[65]); + array[61] = tmp; + tmp = vminf(array[62], array[66]); + array[66] = vmaxf(array[62], array[66]); + array[62] = tmp; + tmp = vminf(array[63], array[67]); + array[67] = vmaxf(array[63], array[67]); + array[63] = tmp; + tmp = vminf(array[68], array[72]); + array[72] = vmaxf(array[68], array[72]); + array[68] = tmp; + tmp = vminf(array[69], array[73]); + array[73] = vmaxf(array[69], array[73]); + array[69] = tmp; + tmp = vminf(array[70], array[74]); + array[74] = vmaxf(array[70], array[74]); + array[70] = tmp; + tmp = vminf(array[71], array[75]); + array[75] = vmaxf(array[71], array[75]); + array[71] = tmp; + tmp = vminf(array[76], array[80]); + array[80] = vmaxf(array[76], array[80]); + array[76] = tmp; + tmp = vminf(array[0], array[2]); + array[2] = vmaxf(array[0], array[2]); + array[0] = tmp; + tmp = vminf(array[1], array[3]); + array[3] = vmaxf(array[1], array[3]); + array[1] = tmp; + tmp = vminf(array[4], array[6]); + array[6] = vmaxf(array[4], array[6]); + array[4] = tmp; + tmp = vminf(array[5], array[7]); + array[7] = vmaxf(array[5], array[7]); + array[5] = tmp; + tmp = vminf(array[8], array[10]); + array[10] = vmaxf(array[8], array[10]); + array[8] = tmp; + tmp = vminf(array[9], array[11]); + array[11] = vmaxf(array[9], array[11]); + array[9] = tmp; + tmp = vminf(array[12], array[14]); + array[14] = vmaxf(array[12], array[14]); + array[12] = tmp; + tmp = vminf(array[13], array[15]); + array[15] = vmaxf(array[13], array[15]); + array[13] = tmp; + tmp = vminf(array[16], array[18]); + array[18] = vmaxf(array[16], array[18]); + array[16] = tmp; + tmp = vminf(array[17], array[19]); + array[19] = vmaxf(array[17], array[19]); + array[17] = tmp; + tmp = vminf(array[20], array[22]); + array[22] = vmaxf(array[20], array[22]); + array[20] = tmp; + tmp = vminf(array[21], array[23]); + array[23] = vmaxf(array[21], array[23]); + array[21] = tmp; + tmp = vminf(array[24], array[26]); + array[26] = vmaxf(array[24], array[26]); + array[24] = tmp; + tmp = vminf(array[25], array[27]); + array[27] = vmaxf(array[25], array[27]); + array[25] = tmp; + tmp = vminf(array[28], array[30]); + array[30] = vmaxf(array[28], array[30]); + array[28] = tmp; + tmp = vminf(array[29], array[31]); + array[31] = vmaxf(array[29], array[31]); + array[29] = tmp; + tmp = vminf(array[32], array[34]); + array[34] = vmaxf(array[32], array[34]); + array[32] = tmp; + tmp = vminf(array[33], array[35]); + array[35] = vmaxf(array[33], array[35]); + array[33] = tmp; + tmp = vminf(array[36], array[38]); + array[38] = vmaxf(array[36], array[38]); + array[36] = tmp; + tmp = vminf(array[37], array[39]); + array[39] = vmaxf(array[37], array[39]); + array[37] = tmp; + tmp = vminf(array[40], array[42]); + array[42] = vmaxf(array[40], array[42]); + array[40] = tmp; + tmp = vminf(array[41], array[43]); + array[43] = vmaxf(array[41], array[43]); + array[41] = tmp; + tmp = vminf(array[44], array[46]); + array[46] = vmaxf(array[44], array[46]); + array[44] = tmp; + tmp = vminf(array[45], array[47]); + array[47] = vmaxf(array[45], array[47]); + array[45] = tmp; + tmp = vminf(array[48], array[50]); + array[50] = vmaxf(array[48], array[50]); + array[48] = tmp; + tmp = vminf(array[49], array[51]); + array[51] = vmaxf(array[49], array[51]); + array[49] = tmp; + tmp = vminf(array[52], array[54]); + array[54] = vmaxf(array[52], array[54]); + array[52] = tmp; + tmp = vminf(array[53], array[55]); + array[55] = vmaxf(array[53], array[55]); + array[53] = tmp; + tmp = vminf(array[56], array[58]); + array[58] = vmaxf(array[56], array[58]); + array[56] = tmp; + tmp = vminf(array[57], array[59]); + array[59] = vmaxf(array[57], array[59]); + array[57] = tmp; + tmp = vminf(array[60], array[62]); + array[62] = vmaxf(array[60], array[62]); + array[60] = tmp; + tmp = vminf(array[61], array[63]); + array[63] = vmaxf(array[61], array[63]); + array[61] = tmp; + tmp = vminf(array[64], array[66]); + array[66] = vmaxf(array[64], array[66]); + array[64] = tmp; + tmp = vminf(array[65], array[67]); + array[67] = vmaxf(array[65], array[67]); + array[65] = tmp; + tmp = vminf(array[68], array[70]); + array[70] = vmaxf(array[68], array[70]); + array[68] = tmp; + tmp = vminf(array[69], array[71]); + array[71] = vmaxf(array[69], array[71]); + array[69] = tmp; + tmp = vminf(array[72], array[74]); + array[74] = vmaxf(array[72], array[74]); + array[72] = tmp; + tmp = vminf(array[73], array[75]); + array[75] = vmaxf(array[73], array[75]); + array[73] = tmp; + tmp = vminf(array[76], array[78]); + array[78] = vmaxf(array[76], array[78]); + array[76] = tmp; + tmp = vminf(array[77], array[79]); + array[79] = vmaxf(array[77], array[79]); + array[77] = tmp; + tmp = vminf(array[2], array[64]); + array[64] = vmaxf(array[2], array[64]); + array[2] = tmp; + tmp = vminf(array[3], array[65]); + array[65] = vmaxf(array[3], array[65]); + array[3] = tmp; + tmp = vminf(array[6], array[68]); + array[68] = vmaxf(array[6], array[68]); + array[6] = tmp; + tmp = vminf(array[7], array[69]); + array[69] = vmaxf(array[7], array[69]); + array[7] = tmp; + tmp = vminf(array[10], array[72]); + array[72] = vmaxf(array[10], array[72]); + array[10] = tmp; + tmp = vminf(array[11], array[73]); + array[73] = vmaxf(array[11], array[73]); + array[11] = tmp; + tmp = vminf(array[14], array[76]); + array[76] = vmaxf(array[14], array[76]); + array[14] = tmp; + tmp = vminf(array[15], array[77]); + array[77] = vmaxf(array[15], array[77]); + array[15] = tmp; + tmp = vminf(array[18], array[80]); + array[80] = vmaxf(array[18], array[80]); + array[18] = tmp; + tmp = vminf(array[2], array[32]); + array[32] = vmaxf(array[2], array[32]); + array[2] = tmp; + tmp = vminf(array[3], array[33]); + array[33] = vmaxf(array[3], array[33]); + array[3] = tmp; + tmp = vminf(array[6], array[36]); + array[36] = vmaxf(array[6], array[36]); + array[6] = tmp; + tmp = vminf(array[7], array[37]); + array[37] = vmaxf(array[7], array[37]); + array[7] = tmp; + tmp = vminf(array[10], array[40]); + array[40] = vmaxf(array[10], array[40]); + array[10] = tmp; + tmp = vminf(array[11], array[41]); + array[41] = vmaxf(array[11], array[41]); + array[11] = tmp; + tmp = vminf(array[14], array[44]); + array[44] = vmaxf(array[14], array[44]); + array[14] = tmp; + tmp = vminf(array[15], array[45]); + array[45] = vmaxf(array[15], array[45]); + array[15] = tmp; + tmp = vminf(array[18], array[48]); + array[48] = vmaxf(array[18], array[48]); + array[18] = tmp; + tmp = vminf(array[19], array[49]); + array[49] = vmaxf(array[19], array[49]); + array[19] = tmp; + tmp = vminf(array[22], array[52]); + array[52] = vmaxf(array[22], array[52]); + array[22] = tmp; + tmp = vminf(array[23], array[53]); + array[53] = vmaxf(array[23], array[53]); + array[23] = tmp; + tmp = vminf(array[26], array[56]); + array[56] = vmaxf(array[26], array[56]); + array[26] = tmp; + tmp = vminf(array[27], array[57]); + array[57] = vmaxf(array[27], array[57]); + array[27] = tmp; + tmp = vminf(array[30], array[60]); + array[60] = vmaxf(array[30], array[60]); + array[30] = tmp; + tmp = vminf(array[31], array[61]); + array[61] = vmaxf(array[31], array[61]); + array[31] = tmp; + tmp = vminf(array[34], array[64]); + array[64] = vmaxf(array[34], array[64]); + array[34] = tmp; + tmp = vminf(array[35], array[65]); + array[65] = vmaxf(array[35], array[65]); + array[35] = tmp; + tmp = vminf(array[38], array[68]); + array[68] = vmaxf(array[38], array[68]); + array[38] = tmp; + tmp = vminf(array[39], array[69]); + array[69] = vmaxf(array[39], array[69]); + array[39] = tmp; + tmp = vminf(array[42], array[72]); + array[72] = vmaxf(array[42], array[72]); + array[42] = tmp; + tmp = vminf(array[43], array[73]); + array[73] = vmaxf(array[43], array[73]); + array[43] = tmp; + tmp = vminf(array[46], array[76]); + array[76] = vmaxf(array[46], array[76]); + array[46] = tmp; + tmp = vminf(array[47], array[77]); + array[77] = vmaxf(array[47], array[77]); + array[47] = tmp; + tmp = vminf(array[50], array[80]); + array[80] = vmaxf(array[50], array[80]); + array[50] = tmp; + tmp = vminf(array[2], array[16]); + array[16] = vmaxf(array[2], array[16]); + array[2] = tmp; + tmp = vminf(array[3], array[17]); + array[17] = vmaxf(array[3], array[17]); + array[3] = tmp; + tmp = vminf(array[6], array[20]); + array[20] = vmaxf(array[6], array[20]); + array[6] = tmp; + tmp = vminf(array[7], array[21]); + array[21] = vmaxf(array[7], array[21]); + array[7] = tmp; + tmp = vminf(array[10], array[24]); + array[24] = vmaxf(array[10], array[24]); + array[10] = tmp; + tmp = vminf(array[11], array[25]); + array[25] = vmaxf(array[11], array[25]); + array[11] = tmp; + tmp = vminf(array[14], array[28]); + array[28] = vmaxf(array[14], array[28]); + array[14] = tmp; + tmp = vminf(array[15], array[29]); + array[29] = vmaxf(array[15], array[29]); + array[15] = tmp; + tmp = vminf(array[18], array[32]); + array[32] = vmaxf(array[18], array[32]); + array[18] = tmp; + tmp = vminf(array[19], array[33]); + array[33] = vmaxf(array[19], array[33]); + array[19] = tmp; + tmp = vminf(array[22], array[36]); + array[36] = vmaxf(array[22], array[36]); + array[22] = tmp; + tmp = vminf(array[23], array[37]); + array[37] = vmaxf(array[23], array[37]); + array[23] = tmp; + tmp = vminf(array[26], array[40]); + array[40] = vmaxf(array[26], array[40]); + array[26] = tmp; + tmp = vminf(array[27], array[41]); + array[41] = vmaxf(array[27], array[41]); + array[27] = tmp; + tmp = vminf(array[30], array[44]); + array[44] = vmaxf(array[30], array[44]); + array[30] = tmp; + tmp = vminf(array[31], array[45]); + array[45] = vmaxf(array[31], array[45]); + array[31] = tmp; + tmp = vminf(array[34], array[48]); + array[48] = vmaxf(array[34], array[48]); + array[34] = tmp; + tmp = vminf(array[35], array[49]); + array[49] = vmaxf(array[35], array[49]); + array[35] = tmp; + tmp = vminf(array[38], array[52]); + array[52] = vmaxf(array[38], array[52]); + array[38] = tmp; + tmp = vminf(array[39], array[53]); + array[53] = vmaxf(array[39], array[53]); + array[39] = tmp; + tmp = vminf(array[42], array[56]); + array[56] = vmaxf(array[42], array[56]); + array[42] = tmp; + tmp = vminf(array[43], array[57]); + array[57] = vmaxf(array[43], array[57]); + array[43] = tmp; + tmp = vminf(array[46], array[60]); + array[60] = vmaxf(array[46], array[60]); + array[46] = tmp; + tmp = vminf(array[47], array[61]); + array[61] = vmaxf(array[47], array[61]); + array[47] = tmp; + tmp = vminf(array[50], array[64]); + array[64] = vmaxf(array[50], array[64]); + array[50] = tmp; + tmp = vminf(array[51], array[65]); + array[65] = vmaxf(array[51], array[65]); + array[51] = tmp; + tmp = vminf(array[54], array[68]); + array[68] = vmaxf(array[54], array[68]); + array[54] = tmp; + tmp = vminf(array[55], array[69]); + array[69] = vmaxf(array[55], array[69]); + array[55] = tmp; + tmp = vminf(array[58], array[72]); + array[72] = vmaxf(array[58], array[72]); + array[58] = tmp; + tmp = vminf(array[59], array[73]); + array[73] = vmaxf(array[59], array[73]); + array[59] = tmp; + tmp = vminf(array[62], array[76]); + array[76] = vmaxf(array[62], array[76]); + array[62] = tmp; + tmp = vminf(array[63], array[77]); + array[77] = vmaxf(array[63], array[77]); + array[63] = tmp; + tmp = vminf(array[66], array[80]); + array[80] = vmaxf(array[66], array[80]); + array[66] = tmp; + tmp = vminf(array[2], array[8]); + array[8] = vmaxf(array[2], array[8]); + array[2] = tmp; + tmp = vminf(array[3], array[9]); + array[9] = vmaxf(array[3], array[9]); + array[3] = tmp; + tmp = vminf(array[6], array[12]); + array[12] = vmaxf(array[6], array[12]); + array[6] = tmp; + tmp = vminf(array[7], array[13]); + array[13] = vmaxf(array[7], array[13]); + array[7] = tmp; + tmp = vminf(array[10], array[16]); + array[16] = vmaxf(array[10], array[16]); + array[10] = tmp; + tmp = vminf(array[11], array[17]); + array[17] = vmaxf(array[11], array[17]); + array[11] = tmp; + tmp = vminf(array[14], array[20]); + array[20] = vmaxf(array[14], array[20]); + array[14] = tmp; + tmp = vminf(array[15], array[21]); + array[21] = vmaxf(array[15], array[21]); + array[15] = tmp; + tmp = vminf(array[18], array[24]); + array[24] = vmaxf(array[18], array[24]); + array[18] = tmp; + tmp = vminf(array[19], array[25]); + array[25] = vmaxf(array[19], array[25]); + array[19] = tmp; + tmp = vminf(array[22], array[28]); + array[28] = vmaxf(array[22], array[28]); + array[22] = tmp; + tmp = vminf(array[23], array[29]); + array[29] = vmaxf(array[23], array[29]); + array[23] = tmp; + tmp = vminf(array[26], array[32]); + array[32] = vmaxf(array[26], array[32]); + array[26] = tmp; + tmp = vminf(array[27], array[33]); + array[33] = vmaxf(array[27], array[33]); + array[27] = tmp; + tmp = vminf(array[30], array[36]); + array[36] = vmaxf(array[30], array[36]); + array[30] = tmp; + tmp = vminf(array[31], array[37]); + array[37] = vmaxf(array[31], array[37]); + array[31] = tmp; + tmp = vminf(array[34], array[40]); + array[40] = vmaxf(array[34], array[40]); + array[34] = tmp; + tmp = vminf(array[35], array[41]); + array[41] = vmaxf(array[35], array[41]); + array[35] = tmp; + tmp = vminf(array[38], array[44]); + array[44] = vmaxf(array[38], array[44]); + array[38] = tmp; + tmp = vminf(array[39], array[45]); + array[45] = vmaxf(array[39], array[45]); + array[39] = tmp; + tmp = vminf(array[42], array[48]); + array[48] = vmaxf(array[42], array[48]); + array[42] = tmp; + tmp = vminf(array[43], array[49]); + array[49] = vmaxf(array[43], array[49]); + array[43] = tmp; + tmp = vminf(array[46], array[52]); + array[52] = vmaxf(array[46], array[52]); + array[46] = tmp; + tmp = vminf(array[47], array[53]); + array[53] = vmaxf(array[47], array[53]); + array[47] = tmp; + tmp = vminf(array[50], array[56]); + array[56] = vmaxf(array[50], array[56]); + array[50] = tmp; + tmp = vminf(array[51], array[57]); + array[57] = vmaxf(array[51], array[57]); + array[51] = tmp; + tmp = vminf(array[54], array[60]); + array[60] = vmaxf(array[54], array[60]); + array[54] = tmp; + tmp = vminf(array[55], array[61]); + array[61] = vmaxf(array[55], array[61]); + array[55] = tmp; + tmp = vminf(array[58], array[64]); + array[64] = vmaxf(array[58], array[64]); + array[58] = tmp; + tmp = vminf(array[59], array[65]); + array[65] = vmaxf(array[59], array[65]); + array[59] = tmp; + tmp = vminf(array[62], array[68]); + array[68] = vmaxf(array[62], array[68]); + array[62] = tmp; + tmp = vminf(array[63], array[69]); + array[69] = vmaxf(array[63], array[69]); + array[63] = tmp; + tmp = vminf(array[66], array[72]); + array[72] = vmaxf(array[66], array[72]); + array[66] = tmp; + tmp = vminf(array[67], array[73]); + array[73] = vmaxf(array[67], array[73]); + array[67] = tmp; + tmp = vminf(array[70], array[76]); + array[76] = vmaxf(array[70], array[76]); + array[70] = tmp; + tmp = vminf(array[71], array[77]); + array[77] = vmaxf(array[71], array[77]); + array[71] = tmp; + tmp = vminf(array[74], array[80]); + array[80] = vmaxf(array[74], array[80]); + array[74] = tmp; + tmp = vminf(array[2], array[4]); + array[4] = vmaxf(array[2], array[4]); + array[2] = tmp; + tmp = vminf(array[3], array[5]); + array[5] = vmaxf(array[3], array[5]); + array[3] = tmp; + tmp = vminf(array[6], array[8]); + array[8] = vmaxf(array[6], array[8]); + array[6] = tmp; + tmp = vminf(array[7], array[9]); + array[9] = vmaxf(array[7], array[9]); + array[7] = tmp; + tmp = vminf(array[10], array[12]); + array[12] = vmaxf(array[10], array[12]); + array[10] = tmp; + tmp = vminf(array[11], array[13]); + array[13] = vmaxf(array[11], array[13]); + array[11] = tmp; + tmp = vminf(array[14], array[16]); + array[16] = vmaxf(array[14], array[16]); + array[14] = tmp; + tmp = vminf(array[15], array[17]); + array[17] = vmaxf(array[15], array[17]); + array[15] = tmp; + tmp = vminf(array[18], array[20]); + array[20] = vmaxf(array[18], array[20]); + array[18] = tmp; + tmp = vminf(array[19], array[21]); + array[21] = vmaxf(array[19], array[21]); + array[19] = tmp; + tmp = vminf(array[22], array[24]); + array[24] = vmaxf(array[22], array[24]); + array[22] = tmp; + tmp = vminf(array[23], array[25]); + array[25] = vmaxf(array[23], array[25]); + array[23] = tmp; + tmp = vminf(array[26], array[28]); + array[28] = vmaxf(array[26], array[28]); + array[26] = tmp; + tmp = vminf(array[27], array[29]); + array[29] = vmaxf(array[27], array[29]); + array[27] = tmp; + tmp = vminf(array[30], array[32]); + array[32] = vmaxf(array[30], array[32]); + array[30] = tmp; + tmp = vminf(array[31], array[33]); + array[33] = vmaxf(array[31], array[33]); + array[31] = tmp; + tmp = vminf(array[34], array[36]); + array[36] = vmaxf(array[34], array[36]); + array[34] = tmp; + tmp = vminf(array[35], array[37]); + array[37] = vmaxf(array[35], array[37]); + array[35] = tmp; + tmp = vminf(array[38], array[40]); + array[40] = vmaxf(array[38], array[40]); + array[38] = tmp; + tmp = vminf(array[39], array[41]); + array[41] = vmaxf(array[39], array[41]); + array[39] = tmp; + tmp = vminf(array[42], array[44]); + array[44] = vmaxf(array[42], array[44]); + array[42] = tmp; + tmp = vminf(array[43], array[45]); + array[45] = vmaxf(array[43], array[45]); + array[43] = tmp; + tmp = vminf(array[46], array[48]); + array[48] = vmaxf(array[46], array[48]); + array[46] = tmp; + tmp = vminf(array[47], array[49]); + array[49] = vmaxf(array[47], array[49]); + array[47] = tmp; + tmp = vminf(array[50], array[52]); + array[52] = vmaxf(array[50], array[52]); + array[50] = tmp; + tmp = vminf(array[51], array[53]); + array[53] = vmaxf(array[51], array[53]); + array[51] = tmp; + tmp = vminf(array[54], array[56]); + array[56] = vmaxf(array[54], array[56]); + array[54] = tmp; + tmp = vminf(array[55], array[57]); + array[57] = vmaxf(array[55], array[57]); + array[55] = tmp; + tmp = vminf(array[58], array[60]); + array[60] = vmaxf(array[58], array[60]); + array[58] = tmp; + tmp = vminf(array[59], array[61]); + array[61] = vmaxf(array[59], array[61]); + array[59] = tmp; + tmp = vminf(array[62], array[64]); + array[64] = vmaxf(array[62], array[64]); + array[62] = tmp; + tmp = vminf(array[63], array[65]); + array[65] = vmaxf(array[63], array[65]); + array[63] = tmp; + tmp = vminf(array[66], array[68]); + array[68] = vmaxf(array[66], array[68]); + array[66] = tmp; + tmp = vminf(array[67], array[69]); + array[69] = vmaxf(array[67], array[69]); + array[67] = tmp; + tmp = vminf(array[70], array[72]); + array[72] = vmaxf(array[70], array[72]); + array[70] = tmp; + tmp = vminf(array[71], array[73]); + array[73] = vmaxf(array[71], array[73]); + array[71] = tmp; + tmp = vminf(array[74], array[76]); + array[76] = vmaxf(array[74], array[76]); + array[74] = tmp; + tmp = vminf(array[75], array[77]); + array[77] = vmaxf(array[75], array[77]); + array[75] = tmp; + tmp = vminf(array[78], array[80]); + array[80] = vmaxf(array[78], array[80]); + array[78] = tmp; + array[1] = vmaxf(array[0], array[1]); + array[3] = vmaxf(array[2], array[3]); + array[5] = vmaxf(array[4], array[5]); + array[7] = vmaxf(array[6], array[7]); + array[9] = vmaxf(array[8], array[9]); + array[11] = vmaxf(array[10], array[11]); + array[13] = vmaxf(array[12], array[13]); + array[15] = vmaxf(array[14], array[15]); + array[17] = vmaxf(array[16], array[17]); + array[19] = vmaxf(array[18], array[19]); + array[21] = vmaxf(array[20], array[21]); + array[23] = vmaxf(array[22], array[23]); + array[25] = vmaxf(array[24], array[25]); + array[27] = vmaxf(array[26], array[27]); + array[29] = vmaxf(array[28], array[29]); + array[31] = vmaxf(array[30], array[31]); + array[33] = vmaxf(array[32], array[33]); + array[35] = vmaxf(array[34], array[35]); + array[37] = vmaxf(array[36], array[37]); + array[39] = vmaxf(array[38], array[39]); + array[40] = vminf(array[40], array[41]); + array[42] = vminf(array[42], array[43]); + array[44] = vminf(array[44], array[45]); + array[46] = vminf(array[46], array[47]); + array[48] = vminf(array[48], array[49]); + array[50] = vminf(array[50], array[51]); + array[52] = vminf(array[52], array[53]); + array[54] = vminf(array[54], array[55]); + array[56] = vminf(array[56], array[57]); + array[58] = vminf(array[58], array[59]); + array[60] = vminf(array[60], array[61]); + array[62] = vminf(array[62], array[63]); + array[64] = vminf(array[64], array[65]); + array[66] = vminf(array[66], array[67]); + array[68] = vminf(array[68], array[69]); + array[70] = vminf(array[70], array[71]); + array[72] = vminf(array[72], array[73]); + array[74] = vminf(array[74], array[75]); + array[76] = vminf(array[76], array[77]); + array[78] = vminf(array[78], array[79]); + array[64] = vmaxf(array[1], array[64]); + array[66] = vmaxf(array[3], array[66]); + array[68] = vmaxf(array[5], array[68]); + array[70] = vmaxf(array[7], array[70]); + array[9] = vminf(array[9], array[72]); + array[11] = vminf(array[11], array[74]); + array[13] = vminf(array[13], array[76]); + array[15] = vminf(array[15], array[78]); + array[17] = vminf(array[17], array[80]); + array[40] = vmaxf(array[9], array[40]); + array[42] = vmaxf(array[11], array[42]); + array[44] = vmaxf(array[13], array[44]); + array[46] = vmaxf(array[15], array[46]); + array[48] = vmaxf(array[17], array[48]); + array[50] = vmaxf(array[19], array[50]); + array[52] = vmaxf(array[21], array[52]); + array[54] = vmaxf(array[23], array[54]); + array[25] = vminf(array[25], array[56]); + array[27] = vminf(array[27], array[58]); + array[29] = vminf(array[29], array[60]); + array[31] = vminf(array[31], array[62]); + array[33] = vminf(array[33], array[64]); + array[35] = vminf(array[35], array[66]); + array[37] = vminf(array[37], array[68]); + array[39] = vminf(array[39], array[70]); + array[40] = vmaxf(array[25], array[40]); + array[42] = vmaxf(array[27], array[42]); + array[44] = vmaxf(array[29], array[44]); + array[46] = vmaxf(array[31], array[46]); + array[33] = vminf(array[33], array[48]); + array[35] = vminf(array[35], array[50]); + array[37] = vminf(array[37], array[52]); + array[39] = vminf(array[39], array[54]); + array[40] = vmaxf(array[33], array[40]); + array[42] = vmaxf(array[35], array[42]); + array[37] = vminf(array[37], array[44]); + array[39] = vminf(array[39], array[46]); + array[40] = vmaxf(array[37], array[40]); + array[39] = vminf(array[39], array[42]); + return vmaxf(array[39], array[40]); +} +#endif + template inline T median(T arg, ARGS... args) { return median(std::array{std::move(arg), std::move(args)...}); } -// middle 4 of 6 elements, -#define MIDDLE4OF6(s0,s1,s2,s3,s4,s5,d0,d1,d2,d3,d4,d5,temp) \ -{\ -d1 = std::min(s1,s2);\ -d2 = std::max(s1,s2);\ -d0 = std::min(s0,d2);\ -d2 = std::max(s0,d2);\ -temp = std::min(d0,d1);\ -d1 = std::max(d0,d1);\ -d0 = temp;\ -d4 = std::min(s4,s5);\ -d5 = std::max(s4,s5);\ -d3 = std::min(s3,d5);\ -d5 = std::max(s3,d5);\ -temp = std::min(d3,d4);\ -d4 = std::max(d3,d4);\ -d3 = std::max(d0,temp);\ -d2 = std::min(d2,d5);\ +template +inline std::array middle4of6(const std::array& array) +{ + std::array res; + + res[0] = std::min(array[1], array[2]); + res[1] = std::max(array[1], array[2]); + T left = std::min(array[0], res[1]); + res[1] = std::max(array[0], res[1]); + T tmp = std::min(left, res[0]); + res[0] = std::max(left, res[0]); + left = tmp; + res[3] = std::min(array[4], array[5]); + T right = std::max(array[4], array[5]); + res[2] = std::min(array[3], right); + right = std::max(array[3], right); + tmp = std::min(res[2], res[3]); + res[3] = std::max(res[2], res[3]); + res[2] = std::max(left, tmp); + res[1] = std::min(res[1], right); + + return res; } -// middle 4 of 6 elements, vectorized -#define VMIDDLE4OF6(s0,s1,s2,s3,s4,s5,d0,d1,d2,d3,d4,d5,temp) \ -{\ -d1 = vminf(s1,s2);\ -d2 = vmaxf(s1,s2);\ -d0 = vminf(s0,d2);\ -d2 = vmaxf(s0,d2);\ -temp = vminf(d0,d1);\ -d1 = vmaxf(d0,d1);\ -d0 = temp;\ -d4 = vminf(s4,s5);\ -d5 = vmaxf(s4,s5);\ -d3 = vminf(s3,d5);\ -d5 = vmaxf(s3,d5);\ -temp = vminf(d3,d4);\ -d4 = vmaxf(d3,d4);\ -d3 = vmaxf(d0,temp);\ -d2 = vminf(d2,d5);\ +template<> +inline std::array middle4of6(const std::array& array) +{ + std::array res; + + res[0] = vminf(array[1], array[2]); + res[1] = vmaxf(array[1], array[2]); + vfloat left = vminf(array[0], res[1]); + res[1] = vmaxf(array[0], res[1]); + vfloat tmp = vminf(left, res[0]); + res[0] = vmaxf(left, res[0]); + left = tmp; + res[3] = vminf(array[4], array[5]); + vfloat right = vmaxf(array[4], array[5]); + res[2] = vminf(array[3], right); + right = vmaxf(array[3], right); + tmp = vminf(res[2], res[3]); + res[3] = vmaxf(res[2], res[3]); + res[2] = vmaxf(left, tmp); + res[1] = vminf(res[1], right); + + return res; +} + +template +inline std::array middle4of6(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5) +{ + return middle4of6(std::array{std::move(arg0), std::move(arg1), std::move(arg2), std::move(arg3), std::move(arg4), std::move(arg5)}); } diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5d3566126..64f00c009 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3439,17 +3439,12 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D vfloat* pre2 = &buffer[3]; vfloat* post1 = &buffer[6]; vfloat* post2 = &buffer[9]; - - vfloat middle[6]; - #else float buffer[12]; float* pre1 = &buffer[0]; float* pre2 = &buffer[3]; float* post1 = &buffer[6]; float* post2 = &buffer[9]; - - float middle[6]; #endif int px = (row_from - 1) % 3, cx = row_from % 3, nx = 0; @@ -3473,7 +3468,6 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D #ifdef __SSE2__ pre1[0] = _mm_setr_ps(rbconv_I[px][0], rbconv_Q[px][0], 0, 0) , pre1[1] = _mm_setr_ps(rbconv_I[cx][0], rbconv_Q[cx][0], 0, 0), pre1[2] = _mm_setr_ps(rbconv_I[nx][0], rbconv_Q[nx][0], 0, 0); pre2[0] = _mm_setr_ps(rbconv_I[px][1], rbconv_Q[px][1], 0, 0) , pre2[1] = _mm_setr_ps(rbconv_I[cx][1], rbconv_Q[cx][1], 0, 0), pre2[2] = _mm_setr_ps(rbconv_I[nx][1], rbconv_Q[nx][1], 0, 0); - vfloat temp[7]; // fill first element in rbout_I and rbout_Q rbout_I[cx][0] = rbconv_I[cx][0]; @@ -3482,12 +3476,12 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D // median I channel for (int j = 1; j < W - 2; j += 2) { post1[0] = _mm_setr_ps(rbconv_I[px][j + 1], rbconv_Q[px][j + 1], 0, 0), post1[1] = _mm_setr_ps(rbconv_I[cx][j + 1], rbconv_Q[cx][j + 1], 0, 0), post1[2] = _mm_setr_ps(rbconv_I[nx][j + 1], rbconv_Q[nx][j + 1], 0, 0); - VMIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - vfloat medianval = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); + const auto middle = middle4of6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2]); + vfloat medianval = median(pre1[0], pre1[1], pre1[2], middle[0], middle[1], middle[2], middle[3]); rbout_I[cx][j] = medianval[0]; rbout_Q[cx][j] = medianval[1]; post2[0] = _mm_setr_ps(rbconv_I[px][j + 2], rbconv_Q[px][j + 2], 0, 0), post2[1] = _mm_setr_ps(rbconv_I[cx][j + 2], rbconv_Q[cx][j + 2], 0, 0), post2[2] = _mm_setr_ps(rbconv_I[nx][j + 2], rbconv_Q[nx][j + 2], 0, 0); - medianval = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); + medianval = median(post2[0], post2[1], post2[2], middle[0], middle[1], middle[2], middle[3]); rbout_I[cx][j + 1] = medianval[0]; rbout_Q[cx][j + 1] = medianval[1]; std::swap(pre1, post1); @@ -3503,7 +3497,6 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D #else pre1[0] = rbconv_I[px][0], pre1[1] = rbconv_I[cx][0], pre1[2] = rbconv_I[nx][0]; pre2[0] = rbconv_I[px][1], pre2[1] = rbconv_I[cx][1], pre2[2] = rbconv_I[nx][1]; - float temp[7]; // fill first element in rbout_I rbout_I[cx][0] = rbconv_I[cx][0]; @@ -3511,10 +3504,10 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D // median I channel for (int j = 1; j < W - 2; j += 2) { post1[0] = rbconv_I[px][j + 1], post1[1] = rbconv_I[cx][j + 1], post1[2] = rbconv_I[nx][j + 1]; - MIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - rbout_I[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); + const auto middle = middle4of6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2]); + rbout_I[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[0], middle[1], middle[2], middle[3]); post2[0] = rbconv_I[px][j + 2], post2[1] = rbconv_I[cx][j + 2], post2[2] = rbconv_I[nx][j + 2]; - rbout_I[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); + rbout_I[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[0], middle[1], middle[2], middle[3]); std::swap(pre1, post1); std::swap(pre2, post2); } @@ -3532,10 +3525,10 @@ void RawImageSource::processFalseColorCorrectionThread (Imagefloat* im, array2D // median Q channel for (int j = 1; j < W - 2; j += 2) { post1[0] = rbconv_Q[px][j + 1], post1[1] = rbconv_Q[cx][j + 1], post1[2] = rbconv_Q[nx][j + 1]; - MIDDLE4OF6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2], middle[0], middle[1], middle[2], middle[3], middle[4], middle[5], temp[0]); - rbout_Q[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[1], middle[2], middle[3], middle[4]); + const auto middle = middle4of6(pre2[0], pre2[1], pre2[2], post1[0], post1[1], post1[2]); + rbout_Q[cx][j] = median(pre1[0], pre1[1], pre1[2], middle[0], middle[1], middle[2], middle[3]); post2[0] = rbconv_Q[px][j + 2], post2[1] = rbconv_Q[cx][j + 2], post2[2] = rbconv_Q[nx][j + 2]; - rbout_Q[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[1], middle[2], middle[3], middle[4]); + rbout_Q[cx][j + 1] = median(post2[0], post2[1], post2[2], middle[0], middle[1], middle[2], middle[3]); std::swap(pre1, post1); std::swap(pre2, post2); } From fe0743e4710b9af2bbefc8407fb44783dda1727c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 29 Jun 2016 14:47:23 +0200 Subject: [PATCH 120/232] Reduce size of badpixels bitmap by factor 8 --- rtengine/rawimage.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index de2baed32..5b425f7df 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -44,7 +44,7 @@ public: PixelsMap(int width, int height ) : h(height) { - w = (width + base_t_size - 1) / base_t_size; + w = (width / (base_t_size * 8)) + 1; pm = new base_t [h * w ]; memset(pm, 0, h * w * base_t_size ); } From ba71bfe4fd74f7164ca958f613c6e2f2424ab04b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 29 Jun 2016 14:48:37 +0200 Subject: [PATCH 121/232] Speedup for getAutoExpHistogram(..) --- rtengine/rawimagesource.cc | 49 ++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 779169162..8c33bc497 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,7 +37,7 @@ #include #endif #include "opthelper.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD @@ -1664,6 +1664,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool batch) void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) { + BENCHFUN MyTime t1, t2; t1.set(); @@ -2673,7 +2674,7 @@ void RawImageSource::HLRecovery_Global(ToneCurveParams hrp) void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile, unsigned short black[4]) { - BENCHFUN +// BENCHFUN float *cfablur = (float (*)) malloc (H * W * sizeof * cfablur); int BS = raw.ff_BlurRadius; BS += BS & 1; @@ -4427,7 +4428,7 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) histogram(65536 >> histcompr); histogram.clear(); - const float refwb[3] = {static_cast(refwb_red), static_cast(refwb_green), static_cast(refwb_blue)}; + const float refwb[3] = {static_cast(refwb_red / (1 << histcompr)), static_cast(refwb_green / (1 << histcompr)), static_cast(refwb_blue / (1 << histcompr))}; #ifdef _OPENMP #pragma omp parallel @@ -4436,7 +4437,7 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) LUTu tmphistogram(histogram.getSize()); tmphistogram.clear(); #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for schedule(dynamic,16) nowait #endif for (int i = border; i < H - border; i++) { @@ -4444,22 +4445,46 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) getRowStartEnd (i, start, end); if (ri->getSensorType() == ST_BAYER) { - for (int j = start; j < end; j++) { - tmphistogram[(int)(refwb[ri->FC(i, j)] * rawData[i][j]) >> histcompr] += 4; + // precalculate factors to avoid expensive per pixel calculations + 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) { + tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; + tmphistogram[(int)(refwb1 * rawData[i][j+1])] += 4; + } + if(j < end) { + tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; } } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - for (int j = start; j < end; j++) { - tmphistogram[(int)(refwb[ri->XTRANSFC(i, j)] * rawData[i][j]) >> histcompr] += 4; + // 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)]; + int j; + for (j = start; j < end-5; j+=6) { + tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; + tmphistogram[(int)(refwb1 * rawData[i][j+1])] += 4; + tmphistogram[(int)(refwb2 * rawData[i][j+2])] += 4; + tmphistogram[(int)(refwb3 * rawData[i][j+3])] += 4; + tmphistogram[(int)(refwb4 * rawData[i][j+4])] += 4; + tmphistogram[(int)(refwb5 * rawData[i][j+5])] += 4; + } + for (; j < end; j++) { + tmphistogram[(int)(refwb[ri->XTRANSFC(i, j)] * rawData[i][j])] += 4; } } else if (ri->get_colors() == 1) { for (int j = start; j < end; j++) { - tmphistogram[(int)(refwb_red * rawData[i][j]) >> histcompr]++; + tmphistogram[(int)(refwb_red * rawData[i][j])]++; } } else { for (int j = start; j < end; j++) { - tmphistogram[CLIP((int)(refwb_red * rawData[i][3 * j + 0])) >> histcompr]++; - tmphistogram[CLIP((int)(refwb_green * rawData[i][3 * j + 1])) >> histcompr] += 2; - tmphistogram[CLIP((int)(refwb_blue * rawData[i][3 * j + 2])) >> histcompr]++; + tmphistogram[CLIP((int)(refwb_red * rawData[i][3 * j + 0]))]++; + tmphistogram[CLIP((int)(refwb_green * rawData[i][3 * j + 1]))] += 2; + tmphistogram[CLIP((int)(refwb_blue * rawData[i][3 * j + 2]))]++; } } } From 406d1b7fb1c72a810d269c1a15173014abf45ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 30 Jun 2016 17:54:15 +0200 Subject: [PATCH 122/232] Vectorize some medians in ImProcFunctions::Median_Denoise() (#3346) - Vectorize with Ingo's scheme - Make loads more cache friendly --- rtengine/FTblockDN.cc | 309 +++++++++++++++++++++++++++++------------- 1 file changed, 218 insertions(+), 91 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index d5cf00787..8d0f3f62b 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -38,6 +38,9 @@ #include "cplx_wavelet_dec.h" #include "median.h" +#define BENCHMARK +#include "StopWatch.h" + #ifdef _OPENMP #include #endif @@ -96,7 +99,7 @@ float media(float *elements, int N) } void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) -{ +{ BENCHFUN int border = 1; switch (medianType) { @@ -130,7 +133,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, if(buffer == NULL) { // we didn't get a buufer => create one allocBuffer = new float*[height]; - for (int i = 0; i < height; i++) { + for (int i = 0; i < height; ++i) { allocBuffer[i] = new float[width]; } @@ -145,13 +148,13 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, float ** medianIn, ** medianOut; int BufferIndex = 0; - for(int iteration = 1; iteration <= iterations; iteration++) { + for(int iteration = 1; iteration <= iterations; ++iteration) { medianIn = medBuffer[BufferIndex]; medianOut = medBuffer[BufferIndex ^ 1]; if(iteration == 1) { // upper border - for (int i = 0; i < border; i++) - for (int j = 0; j < width; j++) { + for (int i = 0; i < border; ++i) + for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } } @@ -160,101 +163,225 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, #pragma omp parallel for num_threads(numThreads) if(numThreads>1) schedule(dynamic,16) #endif - for (int i = border; i < height - border; i++) { + for (int i = border; i < height - border; ++i) { if (medianType == Median::SIZE_3X3_SOFT) { - int j; + int j = 0; - for (j = 0; j < border; j++) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; j++) { - medianOut[i][j] = median(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1]); - } - - for(; j < width; j++) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_3X3_STRONG) { - int j; - - for (j = 0; j < border; j++) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; j++) { - medianOut[i][j] = median(medianIn[i][j] , medianIn[i - 1][j], medianIn[i + 1][j] , medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1]); - } - - for(; j < width; j++) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_5X5_SOFT) { - int j; - - for (j = 0; j < border; j++) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; j++) { - medianOut[i][j] = median( - medianIn[i][j], - medianIn[i - 1][j], - medianIn[i + 1][j], - medianIn[i][j + 1], - medianIn[i][j - 1], - medianIn[i - 1][j - 1], - medianIn[i - 1][j + 1], - medianIn[i + 1][j - 1], - medianIn[i + 1][j + 1], - medianIn[i + 2][j], - medianIn[i - 2][j], - medianIn[i][j + 2], - medianIn[i][j - 2] - ); - } - - for(; j < width; j++) { - medianOut[i][j] = medianIn[i][j]; - } - } else if(medianType == Median::SIZE_5X5_STRONG) { - int j; - - for (j = 0; j < border; j++) { + for (; j < border; ++j) { medianOut[i][j] = medianIn[i][j]; } #ifdef __SSE2__ for (; j < width - border - 3; j += 4) { - STVFU(medianOut[i][j], median(LVFU(medianIn[i][j]), LVFU(medianIn[i - 1][j]), LVFU(medianIn[i + 1][j]), LVFU(medianIn[i][j + 1]), LVFU(medianIn[i][j - 1]), LVFU(medianIn[i - 1][j - 1]), LVFU(medianIn[i - 1][j + 1]), LVFU(medianIn[i + 1][j - 1]), LVFU(medianIn[i + 1][j + 1]), - LVFU(medianIn[i - 2][j]), LVFU(medianIn[i + 2][j]), LVFU(medianIn[i][j + 2]), LVFU(medianIn[i][j - 2]), LVFU(medianIn[i - 2][j - 2]), LVFU(medianIn[i - 2][j + 2]), LVFU(medianIn[i + 2][j - 2]), LVFU(medianIn[i + 2][j + 2]), - LVFU(medianIn[i - 2][j + 1]), LVFU(medianIn[i + 2][j + 1]), LVFU(medianIn[i - 1][j + 2]), LVFU(medianIn[i - 1][j - 2]), LVFU(medianIn[i - 2][j - 1]), LVFU(medianIn[i + 2][j - 1]), LVFU(medianIn[i + 1][j + 2]), LVFU(medianIn[i + 1][j - 2]))); + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i + 1][j]) + ) + ); } #endif - for (; j < width - border; j++) { - medianOut[i][j] = median(medianIn[i][j], medianIn[i - 1][j], medianIn[i + 1][j], medianIn[i][j + 1], medianIn[i][j - 1], medianIn[i - 1][j - 1], medianIn[i - 1][j + 1], medianIn[i + 1][j - 1], medianIn[i + 1][j + 1], - medianIn[i - 2][j], medianIn[i + 2][j], medianIn[i][j + 2], medianIn[i][j - 2], medianIn[i - 2][j - 2], medianIn[i - 2][j + 2], medianIn[i + 2][j - 2], medianIn[i + 2][j + 2], - medianIn[i - 2][j + 1], medianIn[i + 2][j + 1], medianIn[i - 1][j + 2], medianIn[i - 1][j - 2], medianIn[i - 2][j - 1], medianIn[i + 2][j - 1], medianIn[i + 1][j + 2], medianIn[i + 1][j - 2]); + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j] + ); } - for(; j < width; j++) { + for(; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + } else if (medianType == Median::SIZE_3X3_STRONG) { + int j = 0; + + for (; j < border; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + +#ifdef __SSE2__ + for (; j < width - border - 3; j += 4) { + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 1][j - 1]), + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i - 1][j + 1]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i + 1][j - 1]), + LVFU(medianIn[i + 1][j]), + LVFU(medianIn[i + 1][j + 1]) + ) + ); + } +#endif + + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1] + ); + } + + for(; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + } else if (medianType == Median::SIZE_5X5_SOFT) { + int j = 0; + + for (; j < border; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + +#ifdef __SSE2__ + for (; j < width - border - 3; j += 4) { + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 2][j]), + LVFU(medianIn[i - 1][j - 1]), + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i - 1][j + 1]), + LVFU(medianIn[i][j - 2]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i][j + 2]), + LVFU(medianIn[i + 1][j - 1]), + LVFU(medianIn[i + 1][j]), + LVFU(medianIn[i + 1][j + 1]), + LVFU(medianIn[i + 2][j]) + ) + ); + } +#endif + + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 2][j] + ); + } + + for(; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + } else if(medianType == Median::SIZE_5X5_STRONG) { + int j = 0; + + for (; j < border; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + +#ifdef __SSE2__ + for (; j < width - border - 3; j += 4) { + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 2][j - 2]), + LVFU(medianIn[i - 2][j - 1]), + LVFU(medianIn[i - 2][j]), + LVFU(medianIn[i - 2][j + 1]), + LVFU(medianIn[i - 2][j + 2]), + LVFU(medianIn[i - 1][j - 2]), + LVFU(medianIn[i - 1][j - 1]), + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i - 1][j + 1]), + LVFU(medianIn[i - 1][j + 2]), + LVFU(medianIn[i][j - 2]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i][j + 2]), + LVFU(medianIn[i + 1][j - 2]), + LVFU(medianIn[i + 1][j - 1]), + LVFU(medianIn[i + 1][j]), + LVFU(medianIn[i + 1][j + 1]), + LVFU(medianIn[i + 1][j + 2]), + LVFU(medianIn[i + 2][j - 2]), + LVFU(medianIn[i + 2][j - 1]), + LVFU(medianIn[i + 2][j]), + LVFU(medianIn[i + 2][j + 1]), + LVFU(medianIn[i + 2][j + 2]) + ) + ); + } +#endif + + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j - 2], + medianIn[i - 2][j - 1], + medianIn[i - 2][j], + medianIn[i - 2][j + 1], + medianIn[i - 2][j + 2], + medianIn[i - 1][j - 2], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i - 1][j + 2], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 1][j + 2], + medianIn[i + 2][j - 2], + medianIn[i + 2][j - 1], + medianIn[i + 2][j], + medianIn[i + 2][j + 1], + medianIn[i + 2][j + 2] + ); + } + + for(; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } } else if (medianType == Median::SIZE_7X7) { std::array pp; - int j; + int j = 0; - for (j = 0; j < border; j++) { + for (; j < border; ++j) { medianOut[i][j] = medianIn[i][j]; } - for (; j < width - border; j++) { + for (; j < width - border; ++j) { int kk = 0; - for (int ii = -border; ii <= border; ii++) { - for (int jj = -border; jj <= border; jj++) { - kk++; + for (int ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj) { + ++kk; pp[kk] = medianIn[i + ii][j + jj]; } } @@ -262,23 +389,23 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = median(pp); } - for(; j < width; j++) { + for(; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } } else { // includes Median::SIZE_9X9 std::array pp; - int j; + int j = 0; - for (j = 0; j < border; j++) { + for (; j < border; ++j) { medianOut[i][j] = medianIn[i][j]; } - for (; j < width - border; j++) { + for (; j < width - border; ++j) { int kk = 0; - for (int ii = -border; ii <= border; ii++) { - for (int jj = -border; jj <= border; jj++) { - kk++; + for (int ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj) { + ++kk; pp[kk] = medianIn[i + ii][j + jj]; } } @@ -286,15 +413,15 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = median(pp); } - for(; j < width; j++) { + for(; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } } } if(iteration == 1) { // lower border - for (int i = height - border; i < height; i++) - for (int j = 0; j < width; j++) { + for (int i = height - border; i < height; ++i) + for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } } @@ -307,15 +434,15 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, #pragma omp parallel for num_threads(numThreads) if(numThreads>1) #endif - for(int i = border; i < height - border; i++ ) { - for(int j = border; j < width - border; j++) { + for(int i = border; i < height - border; ++i ) { + for(int j = border; j < width - border; ++j) { dst[i][j] = medianOut[i][j]; } } } if(allocBuffer != NULL) { // we allocated memory, so let's free it now - for (int i = 0; i < height; i++) { + for (int i = 0; i < height; ++i) { delete[] allocBuffer[i]; } From e2deb1640385c70e9d6a28257c4630f5d1b4ecb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 30 Jun 2016 18:02:19 +0200 Subject: [PATCH 123/232] Fix apparent OOB access in ImProcFunctions::Median_Denoise() (#3346) --- rtengine/FTblockDN.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8d0f3f62b..44b86d0b8 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -380,8 +380,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, int kk = 0; for (int ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj) { - ++kk; + for (int jj = -border; jj <= border; ++jj, ++kk) { pp[kk] = medianIn[i + ii][j + jj]; } } @@ -404,8 +403,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, int kk = 0; for (int ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj) { - ++kk; + for (int jj = -border; jj <= border; ++jj, ++kk) { pp[kk] = medianIn[i + ii][j + jj]; } } From 1f63ab85facb36dafc2ecd17f496c18850241c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 30 Jun 2016 18:18:13 +0200 Subject: [PATCH 124/232] Vectorize 49 and 81 in ImProcFunctions::Median_Denoise() (#3346) --- rtengine/FTblockDN.cc | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 44b86d0b8..1097d5a0f 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -376,10 +376,21 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } - for (; j < width - border; ++j) { - int kk = 0; +#ifdef __SSE2__ + std::array vpp ALIGNED16; + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } + } - for (int ii = -border; ii <= border; ++ii) { + STVFU(medianOut[i][j], median(vpp)); + } +#endif + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { for (int jj = -border; jj <= border; ++jj, ++kk) { pp[kk] = medianIn[i + ii][j + jj]; } @@ -399,10 +410,21 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } - for (; j < width - border; ++j) { - int kk = 0; +#ifdef __SSE2__ + std::array vpp ALIGNED16; + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } + } - for (int ii = -border; ii <= border; ++ii) { + STVFU(medianOut[i][j], median(vpp)); + } +#endif + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { for (int jj = -border; jj <= border; ++jj, ++kk) { pp[kk] = medianIn[i + ii][j + jj]; } From 58e560b88e9b0cfdf1e1a8ac1606a31c1d0ba2a6 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 30 Jun 2016 19:48:44 +0200 Subject: [PATCH 125/232] Added further speedups and astyles the changed files --- rtengine/imagesource.h | 2 +- rtengine/rawimagesource.cc | 79 +++++++++++++++++++++++++------------- rtengine/rawimagesource.h | 4 +- rtengine/simpleprocess.cc | 7 ++-- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index f252dc1bb..305c67da5 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -67,7 +67,7 @@ public: virtual ~ImageSource () {} virtual int load (const Glib::ustring &fname, bool batch = false) = 0; - virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) {}; + virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {}; virtual void demosaic (const RAWParams &raw) {}; virtual void retinex (ColorManagementParams cmp, RetinexParams deh, 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 (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 8c33bc497..5b3232af5 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -714,7 +714,7 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima rm /= area; gm /= area; bm /= area; - + bool doHr = (hrp.hrenabled && hrp.method != "Color"); #ifdef _OPENMP #pragma omp parallel if(!d1x) // omp disabled for D1x to avoid race conditions (see Issue 1088 http://code.google.com/p/rawtherapee/issues/detail?id=1088) { @@ -801,8 +801,8 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima } //process all highlight recovery other than "Color" - if (hrp.hrenabled && hrp.method != "Color") { - hlRecovery (hrp.method, line_red, line_grn, line_blue, i, sx1, imwidth, skip, raw, hlmax); + if (doHr) { + hlRecovery (hrp.method, line_red, line_grn, line_blue, imwidth, hlmax); } if(d1x) { @@ -1662,7 +1662,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool batch) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) +void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise) { BENCHFUN MyTime t1, t2; @@ -1683,18 +1683,20 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le printf( "Subtracting Darkframe:%s\n", rid->get_filename().c_str()); } - PixelsMap bitmapBads(W, H); + PixelsMap *bitmapBads = nullptr; + 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) + bitmapBads = new PixelsMap(W, H); #ifdef _OPENMP - #pragma omp parallel for reduction(+:totBP) + #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) #endif for(int i = 0; i < H; i++) for(int j = 0; j < W; j++) { if(ri->data[i][j] == 0.f) { - bitmapBads.set(j, i); + bitmapBads->set(j, i); totBP++; } } @@ -1705,7 +1707,6 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } //FLATFIELD start - Glib::ustring newFF = raw.ff_file; RawImage *rif = NULL; if (!raw.ff_AutoSelect) { @@ -1731,7 +1732,11 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le std::vector *bp = dfm.getBadPixels( ri->get_maker(), ri->get_model(), idata->getSerialNumber() ); if( bp ) { - totBP += bitmapBads.set( *bp ); + if(!bitmapBads) { + bitmapBads = new PixelsMap(W, H); + } + + totBP += bitmapBads->set( *bp ); if( settings->verbose ) { std::cout << "Correcting " << bp->size() << " pixels from .badpixels" << std::endl; @@ -1748,7 +1753,11 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } if(bp) { - totBP += bitmapBads.set( *bp ); + if(!bitmapBads) { + bitmapBads = new PixelsMap(W, H); + } + + totBP += bitmapBads->set( *bp ); if( settings->verbose && !bp->empty()) { std::cout << "Correcting " << bp->size() << " hotpixels from darkframe" << std::endl; @@ -1787,7 +1796,11 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le plistener->setProgress (0.0); } - int nFound = findHotDeadPixels( bitmapBads, raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); + if(!bitmapBads) { + bitmapBads = new PixelsMap(W, H); + } + + int nFound = findHotDeadPixels( *bitmapBads, raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); totBP += nFound; if( settings->verbose && nFound > 0) { @@ -1845,11 +1858,11 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if( totBP ) if ( ri->getSensorType() == ST_BAYER ) { - interpolateBadPixelsBayer( bitmapBads ); + interpolateBadPixelsBayer( *bitmapBads ); } else if ( ri->getSensorType() == ST_FUJI_XTRANS ) { - interpolateBadPixelsXtrans( bitmapBads ); + interpolateBadPixelsXtrans( *bitmapBads ); } else { - interpolateBadPixelsNColours( bitmapBads, ri->get_colors() ); + interpolateBadPixelsNColours( *bitmapBads, ri->get_colors() ); } if ( ri->getSensorType() == ST_BAYER && raw.bayersensor.linenoise > 0 ) { @@ -1874,7 +1887,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le processRawWhitepoint(raw.expos, raw.preser); } - if(dirpyrdenoiseExpComp == INFINITY) { + if(prepareDenoise && dirpyrdenoiseExpComp == INFINITY) { LUTu aehist; int aehistcompr; double clip = 0; @@ -1889,6 +1902,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le printf("Preprocessing: %d usec\n", t2.etime(t1)); } + if(bitmapBads) { + delete bitmapBads; + } + return; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2978,13 +2995,17 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw for (int col = 0; col < W; col++) { int c = FC(row, col); int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; - rawData[row][col] = max(src->data[row][col] + black[c4] - riDark->data[row][col], 0.0f); + rawData[row][col] = max(src->data[row][col] + black[c4] - riDark->data[row][col], 0.0f); } } } else { +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { - rawData[row][col] = src->data[row][col]; + rawData[row][col] = src->data[row][col]; } } } @@ -4403,7 +4424,7 @@ void RawImageSource::HLRecovery_CIELab (float* rin, float* gin, float* bin, floa //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::hlRecovery (std::string method, float* red, float* green, float* blue, int i, int sx1, int width, int skip, const RAWParams &raw, float* hlmax ) +void RawImageSource::hlRecovery (std::string method, float* red, float* green, float* blue, int width, float* hlmax ) { if (method == "Luminance") { @@ -4449,10 +4470,12 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) 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) { + + for (j = start; j < end - 1; j += 2) { tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; - tmphistogram[(int)(refwb1 * rawData[i][j+1])] += 4; + tmphistogram[(int)(refwb1 * rawData[i][j + 1])] += 4; } + if(j < end) { tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; } @@ -4465,14 +4488,16 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr) 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) { + + for (j = start; j < end - 5; j += 6) { tmphistogram[(int)(refwb0 * rawData[i][j])] += 4; - tmphistogram[(int)(refwb1 * rawData[i][j+1])] += 4; - tmphistogram[(int)(refwb2 * rawData[i][j+2])] += 4; - tmphistogram[(int)(refwb3 * rawData[i][j+3])] += 4; - tmphistogram[(int)(refwb4 * rawData[i][j+4])] += 4; - tmphistogram[(int)(refwb5 * rawData[i][j+5])] += 4; + tmphistogram[(int)(refwb1 * rawData[i][j + 1])] += 4; + tmphistogram[(int)(refwb2 * rawData[i][j + 2])] += 4; + tmphistogram[(int)(refwb3 * rawData[i][j + 3])] += 4; + tmphistogram[(int)(refwb4 * rawData[i][j + 4])] += 4; + tmphistogram[(int)(refwb5 * rawData[i][j + 5])] += 4; } + for (; j < end; j++) { tmphistogram[(int)(refwb[ri->XTRANSFC(i, j)] * rawData[i][j])] += 4; } @@ -4532,7 +4557,7 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU #ifdef _OPENMP int numThreads; - // reduce the number of threads under certain conditions to avoid overhaed of too many critical regions + // 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::min(std::max(numThreads, 1), omp_get_max_threads()); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index c9e593e23..e682f0e79 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -97,7 +97,7 @@ protected: void hphd_horizontal (float** hpmap, int row_from, int row_to); void hphd_green (float** hpmap); void processFalseColorCorrectionThread (Imagefloat* im, array2D &rbconv_Y, array2D &rbconv_I, array2D &rbconv_Q, array2D &rbout_I, array2D &rbout_Q, const int row_from, const int row_to); - void hlRecovery (std::string method, float* red, float* green, float* blue, int i, int sx1, int width, int skip, const RAWParams &raw, float* hlmax); + void hlRecovery (std::string method, float* red, float* green, float* blue, int width, float* hlmax); void transformRect (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); @@ -116,7 +116,7 @@ public: ~RawImageSource (); int load (const Glib::ustring &fname, bool batch = false); - void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse); + void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true); void demosaic (const RAWParams &raw); void retinex (ColorManagementParams cmp, RetinexParams deh, 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); void retinexPrepareCurves (RetinexParams retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c11ac6452..25bf45742 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -102,7 +102,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p ImProcFunctions ipf (¶ms, true); PreviewProps pp (0, 0, fw, fh, 1); - imgsrc->preprocess( params.raw, params.lensProf, params.coarse); + imgsrc->preprocess( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); if (params.toneCurve.autoexp) {// this enabled HLRecovery LUTu histRedRaw(256), histGreenRaw(256), histBlueRaw(256); @@ -823,11 +823,13 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p cl2Toningcurve (65536, 0); CurveFactory::curveToning(params.colorToning.cl2curve, cl2Toningcurve, 1); } + LabImage* labView = new LabImage (fw, fh); if(params.blackwhite.enabled) { CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, hist16, dummy, customToneCurvebw1, customToneCurvebw2, 1); } + double rrm, ggm, bbm; float autor, autog, autob; float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; @@ -910,8 +912,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p #endif for (int i = 0; i < fh; i++) - for (int j = 0; j < fw; j++) - { + for (int j = 0; j < fw; j++) { hist16thr[(int)((labView->L[i][j]))]++; } From 4236fd0545b758fbf1c83ded4d2aad7d52606467 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 1 Jul 2016 13:33:05 +0200 Subject: [PATCH 126/232] Add milliseconds to queue params file, fixes #3363 --- rtgui/batchqueue.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 7c63fce11..7856b72a0 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -34,7 +34,7 @@ #include "batchqueuebuttonset.h" #include "guiutils.h" #include "rtimage.h" - +#include using namespace std; using namespace rtengine; @@ -367,6 +367,10 @@ bool BatchQueue::loadBatchQueue () Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename ) { + timeval tv; + gettimeofday(&tv, 0); + char mseconds[4]; + sprintf(mseconds, "%d", tv.tv_usec / 1000); time_t rawtime; struct tm *timeinfo; char stringTimestamp [80]; @@ -378,6 +382,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename g_mkdir_with_parents (savedParamPath.c_str (), 0755); savedParamPath += Glib::path_get_basename (filename); savedParamPath += stringTimestamp; + savedParamPath += mseconds; savedParamPath += paramFileExtension; return savedParamPath; } From b8c5ee7e47b28a15c2edff43da01e627191d9485 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 1 Jul 2016 15:04:34 +0200 Subject: [PATCH 127/232] Disabled StopWatch --- rtengine/rawimagesource.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 5b3232af5..56ef57a07 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -37,7 +37,7 @@ #include #endif #include "opthelper.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD @@ -1664,7 +1664,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool batch) void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise) { - BENCHFUN +// BENCHFUN MyTime t1, t2; t1.set(); From 9edec3361be2b72bb7d77fd01fc6b3c2f5aff339 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 17:31:18 +0200 Subject: [PATCH 128/232] Updated all Canon interpreters. --- rtexif/canonattribs.cc | 281 +++++++++++++++++++++++++++++++++-------- 1 file changed, 230 insertions(+), 51 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index edacb214e..a4f4ab8b8 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -149,6 +149,9 @@ public: choices[3] = "Continuous, Speed Priority"; choices[4] = "Continuous, Low"; choices[5] = "Continuous, High"; + choices[6] = "Silent Single"; + choices[9] = "Single, Silent"; + choices[10] = "Continuous, Silent"; } }; CAContinuousDriveInterpreter caContinuousDriveInterpreter; @@ -161,11 +164,13 @@ public: choices[0] = "One-shot AF"; choices[1] = "AI Servo AF"; choices[2] = "AI Focus AF"; - choices[3] = "Manual Focus"; + choices[3] = "Manual Focus (3)"; choices[4] = "Single"; choices[5] = "Continuous"; - choices[6] = "Manual Focus"; + choices[6] = "Manual Focus (6)"; choices[16] = "Pan Focus"; + choices[256] = "AF + MF"; + choices[512] = "Movie Snap Focus"; } }; CAFocusModeInterpreter caFocusModeInterpreter; @@ -182,7 +187,8 @@ public: choices[5] = "TIF+JPEG"; choices[6] = "CR2"; choices[7] = "CR2+JPEG"; - choices[9] = "Video"; + choices[9] = "MOV"; + choices[10] = "MP4"; } }; CARecordModeInterpreter caRecordModeInterpreter; @@ -201,6 +207,9 @@ public: choices[8] = "Postcard"; choices[9] = "Widescreen"; choices[10] = "Medium Widescreen"; + choices[14] = "Small 1"; + choices[15] = "Small 2"; + choices[16] = "Small 3"; choices[128] = "640x480 Movie"; choices[129] = "Medium Movie"; choices[130] = "Small Movie"; @@ -215,17 +224,17 @@ class CAEasyModeInterpreter : public ChoiceInterpreter public: CAEasyModeInterpreter () { - choices[0] = "Full auto "; - choices[1] = "Manual "; - choices[2] = "Landscape "; - choices[3] = "Fast shutter "; - choices[4] = "Slow shutter "; - choices[5] = "Night "; - choices[6] = "Gray Scale "; - choices[7] = "Sepia "; - choices[8] = "Portrait "; - choices[9] = "Sports "; - choices[10] = "Macro "; + choices[0] = "Full auto"; + choices[1] = "Manual"; + choices[2] = "Landscape"; + choices[3] = "Fast shutter"; + choices[4] = "Slow shutter"; + choices[5] = "Night"; + choices[6] = "Gray Scale"; + choices[7] = "Sepia"; + choices[8] = "Portrait"; + choices[9] = "Sports"; + choices[10] = "Macro"; choices[11] = "Black & White"; choices[12] = "Pan focus"; choices[13] = "Vivid"; @@ -243,17 +252,49 @@ public: choices[25] = "Night Snapshot"; choices[26] = "Digital Macro"; choices[27] = "My Colors"; - choices[28] = "Still Image"; + choices[28] = "Movie Snap"; + choices[29] = "Super Macro 2"; choices[30] = "Color Accent"; choices[31] = "Color Swap"; choices[32] = "Aquarium"; choices[33] = "ISO 3200"; + choices[34] = "ISO 6400"; + choices[35] = "Creative Light Effect"; + choices[36] = "Easy"; + choices[37] = "Quick Shot"; choices[38] = "Creative Auto"; + choices[39] = "Zoom Blur"; + choices[40] = "Low Light"; + choices[41] = "Nostalgic"; choices[42] = "Super Vivid"; - choices[43] = "Poster"; - choices[47] = "Fisheye"; - choices[48] = "Miniature"; + choices[43] = "Poster Effect"; + choices[44] = "Face Self-timer"; + choices[45] = "Smile"; + choices[46] = "Wink Self-timer"; + choices[47] = "Fisheye Effect"; + choices[48] = "Miniature Effect"; + choices[49] = "High-speed Burst"; + choices[50] = "Best Image Selection"; + choices[51] = "High Dynamic Range"; + choices[52] = "Handheld Night Scene"; + choices[53] = "Movie Digest"; + choices[54] = "Live View Control"; + choices[55] = "Discreet"; + choices[56] = "Blur Reduction"; + choices[57] = "Monochrome"; + choices[58] = "Toy Camera Effect"; + choices[59] = "Scene Intelligent Auto"; + choices[60] = "High-speed Burst HQ"; + choices[61] = "Smooth Skin"; + choices[62] = "Soft Focus"; + choices[257] = "Spotlight"; + choices[258] = "Night 2"; + choices[259] = "Night+"; + choices[260] = "Super Night"; choices[261] = "Sunset"; + choices[263] = "Night Scene"; + choices[264] = "Surface"; + choices[265] = "Low Light 2"; } }; CAEasyModeInterpreter caEasyModeInterpreter; @@ -281,7 +322,7 @@ public: choices[2] = "Average"; choices[3] = "Evaluative"; choices[4] = "Partial"; - choices[5] = "Center-weighted averaging"; + choices[5] = "Center-weighted average"; } }; CAMeteringModeInterpreter caMeteringModeInterpreter; @@ -422,9 +463,14 @@ public: { choices[0] = "Off"; choices[1] = "On"; - choices[2] = "On, Shot Only"; - choices[3] = "On, Panning"; - choices[4] = "On, Video"; + choices[2] = "Shoot Only"; + choices[3] = "Panning"; + choices[4] = "Dynamic"; + choices[256] = "Off (2)"; + choices[257] = "On (2)"; + choices[258] = "Shoot Only (2)"; + choices[259] = "Panning (2)"; + choices[260] = "Dynamic (2)"; } }; CAStabilizationInterpreter caStabilizationInterpreter; @@ -986,7 +1032,7 @@ class CAFocalTypeInterpreter : public ChoiceInterpreter public: CAFocalTypeInterpreter() { - choices[0] = "undef"; + choices[0] = "Fixed"; choices[1] = "Fixed"; choices[2] = "Zoom"; } @@ -1119,6 +1165,11 @@ public: choices[15] = "Custom 1"; choices[16] = "Custom 2"; choices[17] = "Underwater"; + choices[18] = "Custom 3"; + choices[19] = "Custom 4"; + choices[20] = "PC Set4"; + choices[21] = "PC Set5"; + choices[23] = "Auto (ambience priority)"; } }; CAWhiteBalanceInterpreter caWhiteBalanceInterpreter; @@ -1136,15 +1187,17 @@ public: choices[0x21] = "User Def. 1"; choices[0x22] = "User Def. 2"; choices[0x23] = "User Def. 3"; - choices[0x41] = "External 1"; - choices[0x42] = "External 2"; - choices[0x43] = "External 3"; + choices[0x41] = "PC 1"; + choices[0x42] = "PC 2"; + choices[0x43] = "PC 3"; choices[0x81] = "Standard"; choices[0x82] = "Portrait"; choices[0x83] = "Landscape"; choices[0x84] = "Neutral"; choices[0x85] = "Faithful"; choices[0x86] = "Monochrome"; + choices[0x87] = "Auto"; + choices[0x88] = "Fine Detail"; } }; CAPictureStyleInterpreter caPictureStyleInterpreter; @@ -1298,6 +1351,8 @@ public: choices[3] = "Fine"; choices[4] = "RAW"; choices[5] = "Superfine"; + choices[130] = "Normal Movie"; + choices[131] = "Movie (2)"; } }; CARAWJpegQualityInterpreter caRAWJpegQualityInterpreter; @@ -1315,6 +1370,15 @@ public: choices[7] = "Medium 3"; choices[8] = "Postcard"; choices[9] = "Widescreen"; + choices[10] = "Medium Widescreen"; + choices[14] = "Small 1"; + choices[15] = "Small 2"; + choices[16] = "Small 3"; + choices[128] = "640x480 Movie"; + choices[129] = "Medium Movie"; + choices[130] = "Small Movie"; + choices[137] = "1280x720 Movie"; + choices[142] = "1920x1080 Movie"; } }; CAJpegSizeInterpreter caJpegSizeInterpreter; @@ -1325,8 +1389,8 @@ public: CAWBBracketModeInterpreter() { choices[0] = "Off"; - choices[1] = "Shift AB"; - choices[2] = "shift GM"; + choices[1] = "On (shift AB)"; + choices[2] = "On (shift GM)"; } }; CAWBBracketModeInterpreter caWBBracketModeInterpreter; @@ -1422,10 +1486,10 @@ public: choices[0x1570000] = "PowerShot A510"; choices[0x1590000] = "PowerShot SD20 / Digital IXUS i5 / IXY Digital L2"; choices[0x1640000] = "PowerShot S2 IS"; - choices[0x1650000] = "PowerShot SD430 / IXUS Wireless / IXY Wireless"; + choices[0x1650000] = "PowerShot SD430 / Digital IXUS Wireless / IXY Digital Wireless"; choices[0x1660000] = "PowerShot SD500 / Digital IXUS 700 / IXY Digital 600"; choices[0x1668000] = "EOS D60"; - choices[0x1700000] = "PowerShot SD30 / Digital IXUS i zoom / IXY Digital L3"; + choices[0x1700000] = "PowerShot SD30 / Digital IXUS i Zoom / IXY Digital L3"; choices[0x1740000] = "PowerShot A430"; choices[0x1750000] = "PowerShot A410"; choices[0x1760000] = "PowerShot S80"; @@ -1498,7 +1562,7 @@ public: choices[0x2770000] = "PowerShot SD940 IS / Digital IXUS 120 IS / IXY Digital 220 IS"; choices[0x2800000] = "PowerShot A495"; choices[0x2810000] = "PowerShot A490"; - choices[0x2820000] = "PowerShot A3100 IS"; + choices[0x2820000] = "PowerShot A3100 IS / A3150 IS"; choices[0x2830000] = "PowerShot A3000 IS"; choices[0x2840000] = "PowerShot SD1400 IS / IXUS 130 / IXY 400F"; choices[0x2850000] = "PowerShot SD1300 IS / IXUS 105 / IXY 200F"; @@ -1510,36 +1574,125 @@ public: choices[0x2930000] = "PowerShot SX30 IS"; choices[0x2940000] = "PowerShot SX130 IS"; choices[0x2950000] = "PowerShot S95"; + choices[0x2980000] = "PowerShot A3300 IS"; + choices[0x2990000] = "PowerShot A3200 IS"; + choices[0x3000000] = "PowerShot ELPH 500 HS / IXUS 310 HS / IXY 31S"; choices[0x3010000] = "PowerShot Pro90 IS"; - choices[0x3340000] = "PowerShot SX50 HS"; - choices[0x3360000] = "PowerShot S110"; + choices[0x3010001] = "PowerShot A800"; + choices[0x3020000] = "PowerShot ELPH 100 HS / IXUS 115 HS / IXY 210F"; + choices[0x3030000] = "PowerShot SX230 HS"; + choices[0x3040000] = "PowerShot ELPH 300 HS / IXUS 220 HS / IXY 410F"; + choices[0x3050000] = "PowerShot A2200"; + choices[0x3060000] = "PowerShot A1200"; + choices[0x3070000] = "PowerShot SX220 HS"; + choices[0x3080000] = "PowerShot G1 X"; + choices[0x3090000] = "PowerShot SX150 IS"; + choices[0x3100000] = "PowerShot ELPH 510 HS / IXUS 1100 HS / IXY 51S"; + choices[0x3110000] = "PowerShot S100 (new)"; + choices[0x3120000] = "PowerShot ELPH 310 HS / IXUS 230 HS / IXY 600F"; + choices[0x3130000] = "PowerShot SX40 HS"; + choices[0x3140000] = "IXY 32S"; + choices[0x3160000] = "PowerShot A1300"; + choices[0x3170000] = "PowerShot A810"; + choices[0x3180000] = "PowerShot ELPH 320 HS / IXUS 240 HS / IXY 420F"; + choices[0x3190000] = "PowerShot ELPH 110 HS / IXUS 125 HS / IXY 220F"; + choices[0x3200000] = "PowerShot D20"; + choices[0x3210000] = "PowerShot A4000 IS"; + choices[0x3220000] = "PowerShot SX260 HS"; + choices[0x3230000] = "PowerShot SX240 HS"; + choices[0x3240000] = "PowerShot ELPH 530 HS / IXUS 510 HS / IXY 1"; + choices[0x3250000] = "PowerShot ELPH 520 HS / IXUS 500 HS / IXY 3"; + choices[0x3260000] = "PowerShot A3400 IS"; + choices[0x3270000] = "PowerShot A2400 IS"; + choices[0x3280000] = "PowerShot A2300"; + choices[0x3330000] = "PowerShot G15"; + choices[0x3340000] = "PowerShot SX50"; + choices[0x3350000] = "PowerShot SX160 IS"; + choices[0x3360000] = "PowerShot S110 (new)"; + choices[0x3370000] = "PowerShot SX500 IS"; + choices[0x3380000] = "PowerShot N"; + choices[0x3390000] = "IXUS 245 HS / IXY 430F"; + choices[0x3400000] = "PowerShot SX280 HS"; + choices[0x3410000] = "PowerShot SX270 HS"; + choices[0x3420000] = "PowerShot A3500 IS"; + choices[0x3430000] = "PowerShot A2600"; + choices[0x3450000] = "PowerShot A1400"; + choices[0x3460000] = "PowerShot ELPH 130 IS / IXUS 140 / IXY 110F"; + choices[0x3470000] = "PowerShot ELPH 115/120 IS / IXUS 132/135 / IXY 90F/100F"; + choices[0x3490000] = "PowerShot ELPH 330 HS / IXUS 255 HS / IXY 610F"; + choices[0x3510000] = "PowerShot A2500"; choices[0x3540000] = "PowerShot G16"; choices[0x3550000] = "PowerShot S120"; + choices[0x3560000] = "PowerShot SX170 IS"; + choices[0x3580000] = "PowerShot SX510 HS"; + choices[0x3590000] = "PowerShot S200 (new)"; + choices[0x3600000] = "IXY 620F"; + choices[0x3610000] = "PowerShot N100"; + choices[0x3640000] = "PowerShot G1 X Mark II"; + choices[0x3650000] = "PowerShot D30"; + choices[0x3660000] = "PowerShot SX700 HS"; + choices[0x3670000] = "PowerShot SX600 HS"; + choices[0x3680000] = "PowerShot ELPH 140 IS / IXUS 150 / IXY 130"; + choices[0x3690000] = "PowerShot ELPH 135 / IXUS 145 / IXY 120"; + choices[0x3700000] = "PowerShot ELPH 340 HS / IXUS 265 HS / IXY 630"; + choices[0x3710000] = "PowerShot ELPH 150 IS / IXUS 155 / IXY 140"; + choices[0x3740000] = "EOS M3"; + choices[0x3750000] = "PowerShot SX60 HS"; + choices[0x3760000] = "PowerShot SX520 HS"; + choices[0x3770000] = "PowerShot SX400 IS"; + choices[0x3780000] = "PowerShot G7 X"; + choices[0x3790000] = "PowerShot N2"; + choices[0x3800000] = "PowerShot SX530 HS"; + choices[0x3820000] = "PowerShot SX710 HS"; + choices[0x3830000] = "PowerShot SX610 HS"; + choices[0x3840000] = "EOS M10"; + choices[0x3850000] = "PowerShot G3 X"; + choices[0x3860000] = "PowerShot ELPH 165 HS / IXUS 165 / IXY 160"; + choices[0x3870000] = "PowerShot ELPH 160 / IXUS 160"; + choices[0x3880000] = "PowerShot ELPH 350 HS / IXUS 275 HS / IXY 640"; + choices[0x3890000] = "PowerShot ELPH 170 IS / IXUS 170"; + choices[0x3910000] = "PowerShot SX410 IS"; + choices[0x3930000] = "PowerShot G9 X"; + choices[0x3950000] = "PowerShot G5 X"; + choices[0x3970000] = "PowerShot G7 X Mark II"; + choices[0x3990000] = "PowerShot ELPH 360 HS / IXUS 285 HS / IXY 650"; + choices[0x4010000] = "PowerShot SX540 HS"; + choices[0x4020000] = "PowerShot SX420 IS"; + choices[0x4030000] = "PowerShot ELPH 190 IS / IXUS 180 / IXY 190"; choices[0x4040000] = "PowerShot G1"; + choices[0x4040001] = "IXY 180"; + choices[0x4050000] = "PowerShot SX720 HS"; choices[0x6040000] = "PowerShot S100 / Digital IXUS / IXY Digital"; - choices[0x4007d673] = "DC19 / DC21 / DC22"; + choices[0x4007d673] = "DC19/DC21/DC22"; choices[0x4007d674] = "XH A1"; choices[0x4007d675] = "HV10"; - choices[0x4007d676] = "MD130 / MD140 / MD150 / MD160"; - choices[0x4007d777] = "iVIS DC50"; - choices[0x4007d778] = "iVIS HV20"; + choices[0x4007d676] = "MD130/MD140/MD150/MD160/ZR850"; + choices[0x4007d777] = "DC50"; + choices[0x4007d778] = "HV20"; choices[0x4007d779] = "DC211"; choices[0x4007d77a] = "HG10"; - choices[0x4007d77b] = "iVIS HR10"; + choices[0x4007d77b] = "HR10"; + choices[0x4007d77d] = "MD255/ZR950"; + choices[0x4007d81c] = "HF11"; choices[0x4007d878] = "HV30"; - choices[0x4007d87e] = "DC301 / DC310 / DC311 / DC320 / DC330"; + choices[0x4007d87c] = "XH A1S"; + choices[0x4007d87e] = "DC301/DC310/DC311/DC320/DC330"; choices[0x4007d87f] = "FS100"; - choices[0x4007d880] = "iVIS HF10"; - choices[0x4007d882] = "HG20 / HG21 / VIXIA HG21"; - choices[0x4007d925] = "LEGRIA HF21"; - choices[0x4007d978] = "LEGRIA HV40"; - choices[0x4007d987] = "DC410 / DC420"; - choices[0x4007d988] = "LEGRIA FS19 / FS20 / FS21 / FS22 / FS200"; - choices[0x4007d989] = "LEGRIA HF20 / HF200"; - choices[0x4007d98a] = "VIXIA HF S10 / S100"; - choices[0x4007da8e] = "LEGRIA HF R16 / R17 / R106"; - choices[0x4007da90] = "LEGRIA HF S21 / VIXIA HF S200"; - choices[0x4007da92] = "LEGRIA FS36 / FS305 / FS306 / FS307"; + choices[0x4007d880] = "HF10"; + choices[0x4007d882] = "HG20/HG21"; + choices[0x4007d925] = "HF21"; + choices[0x4007d926] = "HF S11"; + choices[0x4007d978] = "HV40"; + choices[0x4007d987] = "DC410/DC411/DC420"; + choices[0x4007d988] = "FS19/FS20/FS21/FS22/FS200"; + choices[0x4007d989] = "HF20/HF200"; + choices[0x4007d98a] = "HF S10/S100"; + choices[0x4007da8e] = "HF R10/R16/R17/R18/R100/R106"; + choices[0x4007da8f] = "HF M30/M31/M36/M300/M306"; + choices[0x4007da90] = "HF S20/S21/S200"; + choices[0x4007da92] = "FS31/FS36/FS37/FS300/FS305/FS306/FS307"; + choices[0x4007dda9] = "HF G25"; + choices[0x4007dfb4] = "XC10"; choices[0x80000001] = "EOS-1D"; choices[0x80000167] = "EOS-1DS"; choices[0x80000168] = "EOS 10D"; @@ -1554,19 +1707,44 @@ public: choices[0x80000213] = "EOS 5D"; choices[0x80000215] = "EOS-1Ds Mark III"; choices[0x80000218] = "EOS 5D Mark II"; + choices[0x80000219] = "WFT-E1"; choices[0x80000232] = "EOS-1D Mark II N"; choices[0x80000234] = "EOS 30D"; choices[0x80000236] = "EOS Digital Rebel XTi / 400D / Kiss Digital X"; + choices[0x80000241] = "WFT-E2"; + choices[0x80000246] = "WFT-E3"; choices[0x80000250] = "EOS 7D"; choices[0x80000252] = "EOS Rebel T1i / 500D / Kiss X3"; choices[0x80000254] = "EOS Rebel XS / 1000D / Kiss F"; choices[0x80000261] = "EOS 50D"; + choices[0x80000269] = "EOS-1D X"; choices[0x80000270] = "EOS Rebel T2i / 550D / Kiss X4"; + choices[0x80000271] = "WFT-E4"; + choices[0x80000273] = "WFT-E5"; choices[0x80000281] = "EOS-1D Mark IV"; choices[0x80000285] = "EOS 5D Mark III"; - choices[0x80000286] = "EOS 600D"; + choices[0x80000286] = "EOS Rebel T3i / 600D / Kiss X5"; choices[0x80000287] = "EOS 60D"; + choices[0x80000288] = "EOS Rebel T3 / 1100D / Kiss X50"; + choices[0x80000289] = "EOS 7D Mark II"; + choices[0x80000297] = "WFT-E2 II"; + choices[0x80000298] = "WFT-E4 II"; + choices[0x80000301] = "EOS Rebel T4i / 650D / Kiss X6i"; + choices[0x80000302] = "EOS 6D"; + choices[0x80000324] = "EOS-1D C"; choices[0x80000325] = "EOS 70D"; + choices[0x80000326] = "EOS Rebel T5i / 700D / Kiss X7i"; + choices[0x80000327] = "EOS Rebel T5 / 1200D / Kiss X70"; + choices[0x80000328] = "EOS-1D X MARK II"; + choices[0x80000331] = "EOS M"; + choices[0x80000346] = "EOS Rebel SL1 / 100D / Kiss X7"; + choices[0x80000347] = "EOS Rebel T6s / 760D / 8000D"; + choices[0x80000350] = "EOS 80D"; + choices[0x80000355] = "EOS M2"; + choices[0x80000382] = "EOS 5DS"; + choices[0x80000393] = "EOS Rebel T6i / 750D / Kiss X8i"; + choices[0x80000401] = "EOS 5DS R"; + choices[0x80000404] = "EOS Rebel T6 / 1300D / Kiss X80"; } }; CAModelIDInterpreter caModelIDInterpreter; @@ -1594,6 +1772,7 @@ public: choices[1] = "1:1"; choices[2] = "4:3"; choices[7] = "16:9"; + choices[8] = "4:5"; } }; From 42e6b56c43f364f826246d2e426ab422fa118ef3 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 19:09:36 +0200 Subject: [PATCH 129/232] Updated all Fuji interpreters. --- rtexif/fujiattribs.cc | 84 +++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/rtexif/fujiattribs.cc b/rtexif/fujiattribs.cc index 456559175..311e47ad6 100644 --- a/rtexif/fujiattribs.cc +++ b/rtexif/fujiattribs.cc @@ -68,6 +68,7 @@ public: choices[0x304] = "Living Room Warm White Fluorescent"; choices[0x400] = "Incandescent"; choices[0x500] = "Flash"; + choices[0x600] = "Underwater"; choices[0xf00] = "Custom"; choices[0xf01] = "Custom2"; choices[0xf02] = "Custom3"; @@ -89,6 +90,11 @@ public: choices[0x180] = "Medium Low"; choices[0x200] = "Low"; choices[0x300] = "None (B&W)"; + choices[0x301] = "B&W Red Filter"; + choices[0x302] = "B&W Yellow Filter"; + choices[0x303] = "B&W Green Filter"; + choices[0x310] = "B&W Sepia"; + choices[0x400] = "Low 2"; choices[0x8000] = "Film Simulation"; } }; @@ -126,8 +132,9 @@ class FANoiseReductionInterpreter : public ChoiceInterpreter public: FANoiseReductionInterpreter () { - choices[0x40] = "Low"; - choices[0x80] = "Normal"; + choices[0x40] = "Low"; + choices[0x80] = "Normal"; + choices[0x100] = "n/a"; } }; FANoiseReductionInterpreter faNoiseReductionInterpreter; @@ -135,6 +142,7 @@ FANoiseReductionInterpreter faNoiseReductionInterpreter; class FAFlashInterpreter : public ChoiceInterpreter { public: + // FujiFlashMode FAFlashInterpreter () { choices[0] = "Auto"; @@ -185,14 +193,17 @@ class FAFilmModeInterpreter : public ChoiceInterpreter public: FAFilmModeInterpreter () { - choices[0] = "F0/Standard"; - choices[0x100] = "F1/Studio Portrait"; - choices[0x110] = "F1a/Studio Portrait Enhanced Saturation"; - choices[0x120] = "F1b/Studio Portrait Smooth Skin Tone"; - choices[0x130] = "F1c/Studio Portrait Increased Sharpness "; - choices[0x200] = "F2/Fujichrome"; - choices[0x300] = "F3/Studio Portrait Ex"; - choices[0x400] = "F4/Velvia"; + choices[0x0] = "F0/Standard (Provia)"; + choices[0x100] = "F1/Studio Portrait"; + choices[0x110] = "F1a/Studio Portrait Enhanced Saturation"; + choices[0x120] = "F1b/Studio Portrait Smooth Skin Tone (Astia)"; + choices[0x130] = "F1c/Studio Portrait Increased Sharpness"; + choices[0x200] = "F2/Fujichrome (Velvia)"; + choices[0x300] = "F3/Studio Portrait Ex"; + choices[0x400] = "F4/Velvia"; + choices[0x500] = "Pro Neg. Std"; + choices[0x501] = "Pro Neg. Hi"; + choices[0x600] = "Classic Chrome"; } }; FAFilmModeInterpreter faFilmModeInterpreter; @@ -200,10 +211,11 @@ FAFilmModeInterpreter faFilmModeInterpreter; class FADRSettingInterpreter : public ChoiceInterpreter { public: + // DynamicRangeSetting FADRSettingInterpreter () { - choices[0] = "Auto (100-400%)"; - choices[0x1] = "RAW"; + choices[0x0] = "Auto (100-400%)"; + choices[0x1] = "Manual"; choices[0x100] = "Standard (100%)"; choices[0x200] = "Wide1 (230%)"; choices[0x201] = "Wide2 (400%)"; @@ -217,25 +229,35 @@ class FAPictureModeInterpreter : public ChoiceInterpreter public: FAPictureModeInterpreter () { - choices[0] = "Auto"; - choices[1] = "Portrait"; - choices[2] = "Landscape"; - choices[3] = "Macro"; - choices[4] = "Sports"; - choices[5] = "Night Scene"; - choices[6] = "Program AE"; - choices[7] = "Natural Light"; - choices[8] = "Anti-blur"; - choices[9] = "Beach & Snow"; - choices[10] = "Sunset"; - choices[11] = "Museum"; - choices[12] = "Party"; - choices[13] = "Flower"; - choices[14] = "Text"; - choices[15] = "Natural Light & Flash"; - choices[16] = "Beach"; - choices[17] = "Fireworks"; - choices[18] = "Underwater"; + choices[0x0] = "Auto"; + choices[0x1] = "Portrait"; + choices[0x2] = "Landscape"; + choices[0x3] = "Macro"; + choices[0x4] = "Sports"; + choices[0x5] = "Night Scene"; + choices[0x6] = "Program AE"; + choices[0x7] = "Natural Light"; + choices[0x8] = "Anti-blur"; + choices[0x9] = "Beach & Snow"; + choices[0xa] = "Sunset"; + choices[0xb] = "Museum"; + choices[0xc] = "Party"; + choices[0xd] = "Flower"; + choices[0xe] = "Text"; + choices[0xf] = "Natural Light & Flash"; + choices[0x10] = "Beach"; + choices[0x11] = "Snow"; + choices[0x12] = "Fireworks"; + choices[0x13] = "Underwater"; + choices[0x14] = "Portrait with Skin Correction"; + choices[0x16] = "Panorama"; + choices[0x17] = "Night (tripod)"; + choices[0x18] = "Pro Low-light"; + choices[0x19] = "Pro Focus"; + choices[0x1a] = "Portrait 2"; + choices[0x1b] = "Dog Face Detection"; + choices[0x1c] = "Cat Face Detection"; + choices[0x40] = "Advanced Filter"; choices[0x100] = "Aperture-priority AE"; choices[0x200] = "Shutter speed priority AE"; choices[0x300] = "Manual"; From 67a4d2af44e44afa92739672758023287983890d Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 19:26:38 +0200 Subject: [PATCH 130/232] Updated all Nikon interpreters. --- rtexif/nikonattribs.cc | 60 +++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index db55725fa..38f4ce1f0 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -161,11 +161,12 @@ class NAFlashModeInterpreter : public ChoiceInterpreter public: NAFlashModeInterpreter () { - choices[0] = "Did Not Fire"; - choices[1] = "Fired, Manual"; - choices[7] = "Fired, External"; - choices[8] = "Fired, Commander Mode"; - choices[9] = "Fired, TTL Mode"; + choices[0x0] = "Did Not Fire"; + choices[0x1] = "Fired, Manual"; + choices[0x3] = "Not Ready"; + choices[0x7] = "Fired, External"; + choices[0x8] = "Fired, Commander Mode"; + choices[0x9] = "Fired, TTL Mode"; } }; NAFlashModeInterpreter naFlashModeInterpreter; @@ -173,13 +174,16 @@ NAFlashModeInterpreter naFlashModeInterpreter; class NAHiISONRInterpreter : public ChoiceInterpreter { public: + // HighISONoiseReduction NAHiISONRInterpreter () { - choices[0] = "Off"; - choices[1] = "Minimal"; - choices[2] = "Low"; - choices[4] = "Normal"; - choices[6] = "High"; + choices[0x0] = "Off"; + choices[0x1] = "Minimal"; + choices[0x2] = "Low"; + choices[0x3] = "Medium Low"; + choices[0x4] = "Normal"; + choices[0x5] = "Medium High"; + choices[0x6] = "High"; } }; NAHiISONRInterpreter naHiISONRInterpreter; @@ -209,25 +213,27 @@ class NAAFInfoInterpreter : public Interpreter std::map amchoices; std::map afpchoices; public: + // AFAreaMode NAAFInfoInterpreter () { - amchoices[0] = "Single Area"; - amchoices[1] = "Dynamic Area"; - amchoices[2] = "Dynamic Area, Closest Subject"; - amchoices[3] = "Group Dynamic"; - amchoices[4] = "Single Area (wide)"; - amchoices[5] = "Dynamic Area (wide)"; - afpchoices[0] = "Center"; - afpchoices[1] = "Top"; - afpchoices[2] = "Bottom"; - afpchoices[3] = "Left"; - afpchoices[4] = "Right"; - afpchoices[5] = "Upper-left"; - afpchoices[6] = "Upper-right"; - afpchoices[7] = "Lower-left"; - afpchoices[8] = "Lower-right"; - afpchoices[9] = "Far Left"; - afpchoices[10] = "Far Right"; + amchoices[0x0] = "Single Area"; + amchoices[0x1] = "Dynamic Area"; + amchoices[0x2] = "Dynamic Area (closest subject)"; + amchoices[0x3] = "Group Dynamic"; + amchoices[0x4] = "Single Area (wide)"; + amchoices[0x5] = "Dynamic Area (wide)"; + // AFPoint + afpchoices[0x0] = "Center"; + afpchoices[0x1] = "Top"; + afpchoices[0x2] = "Bottom"; + afpchoices[0x3] = "Mid-left"; + afpchoices[0x4] = "Mid-right"; + afpchoices[0x5] = "Upper-left"; + afpchoices[0x6] = "Upper-right"; + afpchoices[0x7] = "Lower-left"; + afpchoices[0x8] = "Lower-right"; + afpchoices[0x9] = "Far Left"; + afpchoices[0xa] = "Far Right"; } virtual std::string toString (Tag* t) { From 3866f10d6917085e1db3157301c202892bd5203f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 19:46:15 +0200 Subject: [PATCH 131/232] Updated all Olympus interpreters. --- rtexif/olympusattribs.cc | 63 ++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index 608b04cfe..35e390b88 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -269,22 +269,28 @@ public: OLWhitebalance2Interpreter () { choices[0] = "Auto"; + choices[1] = "Auto (Keep Warm Color Off)"; choices[16] = "7500K (Fine Weather with Shade)"; choices[17] = "6000K (Cloudy)"; choices[18] = "5300K (Fine Weather)"; choices[20] = "3000K (Tungsten light)"; choices[21] = "3600K (Tungsten light-like)"; + choices[22] = "Auto Setup"; + choices[23] = "5500K (Flash)"; choices[33] = "6600K (Daylight fluorescent)"; choices[34] = "4500K (Neutral white fluorescent)"; choices[35] = "4000K (Cool white fluorescent)"; + choices[36] = "White Fluorescent"; choices[48] = "3600K (Tungsten light-like)"; - choices[256] = "Custom WB 1"; - choices[257] = "Custom WB 2"; - choices[258] = "Custom WB 3"; - choices[259] = "Custom WB 4"; - choices[512] = "Custom WB 5400K"; - choices[513] = "Custom WB 2900K"; - choices[514] = "Custom WB 8000K"; + choices[67] = "Underwater"; + choices[256] = "One Touch WB 1"; + choices[257] = "One Touch WB 2"; + choices[258] = "One Touch WB 3"; + choices[259] = "One Touch WB 4"; + choices[512] = "Custom WB 1"; + choices[513] = "Custom WB 2"; + choices[514] = "Custom WB 3"; + choices[515] = "Custom WB 4"; } }; OLWhitebalance2Interpreter olWhitebalance2Interpreter; @@ -310,6 +316,7 @@ public: choices[18] = "Indoor"; choices[19] = "Fireworks"; choices[20] = "Sunset"; + choices[21] = "Beauty Skin"; choices[22] = "Macro"; choices[23] = "Super Macro"; choices[24] = "Food"; @@ -339,6 +346,17 @@ public: choices[48] = "Nature Macro"; choices[49] = "Underwater Snapshot"; choices[50] = "Shooting Guide"; + choices[54] = "Face Portrait"; + choices[57] = "Bulb"; + choices[59] = "Smile Shot"; + choices[60] = "Quick Shutter"; + choices[63] = "Slow Shutter"; + choices[64] = "Bird Watching"; + choices[65] = "Multiple Exposure"; + choices[66] = "e-Portrait"; + choices[67] = "Soft Background Shot"; + choices[142] = "Hand-held Starlight"; + choices[154] = "HDR"; } }; OLSceneModeInterpreter olSceneModeInterpreter; @@ -382,6 +400,7 @@ public: choices[2] = "HQ"; choices[3] = "SHQ"; choices[4] = "RAW"; + choices[5] = "SQ (5)"; } }; OLImageQuality2Interpreter olImageQuality2Interpreter; @@ -389,6 +408,7 @@ OLImageQuality2Interpreter olImageQuality2Interpreter; class OLDevEngineInterpreter : public ChoiceInterpreter { public: + // RawDevEngine OLDevEngineInterpreter () { choices[0] = "High Speed"; @@ -408,6 +428,14 @@ public: choices[2] = "Natural"; choices[3] = "Muted"; choices[4] = "Portrait"; + choices[5] = "i-Enhance"; + choices[7] = "Color Creator"; + choices[9] = "Color Profile 1"; + choices[10] = "Color Profile 2"; + choices[11] = "Color Profile 3"; + choices[12] = "Monochrome Profile 1"; + choices[13] = "Monochrome Profile 2"; + choices[14] = "Monochrome Profile 3"; choices[256] = "Monotone"; choices[512] = "Sepia"; } @@ -480,7 +508,8 @@ public: int a = t->toInt (); str << "Noise Reduction = " << ((a & 1) ? "On" : "Off") << std::endl; str << "Noise Filter = " << ((a & 2) ? "On" : "Off") << std::endl; - str << "Noise Filter (ISO Boost) = " << ((a & 4) ? "On" : "Off"); + str << "Noise Filter (ISO Boost) = " << ((a & 4) ? "On" : "Off") << std::endl; + str << "Auto = " << ((a & 8) ? "On" : "Off"); return str.str(); } }; @@ -491,14 +520,16 @@ class OLFlashModelInterpreter : public ChoiceInterpreter public: OLFlashModelInterpreter () { - choices[0] = "None"; - choices[1] = "FL-20"; - choices[2] = "FL-50"; - choices[3] = "RF-11"; - choices[4] = "TF-22"; - choices[5] = "FL-36"; - choices[6] = "FL-50R"; - choices[7] = "FL-36R"; + choices[0] = "None"; + choices[1] = "FL-20"; + choices[2] = "FL-50"; + choices[3] = "RF-11"; + choices[4] = "TF-22"; + choices[5] = "FL-36"; + choices[6] = "FL-50R"; + choices[7] = "FL-36R"; + choices[9] = "FL-14"; + choices[11] = "FL-600R"; } }; OLFlashModelInterpreter olFlashModelInterpreter; From ec66a380bd903cf9c46a8b40a0992add6d803691 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 21:32:44 +0200 Subject: [PATCH 132/232] Updated all Pentax interpreters. --- rtexif/pentaxattribs.cc | 437 ++++++++++++++++++++++------------------ 1 file changed, 244 insertions(+), 193 deletions(-) diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index d350a1c92..91a508244 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -36,12 +36,14 @@ class PAQualityInterpreter : public ChoiceInterpreter public: PAQualityInterpreter () { - choices[0] = "Good"; - choices[1] = "Better"; - choices[2] = "Best"; - choices[3] = "TIFF"; - choices[4] = "RAW"; - choices[5] = "Premium"; + choices[0] = "Good"; + choices[1] = "Better"; + choices[2] = "Best"; + choices[3] = "TIFF"; + choices[4] = "RAW"; + choices[5] = "Premium"; + choices[7] = "RAW (pixel shift enabled)"; + choices[65535] = "n/a"; } }; PAQualityInterpreter paQualityInterpreter; @@ -79,6 +81,7 @@ PAShakeReductionInterpreter paShakeReductionInterpreter; class PAShakeReduction2Interpreter : public ChoiceInterpreter { public: + // ShakeReduction PAShakeReduction2Interpreter () { choices[ 0] = "Off"; @@ -144,7 +147,15 @@ public: choices[59] = "Report"; choices[60] = "Kids"; choices[61] = "Blur Reduction"; + choices[63] = "Panorama 2"; choices[65] = "Half-length Portrait"; + choices[66] = "Portrait 2"; + choices[74] = "Digital Microscope"; + choices[75] = "Blue Sky"; + choices[80] = "Miniature"; + choices[81] = "HDR"; + choices[83] = "Fisheye"; + choices[85] = "Digital Filter 4"; choices[221] = "P"; choices[255] = "PICT"; } @@ -156,14 +167,14 @@ class PASceneModeInterpreter : public ChoiceInterpreter public: PASceneModeInterpreter () { - choices[ 0] = "Off"; - choices[ 1] = "HDR"; - choices[ 4] = "Auto PICT"; - choices[ 5] = "Portrait"; - choices[ 6] = "Landscape"; - choices[ 7] = "Macro"; - choices[ 8] = "Sport"; - choices[ 9] = "Night Scene Portrait"; + choices[0] = "Off"; + choices[1] = "HDR"; + choices[4] = "Auto PICT"; + choices[5] = "Portrait"; + choices[6] = "Landscape"; + choices[7] = "Macro"; + choices[8] = "Sport"; + choices[9] = "Night Scene Portrait"; choices[10] = "No Flash"; choices[11] = "Night Scene"; choices[12] = "Surf & Snow"; @@ -188,25 +199,25 @@ class PAAEProgramModeInterpreter : public ChoiceInterpreter public: PAAEProgramModeInterpreter () { - choices[ 0] = "M, P or TAv"; - choices[ 1] = "Av, B or X"; - choices[ 2] = "Tv"; - choices[ 3] = "Sv or Green Mode"; - choices[ 8] = "Hi-speed Program"; - choices[ 11] = "Hi-speed Program (P-Shift)"; - choices[ 16] = "DOF Program"; - choices[ 19] = "DOF Program (P-Shift)"; - choices[ 24] = "MTF Program"; - choices[ 27] = "MTF Program (P-Shift)"; - choices[ 35] = "Standard"; - choices[ 43] = "Portrait"; - choices[ 51] = "Landscape"; - choices[ 59] = "Macro"; - choices[ 67] = "Sport"; - choices[ 75] = "Night Scene Portrait"; - choices[ 83] = "No Flash"; - choices[ 91] = "Night Scene"; - choices[ 99] = "Surf & Snow"; + choices[0] = "M, P or TAv"; + choices[1] = "Av, B or X"; + choices[2] = "Tv"; + choices[3] = "Sv or Green Mode"; + choices[8] = "Hi-speed Program"; + choices[11] = "Hi-speed Program (P-Shift)"; + choices[16] = "DOF Program"; + choices[19] = "DOF Program (P-Shift)"; + choices[24] = "MTF Program"; + choices[27] = "MTF Program (P-Shift)"; + choices[35] = "Standard"; + choices[43] = "Portrait"; + choices[51] = "Landscape"; + choices[59] = "Macro"; + choices[67] = "Sport"; + choices[75] = "Night Scene Portrait"; + choices[83] = "No Flash"; + choices[91] = "Night Scene"; + choices[99] = "Surf & Snow"; choices[104] = "Night Snap"; choices[107] = "Text"; choices[115] = "Sunset"; @@ -227,20 +238,21 @@ class PAFlashModeInterpreter : public ChoiceInterpreter public: PAFlashModeInterpreter () { - choices[0x0] = "Auto, Did not fire"; - choices[0x1] = "Off"; - choices[0x2] = "On, Did not fire"; - choices[0x3] = "Auto, Did not fire, Red-eye reduction"; - choices[0x100] = "Auto, Fired"; - choices[0x102] = "On"; - choices[0x103] = "Auto, Fired, Red-eye reduction"; - choices[0x104] = "On, Red-eye reduction"; - choices[0x105] = "On, Wireless (Master)"; - choices[0x106] = "On, Wireless (Control)"; - choices[0x108] = "On, Soft"; - choices[0x109] = "On, Slow-sync"; - choices[0x10a] = "On, Slow-sync, Red-eye reduction"; - choices[0x10b] = "On, Trailing-curtain Sync"; + choices[0] = "Auto, Did not fire"; + choices[1] = "Off, Did not fire"; + choices[2] = "On, Did not fire"; + choices[3] = "Auto, Did not fire, Red-eye reduction"; + choices[5] = "On, Did not fire, Wireless (Master)"; + choices[256] = "Auto, Fired"; + choices[258] = "On, Fired"; + choices[259] = "Auto, Fired, Red-eye reduction"; + choices[260] = "On, Red-eye reduction"; + choices[261] = "On, Wireless (Master)"; + choices[262] = "On, Wireless (Control)"; + choices[264] = "On, Soft"; + choices[265] = "On, Slow-sync"; + choices[266] = "On, Slow-sync, Red-eye reduction"; + choices[267] = "On, Trailing-curtain Sync"; } }; PAFlashModeInterpreter paFlashModeInterpreter; @@ -256,9 +268,15 @@ public: choices[3] = "Manual"; choices[4] = "Super Macro"; choices[5] = "Pan Focus"; - choices[16] = "AF-S"; - choices[17] = "AF-C"; - choices[18] = "AF-A"; + choices[16] = "AF-S (Focus-priority)"; + choices[17] = "AF-C (Focus-priority)"; + choices[18] = "AF-A (Focus-priority)"; + choices[32] = "Contrast-detect (Focus-priority)"; + choices[33] = "Tracking Contrast-detect (Focus-priority)"; + choices[272] = "AF-S (Release-priority)"; + choices[273] = "AF-C (Release-priority)"; + choices[274] = "AF-A (Release-priority)"; + choices[288] = "Contrast-detect (Release-priority)"; } }; PAFocusModeInterpreter paFocusModeInterpreter; @@ -266,8 +284,10 @@ PAFocusModeInterpreter paFocusModeInterpreter; class PAAFPointInterpreter : public ChoiceInterpreter { public: + // AFPointSelected PAAFPointInterpreter () { + choices[0] = "None"; choices[1] = "Upper-left"; choices[2] = "Top"; choices[3] = "Upper-right"; @@ -279,7 +299,8 @@ public: choices[9] = "Lower-left"; choices[10] = "Bottom"; choices[11] = "Lower-right"; - choices[65532] = "Face Recognition AF"; + choices[65531] = "AF Select"; + choices[65532] = "Face Detect AF"; choices[65533] = "Automatic Tracking AF"; choices[65534] = "Fixed Center"; choices[65535] = "Auto"; @@ -290,19 +311,20 @@ PAAFPointInterpreter paAFPointInterpreter; class PAAFFocusInterpreter : public ChoiceInterpreter { public: + // AFPointsInFocus PAAFFocusInterpreter () { - choices[0x0] = "Fixed Center or Multiple"; - choices[0x1] = "Top-left"; - choices[0x2] = "Top-center"; - choices[0x3] = "Top-right"; - choices[0x4] = "Left"; - choices[0x5] = "Center"; - choices[0x6] = "Right"; - choices[0x7] = "Bottom-left"; - choices[0x8] = "Bottom-center"; - choices[0x9] = "Bottom-right"; - choices[0xffff] = "None"; + choices[0] = "Fixed Center or Multiple"; + choices[1] = "Top-left"; + choices[2] = "Top-center"; + choices[3] = "Top-right"; + choices[4] = "Left"; + choices[5] = "Center"; + choices[6] = "Right"; + choices[7] = "Bottom-left"; + choices[8] = "Bottom-center"; + choices[9] = "Bottom-right"; + choices[65535] = "None"; } }; PAAFFocusInterpreter paAFFocusInterpreter; @@ -343,15 +365,15 @@ public: choices[31] = "32000"; choices[32] = "40000"; choices[33] = "51200"; - + choices[34] = "64000"; + choices[35] = "80000"; + choices[36] = "102400"; + choices[37] = "128000"; + choices[38] = "160000"; + choices[39] = "204800"; choices[50] = "50"; choices[100] = "100"; choices[200] = "200"; - /*choices[400] = "400"; - choices[800] = "800"; - choices[1600] = "1600"; - choices[3200] = "3200"; Moved to tail for sorting reasons */ - choices[258] = "50"; choices[259] = "70"; choices[260] = "100"; @@ -373,14 +395,10 @@ public: choices[276] = "25600"; choices[277] = "36000"; choices[278] = "51200"; - choices[400] = "400"; choices[800] = "800"; choices[1600] = "1600"; choices[3200] = "3200"; - - //choices[65534] = "Auto"; ?? - //choices[65535] = "Auto"; ?? } }; PAISOInterpreter paISOInterpreter; @@ -437,7 +455,7 @@ public: choices[15] = "Color Temperature Enhancement"; choices[17] = "Kelvin"; choices[65534] = "Unknown"; - choices[65535] = "User Selected"; + choices[65535] = "User-Selected"; } }; PAWhiteBalanceInterpreter paWhiteBalanceInterpreter; @@ -451,11 +469,11 @@ public: choices[2] = "Auto (Shade)"; choices[3] = "Auto (Flash)"; choices[4] = "Auto (Tungsten)"; - choices[6] = "Auto (DaylightFluorescent)"; - choices[7] = "Auto (DaywhiteFluorescent)"; - choices[8] = "Auto (WhiteFluorescent)"; + choices[6] = "Auto (Daylight Fluorescent)"; + choices[7] = "Auto (Day White Fluorescent)"; + choices[8] = "Auto (White Fluorescent)"; choices[10] = "Auto (Cloudy)"; - choices[65534] = "Preset (Fireworks?)"; + choices[65534] = "Unknown"; choices[65535] = "User-Selected"; } }; @@ -466,13 +484,16 @@ class PASaturationInterpreter : public ChoiceInterpreter public: PASaturationInterpreter () { - choices[0] = "Low"; - choices[1] = "Normal"; - choices[2] = "High"; - choices[3] = "Med Low"; - choices[4] = "Med High"; - choices[5] = "Very Low"; - choices[6] = "Very High"; + choices[0] = "-2 (low)"; + choices[1] = "0 (normal)"; + choices[2] = "+2 (high)"; + choices[3] = "-1 (med low)"; + choices[4] = "+1 (med high)"; + choices[5] = "-3 (very low)"; + choices[6] = "+3 (very high)"; + choices[7] = "-4 (minimum)"; + choices[8] = "+4 (maximum)"; + choices[65535] = "None"; } }; PASaturationInterpreter paSaturationInterpreter; @@ -482,13 +503,16 @@ class PAContrastInterpreter : public ChoiceInterpreter public: PAContrastInterpreter () { - choices[0] = "Low"; - choices[1] = "Normal"; - choices[2] = "High"; - choices[3] = "Med Low"; - choices[4] = "Med High"; - choices[5] = "Very Low"; - choices[6] = "Very High"; + choices[0] = "-2 (low)"; + choices[1] = "0 (normal)"; + choices[2] = "+2 (high)"; + choices[3] = "-1 (med low)"; + choices[4] = "+1 (med high)"; + choices[5] = "-3 (very low)"; + choices[6] = "+3 (very high)"; + choices[7] = "-4 (minimum)"; + choices[8] = "+4 (maximum)"; + choices[65535] = "n/a"; } }; PAContrastInterpreter paContrastInterpreter; @@ -498,13 +522,15 @@ class PASharpnessInterpreter : public ChoiceInterpreter public: PASharpnessInterpreter () { - choices[0] = "Soft"; - choices[1] = "Normal"; - choices[2] = "Hard"; - choices[3] = "Med Soft"; - choices[4] = "Med Hard"; - choices[5] = "Very Soft"; - choices[6] = "Very Hard"; + choices[0] = "-2 (soft)"; + choices[1] = "0 (normal)"; + choices[2] = "+2 (hard)"; + choices[3] = "-1 (med soft)"; + choices[4] = "+1 (med hard)"; + choices[5] = "-3 (very soft)"; + choices[6] = "+3 (very hard)"; + choices[7] = "-4 (minimum)"; + choices[8] = "+4 (maximum)"; } }; PASharpnessInterpreter paSharpnessInterpreter; @@ -514,51 +540,67 @@ class PAPictureModeInterpreter2: public ChoiceInterpreter public: PAPictureModeInterpreter2() { - choices[ 0] = "Program"; - choices[ 1] = "Hi-speed Program"; - choices[ 2] = "DOF Program"; - choices[ 3] = "MTF Program"; - choices[ 4] = "Standard"; - choices[ 5] = "Portrait"; - choices[ 6] = "Landscape"; - choices[ 7] = "Macro"; - choices[ 8] = "Sport "; - choices[ 9] = "Night Scene Portrait "; - choices[10] = "No Flash"; - choices[11] = "Night Scene"; - choices[12] = "Surf & Snow"; - choices[13] = "Text"; - choices[14] = "Sunset"; - choices[15] = "Kids"; - choices[16] = "Pet"; - choices[17] = "Candlelight"; - choices[18] = "Museum"; - choices[19] = "Food "; - choices[20] = "Stage Lighting"; - choices[21] = "Night Snap"; - choices[256 + 4] = "Auto PICT"; - choices[256 + 5] = "Auto PICT (Portrait)"; - choices[256 + 6] = "Auto PICT (Landscape)"; - choices[256 + 7] = "Auto PICT (Macro)"; - choices[256 + 8] = "Auto PICT (Sport)"; - choices[256 + 8] = "Auto PICT (Sport)"; - choices[512 + 0] = "Program (HyP)"; - choices[512 + 1] = "Hi-speed Program (HyP)"; - choices[512 + 2] = "DOF Program (HyP)"; - choices[512 + 3] = "MTF Program (HyP)"; - choices[3 * 256] = "Green Mode"; - choices[4 * 256] = "Shutter Speed Priority"; - choices[5 * 256] = "Aperture Priority"; - choices[6 * 256] = "Program Tv Shift"; - choices[7 * 256] = "Program Av Shift"; - choices[8 * 256] = "Manual"; - choices[9 * 256] = "Bulb"; - choices[10 * 256] = "Aperture Priority, Off-Auto-Aperture"; - choices[11 * 256] = "Manual, Off-Auto-Aperture"; - choices[12 * 256] = "Bulb, Off-Auto-Aperture"; - choices[13 * 256] = "Shutter & Aperture Priority AE"; - choices[15 * 256] = "Sensitivity Priority AE"; - choices[16 * 256] = "Flash X-Sync Speed AE"; + choices[256 * 0 + 0] = "Program"; + choices[256 * 0 + 1] = "Hi-speed Program"; + choices[256 * 0 + 2] = "DOF Program"; + choices[256 * 0 + 3] = "MTF Program"; + choices[256 * 0 + 4] = "Standard"; + choices[256 * 0 + 5] = "Portrait"; + choices[256 * 0 + 6] = "Landscape"; + choices[256 * 0 + 7] = "Macro"; + choices[256 * 0 + 8] = "Sport"; + choices[256 * 0 + 9] = "Night Scene Portrait"; + choices[256 * 0 + 10] = "No Flash"; + choices[256 * 0 + 11] = "Night Scene"; + choices[256 * 0 + 12] = "Surf & Snow"; + choices[256 * 0 + 13] = "Text"; + choices[256 * 0 + 14] = "Sunset"; + choices[256 * 0 + 15] = "Kids"; + choices[256 * 0 + 16] = "Pet"; + choices[256 * 0 + 17] = "Candlelight"; + choices[256 * 0 + 18] = "Museum"; + choices[256 * 0 + 19] = "Food"; + choices[256 * 0 + 20] = "Stage Lighting"; + choices[256 * 0 + 21] = "Night Snap"; + choices[256 * 0 + 23] = "Blue Sky"; + choices[256 * 0 + 24] = "Sunset"; + choices[256 * 0 + 26] = "Night Scene HDR"; + choices[256 * 0 + 27] = "HDR"; + choices[256 * 0 + 28] = "Quick Macro"; + choices[256 * 0 + 29] = "Forest"; + choices[256 * 0 + 30] = "Backlight Silhouette"; + choices[256 * 1 + 4] = "Auto PICT (Standard)"; + choices[256 * 1 + 5] = "Auto PICT (Portrait)"; + choices[256 * 1 + 6] = "Auto PICT (Landscape)"; + choices[256 * 1 + 7] = "Auto PICT (Macro)"; + choices[256 * 1 + 8] = "Auto PICT (Sport)"; + choices[256 * 2 + 0] = "Program (HyP)"; + choices[256 * 2 + 1] = "Hi-speed Program (HyP)"; + choices[256 * 2 + 2] = "DOF Program (HyP)"; + choices[256 * 2 + 3] = "MTF Program (HyP)"; + choices[256 * 2 + 22] = "Shallow DOF (HyP)"; + choices[256 * 3 + 0] = "Green Mode"; + choices[256 * 4 + 0] = "Shutter Speed Priority"; + choices[256 * 5 + 0] = "Aperture Priority"; + choices[256 * 6 + 0] = "Program Tv Shift"; + choices[256 * 7 + 0] = "Program Av Shift"; + choices[256 * 8 + 0] = "Manual"; + choices[256 * 9 + 0] = "Bulb"; + choices[256 * 10 + 0] = "Aperture Priority, Off-Auto-Aperture"; + choices[256 * 11 + 0] = "Manual, Off-Auto-Aperture"; + choices[256 * 12 + 0] = "Bulb, Off-Auto-Aperture"; + choices[256 * 13 + 0] = "Shutter & Aperture Priority AE"; + choices[256 * 15 + 0] = "Sensitivity Priority AE"; + choices[256 * 16 + 0] = "Flash X-Sync Speed AE"; + choices[256 * 18 + 0] = "Auto Program (Normal)"; + choices[256 * 18 + 1] = "Auto Program (Hi-speed)"; + choices[256 * 18 + 2] = "Auto Program (DOF)"; + choices[256 * 18 + 3] = "Auto Program (MTF)"; + choices[256 * 18 + 22] = "Auto Program (Shallow DOF)"; + choices[256 * 20 + 22] = "Blur Control"; + choices[256 * 254 + 0] = "Video"; + choices[256 * 255 + 0] = "Video (Auto Aperture)"; + choices[256 * 255 + 4] = "Video (4)"; } virtual std::string toString (Tag* t) { @@ -1025,12 +1067,15 @@ PASRResultInterpreter paSRResultInterpreter; class PAHighISONoiseInterpreter: public ChoiceInterpreter { public: + // HighISONoiseReduction PAHighISONoiseInterpreter() { choices[0] = "Off"; choices[1] = "Weakest"; choices[2] = "Weak"; choices[3] = "Strong"; + choices[4] = "Medium"; + choices[255] = "Auto"; } }; PAHighISONoiseInterpreter paHighISONoiseInterpreter; @@ -1178,9 +1223,9 @@ public: choices1[1] = "Auto-align On"; choices2[0] = "n/a"; - choices2[1] = "1 EV"; - choices2[2] = "2 EV"; - choices2[4] = "3 EV"; + choices2[4] = "1 EV"; + choices2[8] = "2 EV"; + choices2[12] = "3 EV"; } virtual std::string toString (Tag* t) { @@ -1536,11 +1581,13 @@ class PAFlashStatusInterpreter: public ChoiceInterpreter public: PAFlashStatusInterpreter() { - choices[0x0] = "Off"; - choices[0x2] = "External, Did not fire"; - choices[0x6] = "External, Fired"; - choices[0x9] = "Internal, Did not fire"; - choices[0xd] = "Internal, Fired"; + choices[0] = "Off"; + choices[1] = "Off (1)"; + choices[2] = "External, Did not fire"; + choices[6] = "External, Fired"; + choices[8] = "Internal, Did not fire (0x08)"; + choices[9] = "Internal, Did not fire"; + choices[13] = "Internal, Fired"; } }; PAFlashStatusInterpreter paFlashStatusInterpreter; @@ -1550,26 +1597,27 @@ class PAInternalFlashModeInterpreter: public ChoiceInterpreter public: PAInternalFlashModeInterpreter() { - choices[0x0] = "n/a - Off-Auto-Aperture"; - choices[0x86] = "On, Wireless (Control)"; - choices[0x95] = "On, Wireless (Master)"; - choices[0xc0] = "On"; - choices[0xc1] = "On, Red-eye reduction"; - choices[0xc2] = "On, Auto"; - choices[0xc3] = "On, Auto, Red-eye reduction"; - choices[0xc8] = "On, Slow-sync"; - choices[0xc9] = "On, Slow-sync, Red-eye reduction"; - choices[0xca] = "On, Trailing-curtain Sync"; - choices[0xf0] = "Off, Normal"; - choices[0xf1] = "Off, Red-eye reduction"; - choices[0xf2] = "Off, Auto"; - choices[0xf3] = "Off, Auto, Red-eye reduction"; - choices[0xf4] = "Off, (Unknown 0xf4)"; - choices[0xf5] = "Off, Wireless (Master)"; - choices[0xf6] = "Off, Wireless (Control)"; - choices[0xf8] = "Off, Slow-sync"; - choices[0xf9] = "Off, Slow-sync, Red-eye reduction"; - choices[0xfa] = "Off, Trailing-curtain Sync"; + choices[0] = "n/a - Off-Auto-Aperture"; + choices[134] = "Fired, Wireless (Control)"; + choices[149] = "Fired, Wireless (Master)"; + choices[192] = "Fired"; + choices[193] = "Fired, Red-eye reduction"; + choices[194] = "Fired, Auto"; + choices[195] = "Fired, Auto, Red-eye reduction"; + choices[198] = "Fired, Wireless (Control), Fired normally not as control"; + choices[200] = "Fired, Slow-sync"; + choices[201] = "Fired, Slow-sync, Red-eye reduction"; + choices[202] = "Fired, Trailing-curtain Sync"; + choices[240] = "Did not fire, Normal"; + choices[241] = "Did not fire, Red-eye reduction"; + choices[242] = "Did not fire, Auto"; + choices[243] = "Did not fire, Auto, Red-eye reduction"; + choices[244] = "Did not fire, (Unknown 0xf4)"; + choices[245] = "Did not fire, Wireless (Master)"; + choices[246] = "Did not fire, Wireless (Control)"; + choices[248] = "Did not fire, Slow-sync"; + choices[249] = "Did not fire, Slow-sync, Red-eye reduction"; + choices[250] = "Did not fire, Trailing-curtain Sync"; } }; PAInternalFlashModeInterpreter paInternalFlashModeInterpreter; @@ -1579,16 +1627,17 @@ class PAExternalFlashModeInterpreter: public ChoiceInterpreter public: PAExternalFlashModeInterpreter() { - choices[0x0 ] = "n/a - Off-Auto-Aperture"; - choices[0x3f] = "Off"; - choices[0x40] = "On, Auto"; - choices[0xbf] = "On, Flash Problem"; - choices[0xc0] = "On, Manual"; - choices[0xc4] = "On, P-TTL Auto"; - choices[0xc5] = "On, Contrast-control Sync"; - choices[0xc6] = "On, High-speed Sync"; - choices[0xcc] = "On, Wireless"; - choices[0xcd] = "On, Wireless, High-speed Sync"; + choices[0] = "n/a - Off-Auto-Aperture"; + choices[63] = "Off"; + choices[64] = "On, Auto"; + choices[191] = "On, Flash Problem"; + choices[192] = "On, Manual"; + choices[196] = "On, P-TTL Auto"; + choices[197] = "On, Contrast-control Sync"; + choices[198] = "On, High-speed Sync"; + choices[204] = "On, Wireless"; + choices[205] = "On, Wireless, High-speed Sync"; + choices[240] = "Not Connected"; } }; PAExternalFlashModeInterpreter paExternalFlashModeInterpreter; @@ -1606,9 +1655,9 @@ public: choices[171] = "-1.5"; choices[172] = "-1.0"; choices[175] = "-0.5"; - choices[176] = "0"; - choices[179] = "+0.5"; - choices[180] = "+1.0"; + choices[176] = "0.0"; + choices[179] = "0.5"; + choices[180] = "1.0"; } }; PAExternalFlashExposureCompInterpreter paExternalFlashExposureCompInterpreter; @@ -1701,15 +1750,15 @@ class PAFlashOptionInterpreter: public ChoiceInterpreter public: PAFlashOptionInterpreter() { - choices[0x0] = "Normal"; - choices[0x1] = "Red-eye reduction"; - choices[0x2] = "Auto"; - choices[0x3] = "Auto, Red-eye reduction"; - choices[0x5] = "Wireless (Master)"; - choices[0x6] = "Wireless (Control)"; - choices[0x8] = "Slow-sync"; - choices[0x9] = "Slow-sync, Red-eye reduction"; - choices[0xa] = "Trailing-curtain Sync"; + choices[0] = "Normal"; + choices[1] = "Red-eye reduction"; + choices[2] = "Auto"; + choices[3] = "Auto, Red-eye reduction"; + choices[5] = "Wireless (Master)"; + choices[6] = "Wireless (Control)"; + choices[8] = "Slow-sync"; + choices[9] = "Slow-sync, Red-eye reduction"; + choices[10] = "Trailing-curtain Sync"; } virtual std::string toString (Tag* t) { @@ -1891,6 +1940,8 @@ public: return "Single-frame"; } else if( c & 0x01) { return "Continuous"; + } else if( c & 0x02) { + return "Continuous (Lo)"; } else if( c & 0x04) { return "Self-timer (12 s)"; } else if( c & 0x08) { From fe49c851ff922286a2fcfc69df7c6ae9d905d64a Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 1 Jul 2016 22:57:44 +0200 Subject: [PATCH 133/232] Updated all Sony and Konica Minolta interpreters. --- rtexif/sonyminoltaattribs.cc | 233 +++++++++++++++++++++-------------- 1 file changed, 140 insertions(+), 93 deletions(-) diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index c3f1d3355..a0d280df1 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -314,6 +314,7 @@ public: choices[0x50] = "Flash"; choices[0x60] = "Fluorescent"; choices[0x70] = "Custom"; + choices[0x80] = "Underwater"; } }; SAWhiteBalanceInterpreter saWhiteBalanceInterpreter; @@ -383,23 +384,31 @@ class SASceneModeInterpreter : public ChoiceInterpreter public: SASceneModeInterpreter () { - choices[0] = "Normal (P,A,S or M)"; + choices[0] = "Standard"; choices[1] = "Portrait"; choices[2] = "Text"; choices[3] = "Night Scene"; choices[4] = "Sunset"; choices[5] = "Sports"; choices[6] = "Landscape"; + choices[7] = "Night Portrait"; choices[8] = "Macro"; choices[9] = "Super Macro"; choices[16] = "Auto"; - choices[17] = "Night Portrait"; + choices[17] = "Night View/Portrait"; choices[18] = "Sweep Panorama"; choices[19] = "Handheld Night Shot"; choices[20] = "Anti Motion Blur"; - choices[21] = "Cont.Priority AE"; + choices[21] = "Cont. Priority AE"; choices[22] = "Auto+"; choices[23] = "3D Sweep Panorama"; + choices[24] = "Superior Auto"; + choices[25] = "High Sensitivity"; + choices[26] = "Fireworks"; + choices[27] = "Food"; + choices[28] = "Pet"; + choices[33] = "HDR"; + choices[65535] = "n/a"; } }; SASceneModeInterpreter saSceneModeInterpreter; @@ -449,14 +458,14 @@ public: choices[2] = "Portrait"; choices[3] = "Landscape"; choices[4] = "Sunset"; - choices[5] = "Night Scene"; + choices[5] = "Night View/Portrait"; choices[6] = "B&W"; choices[7] = "Adobe RGB"; choices[12] = "Neutral"; choices[13] = "Clear"; choices[14] = "Deep"; choices[15] = "Light"; - choices[16] = "Autumn"; + choices[16] = "Autumn Leaves"; choices[17] = "Sepia"; choices[100] = "Neutral"; choices[101] = "Clear"; @@ -473,18 +482,19 @@ class SAExposureModeInterpreter : public ChoiceInterpreter public: SAExposureModeInterpreter () { - choices[0] = "Auto"; + choices[0] = "Program AE"; choices[1] = "Portrait"; choices[2] = "Beach"; + choices[3] = "Sports"; choices[4] = "Snow"; choices[5] = "Landscape"; - choices[6] = "Program"; - choices[7] = "Aperture Priority"; - choices[8] = "Shutter Priority"; - choices[9] = "Night Scene"; + choices[6] = "Auto"; + choices[7] = "Aperture-priority AE"; + choices[8] = "Shutter speed priority AE"; + choices[9] = "Night Scene / Twilight"; choices[10] = "Hi-Speed Shutter"; choices[11] = "Twilight Portrait"; - choices[12] = "Soft Snap"; + choices[12] = "Soft Snap/Portrait"; choices[13] = "Fireworks"; choices[14] = "Smile Shutter"; choices[15] = "Manual"; @@ -492,13 +502,17 @@ public: choices[19] = "Macro"; choices[20] = "Advanced Sports Shooting"; choices[29] = "Underwater"; - choices[33] = "Gourmet"; - choices[34] = "Panorama"; - choices[35] = "Handheld Twilight"; + choices[33] = "Food"; + choices[34] = "Sweep Panorama"; + choices[35] = "Handheld Night Shot"; choices[36] = "Anti Motion Blur"; choices[37] = "Pet"; choices[38] = "Backlight Correction HDR"; + choices[39] = "Superior Auto"; choices[40] = "Background Defocus"; + choices[41] = "Soft Skin"; + choices[42] = "3D Image"; + choices[65535] = "n/a"; } }; SAExposureModeInterpreter saExposureModeInterpreter; @@ -1181,11 +1195,15 @@ class MATeleconverterInterpreter : public ChoiceInterpreter public: MATeleconverterInterpreter () { - choices[0] = "None "; - choices[0x48] = "Minolta AF 2x APO (D)"; - choices[0x50] = "Minolta AF 2x APO II"; - choices[0x88] = "Minolta AF 1.4x APO (D)"; - choices[0x90] = "Minolta AF 1.4x APO II"; + choices[0x0] = "None"; + choices[0x4] = "Minolta/Sony AF 1.4x APO (D) (0x04)"; + choices[0x5] = "Minolta/Sony AF 2x APO (D) (0x05)"; + choices[0x48] = "Minolta/Sony AF 2x APO (D)"; + choices[0x50] = "Minolta AF 2x APO II"; + choices[0x60] = "Minolta AF 2x APO"; + choices[0x88] = "Minolta/Sony AF 1.4x APO (D)"; + choices[0x90] = "Minolta AF 1.4x APO II"; + choices[0xa0] = "Minolta AF 1.4x APO"; } }; MATeleconverterInterpreter maTeleconverterInterpreter; @@ -1195,15 +1213,15 @@ class MAQualityInterpreter : public ChoiceInterpreter public: MAQualityInterpreter () { - choices[0] = "Raw"; - choices[1] = "Super Fine"; - choices[2] = "Fine"; - choices[3] = "Standard"; - choices[4] = "Economy"; - choices[5] = "Extra fine"; - choices[6] = "RAW + JPEG"; - choices[7] = "cRAW"; - choices[8] = "cRAW + JPEG"; + choices[0] = "RAW"; + choices[1] = "Super Fine"; + choices[2] = "Fine"; + choices[3] = "Standard"; + choices[4] = "Economy"; + choices[5] = "Extra Fine"; + choices[6] = "RAW + JPEG"; + choices[7] = "Compressed RAW"; + choices[8] = "Compressed RAW + JPEG"; } }; MAQualityInterpreter maQualityInterpreter; @@ -1257,14 +1275,19 @@ class SADriveMode : public ChoiceInterpreter public: SADriveMode () { - choices[0] = "Single Frame"; - choices[1] = "Continuous High"; + choices[1] = "Single Frame"; + choices[2] = "Continuous High"; choices[4] = "Self-timer 10 sec"; - choices[5] = "Self-timer 2 sec"; + choices[5] = "Self-timer 2 sec, Mirror Lock-up"; + choices[6] = "Single-frame Bracketing"; choices[7] = "Continuous Bracketing"; - choices[12] = "Continuous Low"; - choices[18] = "White Balance Bracketing Low"; - choices[19] = "D-Range Optimizer Bracketing Low"; + choices[10] = "Remote Commander"; + choices[11] = "Mirror Lock-up"; + choices[18] = "Continuous Low"; + choices[24] = "White Balance Bracketing Low"; + choices[25] = "D-Range Optimizer Bracketing Low"; + choices[40] = "White Balance Bracketing High"; + choices[41] = "D-Range Optimizer Bracketing High"; } }; SADriveMode saDriveMode; @@ -1274,7 +1297,7 @@ class SADriveMode2 : public ChoiceInterpreter public: SADriveMode2 () { - choices[0] = "Single Frame"; + choices[1] = "Single Frame"; choices[2] = "Continuous High"; choices[4] = "Self-timer 10 sec"; choices[5] = "Self-timer 2 sec, Mirror Lock-up"; @@ -1290,23 +1313,23 @@ class SADriveMode3 : public ChoiceInterpreter public: SADriveMode3 () { - choices[0x10] = "Single Frame"; - choices[0x21] = "Continuous High"; - choices[0x22] = "Continuous Low"; - choices[0x30] = "Speed Priority Continuous"; - choices[0x51] = "Self-timer 10 sec"; - choices[0x52] = "Self-timer 2 sec, Mirror Lock-up"; - choices[0x71] = "Continuous Bracketing 0.3 EV"; - choices[0x75] = "Continuous Bracketing 0.7 EV"; - choices[0x91] = "White Balance Bracketing Low"; - choices[0x92] = "White Balance Bracketing High"; - choices[0xC0] = "Remote Commander"; - choices[0xD1] = "Continuous - HDR"; - choices[0xD2] = "Continuous - Multi Frame NR"; - choices[0xD3] = "Continuous - Handheld Night Shot"; - choices[0xD4] = "Continuous - Anti Motion Blur"; - choices[0xD5] = "Continuous - Sweep Panorama"; - choices[0xD6] = "Continuous - 3D Sweep Panorama"; + choices[16] = "Single Frame"; + choices[33] = "Continuous High"; + choices[34] = "Continuous Low"; + choices[48] = "Speed Priority Continuous"; + choices[81] = "Self-timer 10 sec"; + choices[82] = "Self-timer 2 sec, Mirror Lock-up"; + choices[113] = "Continuous Bracketing 0.3 EV"; + choices[117] = "Continuous Bracketing 0.7 EV"; + choices[145] = "White Balance Bracketing Low"; + choices[146] = "White Balance Bracketing High"; + choices[192] = "Remote Commander"; + choices[209] = "Continuous - HDR"; + choices[210] = "Continuous - Multi Frame NR"; + choices[211] = "Continuous - Handheld Night Shot"; + choices[212] = "Continuous - Anti Motion Blur"; + choices[213] = "Continuous - Sweep Panorama"; + choices[214] = "Continuous - 3D Sweep Panorama"; } }; SADriveMode3 saDriveMode3; @@ -1366,8 +1389,8 @@ public: choices[3] = "Spot AF"; choices[4] = "Flexible Spot AF"; choices[6] = "Touch AF"; - choices[14] = "Manual Focus"; - choices[15] = "Face Detected"; + choices[14] = "Tracking"; + choices[15] = "Face Tracking"; choices[65535] = "n/a"; } }; @@ -1670,27 +1693,27 @@ class SAExposureProgram2: public ChoiceInterpreter public: SAExposureProgram2 () { - choices[1] = "Program AE"; - choices[2] = "Aperture-priority AE"; - choices[3] = "Shutter speed priority AE"; - choices[4] = "Manual"; - choices[5] = "Cont. Priority AE"; - choices[16] = "Auto"; - choices[17] = "Auto (no flash)"; - choices[18] = "Auto+"; - choices[49] = "Portrait"; - choices[50] = "Landscape"; - choices[51] = "Macro"; - choices[52] = "Sports"; - choices[53] = "Sunset"; - choices[54] = "Night view"; - choices[55] = "Night view/portrait"; - choices[56] = "Handheld Night Shot"; - choices[57] = "3D Sweep Panorama"; - choices[64] = "Auto 2"; - choices[65] = "Auto 2 (no flash)"; - choices[80] = "Sweep Panorama"; - choices[96] = "Anti Motion Blur"; + choices[1] = "Program AE"; + choices[2] = "Aperture-priority AE"; + choices[3] = "Shutter speed priority AE"; + choices[4] = "Manual"; + choices[5] = "Cont. Priority AE"; + choices[16] = "Auto"; + choices[17] = "Auto (no flash)"; + choices[18] = "Auto+"; + choices[49] = "Portrait"; + choices[50] = "Landscape"; + choices[51] = "Macro"; + choices[52] = "Sports"; + choices[53] = "Sunset"; + choices[54] = "Night view"; + choices[55] = "Night view/portrait"; + choices[56] = "Handheld Night Shot"; + choices[57] = "3D Sweep Panorama"; + choices[64] = "Auto 2"; + choices[65] = "Auto 2 (no flash)"; + choices[80] = "Sweep Panorama"; + choices[96] = "Anti Motion Blur"; choices[128] = "Toy Camera"; choices[129] = "Pop Color"; choices[130] = "Posterization"; @@ -1831,9 +1854,10 @@ public: SAReleaseModeInterpreter () { choices[0] = "Normal"; - choices[2] = "Burst"; + choices[2] = "Continuous"; choices[5] = "Exposure Bracketing"; choices[6] = "White Balance Bracketing"; + choices[8] = "DRO Bracketing"; choices[65535] = "n/a"; } }; @@ -1846,11 +1870,19 @@ public: { choices[1] = "Standard"; choices[2] = "Vivid"; + choices[3] = "Portrait"; + choices[4] = "Landscape"; + choices[5] = "Sunset"; + choices[7] = "Night View/Portrait"; + choices[8] = "B&W"; choices[9] = "Adobe RGB"; choices[11] = "Neutral"; choices[129] = "StyleBox1"; choices[130] = "StyleBox2"; choices[131] = "StyleBox3"; + choices[132] = "StyleBox4"; + choices[133] = "StyleBox5"; + choices[134] = "StyleBox6"; } }; SAImageStyleInterpreter saImageStyleInterpreter; @@ -1860,27 +1892,42 @@ class SAPictureEffectInterpreter: public ChoiceInterpreter public: SAPictureEffectInterpreter() { - choices[0] = "Off"; - choices[1] = "Toy Camera"; - choices[2] = "Pop Color"; - choices[3] = "Posterization"; - choices[4] = "Posterization B/W"; - choices[5] = "Retro Photo"; - choices[6] = "Soft High Key"; - choices[7] = "Partial Color Red"; - choices[8] = "Partial Color Green"; - choices[9] = "Partial Color Blue"; - choices[10] = "Partial Color Yellow"; + choices[0] = "Off"; + choices[1] = "Toy Camera"; + choices[2] = "Pop Color"; + choices[3] = "Posterization"; + choices[4] = "Posterization B/W"; + choices[5] = "Retro Photo"; + choices[6] = "Soft High Key"; + choices[7] = "Partial Color (red)"; + choices[8] = "Partial Color (green)"; + choices[9] = "Partial Color (blue)"; + choices[10] = "Partial Color (yellow)"; choices[13] = "High Contrast Monochrome"; - choices[16] = "Toy Camera 2"; + choices[16] = "Toy Camera (normal)"; + choices[17] = "Toy Camera (cool)"; + choices[18] = "Toy Camera (warm)"; + choices[19] = "Toy Camera (green)"; + choices[20] = "Toy Camera (magenta)"; + choices[32] = "Soft Focus (low)"; choices[33] = "Soft Focus"; - choices[48] = "Miniature"; - choices[50] = "Miniature 2"; - choices[51] = "Miniature 3"; + choices[34] = "Soft Focus (high)"; + choices[48] = "Miniature (auto)"; + choices[49] = "Miniature (top)"; + choices[50] = "Miniature (middle horizontal)"; + choices[51] = "Miniature (bottom)"; + choices[52] = "Miniature (left)"; + choices[53] = "Miniature (middle vertical)"; + choices[54] = "Miniature (right)"; + choices[64] = "HDR Painting (low)"; choices[65] = "HDR Painting"; + choices[66] = "HDR Painting (high)"; choices[80] = "Rich-tone Monochrome"; - choices[98] = "Water Color"; - choices[114] = "Illustration"; + choices[97] = "Water Color"; + choices[98] = "Water Color 2"; + choices[112] = "Illustration (low)"; + choices[113] = "Illustration"; + choices[114] = "Illustration (high)"; } }; SAPictureEffectInterpreter saPictureEffectInterpreter; From 2710bcdcecf7bd00bea8082b2df3ae9dc28adfef Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 2 Jul 2016 23:03:58 +0200 Subject: [PATCH 134/232] Fix a warning and a crash --- rtengine/imageio.cc | 2 +- rtgui/batchqueue.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 3ad8faee0..f8edfdd58 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1227,7 +1227,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } // buffer for the exif and iptc - int bufferSize = 165535; //TODO: Is it really 165535... or 65535 ? + int bufferSize = 175535; //TODO: Is it really 165535... or 65535 ? if(profileData) { bufferSize += profileLength; diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 7856b72a0..5d91b6ee9 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -370,7 +370,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename timeval tv; gettimeofday(&tv, 0); char mseconds[4]; - sprintf(mseconds, "%d", tv.tv_usec / 1000); + sprintf(mseconds, "%d", (int)(tv.tv_usec / 1000)); time_t rawtime; struct tm *timeinfo; char stringTimestamp [80]; From 87e1914b9db503d1083f55d9a2ac8b8997b1139a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 3 Jul 2016 16:06:07 +0200 Subject: [PATCH 135/232] Fix buffer overrun writing uncompressed tiff --- rtengine/imageio.cc | 21 +++++++++------------ rtexif/rtexif.cc | 18 ++++++++++-------- rtexif/rtexif.h | 2 +- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index f8edfdd58..93c650afe 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1227,22 +1227,17 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } // buffer for the exif and iptc - int bufferSize = 175535; //TODO: Is it really 165535... or 65535 ? - - if(profileData) { - bufferSize += profileLength; - } - - unsigned char* buffer = new unsigned char[bufferSize]; - unsigned char* iptcdata = NULL; + unsigned int bufferSize; + unsigned char* buffer = nullptr; // buffer will be allocated in createTIFFHeader + unsigned char* iptcdata = nullptr; unsigned int iptclen = 0; if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { iptc_data_free_buf (iptc, iptcdata); - iptcdata = NULL; + iptcdata = nullptr; } - int size = rtexif::ExifManager::createTIFFHeader (exifRoot, exifChange, width, height, bps, profileData, profileLength, (char*)iptcdata, iptclen, buffer); + int size = rtexif::ExifManager::createTIFFHeader (exifRoot, exifChange, width, height, bps, profileData, profileLength, (char*)iptcdata, iptclen, buffer, bufferSize); if (iptcdata) { iptc_data_free_buf (iptc, iptcdata); @@ -1250,7 +1245,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // The maximum lenght is strangely not the same than for the JPEG file... // Which maximum length is the good one ? - if (size > 0 && size < bufferSize) { + if (size > 0 && size <= bufferSize) { fwrite (buffer, size, 1, file); } @@ -1277,7 +1272,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } } - delete [] buffer; + if(buffer) { + delete [] buffer; + } if (ferror(file)) { writeOk = false; diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index f61d90c08..f9b2739d7 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -2864,7 +2864,7 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::pro return size + 6; } -int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer) +int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize) { // write tiff header @@ -2875,13 +2875,6 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro order = root->getOrder (); } - sset2 ((unsigned short)order, buffer + offs, order); - offs += 2; - sset2 (42, buffer + offs, order); - offs += 2; - sset4 (8, buffer + offs, order); - offs += 4; - TagDirectory* cl; if (root) { @@ -2956,6 +2949,15 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro } cl->sort (); + bufferSize = cl->calculateSize() + 8; + buffer = new unsigned char[bufferSize]; // this has to be deleted in caller + sset2 ((unsigned short)order, buffer + offs, order); + offs += 2; + sset2 (42, buffer + offs, order); + offs += 2; + sset4 (8, buffer + offs, order); + offs += 4; + int endOffs = cl->write (8, buffer); // cl->printAll(); diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 471f9fbe3..a8d7088d2 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -318,7 +318,7 @@ public: /// @return The ownership of the return tags is passed to the caller. static std::vector getDefaultTIFFTags (TagDirectory* forthis); static int createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer); - static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char* buffer); + static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); }; class Interpreter From bc3023e228cf56468d37bea06e60b21d6db06c83 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 3 Jul 2016 21:18:57 +0200 Subject: [PATCH 136/232] Add RT version to 'Software' tag for uncompressed tiff --- rtexif/rtexif.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index f9b2739d7..a46a37952 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -2792,6 +2792,9 @@ TagDirectory* ExifManager::parseTIFF (FILE* f, bool skipIgnored) std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) { + Glib::ustring rtVersion("RawTherapee "); + rtVersion += VERSION; + std::vector defTags; defTags.reserve (12); @@ -2800,7 +2803,7 @@ std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "XResolution"), 300, RATIONAL)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "YResolution"), 300, RATIONAL)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "ResolutionUnit"), 2, SHORT)); - defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), "RawTherapee")); + defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), rtVersion.c_str())); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Orientation"), 1, SHORT)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "SamplesPerPixel"), 3, SHORT)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "BitsPerSample"), 8, SHORT)); From 90c7407c90fa0e9fed8026531663fd12746c193f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 4 Jul 2016 19:25:59 +0200 Subject: [PATCH 137/232] Disable wrong warning for non Windows builds --- rtgui/main.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/main.cc b/rtgui/main.cc index 4a4511f34..cc64af257 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -264,7 +264,9 @@ int main(int argc, char **argv) if (argc > 1 || options.rtSettings.verbose) { // printing RT's version in all case, particularly useful for the 'verbose' mode, but also for the batch processing std::cout << "RawTherapee, version " << VERSION << std::endl; +#ifdef WIN32 std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl; +#endif if (argc > 1) { int ret = processLineParams( argc, argv); From 1a0b96b22380b36a6c6496ab183d956c7479524b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 4 Jul 2016 19:28:04 +0200 Subject: [PATCH 138/232] Remove some top level tags when saving to uncompressed tiff, also simplified generation of 'Software' tag --- rtengine/imageio.cc | 4 +--- rtexif/rtexif.cc | 11 ++++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 93c650afe..8d436ad6c 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1347,9 +1347,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } - Glib::ustring rtVersion("RawTherapee "); - rtVersion += VERSION; - TIFFSetField (out, TIFFTAG_SOFTWARE, rtVersion.c_str()); + TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " VERSION); TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index a46a37952..1cdc2d89c 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -2792,8 +2792,6 @@ TagDirectory* ExifManager::parseTIFF (FILE* f, bool skipIgnored) std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) { - Glib::ustring rtVersion("RawTherapee "); - rtVersion += VERSION; std::vector defTags; @@ -2803,7 +2801,7 @@ std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "XResolution"), 300, RATIONAL)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "YResolution"), 300, RATIONAL)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "ResolutionUnit"), 2, SHORT)); - defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), rtVersion.c_str())); + defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Software"), "RawTherapee " VERSION)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "Orientation"), 1, SHORT)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "SamplesPerPixel"), 3, SHORT)); defTags.push_back (new Tag (forthis, lookupAttrib(ifdAttribs, "BitsPerSample"), 8, SHORT)); @@ -2882,6 +2880,13 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro if (root) { cl = (const_cast(root))->clone (NULL); + // remove some unknown top level tags which produce warnings when opening a tiff + Tag *removeTag = cl->getTag(0x9003); + if(removeTag) + removeTag->setKeep(false); + removeTag = cl->getTag(0x9211); + if(removeTag) + removeTag->setKeep(false); } else { cl = new TagDirectory (NULL, ifdAttribs, HOSTORDER); } From 1bf2f87cdc5a3c08f44b491f4ba741b6b35ddc8f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 5 Jul 2016 15:05:03 +0200 Subject: [PATCH 139/232] Exif lost when saving compressed tiff from raw on windows builds, fixes #3370 --- rtengine/imageio.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 8d436ad6c..9fdfc82fb 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1285,11 +1285,13 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): const char *mode = !exifRoot ? "w" : (exifRoot->getOrder() == rtexif::INTEL ? "wl" : "wb"); #ifdef WIN32 - wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); - TIFF* out = TIFFOpenW (wfilename, mode); - g_free (wfilename); + FILE *file = g_fopen_withBinaryAndLock (fname); + int fileno = _fileno(file); + int osfileno = _get_osfhandle(fileno); + TIFF* out = TIFFFdOpen (osfileno, fname.c_str(), mode); #else TIFF* out = TIFFOpen(fname.c_str(), mode); + int fileno = TIFFFileno (out); #endif if (!out) { @@ -1314,7 +1316,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // TIFFOpen writes out the header and sets file pointer at position 8 exif->write (8, buffer); - write (TIFFFileno (out), buffer + 8, exif_size); + + write (fileno, buffer + 8, exif_size); + delete [] buffer; // let libtiff know that scanlines or any other following stuff should go // at a different offset: @@ -1352,7 +1356,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); - TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, height); + TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, height); TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); @@ -1386,6 +1390,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } TIFFClose (out); +#ifdef WIN32 + fclose (file); +#endif } delete [] linebuffer; From a991d53bf3d90703842a34fe4e064a87e1707826 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 5 Jul 2016 16:48:30 +0200 Subject: [PATCH 140/232] Fix segfault when adding files to the currently watched folder, kudos to Floessie for the fix --- rtengine/rtthumbnail.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 3913dc6ba..e8c1cd096 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -176,7 +176,7 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL int err = 1; // see if it is something we support - if ( ri->is_supportedThumb() ) { + if ( ri->is_supportedThumb() && ri->get_thumbOffset() < ri->get_file()->size ) { const char* data((const char*)fdata(ri->get_thumbOffset(), ri->get_file())); if ( (unsigned char)data[1] == 0xd8 ) { From 3d6f9407a2e4cec3cb354950cd22df2ec8ecc13c Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 5 Jul 2016 23:07:58 +0200 Subject: [PATCH 141/232] Updated help and man page, #3369 --- doc/manpage/rawtherapee.1 | 141 +++++++++++++++++--------------------- rtengine/imageio.cc | 2 +- rtgui/main.cc | 100 +++++++++++++++------------ 3 files changed, 119 insertions(+), 124 deletions(-) diff --git a/doc/manpage/rawtherapee.1 b/doc/manpage/rawtherapee.1 index a626fd0bf..bbd2a4f44 100644 --- a/doc/manpage/rawtherapee.1 +++ b/doc/manpage/rawtherapee.1 @@ -1,86 +1,67 @@ -.TH RAWTHERAPEE 1 "July 31, 2012" +.TH RAWTHERAPEE 1 "July 05, 2016" .SH NAME -rawtherapee \- an advanced cross-platform program for developing raw photos. -.SH SYNOPSIS -\fBrawtherapee\fP [directory|image\-file] -.br -\fBrawtherapee\fP [\-o|\-O ] [\-s|\-S] [\-p ] [\-d] -[\-j[1\-100]|\-t|\-t1|\-n] [\-Y] \-c +RawTherapee - An advanced, cross-platform program for developing raw photos. .SH DESCRIPTION -\fBRawTherapee\fP is an advanced program for developing raw photos and for -processing non-raw photos. It is non-destructive, makes use of OpenMP, supports -all the cameras supported by dcraw and carries out its calculations in a high -precision 32bit floating point engine. +\fBRawTherapee\fP is an advanced program for developing raw photos and for processing non-raw photos. It is non-destructive, makes use of OpenMP, supports all the cameras supported by dcraw and more, and carries out its calculations in a high precision 32-bit floating point engine. +.SH LINKS + Website: http://www.rawtherapee.com/ + Documentation: http://rawpedia.rawtherapee.com/ + Forum: https://discuss.pixls.us/c/software/rawtherapee + Code and bug reports: https://github.com/Beep6581/RawTherapee +.SH SYMBOLS + indicate parameters you can change. + [Square brackets] mean the parameter is optional. + The pipe symbol | indicates a choice of one or the other. + The dash symbol - denotes a range of possible values from one to the other. +.SH SYNOPSIS + rawtherapee Start File Browser inside folder. + rawtherapee Start Image Editor with file. + rawtherapee -c

      | Convert files in batch with default parameters. + rawtherapee -c | Convert files in batch with your own settings. + rawtherapee [-o |-O ] [-s|-S] [-p [-p ...] ] [-d] [ -j[1-100] [-js<1-3>] | [-b<8|16>] [-t[z] | [-n]] ] [-Y] -c .SH OPTIONS -.TP -\-o | -select output directory. -.TP -\-O | - select output directory and copy the PP3 file into it. -.TP -\-s -use the PP3 processing profile located next to the input file (which shares -same name as the input file) when building the processing parameters, e.g.: for -IMG001.NEF there should be a IMG001.NEF.pp3 in the same directory. If such a -file is not found, the default values are used. -.TP -\-S -like \-s but skip processing that image if its corresponding PP3 file is not -found. -.TP -\-p -specify a PP3 processing profile to be used for all conversions. You can -specify as many \-p options as you like (see note below). -.TP -\-d -use the default raw or non-raw PP3 file to build the image's parameters -(specified in the options file). -.TP -\-j[1\-100] -specify output to be JPEG (default). The compression value can be in the range -1-100. If none was specified, the default compression value is 90, balanced -subsampling (4:2:2). -.TP -\-t -specify output to be uncompressed 8 bit per channel TIFF. -.TP -\-t1 -specify output to be zip-compressed 8 bit per channel TIFF. -.TP -\-n -specify output to be 8 bit per channel PNG with a compression value of 6. -.TP -\-Y -overwrite output if present. + -c Specify one or more input files. + -c must be the last option. + -o | Set output file or folder. + Saves output file alongside input file if -o is not specified. + -O | Set output file or folder and copy pp3 file into it. + Saves output file alongside input file if -O is not specified. + -s Use the existing sidecar file to build the processing parameters, + e.g. for photo.raw there should be a photo.raw.pp3 file in the same folder. + If the sidecar file does not exist, neutral values will be used. + -S Like -s but skip if the sidecar file does not exist. + -p Specify processing profile to be used for all conversions. + You can specify as many sets of "-p " options as you like, + each will be built on top of the previous one, as explained below. + -d Use the default raw or non-raw processing profile as set in + Preferences > Image Processing > Default Processing Profile + -j[1-100] Specify output to be JPEG (default, if -t and -n are not set). + Optionally, specify compression 1-100 (default value: 92). + -js<1-3> Specify the JPEG chroma subsampling parameter, where: + 1 = Best compression: 2x2, 1x1, 1x1 (4:2:0) + Chroma halved vertically and horizontally. + 2 = Balanced (default): 2x1, 1x1, 1x1 (4:2:2) + Chroma halved horizontally. + 3 = Best quality: 1x1, 1x1, 1x1 (4:4:4) + No chroma subsampling. + -b<8|16> Specify bit depth per channel (default value: 16 for TIFF, 8 for PNG). + Only applies to TIFF and PNG output, JPEG is always 8. + -t[z] Specify output to be TIFF. + Uncompressed by default, or deflate compression with 'z'. + -n Specify output to be compressed PNG. + Compression is hard-coded to 6. + -Y Overwrite output if present. -.P -.B Note: -.br -You can use partial PP3 files, in which case RawTherapee will set the -missing values as follows: -.br - The PP3 file is first built with internal default values; -.br - then overridden by those found in the "default raw" or "default non-raw" photo -profile (if \-d has been set); -.br - then overridden by those found in the PP3 files provided by \-p, each one -overriding the previous values; -.br - then overridden by the sidecar file if \-s is set and if the file exists; -.br - the time when the sidecar file is used depends of the position of the \-s -switch in the command line relative to the \-p parameters -(e.g. "\-p first.pp3 \-p second.pp3 \-s \-p fourth.pp3"). -.SH SEE ALSO -You can find the documentation, including a detailed user manual, on the -project's website: -http://rawtherapee.com/blog/documentation +Your pp3 files can be incomplete, RawTherapee will build the final values as follows: + 1- A new processing profile is created using neutral values, + 2- If the "-d" option is set, the values are overridden by those found in + the default raw or non-raw processing profile. + 3- If one or more "-p" options are set, the values are overridden by those + found in these processing profiles. + 4- If the "-s" or "-S" options are set, the values are finally overridden by those + found in the sidecar files. + The processing profiles are processed in the order specified on the command line. .SH AUTHOR -\fBRawTherapee\fP was originally written by Gabor Horvath of Budapest, -Hungary, before being relicensed as free and open-source software in January -2010 and being maintained by a team of people since. +\fBRawTherapee\fP was originally written by Gabor Horvath of Budapest, Hungary, before being re-licensed as free and open-source software in January 2010. .br -The RawTherapee Development Team comprises of passionate people from all around -the world. +The RawTherapee development team comprises of passionate people from all around the world. diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 9fdfc82fb..aa5c4a6c6 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1082,7 +1082,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) cinfo.comp_info[2].h_samp_factor = cinfo.comp_info[2].v_samp_factor = 1; if (subSamp == 1) { - // Best compression, default of the JPEG library: 2x2, 1x1, 1x1 (4:1:1) + // Best compression, default of the JPEG library: 2x2, 1x1, 1x1 (4:2:0) cinfo.comp_info[0].h_samp_factor = cinfo.comp_info[0].v_samp_factor = 2; } else if (subSamp == 2) { // Widely used normal ratio 2x1, 1x1, 1x1 (4:2:2) diff --git a/rtgui/main.cc b/rtgui/main.cc index cc64af257..114204858 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -581,59 +581,73 @@ int processLineParams( int argc, char **argv ) case '?': default: { Glib::ustring pparamsExt = paramFileExtension.substr(1); - std::cout << " indicate parameters you can change." << std::endl; - std::cout << "[Square brackets] mean the parameter is not mandatory." << std::endl; - std::cout << "The pipe symbol | indicates a choice of one or the other." << std::endl; - std::cout << "The dash symbol - denotes a range of possible values from one to the other." << std::endl; - cout << std::endl; + std::cout << " An advanced, cross-platform program for developing raw photos." << std::endl; + std::cout << std::endl; + std::cout << " Website: http://www.rawtherapee.com/" << std::endl; + std::cout << " Documentation: http://rawpedia.rawtherapee.com/" << std::endl; + std::cout << " Forum: https://discuss.pixls.us/c/software/rawtherapee" << std::endl; + std::cout << " Code and bug reports: https://github.com/Beep6581/RawTherapee" << std::endl; + std::cout << std::endl; + std::cout << "Symbols:" << std::endl; + std::cout << " indicate parameters you can change." << std::endl; + std::cout << " [Square brackets] mean the parameter is optional." << std::endl; + std::cout << " The pipe symbol | indicates a choice of one or the other." << std::endl; + std::cout << " The dash symbol - denotes a range of possible values from one to the other." << std::endl; + std::cout << std::endl; std::cout << "Usage:" << std::endl; - std::cout << " " << Glib::path_get_basename(argv[0]) << " Start File Browser inside directory." << std::endl; + std::cout << " " << Glib::path_get_basename(argv[0]) << " Start File Browser inside folder." << std::endl; std::cout << " " << Glib::path_get_basename(argv[0]) << " Start Image Editor with file." << std::endl; - std::cout << " " << Glib::path_get_basename(argv[0]) << " -c | Convert files in batch with default parameters." << std::endl << std::endl; + std::cout << " " << Glib::path_get_basename(argv[0]) << " -c | Convert files in batch with default parameters." << std::endl; + std::cout << " " << Glib::path_get_basename(argv[0]) << " -c | Convert files in batch with your own settings." << std::endl; + std::cout << std::endl; #ifdef WIN32 std::cout << " -w Do not open the Windows console" << std::endl; + std::cout << std::endl; #endif - std::cout << "Other options used with -c (-c must be the last option):" << std::endl; - std::cout << Glib::path_get_basename(argv[0]) << " [-o |-O ] [-s|-S] [-p ] [-d] [-j[1-100] [-js<1-3>]|[-b<8|16>] <[-t[z] | [-n]]] [-Y] -c " << std::endl; - std::cout << " -o | Select output file or directory." << std::endl; - std::cout << " -O | Select output file or directory and copy " << pparamsExt << " file into it." << std::endl; - std::cout << " -s Include the " << pparamsExt << " file next to the input file (with the same" << std::endl; - std::cout << " name) to build the image parameters," << std::endl; - std::cout << " e.g. for photo.raw there should be a photo.raw." << pparamsExt << " file in" << std::endl; - std::cout << " the same directory. If the file does not exist, internal" << std::endl; - std::cout << " default (neutral) values (not those in Default." << pparamsExt << ") will be" << std::endl; - std::cout << " used." << std::endl; - std::cout << " -S Like -s but skip if the " << pparamsExt << " file does not exist." << std::endl; - std::cout << " -p Specify " << pparamsExt << " file to be used for all conversions." << std::endl; - std::cout << " You can specify as many -p options as you like (see" << std::endl; - std::cout << " description below)." << std::endl; - std::cout << " -d Use the default raw or non-raw " << pparamsExt << " file as set in" << std::endl; + std::cout << "Options:" << std::endl; + std::cout << " " << Glib::path_get_basename(argv[0]) << " [-o |-O ] [-s|-S] [-p [-p ...] ] [-d] [ -j[1-100] [-js<1-3>] | [-b<8|16>] [-t[z] | [-n]] ] [-Y] -c " << std::endl; + std::cout << std::endl; + std::cout << " -c Specify one or more input files." << std::endl; + std::cout << " -c must be the last option." << std::endl; + std::cout << " -o | Set output file or folder." << std::endl; + std::cout << " Saves output file alongside input file if -o is not specified." << std::endl; + std::cout << " -O | Set output file or folder and copy " << pparamsExt << " file into it." << std::endl; + std::cout << " Saves output file alongside input file if -O is not specified." << std::endl; + std::cout << " -s Use the existing sidecar file to build the processing parameters," << std::endl; + std::cout << " e.g. for photo.raw there should be a photo.raw." << pparamsExt << " file in the same folder." << std::endl; + std::cout << " If the sidecar file does not exist, neutral values will be used." << std::endl; + std::cout << " -S Like -s but skip if the sidecar file does not exist." << std::endl; + std::cout << " -p Specify processing profile to be used for all conversions." << std::endl; + std::cout << " You can specify as many sets of \"-p \" options as you like," << std::endl; + std::cout << " each will be built on top of the previous one, as explained below." << std::endl; + std::cout << " -d Use the default raw or non-raw processing profile as set in" << std::endl; std::cout << " Preferences > Image Processing > Default Processing Profile" << std::endl; - std::cout << " -j[1-100] Specify output to be JPEG (on by default). Optionally add" << std::endl; - std::cout << " compression 1-100 (default value: 92)." << std::endl; + std::cout << " -j[1-100] Specify output to be JPEG (default, if -t and -n are not set)." << std::endl; + std::cout << " Optionally, specify compression 1-100 (default value: 92)." << std::endl; std::cout << " -js<1-3> Specify the JPEG chroma subsampling parameter, where:" << std::endl; - std::cout << " 1 = Best compression: 2x2, 1x1, 1x1 (4:2:0)" << std::endl; + std::cout << " 1 = Best compression: 2x2, 1x1, 1x1 (4:2:0)" << std::endl; std::cout << " Chroma halved vertically and horizontally." << std::endl; - std::cout << " 2 = Balanced: 2x1, 1x1, 1x1 (4:2:2)" << std::endl; + std::cout << " 2 = Balanced (default): 2x1, 1x1, 1x1 (4:2:2)" << std::endl; std::cout << " Chroma halved horizontally." << std::endl; - std::cout << " 3 = Best quality: 1x1, 1x1, 1x1 (4:4:4)" << std::endl; + std::cout << " 3 = Best quality: 1x1, 1x1, 1x1 (4:4:4)" << std::endl; std::cout << " No chroma subsampling." << std::endl; - std::cout << " -b<8|16> Specify bit depth per channel (only applies to TIFF and PNG output)." << std::endl; - std::cout << " -t[z] Specify output to be TIFF (16-bit if -b8 is not set)." << std::endl; - std::cout << " Uncompressed by default, or ZIP compression with 'z'" << std::endl; - std::cout << " -n Specify output to be compressed PNG (16-bit if -b8 is not set)." << std::endl; - std::cout << " -Y Overwrite output if present." << std::endl << std::endl; - std::cout << "Your " << pparamsExt << " files can be incomplete, RawTherapee will set the values as follows:" << std::endl; - std::cout << " 1- A new profile is created using internal default (neutral) values" << std::endl; - std::cout << " (hard-coded into RawTherapee)," << std::endl; - std::cout << " 2- then overridden by those found in the default raw or non-raw " << pparamsExt << " file" << std::endl; - std::cout << " (if -d has been set)," << std::endl; - std::cout << " 3- then overridden by those found in the " << pparamsExt << " files provided by -p, each one" << std::endl; - std::cout << " overriding the previous values," << std::endl; - std::cout << " 4- then overridden by the sidecar file if -s is set and if the file exists;" << std::endl; - std::cout << " the time where the sidecar file is used depends on the position of the -s" << std::endl; - std::cout << " switch in the command line relative to the -p parameters," << std::endl; - std::cout << " e.g. -p first." << pparamsExt << " -p second." << pparamsExt << " -s -p fourth." << pparamsExt << std::endl; + std::cout << " -b<8|16> Specify bit depth per channel (default value: 16 for TIFF, 8 for PNG)." << std::endl; + std::cout << " Only applies to TIFF and PNG output, JPEG is always 8." << std::endl; + std::cout << " -t[z] Specify output to be TIFF." << std::endl; + std::cout << " Uncompressed by default, or deflate compression with 'z'." << std::endl; + std::cout << " -n Specify output to be compressed PNG." << std::endl; + std::cout << " Compression is hard-coded to 6." << std::endl; + std::cout << " -Y Overwrite output if present." << std::endl; + std::cout << std::endl; + std::cout << "Your " << pparamsExt << " files can be incomplete, RawTherapee will build the final values as follows:" << std::endl; + std::cout << " 1- A new processing profile is created using neutral values," << std::endl; + std::cout << " 2- If the \"-d\" option is set, the values are overridden by those found in" << std::endl; + std::cout << " the default raw or non-raw processing profile." << std::endl; + std::cout << " 3- If one or more \"-p\" options are set, the values are overridden by those" << std::endl; + std::cout << " found in these processing profiles." << std::endl; + std::cout << " 4- If the \"-s\" or \"-S\" options are set, the values are finally overridden by those" << std::endl; + std::cout << " found in the sidecar files." << std::endl; + std::cout << " The processing profiles are processed in the order specified on the command line." << std::endl; return -1; } } From c8779c04f52c3f4525646df5a459491168d8c8e4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 6 Jul 2016 13:04:24 +0200 Subject: [PATCH 142/232] Fix all - 2 cppcheck performance hints --- rtengine/camconst.cc | 4 ++-- rtengine/color.cc | 6 ++---- rtengine/colortemp.cc | 3 +-- rtengine/dcrop.cc | 11 +++-------- rtengine/dfmanager.cc | 18 +++++++++--------- rtengine/ffmanager.cc | 16 ++++++++-------- rtengine/imageio.cc | 2 +- rtengine/improcfun.cc | 6 +----- rtengine/ipwavelet.cc | 18 +++--------------- rtengine/myfile.cc | 15 +++++++-------- rtengine/processingjob.h | 8 ++------ rtengine/procparams.cc | 6 +++--- rtengine/rawimage.cc | 2 +- rtengine/rawimage.h | 2 +- rtengine/shmap.cc | 2 +- rtexif/rtexif.cc | 6 +++--- rtexif/rtexif.h | 6 +++--- rtgui/batchqueue.cc | 2 +- rtgui/batchqueue.h | 2 +- rtgui/batchqueueentry.cc | 3 +-- rtgui/bqentryupdater.cc | 4 ++-- rtgui/coloredbar.cc | 2 +- rtgui/cropwindow.cc | 4 ++-- rtgui/dirbrowser.cc | 12 ++++++------ rtgui/editwindow.cc | 4 ++-- rtgui/exifpanel.cc | 10 +++++----- rtgui/favoritbrowser.cc | 2 +- rtgui/filebrowser.cc | 4 ++-- rtgui/filterpanel.cc | 16 ++++++++-------- rtgui/history.cc | 4 ++-- rtgui/imagearea.cc | 2 +- rtgui/iptcpanel.cc | 6 +++--- rtgui/mycurve.cc | 3 +-- rtgui/mydiagonalcurve.cc | 8 ++++---- rtgui/myflatcurve.cc | 16 ++++++++-------- rtgui/paramsedited.cc | 4 ++-- rtgui/previewhandler.cc | 2 +- rtgui/profilestore.cc | 2 +- rtgui/rtwindow.cc | 2 +- rtgui/thresholdselector.cc | 8 ++++---- rtgui/thumbbrowserbase.cc | 3 +-- rtgui/thumbnail.cc | 2 +- rtgui/thumbnail.h | 2 +- 43 files changed, 114 insertions(+), 146 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 8290fe085..9e49293e1 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -428,7 +428,7 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float std::map::iterator best_it = mLevels[bw].begin(); if (iso > 0) { - for (it = mLevels[bw].begin(); it != mLevels[bw].end(); it++) { + for (it = mLevels[bw].begin(); it != mLevels[bw].end(); ++it) { if (abs(it->first - iso) <= abs(best_it->first - iso)) { best_it = it; } else { @@ -487,7 +487,7 @@ CameraConst::get_Levels(struct camera_const_levels & lvl, int bw, int iso, float if (it == mApertureScaling.end()) { std::map::reverse_iterator it; - for (it = mApertureScaling.rbegin(); it != mApertureScaling.rend(); it++) { + for (it = mApertureScaling.rbegin(); it != mApertureScaling.rend(); ++it) { if (it->first > fnumber) { scaling = it->second; } else { diff --git a/rtengine/color.cc b/rtengine/color.cc index c5874d110..c822a6f33 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1361,12 +1361,10 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int alg float bal, balH, cal, calH, calm; bal = balH = balance; cal = calH = calm = 1.f - chromat; - float med = (iphigh + iplow) / 2.f; - float medH = (iphigh + iplow) / 2.f; + float med = 1.f; + float medH = 0.f; float medL = (iphigh + iplow) / 2.f; - med = 1.f; - medH = 0.f; //new algo for 2 colors float calan; calan = chromat; diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index c99e4bd41..8d3847e79 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -114,9 +114,8 @@ void ColorTemp::clip (double &temp, double &green, double &equal) } } -ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e) +ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e), method("Custom") { - method = "Custom"; mul2temp (mulr, mulg, mulb, equal, temp, green); } diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index bfe9c1c9a..577a3f4a6 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -888,14 +888,9 @@ void Crop::update (int todo) realtile = 12; } - int tilesize; - int overlap; - tilesize = 1024; - overlap = 128; - tilesize = 128 * realtile; - //overlap=(int) tilesize*params->wavelet.overl; - overlap = (int) tilesize * 0.125f; - // printf("overl=%d\n",overlap); + int tilesize = 128 * realtile; + int overlap = (int) tilesize * 0.125f; + int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; parent->ipf.Tile_calc (tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 10d2dff30..e06ac27e2 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -158,7 +158,7 @@ void dfInfo::updateRawImage() int nFiles = 1; // First file data already loaded - for( iName++; iName != pathNames.end(); iName++) { + for( ++iName; iName != pathNames.end(); ++iName) { RawImage* temp = new RawImage(*iName); if( !temp->loadRaw(true)) { @@ -300,7 +300,7 @@ void DFManager::init( Glib::ustring pathname ) } // Where multiple shots exist for same group, move filename to list - for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); iter++ ) { + for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { dfInfo &i = iter->second; if( !i.pathNames.empty() && !i.pathname.empty() ) { @@ -314,7 +314,7 @@ void DFManager::init( Glib::ustring pathname ) } else { printf( "%s: MEAN of \n ", i.key().c_str()); - for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); iter++ ) { + for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) { printf( "%s, ", iter->c_str() ); } @@ -391,7 +391,7 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) iter = dfList.insert(std::pair< std::string, dfInfo>( key, n ) ); } else { while( iter != dfList.end() && iter->second.key() == key && ABS(iter->second.timestamp - idata.getDateTimeAsTS()) > 60 * 60 * 6 ) { // 6 hour difference - iter++; + ++iter; } if( iter != dfList.end() ) { @@ -414,7 +414,7 @@ void DFManager::getStat( int &totFiles, int &totTemplates) totFiles = 0; totTemplates = 0; - for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); iter++ ) { + for( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { dfInfo &i = iter->second; if( i.pathname.empty() ) { @@ -443,7 +443,7 @@ dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int iso dfList_t::iterator bestMatch = iter; time_t bestDeltaTime = ABS(iter->second.timestamp - t); - for(iter++; iter != dfList.end() && !key.compare( iter->second.key() ); iter++ ) { + for(++iter; iter != dfList.end() && !key.compare( iter->second.key() ); ++iter ) { time_t d = ABS(iter->second.timestamp - t ); if( d < bestDeltaTime ) { @@ -458,7 +458,7 @@ dfInfo* DFManager::find( const std::string &mak, const std::string &mod, int iso dfList_t::iterator bestMatch = iter; double bestD = iter->second.distance( mak, mod, isospeed, shut ); - for( iter++; iter != dfList.end(); iter++ ) { + for( ++iter; iter != dfList.end(); ++iter ) { double d = iter->second.distance( mak, mod, isospeed, shut ); if( d < bestD ) { @@ -484,7 +484,7 @@ RawImage* DFManager::searchDarkFrame( const std::string &mak, const std::string RawImage* DFManager::searchDarkFrame( const Glib::ustring filename ) { - for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); iter++ ) { + for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { if( iter->second.pathname.compare( filename ) == 0 ) { return iter->second.getRawImage(); } @@ -500,7 +500,7 @@ RawImage* DFManager::searchDarkFrame( const Glib::ustring filename ) } std::vector *DFManager::getHotPixels ( const Glib::ustring filename ) { - for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); iter++ ) { + for ( dfList_t::iterator iter = dfList.begin(); iter != dfList.end(); ++iter ) { if( iter->second.pathname.compare( filename ) == 0 ) { return &iter->second.getHotPixels(); } diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index c5461f3e9..6a653eb84 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -158,7 +158,7 @@ void ffInfo::updateRawImage() int nFiles = 1; // First file data already loaded - for( iName++; iName != pathNames.end(); iName++) { + for( ++iName; iName != pathNames.end(); ++iName) { RawImage* temp = new RawImage(*iName); if( !temp->loadRaw(true)) { @@ -268,7 +268,7 @@ void FFManager::init( Glib::ustring pathname ) } // Where multiple shots exist for same group, move filename to list - for( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); iter++ ) { + for( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); ++iter ) { ffInfo &i = iter->second; if( !i.pathNames.empty() && !i.pathname.empty() ) { @@ -282,7 +282,7 @@ void FFManager::init( Glib::ustring pathname ) } else { printf( "%s: MEAN of \n ", i.key().c_str()); - for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); iter++ ) { + for( std::list::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) { printf( "%s, ", iter->c_str() ); } @@ -361,7 +361,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool) iter = ffList.insert(std::pair< std::string, ffInfo>( key, n ) ); } else { while( iter != ffList.end() && iter->second.key() == key && ABS(iter->second.timestamp - ri.get_timestamp()) > 60 * 60 * 6 ) { // 6 hour difference - iter++; + ++iter; } if( iter != ffList.end() ) { @@ -384,7 +384,7 @@ void FFManager::getStat( int &totFiles, int &totTemplates) totFiles = 0; totTemplates = 0; - for( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); iter++ ) { + for( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); ++iter ) { ffInfo &i = iter->second; if( i.pathname.empty() ) { @@ -413,7 +413,7 @@ ffInfo* FFManager::find( const std::string &mak, const std::string &mod, const s ffList_t::iterator bestMatch = iter; time_t bestDeltaTime = ABS(iter->second.timestamp - t); - for(iter++; iter != ffList.end() && !key.compare( iter->second.key() ); iter++ ) { + for(++iter; iter != ffList.end() && !key.compare( iter->second.key() ); ++iter ) { time_t d = ABS(iter->second.timestamp - t ); if( d < bestDeltaTime ) { @@ -428,7 +428,7 @@ ffInfo* FFManager::find( const std::string &mak, const std::string &mod, const s ffList_t::iterator bestMatch = iter; double bestD = iter->second.distance( mak, mod, len, focal, apert ); - for( iter++; iter != ffList.end(); iter++ ) { + for( ++iter; iter != ffList.end(); ++iter ) { double d = iter->second.distance( mak, mod, len, focal, apert ); if( d < bestD ) { @@ -454,7 +454,7 @@ RawImage* FFManager::searchFlatField( const std::string &mak, const std::string RawImage* FFManager::searchFlatField( const Glib::ustring filename ) { - for ( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); iter++ ) { + for ( ffList_t::iterator iter = ffList.begin(); iter != ffList.end(); ++iter ) { if( iter->second.pathname.compare( filename ) == 0 ) { return iter->second.getRawImage(); } diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 9fdfc82fb..36a3d3601 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -136,7 +136,7 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::pr iptc = iptc_data_new (); - for (rtengine::procparams::IPTCPairs::const_iterator i = iptcc.begin(); i != iptcc.end(); i++) { + for (rtengine::procparams::IPTCPairs::const_iterator i = iptcc.begin(); i != iptcc.end(); ++i) { if (i->first == "Keywords" && !(i->second.empty())) { for (unsigned int j = 0; j < i->second.size(); j++) { IptcDataSet * ds = iptc_dataset_new (); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 8da4f689a..c30e626b9 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -611,8 +611,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh Jpro = (CAMBrightCurveJ[(float)(Jpro * 327.68)]) / 327.68; //ligthness CIECAM02 + contrast double sres; double Sp = spro / 100.0; - double parsat = 1.5; - parsat = 1.5; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) + double parsat = 1.5; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) if(schr == -100.0) { schr = -99.8; @@ -4964,7 +4963,6 @@ void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); } */ - ksat = 1.f; float kl = 1.f; float rlo = 1.f; //0.4 0.5 float rlm = 1.5f; //1.1 @@ -5235,7 +5233,6 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); } */ - ksat = 1.f; float kl = 1.f; float rlo = 1.f; float rlh = 2.2f; @@ -5303,7 +5300,6 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g //high tones float kh = 1.f; - kh = 1.f; float aa0, bb0; //fixed value of reducac ==0.4; secondeg_begin (reducac, iphigh, aa0, bb0); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 4e433b453..ab29308c8 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -574,15 +574,8 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int realtile = 12; } - int tilesize; - int overlap; - tilesize = 1024; - overlap = 128; - //tilesize=128*params->wavelet.tiles; - tilesize = 128 * realtile; - //overlap=(int) tilesize*params->wavelet.overl; - overlap = (int) tilesize * 0.125f; - // printf("overl=%d\n",overlap); + int tilesize = 128 * realtile; + int overlap = (int) tilesize * 0.125f; int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; if(params->wavelet.Tilesmethod == "full") { @@ -1828,8 +1821,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * float maxkoeLi[12]; float *koeLibuffer = NULL; - bool lipschitz = false; - lipschitz = true; + bool lipschitz = true; if(lipschitz == true) { for(int y = 0; y < 12; y++) { @@ -3262,8 +3254,6 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit int ii = i / W_L; int jj = i - ii * W_L; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - k1 = 600.f; - 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; @@ -3525,8 +3515,6 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, int ii = i / W_ab; int jj = i - ii * W_ab; float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; - k1 = 600.f; - 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; diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index bcc2a7db7..0414cc1de 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -68,18 +68,17 @@ int munmap(void *start, size_t length) IMFILE* fopen (const char* fname) { - int fd = -1; + int fd; #ifdef WIN32 - { - // First convert UTF8 to UTF16, then use Windows function to open the file and convert back to file descriptor. - std::unique_ptr wfname (reinterpret_cast(g_utf8_to_utf16 (fname, -1, NULL, NULL, NULL)), g_free); + fd = -1; + // First convert UTF8 to UTF16, then use Windows function to open the file and convert back to file descriptor. + std::unique_ptr wfname (reinterpret_cast(g_utf8_to_utf16 (fname, -1, NULL, NULL, NULL)), g_free); - HANDLE hFile = CreateFileW (wfname.get (), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) { - fd = _open_osfhandle((intptr_t)hFile, 0); - } + HANDLE hFile = CreateFileW (wfname.get (), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { + fd = _open_osfhandle((intptr_t)hFile, 0); } #else diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h index 3364e6daf..fbf56234f 100644 --- a/rtengine/processingjob.h +++ b/rtengine/processingjob.h @@ -34,15 +34,11 @@ public: procparams::ProcParams pparams; ProcessingJobImpl (const Glib::ustring& fn, bool iR, const procparams::ProcParams& pp) - : fname(fn), isRaw(iR), initialImage(NULL) - { - pparams = pp; - } + : fname(fn), isRaw(iR), initialImage(NULL), pparams(pp) {} ProcessingJobImpl (InitialImage* iImage, const procparams::ProcParams& pp) - : fname(""), initialImage(iImage) + : fname(""), initialImage(iImage), pparams(pp) { - pparams = pp; iImage->increaseRef(); } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 25d5df212..60a54baf5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3388,14 +3388,14 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b // save exif change list if (!pedited || pedited->exif) { - for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); i++) { + for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); ++i) { keyFile.set_string ("Exif", i->first, i->second); } } // save iptc change list if (!pedited || pedited->iptc) { - for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); i++) { + for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); ++i) { Glib::ArrayHandle values = i->second; keyFile.set_string_list ("IPTC", i->first, values); } @@ -7487,7 +7487,7 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) for ( std::vector::iterator currLoadedTagValue = currIptc.begin(); currLoadedTagValue != currIptc.end(); - currLoadedTagValue++) { + ++currLoadedTagValue) { iptc[keys[i]].push_back(currLoadedTagValue->data()); } diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 919b1c7be..8f91f8f4b 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -19,7 +19,7 @@ namespace rtengine extern const Settings* settings; -RawImage::RawImage( const Glib::ustring name ) +RawImage::RawImage( const Glib::ustring &name ) : data(NULL) , prefilters(0) , filename(name) diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 5b425f7df..86965a612 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -99,7 +99,7 @@ class RawImage: public DCraw { public: - RawImage( const Glib::ustring name ); + RawImage( const Glib::ustring &name ); ~RawImage(); int loadRaw (bool loadData = true, bool closeFile = true, ProgressListener *plistener = 0, double progressRange = 1.0); diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index ac77da25d..bb8e96c11 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -227,7 +227,7 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //experimental dirpyr shmap float thresh = (100.f * radius); //1000; - int levrad = 16; + int levrad; // = 16; levrad = 2; //for retinex - otherwise levrad = 16 // set up range function // calculate size of Lookup table. That's possible because from a value k for all i>=k rangefn[i] will be exp(-10) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 1cdc2d89c..dd49ab23d 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -336,7 +336,7 @@ bool TagDirectory::CPBDump (const Glib::ustring &commFName, const Glib::ustring return true; } -Glib::ustring TagDirectory::getDumpKey (int tagID, const Glib::ustring tagName) +Glib::ustring TagDirectory::getDumpKey (int tagID, const Glib::ustring &tagName) { Glib::ustring key; @@ -2841,7 +2841,7 @@ int ExifManager::createJPEGMarker (const TagDirectory* root, const rtengine::pro cl = new TagDirectory (NULL, ifdAttribs, INTEL); } - for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); i++) { + for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); ++i) { cl->applyChange (i->first, i->second); } @@ -2927,7 +2927,7 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro } // apply list of changes - for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); i++) { + for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); ++i) { cl->applyChange (i->first, i->second); } diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index a8d7088d2..7777331e9 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -101,7 +101,7 @@ protected: const TagAttrib* attribs; // descriptor table to decode the tags ByteOrder order; // byte order TagDirectory* parent; // parent directory (NULL if root) - static Glib::ustring getDumpKey (int tagID, const Glib::ustring tagName); + static Glib::ustring getDumpKey (int tagID, const Glib::ustring &tagName); public: TagDirectory (); @@ -495,7 +495,7 @@ protected: * Get the lens info (min/man focal, min/max aperture) and compare them to the possible choice */ if (lensInfoArray) { - for ( r = choices.lower_bound( lensID ); r != choices.upper_bound(lensID); r++ ) { + for ( r = choices.lower_bound( lensID ); r != choices.upper_bound(lensID); ++r ) { if( !extractLensInfo( r->second , f1, f2, a1, a2) ) { continue; } @@ -532,7 +532,7 @@ protected: std::ostringstream candidates; double deltaMin = 1000.; - for ( r = choices.lower_bound( lensID ); r != choices.upper_bound(lensID); r++ ) { + for ( r = choices.lower_bound( lensID ); r != choices.upper_bound(lensID); ++r ) { double lensAperture, dif; if( !extractLensInfo( r->second , f1, f2, a1, a2) ) { diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 5d91b6ee9..333ad8d4f 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -365,7 +365,7 @@ bool BatchQueue::loadBatchQueue () return !fd.empty (); } -Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename ) +Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filename ) { timeval tv; gettimeofday(&tv, 0); diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index b5a3c2167..3bf3cb228 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -63,7 +63,7 @@ protected: BatchQueueListener* listener; Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format); - Glib::ustring getTempFilenameForParams( const Glib::ustring filename ); + Glib::ustring getTempFilenameForParams( const Glib::ustring &filename ); bool saveBatchQueue (); void notifyListener (bool queueEmptied); diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 0e8b66136..b8bc45601 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -32,11 +32,10 @@ Glib::RefPtr BatchQueueEntry::savedAsIcon; BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm) : ThumbBrowserEntryBase(fname), opreview(NULL), origpw(prevw), origph(prevh), opreviewDone(false), - job(pjob), progress(0), outFileName(""), sequence(0), forceFormatOpts(false) + job(pjob), progress(0), outFileName(""), sequence(0), forceFormatOpts(false), params(pparams) { thumbnail = thm; - params = pparams; #if 1 //ndef WIN32 // The BatchQueueEntryIdleHelper tracks if an entry has been deleted while it was sitting waiting for "idle" diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 040036049..596811c58 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -42,7 +42,7 @@ void BatchQueueEntryUpdater::process (guint8* oimg, int ow, int oh, int newh, BQ // look up if an older version is in the queue std::list::iterator i; - for (i = jqueue.begin(); i != jqueue.end(); i++) + for (i = jqueue.begin(); i != jqueue.end(); ++i) if (i->oimg == oimg && i->listener == listener) { i->ow = ow; i->oh = oh; @@ -169,7 +169,7 @@ void BatchQueueEntryUpdater::removeJobs (BQEntryUpdateListener* listener) ready = true; std::list::iterator i; - for (i = jqueue.begin(); i != jqueue.end(); i++) + for (i = jqueue.begin(); i != jqueue.end(); ++i) if (i->listener == listener) { jqueue.erase (i); ready = false; diff --git a/rtgui/coloredbar.cc b/rtgui/coloredbar.cc index 192f791fe..64e60b136 100644 --- a/rtgui/coloredbar.cc +++ b/rtgui/coloredbar.cc @@ -100,7 +100,7 @@ void ColoredBar::draw() break; } - for (std::vector::iterator i = bgGradient.begin(); i != bgGradient.end(); i++) { + for (std::vector::iterator i = bgGradient.begin(); i != bgGradient.end(); ++i) { bggradient->add_color_stop_rgb (i->position, i->r, i->g, i->b); } diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index da0e2e00c..6d39e0212 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -511,7 +511,7 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) state = SNormal; - for (std::list::iterator i = listeners.begin(); i != listeners.end(); i++) { + for (std::list::iterator i = listeners.begin(); i != listeners.end(); ++i) { (*i)->cropPositionChanged (this); } @@ -2278,7 +2278,7 @@ void CropWindow::delCropWindowListener (CropWindowListener* l) if (*i == l) { i = listeners.erase (i); } else { - i++; + ++i; } } diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 040985e16..d3fc8bf79 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -181,7 +181,7 @@ void DirBrowser::addRoot (char letter) void DirBrowser::updateDirTreeRoot () { - for (Gtk::TreeModel::iterator i = dirTreeModel->children().begin(); i != dirTreeModel->children().end(); i++) { + for (Gtk::TreeModel::iterator i = dirTreeModel->children().begin(); i != dirTreeModel->children().end(); ++i) { updateDirTree (i); } } @@ -192,7 +192,7 @@ void DirBrowser::updateDirTree (const Gtk::TreeModel::iterator& iter) if (dirtree->row_expanded (dirTreeModel->get_path (iter))) { updateDir (iter); - for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); i++) { + for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); ++i) { updateDirTree (i); } } @@ -208,7 +208,7 @@ void DirBrowser::updateVolumes () for (int i = 0; i < 32; i++) if (((volumes >> i) & 1) && !((nvolumes >> i) & 1)) { // volume i has been deleted - for (Gtk::TreeModel::iterator iter = dirTreeModel->children().begin(); iter != dirTreeModel->children().end(); iter++) + for (Gtk::TreeModel::iterator iter = dirTreeModel->children().begin(); iter != dirTreeModel->children().end(); ++iter) if (iter->get_value (dtColumns.filename).c_str()[0] - 'A' == i) { dirTreeModel->erase (iter); break; @@ -333,7 +333,7 @@ void DirBrowser::updateDir (const Gtk::TreeModel::iterator& iter) while (change) { change = false; - for (Gtk::TreeModel::iterator it = iter->children().begin(); it != iter->children().end(); it++) + for (Gtk::TreeModel::iterator it = iter->children().begin(); it != iter->children().end(); ++it) if (!Glib::file_test (it->get_value (dtColumns.dirname), Glib::FILE_TEST_EXISTS) || !Glib::file_test (it->get_value (dtColumns.dirname), Glib::FILE_TEST_IS_DIR)) { GThreadLock lock; @@ -350,7 +350,7 @@ void DirBrowser::updateDir (const Gtk::TreeModel::iterator& iter) for (int i = 0; i < subDirs.size(); i++) { bool found = false; - for (Gtk::TreeModel::iterator it = iter->children().begin(); it != iter->children().end() && !found ; it++) { + for (Gtk::TreeModel::iterator it = iter->children().begin(); it != iter->children().end() && !found ; ++it) { found = (it->get_value (dtColumns.filename) == subDirs[i]); } @@ -432,7 +432,7 @@ Gtk::TreePath DirBrowser::expandToDir (const Glib::ustring& absDirPath) } ix++; - i++; + ++i; } count++; diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index 76e351569..605e915af 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -227,7 +227,7 @@ bool EditWindow::on_delete_event(GdkEventAny* event) // Check if any editor is still processing, and do NOT quit if so. Otherwise crashes and inconsistent caches bool isProcessing = false; - for ( std::set ::iterator iter = filesEdited.begin(); iter != filesEdited.end() && !isProcessing; iter++ ) { + for ( std::set ::iterator iter = filesEdited.begin(); iter != filesEdited.end() && !isProcessing; ++iter ) { if (epanels[*iter]->getIsProcessing()) { isProcessing = true; } @@ -237,7 +237,7 @@ bool EditWindow::on_delete_event(GdkEventAny* event) return true; } - for ( std::set ::iterator iter = filesEdited.begin(); iter != filesEdited.end(); iter++ ) { + for ( std::set ::iterator iter = filesEdited.begin(); iter != filesEdited.end(); ++iter ) { mainNB->remove_page (*epanels[*iter]); } diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 8c39edc02..c7e47ef57 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -275,7 +275,7 @@ void ExifPanel::delIt (Gtk::TreeModel::iterator iter) } if (recursiveOp) - for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); i++) { + for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); ++i) { delIt (i); } } @@ -306,7 +306,7 @@ void ExifPanel::keepIt (Gtk::TreeModel::iterator iter) } if (recursiveOp) - for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); i++) { + for (Gtk::TreeModel::iterator i = iter->children().begin(); i != iter->children().end(); ++i) { keepIt (i); } } @@ -472,7 +472,7 @@ void ExifPanel::editTag (Gtk::TreeModel::Children root, Glib::ustring name, Glib // look up first segment of the path Gtk::TreeModel::iterator iter; - for (iter = root.begin(); iter != root.end(); iter++) + for (iter = root.begin(); iter != root.end(); ++iter) if (iter->get_value (exifColumns.field_nopango) == fseg) { break; } @@ -581,7 +581,7 @@ void ExifPanel::updateChangeList (Gtk::TreeModel::Children root, std::string pre Gtk::TreeModel::iterator iter; - for (iter = root.begin(); iter != root.end(); iter++) { + for (iter = root.begin(); iter != root.end(); ++iter) { if (iter->get_value (exifColumns.edited) == true) { changeList[ prefix + iter->get_value (exifColumns.field_nopango) ] = iter->get_value (exifColumns.value_nopango); } else if (iter->get_value (exifColumns.action) == AC_WRITE && iter->get_value (exifColumns.icon) == delicon) { @@ -606,7 +606,7 @@ void ExifPanel::updateChangeList () void ExifPanel::applyChangeList () { - for (rtengine::procparams::ExifPairs::iterator i = changeList.begin(); i != changeList.end(); i++) { + for (rtengine::procparams::ExifPairs::iterator i = changeList.begin(); i != changeList.end(); ++i) { editTag (exifTreeModel->children(), i->first, i->second); } } diff --git a/rtgui/favoritbrowser.cc b/rtgui/favoritbrowser.cc index 8ce4caf8f..658390391 100644 --- a/rtgui/favoritbrowser.cc +++ b/rtgui/favoritbrowser.cc @@ -97,7 +97,7 @@ void FavoritBrowser::addPressed () return; } - iter++; + ++iter; } Glib::RefPtr hfile = Gio::File::create_for_parse_name (lastSelectedDir); diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index f8a8f225f..68825c696 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -623,7 +623,7 @@ void FileBrowser::addEntry_ (FileBrowserEntry* entry) std::vector::iterator i = fd.begin(); while (i != fd.end() && *entry < * ((FileBrowserEntry*)*i)) { - i++; + ++i; } fd.insert (i, entry); @@ -640,7 +640,7 @@ FileBrowserEntry* FileBrowser::delEntry (const Glib::ustring& fname) { MYWRITERLOCK(l, entryRW); - for (std::vector::iterator i = fd.begin(); i != fd.end(); i++) + for (std::vector::iterator i = fd.begin(); i != fd.end(); ++i) if ((*i)->filename == fname) { ThumbBrowserEntryBase* entry = *i; entry->selected = false; diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index bc4396aca..5a118d6e1 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -212,7 +212,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) expcomp->clear_items(); curefs.expcomp.clear(); - for (std::set::iterator i = defefs.expcomp.begin(); i != defefs.expcomp.end(); i++) { + for (std::set::iterator i = defefs.expcomp.begin(); i != defefs.expcomp.end(); ++i) { expcomp->append_text (*i); curefs.expcomp.insert(*i); } @@ -222,7 +222,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) lens->clear_items(); curefs.lenses.clear(); - for (std::set::iterator i = defefs.lenses.begin(); i != defefs.lenses.end(); i++) { + for (std::set::iterator i = defefs.lenses.begin(); i != defefs.lenses.end(); ++i) { lens->append_text (*i); curefs.lenses.insert(*i); } @@ -232,7 +232,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) camera->clear_items(); curefs.cameras.clear(); - for (std::set::iterator i = defefs.cameras.begin(); i != defefs.cameras.end(); i++) { + for (std::set::iterator i = defefs.cameras.begin(); i != defefs.cameras.end(); ++i) { camera->append_text(*i); curefs.cameras.insert(*i); } @@ -242,14 +242,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) filetype->clear_items(); curefs.filetypes.clear(); - for (std::set::iterator i = defefs.filetypes.begin(); i != defefs.filetypes.end(); i++) { + for (std::set::iterator i = defefs.filetypes.begin(); i != defefs.filetypes.end(); ++i) { filetype->append_text(*i); curefs.filetypes.insert(*i); } ftselection->select_all(); } else { - for( Gtk::TreeModel::Children::iterator iter = expcomp->get_model()->children().begin(); iter != expcomp->get_model()->children().end(); iter++) { + for( Gtk::TreeModel::Children::iterator iter = expcomp->get_model()->children().begin(); iter != expcomp->get_model()->children().end(); ++iter) { Glib::ustring v; iter->get_value(0, v); @@ -260,7 +260,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) } } - for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end(); iter++) { + for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end(); ++iter) { Glib::ustring v; iter->get_value(0, v); @@ -271,7 +271,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) } } - for( Gtk::TreeModel::Children::iterator iter = camera->get_model()->children().begin(); iter != camera->get_model()->children().end(); iter++) { + for( Gtk::TreeModel::Children::iterator iter = camera->get_model()->children().begin(); iter != camera->get_model()->children().end(); ++iter) { Glib::ustring v; iter->get_value(0, v); @@ -282,7 +282,7 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) } } - for( Gtk::TreeModel::Children::iterator iter = filetype->get_model()->children().begin(); iter != filetype->get_model()->children().end(); iter++) { + for( Gtk::TreeModel::Children::iterator iter = filetype->get_model()->children().begin(); iter != filetype->get_model()->children().end(); ++iter) { Glib::ustring v; iter->get_value(0, v); diff --git a/rtgui/history.cc b/rtgui/history.cc index 689ea6394..fa1ba372b 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -222,7 +222,7 @@ void History::procParamsChanged (ProcParams* params, ProcEvent ev, Glib::ustring // remove all rows after the selection if (iter) { - iter++; + ++iter; while (iter) { iter = historyModel->erase (iter); @@ -356,7 +356,7 @@ void History::redo () Gtk::TreeModel::iterator iter = selection->get_selected(); if (iter) { - iter++; + ++iter; if (iter != historyModel->children().end()) { selection->select (iter); diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 5383058e3..0b757d8ec 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -213,7 +213,7 @@ bool ImageArea::on_expose_event(GdkEventExpose* event) cr->fill (); } - for (std::list::reverse_iterator i = cropWins.rbegin(); i != cropWins.rend(); i++) { + for (std::list::reverse_iterator i = cropWins.rbegin(); i != cropWins.rend(); ++i) { (*i)->expose (cr); } diff --git a/rtgui/iptcpanel.cc b/rtgui/iptcpanel.cc index 301f7fc27..3a9b3e81c 100644 --- a/rtgui/iptcpanel.cc +++ b/rtgui/iptcpanel.cc @@ -402,7 +402,7 @@ void IPTCPanel::addKeyWord () keyword->prepend_text (keyword->get_entry()->get_text()); std::vector items; - for (Gtk::TreeModel::iterator i = keyword->get_model()->children().begin(); i != keyword->get_model()->children().end(); i++) { + for (Gtk::TreeModel::iterator i = keyword->get_model()->children().begin(); i != keyword->get_model()->children().end(); ++i) { Glib::ustring s; i->get_value (0, s); items.push_back (s); @@ -454,7 +454,7 @@ void IPTCPanel::addSuppCategory () suppCategory->prepend_text (suppCategory->get_entry()->get_text()); std::vector items; - for (Gtk::TreeModel::iterator i = suppCategory->get_model()->children().begin(); i != suppCategory->get_model()->children().end(); i++) { + for (Gtk::TreeModel::iterator i = suppCategory->get_model()->children().begin(); i != suppCategory->get_model()->children().end(); ++i) { Glib::ustring s; i->get_value (0, s); items.push_back (s); @@ -557,7 +557,7 @@ void IPTCPanel::applyChangeList () keyword->get_entry()->set_text (""); suppCategory->get_entry()->set_text (""); - for (rtengine::procparams::IPTCPairs::iterator i = changeList.begin(); i != changeList.end(); i++) { + for (rtengine::procparams::IPTCPairs::iterator i = changeList.begin(); i != changeList.end(); ++i) { if (i->first == "Caption" && !i->second.empty()) { captionText->set_text (i->second.at(0)); } else if (i->first == "CaptionWriter" && !i->second.empty()) { diff --git a/rtgui/mycurve.cc b/rtgui/mycurve.cc index 55e566ada..626eef4f1 100644 --- a/rtgui/mycurve.cc +++ b/rtgui/mycurve.cc @@ -21,10 +21,9 @@ #include #include -MyCurve::MyCurve () : pipetteR(-1.f), pipetteG(-1.f), pipetteB(-1.f), pipetteVal(-1.f), listener(NULL) +MyCurve::MyCurve () : pipetteR(-1.f), pipetteG(-1.f), pipetteB(-1.f), pipetteVal(-1.f), listener(NULL), cursor_type( CSArrow) { - cursor_type = CSArrow; graphX = get_allocation().get_width() - RADIUS * 2; graphY = get_allocation().get_height() - RADIUS * 2; prevGraphW = graphW; diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 2a70e9b7c..fd57633fb 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -591,8 +591,8 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) ity = curve.y.begin(); for (int i = 0; i < closest_point; i++) { - itx++; - ity++; + ++itx; + ++ity; } curve.x.insert (itx, 0); @@ -1111,8 +1111,8 @@ bool MyDiagonalCurve::pipetteButton1Pressed(EditDataProvider *provider, int modi ity = curve.y.begin(); for (int i = 0; i < closest_point; i++) { - itx++; - ity++; + ++itx; + ++ity; } lit_point = closest_point; diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 0bc3bd533..4127d1ae8 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -641,10 +641,10 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) itrt = curve.rightTangent.begin(); for (int i = 0; i < closest_point; i++) { - itx++; - ity++; - itlt++; - itrt++; + ++itx; + ++ity; + ++itlt; + ++itrt; } curve.x.insert (itx, 0); @@ -1327,10 +1327,10 @@ bool MyFlatCurve::pipetteButton1Pressed(EditDataProvider *provider, int modifier itrt = curve.rightTangent.begin(); for (int i = 0; i < closest_point; i++) { - itx++; - ity++; - itlt++; - itrt++; + ++itx; + ++ity; + ++itlt; + ++itrt; } curve.x.insert (itx, 0); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fba2ef059..0422f7403 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -2765,13 +2765,13 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten // Exif changes are added to the existing ones if (exif) - for (procparams::ExifPairs::const_iterator i = mods.exif.begin(); i != mods.exif.end(); i++) { + for (procparams::ExifPairs::const_iterator i = mods.exif.begin(); i != mods.exif.end(); ++i) { toEdit.exif[i->first] = i->second; } // IPTC changes are added to the existing ones if (iptc) - for (procparams::IPTCPairs::const_iterator i = mods.iptc.begin(); i != mods.iptc.end(); i++) { + for (procparams::IPTCPairs::const_iterator i = mods.iptc.begin(); i != mods.iptc.end(); ++i) { toEdit.iptc[i->first] = i->second; } } diff --git a/rtgui/previewhandler.cc b/rtgui/previewhandler.cc index 9ba62230f..e6ef30bca 100644 --- a/rtgui/previewhandler.cc +++ b/rtgui/previewhandler.cc @@ -239,7 +239,7 @@ Glib::RefPtr PreviewHandler::getRoughImage (int desiredW, int desir void PreviewHandler::previewImageChanged () { - for (std::list::iterator i = listeners.begin(); i != listeners.end(); i++) { + for (std::list::iterator i = listeners.begin(); i != listeners.end(); ++i) { (*i)->previewImageChanged (); } } diff --git a/rtgui/profilestore.cc b/rtgui/profilestore.cc index 482f83188..acbbfba63 100644 --- a/rtgui/profilestore.cc +++ b/rtgui/profilestore.cc @@ -252,7 +252,7 @@ bool ProfileStore::parseDir (Glib::ustring& realPath, Glib::ustring& virtualPath int ProfileStore::findFolderId(const Glib::ustring &path) { - for (std::vector::iterator i = folders.begin(); i != folders.end(); i++) { + for (std::vector::iterator i = folders.begin(); i != folders.end(); ++i) { if (*i == path) { return i - folders.begin(); } diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index ba6c0cbd8..e64c64d8e 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -670,7 +670,7 @@ bool RTWindow::on_delete_event(GdkEventAny* event) Gtk::Widget *w = mainNB->get_nth_page(page); bool optionsWritten = false; - for (std::map::iterator i = epanels.begin(); i != epanels.end(); i++) { + for (std::map::iterator i = epanels.begin(); i != epanels.end(); ++i) { if (i->second == w) { i->second->writeOptions(); optionsWritten = true; diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index 80a961292..796f958e6 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -272,16 +272,16 @@ bool ThresholdSelector::on_expose_event(GdkEventExpose* event) if (pts.size() >= 4) { std::vector::iterator i = pts.begin(); double x = *i; - i++; + ++i; double y = *i; - i++; + ++i; cr->move_to (hb + hwslider + iw * x + 0.5, (yEnd - yStart)*y + yStart); for (; i < pts.end(); ) { x = *i; - i++; + ++i; y = *i; - i++; + ++i; cr->line_to (hb + hwslider + iw * x + 0.5, (yEnd - yStart)*y + yStart); } } else { diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 60f990d6d..ea2bb00dd 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -25,9 +25,8 @@ using namespace std; ThumbBrowserBase::ThumbBrowserBase () - : lastClicked(NULL), previewHeight(options.thumbSize), numOfCols(1), inspector(NULL), isInspectorActive(false) + : lastClicked(NULL), previewHeight(options.thumbSize), numOfCols(1), inspector(NULL), isInspectorActive(false), location(THLOC_FILEBROWSER) { - location = THLOC_FILEBROWSER; inW = -1; inH = -1; diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 673c49efe..5e2c7f28f 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -903,7 +903,7 @@ Glib::ustring Thumbnail::getCacheFileName (const Glib::ustring& subdir, const Gl return cachemgr->getCacheFileName (subdir, fname, fext, cfs.md5); } -void Thumbnail::setFileName (const Glib::ustring fn) +void Thumbnail::setFileName (const Glib::ustring &fn) { fname = fn; diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 8656543f0..ca2f898ec 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -146,7 +146,7 @@ public: { return fname; } - void setFileName (const Glib::ustring fn); + void setFileName (const Glib::ustring &fn); bool isSupported (); From f241caf8cb1d9298d65f5d48bb38c9b094c292bf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 6 Jul 2016 14:46:10 +0200 Subject: [PATCH 143/232] Canon EOS-1D mkII raw files are rendered as flat black, fixes #3373 --- rtengine/dcraw.cc | 3 +- rtengine/dcraw.patch | 126 +++++++++++++++++++++---------------------- 2 files changed, 64 insertions(+), 65 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index bae38b193..47bfd40a7 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -895,6 +895,7 @@ ushort * CLASS ljpeg_row (int jrow, struct jhead *jh) void CLASS lossless_jpeg_load_raw() { struct jhead jh; + int row=0, col=0; if (!ljpeg_start (&jh, 0)) return; int jwide = jh.wide * jh.clrs; @@ -917,8 +918,6 @@ void CLASS lossless_jpeg_load_raw() #pragma omp section #endif { - int row=0, col=0; - if (load_flags & 1) row = jrow & 1 ? height-1-jrow/2 : jrow/2; for (int jcol=0; jcol < jwide; jcol++) { diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index baa0af282..5259c6b67 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2016-06-24 11:50:34 +0000 -+++ dcraw.cc 2016-06-24 12:40:36 +0000 +--- dcraw.c 2016-06-29 12:25:09 +0000 ++++ dcraw.cc 2016-07-06 12:30:27 +0000 @@ -1,3 +1,16 @@ +/*RT*/#include +/*RT*/#include @@ -275,16 +275,20 @@ if (c <= jh->sraw) spred = **row; row[0]++; row[1]++; } -@@ -928,22 +894,39 @@ +@@ -928,22 +894,38 @@ void CLASS lossless_jpeg_load_raw() { - int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0; struct jhead jh; - ushort *rp; ++ int row=0, col=0; if (!ljpeg_start (&jh, 0)) return; - jwide = jh.wide * jh.clrs; +- +- for (jrow=0; jrow < jh.high; jrow++) { +- rp = ljpeg_row (jrow, &jh); + int jwide = jh.wide * jh.clrs; + ushort *rp[2]; + rp[0] = ljpeg_row (0, &jh); @@ -305,10 +309,6 @@ + #pragma omp section +#endif + { -+ int row=0, col=0; - -- for (jrow=0; jrow < jh.high; jrow++) { -- rp = ljpeg_row (jrow, &jh); if (load_flags & 1) row = jrow & 1 ? height-1-jrow/2 : jrow/2; - for (jcol=0; jcol < jwide; jcol++) { @@ -324,7 +324,7 @@ if ((j = i >= cr2_slice[0])) i = cr2_slice[0]; jidx -= i * (cr2_slice[1]*raw_height); -@@ -956,6 +939,8 @@ +@@ -956,6 +938,8 @@ if (++col >= raw_width) col = (row++,0); } @@ -333,7 +333,7 @@ } ljpeg_end (&jh); } -@@ -1124,8 +1109,7 @@ +@@ -1124,8 +1108,7 @@ if (++col >= tile_width || col >= raw_width) row += 1 + (col = 0); } @@ -343,7 +343,7 @@ fseek (ifp, save+4, SEEK_SET); if ((tcol += tile_width) >= raw_width) trow += tile_length + (tcol = 0); -@@ -1332,14 +1316,14 @@ +@@ -1332,14 +1315,14 @@ int i, nz; char tail[424]; @@ -360,7 +360,7 @@ void CLASS ppm_thumb() { -@@ -1701,10 +1685,10 @@ +@@ -1701,10 +1684,10 @@ } } @@ -374,7 +374,7 @@ unsigned c; if (nbits == -1) -@@ -1779,6 +1763,338 @@ +@@ -1779,6 +1762,338 @@ maximum = 0xfffc - ph1.black; } @@ -713,7 +713,7 @@ void CLASS hasselblad_load_raw() { struct jhead jh; -@@ -2002,10 +2318,10 @@ +@@ -2002,10 +2317,10 @@ maximum = curve[0x3ff]; } @@ -727,7 +727,7 @@ int byte; if (!nbits) return vbits=0; -@@ -2188,7 +2504,7 @@ +@@ -2188,7 +2503,7 @@ void CLASS kodak_radc_load_raw() { @@ -736,7 +736,7 @@ 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8, 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8, 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8, -@@ -2294,11 +2610,11 @@ +@@ -2294,11 +2609,11 @@ METHODDEF(boolean) fill_input_buffer (j_decompress_ptr cinfo) { @@ -750,7 +750,7 @@ cinfo->src->next_input_byte = jpeg_buffer; cinfo->src->bytes_in_buffer = nbytes; return TRUE; -@@ -2648,10 +2964,9 @@ +@@ -2648,10 +2963,9 @@ maximum = (1 << (thumb_misc & 31)) - 1; } @@ -763,7 +763,7 @@ if (start) { for (p=0; p < 4; p++) pad[p] = key = key * 48828125 + 1; -@@ -2736,11 +3051,13 @@ +@@ -2736,11 +3050,13 @@ bit += 7; } for (i=0; i < 16; i++, col+=2) @@ -778,7 +778,7 @@ } void CLASS samsung_load_raw() -@@ -3038,7 +3355,7 @@ +@@ -3038,7 +3354,7 @@ void CLASS foveon_decoder (unsigned size, unsigned code) { @@ -787,7 +787,7 @@ struct decode *cur; int i, len; -@@ -3135,7 +3452,7 @@ +@@ -3135,7 +3451,7 @@ pred[c] += diff[dindex->leaf]; if (pred[c] >> 16 && ~pred[c] >> 16) derror(); } @@ -796,7 +796,7 @@ } } } -@@ -3746,6 +4063,8 @@ +@@ -3746,6 +4062,8 @@ if (load_raw == &CLASS phase_one_load_raw || load_raw == &CLASS phase_one_load_raw_c) phase_one_correct(); @@ -805,7 +805,7 @@ if (fuji_width) { for (row=0; row < raw_height-top_margin*2; row++) { for (col=0; col < fuji_width << !fuji_layout; col++) { -@@ -3761,10 +4080,13 @@ +@@ -3761,10 +4079,13 @@ } } } else { @@ -821,7 +821,7 @@ if (mask[0][3] > 0) goto mask_set; if (load_raw == &CLASS canon_load_raw || load_raw == &CLASS lossless_jpeg_load_raw) { -@@ -4366,239 +4688,8 @@ +@@ -4366,239 +4687,8 @@ } } @@ -1062,7 +1062,7 @@ void CLASS cielab (ushort rgb[3], short lab[3]) { -@@ -4864,112 +4955,7 @@ +@@ -4864,112 +4954,7 @@ } #undef fcol @@ -1175,7 +1175,7 @@ #undef TS void CLASS median_filter() -@@ -5139,7 +5125,7 @@ +@@ -5139,7 +5124,7 @@ } } @@ -1184,7 +1184,7 @@ void CLASS parse_makernote (int base, int uptag) { -@@ -5244,6 +5230,11 @@ +@@ -5244,6 +5229,11 @@ tag |= uptag << 16; if (tag == 2 && strstr(make,"NIKON") && !iso_speed) iso_speed = (get2(),get2()); @@ -1196,7 +1196,7 @@ if (tag == 4 && len > 26 && len < 35) { if ((i=(get4(),get2())) != 0x7fff && !iso_speed) iso_speed = 50 * pow (2, i/32.0 - 4); -@@ -5296,12 +5287,16 @@ +@@ -5296,12 +5286,16 @@ cam_mul[2] = get4() << 2; } } @@ -1214,7 +1214,7 @@ if (tag == 0x1d) while ((c = fgetc(ifp)) && c != EOF) serial = serial*10 + (isdigit(c) ? c - '0' : c % 10); -@@ -5491,14 +5486,14 @@ +@@ -5491,14 +5485,14 @@ while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { @@ -1232,7 +1232,7 @@ shutter = pow (2, expo); break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; -@@ -5667,28 +5662,33 @@ +@@ -5667,28 +5661,33 @@ } } @@ -1272,7 +1272,7 @@ entries = get2(); if (entries > 512) return 1; while (entries--) { -@@ -5758,7 +5758,8 @@ +@@ -5758,7 +5757,8 @@ fgets (make, 64, ifp); break; case 272: /* Model */ @@ -1282,7 +1282,7 @@ break; case 280: /* Panasonic RW2 offset */ if (type != 4) break; -@@ -5818,6 +5819,9 @@ +@@ -5818,6 +5818,9 @@ case 315: /* Artist */ fread (artist, 64, 1, ifp); break; @@ -1292,7 +1292,7 @@ case 322: /* TileWidth */ tiff_ifd[ifd].tile_width = getint(type); break; -@@ -5833,6 +5837,9 @@ +@@ -5833,6 +5836,9 @@ is_raw = 5; } break; @@ -1302,7 +1302,7 @@ case 330: /* SubIFDs */ if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) { load_raw = &CLASS sony_arw_load_raw; -@@ -5846,6 +5853,9 @@ +@@ -5846,6 +5852,9 @@ fseek (ifp, i+4, SEEK_SET); } break; @@ -1312,7 +1312,7 @@ case 400: strcpy (make, "Sarnoff"); maximum = 0xfff; -@@ -6063,12 +6073,21 @@ +@@ -6063,12 +6072,21 @@ case 61450: cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ @@ -1340,7 +1340,7 @@ case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ for (num=i=0; i < (len & 0xffff); i++) -@@ -6085,13 +6104,13 @@ +@@ -6085,13 +6103,13 @@ case 50721: /* ColorMatrix1 */ case 50722: /* ColorMatrix2 */ FORCC for (j=0; j < 3; j++) @@ -1356,7 +1356,7 @@ break; case 50727: /* AnalogBalance */ FORCC ab[c] = getreal(type); -@@ -6114,6 +6133,11 @@ +@@ -6114,6 +6132,11 @@ case 50752: read_shorts (cr2_slice, 3); break; @@ -1368,7 +1368,7 @@ case 50829: /* ActiveArea */ top_margin = getint(type); left_margin = getint(type); -@@ -6146,21 +6170,27 @@ +@@ -6146,21 +6169,27 @@ fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; @@ -1404,7 +1404,7 @@ cam_xyz_coeff (cmatrix, cam_xyz); } if (asn[0]) { -@@ -6168,13 +6198,14 @@ +@@ -6168,13 +6197,14 @@ FORCC cam_mul[c] = 1 / asn[c]; } if (!use_cm) @@ -1420,7 +1420,7 @@ fseek (ifp, base, SEEK_SET); order = get2(); -@@ -6206,6 +6237,7 @@ +@@ -6206,6 +6236,7 @@ shutter = tiff_ifd[i].shutter; tiff_ifd[i].shutter = shutter; } @@ -1428,7 +1428,7 @@ for (i=0; i < tiff_nifds; i++) { if (max_samp < tiff_ifd[i].samples) max_samp = tiff_ifd[i].samples; -@@ -6266,7 +6298,12 @@ +@@ -6266,7 +6297,12 @@ case 8: load_raw = &CLASS eight_bit_load_raw; break; case 12: if (tiff_ifd[raw].phint == 2) load_flags = 6; @@ -1442,7 +1442,7 @@ case 14: load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && -@@ -6305,6 +6342,7 @@ +@@ -6305,6 +6341,7 @@ case 32803: load_raw = &CLASS kodak_65000_load_raw; } case 32867: case 34892: break; @@ -1450,7 +1450,7 @@ default: is_raw = 0; } if (!dng_version) -@@ -6390,7 +6428,7 @@ +@@ -6390,7 +6427,7 @@ { const char *file, *ext; char *jname, *jfile, *jext; @@ -1459,7 +1459,7 @@ ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); -@@ -6412,13 +6450,14 @@ +@@ -6412,13 +6449,14 @@ } else while (isdigit(*--jext)) { if (*jext != '9') { @@ -1476,7 +1476,7 @@ if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); parse_tiff (12); -@@ -6693,6 +6732,7 @@ +@@ -6693,6 +6731,7 @@ load_raw = ph1.format < 3 ? &CLASS phase_one_load_raw : &CLASS phase_one_load_raw_c; maximum = 0xffff; @@ -1484,7 +1484,7 @@ strcpy (make, "Phase One"); if (model[0]) return; switch (raw_height) { -@@ -6761,7 +6801,11 @@ +@@ -6761,7 +6800,11 @@ order = get2(); hlen = get4(); if (get4() == 0x48454150) /* "HEAP" */ @@ -1496,7 +1496,7 @@ if (parse_tiff (save+6)) apply_tiff(); fseek (ifp, save+len, SEEK_SET); } -@@ -7033,7 +7077,8 @@ +@@ -7033,7 +7076,8 @@ { static const struct { const char *prefix; @@ -1506,7 +1506,7 @@ } table[] = { { "AgfaPhoto DC-833m", 0, 0, /* DJC */ { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, -@@ -7977,12 +8022,12 @@ +@@ -7977,12 +8021,12 @@ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, @@ -1521,7 +1521,7 @@ { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, -@@ -8088,6 +8133,33 @@ +@@ -8088,6 +8132,33 @@ } break; } @@ -1555,7 +1555,7 @@ } void CLASS simple_coeff (int index) -@@ -8410,7 +8482,7 @@ +@@ -8410,7 +8481,7 @@ tiff_flip = flip = filters = UINT_MAX; /* unknown */ raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; maximum = height = width = top_margin = left_margin = 0; @@ -1564,7 +1564,7 @@ iso_speed = shutter = aperture = focal_len = unique_id = 0; tiff_nifds = 0; memset (tiff_ifd, 0, sizeof tiff_ifd); -@@ -8442,13 +8514,20 @@ +@@ -8442,13 +8513,20 @@ fread (head, 1, 32, ifp); fseek (ifp, 0, SEEK_END); flen = fsize = ftell(ifp); @@ -1587,7 +1587,7 @@ parse_ciff (hlen, flen-hlen, 0); load_raw = &CLASS canon_load_raw; } else if (parse_tiff(0)) apply_tiff(); -@@ -8494,6 +8573,7 @@ +@@ -8494,6 +8572,7 @@ fseek (ifp, 100+28*(shot_select > 0), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); @@ -1595,7 +1595,7 @@ apply_tiff(); } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); -@@ -8607,9 +8687,10 @@ +@@ -8607,9 +8686,10 @@ if (make[0] == 0) parse_smal (0, flen); if (make[0] == 0) { parse_jpeg(0); @@ -1609,7 +1609,7 @@ strcpy (make, "OmniVision"); data_offset = ftell(ifp) + 0x8000-32; width = raw_width; -@@ -8618,6 +8699,7 @@ +@@ -8618,6 +8698,7 @@ filters = 0x16161616; } else is_raw = 0; } @@ -1617,7 +1617,7 @@ for (i=0; i < sizeof corp / sizeof *corp; i++) if (strcasestr (make, corp[i])) /* Simplify company names */ -@@ -8649,7 +8731,7 @@ +@@ -8649,7 +8730,7 @@ if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) @@ -1626,7 +1626,7 @@ if (width >= 4960 && !strncmp(model,"K-5",3)) { left_margin = 10; width = 4950; filters = 0x16161616; } if (width == 4736 && !strcmp(model,"K-7")) -@@ -8669,6 +8751,7 @@ +@@ -8669,6 +8750,7 @@ case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; @@ -1634,7 +1634,7 @@ case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; } -@@ -8725,6 +8808,7 @@ +@@ -8725,6 +8807,7 @@ if (height > width) pixel_aspect = 2; filters = 0; simple_coeff(0); @@ -1642,7 +1642,7 @@ } else if (!strcmp(make,"Canon") && tiff_bps == 15) { switch (width) { case 3344: width -= 66; -@@ -9034,24 +9118,53 @@ +@@ -9034,24 +9117,53 @@ if (load_raw == &CLASS lossless_jpeg_load_raw) load_raw = &CLASS hasselblad_load_raw; if (raw_width == 7262) { @@ -1701,7 +1701,7 @@ } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); -@@ -9109,6 +9222,7 @@ +@@ -9109,6 +9221,7 @@ filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { @@ -1709,7 +1709,7 @@ if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { -@@ -9126,6 +9240,7 @@ +@@ -9126,6 +9239,7 @@ } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; @@ -1717,7 +1717,7 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -9201,13 +9316,15 @@ +@@ -9201,13 +9315,15 @@ width -= 6; } else if (!strcmp(make,"Sony") && raw_width == 7392) { width -= 30; @@ -1740,7 +1740,7 @@ } else if (!strcmp(model,"DSLR-A100")) { if (width == 3880) { height--; -@@ -9357,6 +9474,18 @@ +@@ -9357,6 +9473,18 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1759,7 +1759,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9371,9 +9500,9 @@ +@@ -9371,9 +9499,9 @@ if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; @@ -1771,7 +1771,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -9452,199 +9581,250 @@ +@@ -9452,199 +9580,250 @@ } #endif @@ -2205,7 +2205,7 @@ struct tiff_tag { ushort tag, type; int count; -@@ -9667,594 +9847,11 @@ +@@ -9667,594 +9846,11 @@ char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; From f76211509f2fede4b840b6b4c88d6aa4a228022d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 7 Jul 2016 21:44:44 +0200 Subject: [PATCH 144/232] =?UTF-8?q?Improve=20processing=20time=20to=20read?= =?UTF-8?q?=20camconst.json=20by=20almost=20factor=202.=20Additionally=20m?= =?UTF-8?q?ake=20it=20future-proof=20by=20reducing=20O(n=C2=B2)=20copying?= =?UTF-8?q?=20amount=20in=20reallocate=20phase=20to=20O(n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtengine/camconst.cc | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 8290fe085..7342e85b3 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -550,7 +550,8 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) return false; } - size_t bufsize = 4096; + size_t bufsize = 16384; + size_t increment = 2 * bufsize; size_t datasize = 0, ret; char *buf = (char *)malloc(bufsize); @@ -558,8 +559,9 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) datasize += ret; if (datasize == bufsize) { - bufsize += 4096; + bufsize += increment; buf = (char *)realloc(buf, bufsize); + increment *= 2; } } @@ -571,7 +573,11 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) } fclose(stream); - buf = (char *)realloc(buf, datasize + 1); + + if(datasize == bufsize) { + buf = (char *)realloc(buf, datasize + 1); + } + buf[datasize] = '\0'; // remove comments @@ -637,18 +643,17 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) Glib::ustring make_model(ji->valuestring); make_model = make_model.uppercase(); - std::map::iterator existingccIter = mCameraConstants.find(make_model); - if (existingccIter == mCameraConstants.end()) { - // add the new CamConst to the map - mCameraConstants.insert(std::pair(make_model, cc)); + std::pair::iterator, bool> ret; + ret = mCameraConstants.insert(std::pair(make_model, cc)); + if(ret.second) { // entry inserted into map if (settings->verbose) { printf("Add camera constants for \"%s\"\n", make_model.c_str()); } } else { // The CameraConst already exist for this camera make/model -> we merge the values - CameraConst *existingcc = existingccIter->second; + CameraConst *existingcc = ret.first->second; // updating the dcraw matrix existingcc->update_dcrawMatrix(cc->get_dcrawMatrix()); From ed7ee021502bfb3efedaf32e3d1cc2e03f1dc5bc Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 7 Jul 2016 22:31:04 +0200 Subject: [PATCH 145/232] Added change suggested by Floessie --- rtengine/camconst.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 7342e85b3..05db7470b 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -644,8 +644,7 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) Glib::ustring make_model(ji->valuestring); make_model = make_model.uppercase(); - std::pair::iterator, bool> ret; - ret = mCameraConstants.insert(std::pair(make_model, cc)); + const auto ret = mCameraConstants.emplace(make_model, cc); if(ret.second) { // entry inserted into map if (settings->verbose) { From b744eae46d1926181a0fc8a8dd997eaedb066e2f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 8 Jul 2016 12:41:38 +0200 Subject: [PATCH 146/232] Fix a bug reported by cppcheck and an OOB access, kudos to Floessie --- rtengine/imagedata.cc | 109 +++++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index bbfc303fc..2622ffcf7 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -121,61 +121,80 @@ void ImageData::extractInfo () return; } - make = ""; - model = ""; - serial = ""; - orientation = ""; - expcomp = 0; - shutter = 0; - aperture = 0; - focal_len = focal_len35mm = 0; - focus_dist = 0; - iso_speed = 0; - memset (&time, 0, sizeof(time)); + memset(&time, 0, sizeof(time)); timeStamp = 0; + iso_speed = 0; + aperture = 0.0; + focal_len = 0.0; + focal_len35mm = 0.0; + focus_dist = 0.0f; + shutter = 0.0; + expcomp = 0.0; + make.clear(); + model.clear(); + serial.clear(); + orientation.clear(); + lens.clear(); - if (root->getTag ("Make")) { - make = root->getTag ("Make")->valueToString (); - // same dcraw treatment - static const char *corp[] = { - "Canon", "NIKON", "EPSON", "KODAK", "Kodak", "OLYMPUS", "PENTAX", "RICOH", - "MINOLTA", "Minolta", "Konica", "CASIO", "Sinar", "Phase One", - "SAMSUNG", "Mamiya", "MOTOROLA", "Leaf" - }; - - for (size_t i = 0; i < (sizeof(corp) / sizeof(*corp)); i++) - if ( make.find( corp[i] ) != std::string::npos ) { /* Simplify company names */ - make = corp[i]; + if (root->getTag("Make")) { + make = root->getTag ("Make")->valueToString(); + // Same dcraw treatment + for (const auto& corp : { + "Canon", + "NIKON", + "EPSON", + "KODAK", + "Kodak", + "OLYMPUS", + "PENTAX", + "RICOH", + "MINOLTA", + "Minolta", + "Konica", + "CASIO", + "Sinar", + "Phase One", + "SAMSUNG", + "Mamiya", + "MOTOROLA", + "Leaf" + }) { + if (make.find(corp) != std::string::npos) { // Simplify company names + make = corp; break; } - - make.erase( make.find_last_not_of(' ') + 1 ); - } - - if (root->getTag ("Model")) { - model = root->getTag ("Model")->valueToString (); - } - - if (!(model.size() == 0)) { - std::size_t i = 0; - - if ( make.find("KODAK") != std::string::npos ) { - if( (i = model.find(" DIGITAL CAMERA")) != std::string::npos || - (i = model.find(" Digital Camera")) != std::string::npos || - (i = model.find("FILE VERSION")) ) { - model.resize( i ); - } } - model.erase( model.find_last_not_of(' ') + 1 ); + make.erase(make.find_last_not_of(' ') + 1); + } - //if( (i=model.find( make )) != std::string::npos ) - if( !strncasecmp (model.c_str(), make.c_str(), make.size()) ) - if( model.at( make.size() ) == ' ') { + if (root->getTag("Model")) { + model = root->getTag("Model")->valueToString(); + } + + if (!model.empty()) { + std::string::size_type i = 0; + + if ( + make.find("KODAK") != std::string::npos + && ( + (i = model.find(" DIGITAL CAMERA")) != std::string::npos + || (i = model.find(" Digital Camera")) != std::string::npos + || (i = model.find("FILE VERSION")) != std::string::npos + ) + ) { + model.resize(i); + } + + model.erase(model.find_last_not_of(' ') + 1); + + if (!strncasecmp(model.c_str(), make.c_str(), make.size())) { + if (model.size() >= make.size() && model[make.size()] == ' ') { model.erase(0, make.size() + 1); } + } - if( model.find( "Digital Camera ") != std::string::npos ) { + if (model.find( "Digital Camera ") != std::string::npos) { model.erase(0, 15); } } else { From 719b405076e60217ea551062521f21fbed11b575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 8 Jul 2016 17:28:27 +0200 Subject: [PATCH 147/232] Remove vectorized medians < 25 from ImProcFunctions::Median_Denoise() - But keep those versions in `median.h` for consistency - Remove stopwatch --- rtengine/FTblockDN.cc | 62 +------------------------------------------ 1 file changed, 1 insertion(+), 61 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 1097d5a0f..633162d4c 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -38,9 +38,6 @@ #include "cplx_wavelet_dec.h" #include "median.h" -#define BENCHMARK -#include "StopWatch.h" - #ifdef _OPENMP #include #endif @@ -99,7 +96,7 @@ float media(float *elements, int N) } void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) -{ BENCHFUN +{ int border = 1; switch (medianType) { @@ -171,21 +168,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } -#ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { - STVFU( - medianOut[i][j], - median( - LVFU(medianIn[i - 1][j]), - LVFU(medianIn[i][j - 1]), - LVFU(medianIn[i][j]), - LVFU(medianIn[i][j + 1]), - LVFU(medianIn[i + 1][j]) - ) - ); - } -#endif - for (; j < width - border; ++j) { medianOut[i][j] = median( medianIn[i - 1][j], @@ -206,25 +188,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } -#ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { - STVFU( - medianOut[i][j], - median( - LVFU(medianIn[i - 1][j - 1]), - LVFU(medianIn[i - 1][j]), - LVFU(medianIn[i - 1][j + 1]), - LVFU(medianIn[i][j - 1]), - LVFU(medianIn[i][j]), - LVFU(medianIn[i][j + 1]), - LVFU(medianIn[i + 1][j - 1]), - LVFU(medianIn[i + 1][j]), - LVFU(medianIn[i + 1][j + 1]) - ) - ); - } -#endif - for (; j < width - border; ++j) { medianOut[i][j] = median( medianIn[i - 1][j - 1], @@ -249,29 +212,6 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medianOut[i][j] = medianIn[i][j]; } -#ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { - STVFU( - medianOut[i][j], - median( - LVFU(medianIn[i - 2][j]), - LVFU(medianIn[i - 1][j - 1]), - LVFU(medianIn[i - 1][j]), - LVFU(medianIn[i - 1][j + 1]), - LVFU(medianIn[i][j - 2]), - LVFU(medianIn[i][j - 1]), - LVFU(medianIn[i][j]), - LVFU(medianIn[i][j + 1]), - LVFU(medianIn[i][j + 2]), - LVFU(medianIn[i + 1][j - 1]), - LVFU(medianIn[i + 1][j]), - LVFU(medianIn[i + 1][j + 1]), - LVFU(medianIn[i + 2][j]) - ) - ); - } -#endif - for (; j < width - border; ++j) { medianOut[i][j] = median( medianIn[i - 2][j], From 7f66eb5ec49096ed79d65e4c2e197e814979a6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 9 Jul 2016 11:47:47 +0200 Subject: [PATCH 148/232] Move common code out of switch in ImProcFunctions::Median_Denoise() - Move suggested by @heckflosse - Use switch/case - astyle `FTblockDN.cc` - Whitespace cleanups - Apply `median()` on `ffmanager.cc` --- rtengine/FTblockDN.cc | 1547 +++++++++++++++++++++-------------------- rtengine/ffmanager.cc | 13 +- rtengine/improcfun.h | 12 +- 3 files changed, 797 insertions(+), 775 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 633162d4c..b9e42c980 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -95,30 +95,36 @@ float media(float *elements, int N) return elements[N >> 1]; } -void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) +void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) { int border = 1; switch (medianType) { - case Median::SIZE_3X3_SOFT: - case Median::SIZE_3X3_STRONG: - border = 1; - break; + case Median::TYPE_3X3_SOFT: + case Median::TYPE_3X3_STRONG: { + border = 1; + break; + } - case Median::SIZE_5X5_SOFT: - border = 2; - break; + case Median::TYPE_5X5_SOFT: { + border = 2; + break; + } - case Median::SIZE_5X5_STRONG: - border = 2; - break; + case Median::TYPE_5X5_STRONG: { + border = 2; + break; + } - case Median::SIZE_7X7: - border = 3; - break; + case Median::TYPE_7X7: { + border = 3; + break; + } - default: // includes Median::SIZE_9X9 - border = 4; + case Median::TYPE_9X9: { + border = 4; + break; + } } float **allocBuffer = NULL; @@ -126,8 +132,8 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medBuffer[0] = src; // we need a buffer if src == dst or if (src != dst && iterations > 1) - if(src == dst || (src != dst && iterations > 1)) { - if(buffer == NULL) { // we didn't get a buufer => create one + if (src == dst || (src != dst && iterations > 1)) { + if (buffer == NULL) { // we didn't get a buufer => create one allocBuffer = new float*[height]; for (int i = 0; i < height; ++i) { @@ -145,11 +151,11 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, float ** medianIn, ** medianOut; int BufferIndex = 0; - for(int iteration = 1; iteration <= iterations; ++iteration) { + for (int iteration = 1; iteration <= iterations; ++iteration) { medianIn = medBuffer[BufferIndex]; medianOut = medBuffer[BufferIndex ^ 1]; - if(iteration == 1) { // upper border + if (iteration == 1) { // upper border for (int i = 0; i < border; ++i) for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; @@ -157,229 +163,215 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } #ifdef _OPENMP - #pragma omp parallel for num_threads(numThreads) if(numThreads>1) schedule(dynamic,16) + #pragma omp parallel for num_threads(numThreads) if (numThreads>1) schedule(dynamic,16) #endif for (int i = border; i < height - border; ++i) { - if (medianType == Median::SIZE_3X3_SOFT) { - int j = 0; + int j = 0; - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + for (; j < border; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + + switch (medianType) { + case Median::TYPE_3X3_SOFT: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j] + ); + } + + break; } - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j] - ); + case Median::TYPE_3X3_STRONG: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1] + ); + } + + break; } - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_3X3_STRONG) { - int j = 0; + case Median::TYPE_5X5_SOFT: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 2][j] + ); + } - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_5X5_SOFT) { - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 2][j] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if(medianType == Median::SIZE_5X5_STRONG) { - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } + case Median::TYPE_5X5_STRONG: { #ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { - STVFU( - medianOut[i][j], - median( - LVFU(medianIn[i - 2][j - 2]), - LVFU(medianIn[i - 2][j - 1]), - LVFU(medianIn[i - 2][j]), - LVFU(medianIn[i - 2][j + 1]), - LVFU(medianIn[i - 2][j + 2]), - LVFU(medianIn[i - 1][j - 2]), - LVFU(medianIn[i - 1][j - 1]), - LVFU(medianIn[i - 1][j]), - LVFU(medianIn[i - 1][j + 1]), - LVFU(medianIn[i - 1][j + 2]), - LVFU(medianIn[i][j - 2]), - LVFU(medianIn[i][j - 1]), - LVFU(medianIn[i][j]), - LVFU(medianIn[i][j + 1]), - LVFU(medianIn[i][j + 2]), - LVFU(medianIn[i + 1][j - 2]), - LVFU(medianIn[i + 1][j - 1]), - LVFU(medianIn[i + 1][j]), - LVFU(medianIn[i + 1][j + 1]), - LVFU(medianIn[i + 1][j + 2]), - LVFU(medianIn[i + 2][j - 2]), - LVFU(medianIn[i + 2][j - 1]), - LVFU(medianIn[i + 2][j]), - LVFU(medianIn[i + 2][j + 1]), - LVFU(medianIn[i + 2][j + 2]) - ) - ); - } + + for (; j < width - border - 3; j += 4) { + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 2][j - 2]), + LVFU(medianIn[i - 2][j - 1]), + LVFU(medianIn[i - 2][j]), + LVFU(medianIn[i - 2][j + 1]), + LVFU(medianIn[i - 2][j + 2]), + LVFU(medianIn[i - 1][j - 2]), + LVFU(medianIn[i - 1][j - 1]), + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i - 1][j + 1]), + LVFU(medianIn[i - 1][j + 2]), + LVFU(medianIn[i][j - 2]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i][j + 2]), + LVFU(medianIn[i + 1][j - 2]), + LVFU(medianIn[i + 1][j - 1]), + LVFU(medianIn[i + 1][j]), + LVFU(medianIn[i + 1][j + 1]), + LVFU(medianIn[i + 1][j + 2]), + LVFU(medianIn[i + 2][j - 2]), + LVFU(medianIn[i + 2][j - 1]), + LVFU(medianIn[i + 2][j]), + LVFU(medianIn[i + 2][j + 1]), + LVFU(medianIn[i + 2][j + 2]) + ) + ); + } + #endif - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j - 2], - medianIn[i - 2][j - 1], - medianIn[i - 2][j], - medianIn[i - 2][j + 1], - medianIn[i - 2][j + 2], - medianIn[i - 1][j - 2], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i - 1][j + 2], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 1][j + 2], - medianIn[i + 2][j - 2], - medianIn[i + 2][j - 1], - medianIn[i + 2][j], - medianIn[i + 2][j + 1], - medianIn[i + 2][j + 2] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_7X7) { - std::array pp; - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - -#ifdef __SSE2__ - std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - vpp[kk] = LVFU(medianIn[i + ii][j + jj]); - } + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j - 2], + medianIn[i - 2][j - 1], + medianIn[i - 2][j], + medianIn[i - 2][j + 1], + medianIn[i - 2][j + 2], + medianIn[i - 1][j - 2], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i - 1][j + 2], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 1][j + 2], + medianIn[i + 2][j - 2], + medianIn[i + 2][j - 1], + medianIn[i + 2][j], + medianIn[i + 2][j + 1], + medianIn[i + 2][j + 2] + ); } - STVFU(medianOut[i][j], median(vpp)); + break; } + + case Median::TYPE_7X7: { +#ifdef __SSE2__ + std::array vpp ALIGNED16; + + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } + } + + STVFU(medianOut[i][j], median(vpp)); + } + #endif - for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + std::array pp; + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } + + medianOut[i][j] = median(pp); } - medianOut[i][j] = median(pp); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else { // includes Median::SIZE_9X9 - std::array pp; - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } + case Median::TYPE_9X9: { #ifdef __SSE2__ - std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + std::array vpp ALIGNED16; + + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } } + + STVFU(medianOut[i][j], median(vpp)); } - STVFU(medianOut[i][j], median(vpp)); - } #endif - for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + std::array pp; + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } + + medianOut[i][j] = median(pp); } - medianOut[i][j] = median(pp); - } + for (; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } } + + for (; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } } - if(iteration == 1) { // lower border + if (iteration == 1) { // lower border for (int i = height - border; i < height; ++i) for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; @@ -389,19 +381,19 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, BufferIndex ^= 1; // swap buffers } - if(medianOut != dst) { + if (medianOut != dst) { #ifdef _OPENMP - #pragma omp parallel for num_threads(numThreads) if(numThreads>1) + #pragma omp parallel for num_threads(numThreads) if (numThreads>1) #endif - for(int i = border; i < height - border; ++i ) { - for(int j = border; j < width - border; ++j) { + for (int i = border; i < height - border; ++i) { + for (int j = border; j < width - border; ++j) { dst[i][j] = medianOut[i][j]; } } } - if(allocBuffer != NULL) { // we allocated memory, so let's free it now + if (allocBuffer != NULL) { // we allocated memory, so let's free it now for (int i = 0; i < height; ++i) { delete[] allocBuffer[i]; } @@ -413,7 +405,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, void ImProcFunctions::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) { - if(kall == 2) { + if (kall == 2) { if (imwidth < tilesize) { numtiles_W = 1; @@ -438,7 +430,7 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt } } - if(kall == 0) { + if (kall == 0) { numtiles_W = 1; tileWskip = imwidth; tilewidth = imwidth; @@ -462,11 +454,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //#endif if (dnparams.luma == 0 && dnparams.chroma == 0 && !dnparams.median && !noiseLCurve && !noiseCCurve) { //nothing to do; copy src to dst or do nothing in case src == dst - if(src != dst) { + if (src != dst) { src->copyData(dst); } - if(calclum) { + if (calclum) { delete calclum; calclum = NULL; } @@ -479,8 +471,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const nrquality nrQuality = (dnparams.smethod == "shal") ? QUALITY_STANDARD : QUALITY_HIGH;//shrink method const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / (float) settings->nrhigh : 1.0f; - const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f ); - const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f ); + const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f); + const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f); const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV")); float** lumcalc; @@ -491,28 +483,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef bool ponder = false; float ponderCC = 1.f; - if(settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PON") { + if (settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PON") { ponder = true; ponderCC = 0.5f; } - if(settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PRE") { + if (settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PRE") { ponderCC = 0.5f; } - if(settings->leveldnautsimpl == 0 && params->dirpyrDenoise.Cmethod == "PREV") { + if (settings->leveldnautsimpl == 0 && params->dirpyrDenoise.Cmethod == "PREV") { ponderCC = 0.5f; } int metchoice = 0; - if(dnparams.methodmed == "Lonly") { + if (dnparams.methodmed == "Lonly") { metchoice = 1; - } else if(dnparams.methodmed == "Lab") { + } else if (dnparams.methodmed == "Lab") { metchoice = 2; - } else if(dnparams.methodmed == "ab") { + } else if (dnparams.methodmed == "ab") { metchoice = 3; - } else if(dnparams.methodmed == "Lpab") { + } else if (dnparams.methodmed == "Lpab") { metchoice = 4; } @@ -523,7 +515,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const bool denoiseLuminance = (noisevarL > 0.00001f); //printf("NL=%f \n",noisevarL); - if(useNoiseLCurve || useNoiseCCurve) { + if (useNoiseLCurve || useNoiseCCurve) { int hei = calclum->height; int wid = calclum->width; TMatrix wprofi = iccStore->workingSpaceMatrix (params->icm.working); @@ -536,20 +528,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef lumcalcBuffer = new float[hei * wid]; lumcalc = new float*[(hei)]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { lumcalc[i] = lumcalcBuffer + (i * wid); } ccalcBuffer = new float[hei * wid]; ccalc = new float*[(hei)]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { ccalc[i] = ccalcBuffer + (i * wid); } float cn100Precalc; - if(useNoiseCCurve) { + if (useNoiseCCurve) { cn100Precalc = SQR(1.f + ponderCC * (4.f * noiseCCurve[100.f / 60.f])); } @@ -557,8 +549,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for schedule(dynamic,16) #endif - for(int ii = 0; ii < hei; ii++) { - for(int jj = 0; jj < wid; jj++) { + for (int ii = 0; ii < hei; ++ii) { + for (int jj = 0; jj < wid; ++jj) { float LLum, AAum, BBum; float RL = calclum->r(ii, jj); @@ -569,14 +561,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef Color::rgbxyz(RL, GL, BL, XL, YL, ZL, wpi); Color::XYZ2Lab(XL, YL, ZL, LLum, AAum, BBum); - if(useNoiseLCurve) { + if (useNoiseLCurve) { float epsi = 0.01f; - if(LLum < 2.f) { + if (LLum < 2.f) { LLum = 2.f; //avoid divided by zero } - if(LLum > 32768.f) { + if (LLum > 32768.f) { LLum = 32768.f; // not strictly necessary } @@ -586,10 +578,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef lumcalc[ii][jj] = SQR((kinterm / 125.f) * (1.f + kinterm / 25.f)); } - if(useNoiseCCurve) { + if (useNoiseCCurve) { float cN = sqrtf(SQR(AAum) + SQR(BBum)); - if(cN > 100) { + if (cN > 100) { ccalc[ii][jj] = SQR(1.f + ponderCC * (4.f * noiseCCurve[cN / 60.f])); } else { ccalc[ii][jj] = cn100Precalc; @@ -604,13 +596,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const short int imheight = src->height, imwidth = src->width; - if (dnparams.luma != 0 || dnparams.chroma != 0 || dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly" ) { + if (dnparams.luma != 0 || dnparams.chroma != 0 || dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly") { // gamma transform for input data float gam = dnparams.gamma; float gamthresh = 0.001f; - if(!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG - if(gam < 1.9f) { + if (!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG + if (gam < 1.9f) { gam = 1.f - (1.9f - gam) / 3.f; //minimum gamma 0.7 } else if (gam >= 1.9f && gam <= 3.f) { gam = (1.4f / 1.1f) * gam - 1.41818f; @@ -621,12 +613,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf gamcurve(65536, LUT_CLIP_BELOW); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; } } @@ -638,12 +630,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf igamcurve(65536, LUT_CLIP_BELOW); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { igamcurve[i] = (Color::gamma((float)i / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { igamcurve[i] = (Color::gamman((float)i / 32768.0f, igam) * 65535.0f); } } @@ -651,7 +643,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const float gain = pow (2.0f, float(expcomp)); float noisevar_Ldetail = SQR((float)(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); - if(settings->verbose) { + if (settings->verbose) { printf("Denoise Lab=%i\n", settings->denoiselabgamma); } @@ -665,34 +657,34 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf *denoiseigamtab; switch(settings->denoiselabgamma) { - case 0: - denoisegamtab = &(Color::gammatab_26_11); - denoiseigamtab = &(Color::igammatab_26_11); - break; + case 0: + denoisegamtab = &(Color::gammatab_26_11); + denoiseigamtab = &(Color::igammatab_26_11); + break; - case 1: - denoisegamtab = &(Color::gammatab_4); - denoiseigamtab = &(Color::igammatab_4); - break; + case 1: + denoisegamtab = &(Color::gammatab_4); + denoiseigamtab = &(Color::igammatab_4); + break; - default: - denoisegamtab = &(Color::gammatab_55); - denoiseigamtab = &(Color::igammatab_55); - break; + default: + denoisegamtab = &(Color::gammatab_55); + denoiseigamtab = &(Color::igammatab_55); + break; } array2D tilemask_in(TS, TS); array2D tilemask_out(TS, TS); - if(denoiseLuminance) { + if (denoiseLuminance) { const int border = MAX(2, TS / 16); - for (int i = 0; i < TS; i++) { + for (int i = 0; i < TS; ++i) { float i1 = abs((i > TS / 2 ? i - TS + 1 : i)); float vmask = (i1 < border ? SQR(sin((M_PI * i1) / (2 * border))) : 1.0f); float vmask2 = (i1 < 2 * border ? SQR(sin((M_PI * i1) / (2 * border))) : 1.0f); - for (int j = 0; j < TS; j++) { + for (int j = 0; j < TS; ++j) { float j1 = abs((j > TS / 2 ? j - TS + 1 : j)); tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((M_PI * j1) / (2 * border))) : 1.0f)) + epsilon; tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((M_PI * j1) / (2 * border))) : 1.0f)) + epsilon; @@ -704,28 +696,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int tilesize; int overlap; - if(settings->leveldnti == 0) { + if (settings->leveldnti == 0) { tilesize = 1024; overlap = 128; } - if(settings->leveldnti == 1) { + if (settings->leveldnti == 1) { tilesize = 768; overlap = 96; } int numTries = 0; - if(ponder) { + if (ponder) { printf("Tiled denoise processing caused by Automatic Multizone mode\n"); } bool memoryAllocationFailed = false; do { - numTries++; + ++numTries; - if(numTries == 2) { + if (numTries == 2) { printf("1st denoise pass failed due to insufficient memory, starting 2nd (tiled) pass now...\n"); } @@ -738,7 +730,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //output buffer Imagefloat * dsttmp; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp = dst; } else { dsttmp = new Imagefloat(imwidth, imheight); @@ -746,8 +738,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for(int i = 0; i < imheight; i++) - for(int j = 0; j < imwidth; j++) { + for (int i = 0; i < imheight; ++i) + for (int j = 0; j < imwidth; ++j) { dsttmp->r(i, j) = 0.f; dsttmp->g(i, j) = 0.f; dsttmp->b(i, j) = 0.f; @@ -763,13 +755,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // calculate max size of numblox_W. int max_numblox_W = ceil(((float)(MIN(imwidth, tilewidth))) / (offset)) + 2 * blkrad; // calculate min size of numblox_W. - int min_numblox_W = ceil(((float)((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth) ) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; + int min_numblox_W = ceil(((float)((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth)) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; // these are needed only for creation of the plans and will be freed before entering the parallel loop fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; - if(denoiseLuminance) { + if (denoiseLuminance) { float *Lbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); float *fLbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); @@ -784,8 +776,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, NULL, 1, TS * TS, fLbloxtmp, NULL, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - fftwf_free ( Lbloxtmp ); - fftwf_free ( fLbloxtmp ); + fftwf_free (Lbloxtmp); + fftwf_free (fLbloxtmp); } #ifndef _OPENMP @@ -794,7 +786,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles int numthreads = MIN(numtiles, omp_get_max_threads()); - if(options.rgbDenoiseThreadLimit > 0) { + if (options.rgbDenoiseThreadLimit > 0) { numthreads = MIN(numthreads, options.rgbDenoiseThreadLimit); } @@ -802,20 +794,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef denoiseNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); - if(denoiseNestedLevels < 2) { + if (denoiseNestedLevels < 2) { denoiseNestedLevels = 1; } else { omp_set_nested(true); } - if(options.rgbDenoiseThreadLimit > 0) + if (options.rgbDenoiseThreadLimit > 0) while(denoiseNestedLevels * numthreads > options.rgbDenoiseThreadLimit) { denoiseNestedLevels--; } #endif - if(settings->verbose) { + if (settings->verbose) { printf("RGB_denoise uses %d main thread(s) and up to %d nested thread(s) for each main thread\n", numthreads, denoiseNestedLevels); } @@ -823,8 +815,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float *LbloxArray[denoiseNestedLevels * numthreads]; float *fLbloxArray[denoiseNestedLevels * numthreads]; - if(numtiles > 1 && denoiseLuminance) - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (numtiles > 1 && denoiseLuminance) + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); } @@ -848,14 +840,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // begin tile processing of image #ifdef _OPENMP - #pragma omp parallel num_threads(numthreads) if(numthreads>1) + #pragma omp parallel num_threads(numthreads) if (numthreads>1) #endif { int pos; float* noisevarlum; float* noisevarchrom; - if(numtiles == 1 && isRAW && (useNoiseCCurve || useNoiseLCurve)) { + if (numtiles == 1 && isRAW && (useNoiseCCurve || useNoiseLCurve)) { noisevarlum = lumcalcBuffer; noisevarchrom = ccalcBuffer; } else { @@ -880,25 +872,25 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float interm_med = (float) dnparams.chroma / 10.0; float intermred, intermblue; - if(dnparams.redchro > 0.) { + if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit } - if(dnparams.bluechro > 0.) { + if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit } - if(ponder && kall == 2) { + if (ponder && kall == 2) { interm_med = ch_M[pos] / 10.f; intermred = max_r[pos] / 10.f; intermblue = max_b[pos] / 10.f; } - if(ponder && kall == 0) { + if (ponder && kall == 0) { interm_med = 0.01f; intermred = 0.f; intermblue = 0.f; @@ -929,16 +921,16 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (isRAW) {//image is raw; use channel differences for chroma channels - if(!denoiseMethodRgb) { //lab mode + if (!denoiseMethodRgb) { //lab mode //modification Jacques feb 2013 and july 2014 #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float R_ = gain * src->r(i, j); float G_ = gain * src->g(i, j); @@ -965,8 +957,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = a; labdn->b[i1][j1] = b; - if(((i1 | j1) & 1) == 0) { - if(numTries == 1) { + if (((i1 | j1) & 1) == 0) { + if (numTries == 1) { noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } else { @@ -980,13 +972,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } else {//RGB mode #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float X = gain * src->r(i, j); @@ -1001,8 +993,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = (X - Y); labdn->b[i1][j1] = (Y - Z); - if(((i1 | j1) & 1) == 0) { - if(numTries == 1) { + if (((i1 | j1) & 1) == 0) { + if (numTries == 1) { noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } else { @@ -1015,13 +1007,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } else {//image is not raw; use Lab parametrization #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float L, a, b; float rLum = src->r(i, j) ; //for denoise curves @@ -1049,24 +1041,24 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = a; labdn->b[i1][j1] = b; - if(((i1 | j1) & 1) == 0) { + if (((i1 | j1) & 1) == 0) { float Llum, alum, blum; - if(useNoiseLCurve || useNoiseCCurve) { + if (useNoiseLCurve || useNoiseCCurve) { float XL, YL, ZL; Color::rgbxyz(rLum, gLum, bLum, XL, YL, ZL, wp); Color::XYZ2Lab(XL, YL, ZL, Llum, alum, blum); } - if(useNoiseLCurve) { + if (useNoiseLCurve) { float kN = Llum; float epsi = 0.01f; - if(kN < 2.f) { + if (kN < 2.f) { kN = 2.f; } - if(kN > 32768.f) { + if (kN > 32768.f) { kN = 32768.f; } @@ -1078,12 +1070,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = noisevarL; } - if(useNoiseCCurve) { + if (useNoiseCCurve) { float aN = alum; float bN = blum; float cN = sqrtf(SQR(aN) + SQR(bN)); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero ??? } @@ -1106,20 +1098,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float interm_medT = (float) dnparams.chroma / 10.0; bool execwavelet = true; - if(!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { + if (!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { execwavelet = false; //do not exec wavelet if sliders luminance and chroma are very small and median need } //we considered user don't want wavelet - if(settings->leveldnautsimpl == 1 && dnparams.Cmethod != "MAN") { + if (settings->leveldnautsimpl == 1 && dnparams.Cmethod != "MAN") { execwavelet = true; } - if(settings->leveldnautsimpl == 0 && dnparams.C2method != "MANU") { + if (settings->leveldnautsimpl == 0 && dnparams.C2method != "MANU") { execwavelet = true; } - if(execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 + if (execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 wavelet_decomposition* Ldecomp; wavelet_decomposition* adecomp; @@ -1127,66 +1119,66 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float maxreal = max(realred, realblue); //increase the level of wavelet if user increase much or very much sliders - if( maxreal < 8.f) { + if (maxreal < 8.f) { levwav = 5; - } else if( maxreal < 10.f) { + } else if (maxreal < 10.f) { levwav = 6; - } else if( maxreal < 15.f) { + } else if (maxreal < 15.f) { levwav = 7; } else { levwav = 8; //maximum ==> I have increase Maxlevel in cplx_wavelet_dec.h from 8 to 9 } - if(nrQuality == QUALITY_HIGH) { + if (nrQuality == QUALITY_HIGH) { levwav += settings->nrwavlevel; //increase level for enhanced mode } - if(levwav > 8) { + if (levwav > 8) { levwav = 8; } int minsizetile = min(tilewidth, tileheight); int maxlev2 = 8; - if(minsizetile < 256) { + if (minsizetile < 256) { maxlev2 = 7; } - if(minsizetile < 128) { + if (minsizetile < 128) { maxlev2 = 6; } - if(minsizetile < 64) { + if (minsizetile < 64) { maxlev2 = 5; } levwav = min(maxlev2, levwav); - // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b ); + // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b); Ldecomp = new wavelet_decomposition (labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(Ldecomp->memoryAllocationFailed) { + if (Ldecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } float madL[8][3]; - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { // precalculate madL, because it's used in adecomp and bdecomp int maxlvl = Ldecomp->maxlevel(); #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); } else { madL[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); @@ -1202,29 +1194,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef adecomp = new wavelet_decomposition (labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(adecomp->memoryAllocationFailed) { + if (adecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + if (!memoryAllocationFailed) { + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } } } - if(!memoryAllocationFailed) { - if(kall == 0) { + if (!memoryAllocationFailed) { + if (kall == 0) { Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb); chresidtemp = chresid; chmaxresidtemp = chmaxresid; @@ -1235,32 +1227,32 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete adecomp; - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { wavelet_decomposition* bdecomp = new wavelet_decomposition (labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(bdecomp->memoryAllocationFailed) { + if (bdecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + if (!memoryAllocationFailed) { + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } } } - if(!memoryAllocationFailed) { - if(kall == 0) { + if (!memoryAllocationFailed) { + if (kall == 0) { Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb); chresid += chresidtemp; chmaxresid += chmaxresidtemp; @@ -1274,34 +1266,34 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete bdecomp; - if(!memoryAllocationFailed) { - if(denoiseLuminance) { + if (!memoryAllocationFailed) { + if (denoiseLuminance) { int edge = 0; - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { //enhance mode + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { memoryAllocationFailed = true; } } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { // copy labdn->L to Lin before it gets modified by reconstruction Lin = new array2D(width, height); #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { + for (int i = 0; i < height; ++i) + for (int j = 0; j < width; ++j) { (*Lin)[i][j] = labdn->L[i][j]; } @@ -1314,78 +1306,78 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete Ldecomp; } - if(!memoryAllocationFailed) { - if( (metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { + if (!memoryAllocationFailed) { + if ((metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { float** tmL; int wid = labdn->W; int hei = labdn->H; tmL = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { tmL[i] = new float[wid]; } - Median medianTypeL = Median::SIZE_3X3_SOFT; - Median medianTypeAB = Median::SIZE_3X3_SOFT; + Median medianTypeL = Median::TYPE_3X3_SOFT; + Median medianTypeAB = Median::TYPE_3X3_SOFT; - if(dnparams.medmethod == "soft") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_3X3_SOFT; + if (dnparams.medmethod == "soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_SOFT; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_3X3_SOFT; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_SOFT; } - } else if(dnparams.medmethod == "33") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_3X3_STRONG; + } else if (dnparams.medmethod == "33") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_STRONG; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_3X3_STRONG; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_STRONG; } - } else if(dnparams.medmethod == "55soft") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_5X5_SOFT; + } else if (dnparams.medmethod == "55soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_SOFT; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_5X5_SOFT; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_5X5_SOFT; } - } else if(dnparams.medmethod == "55") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_5X5_STRONG; + } else if (dnparams.medmethod == "55") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_STRONG; } else { - medianTypeL = Median::SIZE_3X3_STRONG; - medianTypeAB = Median::SIZE_5X5_STRONG; + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_5X5_STRONG; } - } else if(dnparams.medmethod == "77") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_7X7; + } else if (dnparams.medmethod == "77") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_7X7; } else { - medianTypeL = Median::SIZE_3X3_STRONG; - medianTypeAB = Median::SIZE_7X7; + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_7X7; } - } else if(dnparams.medmethod == "99") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_9X9; + } else if (dnparams.medmethod == "99") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_9X9; } else { - medianTypeL = Median::SIZE_5X5_SOFT; - medianTypeAB = Median::SIZE_9X9; + medianTypeL = Median::TYPE_5X5_SOFT; + medianTypeAB = Median::TYPE_9X9; } } if (metchoice == 1 || metchoice == 2 || metchoice == 4) { - Median_Denoise( labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); + Median_Denoise(labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); } - if(metchoice == 2 || metchoice == 3 || metchoice == 4) { - Median_Denoise( labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); - Median_Denoise( labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + if (metchoice == 2 || metchoice == 3 || metchoice == 4) { + Median_Denoise(labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + Median_Denoise(labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); } - for (int i = 0; i < hei; i++) { - delete [] tmL[i]; + for (int i = 0; i < hei; ++i) { + delete[] tmL[i]; } - delete [] tmL; + delete[] tmL; } //wavelet denoised L channel @@ -1408,14 +1400,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // Main detail recovery algorithm: Block loop //DCT block data storage - if(denoiseLuminance /*&& execwavelet*/) { + if (denoiseLuminance /*&& execwavelet*/) { //residual between input and denoised L channel array2D Ldetail(width, height, ARRAY2D_CLEAR_DATA); //pixel weight array2D totwt(width, height, ARRAY2D_CLEAR_DATA); //weight for combining DCT blocks - if(numtiles == 1) - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (numtiles == 1) + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); } @@ -1424,7 +1416,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int masterThread = omp_get_thread_num(); #endif #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { #ifdef _RT_NESTED_OPENMP @@ -1441,12 +1433,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for #endif - for (int vblk = 0; vblk < numblox_H; vblk++) { + for (int vblk = 0; vblk < numblox_H; ++vblk) { int top = (vblk - blkrad) * offset; float * datarow = pBuf + blkrad * offset; - for (int i = 0; i < TS; i++) { + for (int i = 0; i < TS; ++i) { int row = top + i; int rr = row; @@ -1456,40 +1448,40 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef rr = MAX(0, 2 * height - 2 - row); } - for (int j = 0; j < labdn->W; j++) { + for (int j = 0; j < labdn->W; ++j) { datarow[j] = ((*Lin)[rr][j] - labdn->L[rr][j]); } - for (int j = -blkrad * offset; j < 0; j++) { + for (int j = -blkrad * offset; j < 0; ++j) { datarow[j] = datarow[MIN(-j, width - 1)]; } - for (int j = width; j < width + TS + blkrad * offset; j++) { + for (int j = width; j < width + TS + blkrad * offset; ++j) { datarow[j] = datarow[MAX(0, 2 * width - 2 - j)]; }//now we have a padded data row //now fill this row of the blocks with Lab high pass data - for (int hblk = 0; hblk < numblox_W; hblk++) { + for (int hblk = 0; hblk < numblox_W; ++hblk) { int left = (hblk - blkrad) * offset; int indx = (hblk) * TS; //index of block in malloc - if(top + i >= 0 && top + i < height) { + if (top + i >= 0 && top + i < height) { int j; - for (j = 0; j < min((-left), TS); j++) { + for (j = 0; j < min((-left), TS); ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } - for (; j < min(TS, width - left); j++) { + for (; j < min(TS, width - left); ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data totwt[top + i][left + j] += tilemask_in[i][j] * tilemask_out[i][j]; } - for (; j < TS; j++) { + for (; j < TS; ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } } else { - for (int j = 0; j < TS; j++) { + for (int j = 0; j < TS; ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } } @@ -1500,7 +1492,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //fftwf_print_plan (plan_forward_blox); - if(numblox_W == max_numblox_W) { + if (numblox_W == max_numblox_W) { fftwf_execute_r2r(plan_forward_blox[0], Lblox, fLblox); // DCT an entire row of tiles } else { fftwf_execute_r2r(plan_forward_blox[1], Lblox, fLblox); // DCT an entire row of tiles @@ -1510,14 +1502,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // now process the vblk row of blocks for noise reduction - for (int hblk = 0; hblk < numblox_W; hblk++) { - RGBtile_denoise (fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer ); + for (int hblk = 0; hblk < numblox_W; ++hblk) { + RGBtile_denoise (fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //now perform inverse FT of an entire row of blocks - if(numblox_W == max_numblox_W) { + if (numblox_W == max_numblox_W) { fftwf_execute_r2r(plan_backward_blox[0], fLblox, Lblox); //for DCT } else { fftwf_execute_r2r(plan_backward_blox[1], fLblox, Lblox); //for DCT @@ -1526,7 +1518,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int topproc = (vblk - blkrad) * offset; //add row of blocks to output image tile - RGBoutput_tile_row (Lblox, Ldetail, tilemask_out, height, width, topproc ); + RGBoutput_tile_row (Lblox, Ldetail, tilemask_out, height, width, topproc); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1538,11 +1530,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = 0; i < height; i++) { - for (int j = 0; j < width; j++) { + for (int i = 0; i < height; ++i) { + for (int j = 0; j < width; ++j) { //may want to include masking threshold for large hipass data to preserve edges/detail labdn->L[i][j] += Ldetail[i][j] / totwt[i][j]; //note that labdn initially stores the denoised hipass data } @@ -1557,22 +1549,22 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Hmask[width + 1] ALIGNED16; float newGain; - if(numtiles > 1) { - for (int i = 0; i < height; i++) { + if (numtiles > 1) { + for (int i = 0; i < height; ++i) { Vmask[i] = 1; } newGain = 1.f; - if(isRAW) { + if (isRAW) { newGain = gain; } - for (int j = 0; j < width; j++) { + for (int j = 0; j < width; ++j) { Hmask[j] = 1.f / newGain; } - for (int i = 0; i < overlap; i++) { + for (int i = 0; i < overlap; ++i) { float mask = SQR(xsinf((M_PI * i) / (2 * overlap))); if (tiletop > 0) { @@ -1597,7 +1589,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //convert back to RGB and write to destination array if (isRAW) { - if(!denoiseMethodRgb) {//Lab mode + if (!denoiseMethodRgb) {//Lab mode realred /= 100.f; realblue /= 100.f; @@ -1605,10 +1597,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for schedule(dynamic,16) num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; //modification Jacques feb 2013 //true conversion Lab==>xyz @@ -1617,7 +1609,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float b = labdn->b[i1][j1]; float c_h = SQR(a) + SQR(b); - if(c_h > 9000000.f) { + if (c_h > 9000000.f) { a *= 1.f + qhighFactor * realred; b *= 1.f + qhighFactor * realblue; } @@ -1638,7 +1630,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef g_ = (*denoisegamtab)[g_]; b_ = (*denoisegamtab)[b_]; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; dsttmp->g(i, j) = newGain * g_; dsttmp->b(i, j) = newGain * b_; @@ -1655,14 +1647,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float c_h = sqrt(SQR(labdn->a[i1][j1]) + SQR(labdn->b[i1][j1])); - if(c_h > 3000.f) { + if (c_h > 3000.f) { labdn->a[i1][j1] *= 1.f + qhighFactor * realred / 100.f; labdn->b[i1][j1] *= 1.f + qhighFactor * realblue / 100.f; } @@ -1676,7 +1668,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef Y = Y < 32768.0f ? igamcurve[Y] : (Color::gamma((float)Y / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); Z = Z < 32768.0f ? igamcurve[Z] : (Color::gamma((float)Z / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * X; dsttmp->g(i, j) = newGain * Y; dsttmp->b(i, j) = newGain * Z; @@ -1695,10 +1687,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; //modification Jacques feb 2013 float L = labdn->L[i1][j1]; @@ -1706,7 +1698,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float b = labdn->b[i1][j1]; float c_h = sqrt(SQR(a) + SQR(b)); - if(c_h > 3000.f) { + if (c_h > 3000.f) { a *= 1.f + qhighFactor * realred / 100.f; b *= 1.f + qhighFactor * realblue / 100.f; } @@ -1721,7 +1713,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef g_ = g_ < 32768.0f ? igamcurve[g_] : (Color::gamman((float)g_ / 32768.0f, igam) * 65535.0f); b_ = b_ < 32768.0f ? igamcurve[b_] : (Color::gamman((float)b_ / 32768.0f, igam) * 65535.0f); - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; dsttmp->g(i, j) = newGain * g_; dsttmp->b(i, j) = newGain * b_; @@ -1740,22 +1732,22 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete labdn; - if(denoiseLuminance) { + if (denoiseLuminance) { delete Lin; } }//end of tile row }//end of tile loop - if(numtiles > 1 || !isRAW || (!useNoiseCCurve && !useNoiseLCurve)) { - delete [] noisevarlum; - delete [] noisevarchrom; + if (numtiles > 1 || !isRAW || (!useNoiseCCurve && !useNoiseLCurve)) { + delete[] noisevarlum; + delete[] noisevarchrom; } } - if(denoiseLuminance) { - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (denoiseLuminance) { + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { fftwf_free(LbloxArray[i]); fftwf_free(fLbloxArray[i]); } @@ -1766,10 +1758,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #endif //copy denoised image to output - if(numtiles > 1) { - if(!memoryAllocationFailed) { + if (numtiles > 1) { + if (!memoryAllocationFailed) { dsttmp->copyData(dst); - } else if(dst != src) { + } else if (dst != src) { src->copyData(dst); } @@ -1781,25 +1773,25 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for(int i = 0; i < dst->height; i++) - for(int j = 0; j < dst->width; j++) { + for (int i = 0; i < dst->height; ++i) + for (int j = 0; j < dst->width; ++j) { dst->r(i, j) = Color::gammatab_srgb[ dst->r(i, j) ]; dst->g(i, j) = Color::gammatab_srgb[ dst->g(i, j) ]; dst->b(i, j) = Color::gammatab_srgb[ dst->b(i, j) ]; } } - if(denoiseLuminance) { + if (denoiseLuminance) { // destroy the plans - fftwf_destroy_plan( plan_forward_blox[0] ); - fftwf_destroy_plan( plan_backward_blox[0] ); - fftwf_destroy_plan( plan_forward_blox[1] ); - fftwf_destroy_plan( plan_backward_blox[1] ); + fftwf_destroy_plan(plan_forward_blox[0]); + fftwf_destroy_plan(plan_backward_blox[0]); + fftwf_destroy_plan(plan_forward_blox[1]); + fftwf_destroy_plan(plan_backward_blox[1]); fftwf_cleanup(); } } while(memoryAllocationFailed && numTries < 2 && (options.rgbDenoiseThreadLimit == 0) && !ponder); - if(memoryAllocationFailed) { + if (memoryAllocationFailed) { printf("tiled denoise failed due to isufficient memory. Output is not denoised!\n"); } @@ -1807,13 +1799,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //median 3x3 in complement on RGB - if(dnparams.methodmed == "RGB" && dnparams.median) { + if (dnparams.methodmed == "RGB" && dnparams.median) { //printf("RGB den\n"); int wid = dst->width, hei = dst->height; float** tm; tm = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { tm[i] = new float[wid]; } @@ -1828,64 +1820,64 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int methmed = 0; int border = 1; - if(dnparams.rgbmethod == "soft") { + if (dnparams.rgbmethod == "soft") { methmed = 0; - } else if(dnparams.rgbmethod == "33") { + } else if (dnparams.rgbmethod == "33") { methmed = 1; - } else if(dnparams.rgbmethod == "55") { + } else if (dnparams.rgbmethod == "55") { methmed = 3; border = 2; - } else if(dnparams.rgbmethod == "55soft") { + } else if (dnparams.rgbmethod == "55soft") { methmed = 2; border = 2; } - for(int iteration = 1; iteration <= dnparams.passes; iteration++) { + for (int iteration = 1; iteration <= dnparams.passes; ++iteration) { #pragma omp parallel { - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1)); //3x3 soft } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1)); //3x3 } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->r(i, j), - source->r(i - 1, j), - source->r(i + 1, j), - source->r(i, j + 1), - source->r(i, j - 1), - source->r(i - 1, j - 1), - source->r(i - 1, j + 1), - source->r(i + 1, j - 1), - source->r(i + 1, j + 1), - source->r(i + 2, j), - source->r(i - 2, j), - source->r(i, j + 2), - source->r(i, j - 2) - ); // 5x5 soft + source->r(i, j), + source->r(i - 1, j), + source->r(i + 1, j), + source->r(i, j + 1), + source->r(i, j - 1), + source->r(i - 1, j - 1), + source->r(i - 1, j + 1), + source->r(i + 1, j - 1), + source->r(i + 1, j + 1), + source->r(i + 2, j), + source->r(i - 2, j), + source->r(i, j + 2), + source->r(i, j - 2) + ); // 5x5 soft } } } @@ -1893,55 +1885,55 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for nowait #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->r(i, j) = tm[i][j]; } } - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1)); } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1)); } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->b(i, j), - source->b(i - 1, j), - source->b(i + 1, j), - source->b(i, j + 1), - source->b(i, j - 1), - source->b(i - 1, j - 1), - source->b(i - 1, j + 1), - source->b(i + 1, j - 1), - source->b(i + 1, j + 1), - source->b(i + 2, j), - source->b(i - 2, j), - source->b(i, j + 2), - source->b(i, j - 2) - ); // 5x5 soft + source->b(i, j), + source->b(i - 1, j), + source->b(i + 1, j), + source->b(i, j + 1), + source->b(i, j - 1), + source->b(i - 1, j - 1), + source->b(i - 1, j + 1), + source->b(i + 1, j - 1), + source->b(i + 1, j + 1), + source->b(i + 2, j), + source->b(i - 2, j), + source->b(i, j + 2), + source->b(i, j - 2) + ); // 5x5 soft } } } @@ -1950,56 +1942,56 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for nowait #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->b(i, j) = tm[i][j]; } } - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1)); } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1)); } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->g(i, j), - source->g(i - 1, j), - source->g(i + 1, j), - source->g(i, j + 1), - source->g(i, j - 1), - source->g(i - 1, j - 1), - source->g(i - 1, j + 1), - source->g(i + 1, j - 1), - source->g(i + 1, j + 1), - source->g(i + 2, j), - source->g(i - 2, j), - source->g(i, j + 2), - source->g(i, j - 2) - ); // 5x5 soft + source->g(i, j), + source->g(i - 1, j), + source->g(i + 1, j), + source->g(i, j + 1), + source->g(i, j - 1), + source->g(i - 1, j - 1), + source->g(i - 1, j + 1), + source->g(i + 1, j - 1), + source->g(i + 1, j + 1), + source->g(i + 2, j), + source->g(i - 2, j), + source->g(i, j + 2), + source->g(i, j - 2) + ); // 5x5 soft } } } @@ -2008,29 +2000,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->g(i, j) = tm[i][j]; } } } } - for (int i = 0; i < hei; i++) { - delete [] tm[i]; + for (int i = 0; i < hei; ++i) { + delete[] tm[i]; } - delete [] tm; + delete[] tm; } //end median - if(noiseLCurve || useNoiseCCurve) { - delete [] lumcalcBuffer; - delete [] lumcalc; - delete [] ccalcBuffer; - delete [] ccalc; + if (noiseLCurve || useNoiseCCurve) { + delete[] lumcalcBuffer; + delete[] lumcalc; + delete[] ccalcBuffer; + delete[] ccalc; } //#ifdef _DEBUG @@ -2049,7 +2041,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ) //for DCT +SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT { int blkstart = hblproc * TS * TS; @@ -2057,17 +2049,17 @@ SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, #ifdef __SSE2__ __m128 tempv; - __m128 noisevar_Ldetailv = _mm_set1_ps( noisevar_Ldetail ); - __m128 onev = _mm_set1_ps( 1.0f ); + __m128 noisevar_Ldetailv = _mm_set1_ps(noisevar_Ldetail); + __m128 onev = _mm_set1_ps(1.0f); for (int n = 0; n < TS * TS; n += 4) { //for DCT - tempv = onev - xexpf( -SQRV( LVF(nbrwt[n])) / noisevar_Ldetailv); - _mm_storeu_ps( &fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv ); + tempv = onev - xexpf(-SQRV(LVF(nbrwt[n])) / noisevar_Ldetailv); + _mm_storeu_ps(&fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv); }//output neighbor averaged result #else - for (int n = 0; n < TS * TS; n++) { //for DCT + for (int n = 0; n < TS * TS; ++n) { //for DCT fLblox[blkstart + n] *= (1 - xexpf(-SQR(nbrwt[n]) / noisevar_Ldetail)); }//output neighbor averaged result @@ -2082,25 +2074,25 @@ SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top ) +void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { const int numblox_W = ceil(((float)(width)) / (offset)); const float DCTnorm = 1.0f / (4 * TS * TS); //for DCT int imin = MAX(0, -top); - int bottom = MIN( top + TS, height); + int bottom = MIN(top + TS, height); int imax = bottom - top; //add row of tiles to output image - for (int i = imin; i < imax; i++) - for (int hblk = 0; hblk < numblox_W; hblk++) { + for (int i = imin; i < imax; ++i) + for (int hblk = 0; hblk < numblox_W; ++hblk) { int left = (hblk - blkrad) * offset; int right = MIN(left + TS, width); int jmin = MAX(0, -left); int jmax = right - left; int indx = hblk * TS; - for (int j = jmin; j < jmax; j++) { // this loop gets auto vectorized by gcc + for (int j = jmin; j < jmax; ++j) { // this loop gets auto vectorized by gcc Ldetail[top + i][left + j] += tilemask_out[i][j] * bloxrow_L[(indx + i) * TS + j] * DCTnorm; //for DCT } @@ -2125,12 +2117,12 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) int * histo = new int[65536]; //memset(histo, 0, 65536*sizeof(histo)); - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { histo[i] = 0; } //calculate histogram of absolute values of HH wavelet coeffs - for (int i = 0; i < datalen; i++) { + for (int i = 0; i < datalen; ++i) { histo[MAX(0, MIN(65535, abs((int)DataList[i])))]++; } @@ -2139,7 +2131,7 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } //find max of histogram @@ -2154,11 +2146,11 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) delete[] histo; // interpolate - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } -float ImProcFunctions::Mad( float * DataList, const int datalen) +float ImProcFunctions::Mad(float * DataList, const int datalen) { //computes Median Absolute Deviation @@ -2166,7 +2158,7 @@ float ImProcFunctions::Mad( float * DataList, const int datalen) int histo[256] ALIGNED64 = {0}; //calculate histogram of absolute values of wavelet coeffs - for (int i = 0; i < datalen; i++) { + for (int i = 0; i < datalen; ++i) { histo[min(255, abs((int)DataList[i]))]++; } @@ -2175,30 +2167,30 @@ float ImProcFunctions::Mad( float * DataList, const int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } int count_ = count - histo[median - 1]; // interpolate - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } -float ImProcFunctions::MadRgb( float * DataList, const int datalen) +float ImProcFunctions::MadRgb(float * DataList, const int datalen) { //computes Median Absolute Deviation //DataList values should mostly have abs val < 65536 because we are in RGB mode int * histo = new int[65536]; - for(int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { histo[i] = 0; } //calculate histogram of absolute values of wavelet coeffs int i; - for (i = 0; i < datalen; i++) { + for (i = 0; i < datalen; ++i) { histo[min(65536, abs((int)DataList[i]))]++; } @@ -2207,14 +2199,14 @@ float ImProcFunctions::MadRgb( float * DataList, const int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } int count_ = count - histo[median - 1]; // interpolate - delete [] histo; - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + delete[] histo; + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } @@ -2226,7 +2218,7 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, float madC; float maxresid = 0.f; - for (int lvl = 0; lvl < maxlvl; lvl++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); @@ -2234,8 +2226,8 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - for (int dir = 1; dir < 4; dir++) { - if(denoiseMethodRgb) { + for (int dir = 1; dir < 4; ++dir) { + if (denoiseMethodRgb) { madC = SQR(MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); } else { madC = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); @@ -2243,7 +2235,7 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, resid += madC; - if(madC > maxresid ) { + if (madC > maxresid) { maxresid = madC; } } @@ -2260,19 +2252,19 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2280,18 +2272,18 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif for (int lvl = maxlvl - 1; lvl >= 0; lvl--) { //for levels less than max, use level diff to make edge mask - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); @@ -2300,7 +2292,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit if (lvl == maxlvl - 1) { float vari[4]; int edge = 0; - ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], NULL, edge ); + ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], NULL, edge); } else { //simple wavelet shrinkage float * sfave = buffer[0] + 32; @@ -2312,7 +2304,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit float levelFactor = mad_Lr * 5.f / (lvl + 1); #ifdef __SSE2__ __m128 mad_Lv; - __m128 ninev = _mm_set1_ps( 9.0f ); + __m128 ninev = _mm_set1_ps(9.0f); __m128 epsv = _mm_set1_ps(eps); __m128 mag_Lv; __m128 levelFactorv = _mm_set1_ps(levelFactor); @@ -2321,18 +2313,18 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); - _mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / ( mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev) ) + epsv)); + _mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); } - for (; coeffloc_L < Hlvl_L * Wlvl_L; coeffloc_L++) { + for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); } #else - for (int i = 0; i < Hlvl_L; i++) - for (int j = 0; j < Wlvl_L; j++) { + for (int i = 0; i < Hlvl_L; ++i) + for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); @@ -2353,7 +2345,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } // few remaining pixels - for (; coeffloc_L < Hlvl_L * Wlvl_L; coeffloc_L++) { + for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float sf_L = sfave[coeffloc_L]; //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][coeffloc_L] *= (SQR(sfaved[coeffloc_L]) + SQR(sf_L)) / (sfaved[coeffloc_L] + sf_L + eps); @@ -2361,8 +2353,8 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit #else - for (int i = 0; i < Hlvl_L; i++) - for (int j = 0; j < Wlvl_L; j++) { + for (int i = 0; i < Hlvl_L; ++i) + for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float sf_L = sfave[coeffloc_L]; //use smoothed shrinkage unless local shrinkage is much less @@ -2375,9 +2367,9 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } @@ -2389,7 +2381,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi { int maxlvl = WaveletCoeffs_L.maxlevel(); - if(autoch && noisevar_ab <= 0.001f) { + if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; } @@ -2397,19 +2389,19 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2417,25 +2409,25 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madab[lvl][dir - 1] = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); } else { madab[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); @@ -2448,7 +2440,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi #endif for (int lvl = maxlvl - 1; lvl >= 0; lvl--) { //for levels less than max, use level diff to make edge mask - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); @@ -2485,7 +2477,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } // few remaining pixels - for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; coeffloc_ab++) { + for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); @@ -2493,8 +2485,8 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi #else - for (int i = 0; i < Hlvl_ab; i++) { - for (int j = 0; j < Wlvl_ab; j++) { + for (int i = 0; i < Hlvl_ab; ++i) { + for (int j = 0; j < Wlvl_ab; ++j) { int coeffloc_ab = i * Wlvl_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); @@ -2513,9 +2505,9 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } @@ -2529,25 +2521,25 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); - if(edge == 1) { + if (edge == 1) { maxlvl = 4; //for refine denoise edge wavelet } int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[4]; @@ -2556,25 +2548,25 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; buffer[3] = new (std::nothrow) float[maxWL * maxHL + 128]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], vari, edge); } } } - for(int i = 3; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 3; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } return (!memoryAllocationFailed); @@ -2589,19 +2581,19 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L int maxlvl = WaveletCoeffs_L.maxlevel(); int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2609,25 +2601,25 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl]); } } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } return (!memoryAllocationFailed); @@ -2638,7 +2630,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, - float *noisevarlum, float * madL, float * vari, int edge ) + float *noisevarlum, float * madL, float * vari, int edge) { //simple wavelet shrinkage @@ -2655,10 +2647,10 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff // printf("OK lev=%d\n",level); float mad_L = madL[dir - 1] ; - if(edge == 1) { + if (edge == 1) { noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { noisevarlum[i] = vari[level]; } } @@ -2668,25 +2660,25 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff __m128 magv; __m128 levelFactorv = _mm_set1_ps(levelFactor); __m128 mad_Lv; - __m128 ninev = _mm_set1_ps( 9.0f ); - __m128 epsv = _mm_set1_ps( eps ); + __m128 ninev = _mm_set1_ps(9.0f); + __m128 epsv = _mm_set1_ps(eps); int i; for (i = 0; i < W_L * H_L - 3; i += 4) { mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; magv = SQRV(LVFU(WavCoeffs_L[dir][i])); - _mm_storeu_ps( &sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); + _mm_storeu_ps(&sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); } // few remaining pixels - for (; i < W_L * H_L; i++) { + for (; i < W_L * H_L; ++i) { float mag = SQR(WavCoeffs_L[dir][i]); sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); } #else - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { float mag = SQR(WavCoeffs_L[dir][i]); float shrinkfactor = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); @@ -2702,11 +2694,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff for (i = 0; i < W_L * H_L - 3; i += 4) { sfv = LVFU(sfave[i]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps( &WavCoeffs_L[dir][i], _mm_loadu_ps( &WavCoeffs_L[dir][i]) * (SQRV( LVFU(sfaved[i] )) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); + _mm_storeu_ps(&WavCoeffs_L[dir][i], _mm_loadu_ps(&WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); } // few remaining pixels - for (; i < W_L * H_L; i++) { + for (; i < W_L * H_L; ++i) { float sf = sfave[i]; //use smoothed shrinkage unless local shrinkage is much less @@ -2715,7 +2707,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff #else - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { float sf = sfave[i]; //use smoothed shrinkage unless local shrinkage is much less @@ -2729,13 +2721,13 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, - bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated ) + bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) { //simple wavelet shrinkage const float eps = 0.01f; - if(autoch && noisevar_ab <= 0.001f) { + if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; } @@ -2752,10 +2744,10 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef float madab; float mad_L = madL[dir - 1]; - if(madCalculated) { + if (madCalculated) { madab = madaab[dir - 1]; } else { - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madab = SQR(Mad(WavCoeffs_ab[dir], W_ab * H_ab)); } else { madab = SQR(MadRgb(WavCoeffs_ab[dir], W_ab * H_ab)); @@ -2783,7 +2775,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef } // few remaining pixels - for (; coeffloc_ab < H_ab * W_ab; coeffloc_ab++) { + for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); @@ -2791,8 +2783,8 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef #else - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { int coeffloc_ab = i * W_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); @@ -2813,11 +2805,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef sfaveabv = LVFU(sfaveabd[coeffloc_ab]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps( &WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); + _mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); } // few remaining pixels - for (; coeffloc_ab < H_ab * W_ab; coeffloc_ab++) { + for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { //modification Jacques feb 2013 float sfab = sfaveab[coeffloc_ab]; @@ -2827,8 +2819,8 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef #else - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { int coeffloc_ab = i * W_ab + j; float sfab = sfaveab[coeffloc_ab]; @@ -2849,7 +2841,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** { //simple wavelet shrinkage - if(lvl == 1) { //only one time + if (lvl == 1) { //only one time float chro = 0.f; float dev = 0.f; float devL = 0.f; @@ -2861,29 +2853,29 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** float skin_c = 0.f; int nsk = 0; - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { chro += noisevarchrom[i][j]; - nc++; + ++nc; dev += SQR(noisevarchrom[i][j] - (chro / nc)); - if(noisevarhue[i][j] > -0.8f && noisevarhue[i][j] < 2.0f && noisevarchrom[i][j] > 10000.f) {//saturated red yellow + if (noisevarhue[i][j] > -0.8f && noisevarhue[i][j] < 2.0f && noisevarchrom[i][j] > 10000.f) {//saturated red yellow red_yel += noisevarchrom[i][j]; - nry++; + ++nry; } - if(noisevarhue[i][j] > 0.f && noisevarhue[i][j] < 1.6f && noisevarchrom[i][j] < 10000.f) {//skin + if (noisevarhue[i][j] > 0.f && noisevarhue[i][j] < 1.6f && noisevarchrom[i][j] < 10000.f) {//skin skin_c += noisevarchrom[i][j]; - nsk++; + ++nsk; } lume += noisevarlum[i][j]; - nL++; + ++nL; devL += SQR(noisevarlum[i][j] - (lume / nL)); } } - if(nc > 0) { + if (nc > 0) { chromina = chro / nc; sigma = sqrt(dev / nc); nsknc = (float)nsk / (float)nc; @@ -2891,26 +2883,26 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** nsknc = (float)nsk; } - if(nL > 0) { + if (nL > 0) { lumema = lume / nL; sigma_L = sqrt(devL / nL); } - if(nry > 0) { + if (nry > 0) { redyel = red_yel / nry; } - if(nsk > 0) { + if (nsk > 0) { skinc = skin_c / nsk; } } const float reduc = (schoice == 2) ? (float) settings->nrhigh : 1.f; - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { float mada, madb; - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { mada = SQR(Mad(WavCoeffs_a[dir], W_ab * H_ab)); } else { mada = SQR(MadRgb(WavCoeffs_a[dir], W_ab * H_ab)); @@ -2918,18 +2910,18 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** chred += mada; - if(mada > maxchred) { + if (mada > maxchred) { maxchred = mada; } - if(mada < minchred) { + if (mada < minchred) { minchred = mada; } maxredaut = sqrt(reduc * maxchred); minredaut = sqrt(reduc * minchred); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madb = SQR(Mad(WavCoeffs_b[dir], W_ab * H_ab)); } else { madb = SQR(MadRgb(WavCoeffs_b[dir], W_ab * H_ab)); @@ -2937,11 +2929,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** chblue += madb; - if(madb > maxchblue) { + if (madb > maxchblue) { maxchblue = madb; } - if(madb < minchblue) { + if (madb < minchblue) { minchblue = madb; } @@ -2949,7 +2941,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** minblueaut = sqrt(reduc * minchblue); chau += (mada + madb); - nb++; + ++nb; //here evaluation of automatic chaut = sqrt(reduc * chau / (nb + nb)); redaut = sqrt(reduc * chred / nb); @@ -2962,12 +2954,12 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, bool autoch, - float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread ) + float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread) { int maxlvl = levwav; - for (int lvl = 0; lvl < maxlvl; lvl++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { int Wlvl_ab = WaveletCoeffs_a.level_W(lvl); int Hlvl_ab = WaveletCoeffs_a.level_H(lvl); @@ -2979,7 +2971,7 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition & ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, lvl, Wlvl_ab, Hlvl_ab, skip_ab, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevar_abr, noisevar_abb, noi, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, - autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread ); + autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread); } } @@ -2989,8 +2981,8 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa gam = dnparams.gamma; gamthresh = 0.001f; - if(!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG - if(gam < 1.9f) { + if (!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG + if (gam < 1.9f) { gam = 1.f - (1.9f - gam) / 3.f; //minimum gamma 0.7 } else if (gam >= 1.9f && gam <= 3.f) { gam = (1.4f / 1.1f) * gam - 1.41818f; @@ -3000,12 +2992,12 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa gamslope = exp(log((double)gamthresh) / gam) / gamthresh; bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; } } @@ -3066,8 +3058,8 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l } } - if(levaut == 0) { //Low denoise - if(chaut > 300.f) { + if (levaut == 0) { //Low denoise + if (chaut > 300.f) { chaut = 0.714286f * chaut + 85.71428f; } } @@ -3076,15 +3068,15 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l delta *= reducdelta; if (lissage == 1 || lissage == 2) { - if (chaut < 200.f && delta < 200.f ) { + if (chaut < 200.f && delta < 200.f) { delta *= 0.95f; - } else if (chaut < 200.f && delta < 400.f ) { + } else if (chaut < 200.f && delta < 400.f) { delta *= 0.5f; - } else if (chaut < 200.f && delta >= 400.f ) { + } else if (chaut < 200.f && delta >= 400.f) { delta = 200.f; - } else if (chaut < 400.f && delta < 400.f ) { + } else if (chaut < 400.f && delta < 400.f) { delta *= 0.4f; - } else if (chaut < 400.f && delta >= 400.f ) { + } else if (chaut < 400.f && delta >= 400.f) { delta = 120.f; } else if (chaut < 550.f) { delta *= 0.15f; @@ -3114,15 +3106,15 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l } if (lissage == 0) { - if (chaut < 200.f && delta < 200.f ) { + if (chaut < 200.f && delta < 200.f) { delta *= 0.95f; - } else if (chaut < 200.f && delta < 400.f ) { + } else if (chaut < 200.f && delta < 400.f) { delta *= 0.7f; - } else if (chaut < 200.f && delta >= 400.f ) { + } else if (chaut < 200.f && delta >= 400.f) { delta = 280.f; - } else if (chaut < 400.f && delta < 400.f ) { + } else if (chaut < 400.f && delta < 400.f) { delta *= 0.6f; - } else if (chaut < 400.f && delta >= 400.f ) { + } else if (chaut < 400.f && delta >= 400.f) { delta = 200.f; } else if (chaut < 550.f) { delta *= 0.3f; @@ -3176,28 +3168,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat lumcalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { lumcalc[i] = new float[wid]; } acalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { acalc[i] = new float[wid]; } bcalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { bcalc[i] = new float[wid]; } #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif - for(int ii = 0; ii < hei; ii++) { - for(int jj = 0; jj < wid; jj++) { + for (int ii = 0; ii < hei; ++ii) { + for (int jj = 0; jj < wid; ++jj) { float LLum, AAum, BBum; float RL = provicalc->r(ii, jj); float GL = provicalc->g(ii, jj); @@ -3223,12 +3215,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat int tilesize; int overlap; - if(settings->leveldnti == 0) { + if (settings->leveldnti == 0) { tilesize = 1024; overlap = 128; } - if(settings->leveldnti == 1) { + if (settings->leveldnti == 1) { tilesize = 768; overlap = 96; } @@ -3262,17 +3254,17 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat LUTf *denoiseigamtab; switch(settings->denoiselabgamma) { - case 0: - denoiseigamtab = &(Color::igammatab_26_11); - break; + case 0: + denoiseigamtab = &(Color::igammatab_26_11); + break; - case 1: - denoiseigamtab = &(Color::igammatab_4); - break; + case 1: + denoiseigamtab = &(Color::igammatab_4); + break; - default: - denoiseigamtab = &(Color::igammatab_55); - break; + default: + denoiseigamtab = &(Color::igammatab_55); + break; } @@ -3286,19 +3278,19 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat LabImage * labdn = new LabImage(width, height); float** noisevarlum = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarlum[i] = new float[(width + 1) / 2]; } float** noisevarchrom = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarchrom[i] = new float[(width + 1) / 2]; } float** noisevarhue = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarhue[i] = new float[(width + 1) / 2]; } @@ -3309,13 +3301,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float interm_med = (float) dnparams.chroma / 10.0; float intermred, intermblue; - if(dnparams.redchro > 0.) { + if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit } - if(dnparams.bluechro > 0.) { + if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit @@ -3338,7 +3330,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat if (isRAW) {//image is raw; use channel differences for chroma channels #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif for (int i = tiletop; i < tilebottom; i += 2) { @@ -3363,7 +3355,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float cN = sqrtf(SQR(aN) + SQR(bN)); noisevarhue[i1 >> 1][j1 >> 1] = xatan2f(bN, aN); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3379,7 +3371,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float cN = sqrtf(SQR(aN) + SQR(bN)); float hN = xatan2f(bN, aN); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3391,7 +3383,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif for (int i = tiletop; i < tilebottom; i += 2) { @@ -3409,13 +3401,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat if (!denoiseMethodRgb) { //lab mode, modification Jacques feb 2013 and july 2014 #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float R_ = gain * src->r(i, j); float G_ = gain * src->g(i, j); @@ -3443,10 +3435,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } } else { //RGB mode - for (int i = tiletop/*, i1=0*/; i < tilebottom; i++/*, i1++*/) { + for (int i = tiletop/*, i1=0*/; i < tilebottom; ++i/*, ++i1*/) { int i1 = i - tiletop; - for (int j = tileleft/*, j1=0*/; j < tileright; j++/*, j1++*/) { + for (int j = tileleft/*, j1=0*/; j < tileright; ++j/*, ++j1*/) { int j1 = j - tileleft; float X = gain * src->r(i, j); @@ -3464,10 +3456,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } } else {//image is not raw; use Lab parametrization - for (int i = tiletop/*, i1=0*/; i < tilebottom; i++/*, i1++*/) { + for (int i = tiletop/*, i1=0*/; i < tilebottom; ++i/*, ++i1*/) { int i1 = i - tiletop; - for (int j = tileleft/*, j1=0*/; j < tileright; j++/*, j1++*/) { + for (int j = tileleft/*, j1=0*/; j < tileright; ++j/*, ++j1*/) { int j1 = j - tileleft; float L, a, b; float rLum = src->r(i, j) ; //for luminance denoise curve @@ -3492,18 +3484,18 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat //convert Lab Color::XYZ2Lab(X, Y, Z, L, a, b); - if(((i1 | j1) & 1) == 0) { + if (((i1 | j1) & 1) == 0) { float Llum, alum, blum; float XL, YL, ZL; Color::rgbxyz(rLum, gLum, bLum, XL, YL, ZL, wp); Color::XYZ2Lab(XL, YL, ZL, Llum, alum, blum); float kN = Llum; - if(kN < 2.f) { + if (kN < 2.f) { kN = 2.f; } - if(kN > 32768.f) { + if (kN > 32768.f) { kN = 32768.f; } @@ -3513,7 +3505,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float hN = xatan2f(bN, aN); float cN = sqrt(SQR(aN) + SQR(bN)); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3548,26 +3540,65 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat const int levwav = 5; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel sections if(multiThread) + #pragma omp parallel sections if (multiThread) #endif { #ifdef _RT_NESTED_OPENMP #pragma omp section #endif { - adecomp = new wavelet_decomposition (labdn->data + datalen, labdn->W, labdn->H, levwav, 1 ); + adecomp = new wavelet_decomposition (labdn->data + datalen, labdn->W, labdn->H, levwav, 1); } #ifdef _RT_NESTED_OPENMP #pragma omp section #endif { - bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1 ); + bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1); } } bool autoch = dnparams.autochroma; - if(comptlevel == 0) { - WaveletDenoiseAll_info(levwav, *adecomp, *bdecomp, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevarab_r, noisevarab_b, labdn, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, schoice, autoch, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau , chred, chblue, denoiseMethodRgb, multiThread); //enhance mode + if (comptlevel == 0) { + WaveletDenoiseAll_info( + levwav, + *adecomp, + *bdecomp, + noisevarlum, + noisevarchrom, + noisevarhue, + width, + height, + noisevarab_r, + noisevarab_b, + labdn, + chaut, + Nb, + redaut, + blueaut, + maxredaut, + maxblueaut, + minredaut, + minblueaut, + schoice, + autoch, + chromina, + sigma, + lumema, + sigma_L, + redyel, + skinc, + nsknc, + maxchred, + maxchblue, + minchred, + minchblue, + nb, + chau, + chred, + chblue, + denoiseMethodRgb, + multiThread + ); // Enhance mode } comptlevel += 1; @@ -3578,50 +3609,50 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat delete bdecomp; delete labdn; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarlum[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarlum[i]; } - delete [] noisevarlum; + delete[] noisevarlum; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarchrom[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarchrom[i]; } - delete [] noisevarchrom; + delete[] noisevarchrom; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarhue[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarhue[i]; } - delete [] noisevarhue; + delete[] noisevarhue; }//end of tile row }//end of tile loop - for (int i = 0; i < hei; i++) { - delete [] lumcalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] lumcalc[i]; } - delete [] lumcalc; + delete[] lumcalc; - for (int i = 0; i < hei; i++) { - delete [] acalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] acalc[i]; } - delete [] acalc; + delete[] acalc; - for (int i = 0; i < hei; i++) { - delete [] bcalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] bcalc[i]; } - delete [] bcalc; + delete[] bcalc; #undef TS #undef fTS #undef offset #undef epsilon -}//end of main RGB_denoise +} // End of main RGB_denoise } diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 6a653eb84..8b26c3121 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -20,14 +20,7 @@ #include "../rtgui/options.h" #include "rawimage.h" #include "imagedata.h" - -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } -#define med5(a0,a1,a2,a3,a4,median) { \ -p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; \ -PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ; \ -PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ; \ -PIX_SORT(p[1],p[2]) ; median=p[2] ;} - +#include "median.h" namespace rtengine { @@ -217,7 +210,6 @@ void ffInfo::updateRawImage() #endif for (int i = 0; i < H; i++) { - int p[5], temp; int iprev = i < 2 ? i + 2 : i - 2; int inext = i > H - 3 ? i - 2 : i + 2; @@ -225,8 +217,7 @@ void ffInfo::updateRawImage() int jprev = j < 2 ? j + 2 : j - 2; int jnext = j > W - 3 ? j - 2 : j + 2; - med5(ri->data[iprev][j], ri->data[i][jprev], ri->data[i][j], - ri->data[i][jnext], ri->data[inext][j], cfatmp[i * W + j]); + cfatmp[i * W + j] = median(ri->data[iprev][j], ri->data[i][jprev], ri->data[i][j], ri->data[i][jnext], ri->data[inext][j]); } } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b1a52a9f7..939177bf2 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -185,12 +185,12 @@ class ImProcFunctions public: enum class Median { - SIZE_3X3_SOFT, - SIZE_3X3_STRONG, - SIZE_5X5_SOFT, - SIZE_5X5_STRONG, - SIZE_7X7, - SIZE_9X9 + TYPE_3X3_SOFT, + TYPE_3X3_STRONG, + TYPE_5X5_SOFT, + TYPE_5X5_STRONG, + TYPE_7X7, + TYPE_9X9 }; double lumimul[3]; From 2e9f3fb9dc0f4a3fb0a1ea2aae0f496337529d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 9 Jul 2016 12:52:59 +0200 Subject: [PATCH 149/232] Applied `clang-tidy` on `rtengine/FTblockDN.cc` - Applied `clang-tidy` 3.8 with these checks and `-fix`: google-readability-casting,modernize-redundant-void-arg, modernize-use-bool-literals,modernize-use-nullptr, modernize-use-override,readability-braces-around-statements, readability-container-size-empty, readability-inconsistent-declaration-parameter-name, readability-redundant-control-flow,readability-redundant-string-cstr, readability-redundant-string-init,readability-simplify-boolean-expr, readability-static-definition-in-anonymous-namespace - Renamed last occurrences of `ULIM` to `median` - Removed double include of `median.h` from `rtengine/rawimagesource.cc` (found by Ingo) --- rtengine/FTblockDN.cc | 270 +++++++++++++++++----------------- rtengine/amaze_demosaic_RT.cc | 48 +++--- rtengine/dcraw.cc | 4 +- rtengine/demosaic_algos.cc | 20 +-- rtengine/improcfun.h | 12 +- rtengine/rawimagesource.cc | 1 - 6 files changed, 177 insertions(+), 178 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index b9e42c980..d1e8540da 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -72,29 +72,6 @@ namespace rtengine extern const Settings* settings; -float media(float *elements, int N) -{ - - // Order elements (only half of them) - for (int i = 0; i < (N >> 1) + 1; ++i) { - // Find position of minimum element - int min = i; - - for (int j = i + 1; j < N; ++j) - if (elements[j] < elements[min]) { - min = j; - } - - // Put found minimum element in its place - float temp = elements[i]; - elements[i] = elements[min]; - elements[min] = temp; - } - - // Get result - the middle element - return elements[N >> 1]; -} - void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) { int border = 1; @@ -127,13 +104,13 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, } } - float **allocBuffer = NULL; + float **allocBuffer = nullptr; float **medBuffer[2]; medBuffer[0] = src; // we need a buffer if src == dst or if (src != dst && iterations > 1) if (src == dst || (src != dst && iterations > 1)) { - if (buffer == NULL) { // we didn't get a buufer => create one + if (buffer == nullptr) { // we didn't get a buufer => create one allocBuffer = new float*[height]; for (int i = 0; i < height; ++i) { @@ -156,10 +133,11 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, medianOut = medBuffer[BufferIndex ^ 1]; if (iteration == 1) { // upper border - for (int i = 0; i < border; ++i) + for (int i = 0; i < border; ++i) { for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } +} } #ifdef _OPENMP @@ -372,10 +350,11 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, } if (iteration == 1) { // lower border - for (int i = height - border; i < height; ++i) + for (int i = height - border; i < height; ++i) { for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } +} } BufferIndex ^= 1; // swap buffers @@ -393,7 +372,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, } } - if (allocBuffer != NULL) { // we allocated memory, so let's free it now + if (allocBuffer != nullptr) { // we allocated memory, so let's free it now for (int i = 0; i < height; ++i) { delete[] allocBuffer[i]; } @@ -402,7 +381,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, } } -void ImProcFunctions::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 ImProcFunctions::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) { if (kall == 2) { @@ -412,8 +391,8 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt tileWskip = imwidth; tilewidth = imwidth; } else { - numtiles_W = ceil(((float)(imwidth)) / (tilesize - overlap)); - tilewidth = ceil(((float)(imwidth)) / (numtiles_W)) + overlap; + numtiles_W = ceil((static_cast(imwidth)) / (tilesize - overlap)); + tilewidth = ceil((static_cast(imwidth)) / (numtiles_W)) + overlap; tilewidth += (tilewidth & 1); tileWskip = tilewidth - overlap; } @@ -423,8 +402,8 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt tileHskip = imheight; tileheight = imheight; } else { - numtiles_H = ceil(((float)(imheight)) / (tilesize - overlap)); - tileheight = ceil(((float)(imheight)) / (numtiles_H)) + overlap; + numtiles_H = ceil((static_cast(imheight)) / (tilesize - overlap)); + tileheight = ceil((static_cast(imheight)) / (numtiles_H)) + overlap; tileheight += (tileheight & 1); tileHskip = tileheight - overlap; } @@ -460,7 +439,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (calclum) { delete calclum; - calclum = NULL; + calclum = nullptr; } return; @@ -470,7 +449,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef MyMutex::MyLock lock(FftwMutex); const nrquality nrQuality = (dnparams.smethod == "shal") ? QUALITY_STANDARD : QUALITY_HIGH;//shrink method - const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / (float) settings->nrhigh : 1.0f; + const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / static_cast( settings->nrhigh) : 1.0f; const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f); const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f); const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV")); @@ -510,8 +489,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); // init luma noisevarL - const float noiseluma = (float) dnparams.luma; - const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? (float) (SQR(((noiseluma + 1.0) / 125.0) * (10. + (noiseluma + 1.0) / 25.0))) : (float) (SQR((noiseluma / 125.0) * (1.0 + noiseluma / 25.0))); + const float noiseluma = static_cast( dnparams.luma); + const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? static_cast (SQR(((noiseluma + 1.0) / 125.0) * (10. + (noiseluma + 1.0) / 25.0))) : static_cast (SQR((noiseluma / 125.0) * (1.0 + noiseluma / 25.0))); const bool denoiseLuminance = (noisevarL > 0.00001f); //printf("NL=%f \n",noisevarL); @@ -591,7 +570,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } delete calclum; - calclum = NULL; + calclum = nullptr; } const short int imheight = src->height, imwidth = src->width; @@ -609,17 +588,17 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } - float gamslope = exp(log((double)gamthresh) / gam) / gamthresh; + float gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; LUTf gamcurve(65536, LUT_CLIP_BELOW); if (denoiseMethodRgb) { for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; + gamcurve[i] = (Color::gamma(static_cast(i) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; + gamcurve[i] = (Color::gamman(static_cast(i) / 65535.0, gam)) * 32768.0f; } } @@ -632,16 +611,16 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (denoiseMethodRgb) { for (int i = 0; i < 65536; ++i) { - igamcurve[i] = (Color::gamma((float)i / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); + igamcurve[i] = (Color::gamma(static_cast(i) / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); } } else { for (int i = 0; i < 65536; ++i) { - igamcurve[i] = (Color::gamman((float)i / 32768.0f, igam) * 65535.0f); + igamcurve[i] = (Color::gamman(static_cast(i) / 32768.0f, igam) * 65535.0f); } } const float gain = pow (2.0f, float(expcomp)); - float noisevar_Ldetail = SQR((float)(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); + float noisevar_Ldetail = SQR(static_cast(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); if (settings->verbose) { printf("Denoise Lab=%i\n", settings->denoiselabgamma); @@ -738,12 +717,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for (int i = 0; i < imheight; ++i) + for (int i = 0; i < imheight; ++i) { for (int j = 0; j < imwidth; ++j) { dsttmp->r(i, j) = 0.f; dsttmp->g(i, j) = 0.f; dsttmp->b(i, j) = 0.f; } +} } //now we have tile dimensions, overlaps @@ -753,17 +733,17 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // outside the parallel region and use them inside the parallel region. // calculate max size of numblox_W. - int max_numblox_W = ceil(((float)(MIN(imwidth, tilewidth))) / (offset)) + 2 * blkrad; + int max_numblox_W = ceil((static_cast(MIN(imwidth, tilewidth))) / (offset)) + 2 * blkrad; // calculate min size of numblox_W. - int min_numblox_W = ceil(((float)((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth)) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; + int min_numblox_W = ceil((static_cast((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth)) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; // these are needed only for creation of the plans and will be freed before entering the parallel loop fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; if (denoiseLuminance) { - float *Lbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); - float *fLbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); + float *Lbloxtmp = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof (float))); + float *fLbloxtmp = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof (float))); int nfwd[2] = {TS, TS}; @@ -772,10 +752,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef fftw_r2r_kind bwdkind[2] = {FFTW_REDFT01, FFTW_REDFT01}; // Creating the plans with FFTW_MEASURE instead of FFTW_ESTIMATE speeds up the execute a bit - plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, NULL, 1, TS * TS, fLbloxtmp, NULL, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, NULL, 1, TS * TS, fLbloxtmp, NULL, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); + plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); + plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); + plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); + plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); fftwf_free (Lbloxtmp); fftwf_free (fLbloxtmp); } @@ -815,11 +795,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float *LbloxArray[denoiseNestedLevels * numthreads]; float *fLbloxArray[denoiseNestedLevels * numthreads]; - if (numtiles > 1 && denoiseLuminance) + if (numtiles > 1 && denoiseLuminance) { for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { - LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); - fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); + LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } +} TMatrix wiprof = iccStore->workingSpaceInverseMatrix (params->icm.working); //inverse matrix user select @@ -869,19 +850,19 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int height = tilebottom - tiletop; int width2 = (width + 1) / 2; float realred, realblue; - float interm_med = (float) dnparams.chroma / 10.0; + float interm_med = static_cast( dnparams.chroma) / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { - intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit + intermred = static_cast( dnparams.redchro) / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { - intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit + intermblue = static_cast( dnparams.bluechro) / 7.0; //increase slower than linear for more sensit } if (ponder && kall == 2) { @@ -985,9 +966,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Y = gain * src->g(i, j); float Z = gain * src->b(i, j); //conversion colorspace to determine luminance with no gamma - X = X < 65535.0f ? gamcurve[X] : (Color::gamma((double)X / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma((double)Y / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma((double)Z / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + X = X < 65535.0f ? gamcurve[X] : (Color::gamma(static_cast(X) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma(static_cast(Y) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma(static_cast(Z) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); //end chroma labdn->L[i1][j1] = Y; labdn->a[i1][j1] = (X - Y); @@ -1028,9 +1009,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float btmp = Color::igammatab_srgb[ src->b(i, j) ]; //modification Jacques feb 2013 // gamma slider different from raw - rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman((double)rtmp / 65535.0, gam) * 32768.0f); - gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman((double)gtmp / 65535.0, gam) * 32768.0f); - btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman((double)btmp / 65535.0, gam) * 32768.0f); + rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman(static_cast(rtmp) / 65535.0, gam) * 32768.0f); + gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman(static_cast(gtmp) / 65535.0, gam) * 32768.0f); + btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman(static_cast(btmp) / 65535.0, gam) * 32768.0f); float X, Y, Z; Color::rgbxyz(rtmp, gtmp, btmp, X, Y, Z, wp); @@ -1095,7 +1076,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample //the first level only, 7 means subsample the first three levels, etc. //actual implementation only works with subsampling set to 1 - float interm_medT = (float) dnparams.chroma / 10.0; + float interm_medT = static_cast( dnparams.chroma) / 10.0; bool execwavelet = true; if (!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { @@ -1208,10 +1189,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef memoryAllocationFailed = true; } - if (!memoryAllocationFailed) + if (!memoryAllocationFailed) { if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } +} } } @@ -1244,10 +1226,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef memoryAllocationFailed = true; } - if (!memoryAllocationFailed) + if (!memoryAllocationFailed) { if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } +} } } @@ -1271,7 +1254,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int edge = 0; if (nrQuality == QUALITY_STANDARD) { - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { //enhance mode + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { //enhance mode memoryAllocationFailed = true; } } else { /*if (nrQuality==QUALITY_HIGH)*/ @@ -1279,10 +1262,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef memoryAllocationFailed = true; } - if (!memoryAllocationFailed) - if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { + if (!memoryAllocationFailed) { + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { memoryAllocationFailed = true; } +} } if (!memoryAllocationFailed) { @@ -1292,10 +1276,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = 0; i < height; ++i) + for (int i = 0; i < height; ++i) { for (int j = 0; j < width; ++j) { (*Lin)[i][j] = labdn->L[i][j]; } +} Ldecomp->reconstruct(labdn->L[0]); } @@ -1388,8 +1373,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // blocks are not the same thing as tiles! // calculation for detail recovery blocks - const int numblox_W = ceil(((float)(width)) / (offset)) + 2 * blkrad; - const int numblox_H = ceil(((float)(height)) / (offset)) + 2 * blkrad; + const int numblox_W = ceil((static_cast(width)) / (offset)) + 2 * blkrad; + const int numblox_H = ceil((static_cast(height)) / (offset)) + 2 * blkrad; @@ -1406,11 +1391,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //pixel weight array2D totwt(width, height, ARRAY2D_CLEAR_DATA); //weight for combining DCT blocks - if (numtiles == 1) + if (numtiles == 1) { for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { - LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); - fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); + LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } +} #ifdef _RT_NESTED_OPENMP int masterThread = omp_get_thread_num(); @@ -1664,9 +1650,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Z = Y - (labdn->b[i1][j1]); - X = X < 32768.0f ? igamcurve[X] : (Color::gamma((float)X / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - Y = Y < 32768.0f ? igamcurve[Y] : (Color::gamma((float)Y / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - Z = Z < 32768.0f ? igamcurve[Z] : (Color::gamma((float)Z / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); + X = X < 32768.0f ? igamcurve[X] : (Color::gamma(X / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); + Y = Y < 32768.0f ? igamcurve[Y] : (Color::gamma(Y / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); + Z = Z < 32768.0f ? igamcurve[Z] : (Color::gamma(Z / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); if (numtiles == 1) { dsttmp->r(i, j) = newGain * X; @@ -1709,9 +1695,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float r_, g_, b_; Color::xyz2rgb(X, Y, Z, r_, g_, b_, wip); //gamma slider is different from Raw - r_ = r_ < 32768.0f ? igamcurve[r_] : (Color::gamman((float)r_ / 32768.0f, igam) * 65535.0f); - g_ = g_ < 32768.0f ? igamcurve[g_] : (Color::gamman((float)g_ / 32768.0f, igam) * 65535.0f); - b_ = b_ < 32768.0f ? igamcurve[b_] : (Color::gamman((float)b_ / 32768.0f, igam) * 65535.0f); + r_ = r_ < 32768.0f ? igamcurve[r_] : (Color::gamman(r_ / 32768.0f, igam) * 65535.0f); + g_ = g_ < 32768.0f ? igamcurve[g_] : (Color::gamman(g_ / 32768.0f, igam) * 65535.0f); + b_ = b_ < 32768.0f ? igamcurve[b_] : (Color::gamman(b_ / 32768.0f, igam) * 65535.0f); if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; @@ -1773,12 +1759,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for (int i = 0; i < dst->height; ++i) + for (int i = 0; i < dst->height; ++i) { for (int j = 0; j < dst->width; ++j) { dst->r(i, j) = Color::gammatab_srgb[ dst->r(i, j) ]; dst->g(i, j) = Color::gammatab_srgb[ dst->g(i, j) ]; dst->b(i, j) = Color::gammatab_srgb[ dst->b(i, j) ]; } +} } if (denoiseLuminance) { @@ -1841,14 +1828,15 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; ++i) { - if (methmed == 0) + if (methmed == 0) { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1)); //3x3 soft } - else + } else { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1)); //3x3 } +} } } else { #pragma omp for @@ -1861,7 +1849,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 } - } else + } else { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( source->r(i, j), @@ -1879,6 +1867,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->r(i, j - 2) ); // 5x5 soft } +} } } #ifdef _OPENMP @@ -1897,14 +1886,15 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; ++i) { - if (methmed == 0) + if (methmed == 0) { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1)); } - else + } else { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1)); } +} } } else { #pragma omp for @@ -1917,7 +1907,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 } - } else + } else { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( source->b(i, j), @@ -1935,6 +1925,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->b(i, j - 2) ); // 5x5 soft } +} } } @@ -1955,14 +1946,15 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for for (int i = 1; i < hei - 1; ++i) { - if (methmed == 0) + if (methmed == 0) { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1)); } - else + } else { for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1)); } +} } } else { #pragma omp for @@ -1975,7 +1967,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 } - } else + } else { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( source->g(i, j), @@ -1993,6 +1985,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->g(i, j - 2) ); // 5x5 soft } +} } } @@ -2076,7 +2069,7 @@ SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { - const int numblox_W = ceil(((float)(width)) / (offset)); + const int numblox_W = ceil((static_cast(width)) / (offset)); const float DCTnorm = 1.0f / (4 * TS * TS); //for DCT int imin = MAX(0, -top); @@ -2084,7 +2077,7 @@ void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, fl int imax = bottom - top; //add row of tiles to output image - for (int i = imin; i < imax; ++i) + for (int i = imin; i < imax; ++i) { for (int hblk = 0; hblk < numblox_W; ++hblk) { int left = (hblk - blkrad) * offset; int right = MIN(left + TS, width); @@ -2098,6 +2091,7 @@ void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, fl } } } +} /* #undef TS #undef fTS @@ -2146,7 +2140,7 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) delete[] histo; // interpolate - return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745); } @@ -2159,7 +2153,7 @@ float ImProcFunctions::Mad(float * DataList, const int datalen) //calculate histogram of absolute values of wavelet coeffs for (int i = 0; i < datalen; ++i) { - histo[min(255, abs((int)DataList[i]))]++; + histo[min(255, abs(static_cast(DataList[i])))]++; } //find median of histogram @@ -2173,7 +2167,7 @@ float ImProcFunctions::Mad(float * DataList, const int datalen) int count_ = count - histo[median - 1]; // interpolate - return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745); } float ImProcFunctions::MadRgb(float * DataList, const int datalen) @@ -2191,7 +2185,7 @@ float ImProcFunctions::MadRgb(float * DataList, const int datalen) int i; for (i = 0; i < datalen; ++i) { - histo[min(65536, abs((int)DataList[i]))]++; + histo[min(65536, abs(static_cast(DataList[i])))]++; } //find median of histogram @@ -2206,7 +2200,7 @@ float ImProcFunctions::MadRgb(float * DataList, const int datalen) // interpolate delete[] histo; - return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / (static_cast(count - count_))) / 0.6745); } @@ -2272,7 +2266,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == nullptr || buffer[1] == nullptr || buffer[2] == nullptr) { memoryAllocationFailed = true; } @@ -2292,7 +2286,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit if (lvl == maxlvl - 1) { float vari[4]; int edge = 0; - ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], NULL, edge); + ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], nullptr, edge); } else { //simple wavelet shrinkage float * sfave = buffer[0] + 32; @@ -2323,13 +2317,14 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit #else - for (int i = 0; i < Hlvl_L; ++i) + for (int i = 0; i < Hlvl_L; ++i) { for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); } +} #endif boxblur(sfave, sfaved, blurBuffer, lvl + 2, lvl + 2, Wlvl_L, Hlvl_L); //increase smoothness by locally averaging shrinkage @@ -2353,13 +2348,14 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit #else - for (int i = 0; i < Hlvl_L; ++i) + for (int i = 0; i < Hlvl_L; ++i) { for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float sf_L = sfave[coeffloc_L]; //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][coeffloc_L] *= (SQR(sfaved[coeffloc_L]) + SQR(sf_L)) / (sfaved[coeffloc_L] + sf_L + eps); }//now luminance coeffs are denoised +} #endif } @@ -2367,10 +2363,11 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } } - for (int i = 2; i >= 0; i--) - if (buffer[i] != NULL) { + for (int i = 2; i >= 0; i--) { + if (buffer[i] != nullptr) { delete[] buffer[i]; } +} } return (!memoryAllocationFailed); @@ -2409,7 +2406,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == nullptr || buffer[1] == nullptr || buffer[2] == nullptr) { memoryAllocationFailed = true; } @@ -2505,10 +2502,11 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } } - for (int i = 2; i >= 0; i--) - if (buffer[i] != NULL) { + for (int i = 2; i >= 0; i--) { + if (buffer[i] != nullptr) { delete[] buffer[i]; } +} } return (!memoryAllocationFailed); @@ -2548,7 +2546,7 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; buffer[3] = new (std::nothrow) float[maxWL * maxHL + 128]; - if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { + if (buffer[0] == nullptr || buffer[1] == nullptr || buffer[2] == nullptr || buffer[3] == nullptr) { memoryAllocationFailed = true; } @@ -2564,10 +2562,11 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, } } - for (int i = 3; i >= 0; i--) - if (buffer[i] != NULL) { + for (int i = 3; i >= 0; i--) { + if (buffer[i] != nullptr) { delete[] buffer[i]; } +} } return (!memoryAllocationFailed); } @@ -2601,7 +2600,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == nullptr || buffer[1] == nullptr || buffer[2] == nullptr) { memoryAllocationFailed = true; } @@ -2617,10 +2616,11 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L } } - for (int i = 2; i >= 0; i--) - if (buffer[i] != NULL) { + for (int i = 2; i >= 0; i--) { + if (buffer[i] != nullptr) { delete[] buffer[i]; } +} } return (!memoryAllocationFailed); } @@ -2655,7 +2655,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff } } - float levelFactor = mad_L * 5.f / (float)(level + 1); + float levelFactor = mad_L * 5.f / static_cast(level + 1); #ifdef __SSE2__ __m128 magv; __m128 levelFactorv = _mm_set1_ps(levelFactor); @@ -2878,9 +2878,9 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** if (nc > 0) { chromina = chro / nc; sigma = sqrt(dev / nc); - nsknc = (float)nsk / (float)nc; + nsknc = static_cast(nsk) / static_cast(nc); } else { - nsknc = (float)nsk; + nsknc = static_cast(nsk); } if (nL > 0) { @@ -2897,7 +2897,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** } } - const float reduc = (schoice == 2) ? (float) settings->nrhigh : 1.f; + const float reduc = (schoice == 2) ? static_cast( settings->nrhigh) : 1.f; for (int dir = 1; dir < 4; ++dir) { float mada, madb; @@ -2989,16 +2989,16 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa } } - gamslope = exp(log((double)gamthresh) / gam) / gamthresh; + gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); if (denoiseMethodRgb) { for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; + gamcurve[i] = (Color::gamma(static_cast(i) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; + gamcurve[i] = (Color::gamman(static_cast(i) / 65535.0, gam)) * 32768.0f; } } } @@ -3009,7 +3009,7 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l float reducdelta = 1.f; if (params->dirpyrDenoise.smethod == "shalbi") { - reducdelta = (float)settings->nrhigh; + reducdelta = static_cast(settings->nrhigh); } chaut = (chaut * Nb - maxmax) / (Nb - 1); //suppress maximum for chaut calcul @@ -3298,19 +3298,19 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float noisevarab_b, noisevarab_r; float realred, realblue; - float interm_med = (float) dnparams.chroma / 10.0; + float interm_med = static_cast( dnparams.chroma) / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { - intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit + intermred = static_cast( dnparams.redchro) / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { - intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit + intermblue = static_cast( dnparams.bluechro) / 7.0; //increase slower than linear for more sensit } realred = interm_med + intermred; @@ -3418,9 +3418,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat B_ = (*denoiseigamtab)[B_]; //apply gamma noise standard (slider) - R_ = R_ < 65535.0f ? gamcurve[R_] : (Color::gamman((double)R_ / 65535.0, gam) * 32768.0f); - G_ = G_ < 65535.0f ? gamcurve[G_] : (Color::gamman((double)G_ / 65535.0, gam) * 32768.0f); - B_ = B_ < 65535.0f ? gamcurve[B_] : (Color::gamman((double)B_ / 65535.0, gam) * 32768.0f); + R_ = R_ < 65535.0f ? gamcurve[R_] : (Color::gamman(static_cast(R_) / 65535.0, gam) * 32768.0f); + G_ = G_ < 65535.0f ? gamcurve[G_] : (Color::gamman(static_cast(G_) / 65535.0, gam) * 32768.0f); + B_ = B_ < 65535.0f ? gamcurve[B_] : (Color::gamman(static_cast(B_) / 65535.0, gam) * 32768.0f); //true conversion xyz=>Lab float X, Y, Z; Color::rgbxyz(R_, G_, B_, X, Y, Z, wp); @@ -3445,9 +3445,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float Y = gain * src->g(i, j); float Z = gain * src->b(i, j); - X = X < 65535.0f ? gamcurve[X] : (Color::gamma((double)X / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma((double)Y / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma((double)Z / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + X = X < 65535.0f ? gamcurve[X] : (Color::gamma(static_cast(X) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma(static_cast(Y) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma(static_cast(Z) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); labdn->a[i1][j1] = (X - Y); labdn->b[i1][j1] = (Y - Z); @@ -3474,9 +3474,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float btmp = Color::igammatab_srgb[ src->b(i, j) ]; //modification Jacques feb 2013 // gamma slider different from raw - rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman((double)rtmp / 65535.0, gam) * 32768.0f); - gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman((double)gtmp / 65535.0, gam) * 32768.0f); - btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman((double)btmp / 65535.0, gam) * 32768.0f); + rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman(static_cast(rtmp) / 65535.0, gam) * 32768.0f); + gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman(static_cast(gtmp) / 65535.0, gam) * 32768.0f); + btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman(static_cast(btmp) / 65535.0, gam) * 32768.0f); float X, Y, Z; Color::rgbxyz(rtmp, gtmp, btmp, X, Y, Z, wp); diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index a34e8e7f7..c5535493c 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -602,28 +602,28 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, if (hcd[indx] > 0) { if (3.f * hcd[indx] > (Ginth + cfa[indx])) { - hcd[indx] = -ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]; + hcd[indx] = -median(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]; } else { float hwt = 1.f - 3.f * hcd[indx] / (eps + Ginth + cfa[indx]); - hcd[indx] = hwt * hcd[indx] + (1.f - hwt) * (-ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]); + hcd[indx] = hwt * hcd[indx] + (1.f - hwt) * (-median(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]); } } if (vcd[indx] > 0) { if (3.f * vcd[indx] > (Gintv + cfa[indx])) { - vcd[indx] = -ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]; + vcd[indx] = -median(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]; } else { float vwt = 1.f - 3.f * vcd[indx] / (eps + Gintv + cfa[indx]); - vcd[indx] = vwt * vcd[indx] + (1.f - vwt) * (-ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]); + vcd[indx] = vwt * vcd[indx] + (1.f - vwt) * (-median(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]); } } if (Ginth > clip_pt) { - hcd[indx] = -ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]; + hcd[indx] = -median(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]; } if (Gintv > clip_pt) { - vcd[indx] = -ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]; + vcd[indx] = -median(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]; } @@ -634,28 +634,28 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, if (hcd[indx] < 0) { if (3.f * hcd[indx] < -(Ginth + cfa[indx])) { - hcd[indx] = ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]; + hcd[indx] = median(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]; } else { float hwt = 1.f + 3.f * hcd[indx] / (eps + Ginth + cfa[indx]); - hcd[indx] = hwt * hcd[indx] + (1.f - hwt) * (ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]); + hcd[indx] = hwt * hcd[indx] + (1.f - hwt) * (median(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]); } } if (vcd[indx] < 0) { if (3.f * vcd[indx] < -(Gintv + cfa[indx])) { - vcd[indx] = ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]; + vcd[indx] = median(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]; } else { float vwt = 1.f + 3.f * vcd[indx] / (eps + Gintv + cfa[indx]); - vcd[indx] = vwt * vcd[indx] + (1.f - vwt) * (ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]); + vcd[indx] = vwt * vcd[indx] + (1.f - vwt) * (median(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]); } } if (Ginth > clip_pt) { - hcd[indx] = ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]; + hcd[indx] = median(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]; } if (Gintv > clip_pt) { - vcd[indx] = ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]; + vcd[indx] = median(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]; } cddiffsq[indx] = SQR(vcd[indx] - hcd[indx]); @@ -1172,28 +1172,28 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, if (rbp[indx1] < cfa[indx]) { if (xmul2f(rbp[indx1]) < cfa[indx]) { - rbp[indx1] = ULIM(rbp[indx1] , cfa[indx - p1], cfa[indx + p1]); + rbp[indx1] = median(rbp[indx1] , cfa[indx - p1], cfa[indx + p1]); } else { float pwt = xmul2f(cfa[indx] - rbp[indx1]) / (eps + rbp[indx1] + cfa[indx]); - rbp[indx1] = pwt * rbp[indx1] + (1.f - pwt) * ULIM(rbp[indx1], cfa[indx - p1], cfa[indx + p1]); + rbp[indx1] = pwt * rbp[indx1] + (1.f - pwt) * median(rbp[indx1], cfa[indx - p1], cfa[indx + p1]); } } if (rbm[indx1] < cfa[indx]) { if (xmul2f(rbm[indx1]) < cfa[indx]) { - rbm[indx1] = ULIM(rbm[indx1] , cfa[indx - m1], cfa[indx + m1]); + rbm[indx1] = median(rbm[indx1] , cfa[indx - m1], cfa[indx + m1]); } else { float mwt = xmul2f(cfa[indx] - rbm[indx1]) / (eps + rbm[indx1] + cfa[indx]); - rbm[indx1] = mwt * rbm[indx1] + (1.f - mwt) * ULIM(rbm[indx1], cfa[indx - m1], cfa[indx + m1]); + rbm[indx1] = mwt * rbm[indx1] + (1.f - mwt) * median(rbm[indx1], cfa[indx - m1], cfa[indx + m1]); } } if (rbp[indx1] > clip_pt) { - rbp[indx1] = ULIM(rbp[indx1], cfa[indx - p1], cfa[indx + p1]); + rbp[indx1] = median(rbp[indx1], cfa[indx - p1], cfa[indx + p1]); } if (rbm[indx1] > clip_pt) { - rbm[indx1] = ULIM(rbm[indx1], cfa[indx - m1], cfa[indx + m1]); + rbm[indx1] = median(rbm[indx1], cfa[indx - m1], cfa[indx + m1]); } } @@ -1339,28 +1339,28 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, //bound the interpolation in regions of high saturation if (Gintv < rbint[indx1]) { if (2 * Gintv < rbint[indx1]) { - Gintv = ULIM(Gintv , cfa[indx - v1], cfa[indx + v1]); + Gintv = median(Gintv , cfa[indx - v1], cfa[indx + v1]); } else { float vwt = 2.0 * (rbint[indx1] - Gintv) / (eps + Gintv + rbint[indx1]); - Gintv = vwt * Gintv + (1.f - vwt) * ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]); + Gintv = vwt * Gintv + (1.f - vwt) * median(Gintv, cfa[indx - v1], cfa[indx + v1]); } } if (Ginth < rbint[indx1]) { if (2 * Ginth < rbint[indx1]) { - Ginth = ULIM(Ginth , cfa[indx - 1], cfa[indx + 1]); + Ginth = median(Ginth , cfa[indx - 1], cfa[indx + 1]); } else { float hwt = 2.0 * (rbint[indx1] - Ginth) / (eps + Ginth + rbint[indx1]); - Ginth = hwt * Ginth + (1.f - hwt) * ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]); + Ginth = hwt * Ginth + (1.f - hwt) * median(Ginth, cfa[indx - 1], cfa[indx + 1]); } } if (Ginth > clip_pt) { - Ginth = ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]); + Ginth = median(Ginth, cfa[indx - 1], cfa[indx + 1]); } if (Gintv > clip_pt) { - Gintv = ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]); + Gintv = median(Gintv, cfa[indx - v1], cfa[indx + v1]); } rgbgreen[indx] = Ginth * (1.f - hvwt[indx1]) + Gintv * hvwt[indx1]; diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 47bfd40a7..9f1c689de 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -131,7 +131,7 @@ const float d65_white[3] = { 0.950456, 1, 1.088754 }; #define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b)) #define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b)) #define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max)) -#define ULIM(x,y,z) rtengine::ULIM(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) +#define median(x,y,z) rtengine::median(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) #define CLIP(x) rtengine::CLIP(x) #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } @@ -9852,5 +9852,5 @@ struct tiff_hdr { /*RT*/#undef MIN /*RT*/#undef ABS /*RT*/#undef LIM -/*RT*/#undef ULIM +/*RT*/#undef median /*RT*/#undef CLIP diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index fd4a16fd1..405a34118 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -2447,8 +2447,8 @@ void RawImageSource::igv_interpolate(int winw, int winh) eg = LIM(epssq + 78.0f * SQR(hdif[indx >> 1]) + 69.0f * (SQR(hdif[(indx - h2) >> 1]) + SQR(hdif[(indx + h2) >> 1])) + 51.0f * (SQR(hdif[(indx - h4) >> 1]) + SQR(hdif[(indx + h4) >> 1])) + 21.0f * (SQR(hdif[(indx - h6) >> 1]) + SQR(hdif[(indx + h6) >> 1])) - 6.0f * SQR(hdif[(indx - h2) >> 1] + hdif[indx >> 1] + hdif[(indx + h2) >> 1]) - 10.0f * (SQR(hdif[(indx - h4) >> 1] + hdif[(indx - h2) >> 1] + hdif[indx >> 1]) + SQR(hdif[indx >> 1] + hdif[(indx + h2) >> 1] + hdif[(indx + h4) >> 1])) - 7.0f * (SQR(hdif[(indx - h6) >> 1] + hdif[(indx - h4) >> 1] + hdif[(indx - h2) >> 1]) + SQR(hdif[(indx + h2) >> 1] + hdif[(indx + h4) >> 1] + hdif[(indx + h6) >> 1])), 0.f, 1.f); //Limit chrominance using H/V neighbourhood - nv = ULIM(0.725f * vdif[indx >> 1] + 0.1375f * vdif[(indx - v2) >> 1] + 0.1375f * vdif[(indx + v2) >> 1], vdif[(indx - v2) >> 1], vdif[(indx + v2) >> 1]); - ev = ULIM(0.725f * hdif[indx >> 1] + 0.1375f * hdif[(indx - h2) >> 1] + 0.1375f * hdif[(indx + h2) >> 1], hdif[(indx - h2) >> 1], hdif[(indx + h2) >> 1]); + nv = median(0.725f * vdif[indx >> 1] + 0.1375f * vdif[(indx - v2) >> 1] + 0.1375f * vdif[(indx + v2) >> 1], vdif[(indx - v2) >> 1], vdif[(indx + v2) >> 1]); + ev = median(0.725f * hdif[indx >> 1] + 0.1375f * hdif[(indx - h2) >> 1] + 0.1375f * hdif[(indx + h2) >> 1], hdif[(indx - h2) >> 1], hdif[(indx + h2) >> 1]); //Chrominance estimation chr[d][indx] = (eg * nv + ng * ev) / (ng + eg); //Green channel population @@ -2477,10 +2477,10 @@ void RawImageSource::igv_interpolate(int winw, int winh) swg = 1.0f / (eps + fabsf(chr[c][indx + v1 - h1] - chr[c][indx + v3 + h3]) + fabsf(chr[c][indx - v1 + h1] - chr[c][indx + v3 - h3])); seg = 1.0f / (eps + fabsf(chr[c][indx + v1 + h1] - chr[c][indx + v3 - h3]) + fabsf(chr[c][indx - v1 - h1] - chr[c][indx + v3 + h3])); //Limit NW,NE,SW,SE Color differences - nwv = ULIM(chr[c][indx - v1 - h1], chr[c][indx - v3 - h1], chr[c][indx - v1 - h3]); - nev = ULIM(chr[c][indx - v1 + h1], chr[c][indx - v3 + h1], chr[c][indx - v1 + h3]); - swv = ULIM(chr[c][indx + v1 - h1], chr[c][indx + v3 - h1], chr[c][indx + v1 - h3]); - sev = ULIM(chr[c][indx + v1 + h1], chr[c][indx + v3 + h1], chr[c][indx + v1 + h3]); + nwv = median(chr[c][indx - v1 - h1], chr[c][indx - v3 - h1], chr[c][indx - v1 - h3]); + nev = median(chr[c][indx - v1 + h1], chr[c][indx - v3 + h1], chr[c][indx - v1 + h3]); + swv = median(chr[c][indx + v1 - h1], chr[c][indx + v3 - h1], chr[c][indx + v1 - h3]); + sev = median(chr[c][indx + v1 + h1], chr[c][indx + v3 + h1], chr[c][indx + v1 + h3]); //Interpolate chrominance: R@B and B@R chr[c][indx] = (nwg * nwv + neg * nev + swg * swv + seg * sev) / (nwg + neg + swg + seg); } @@ -2505,10 +2505,10 @@ void RawImageSource::igv_interpolate(int winw, int winh) swg = 1.0f / (eps + fabsf(chr[c][indx + v1 - h1] - chr[c][indx + v3 + h3]) + fabsf(chr[c][indx - v1 + h1] - chr[c][indx + v3 - h3])); seg = 1.0f / (eps + fabsf(chr[c][indx + v1 + h1] - chr[c][indx + v3 - h3]) + fabsf(chr[c][indx - v1 - h1] - chr[c][indx + v3 + h3])); //Limit NW,NE,SW,SE Color differences - nwv = ULIM(chr[c][indx - v1 - h1], chr[c][indx - v3 - h1], chr[c][indx - v1 - h3]); - nev = ULIM(chr[c][indx - v1 + h1], chr[c][indx - v3 + h1], chr[c][indx - v1 + h3]); - swv = ULIM(chr[c][indx + v1 - h1], chr[c][indx + v3 - h1], chr[c][indx + v1 - h3]); - sev = ULIM(chr[c][indx + v1 + h1], chr[c][indx + v3 + h1], chr[c][indx + v1 + h3]); + nwv = median(chr[c][indx - v1 - h1], chr[c][indx - v3 - h1], chr[c][indx - v1 - h3]); + nev = median(chr[c][indx - v1 + h1], chr[c][indx - v3 + h1], chr[c][indx - v1 + h3]); + swv = median(chr[c][indx + v1 - h1], chr[c][indx + v3 - h1], chr[c][indx + v1 - h3]); + sev = median(chr[c][indx + v1 + h1], chr[c][indx + v3 + h1], chr[c][indx + v1 + h3]); //Interpolate chrominance: R@B and B@R chr[c][indx] = (nwg * nwv + neg * nev + swg * swv + seg * sev) / (nwg + neg + swg + seg); } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 939177bf2..3523ee183 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -319,11 +319,11 @@ public: void Median_Denoise( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = NULL); - void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & ctNoisCurve , const NoiseCurve & ctNoisCCcurve , float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi); + void RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve , const NoiseCurve & noiseCCurve , float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi); void RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope); - void RGB_denoise_info(Imagefloat * src, Imagefloat * calclum, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); - void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_L, float * nbrwt, float * blurbuffer ); //for DCT - void RGBoutput_tile_row (float *Lbloxrow, float ** Ldetail, float ** tilemask_out, int height, int width, int top ); + void RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &nresi, float &highresi, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); + void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ); //for DCT + void RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top ); bool WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); bool WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); void WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, @@ -333,7 +333,7 @@ public: bool WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); bool WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); - void ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madaL, float * vari, int edge); + void ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); void ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = NULL, bool madCalculated = false); void ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int level, @@ -341,7 +341,7 @@ public: float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread); void Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb); void calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc); - float MadMax(float * HH_Coeffs, int &max, int datalen); + float MadMax(float * DataList, int &max, int datalen); float Mad(float * DataList, const int datalen); float MadRgb(float * DataList, const int datalen); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 604a1fb57..a7ca7d86c 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -33,7 +33,6 @@ #include "dcp.h" #include "rt_math.h" #include "improcfun.h" -#include "median.h" #ifdef _OPENMP #include #endif From e129510b62f7951e4fa4a3b8a576339e80787362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 9 Jul 2016 17:42:59 +0200 Subject: [PATCH 150/232] Partly revert `rtengine/dcraw.cc` and astyle again Also recreate `dcraw.patch` as suggested by Ingo. --- rtengine/FTblockDN.cc | 46 +++++++++++++++++++++---------------------- rtengine/dcraw.cc | 4 ++-- rtengine/dcraw.patch | 6 +++--- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index d1e8540da..20f5b5e1b 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -137,7 +137,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } -} + } } #ifdef _OPENMP @@ -354,7 +354,7 @@ void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; } -} + } } BufferIndex ^= 1; // swap buffers @@ -723,7 +723,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef dsttmp->g(i, j) = 0.f; dsttmp->b(i, j) = 0.f; } -} + } } //now we have tile dimensions, overlaps @@ -800,7 +800,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } -} + } TMatrix wiprof = iccStore->workingSpaceInverseMatrix (params->icm.working); //inverse matrix user select @@ -1193,7 +1193,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } -} + } } } @@ -1230,7 +1230,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } -} + } } } @@ -1266,7 +1266,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, nullptr, edge)) { memoryAllocationFailed = true; } -} + } } if (!memoryAllocationFailed) { @@ -1280,7 +1280,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int j = 0; j < width; ++j) { (*Lin)[i][j] = labdn->L[i][j]; } -} + } Ldecomp->reconstruct(labdn->L[0]); } @@ -1396,7 +1396,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } -} + } #ifdef _RT_NESTED_OPENMP int masterThread = omp_get_thread_num(); @@ -1765,7 +1765,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef dst->g(i, j) = Color::gammatab_srgb[ dst->g(i, j) ]; dst->b(i, j) = Color::gammatab_srgb[ dst->b(i, j) ]; } -} + } } if (denoiseLuminance) { @@ -1836,7 +1836,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1)); //3x3 } -} + } } } else { #pragma omp for @@ -1867,7 +1867,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->r(i, j - 2) ); // 5x5 soft } -} + } } } #ifdef _OPENMP @@ -1894,7 +1894,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1)); } -} + } } } else { #pragma omp for @@ -1925,7 +1925,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->b(i, j - 2) ); // 5x5 soft } -} + } } } @@ -1954,7 +1954,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1)); } -} + } } } else { #pragma omp for @@ -1985,7 +1985,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef source->g(i, j - 2) ); // 5x5 soft } -} + } } } @@ -2090,7 +2090,7 @@ void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, fl } } -} + } } /* #undef TS @@ -2324,7 +2324,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); } -} + } #endif boxblur(sfave, sfaved, blurBuffer, lvl + 2, lvl + 2, Wlvl_L, Hlvl_L); //increase smoothness by locally averaging shrinkage @@ -2355,7 +2355,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][coeffloc_L] *= (SQR(sfaved[coeffloc_L]) + SQR(sf_L)) / (sfaved[coeffloc_L] + sf_L + eps); }//now luminance coeffs are denoised -} + } #endif } @@ -2367,7 +2367,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit if (buffer[i] != nullptr) { delete[] buffer[i]; } -} + } } return (!memoryAllocationFailed); @@ -2506,7 +2506,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi if (buffer[i] != nullptr) { delete[] buffer[i]; } -} + } } return (!memoryAllocationFailed); @@ -2566,7 +2566,7 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, if (buffer[i] != nullptr) { delete[] buffer[i]; } -} + } } return (!memoryAllocationFailed); } @@ -2620,7 +2620,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L if (buffer[i] != nullptr) { delete[] buffer[i]; } -} + } } return (!memoryAllocationFailed); } diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 9f1c689de..2bcb0175e 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -131,7 +131,7 @@ const float d65_white[3] = { 0.950456, 1, 1.088754 }; #define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b)) #define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b)) #define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max)) -#define median(x,y,z) rtengine::median(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) +#define ULIM(x,y,z) rtengine::median(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) #define CLIP(x) rtengine::CLIP(x) #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } @@ -9852,5 +9852,5 @@ struct tiff_hdr { /*RT*/#undef MIN /*RT*/#undef ABS /*RT*/#undef LIM -/*RT*/#undef median +/*RT*/#undef ULIM /*RT*/#undef CLIP diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 5259c6b67..ad2997ae0 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2016-06-29 12:25:09 +0000 -+++ dcraw.cc 2016-07-06 12:30:27 +0000 +--- dcraw.c 2016-06-04 20:34:18.405932434 +0200 ++++ dcraw.cc 2016-07-09 17:40:46.405632563 +0200 @@ -1,3 +1,16 @@ +/*RT*/#include +/*RT*/#include @@ -153,7 +153,7 @@ +#define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b)) +#define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b)) +#define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max)) -+#define ULIM(x,y,z) rtengine::ULIM(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) ++#define ULIM(x,y,z) rtengine::median(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) +#define CLIP(x) rtengine::CLIP(x) #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } From 8d01bef05a1d9b2375821023e390caf0a434ba4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 10 Jul 2016 10:59:50 +0200 Subject: [PATCH 151/232] Remove unused `rtengine/colorclip.h` --- rtengine/colorclip.h | 169 ------------------------------------------- 1 file changed, 169 deletions(-) delete mode 100644 rtengine/colorclip.h diff --git a/rtengine/colorclip.h b/rtengine/colorclip.h deleted file mode 100644 index 6a3144166..000000000 --- a/rtengine/colorclip.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ -inline double tightestroot (double L, double a, double b, double r1, double r2, double r3); - -#ifndef __COLORCLIP__ -#define __COLORCLIP__ - -#include -#include "median.h" - -// gives back the tightest >0 amplification by which color clipping occures - -inline double tightestroot (double L, double a, double b, double r1, double r2, double r3) -{ - - double an = a / 500.0, bn = b / 200.0, p = (L + 16.0) / 116.0; - - double coeff3 = r1 * an * an * an - r3 * bn * bn * bn; - double coeff2 = 3.0 * p * (r1 * an * an + r3 * bn * bn); - double coeff1 = 3.0 * p * p * (r1 * an - r3 * bn); - double coeff0 = p * p * p * (r1 + r2 + r3) - 1.0; - - double a1 = coeff2 / coeff3; - double a2 = coeff1 / coeff3; - double a3 = coeff0 / coeff3; - - double Q = (a1 * a1 - 3.0 * a2) / 9.0; - double R = (2.0 * a1 * a1 * a1 - 9.0 * a1 * a2 + 27.0 * a3) / 54.0; - double Qcubed = Q * Q * Q; - double d = Qcubed - R * R; - -// printf ("input L=%g, a=%g, b=%g\n", L, a, b); -// printf ("c1=%g, c2=%g, c3=%g, c4=%g\n", coeff3, coeff2, coeff1, coeff0); - - - /* Three real roots */ - if (d >= 0) { - double theta = acos(R / sqrt(Qcubed)); - double sqrtQ = sqrt(Q); - double x0 = -2.0 * sqrtQ * cos( theta / 3.0) - a1 / 3.0; - double x1 = -2.0 * sqrtQ * cos((theta + 2.0 * M_PI) / 3.0) - a1 / 3.0; - double x2 = -2.0 * sqrtQ * cos((theta + 4.0 * M_PI) / 3.0) - a1 / 3.0; - -// printf ("3 roots: %g, %g, %g\n", x0, x1, x2); - - SORT3 (x0, x1, x2, a1, a2, a3); - - if (a1 > 0) { - return a1; - } - - if (a2 > 0) { - return a2; - } - - if (a3 > 0) { - return a3; - } - - return -1; - } - - /* One real root */ - else { -// double e = pow(sqrt(-d) + fabs(R), 1.0 / 3.0); - double e = exp (1.0 / 3.0 * log (sqrt(-d) + fabs(R))); - - if (R > 0) { - e = -e; - } - - double x0 = (e + Q / e) - a1 / 3.0; - -// printf ("1 root: %g\n", x0); - - if (x0 < 0) { - return -1; - } else { - return x0; - } - } -} - - -/******************************************************************************* - * FindCubicRoots - * -------------- - * - * Copyright (C) 1997-2001 Ken Turkowski. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * ------------------------------------------------------------------------ - * - * Solve: - * coeff[3] * x^3 + coeff[2] * x^2 + coeff[1] * x + coeff[0] = 0 - * - * returns: - * 3 - 3 real roots - * 1 - 1 real root (2 complex conjugate) - * - *******************************************************************************/ - -/*long -FindCubicRoots(const FLOAT coeff[4], FLOAT x[3]) -{ - FLOAT a1 = coeff[2] / coeff[3]; - FLOAT a2 = coeff[1] / coeff[3]; - FLOAT a3 = coeff[0] / coeff[3]; - - double_t Q = (a1 * a1 - 3 * a2) / 9; - double_t R = (2 * a1 * a1 * a1 - 9 * a1 * a2 + 27 * a3) / 54; - double_t Qcubed = Q * Q * Q; - double_t d = Qcubed - R * R; - - // Three real roots - if (d >= 0) { - double_t theta = acos(R / sqrt(Qcubed)); - double_t sqrtQ = sqrt(Q); - x[0] = -2 * sqrtQ * cos( theta / 3) - a1 / 3; - x[1] = -2 * sqrtQ * cos((theta + 2 * pi) / 3) - a1 / 3; - x[2] = -2 * sqrtQ * cos((theta + 4 * pi) / 3) - a1 / 3; - return (3); - } - - // One real root - else { - double_t e = pow(sqrt(-d) + fabs(R), 1. / 3.); - if (R > 0) - e = -e; - x[0] = (e + Q / e) - a1 / 3.; - return (1); - } -} -*/ -#endif From dd47d8b6c1308a4c87c0659d689dd2e395b8e9d5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 10 Jul 2016 13:43:12 +0200 Subject: [PATCH 152/232] Fix OOB access in ImProcFunctions::MadRgb, fixes #3379 --- rtengine/FTblockDN.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 71c65cfb0..c2b31281e 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2222,7 +2222,7 @@ float ImProcFunctions::MadRgb( float * DataList, const int datalen) int i; for (i = 0; i < datalen; i++) { - histo[min(65536, abs((int)DataList[i]))]++; + histo[min(65535, abs((int)DataList[i]))]++; } //find median of histogram From 5e11f6bb833681a305c2a00946923f547a914ca9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 10 Jul 2016 14:01:28 +0200 Subject: [PATCH 153/232] Revert "Fix OOB access in ImProcFunctions::MadRgb, fixes #3379" This reverts commit dd47d8b6c1308a4c87c0659d689dd2e395b8e9d5. --- rtengine/FTblockDN.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index c2b31281e..71c65cfb0 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2222,7 +2222,7 @@ float ImProcFunctions::MadRgb( float * DataList, const int datalen) int i; for (i = 0; i < datalen; i++) { - histo[min(65535, abs((int)DataList[i]))]++; + histo[min(65536, abs((int)DataList[i]))]++; } //find median of histogram From 2ee160dcf7a0b5aa4d45d4b82697b7be2df89cce Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 10 Jul 2016 18:35:19 +0200 Subject: [PATCH 154/232] Fix OOB access in ImProcFunctions::MadRgb, fixes #3379 --- rtengine/FTblockDN.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 20f5b5e1b..288c9c994 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2185,7 +2185,7 @@ float ImProcFunctions::MadRgb(float * DataList, const int datalen) int i; for (i = 0; i < datalen; ++i) { - histo[min(65536, abs(static_cast(DataList[i])))]++; + histo[min(65535, abs(static_cast(DataList[i])))]++; } //find median of histogram From 3aaacf3b0ce2b79486bab15f9b5bc59df95d6079 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 10 Jul 2016 20:31:03 +0200 Subject: [PATCH 155/232] Made post-resize sharpening RL radius minimum size consistent with RL radius from main sharpening - 0.40. Removed redundant guiutils.h include. --- rtgui/prsharpening.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index 22a70e8a4..efc00c95f 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -18,7 +18,6 @@ */ #include "prsharpening.h" #include -#include "guiutils.h" using namespace rtengine; using namespace rtengine::procparams; @@ -46,7 +45,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR pack_start (*hb); rld = new Gtk::VBox (); - dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.5, 2.5, 0.01, 0.75)); + dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); damount = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_AMOUNT"), 0.0, 100, 1, 75)); ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 20)); diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); From cb5e99ef62e4163a9a35ed1c8a1d1468fd308fb8 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 10 Jul 2016 21:22:12 +0200 Subject: [PATCH 156/232] Updated defaults for crop, sharpening and post-resize sharpening. --- rtengine/procparams.cc | 8 ++++---- rtgui/prsharpening.cc | 10 +++++----- rtgui/sharpening.cc | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 60a54baf5..70b764da1 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1038,8 +1038,8 @@ void ProcParams::setDefaults () prsharpening.edges_tolerance = 1800; prsharpening.halocontrol = false; prsharpening.halocontrol_amount = 85; - prsharpening.method = "usm"; - prsharpening.deconvradius = 0.5; + prsharpening.method = "rld"; + prsharpening.deconvradius = 0.45; prsharpening.deconviter = 100; prsharpening.deconvdamping = 0; prsharpening.deconvamount = 100; @@ -1149,10 +1149,10 @@ void ProcParams::setDefaults () crop.y = -1; crop.w = 15000; crop.h = 15000; - crop.fixratio = false; + crop.fixratio = true; crop.ratio = "3:2"; crop.orientation = "As Image"; - crop.guide = "Rule of thirds"; + crop.guide = "Frame"; coarse.setDefaults(); diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index efc00c95f..7dd097a90 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -45,10 +45,10 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR pack_start (*hb); rld = new Gtk::VBox (); - dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); - damount = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_AMOUNT"), 0.0, 100, 1, 75)); - ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 20)); - diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); + dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.45)); + damount = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_AMOUNT"), 0.0, 100, 1, 100)); + ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 0)); + diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 100)); rld->pack_start (*dradius); rld->pack_start (*damount); rld->pack_start (*ddamping); @@ -85,7 +85,7 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR edgesonly->set_active (false); edgebox = new Gtk::VBox (); eradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.5, 2.5, 0.1, 1.9)); - etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1000)); + etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1800)); usm->pack_start(*hsep6, Gtk::PACK_SHRINK, 2); usm->pack_start(*edgesonly); edgebox->pack_start(*eradius); diff --git a/rtgui/sharpening.cc b/rtgui/sharpening.cc index 09207a883..6af30c68b 100644 --- a/rtgui/sharpening.cc +++ b/rtgui/sharpening.cc @@ -81,7 +81,7 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI edgesonly->set_active (false); edgebox = new Gtk::VBox (); eradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.5, 2.5, 0.1, 1.9)); - etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1000)); + etolerance = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDTOLERANCE"), 10, 10000, 100, 1800)); usm->pack_start(*hsep6, Gtk::PACK_SHRINK, 2); usm->pack_start(*edgesonly); edgebox->pack_start(*eradius); From 5127e94cc92e749cb472a16169c3c139b9bd8072 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 12 Jul 2016 17:28:16 +0200 Subject: [PATCH 157/232] Add missing #ifdef __SSE2__, fixes #3382 --- rtengine/median.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/median.h b/rtengine/median.h index 8c65180ba..c2ef5fd27 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -6244,6 +6244,7 @@ inline std::array middle4of6(const std::array& array) return res; } +#ifdef __SSE2__ template<> inline std::array middle4of6(const std::array& array) { @@ -6267,6 +6268,7 @@ inline std::array middle4of6(const std::array& array) return res; } +#endif template inline std::array middle4of6(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5) From 2d346f670e6bddc5ba9ff81b6a17bc4782c0adbd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 14 Jul 2016 20:56:14 +0200 Subject: [PATCH 158/232] Fix build issue with clang --- rtengine/curves.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/curves.h b/rtengine/curves.h index a06502c71..348772075 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -249,7 +249,11 @@ public: #ifdef __SSE2__ static inline vfloat igamma (vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add) { +#if !defined(__clang__) return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) ); +#else + return vself(vmaskf_le(x, start * slope), x / slope, xexpf(xlogf((x + add) / mul) * gamma)); +#endif } #endif static inline float hlcurve (const float exp_scale, const float comp, const float hlrange, float level) From 0608ad8f49fc80f3122688688f778537895c8b3a Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 15 Jul 2016 01:16:12 +0200 Subject: [PATCH 159/232] Simplified OS X GIMP and Photoshop calling code. --- rtgui/extprog.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rtgui/extprog.cc b/rtgui/extprog.cc index 4f0018ab9..06f99826d 100644 --- a/rtgui/extprog.cc +++ b/rtgui/extprog.cc @@ -250,7 +250,10 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) #elif defined __APPLE__ - auto cmdLine = Glib::ustring("open -a /Applications/GIMP.app \'") + fileName + Glib::ustring("\'"); + // Apps should be opened using the simplest, case-insensitive form, "open -a NameOfProgram" + // Calling the executable directly is said to often cause trouble, + // https://discuss.pixls.us/t/affinity-photo-as-external-editor-how-to/1756/18 + auto cmdLine = Glib::ustring("open -a GIMP \'") + fileName + Glib::ustring("\'"); auto success = spawnCommandAsync (cmdLine); #else @@ -279,7 +282,7 @@ bool ExtProgStore::openInGimp (const Glib::ustring& fileName) #elif defined __APPLE__ - cmdLine = Glib::ustring("open -a /Applications/Gimp.app/Contents/Resources/start \'") + fileName + Glib::ustring("\'"); + cmdLine = Glib::ustring("open -a GIMP-dev \'") + fileName + Glib::ustring("\'"); success = ExtProgStore::spawnCommandAsync (cmdLine); #else @@ -301,7 +304,7 @@ bool ExtProgStore::openInPhotoshop (const Glib::ustring& fileName) #elif defined __APPLE__ - const auto cmdLine = Glib::ustring("open -a \'") + Glib::build_filename(options.psDir, "Photoshop.app\' ") + Glib::ustring("\'") + fileName + Glib::ustring("\'"); + const auto cmdLine = Glib::ustring("open -a Photoshop \'") + fileName + Glib::ustring("\'"); #else From 2c976e4e2442496e5821e4c1a0303dec0d5edbf6 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 28 Jul 2016 22:29:04 +0200 Subject: [PATCH 160/232] Nederlands updated by wim ter meer, closes #3390 --- rtdata/languages/Nederlands | 239 ++++++++++++++++++------------------ 1 file changed, 120 insertions(+), 119 deletions(-) diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 7806899b6..88f71e101 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -12,6 +12,7 @@ #12 2014-10-19 updated to rt4.1.92 by wim ter meer #13 2015-03-03 updated to rt4.2.102 by wim ter meer #14 2015-11-23 update by wim ter meer +#15 2016-07-21 update by wim ter meer ABOUT_TAB_BUILD;Versie ABOUT_TAB_CREDITS;Credits @@ -181,6 +182,7 @@ FILEBROWSER_SHOWEDITEDHINT;Toon bewerkte foto's\nSneltoets: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Toon niet-bewerkte foto's\nSneltoets: 6 FILEBROWSER_SHOWEXIFINFO;Toon EXIF-info FILEBROWSER_SHOWNOTTRASHHINT;Toon alleen niet-verwijderde foto's. +FILEBROWSER_SHOWORIGINALHINT;Toon alleen originele afbeelding.\n\nAls er meerdere afbeeldingen zijn met dezelfde naam maar verschillende extensies, dan wordt de afbeelding waarvan de extensie het hoogst staat in de lijst met extensies in Voorkeuren > Bestandsnavigator > Extensies FILEBROWSER_SHOWRANK1HINT;Toon foto's met 1 ster.\nSneltoets: 1 FILEBROWSER_SHOWRANK2HINT;Toon foto's met 2 sterren.\nSneltoets: 2 FILEBROWSER_SHOWRANK3HINT;Toon foto's met 3 sterren.\nSneltoets: 3 @@ -406,6 +408,7 @@ HISTORY_MSG_162;Tonen koppelen HISTORY_MSG_163;RGB-curve - R HISTORY_MSG_164;RGB-curve - G HISTORY_MSG_165;RGB-curve - B +HISTORY_MSG_166;Belichting - Teruggezet HISTORY_MSG_167;Demozaïekmethode HISTORY_MSG_168;L*a*b* - CC curve HISTORY_MSG_169;L*a*b* - CH curve @@ -549,7 +552,7 @@ HISTORY_MSG_307;W Ch niveau HISTORY_MSG_308;W richting HISTORY_MSG_309;W tegels HISTORY_MSG_310;W Tinten lucht -HISTORY_MSG_311;W Max niveau's +HISTORY_MSG_311;W Max niveaus HISTORY_MSG_312;W Schaduwen drempel HISTORY_MSG_313;W Pastel Verzadigd HISTORY_MSG_314;W Artefacten blauwe lucht @@ -650,9 +653,11 @@ HISTORY_MSG_408;Retinex - Naburig HISTORY_MSG_409;Retinex - Verbeteren HISTORY_MSG_410;Retinex - Beginpunt HISTORY_MSG_411;Retinex - Sterkte +HISTORY_MSG_412;Retinex - Gaussiaans Verloop HISTORY_MSG_413;Retinex - Variantie HISTORY_MSG_414;Retinex - Histogram - Lab HISTORY_MSG_415;Retinex - Transmissie +HISTORY_MSG_416;Retinex HISTORY_MSG_417;Retinex - Transmissie mediaan HISTORY_MSG_418;Retinex - Drempel HISTORY_MSG_419;Retinex - Kleurruimte @@ -663,6 +668,19 @@ HISTORY_MSG_423;Retinex - Gamma helling HISTORY_MSG_424;Retinex - HL drempel HISTORY_MSG_425;Retinex - Log base HISTORY_MSG_426;Retinex - Tint balans +HISTORY_MSG_427;Uitvoer rendering weergave +HISTORY_MSG_428;Monitor rendering weergave +HISTORY_MSG_429;Retinex - Herhalingen +HISTORY_MSG_430;Retinex - Transmissie Verloop +HISTORY_MSG_431;Retinex - Sterkte Verloop +HISTORY_MSG_432;Retinex - M - Hoge lichten +HISTORY_MSG_433;Retinex - M - Hoge lichten TW +HISTORY_MSG_434;Retinex - M - Schaduwen +HISTORY_MSG_435;Retinex - M - Schaduwen TW +HISTORY_MSG_436;Retinex - M - Straal +HISTORY_MSG_437;Retinex - M - Methode +HISTORY_MSG_438;Retinex - M - Mixer +HISTORY_MSG_440;DC - Methode HISTORY_NEWSNAPSHOT;Nieuw HISTORY_NEWSNAPSHOT_TOOLTIP;Sneltoets: Alt-s HISTORY_SNAPSHOT;Nieuw @@ -710,11 +728,12 @@ IPTCPANEL_TRANSREFERENCE;Trans. Reference IPTCPANEL_TRANSREFERENCEHINT;Een code die de locatie van de oorspronkelijke transmissie representeert (Original Transmission Reference) MAIN_BUTTON_FULLSCREEN;Volledig scherm MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigeer naar de volgende afbeelding relatief ten opzichte van de geopende afbeelding in de Editor\nSneltoets: Shift-F4\n\nNavigeer naar de volgende afbeelding relatief ten opzichte van de miniatuur geselecteerd in de Bestandsnavigator\nSneltoets: F4 -MAIN_BUTTON_NAVPREV_TOOLTIP;Navigeer naar de vorige afbeelding relatief ten opzichte van de geopende afbeelding in de Editor\nShortcut: Shift-F3 \n\nNavigeer naar de vorige afbeelding relatief ten opzichte van de miniatuur geselecteerd in de Bestandsnavigator\nSneltoets: F3 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navigeer naar de vorige afbeelding relatief ten opzichte van de geopende afbeelding in de Editor\nSneltoets: Shift-F3 \n\nNavigeer naar de vorige afbeelding relatief ten opzichte van de miniatuur geselecteerd in de Bestandsnavigator\nSneltoets: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchroniseer de Bestandsnavigator met de Editor om de miniatuur te tonen van de huidig geopende afbeelding, en verwijder de filters in de Bestandsnavigator \nSneltoets: x\n\nAls voorgaand, maar zonder het verwijderen van de filters in de Bestandsnavigator \nSneltoets: y\n(NB de miniatuur van de geopende afbeelding zal niet worden getoond indien gefilterd) MAIN_BUTTON_PREFERENCES;Voorkeuren MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Plaats huidige foto in verwerkingsrij.\nSneltoets: Ctrl+B MAIN_BUTTON_SAVE_TOOLTIP;Bewaar huidige foto.\nSneltoets: Ctrl+S +MAIN_BUTTON_SENDTOEDITOR;Bewerk afbeelding in externe editor MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Stuur huidige foto naar extern fotobewerkingsprogramma.\nSneltoets: Ctrl+E MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Toon/verberg alle zijpanelen.\nSneltoets: m MAIN_BUTTON_UNFULLSCREEN;Verlaat volledig scherm @@ -779,6 +798,7 @@ MAIN_TOOLTIP_SHOWHIDERP1;Toon/verberg rechterpaneel.\nSneltoets: Alt-l MAIN_TOOLTIP_SHOWHIDETP1;Toon/verberg bovenste paneel.\nSneltoets: Shift-L MAIN_TOOLTIP_THRESHOLD;Drempel MAIN_TOOLTIP_TOGGLE;Vergelijk origineel en bewerking +MONITOR_PROFILE_SYSTEM;Systeem standaardwaarde NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -838,6 +858,7 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dode pixels filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Groenbalans PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hete pixels filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Lijnruisfilter +PARTIALPASTE_PRSHARPENING;Verscherp na verkleinen PARTIALPASTE_RAWCACORR_AUTO;Autom. C/A-correctie PARTIALPASTE_RAWCACORR_CABLUE;C/A Blauw PARTIALPASTE_RAWCACORR_CARED;C/A Rood @@ -915,7 +936,7 @@ PREFERENCES_DARKFRAMETEMPLATES;sjablonen PREFERENCES_DATEFORMAT;Datumformaat PREFERENCES_DATEFORMATHINT;U kunt de volgende formaten gebruiken:\n%y : jaar\n%m : maand\n%d : dag\n\nHet Nederlandse datumformaat is bijvoorbeeld:\n%d/%m/%y PREFERENCES_DAUB_LABEL;Gebruik Daubechies D6 wavelets in plaats van D4 -PREFERENCES_DAUB_TOOLTIP;De Ruisonderdrukking en Wavelet Niveau's gebruiken de Debauchies moeder wavelet. Als je D6 gebruikt in plaats van D4 vergroot het aantal orthogonale Daubechies coëfficiënten en dit verbeterd waarschijlijk de kwaliteit van de lage niveaus. +PREFERENCES_DAUB_TOOLTIP;De Ruisonderdrukking en Wavelet niveaus gebruiken de Debauchies moeder wavelet. Als je D6 gebruikt in plaats van D4 vergroot het aantal orthogonale Daubechies coëfficiënten en dit verbeterd waarschijnlijk de kwaliteit van de lage niveaus. PREFERENCES_DEFAULTLANG;Standaardtaal PREFERENCES_DEFAULTTHEME;Standaardthema PREFERENCES_DIRDARKFRAMES;Map met donkerframes @@ -986,6 +1007,8 @@ PREFERENCES_MENUGROUPRANK;Groepeer markering PREFERENCES_MENUOPTIONS;Menu-opties PREFERENCES_METADATA;Metadata PREFERENCES_MIN;Mini (100x115) +PREFERENCES_MONINTENT;Standaard monitor weergave +PREFERENCES_MONPROFILE;Standaard monitor profiel PREFERENCES_MULTITAB;Multi-tab: elke foto opent in nieuw tabvenster PREFERENCES_MULTITABDUALMON;Multi-tab, indien beschikbaar op tweede monitor PREFERENCES_NAVGUIDEBRUSH;Navigator randkleur @@ -1000,10 +1023,12 @@ PREFERENCES_OVERLAY_FILENAMES;Toon bestandsnamen over miniaturen PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Toon bestandsnaam over miniaturen in het Bewerkingsvenster PREFERENCES_OVERWRITEOUTPUTFILE;Overschrijf bestaande output-bestanden PREFERENCES_PANFACTORLABEL;Factor -PREFERENCES_PARSEDEXT;Toon extensies +PREFERENCES_PARSEDEXT;Extensies (verwerkingsvolgorde) PREFERENCES_PARSEDEXTADD;Voeg extensie toe PREFERENCES_PARSEDEXTADDHINT;Typ nieuwe extensie en druk op knop om aan lijst toe te voegen PREFERENCES_PARSEDEXTDELHINT;Verwijder geselecteerde extensie(s) uit lijst +PREFERENCES_PARSEDEXTDOWNHINT;Verplaats extensie naar beneden +PREFERENCES_PARSEDEXTUPHINT;Verplaats extensie naar boven PREFERENCES_PREVDEMO;Voorbeeld Demozaïekmethode PREFERENCES_PREVDEMO_FAST;Snel PREFERENCES_PREVDEMO_LABEL;Demozaïekmethode van het voorbeeld bij <100% zoom: @@ -1014,6 +1039,7 @@ PREFERENCES_PROFILEPRCACHE;Profiel in cache PREFERENCES_PROFILEPRFILE;Profiel bij RAW-bestand PREFERENCES_PROFILESAVECACHE;Bewaar profiel in cache PREFERENCES_PROFILESAVEINPUT;Bewaar profiel bij RAW-bestand +PREFERENCES_PROFILE_NONE;Geen PREFERENCES_PROPERTY;Eigenschap PREFERENCES_PSPATH;Installatiemap Adobe Photoshop PREFERENCES_REMEMBERZOOMPAN;Onthoud zoom % en pan startpunt @@ -1061,7 +1087,7 @@ PREFERENCES_USESYSTEMTHEME; Gebruik systeemthema PREFERENCES_VIEW;Witbalans instelling van het uitvoerapparaat (monitor, TV, projector...) PREFERENCES_WAVLEV;Vergroot wavelet ninveau voor kwaliteit 'hoog' PREFERENCES_WLONE;Eén niveau -PREFERENCES_WLTWO;Twee niveau's +PREFERENCES_WLTWO;Twee niveaus PREFERENCES_WLZER;Nee PREFERENCES_WORKFLOW;Layout PROFILEPANEL_COPYPPASTE;Te kopiëren parameters @@ -1129,10 +1155,9 @@ TOOLBAR_TOOLTIP_HAND;Sleepgereedschap.\nSneltoets: h TOOLBAR_TOOLTIP_STRAIGHTEN;Rechtmaken / Kleine rotaties.\nSneltoets: s\n\nBepaal de vertikale of horizontale as door het trekken van een hulplijn over de afbeelding. De rotatiehoek wordt naast de hulplijn getoond. Het centrum van de roatatie is het geometrische midden van de afbeelding. TOOLBAR_TOOLTIP_WB;Witbalans.\nSneltoets: w TP_BWMIX_ALGO;Algoritme OYCPM -TP_BWMIX_ALGO_LI;Linear +TP_BWMIX_ALGO_LI;Lineair TP_BWMIX_ALGO_SP;Speciale effecten -TP_BWMIX_ALGO_TOOLTIP;Linear: creëert een normale lineare response.\nSpeciale effecten: creëert speciale effecten door kanalen non-linearl te mixen. -TP_BWMIX_AUTOCH;Auto +TP_BWMIX_ALGO_TOOLTIP;Lineair: creëert een normale lineaire response.\n Speciale effecten: creëert speciale effecten door kanalen non-lineair te mixen.TP_BWMIX_AUTOCH;Auto TP_BWMIX_AUTOCH_TIP;Bereken optimale waardes voor de kanaalmixer. TP_BWMIX_CC_ENABLED;Wijzig complementaire kleur TP_BWMIX_CC_TOOLTIP;Automatische aanpassing van complementaire kleuren in ROYGCBPM mode. @@ -1151,7 +1176,7 @@ TP_BWMIX_FILTER_NONE;Geen TP_BWMIX_FILTER_PURPLE;Paars TP_BWMIX_FILTER_RED;Rood TP_BWMIX_FILTER_REDYELLOW;Rood-Geel -TP_BWMIX_FILTER_TOOLTIP;Het kleurfilter heeft hetzelfde effect als een voor de lens geplaatst filter. Kleurfilters reduceren specifieke reeksen van kleuren en beninvloeden de helderheid. Bv. een rood filter maak een blauwe lucht donkerder. +TP_BWMIX_FILTER_TOOLTIP;Het kleurfilter heeft hetzelfde effect als een voor de lens geplaatst filter. Kleurfilters reduceren specifieke reeksen van kleuren en beïnvloeden de helderheid. Bv. een rood filter maak een blauwe lucht donkerder. TP_BWMIX_FILTER_YELLOW;Geel TP_BWMIX_GAMMA;Gamma Correctie TP_BWMIX_GAM_TOOLTIP;Corrigeer gamma voor elk RGB kanaal @@ -1184,13 +1209,17 @@ TP_BWMIX_SET_RGBREL;Relatieve RGB TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM TP_BWMIX_SET_ROYGCBPMREL;Relatieve ROYGCBPM TP_BWMIX_TCMODE_FILMLIKE;Z&W Film-achtig -TP_BWMIX_TCMODE_SATANDVALBLENDING;Z-W Verzadinging en Waarde menging +TP_BWMIX_TCMODE_SATANDVALBLENDING;Z-W Verzadiging en Waarde menging TP_BWMIX_TCMODE_STANDARD;Z-W Standaard TP_BWMIX_TCMODE_WEIGHTEDSTD;Z-W Gewogen Standard TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Blauw TP_CACORRECTION_LABEL;Corrigeer chromatische aberratie TP_CACORRECTION_RED;Rood +TP_CBDL_AFT;Na Zwart-Wit +TP_CBDL_BEF;Voor Zwart-Wit +TP_CBDL_METHOD;Uitvoeren +TP_CBDL_METHOD_TOOLTIP;Kies of Detailcontrast moet worden uitgevoerd na de Zwart-Wit bewerking waardoor het werkt in L*a*b*, of voor de Zwart-Wit bewerking waardoor het werkt in RGB TP_CHMIXER_BLUE;Blauw TP_CHMIXER_GREEN;Groen TP_CHMIXER_LABEL;Kleurkanaal mixer @@ -1253,13 +1282,13 @@ TP_COLORAPP_RSTPRO_TOOLTIP;Rode en Huidtinten bescherming (schuifbalk en curven) TP_COLORAPP_SHARPCIE;Verscherpen, Detailcontrast, Microcontrast & Randen met Q/C TP_COLORAPP_SHARPCIE_TOOLTIP;Verscherpen, Detailcontrast, Microcontrast & Randen zullen CIECAM02 gebruiken wanneer dit is aangezet. TP_COLORAPP_SURROUND;Omgeving -TP_COLORAPP_SURROUND_AVER;Gemmideld +TP_COLORAPP_SURROUND_AVER;Gemmiddeld TP_COLORAPP_SURROUND_DARK;Donker TP_COLORAPP_SURROUND_DIM;Gedimd TP_COLORAPP_SURROUND_EXDARK;Duister TP_COLORAPP_SURROUND_TOOLTIP;Verander tonen en kleuren rekening houdend met de weergaveomstandigheden van het uitvoerapparaat\n\nGemiddeld:\nGemiddeld verlichte omgeving (standaard)\nDe afbeelding zal niet veranderen \n\nGedimd:\nGedimde omgeving (TV)\nDe afbeelding zal enigszins donkerder worden\n\nDonker:\nDonkere omgeving (projector)\nDe afbeelding zal veel donkerder worden\n\nDuister:\nDuistere omgeving\nDe afbeelding zal zeer donker worden TP_COLORAPP_SURSOURCE;Donkere omgeving -TP_COLORAPP_SURSOURCE_TOOLTIP;Kan worden gebruikt als de fotos is gemaakt in een donkere omgeving +TP_COLORAPP_SURSOURCE_TOOLTIP;Kan worden gebruikt als de foto is gemaakt in een donkere omgeving TP_COLORAPP_TCMODE_BRIGHTNESS;Helderheid TP_COLORAPP_TCMODE_CHROMA;Chroma TP_COLORAPP_TCMODE_COLORF;Kleurrijkheid @@ -1301,6 +1330,7 @@ TP_COLORTONING_SHADOWS;Schaduwen TP_COLORTONING_SPLITCO;Schaduwen/Midden tonen/Hoge lichten TP_COLORTONING_SPLITCOCO;Kleurbalans SMH TP_COLORTONING_SPLITLR;Verzadiging 2 kleuren +TP_COLORTONING_STR;Sterkte TP_COLORTONING_STRENGTH;Sterkte TP_COLORTONING_TWO2;Speciaal chroma '2 kleuren' TP_COLORTONING_TWOALL;Speciaal chroma @@ -1333,7 +1363,7 @@ TP_DEFRINGE_THRESHOLD;Drempel TP_DIRPYRDENOISE_33;3x3 sterk TP_DIRPYRDENOISE_55;5x5 sterk TP_DIRPYRDENOISE_55SOFT;5x5 -TP_DIRPYRDENOISE_77;7x7 (langzaaam) +TP_DIRPYRDENOISE_77;7x7 (langzaam) TP_DIRPYRDENOISE_99;9x9 (erg langzaam) TP_DIRPYRDENOISE_ABM;Alleen chroma TP_DIRPYRDENOISE_AUT;Automatisch algemeen @@ -1346,6 +1376,7 @@ TP_DIRPYRDENOISE_CHROMA;Chrominantie (master) TP_DIRPYRDENOISE_CHROMAFR;Chrominantie TP_DIRPYRDENOISE_CTYPE;Auto methode TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nAutomatisch multi-zones\nGeen voorbeeld - werkt alleen bij opslaan. Gebruik de "Voorbeeld" methode om een idee te krijgen van het verwachte resultaat door de tegelgrootte en het centrum van het voorbeeld te matchen.\nDe afbeelding is verdeeld in tegels (10 tot 70 afhankelijk van de afbeeldingsgrootte) en van elke tegel wordt de eigen chroma ruisonderdrukking bepaald.\n\Voorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. +TP_DIRPYRDENOISE_CUR;Curve TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Vergroot (vermenigvuldigt) de waarde van alle chrominantie schuifbalken.\nMet deze curve kun je de sterkte aanpassen van de chromatische ruisonderdrukking. Bijvoorbeeld door de werking te vergroten in gebieden met lage verzadiging en te verminderen in gebieden met hoge verzadiging. TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Luminantie ruisonderdrukking. Werkt niet lineair maar modulerend @@ -1354,6 +1385,7 @@ TP_DIRPYRDENOISE_ENH;Verbeteren TP_DIRPYRDENOISE_ENH_TOOLTIP;Verbetert de ruisonderdrukking, maar vergroot de verwerkingstijd met ongeveer 20% TP_DIRPYRDENOISE_GAMMA;Gamma TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varieert de mate van ruisonderdrukking over het bereik van tinten. Kleinere waarden beperken zich tot schaduwen, terwijl grotere waarden het bereik oprekken tot heldere tinten +TP_DIRPYRDENOISE_LAB;L*a*b* TP_DIRPYRDENOISE_LABEL;Ruisonderdrukking TP_DIRPYRDENOISE_LABM;L*a*b* TP_DIRPYRDENOISE_LCURVE;Luminantie curve @@ -1378,9 +1410,10 @@ TP_DIRPYRDENOISE_METM_TOOLTIP;De "Alleen Luminantie" en "L*a*b*" methodes worden TP_DIRPYRDENOISE_MET_TOOLTIP;Mediaan filters. Hoe groter de omvang, hoe langer de verwerking.\n\n3x3: bewerkt 5 pixels in een 1-pixel reeks.\n3x3 sterk: bewerkt 9 pixels in een 1-pixel reeks.\n5x5 soft: bewerkt 13 pixels in een 2-pixel reeks.\n5x5: bewerkt 25 pixels in een 2-pixel reeks.\n7x7: bewerkt 49 pixels in een 3-pixel reeks.\n9x9: bewerkt 81 pixels in een 4-pixel reeks.\n\nSoms is het mogelijk om een beter resultaat te behalen door meerdere iteraties met een kleinere reeks uit te voeren dan 1 iteratie met een grotere reeks. TP_DIRPYRDENOISE_NOISELABEL;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Toont de overgebleven ruisniveau's van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. -TP_DIRPYRDENOISE_PASSE;Iteraties -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Een 3x3 filter met drie iteraties geeft meestal een beter resultaat dan eenmaal het 7x7 filter. +TP_DIRPYRDENOISE_NRESID_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. +TP_DIRPYRDENOISE_PASSE;Herhalingen +TP_DIRPYRDENOISE_PASSES;Mediaan herhalingen +TP_DIRPYRDENOISE_PASSES_TOOLTIP;Een 3x3 filter met drie herhalingen geeft meestal een beter resultaat dan eenmaal het 7x7 filter. TP_DIRPYRDENOISE_PON;Auto multi-zone TP_DIRPYRDENOISE_PRE;Voorbeeld multi-zone TP_DIRPYRDENOISE_PREV;Voorbeeld @@ -1397,7 +1430,7 @@ TP_DIRPYREQUALIZER_ALGO;Algoritme Huid TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fijn: behoud de kleuren van de huid, minimaliseert de actie op andere kleuren\nGroot: vermijd artefacten TP_DIRPYREQUALIZER_ARTIF;Verminder artefacten TP_DIRPYREQUALIZER_HUESKIN;Huidtint -TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;De onderste punten zetten het begin van de transitie zone, en de bovenste punten het einde. Daar is het effect het sterkst.\n\nAls je de zone sterk moet verschuiven of als er sprake is van artefacten, dan is de witbalans incorrect.\nJe kunt de zone enigzins wijzigen om te voorkomen dat de rest van de afbeelding wordt beinvloed. +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;De onderste punten zetten het begin van de transitie zone, en de bovenste punten het einde. Daar is het effect het sterkst.\n\nAls je de zone sterk moet verschuiven of als er sprake is van artefacten, dan is de witbalans incorrect.\nJe kunt de zone enigzins wijzigen om te voorkomen dat de rest van de afbeelding wordt beïnvloed. TP_DIRPYREQUALIZER_LABEL;Detailcontrast (Lab/CIECAM02) TP_DIRPYREQUALIZER_LUMACOARSEST;grofste TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- @@ -1440,13 +1473,14 @@ TP_EXPOSURE_TCMODE_FILMLIKE;Film-achtig TP_EXPOSURE_TCMODE_LABEL1;Curve modus 1 TP_EXPOSURE_TCMODE_LABEL2;Curve modus 2 TP_EXPOSURE_TCMODE_LUMINANCE;Luminantie -TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptuee +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptueel TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Verzadiging en Waarde mengen TP_EXPOSURE_TCMODE_STANDARD;Standaard TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewogen Standaard TP_EXPOS_BLACKPOINT_LABEL;Raw Zwartpunten TP_EXPOS_WHITEPOINT_LABEL;Raw Witpunten TP_FILMSIMULATION_LABEL;Film Simuleren +TP_FILMSIMULATION_SLOWPARSEDIR;Map met Hald CLUT afbeeldingen. Deze worden gebruikt voor Film Simuleren.\nGa naar Voorkeuren > Beeldverwerking > Film Simuleren\nDe aanbeveling is om een map te gebruiken die alleen Hald CLUT afbeeldingen bevat.\n\nLees het Film Simuleren artikel in RawPedia voor meer informatie.\n\nWilt u de scan afbreken? TP_FILMSIMULATION_STRENGTH;Sterkte TP_FILMSIMULATION_ZEROCLUTSFOUND;Specificeer HaldCLUT map in Voorkeuren TP_FLATFIELD_AUTOSELECT;Automatische selectie @@ -1489,11 +1523,11 @@ TP_HSVEQUALIZER_LABEL;HSV-balans TP_HSVEQUALIZER_SAT;Verzadiging TP_HSVEQUALIZER_VAL;Waarde TP_ICM_APPLYBASELINEEXPOSUREOFFSET;DCP basis belichting -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Gebruik de ingebede DCP basis belichting. De instelling is allen actief als de DCP een basis belichting heeft. +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Gebruik de ingebedde DCP basis belichting. De instelling is allen actief als de DCP een basis belichting heeft. TP_ICM_APPLYHUESATMAP;DCP basis tabel -TP_ICM_APPLYHUESATMAP_TOOLTIP;Gebruik de ingebede DCP basis tabel (HueSatMap). De instelling is allen actief als de DCP een basis tabel heeft. +TP_ICM_APPLYHUESATMAP_TOOLTIP;Gebruik de ingebedde DCP basis tabel (HueSatMap). De instelling is allen actief als de DCP een basis tabel heeft. TP_ICM_APPLYLOOKTABLE;DCP 'look' tabel -TP_ICM_APPLYLOOKTABLE_TOOLTIP;Gebruik de ingebede DCP 'look' tabel. De instelling is allen actief als de DCP een looktable heeft. +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Gebruik de ingebedde DCP 'look' tabel. De instelling is allen actief als de DCP een looktable heeft. TP_ICM_BLENDCMSMATRIX;Meng hoge lichten met matrix TP_ICM_BLENDCMSMATRIX_TOOLTIP;Activeer om uitgebeten hoge lichten te herstellen wanneer op LUT gebaseerde ICC-profielen worden gebruikt. TP_ICM_DCPILLUMINANT;Illuminant @@ -1514,10 +1548,11 @@ TP_ICM_INPUTPROFILE;Invoerprofiel TP_ICM_LABEL;Kleurbeheer TP_ICM_NOICM;Geen ICM: sRGB-uitvoer TP_ICM_OUTPUTPROFILE;Uitvoerprofiel +TP_ICM_PROFILEINTENT;Rendering weergave TP_ICM_SAVEREFERENCE;Bewaar referentiefoto tbv. profiling TP_ICM_SAVEREFERENCE_APPLYWB;Toepassen witbalans TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Gebruik witbalans bij het opslaan van afbeeldingen voor het maken van ICC profielen. Gebruik geen witbalans bij het maken van DCP profielen. -TP_ICM_SAVEREFERENCE_TOOLTIP;Sla de lineare TIFF afbeelding op voordat het invoer profiel is toegepast. Het resultaat kan worden gebruikt voor calibratie en het genereren van een camera profiel. +TP_ICM_SAVEREFERENCE_TOOLTIP;Sla de lineaire TIFF afbeelding op voordat het invoer profiel is toegepast. Het resultaat kan worden gebruikt voor calibratie en het genereren van een camera profiel. TP_ICM_TONECURVE;Gebruik DCP's toon curve TP_ICM_TONECURVE_TOOLTIP;Gebruik de ingebedde DCP toon curve. De instelling is alleen actief als de geselecteerd DCP een toon curve heeft. TP_ICM_WORKINGPROFILE;Werkprofiel @@ -1557,7 +1592,7 @@ TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminantie volgens hue L=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminantie volgens luminantie L=f(L) TP_LABCURVE_LABEL;Lab TP_LABCURVE_LCREDSK;Beperkt LC tot Rode en Huidtinten -TP_LABCURVE_LCREDSK_TIP;Indien ingeschakeld, beinvloed de LC Curve alleen rode en huidtinten\nIndien uitgeschakeld, is het van toepassing op all tinten +TP_LABCURVE_LCREDSK_TIP;Indien ingeschakeld, beïnvloed de LC Curve alleen rode en huidtinten\nIndien uitgeschakeld, is het van toepassing op all tinten TP_LABCURVE_RSTPROTECTION;Rode en huidtinten Bescherming TP_LABCURVE_RSTPRO_TOOLTIP;Kan worden gebruikt met de chromaticiteits schuifbalk en de CC curve. TP_LENSGEOM_AUTOCROP;Automatisch bijsnijden @@ -1567,6 +1602,7 @@ TP_LENSPROFILE_LABEL;Lenscorrectie Profielen TP_LENSPROFILE_USECA;CA correctie TP_LENSPROFILE_USEDIST;Lensvervorming correctie TP_LENSPROFILE_USEVIGN;Vignettering correctie +TP_NEUTRAL;Terugzetten TP_NEUTRAL_TIP;Alle belichtingsinstellingen naar 0 TP_PCVIGNETTE_FEATHER;Straal TP_PCVIGNETTE_FEATHER_TOOLTIP;Straal: \n0=alleen hoeken \n50=halverwege tot het centrum \n100=tot aan het centrum @@ -1593,6 +1629,7 @@ TP_PRSHARPENING_TOOLTIP;Verscherp na verkleinen. Werkt alleen als verkleinen act TP_RAWCACORR_AUTO;Automatische CA-correctie TP_RAWCACORR_CABLUE;Blauw TP_RAWCACORR_CARED;Rood +TP_RAWCACORR_CASTR;Sterkte TP_RAWEXPOS_BLACKS;Zwartniveaus TP_RAWEXPOS_BLACK_0;Groen 1 (leidend) TP_RAWEXPOS_BLACK_1;Rood @@ -1637,34 +1674,58 @@ TP_RESIZE_WIDTH;Breedte TP_RETINEX_CONTEDIT_HSL;Histogram balans HSL TP_RETINEX_CONTEDIT_LAB;Histogram balans L*a*b* TP_RETINEX_CONTEDIT_LH;Tint balans +TP_RETINEX_CONTEDIT_MAP;Masker mixer TP_RETINEX_CURVEEDITOR_CD;L=f(L) TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminantie volgens luminantie L=f(L)\nCorrigeert ruwe data om halo's and artefacte te verminderen. TP_RETINEX_CURVEEDITOR_LH;Sterkte=f(H) TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Sterkte volgens tint Sterkte=f(H)\nDeze curve wijzigt ook chroma wanneer de "Hooglicht" retinex methode wordt gebruikt. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Deze curve kan zowel alleen worden gebruikt of in combinatie met een Gaussiaans masker of wavelet masker.\nHou rekening met artefacten! +TP_RETINEX_EQUAL;Mixer +TP_RETINEX_FREEGAMMA;Vrij gamma TP_RETINEX_GAIN;Verbeteren -TP_RETINEX_GAIN_TOOLTIP;Wijzigt de aangepaste afbeelding.\n\nDit wijkt af van de andere instellingen. Wordt gebruikt voor zwarte of witte pixels, en om het histogram te balanseren. +TP_RETINEX_GAIN_TOOLTIP;Wijzigt de aangepaste afbeelding.\n\nDit wijkt af van de andere instellingen. Wordt gebruikt voor zwarte of witte pixels, en om het histogram te balanceren. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Vrij TP_RETINEX_GAMMA_HIGH;Hoog TP_RETINEX_GAMMA_LOW;Laag TP_RETINEX_GAMMA_MID;Midden TP_RETINEX_GAMMA_NONE;Geen +TP_RETINEX_GAMMA_TOOLTIP;Hersteld tinten door gamma voor en na Retinex toe te passen. Verschilt van Retinex curves en andere curves (Lab, Exposure, etc.). +TP_RETINEX_GRAD;Transmissie verloop +TP_RETINEX_GRADS;Sterkte verloop +TP_RETINEX_GRADS_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Sterkte verminderd en herhaling vergroot, en omgekeerd. +TP_RETINEX_GRAD_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Variantie en Drempel worden verkleind als herhaling toeneemt, en omgekeerd. TP_RETINEX_HIGH;Hoog TP_RETINEX_HIGHLIG;Hooglicht TP_RETINEX_HIGHLIGHT;Drempel hooglicht TP_RETINEX_HIGHLIGHT_TOOLTIP;Versterkt de werking van de Hooglicht methode.\nMogelijk moet de "Naburige pixels" worden aangepast en moet de "Witpunt Correctie" in de Raw tab -> Raw Witpuntent worden vergroot. TP_RETINEX_HSLSPACE_LIN;HSL-Linear TP_RETINEX_HSLSPACE_LOG;HSL-Logaritmisch +TP_RETINEX_ITER;Herhalingen (Tonemapping) +TP_RETINEX_ITERF;Tonemapping +TP_RETINEX_ITER_TOOLTIP;Simuleert tonemapping.\nHoge waarden verlengen de bewerkingstijd. TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Masker TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Laag +TP_RETINEX_MAP;Masker methode +TP_RETINEX_MAP_GAUS;Gaussiaans masker +TP_RETINEX_MAP_MAPP;Verscherp masker (wavelet gedeeltelijk) +TP_RETINEX_MAP_MAPT;Verscherp masker (wavelet totaal) +TP_RETINEX_MAP_METHOD_TOOLTIP;Gebruik het masker dat is aangemaakt door de bovenstaande Gausiaanse functie (Straal, Methode) om halo’s en artefacten te verminderen.\n\nCurve: past een diagonale contrast curve toe op het masker.\nHou rekening met artefacten!\n\n Gausiaans: genereerd en gebruikt een ‘Gausiaanse blur’ op het masker.\nVerscherpen: genereert en gebruikt een ‘wavelet’ op het masker.\nLangzaam. +TP_RETINEX_MAP_NONE;Geen TP_RETINEX_MEDIAN;Transmissie mediaan filter TP_RETINEX_METHOD;Methode TP_RETINEX_METHOD_TOOLTIP;Laag = versterk lage lichten,\nUniform = gelijkmatig,\nHoog = versterk hoge lichten,\nHooglicht = verwijder magenta in hooglicht. +TP_RETINEX_MLABEL;Teruggeplaatst sluier-vrij Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;Zou min=0 en max=32768 moeten benaderen\nTeruggeplaatste afbeelding zonder mixture. TP_RETINEX_NEIGHBOR;Naburige pixels -TP_RETINEX_NEUTRAL;Begingwaarde +TP_RETINEX_NEUTRAL;Beginwaarde TP_RETINEX_NEUTRAL_TIP;Zet alles terug naar de beginwaarde. TP_RETINEX_OFFSET;Beginpunt +TP_RETINEX_SCALES;Gaussiaans verloop +TP_RETINEX_SCALES_TOOLTIP;Indien schuifbalk=0: alle herhalingen zijn gelijk.\nIndien > 0 Schaal en straal worden verkleind als herhaling toeneemt, en omgekeerd. TP_RETINEX_SETTINGS;Instellingen TP_RETINEX_SLOPE;Vrij gamma helling TP_RETINEX_STRENGTH;Sterkte @@ -1673,10 +1734,19 @@ TP_RETINEX_THRESHOLD_TOOLTIP;Beperkt in/uit.\nIn = afbeelding,\nUit = afbeelding TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Gemiddeld=%3 Sigma=%4 TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 TP_RETINEX_TLABEL_TOOLTIP;Transmissie resultaat.\nMin en Max worden gebruikt door Variantie.\nMeeste en Sigma\nTm=Min TM=Max van de transmissie. +TP_RETINEX_TRANF;Transmissie TP_RETINEX_TRANSMISSION;Transmissie plan +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmissie volgens transmissie.\nAbscis: transmissie van negatieve waarden (min), gemiddelde, en positieve waarden (max).\nOrdinaat: versterken of verminderen. TP_RETINEX_UNIFORM;Uniform TP_RETINEX_VARIANCE;Variantie TP_RETINEX_VARIANCE_TOOLTIP;Lage variantie versterkt lokaal contrast en verzadiging, maar dit kan artefacten veroorzaken. +TP_RETINEX_VIEW;Proces +TP_RETINEX_VIEW_MASK;Masker +TP_RETINEX_VIEW_METHOD_TOOLTIP;Standaard - Normale afbeelding.\nMasker - Toont het masker.\nOnscherp masker - Toont de afbeelding met een hoge straal.\nTransmissie - Auto/Vast - Toont de transmissie-map, voor enige actie op kontrast en helderheid.\n\nLet op: het masker komt niet overeen met de werkelijkheid, maar is versterkt om het effect beter zichtbaar te maken. +TP_RETINEX_VIEW_NONE;Standaard +TP_RETINEX_VIEW_TRAN;Transmissie - Auto +TP_RETINEX_VIEW_TRAN2;Transmissie - Vast +TP_RETINEX_VIEW_UNSHARP;Onscherpmasker TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Kanaal TP_RGBCURVES_GREEN;G @@ -1771,12 +1841,12 @@ TP_WAVELET_CBENAB;Kleurtint en kleurbalans TP_WAVELET_CCURVE;Lokaal contrast TP_WAVELET_CH1;Alle chroma's TP_WAVELET_CH2;Pastel - Verzadigd -TP_WAVELET_CH3;Koppel contrast niveau's +TP_WAVELET_CH3;Koppel contrast niveaus TP_WAVELET_CHCU;Curve TP_WAVELET_CHR;Koppel Chroma aan contrast TP_WAVELET_CHRO;Verzadigd - Pastel TP_WAVELET_CHRO_TOOLTIP;Begrens tussen pastel en verzadigd\n 1-x niveau verzadigd\n x-9 niveau pastel -TP_WAVELET_CHR_TOOLTIP;Wijzig chroma in combinatie met Contrast niveau's +TP_WAVELET_CHR_TOOLTIP;Wijzig chroma in combinatie met Contrast niveaus TP_WAVELET_CHSL;Schuifbalken TP_WAVELET_CHTYPE;Chrominantie methode TP_WAVELET_COLORT;Dekking Rood-Groen Niveau @@ -1791,12 +1861,13 @@ TP_WAVELET_CONTRAST_MINUS;Contrast - TP_WAVELET_CONTRAST_PLUS;Contrast + TP_WAVELET_CONTRA_TOOLTIP;Wijzigt het contrast van de 'rest afbeelding'. TP_WAVELET_CTYPE;Chrominantie sterkte +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Wijzigt lokaal contrast als een functie van het oorspronkelijke lokale contrast (abscis).\nLage abscis waarden vertegenwoordigen klein lokaal contrast (werkelijke waarden rond 10..20).\n50% abscis vertegenwoordigd gemiddeld lokaal contrast (werkelijke waarden rond 100..300).\n66% abscis vertegenwoordigd standaard deviatie van lokaal contrast (werkelijke waarden rond 300..800).\n100% abscis vertegenwoordigd maximaal lokaal contrast (werkelijke waarden rond 3000..8000). TP_WAVELET_CURVEEDITOR_CH;Contrast niveau=f(Hue) TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Wijzigt het contrast van elk niveau als een functie van hue.\nZorg er voor dat de wijzigingen die zijn gemaakt bij de Gamut Hue toepassing niet worden overschreven.\nDe curve werkt alleen als de 'wavelet contrast niveau schuifbalken' groter dan nul zijn. TP_WAVELET_CURVEEDITOR_CL;L TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Contrast luminantie curve. Wordt uitgevoerd aan het einde van de wavelet niveau behandeling. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Wijzigt de rest van de afbeelding's tint als een functie van tint. +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Wijzigt de rest van de afbeelding 's tint als een functie van tint. TP_WAVELET_DALL;Alle richtingen TP_WAVELET_DAUB;Randen TP_WAVELET_DAUB2;D2 - laag @@ -1804,23 +1875,24 @@ TP_WAVELET_DAUB4;D4 - standaard TP_WAVELET_DAUB6;D6 - standaard plus TP_WAVELET_DAUB10;D10 - medium TP_WAVELET_DAUB14;D14 - hoog -TP_WAVELET_DAUB_TOOLTIP;Wijzigt Daubechies coëfficiënt:\nD4 = Standaard,\nD14 = Geeft meestal het beste resultaat met een iets langere vewerkingstijd.\n\nBeinvloed zowel rand detectie als het algemen resultaat van de eerste niveau´s. De kwaliteit is niet strikt gerelateerd aan deze coëfficiënt en kan varieeren per afbeelding en toepassing. +TP_WAVELET_DAUB_TOOLTIP;Wijzigt Daubechies coëfficiënt:\nD4 = Standaard,\nD14 = Geeft meestal het beste resultaat met een iets langere verwerkingstijd.\n\nBeïnvloed zowel rand detectie als het algemen resultaat van de eerste niveau´s. De kwaliteit is niet strikt gerelateerd aan deze coëfficiënt en kan variëren per afbeelding en toepassing. TP_WAVELET_DONE;Richting: Vertikaal TP_WAVELET_DTHR;Richting: Diagonaal TP_WAVELET_DTWO;Richting: Horizontaal TP_WAVELET_EDCU;Curve TP_WAVELET_EDGCONT;Lokaal contrast -TP_WAVELET_EDGCONT_TOOLTIP;Schuif de punten naar links om het contrast te verminderen. Naar rechts schuiven vegroot het contrast.\nLinksbeneden, Linksboven, Rechtsboven, Rechtsbeneden vertegenwoordigen respectievelijk lokaal contast voor lage waarden, gemiddeld, gemiddeld+stdev, maximum. +TP_WAVELET_EDGCONT_TOOLTIP;Schuif de punten naar links om het contrast te verminderen. Naar rechts schuiven vergroot het contrast.\nLinksonder, Linksboven, Rechtsboven, Rechtsonder vertegenwoordigen respectievelijk lokaal contast voor lage waarden, gemiddeld, gemiddeld+stdev, maximum. TP_WAVELET_EDGE;Randen verscherpen (Luminantie) TP_WAVELET_EDGEAMPLI;Basis versterking TP_WAVELET_EDGEDETECT;Gradiënt gevoeligheid TP_WAVELET_EDGEDETECTTHR;Drempel laag (ruis) TP_WAVELET_EDGEDETECTTHR2;Drempel hoog (detectie) +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Wijzigt de rand detectie. Bijvoorbeeld om randverscherping te voorkomen bij fijne details zoals ruis in de lucht. TP_WAVELET_EDGEDETECT_TOOLTIP;Beweeg de schuifbalk naar rechts om de randgevoeligheid te vergroten. Dit wijzigt lokaal contrast, randscherpte en ruis. TP_WAVELET_EDGESENSI;Randgevoeligheid TP_WAVELET_EDGREINF_TOOLTIP;Versterk of verminder de aktie van het eerste niveau en doe het tegenovergestelde voor het tweede niveau en laat de rest ongewijzigd. TP_WAVELET_EDGTHRESH;Drempel -TP_WAVELET_EDGTHRESH_TOOLTIP;Wijzigt de interactie tussen de eerste niveau's en de andere niveau's. Hoe hoger de drempel hoe meer de actie is gecentreerd op de eerste niveau's. Wees voorzichtig met negatieve waarden. Deze versterken de hogere niveau's en kunnen artefacten veroorzaken. +TP_WAVELET_EDGTHRESH_TOOLTIP;Wijzigt de interactie tussen de eerste niveaus en de andere niveaus. Hoe hoger de drempel hoe meer de actie is gecentreerd op de eerste niveaus. Wees voorzichtig met negatieve waarden. Deze versterken de hogere niveaus en kunnen artefacten veroorzaken. TP_WAVELET_EDRAD;Straal TP_WAVELET_EDRAD_TOOLTIP;Deze straalaanpassing verschilt erg van die in de andere verscherpings tools. De waarde wordt vergeleken met elk niveau op basis van een complexe functie. In dit geval heeft zelfs een nul waarde effect. TP_WAVELET_EDSL;Drempel schuifbalk @@ -1832,25 +1904,28 @@ TP_WAVELET_HIGHLIGHT;Hoge lichten: Luminantie Reeks (0..100) TP_WAVELET_HS1;Alle luminanties TP_WAVELET_HS2;Hoge lichten/Schaduwen TP_WAVELET_HUESKIN;Tint reeks (huid) +TP_WAVELET_HUESKIN_TOOLTIP;De laagste punten vormen het begin van de transitie zone, en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. TP_WAVELET_HUESKY;Tint Reeks (lucht) +TP_WAVELET_HUESKY_TOOLTIP;De laagste punten vormen het begin van de transitie zone, en de bovenste punten het einde. Boven is het effect maximaal.\n\nAls het gebied aanzienlijk moet worden gewijzigd, of als er artefacten ontstaan, dan is de witbalans incorrect. TP_WAVELET_ITER;Balans niveau -TP_WAVELET_ITER_TOOLTIP;Links: verhoog lage niveau's en verlaag hoge niveau's.\nRechts: verlaag lage niveau's en verhoog high hoge niveau's. -TP_WAVELET_LABEL;Wavelet niveau's +TP_WAVELET_ITER_TOOLTIP;Links: verhoog lage niveaus en verlaag hoge niveaus.\nRechts: verlaag lage niveaus en verhoog hoge niveaus. +TP_WAVELET_LABEL;Wavelet niveaus TP_WAVELET_LARGEST;grof TP_WAVELET_LEVCH;Chromaticiteit -TP_WAVELET_LEVDIR_ALL;Alle niveau's in alle richtingen +TP_WAVELET_LEVDIR_ALL;Alle niveaus in alle richtingen TP_WAVELET_LEVDIR_INF;Onder of gelijk aan het niveau -TP_WAVELET_LEVDIR_ONE;Een Niveau +TP_WAVELET_LEVDIR_ONE;Eén Niveau TP_WAVELET_LEVDIR_SUP;Boven het niveau -TP_WAVELET_LEVELS;Wavelet niveau's -TP_WAVELET_LEVELS_TOOLTIP;Kies het aantal detail niveau's. Meer niveau's vereisen meer RAM en de verwerking duurt langer. +TP_WAVELET_LEVELS;Wavelet niveaus +TP_WAVELET_LEVELS_TOOLTIP;Kies het aantal detail niveaus. Meer niveaus vereisen meer RAM en de verwerking duurt langer. TP_WAVELET_LEVF;Contrast -TP_WAVELET_LEVLABEL;Voorbeeld maximum mogelijke niveau's=%1 +TP_WAVELET_LEVLABEL;Voorbeeld maximum mogelijke niveaus=%1 TP_WAVELET_LEVONE;Niveau 2 TP_WAVELET_LEVTHRE;Niveau 4 TP_WAVELET_LEVTWO;Niveau 3 TP_WAVELET_LEVZERO;Niveau 1 TP_WAVELET_LINKEDG;Koppel met Randscherpte Waarde +TP_WAVELET_LIPST;Verbeterde methode TP_WAVELET_LOWLIGHT;Schaduwen: Luminantie Reeks (0..100) TP_WAVELET_MEDGREINF;Eerste Niveau TP_WAVELET_MEDI;Verminder artefacten in blauwe lucht @@ -1863,7 +1938,7 @@ TP_WAVELET_NPHIGH;Hoog TP_WAVELET_NPLOW;Laag TP_WAVELET_NPNONE;Geen TP_WAVELET_NPTYPE;Naburige pixels -TP_WAVELET_NPTYPE_TOOLTIP;Gebruikt de nabijheid van een pixel en acht naburige pixels. Indien weinig verschil, dan wordten rande verscherpt. +TP_WAVELET_NPTYPE_TOOLTIP;Gebruikt de nabijheid van een pixel en acht naburige pixels. Indien weinig verschil, dan worden randen verscherpt. TP_WAVELET_OPACITY;Dekking Blauw-Geel Niveau TP_WAVELET_OPACITYW;Contrast balans d/v-h curve TP_WAVELET_OPACITYWL;Finale lokaal contrast @@ -1883,15 +1958,16 @@ TP_WAVELET_SKIN;Huidtinten Wijzigen/Beschermen TP_WAVELET_SKIN_TOOLTIP;Bij -100 worden alleen huidtinten gewijzigd.\nBij 0 worden alle tinten gelijk behandeld.\nBij +100 worden huidtinten beschermd. Alle andere tinten worden gewijzigd. TP_WAVELET_SKY;Tint-tonen (lucht) Wijzigen/Beschermen TP_WAVELET_SKY_TOOLTIP;Vergroot/verminder chrominantie in de tint reeks\nVermijd artefacten in blauwe lucht als gevolg van micro-contrast, micro-chroma,... +TP_WAVELET_STREN;Sterkte TP_WAVELET_STRENGTH;Sterkte TP_WAVELET_SUP;Boven het niveau + overblijvend TP_WAVELET_SUPE;Extra TP_WAVELET_THR;Drempel Schaduwen TP_WAVELET_THRES;Max niveau -TP_WAVELET_THRESHOLD;Hoge lichten: Aantal te gebruiken niveau's (fijn naar grof - leidend) -TP_WAVELET_THRESHOLD2;Schaduwen: Aantal te gebruiken niveau's (grof naar fijn) -TP_WAVELET_THRESHOLD2_TOOLTIP;Alleen niveau's tussen '9' en '9 minus gekozen waarde' worden behandeld als schaduwen\nDe andere niveau's worden volledig behandeld\nHet maximum niveau voor schaduwen wordt beperkt door het aantal Hoge lichten niveau's (9- hoge lichten niveau) -TP_WAVELET_THRESHOLD_TOOLTIP;Alleen niveau's boven de gekozen waarde worden behandeld als hoge lichten\nDe andere niveau's worden volledig behandeld +TP_WAVELET_THRESHOLD;Hoge lichten: Aantal te gebruiken niveaus (fijn naar grof - leidend) +TP_WAVELET_THRESHOLD2;Schaduwen: Aantal te gebruiken niveaus (grof naar fijn) +TP_WAVELET_THRESHOLD2_TOOLTIP;Alleen niveaus tussen '9' en '9 minus gekozen waarde' worden behandeld als schaduwen\nDe andere niveaus worden volledig behandeld\nHet maximum niveau voor schaduwen wordt beperkt door het aantal Hoge lichten niveaus (9- hoge lichten niveau) +TP_WAVELET_THRESHOLD_TOOLTIP;Alleen niveaus boven de gekozen waarde worden behandeld als hoge lichten\nDe andere niveaus worden volledig behandeld TP_WAVELET_THRH;Drempel Hoge lichten TP_WAVELET_TILES;Tegel grootte (* 128) TP_WAVELET_TILESBIG;Grote Tegels @@ -1961,87 +2037,12 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -!HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_412;Retinex - Gaussian Gradient -!HISTORY_MSG_416;Retinex -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent -!HISTORY_MSG_429;Retinex - Iterations -!HISTORY_MSG_430;Retinex - Transmission Gradient -!HISTORY_MSG_431;Retinex - Strength Gradient -!HISTORY_MSG_432;Retinex - M - Highlights -!HISTORY_MSG_433;Retinex - M - Highlights TW -!HISTORY_MSG_434;Retinex - M - Shadows -!HISTORY_MSG_435;Retinex - M - Shadows TW -!HISTORY_MSG_436;Retinex - M - Radius -!HISTORY_MSG_437;Retinex - M - Method -!HISTORY_MSG_438;Retinex - M - Equalizer !HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale -!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor -!MONITOR_PROFILE_SYSTEM;System default -!PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PREFERENCES_MONINTENT;Default monitor intent -!PREFERENCES_MONPROFILE;Default monitor profile -!PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. -!PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -!PREFERENCES_PROFILE_NONE;None -!TP_CBDL_AFT;After Black-and-White -!TP_CBDL_BEF;Before Black-and-White -!TP_CBDL_METHOD;Process located -!TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_COLORTONING_STR;Strength -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? -!TP_ICM_PROFILEINTENT;Rendering Intent -!TP_NEUTRAL;Reset -!TP_RAWCACORR_CASTR;Strength -!TP_RETINEX_CONTEDIT_MAP;Mask equalizer -!TP_RETINEX_CURVEEDITOR_MAP;L=f(L) -!TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! -!TP_RETINEX_EQUAL;Equalizer -!TP_RETINEX_FREEGAMMA;Free gamma +!TP_BWMIX_AUTOCH;Auto !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. -!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -!TP_RETINEX_GRAD;Transmission gradient -!TP_RETINEX_GRADS;Strength gradient -!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -!TP_RETINEX_ITER;Iterations (Tone-mapping) -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -!TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_MAP;Mask method -!TP_RETINEX_MAP_GAUS;Gaussian mask -!TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -!TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -!TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -!TP_RETINEX_MAP_NONE;None -!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2 -!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. -!TP_RETINEX_SCALES;Gaussian gradient -!TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. !TP_RETINEX_SKAL;Scale -!TP_RETINEX_TRANF;Transmission -!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. -!TP_RETINEX_VIEW;Process -!TP_RETINEX_VIEW_MASK;Mask -!TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. -!TP_RETINEX_VIEW_NONE;Standard -!TP_RETINEX_VIEW_TRAN;Transmission - Auto -!TP_RETINEX_VIEW_TRAN2;Transmission - Fixed -!TP_RETINEX_VIEW_UNSHARP;Unsharp mask !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted -!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). -!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky. -!TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_STREN;Strength From 1255d9e942fbcacf9736dc7dc2df7e7ba270f1a4 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 28 Jul 2016 04:48:53 +0200 Subject: [PATCH 161/232] Fixes #3389 - CbDL memleak. --- rtengine/improcfun.cc | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index c30e626b9..b18cc226e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2967,17 +2967,17 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editID != EUID_None) { switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { - case (BT_IMAGEFLOAT): - editImgFloat = pipetteBuffer->getImgFloatBuffer(); - break; + case (BT_IMAGEFLOAT): + editImgFloat = pipetteBuffer->getImgFloatBuffer(); + break; - case (BT_LABIMAGE): - editLab = pipetteBuffer->getLabBuffer(); - break; + case (BT_LABIMAGE): + editLab = pipetteBuffer->getLabBuffer(); + break; - case (BT_SINGLEPLANE_FLOAT): - editWhatever = pipetteBuffer->getSinglePlaneBuffer(); - break; + case (BT_SINGLEPLANE_FLOAT): + editWhatever = pipetteBuffer->getSinglePlaneBuffer(); + break; } } @@ -4828,9 +4828,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } - if(tmpImage) { - delete tmpImage; - } + } + + if (tmpImage) { + delete tmpImage; } if (hCurveEnabled) { @@ -5492,17 +5493,17 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu editPipette = true; switch (pipetteBuffer->getDataProvider()->getCurrSubscriber()->getPipetteBufferType()) { - case (BT_IMAGEFLOAT): - editImgFloat = pipetteBuffer->getImgFloatBuffer(); - break; + case (BT_IMAGEFLOAT): + editImgFloat = pipetteBuffer->getImgFloatBuffer(); + break; - case (BT_LABIMAGE): - editLab = pipetteBuffer->getLabBuffer(); - break; + case (BT_LABIMAGE): + editLab = pipetteBuffer->getLabBuffer(); + break; - case (BT_SINGLEPLANE_FLOAT): - editWhatever = pipetteBuffer->getSinglePlaneBuffer(); - break; + case (BT_SINGLEPLANE_FLOAT): + editWhatever = pipetteBuffer->getSinglePlaneBuffer(); + break; } } } From b15955c549cdb9966c5ef35b2d9a649216f47629 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Mon, 1 Aug 2016 13:43:11 +0200 Subject: [PATCH 162/232] Create ISSUE_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..f6e23db7b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,3 @@ +If you are filing a bug report, please first read [How to write useful bug reports](http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports)
      +You must provide the required information in order for your bug report to be valid.
      +Delete this text before posting. From 77bdfa772e1c8741cb9c210dc90064af94c111f4 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Mon, 1 Aug 2016 13:47:37 +0200 Subject: [PATCH 163/232] Removed markdown style from ISSUE_TEMPLATE.md Turns out markdown style makes no sense here. --- .github/ISSUE_TEMPLATE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index f6e23db7b..328af2509 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,4 @@ -If you are filing a bug report, please first read [How to write useful bug reports](http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports)
      -You must provide the required information in order for your bug report to be valid.
      +If you are filing a bug report, please first read the guide How to Write Useful Bug Reports: +http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports +You must provide the required information in order for your bug report to be valid. Delete this text before posting. From 1339cbe67af7b5b3376e1e95f7663a5dfcab658d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 2 Aug 2016 01:15:36 +0200 Subject: [PATCH 164/232] Fixes "CIECAM02 causes blue to become black" Signed-off-by: Morgan Hardwood --- rtengine/improcfun.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b18cc226e..5730befbb 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2238,7 +2238,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int sk = 1; float ko = 1.f / coef; Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red, sk, rstprotection, ko, Cpro); - +/* if(Jpro < 1.f && Cpro > 12.f) { Cpro = 12.f; //reduce artifacts by "pseudo gamut control CIECAM" } else if(Jpro < 2.f && Cpro > 15.f) { @@ -2248,7 +2248,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(Jpro < 7.f && Cpro > 50.f) { Cpro = 50.f; } - +*/ } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { // float parsat = 0.8f; //0.6 float coef = 327.68f / parsat; @@ -2280,7 +2280,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int sk = 0; float ko = 1.f / coef; Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); - +/* if(Jpro < 1.f && Mpro > 12.f * coe) { Mpro = 12.f * coe; //reduce artifacts by "pseudo gamut control CIECAM" } else if(Jpro < 2.f && Mpro > 15.f * coe) { @@ -2290,7 +2290,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } else if(Jpro < 7.f && Mpro > 50.f * coe) { Mpro = 50.f * coe; } - +*/ Cpro = Mpro / coe; } } From 14b5bf13863918f558bc07a9d9e8c7c729a76ee7 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sat, 6 Aug 2016 21:24:36 +0200 Subject: [PATCH 165/232] Prevents thumbnail race condition, from Floessie in #3304 and fixes #3384 --- rtgui/thumbnail.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 5e2c7f28f..b9d23e46d 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -499,6 +499,8 @@ void Thumbnail::decreaseRef () void Thumbnail::getThumbnailSize (int &w, int &h, const rtengine::procparams::ProcParams *pparams) { + MyMutex::MyLock lock(mutex); + int tw_ = tw; int th_ = th; float imgRatio_ = imgRatio; From b71059533585cbcc8ddf9b5732803e7a8a401449 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 10 Aug 2016 22:59:48 +0200 Subject: [PATCH 166/232] Adust buffers to fix potential buffer overruns --- rtexif/canonattribs.cc | 10 +++++----- rtexif/pentaxattribs.cc | 8 ++++---- rtexif/sonyminoltaattribs.cc | 14 +++++++------- rtexif/stdattribs.cc | 4 ++-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index a4f4ab8b8..e013b2534 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -1050,7 +1050,7 @@ public: return "undef"; } - char buffer[1024]; + char buffer[32]; sprintf (buffer, "%.2fmm", val * 25.4 / 1000); return buffer; } @@ -1062,7 +1062,7 @@ class CAExposureTimeInterpreter : public Interpreter public: virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; double d = pow (2, - t->toInt() / 32.0); sprintf (buffer, "%.3f", d); return buffer; @@ -1074,7 +1074,7 @@ class CAEVInterpreter : public Interpreter { virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; sprintf (buffer, "%.1f", t->toDouble() / 32.0 ); return buffer; } @@ -1281,7 +1281,7 @@ class CAFocusDistanceInterpreter : public Interpreter public: virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; sprintf (buffer, "%.2f", t->toDouble() / 100 ); return buffer; } @@ -1293,7 +1293,7 @@ class CAMeasuredEVInterpreter : public Interpreter public: virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; sprintf (buffer, "%.1f", t->toDouble() / 8 - 6 ); return buffer; } diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 91a508244..f88e650ec 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -1320,7 +1320,7 @@ public: a = t->toInt(0, SBYTE) / 6; // int8u[2] } - char buffer[10]; + char buffer[32]; sprintf (buffer, "%d", a ); return buffer; } @@ -1348,7 +1348,7 @@ public: double a = double(t->toInt(0, LONG)); if(a > 1.) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%.2f", a / 100. ); return buffer; } else { @@ -1378,7 +1378,7 @@ public: float b = float(10 * int(a >> 2)) * pow(4.f, float(int(a & 0x03) - 2)); if(b > 1.f) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%.2f", b ); return buffer; } else { @@ -1680,7 +1680,7 @@ public: PAExternalFlashGNInterpreter() {} virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; int b = t->toInt(0, BYTE) & 0x1F; sprintf (buffer, "%.0f", pow(2., b / 16. + 4) ); return buffer; diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index a0d280df1..7f4e1bb53 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -1955,7 +1955,7 @@ public: double a = t->toDouble(); if(a > 0) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%.4f", a); return buffer; } else { @@ -2015,7 +2015,7 @@ public: double a = double(t->toDouble()); if(a) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%.1f", a / 100. ); return buffer; } else { @@ -2075,7 +2075,7 @@ public: int a = t->toInt(); if(a) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%d", a ); return buffer; } else { @@ -2114,7 +2114,7 @@ public: virtual std::string toString (Tag* t) { double a = t->toDouble(); - char buffer[10]; + char buffer[32]; sprintf (buffer, "%.2f", a ); return buffer; } @@ -2134,7 +2134,7 @@ public: SAAFMicroAdjValueInterpreter() {} virtual std::string toString (Tag* t) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%d", t->getValue()[0] - 20); return buffer; } @@ -2173,7 +2173,7 @@ public: SAAFMicroAdjRegisteredLensesInterpreter() {} virtual std::string toString (Tag* t) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%d", t->getValue()[0] & 0x7f); return buffer; } @@ -2229,7 +2229,7 @@ public: SAColorTemperatureSettingInterpreter () {} virtual std::string toString (Tag* t) { - char buffer[10]; + char buffer[32]; sprintf (buffer, "%d", t->toInt()); return buffer; } diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index 0d7c38ff9..98594e64c 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -386,7 +386,7 @@ public: ShutterSpeedInterpreter () {} virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; double d = pow (2.0, -t->toDouble()); if (d > 0.0 && d < 0.9) { @@ -406,7 +406,7 @@ public: ExposureTimeInterpreter () {} virtual std::string toString (Tag* t) { - char buffer[1024]; + char buffer[32]; double d = t->toDouble(); if (d > 0.0 && d < 0.9) { From cd16b91be02d010322c74be5affa9d031c8a4545 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 17 Aug 2016 16:15:35 +0200 Subject: [PATCH 167/232] fixes #3395, unrelated bulk changes cause saturation setting to double its value --- rtgui/batchtoolpanelcoord.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 9a4e15b89..0b3d65961 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -247,6 +247,10 @@ void BatchToolPanelCoordinator::initSession () pparams.toneCurve.contrast = 0; } + if (options.baBehav[ADDSET_TC_SATURATION]) { + pparams.toneCurve.saturation = 0; + } + if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; } From 3e510cd94e70da320da18e04e8b318d4f837f5aa Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 18 Aug 2016 21:41:16 +0200 Subject: [PATCH 168/232] Fix some ciecam02 issues, fixes ##3380, fixes #3396, fixes #3397 --- rtengine/improccoordinator.cc | 11 +- rtengine/improcfun.cc | 237 +++++++++++++++++----------------- rtengine/rtthumbnail.cc | 40 +++--- rtengine/simpleprocess.cc | 2 +- 4 files changed, 153 insertions(+), 137 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index f585acacf..a0dd47960 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -35,7 +35,7 @@ ImProcCoordinator::ImProcCoordinator () : orig_prev(NULL), oprevi(NULL), oprevl(NULL), nprevl(NULL), previmg(NULL), workimg(NULL), ncie(NULL), imgsrc(NULL), shmap(NULL), lastAwbEqual(0.), ipf(¶ms, true), monitorIntent(RI_RELATIVE), scale(10), highDetailPreprocessComputed(false), highDetailRawComputed(false), allocated(false), - bwAutoR(-9000.f), bwAutoG(-9000.f), bwAutoB(-9000.f), CAMMean(0.), + bwAutoR(-9000.f), bwAutoG(-9000.f), bwAutoB(-9000.f), CAMMean(NAN), hltonecurve(65536), shtonecurve(65536), @@ -743,6 +743,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } // Issue 2785, only float version of ciecam02 for navigator and pan background + CAMMean = NAN; + CAMBrightCurveJ.dirty = true; + CAMBrightCurveQ.dirty = true; + ipf.ciecam_02float (ncie, float(adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, execsharp, d, scale, 1); if(params.colorappearance.autodegree && acListener && params.colorappearance.enabled) { @@ -783,11 +787,6 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) crops[i]->update (todo); // may call ourselves } - // Flagging some LUT as dirty now, whether they have been freed up or not - CAMBrightCurveJ.dirty = true; - CAMBrightCurveQ.dirty = true; - - progress ("Conversion to RGB...", 100 * readyphase / numofphases); if ((todo != CROP && todo != MINUPDATE) || (todo & M_MONITOR)) { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 5730befbb..67103d521 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1667,86 +1667,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int const ColorAppearanceParams::eCTCModeId curveMode3 = params->colorappearance.curveMode3; const bool hasColCurve3 = bool(customColCurve3); - if(settings->viewinggreySc == 0) { //auto - if (mean < 15.f) { - yb = 3.0f; - } else if(mean < 30.f) { - yb = 5.0f; - } else if(mean < 40.f) { - yb = 10.0f; - } else if(mean < 45.f) { - yb = 15.0f; - } else if(mean < 50.f) { - yb = 18.0f; - } else if(mean < 55.f) { - yb = 23.0f; - } else if(mean < 60.f) { - yb = 30.0f; - } else if(mean < 70.f) { - yb = 40.0f; - } else if(mean < 80.f) { - yb = 60.0f; - } else if(mean < 90.f) { - yb = 80.0f; - } else { - yb = 90.0f; - } - } else if(settings->viewinggreySc == 1) { - yb = 18.0f; //fixed - } + bool needJ = (alg == 0 || alg == 1 || alg == 3); + bool needQ = (alg == 2 || alg == 3); + LUTu hist16J; + LUTu hist16Q; - - const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated - - const int gamu = (params->colorappearance.gamut == true) ? 1 : 0; - xw = 100.0f * Xw; - yw = 100.0f * Yw; - zw = 100.0f * Zw; - float xw1, yw1, zw1, xw2, yw2, zw2; - - // settings of WB: scene and viewing - if(params->colorappearance.wbmodel == "RawT") { - xw1 = 96.46f; //use RT WB; CAT 02 is used for output device (see prefreneces) - yw1 = 100.0f; - zw1 = 82.445f; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } else if(params->colorappearance.wbmodel == "RawTCAT02") { - xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences - yw1 = yw; - zw1 = zw; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } - - float cz, wh, pfl; - Ciecam02::initcam1float(gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); - const float pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f ); - float nj, dj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2float(gamu, yb2, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); - const float reccmcz = 1.f / (c2 * czj); - const float pow1n = pow_F( 1.64f - pow_F( 0.29f, nj ), 0.73f ); - - const float epsil = 0.0001f; - const float w_h = wh + epsil; - const float coefQ = 32767.f / wh; - const float a_w = aw; - const float c_ = c; - const float f_l = fl; - const float coe = pow_F(fl, 0.25f); - const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; - const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) - || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); - - - if(CAMBrightCurveJ.dirty || CAMBrightCurveQ.dirty) { - bool needJ = (alg == 0 || alg == 1 || alg == 3); - bool needQ = (alg == 2 || alg == 3); - LUTu hist16J; - LUTu hist16Q; + if((needJ && CAMBrightCurveJ.dirty) || (needQ && CAMBrightCurveQ.dirty) || (std::isnan(mean) && settings->viewinggreySc != 0)) { if (needJ) { hist16J (32768); @@ -1841,31 +1767,112 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int } } + + if(std::isnan(mean)) { + mean = (sum / ((height) * width)) / 327.68f; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone + } } - //mean=(sum/((endh-begh)*width))/327.68f;//for Yb for all image...if one day "pipette" we can adapt Yb for each zone - mean = (sum / ((height) * width)) / 327.68f; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone //evaluate lightness, contrast - if (needJ) { - if (!CAMBrightCurveJ) { - CAMBrightCurveJ(32768, LUT_CLIP_ABOVE); - CAMBrightCurveJ.dirty = false; - } + } - Ciecam02::curveJfloat (params->colorappearance.jlight, params->colorappearance.contrast, hist16J, CAMBrightCurveJ);//lightness and contrast J - CAMBrightCurveJ /= 327.68f; + if(settings->viewinggreySc == 0) { //auto + if (mean < 15.f) { + yb = 3.0f; + } else if(mean < 30.f) { + yb = 5.0f; + } else if(mean < 40.f) { + yb = 10.0f; + } else if(mean < 45.f) { + yb = 15.0f; + } else if(mean < 50.f) { + yb = 18.0f; + } else if(mean < 55.f) { + yb = 23.0f; + } else if(mean < 60.f) { + yb = 30.0f; + } else if(mean < 70.f) { + yb = 40.0f; + } else if(mean < 80.f) { + yb = 60.0f; + } else if(mean < 90.f) { + yb = 80.0f; + } else { + yb = 90.0f; + } + } else if(settings->viewinggreySc == 1) { + yb = 18.0f; //fixed + } + + const bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated + + const int gamu = (params->colorappearance.gamut == true) ? 1 : 0; + xw = 100.0f * Xw; + yw = 100.0f * Yw; + zw = 100.0f * Zw; + float xw1, yw1, zw1, xw2, yw2, zw2; + + // settings of WB: scene and viewing + if(params->colorappearance.wbmodel == "RawT") { + xw1 = 96.46f; //use RT WB; CAT 02 is used for output device (see prefreneces) + yw1 = 100.0f; + zw1 = 82.445f; + xw2 = xwd; + yw2 = ywd; + zw2 = zwd; + } else if(params->colorappearance.wbmodel == "RawTCAT02") { + xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences + yw1 = yw; + zw1 = zw; + xw2 = xwd; + yw2 = ywd; + zw2 = zwd; + } + + float cz, wh, pfl; + Ciecam02::initcam1float(gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); + const float pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f ); + float nj, dj, nbbj, ncbj, czj, awj, flj; + Ciecam02::initcam2float(gamu, yb2, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); + const float reccmcz = 1.f / (c2 * czj); + const float pow1n = pow_F( 1.64f - pow_F( 0.29f, nj ), 0.73f ); + + const float epsil = 0.0001f; + const float w_h = wh + epsil; + const float coefQ = 32767.f / wh; + const float a_w = aw; + const float c_ = c; + const float f_l = fl; + const float coe = pow_F(fl, 0.25f); + const float QproFactor = ( 0.4f / c ) * ( aw + 4.0f ) ; + const bool LabPassOne = !((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) + || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) + || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); + + + if (needJ) { + if (!CAMBrightCurveJ) { + CAMBrightCurveJ(32768, LUT_CLIP_ABOVE); } - if (needQ) { - if (!CAMBrightCurveQ) { - CAMBrightCurveQ(32768, LUT_CLIP_ABOVE); - CAMBrightCurveQ.dirty = false; - } + if(CAMBrightCurveJ.dirty) { + Ciecam02::curveJfloat (params->colorappearance.jlight, params->colorappearance.contrast, hist16J, CAMBrightCurveJ);//lightness and contrast J + CAMBrightCurveJ /= 327.68f; + CAMBrightCurveJ.dirty = false; + } + } + if (needQ) { + if (!CAMBrightCurveQ) { + CAMBrightCurveQ(32768, LUT_CLIP_ABOVE); + } + + if(CAMBrightCurveQ.dirty) { Ciecam02::curveJfloat (params->colorappearance.qbright, params->colorappearance.qcontrast, hist16Q, CAMBrightCurveQ);//brightness and contrast Q CAMBrightCurveQ /= coefQ; + CAMBrightCurveQ.dirty = false; } } @@ -2238,17 +2245,17 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int sk = 1; float ko = 1.f / coef; Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red, sk, rstprotection, ko, Cpro); -/* - if(Jpro < 1.f && Cpro > 12.f) { - Cpro = 12.f; //reduce artifacts by "pseudo gamut control CIECAM" - } else if(Jpro < 2.f && Cpro > 15.f) { - Cpro = 15.f; - } else if(Jpro < 4.f && Cpro > 30.f) { - Cpro = 30.f; - } else if(Jpro < 7.f && Cpro > 50.f) { - Cpro = 50.f; - } -*/ + /* + if(Jpro < 1.f && Cpro > 12.f) { + Cpro = 12.f; //reduce artifacts by "pseudo gamut control CIECAM" + } else if(Jpro < 2.f && Cpro > 15.f) { + Cpro = 15.f; + } else if(Jpro < 4.f && Cpro > 30.f) { + Cpro = 30.f; + } else if(Jpro < 7.f && Cpro > 50.f) { + Cpro = 50.f; + } + */ } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { // float parsat = 0.8f; //0.6 float coef = 327.68f / parsat; @@ -2280,17 +2287,17 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int int sk = 0; float ko = 1.f / coef; Color::skinredfloat(Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); -/* - if(Jpro < 1.f && Mpro > 12.f * coe) { - Mpro = 12.f * coe; //reduce artifacts by "pseudo gamut control CIECAM" - } else if(Jpro < 2.f && Mpro > 15.f * coe) { - Mpro = 15.f * coe; - } else if(Jpro < 4.f && Mpro > 30.f * coe) { - Mpro = 30.f * coe; - } else if(Jpro < 7.f && Mpro > 50.f * coe) { - Mpro = 50.f * coe; - } -*/ + /* + if(Jpro < 1.f && Mpro > 12.f * coe) { + Mpro = 12.f * coe; //reduce artifacts by "pseudo gamut control CIECAM" + } else if(Jpro < 2.f && Mpro > 15.f * coe) { + Mpro = 15.f * coe; + } else if(Jpro < 4.f && Mpro > 30.f * coe) { + Mpro = 30.f * coe; + } else if(Jpro < 7.f && Mpro > 50.f * coe) { + Mpro = 50.f * coe; + } + */ Cpro = Mpro / coe; } } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index e8c1cd096..7c6aa5b5b 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -421,23 +421,23 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati c = ri->XTRANSFC(row, col); switch (c) { - case 0: - tmpImg->r(y, x) = image[ofs][0]; - tmpImg->g(y, x) = sum[1] / 5.f; - tmpImg->b(y, x) = sum[2] / 3.f; - break; + case 0: + tmpImg->r(y, x) = image[ofs][0]; + tmpImg->g(y, x) = sum[1] / 5.f; + tmpImg->b(y, x) = sum[2] / 3.f; + break; - case 1: - tmpImg->r(y, x) = sum[0] / 2.f; - tmpImg->g(y, x) = image[ofs][1]; - tmpImg->b(y, x) = sum[2] / 2.f; - break; + case 1: + tmpImg->r(y, x) = sum[0] / 2.f; + tmpImg->g(y, x) = image[ofs][1]; + tmpImg->b(y, x) = sum[2] / 2.f; + break; - case 2: - tmpImg->r(y, x) = sum[0] / 3.f; - tmpImg->g(y, x) = sum[1] / 5.f; - tmpImg->b(y, x) = image[ofs][2]; - break; + case 2: + tmpImg->r(y, x) = sum[0] / 3.f; + tmpImg->g(y, x) = sum[1] / 5.f; + tmpImg->b(y, x) = image[ofs][2]; + break; } } } @@ -799,6 +799,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei double focalLen, double focalLen35mm, float focusDist, float shutter, float fnumber, float iso, std::string expcomp_, double& myscale) { BENCHFUN + // check if the WB's equalizer value has changed if (wbEqual < (params.wb.equal - 5e-4) || wbEqual > (params.wb.equal + 5e-4)) { wbEqual = params.wb.equal; @@ -878,6 +879,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei #ifdef _OPENMP #pragma omp simd #endif + for (int j = 0; j < rwidth; j++) { float red = baseImg->r(i, j) * rmi; baseImg->r(i, j) = CLIP(red); @@ -947,6 +949,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei int black = params.toneCurve.black; int hlcompr = params.toneCurve.hlcompr; int hlcomprthresh = params.toneCurve.hlcomprthresh; + if (params.toneCurve.autoexp && aeHistogram) { ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } @@ -986,6 +989,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 16); bool opautili = false; + if(params.colorToning.enabled) { TMatrix wprof = iccStore->workingSpaceMatrix (params.icm.working); double wp[3][3] = { @@ -1042,6 +1046,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei LabImage* labView = new LabImage (fw, fh); DCPProfile *dcpProf = nullptr; DCPProfile::ApplyState as; + if (isRaw) { cmsHPROFILE dummy; RawImageSource::findInputProfile(params.icm.input, nullptr, camName, &dcpProf, dummy); @@ -1050,6 +1055,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei dcpProf->setStep2ApplyState(params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset, as); } } + ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, 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); // freeing up some memory @@ -1067,6 +1073,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei // luminance histogram update if(params.labCurve.contrast != 0) { hist16.clear(); + for (int i = 0; i < fh; i++) for (int j = 0; j < fw; j++) { hist16[(int)((labView->L[i][j]))]++; @@ -1142,6 +1149,9 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei sk = 16; int rtt = 0; CieImage* cieView = new CieImage (fw, fh); + CAMMean = NAN; + CAMBrightCurveJ.dirty = true; + CAMBrightCurveQ.dirty = true; ipf.ciecam_02float (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 6, execsharp, d, sk, rtt); delete cieView; } diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 25bf45742..63a207beb 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1050,7 +1050,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p LUTf CAMBrightCurveJ; LUTf CAMBrightCurveQ; - float CAMMean; + float CAMMean = NAN; if (params.sharpening.enabled) { float d; From 3df0acee567abad80399a9eb075fbf76ef6b3f1f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 21 Aug 2016 15:13:17 +0200 Subject: [PATCH 169/232] Fixed wrong transition curve in ciecam02, fixes #3398 --- rtengine/color.cc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index c822a6f33..c6f69d968 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -199,12 +199,12 @@ void Color::init () #ifdef _OPENMP #pragma omp section #endif -{ - for (int i = 0; i < maxindex; i++) { - igammatab_srgb[i] = igammatab_srgb1[i] = igamma2 (i / 65535.0); + { + for (int i = 0; i < maxindex; i++) { + igammatab_srgb[i] = igammatab_srgb1[i] = igamma2 (i / 65535.0); + } + igammatab_srgb *= 65535.f; } - igammatab_srgb *= 65535.f; -} #ifdef _OPENMP #pragma omp section #endif @@ -1724,7 +1724,7 @@ void Color::skinred ( double J, double h, double sres, double Sp, float dred, fl if (J < 16.0) { dred = 40.0f; } else if(J < 22.0) { - dred = (4.1666f) * (float)J - 26.6f; + dred = 2.5f * (float)J; } else if(J < 60.0) { dred = 55.0f; } else if(J < 70.0) { @@ -1783,16 +1783,16 @@ void Color::skinredfloat ( float J, float h, float sres, float Sp, float dred, f float chromapro = sres / Sp; if(sk == 1) { //in C mode to adapt dred to J - if (J < 16.0) { - dred = 40.0f; - } else if(J < 22.0) { - dred = (4.1666f) * (float)J - 26.6f; - } else if(J < 60.0) { - dred = 55.0f; - } else if(J < 70.0) { - dred = -1.5f * (float)J + 145.0f; + if (J < 16.f) { + dred = 40.f; + } else if(J < 22.f) { + dred = 2.5f * J; + } else if(J < 60.f) { + dred = 55.f; + } else if(J < 70.f) { + dred = 145.f - 1.5f * J; } else { - dred = 40.0f; + dred = 40.f; } } From 9b62f92095d1b4bb574f939625296d1c350a34ff Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 23 Aug 2016 19:35:15 +0200 Subject: [PATCH 170/232] About 7x speedup for Automatic Saturation Protection in Colourtoning --- rtengine/color.h | 13 +++++++++++ rtengine/improcfun.cc | 54 +++++++++++-------------------------------- 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index bf42140c5..1ae721e5a 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -231,6 +231,19 @@ public: */ static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v); + static inline float rgb2s(float r, float g, float b) // fast version if only saturation is needed + { + float var_Min = min(r, g, b); + float var_Max = max(r, g, b); + float del_Max = var_Max - var_Min; + + if (del_Max < 0.00001f) { + return 0.f; + } else { + return del_Max / var_Max; + } + } + static inline bool rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v) { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 67103d521..f70341334 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -2861,54 +2861,28 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) { -// MyTime t1e,t2e; -// t1e.set(); + BENCHFUN int tHh = working->height; int tWw = working->width; - float moy = 0.f; - float eqt = 0.f; - #pragma omp parallel - { - float mo = 0.f; + double moy = 0.0; + double sqrs = 0.0; #ifndef _DEBUG - #pragma omp for reduction(+:moy) + #pragma omp parallel for reduction(+:moy,sqrs) schedule(dynamic,16) #endif - for (int i = 0; i < tHh; i++) { - for (int j = 0; j < tWw; j++) { - float r = CLIP(working->r(i, j)); - float g = CLIP(working->g(i, j)); - float b = CLIP(working->b(i, j)); - float h, s, v; - Color::rgb2hsv(r, g, b, h, s, v); - moy += s; - } - } - - mo = moy / (tHh * tWw); - moyS = mo; -#ifndef _DEBUG - #pragma omp for reduction(+:eqt) -#endif - - for (int i = 0; i < tHh; i++) { - for (int j = 0; j < tWw; j++) { - float r = CLIP(working->r(i, j)); - float g = CLIP(working->g(i, j)); - float b = CLIP(working->b(i, j)); - float h, s, v; - Color::rgb2hsv(r, g, b, h, s, v); - eqt += SQR(s - mo); - } + for (int i = 0; i < tHh; i++) { + for (int j = 0; j < tWw; j++) { + float s = Color::rgb2s(CLIP(working->r(i, j)), CLIP(working->g(i, j)), CLIP(working->b(i, j))); + moy += s; + sqrs += SQR(s); } } - eqt = eqt / (tHh * tWw); - eqty = (sqrt(eqt)); - - // t2e.set(); - // printf("Moyeqt:%d\n", t2e.etime(t1e)); + double mo = moy / (tHh * tWw); + moyS = mo; + double eqt = (sqrs - 2.0 * mo * moy + tHh * tWw * SQR(mo)) / (tHh * tWw); + eqty = sqrt(eqt); } static inline void From 7a4cf9aba827be535b3860b64dad658f8baccf6d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 23 Aug 2016 19:59:49 +0200 Subject: [PATCH 171/232] Colourtoning: Always calculate saturation for 'Automatic Saturation Protection' from full image --- rtengine/dcrop.cc | 23 +---------------------- rtengine/improccoordinator.cc | 14 +++++++------- rtengine/improccoordinator.h | 2 ++ 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 577a3f4a6..93aca0f6d 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -749,27 +749,6 @@ void Crop::update (int todo) baseCrop->b[(int)(xref/skip)][(int)(yref/skip)]/256, parent->imgsrc->getGamma()); }*/ - float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; - float satLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f); - - if(params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings - float moyS = 0.f; - float eqty = 0.f; - parent->ipf.moyeqt (baseCrop, moyS, eqty);//return image : mean saturation and standard dev of saturation - //printf("moy=%f ET=%f\n", moyS,eqty); - 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) { - satp = 0.92f; //avoid values too high (out of gamut) - } - - if(satp <= 0.15f) { - satp = 0.15f; //avoid too low values - } - - satLimit = 100.f * satp; - satLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation - } if (todo & M_RGBCURVE) { double rrm, ggm, bbm; @@ -777,7 +756,7 @@ void Crop::update (int todo) DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, parent->currWB, as); parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, - params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, satLimit , satLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, + params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit , parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm, parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a0dd47960..a6354bd56 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -473,8 +473,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, scale == 1 ? 1 : 1); } - float satLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; - float satLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f); + colourToningSatLimit = float(params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; + colourToningSatLimitOpacity = 1.f - (float(params.colorToning.saturatedOpacity) / 100.f); int satTH = 80; int satPR = 30; @@ -497,10 +497,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) //satTH=(int) 100.f*satp; //satPR=(int) 100.f*(moyS-0.85f*eqty);//-0.85 sigma==>20% pixels with low saturation - satLimit = 100.f * satp; + colourToningSatLimit = 100.f * satp; satTH = (int) 100.f * satp; - satLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation + colourToningSatLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation satPR = (int) 100.f * (moyS - 0.85f * eqty); } @@ -539,7 +539,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) DCPProfile *dcpProf = imgsrc->getDCP(params.icm, currWB, as); ipf.rgbProc (oprevi, oprevl, NULL, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation, - rCurve, gCurve, bCurve, satLimit , satLimitOpacity, 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); + 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); if(params.blackwhite.enabled && params.blackwhite.autoc && abwListener) { if (settings->verbose) { @@ -551,10 +551,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if(params.colorToning.autosat && actListener) { if (settings->verbose) { - printf("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)satLimit , (int) satLimitOpacity); + printf("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)colourToningSatLimit , (int) colourToningSatLimitOpacity); } - actListener->autoColorTonChanged(indi, (int) satLimit, (int)satLimitOpacity);//change sliders autosat + actListener->autoColorTonChanged(indi, (int) colourToningSatLimit, (int)colourToningSatLimitOpacity);//change sliders autosat } // correct GUI black and white with value diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 4f1a6a691..5cc03cb72 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -197,6 +197,8 @@ protected: bool wavcontlutili; void startProcessing (); void process (); + float colourToningSatLimit; + float colourToningSatLimitOpacity; public: From 281e3979d5a68ba0420dce49aa9572b52d892abd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 23 Aug 2016 21:32:30 +0200 Subject: [PATCH 172/232] ImProcFunctions::moyeqt, simplified calculation --- rtengine/improcfun.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index f70341334..34e2eeb34 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2867,7 +2867,8 @@ void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) int tWw = working->width; double moy = 0.0; double sqrs = 0.0; -#ifndef _DEBUG + +#ifdef _OPENMP #pragma omp parallel for reduction(+:moy,sqrs) schedule(dynamic,16) #endif @@ -2879,10 +2880,10 @@ void ImProcFunctions::moyeqt (Imagefloat* working, float &moyS, float &eqty) } } - double mo = moy / (tHh * tWw); - moyS = mo; - double eqt = (sqrs - 2.0 * mo * moy + tHh * tWw * SQR(mo)) / (tHh * tWw); - eqty = sqrt(eqt); + moy /= (tHh * tWw); + sqrs /= (tHh * tWw); + eqty = sqrt(sqrs - SQR(moy)); + moyS = moy; } static inline void From 65b0ad4eb78c27641d846546d3770cff127c4b41 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 24 Aug 2016 10:13:56 +0200 Subject: [PATCH 173/232] Serbian translation updated by gpopac, closes #3402 --- rtdata/languages/Serbian (Cyrilic Characters) | 1217 ++++++++-------- rtdata/languages/Serbian (Latin Characters) | 1219 +++++++++-------- 2 files changed, 1353 insertions(+), 1083 deletions(-) diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index dce9bfd10..73e43b15d 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -3,14 +3,18 @@ ABOUT_TAB_BUILD;Издање ABOUT_TAB_CREDITS;Заслуге ABOUT_TAB_LICENSE;Лиценца +ABOUT_TAB_RELEASENOTES;Белешке о издању ABOUT_TAB_SPLASH;Увод ADJUSTER_RESET_TO_DEFAULT;Врати на подразумевано BATCHQUEUE_AUTOSTART;Сам започни +BATCHQUEUE_DESTFILENAME;Путања и име датотеке BATCH_PROCESSING;обрада CURVEEDITOR_CURVE;Кривуља CURVEEDITOR_CURVES;Кривуље CURVEEDITOR_CUSTOM;Произвољно CURVEEDITOR_DARKS;Тамно +CURVEEDITOR_FILEDLGFILTERANY;Све датотеке +CURVEEDITOR_FILEDLGFILTERCURVE;Датотеке са кривама CURVEEDITOR_HIGHLIGHTS;Пресветло CURVEEDITOR_LIGHTS;Светло CURVEEDITOR_LINEAR;Линеарно @@ -26,10 +30,10 @@ CURVEEDITOR_TOOLTIPLOAD;Учитава кривуљу из датотеке CURVEEDITOR_TOOLTIPPASTE;Убацује кривуљу из оставе CURVEEDITOR_TOOLTIPSAVE;Чува тренутну кривуљу CURVEEDITOR_TYPE;Врста: -DIRBROWSER_FOLDERS;Фасцикле EDITWINDOW_TITLE;Уређивање слике EXIFFILTER_APERTURE;Отвор бленде EXIFFILTER_CAMERA;Фото апарат +EXIFFILTER_EXPOSURECOMPENSATION;Компензација експозиције (ЕВ) EXIFFILTER_FILETYPE;Врста датотеке EXIFFILTER_FOCALLEN;Жижна даљина EXIFFILTER_ISO;ИСО @@ -50,6 +54,35 @@ EXIFPANEL_RESETALL;Врати све EXIFPANEL_RESETALLHINT;Враћа све ознаке на почетне вредности EXIFPANEL_RESETHINT;Враћа изабрану ознаку на почетну вредности EXIFPANEL_SUBDIRECTORY;Поддиректоријум +EXPORT_BYPASS_ALL;Изабери / поништи све +EXPORT_BYPASS_COLORDENOISE;Занемари уклањање колорног defriшума +EXPORT_BYPASS_DEFRINGE;Занемари уклањање ореола +EXPORT_BYPASS_DIRPYRDENOISE;Занемари уклањање шума +EXPORT_BYPASS_DIRPYREQUALIZER;Занемари детаљни ниво контраста +EXPORT_BYPASS_LUMADENOISE;Занемари уклањање шума луминасе +EXPORT_BYPASS_RAW_ALL_ENHANCE;Занемари уклањање артафакта/шума након расклапања +EXPORT_BYPASS_RAW_CA;Занемари [raw] исправљање хроматских аберација +EXPORT_BYPASS_RAW_CCSTEPS;Занемари [raw] пригушивање лажне боје +EXPORT_BYPASS_RAW_DCB_ENHANCE;Занемари [raw] ДЦБ побољшање +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Занемари [raw] број ДЦБ пролаза +EXPORT_BYPASS_RAW_DF;Занемари [raw] тамно поље +EXPORT_BYPASS_RAW_FF;Занемари [raw] равно поље +EXPORT_BYPASS_RAW_GREENTHRESH;Занемари [raw] калибрацију зелене боје +EXPORT_BYPASS_RAW_LINENOISE;Занемари [raw] линијски филтер шума +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Занемари [raw] ЛММСЕ кораке за побољшање +EXPORT_BYPASS_SHARPENEDGE;Занемари оштрење ивице +EXPORT_BYPASS_SHARPENING;Занемари оштрење +EXPORT_BYPASS_SHARPENMICRO;Занемари микроконтраст +EXPORT_BYPASS_SH_HQ;Занемари оштру маску за Сенке/Светло +EXPORT_FASTEXPORTOPTIONS;Опције за брз извоз +EXPORT_INSTRUCTIONS;Брз извоз омогућава да заобиђете неке од захтевних и споријих процеса приликом развијања слика и да закажете фотографије за брзо развијање. Овј метод је добар за брзо развијање слика у мањој резолуцији, када вам је битно да фотографије добијете што пре или када желите примените задовољавајуће параметре за развијање већег броја фотографија одједном без измене њихових профила. +EXPORT_MAXHEIGHT;Највећа висина: +EXPORT_MAXWIDTH;Највећа дужина: +EXPORT_PUTTOQUEUEFAST; Закажи за брз извоз +EXPORT_RAW_DMETHOD;Начин расклапања мозаика +EXPORT_RESIZEMETHOD;Начин промене величине +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;заказано-развијено FILEBROWSER_ADDDELTEMPLATE;Додај/уклони шаблоне... FILEBROWSER_APPLYPROFILE;Примени профил FILEBROWSER_APPLYPROFILE_PARTIAL;Примени профил (половично) @@ -61,6 +94,7 @@ FILEBROWSER_CACHE;Остава FILEBROWSER_CACHECLEARFROMFULL;Очисти из оставе — све FILEBROWSER_CACHECLEARFROMPARTIAL;Очисти из оставе — половично FILEBROWSER_CLEARPROFILE;Обриши профил +FILEBROWSER_COLORLABEL_TOOLTIP;Натпис у боји.\n\nКористите приложени мени или пречице:\nShift-Ctrl-0 Без боје\nShift-Ctrl-1 Црвена\nShift-Ctrl-2 Жута\nShift-Ctrl-3 Зелена\nShift-Ctrl-4 Плана\nShift-Ctrl-5 Љубичаста FILEBROWSER_COPYPROFILE;Умножи профил FILEBROWSER_CURRENT_NAME;Тренутно име: FILEBROWSER_DARKFRAME;Тамни кадар @@ -70,10 +104,12 @@ FILEBROWSER_DELETEDLGMSGINCLPROC;Да ли желите да обришете %1 FILEBROWSER_EMPTYTRASH;Избаци смеће FILEBROWSER_EMPTYTRASHHINT;Трајно брише датотеке из смећа FILEBROWSER_EXEC_CPB;Изгради почетни профил +FILEBROWSER_EXTPROGMENU;Отвори помоћу FILEBROWSER_FLATFIELD;Равно поље FILEBROWSER_MOVETODARKFDIR;Пребаци у фасциклу са тамним кадровима FILEBROWSER_MOVETOFLATFIELDDIR;Премести у фасцикли са равним пољима FILEBROWSER_NEW_NAME;Ново име: +FILEBROWSER_OPENDEFAULTVIEWER;Подразумевани приказ прозора (заказано-развијено) FILEBROWSER_PARTIALPASTEPROFILE;Делимично убаци FILEBROWSER_PASTEPROFILE;Убаци профил FILEBROWSER_POPUPCANCELJOB;Откажи задатак @@ -84,9 +120,10 @@ FILEBROWSER_POPUPMOVEEND;Премести на крај заказаних FILEBROWSER_POPUPMOVEHEAD;Премести на почетак заказаних FILEBROWSER_POPUPMOVETO;Премести у... FILEBROWSER_POPUPOPEN;Отвори -FILEBROWSER_POPUPOPENINEDITOR;Отвори у уреднику FILEBROWSER_POPUPPROCESS;Закажи за обраду +FILEBROWSER_POPUPPROCESSFAST;Додај у заказано (брзи извоз) FILEBROWSER_POPUPPROFILEOPERATIONS;Профил +FILEBROWSER_POPUPRANK;Оцена FILEBROWSER_POPUPREMOVE;Уклони из система датотека FILEBROWSER_POPUPREMOVEINCLPROC;Уклони из система датотека и заказаног FILEBROWSER_POPUPRENAME;Преименуј @@ -97,7 +134,13 @@ FILEBROWSER_POPUPUNTRASH;Уклони из смећа FILEBROWSER_QUERYBUTTONHINT;Очисти поље за претрагу FILEBROWSER_QUERYHINT;Унесите део имена датотеке за претрагу nCtrl-f поставља фокус (у Разгледачу датотека);nEnter претражује FILEBROWSER_QUERYLABEL; Тражи: +FILEBROWSER_RANK1_TOOLTIP;Оцена 1 *\nПречица: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Оцена 2 *\nПречица: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Оцена 3 *\nПречица: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Оцена 4 *\nПречица: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Оцена 5 *\nПречица: Shift-5 FILEBROWSER_RENAMEDLGLABEL;Преименуј датотеку +FILEBROWSER_RENAMEDLGMSG;Преименуј датотеку „%1“ у: FILEBROWSER_SELECTDARKFRAME;Изабери тамни кадар... FILEBROWSER_SELECTFLATFIELD;Изабери равно поље... FILEBROWSER_SHOWCOLORLABEL1HINT;Приказује слике означене црвеном Alt-1 @@ -125,12 +168,16 @@ FILEBROWSER_STOPPROCESSING;Заустави обраду FILEBROWSER_STOPPROCESSINGHINT;Зауставља обраду слика FILEBROWSER_THUMBSIZE;Преглед FILEBROWSER_TOOLTIP_STOPPROCESSING;Покреће обраду фотографија када их закажете +FILEBROWSER_UNRANK_TOOLTIP;Неоцењено.\nПречица: Shift-0 +FILEBROWSER_USETEMPLATE;Искористи шаблон: FILEBROWSER_ZOOMINHINT;Увећава преглед FILEBROWSER_ZOOMOUTHINT;Умањује преглед GENERAL_ABOUT;О програму GENERAL_AFTER;После +GENERAL_AUTO;Аутоматски GENERAL_BEFORE;Пре GENERAL_CANCEL;Откажи +GENERAL_CLOSE;Затвори GENERAL_DISABLE;Искључи GENERAL_DISABLED;Искључено GENERAL_ENABLE;Укључи @@ -144,8 +191,11 @@ GENERAL_OK;У реду GENERAL_PORTRAIT;Усправно GENERAL_SAVE;Сачувај GENERAL_UNCHANGED;(неизмењено) +GENERAL_WARNING;Упозорење HISTOGRAM_TOOLTIP_B;Приказује плави хистограм HISTOGRAM_TOOLTIP_BAR;Приказује/сакрива РГБ индикатор. Кликните десни тастер миша на умањени приказ да замрзнете +HISTOGRAM_TOOLTIP_CHRO;Прикажи/сакриј хистограм хроминансе. +HISTOGRAM_TOOLTIP_FULL;Укључује приказ потпуног или хистограма у размери. HISTOGRAM_TOOLTIP_G;Приказује зелени хистограм HISTOGRAM_TOOLTIP_L;Приказује ЦиеЛаб хитограм HISTOGRAM_TOOLTIP_R;Приказује црвени хистограм @@ -195,8 +245,8 @@ HISTORY_MSG_37;Појачање боја HISTORY_MSG_38;Начин балансирања беле HISTORY_MSG_39;Температура боје HISTORY_MSG_40;Заленило боје -HISTORY_MSG_41;Померај боје „А“ -HISTORY_MSG_42;Померај боје „Б“ +HISTORY_MSG_41;Померање боје „А“ +HISTORY_MSG_42;Померање боје „Б“ HISTORY_MSG_43;Уклањање светлосног шума HISTORY_MSG_44;Радијус укл. светлосног шума HISTORY_MSG_45;Толеранција ивице укл. с. шума @@ -305,9 +355,111 @@ HISTORY_MSG_147;Оштрење ивица - само луминанса HISTORY_MSG_148;Микроконтраст HISTORY_MSG_149;Микроконтраст - 3x3 матрица HISTORY_MSG_150;Уклањање артефакта/шума након расклапања мозаика +HISTORY_MSG_151;Живост боја +HISTORY_MSG_152;Жив - Пастелни тонови +HISTORY_MSG_153;Жив - Засићени тонови +HISTORY_MSG_154;Жив - Заштити боју коже +HISTORY_MSG_155;Жив - Избегни померање боја +HISTORY_MSG_156;Жив - Повежи пастелно и засићено +HISTORY_MSG_157;Жив - П/С праг +HISTORY_MSG_158;МТ - Јачина +HISTORY_MSG_159;МТ - Заустављање ивице +HISTORY_MSG_160;МТ - Размера +HISTORY_MSG_161;МТ - Понављање премеравања +HISTORY_MSG_162;Мапирање тонова +HISTORY_MSG_163;РГБ криве - црвена +HISTORY_MSG_164;РГБ криве - зелена +HISTORY_MSG_165;РГБ криве - плава +HISTORY_MSG_166;Неутрални нивои +HISTORY_MSG_167;--неискоришћено-- +HISTORY_MSG_168;„CC“ крива +HISTORY_MSG_169;„CH“ крива +HISTORY_MSG_170;Жив - крива +HISTORY_MSG_171;„LC“ крива +HISTORY_MSG_172;Лаб - Забрани LC +HISTORY_MSG_173;УШ - Детаљи луминансе +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - CAT02 адаптација +HISTORY_MSG_176;CAM02 - Околина приказа +HISTORY_MSG_177;CAM02 - Луминанса кадра +HISTORY_MSG_178;CAM02 - Луминанса приказа +HISTORY_MSG_179;CAM02 - Модел беле тачке +HISTORY_MSG_180;CAM02 - Светлина (J) +HISTORY_MSG_181;CAM02 - Боја (C) +HISTORY_MSG_182;CAM02 - Аутоматски CAT02 +HISTORY_MSG_183;CAM02 - Контраст (J) +HISTORY_MSG_184;CAM02 - Околина сцене +HISTORY_MSG_185;CAM02 - Контрола ширине тонова +HISTORY_MSG_186;CAM02 - Алгоритам +HISTORY_MSG_187;CAM02 - Заштита црвене и боје коже +HISTORY_MSG_188;CAM02 - Светлина (Q) +HISTORY_MSG_189;CAM02 - Контраст (Q) +HISTORY_MSG_190;CAM02 - Засићеност (S) +HISTORY_MSG_191;CAM02 - Живописност (M) +HISTORY_MSG_192;CAM02 - Нијанса (h) +HISTORY_MSG_193;CAM02 - Крива тонова 1 +HISTORY_MSG_194;CAM02 - Крива тонова 2 +HISTORY_MSG_195;CAM02 - Крива тонова 1 +HISTORY_MSG_196;CAM02 - Крива тонова 2 +HISTORY_MSG_197;CAM02 - Крива боје +HISTORY_MSG_198;CAM02 - Крива боје +HISTORY_MSG_199;CAM02 - Излазни хистограми +HISTORY_MSG_200;CAM02 - Мапирање тонова +HISTORY_MSG_201;УШ - Хроминанса Ц,З +HISTORY_MSG_202;УШ - Хроминанса П,Y +HISTORY_MSG_203;УШ - Начин +HISTORY_MSG_204;LMMSE кораци побољшања +HISTORY_MSG_205;CAM02 - Врући/лош пиксели +HISTORY_MSG_206;CAT02 - Аутоматска луминанса кадра +HISTORY_MSG_207;Уклањање ореола - крива нијансе +HISTORY_MSG_208;ББ - Баланс Ц и П +HISTORY_MSG_210;ФГ - Угао +HISTORY_MSG_211;Филтер градијента +HISTORY_MSG_212;ФВ - Јачина +HISTORY_MSG_213;Филтер вињетарења +HISTORY_MSG_214;Црно-бела слика +HISTORY_MSG_215;ЦБ - CM - Црвена +HISTORY_MSG_216;ЦБ - CM - Зелена +HISTORY_MSG_217;ЦБ - CM - Плава +HISTORY_MSG_218;ЦБ - Гама - Црвена +HISTORY_MSG_219;ЦБ - Гама - Зелена +HISTORY_MSG_220;ЦБ - Гама - Плана +HISTORY_MSG_221;ЦБ - Филтер боје +HISTORY_MSG_222;ЦБ - Предподешавања +HISTORY_MSG_223;ЦБ - CM - Наранџаста +HISTORY_MSG_224;ЦБ - CM - Жута +HISTORY_MSG_225;ЦБ - CM - Светло плава +HISTORY_MSG_226;ЦБ - CM - Светло љубичаста +HISTORY_MSG_227;ЦБ - CM - Љубичаста +HISTORY_MSG_228;ЦБ - Уједначење луминансе +HISTORY_MSG_229;ЦБ - Уједначење луминансе +HISTORY_MSG_230;ЦБ - Режим +HISTORY_MSG_231;ЦБ - Пре криве +HISTORY_MSG_232;ЦБ - Пре врсте криве +HISTORY_MSG_233;ЦБ - Након приве +HISTORY_MSG_234;ЦБ - Након врсте криве +HISTORY_MSG_235;ЦБ - Аутоматско мешање канала +HISTORY_MSG_236;--неискоришћено-- +HISTORY_MSG_237;ЦБ - Миксер +HISTORY_MSG_238;ФГ - Умекшање +HISTORY_MSG_239;ФГ - Јачина +HISTORY_MSG_240;ФГ - Центар +HISTORY_MSG_241;ФВ - Умекшање +HISTORY_MSG_242;ФВ - Кривоћа +HISTORY_MSG_243;ФВ - Пречник +HISTORY_MSG_244;ФВ - Јачина +HISTORY_MSG_245;ФВ - Центар +HISTORY_MSG_246;CL крива +HISTORY_MSG_247;LH крива +HISTORY_MSG_248;HH крива +HISTORY_MSG_249;CbDL - Праг +HISTORY_MSG_250;УШ - Побољшање +HISTORY_MSG_251;ЦБ - Алгоритам HISTORY_NEWSNAPSHOT;Додај +HISTORY_NEWSNAPSHOT_TOOLTIP;Пречица: Alt-s HISTORY_SNAPSHOT;Снимак HISTORY_SNAPSHOTS;Снимак +HRESHOLDSELECTOR_BL;Доле-лево IPTCPANEL_AUTHOR;Аутор IPTCPANEL_AUTHORSPOSITION;Звање аутора IPTCPANEL_AUTHORSPOSITIONHINT;Звање једног или више аутора (једно по реди). @@ -350,10 +502,14 @@ IPTCPANEL_TITLEHINT;Кратни назив слике (име објекта). IPTCPANEL_TRANSREFERENCE;Реф. преноса IPTCPANEL_TRANSREFERENCEHINT;Код којји представља место првобитног преноса (референца првог преноса). MAIN_BUTTON_FULLSCREEN;Цео екран +MAIN_BUTTON_NAVNEXT_TOOLTIP;Шаље вас на наредну слику у односу на отворену у прозору за уређивање.\nПречица: Shift-F4\n\nТакође, омогућа вам да идете на наредну слику у односу на тренутно изабрану у разгледачу или филмској траци.\nПречица: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Шаље вас на претходну слику у односу на отворену у прозору за уређивање.\nПречица: Shift-F3\n\nnТакође, омогућа вам да идете на наредну слику у односу на тренутно изабрану у разгледачу или филмској траци.\nПречица: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Усаглашава разгледач датотека или филмску траку са делом за уређивање ради умањеног приказа тренутно отворене слике и чисти све изабране филтере.\nПречица: x\n\nКао и претходна операција, али без чишћења изабраних филтера:\nПречица: y\n(Умањени приказ отворене слике неће бити приказан уколико је изфилтриран). MAIN_BUTTON_PREFERENCES;Поставке MAIN_BUTTON_PUTTOQUEUE;Закажи MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Додаје тренутну слику у заказане Ctrl+B MAIN_BUTTON_SAVE;Сачувај +MAIN_BUTTON_SAVEAS;Као... MAIN_BUTTON_SAVE_TOOLTIP;Чува тренутну слику Ctrl+С MAIN_BUTTON_SENDTOEDITOR;Уреди MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Уређује тренутну слику у спољном програму Ctrl+Е @@ -375,14 +531,20 @@ MAIN_MSG_CANNOTSAVE;Грешка при чувању датотеке MAIN_MSG_CANNOTSTARTEDITOR;Не могу да покренем програм за уређивање. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Изаберите исправну путању у „Поставкама“. MAIN_MSG_EMPTYFILENAME;Није одређено име датотеке! +MAIN_MSG_IMAGEUNPROCESSED;Ова радња захтева да најпре ставите изабране слике у листу заказаних. MAIN_MSG_NAVIGATOR;Навигатор +MAIN_MSG_OPERATIONCANCELLED;Радња је отказана +MAIN_MSG_PATHDOESNTEXIST;Не постоји путања \n\n%1\n\n. Поставите исправну путањи из подешавања програма. MAIN_MSG_QOVERWRITE;Да ли желите да препишете? +MAIN_MSG_SETPATHFIRST;Морате изабрати циљну путању из подешавања програма\nкако би користили ову функцију! +MAIN_MSG_WRITEFAILED;Не могу да упишем\n\n"%1"\n\nПроверите да ли фасцикла постоји и да ли имате овлашћења за упис у њу. MAIN_TAB_COLOR;Боја MAIN_TAB_COLOR_TOOLTIP;Alt-c MAIN_TAB_DETAIL;Детаљи MAIN_TAB_DETAIL_TOOLTIP;Alt-d MAIN_TAB_DEVELOP;Развијање MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Брзи извоз MAIN_TAB_EXPOSURE;Светлост MAIN_TAB_EXPOSURE_TOOLTIP;Alt-e MAIN_TAB_FILTER;Филтер @@ -391,21 +553,55 @@ MAIN_TAB_METADATA;Метаподаци MAIN_TAB_METADATA_TOOLTIP;Alt-m MAIN_TAB_RAW;RAW MAIN_TAB_RAW_TOOLTIP;Alt-r +MAIN_TAB_TAGGING;Ознаке MAIN_TAB_TRANSFORM;Исправке MAIN_TAB_TRANSFORM_TOOLTIP;Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Боја позадине за преглед: На основу теме\nПречица: 9 +MAIN_TOOLTIP_BACKCOLOR1;Боја позадине за преглед: Црна\nПречица: 9 +MAIN_TOOLTIP_BACKCOLOR2;Боја позадине за преглед: Бела\nПречица: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Закључај / откључај пре приказа\n\nЗакључај: задржи претходни приказ.\nКорисно уколико желите да прикажете укупни ефекат више алата.\nПоређење се још може направити и за било које стање из Историје.\n\nОткључај: претходни приказ долази након приказа једног последњег корака, приказујући слику пре примене тренутног алата. MAIN_TOOLTIP_HIDEHP;Приказује/сакрива леву површ, заједно са историјатом (пречица: Х) MAIN_TOOLTIP_INDCLIPPEDH;Приказује исечене светле делове MAIN_TOOLTIP_INDCLIPPEDS;Приказује исечене тамне делове +MAIN_TOOLTIP_PREVIEWB;Преглед плавог каназа.\nПречица: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Приказује област у фокусу.\nПречица: Shift-f\n\nНа увећању прецизније ради са сликама које имају малу дубинску оштрину и мало шума.\n\nЗа прецизнији приказ код слика са шумом прегледајте фокус на мањем увећању од око 10-30%.\n\nПриказ фокусиране области ће успорити преглед фотографија. +MAIN_TOOLTIP_PREVIEWG;Преглед зеленог канала.\nПречица: g +MAIN_TOOLTIP_PREVIEWL;Преглед луминансе.\nПречица: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Преглед црвеног канала.\nПречица: r MAIN_TOOLTIP_QINFO;Основни подаци о слици И MAIN_TOOLTIP_SHOWHIDELP1;Приказује/сакрива леву површ l MAIN_TOOLTIP_SHOWHIDERP1;Приказује/сакрива десну површ Alt-l MAIN_TOOLTIP_SHOWHIDETP1;Приказује/сакрива горњу површ Shift-L +MAIN_TOOLTIP_THRESHOLD;Праг MAIN_TOOLTIP_TOGGLE;Приказује слику пре и после обраде Б +NAVIGATOR_B_NA;П = ○ +NAVIGATOR_B_VALUE;П = %1 +NAVIGATOR_G_NA;З = ○ +NAVIGATOR_G_VALUE;З = %1 +NAVIGATOR_H_NA;Х = ○ +NAVIGATOR_H_VALUE;Х = %1 +NAVIGATOR_LAB_A_NA;А = ○ +NAVIGATOR_LAB_A_VALUE;А = %1 +NAVIGATOR_LAB_B_NA;Б = ○ +NAVIGATOR_LAB_B_VALUE;Б = %1 +NAVIGATOR_LAB_L_NA;Л = ○ +NAVIGATOR_LAB_L_VALUE;Л = %1 +NAVIGATOR_R_NA;Ц = ○ +NAVIGATOR_R_VALUE;Ц = %1 +NAVIGATOR_S_NA;С = ○ +NAVIGATOR_S_VALUE;С = %1 +NAVIGATOR_V_NA;В = ○ +NAVIGATOR_V_VALUE;В = %1 +NAVIGATOR_XY_FULL;Ширина = %1, Висина = %2 NAVIGATOR_XY_NA;x = ○, y = ○ +OPTIONS_DEFIMG_MISSING;Није пронађен или доступан подразумевани профил за слике које нису у сировом формату.\n\nПроверите фасциклу са профилима, можда не постоји или је оштећена.\n\nБиће коришћене подразумеване вредности. +OPTIONS_DEFRAW_MISSING;Није пронађен или доступан подразумевани профил за слике у сировом формату.\n\nПроверите фасциклу са профилима, можда не постоји или је оштећена.\n\nБиће коришћене подразумеване вредности. PARTIALPASTE_BASICGROUP;Основна подешавања PARTIALPASTE_CACORRECTION;Исправљање аберација PARTIALPASTE_CHANNELMIXER;Мешање канала +PARTIALPASTE_CHANNELMIXERBW;Црно-бела фотографија PARTIALPASTE_COARSETRANS;Ротација за 90˚ / извртање +PARTIALPASTE_COLORAPP;CIECAM 2002 модел изгледа боја PARTIALPASTE_COLORGROUP;Подешавање боја PARTIALPASTE_COMMONTRANSFORMPARAMS;Сам попуни PARTIALPASTE_COMPOSITIONGROUP;Подешавање композиције @@ -418,6 +614,7 @@ PARTIALPASTE_DIALOGLABEL;Делимочно убацује профил за о PARTIALPASTE_DIRPYRDENOISE;Уклањање шума PARTIALPASTE_DIRPYREQUALIZER;Контраст нивоима детаља PARTIALPASTE_DISTORTION;Исправљање изобличења +PARTIALPASTE_EPD;Мапирање тонова PARTIALPASTE_EVERYTHING;Све PARTIALPASTE_EXIFCHANGES;Измене exif података PARTIALPASTE_EXPOSURE;Експозиција @@ -425,15 +622,21 @@ PARTIALPASTE_FLATFIELDAUTOSELECT;Аутоматски избор РК PARTIALPASTE_FLATFIELDBLURRADIUS;Полупречник замућења РК PARTIALPASTE_FLATFIELDBLURTYPE;Начин замућења РК PARTIALPASTE_FLATFIELDFILE;Датотека за равни кадар +PARTIALPASTE_GRADIENT;Филтер градијента PARTIALPASTE_HSVEQUALIZER;Уједначење ХСВ +PARTIALPASTE_ICMGAMMA;Излазна гама PARTIALPASTE_ICMSETTINGS;ИЦМ подешавања PARTIALPASTE_IMPULSEDENOISE;Импулсно уклањање шума PARTIALPASTE_IPTCINFO;ИПТЦ подави PARTIALPASTE_LABCURVE;Лаб крива PARTIALPASTE_LENSGROUP;Подешавања објектива -PARTIALPASTE_METAGROUP;Метаподаци +PARTIALPASTE_LENSPROFILE;Профил за исправке објектива +PARTIALPASTE_LUMACURVE;Крива луминасе +PARTIALPASTE_METAICMGROUP;Метаподаци/ИЦМ подешавања +PARTIALPASTE_PCVIGNETTE;Филтер вињетарења PARTIALPASTE_PERSPECTIVE;Перспектива PARTIALPASTE_PREPROCESS_GREENEQUIL;Уједначавање зелене +PARTIALPASTE_PREPROCESS_HOTDEADPIXFILT;Филтер врелих/мртвих пиксела PARTIALPASTE_PREPROCESS_LINEDENOISE;Линијски филтер шума PARTIALPASTE_RAWCACORR_AUTO;Ауто хроматске аберације PARTIALPASTE_RAWCACORR_CABLUE;Плава хроминанса @@ -442,39 +645,68 @@ PARTIALPASTE_RAWEXPOS_BLACK;Ниво црне PARTIALPASTE_RAWEXPOS_LINEAR;Линеарни фактор исправке RAW беле тачке PARTIALPASTE_RAWEXPOS_PRESER;Raw тачка беле уз очување светлих делова PARTIALPASTE_RAWGROUP;Raw подешавања +PARTIALPASTE_RAW_ALLENHANCE;Уклони шум након расклапања мозаика PARTIALPASTE_RAW_DCBENHANCE;Примени корак ДЦБ побољшања PARTIALPASTE_RAW_DCBITERATIONS;Број ДЦБ понављања PARTIALPASTE_RAW_DMETHOD;Начин расклапања мозаика PARTIALPASTE_RAW_FALSECOLOR;Кораци пригушења лажне боје при расклапању мозаика +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE кораци побољшања PARTIALPASTE_RESIZE;Промена величине +PARTIALPASTE_RGBCURVES;РГБ криве PARTIALPASTE_ROTATION;Ротација PARTIALPASTE_SHADOWSHIGHLIGHTS;Сенке/Светлост PARTIALPASTE_SHARPENEDGE;Ивице PARTIALPASTE_SHARPENING;Оштрење PARTIALPASTE_SHARPENMICRO;Микроконтраст +PARTIALPASTE_VIBRANCE;Живост боја PARTIALPASTE_VIGNETTING;Исправљање вињетарења PARTIALPASTE_WHITEBALANCE;Баланс беле +POPUPBUTTON_SELECTOPTIONHINT;РМБ за измену опције PREFERENCES_ADD;Додај PREFERENCES_APPLNEXTSTARTUP;примењује се након поновног покретања PREFERENCES_AUTOMONPROFILE;Сам примени профиле монитора из оперативног система PREFERENCES_BATCH_PROCESSING;Обрада закзаног +PREFERENCES_BEHADDALL;Све у „Додај“ +PREFERENCES_BEHADDALLHINT;Поставља све параметре у режим Додај.\nЊихово подешавање помоћу алата из панела за заказано ће бити разлике сачуваних вредности. PREFERENCES_BEHAVIOR;Понашање +PREFERENCES_BEHSETALL;Све у „Постави“ +PREFERENCES_BEHSETALLHINT;Поставља све параметре у режим Постави.\nЊихово подешавање помоћу алата из панела за заказано ће бити апсолутне вредности као што су и изабране. +PREFERENCES_BLACKBODY;Обична сијалица +PREFERENCES_BLINKCLIPPED;Покажи претамне/пресветле делове PREFERENCES_CACHECLEARALL;Обриши све PREFERENCES_CACHECLEARPROFILES;Обриши профиле PREFERENCES_CACHECLEARTHUMBS;Обриши приказе +PREFERENCES_CACHEFORMAT1;Власнички (брже и боље) +PREFERENCES_CACHEFORMAT2;JPEG (мање места на диску) PREFERENCES_CACHEMAXENTRIES;Највећи број мест у остави PREFERENCES_CACHEOPTS;Подешавање оставе +PREFERENCES_CACHETHUMBFORM;Формат умањених приказа PREFERENCES_CACHETHUMBHEIGHT;Највећа висина приказа +PREFERENCES_CIEART;CIECAM02 оптимизација +PREFERENCES_CIEART_LABEL;Једнострука тачност уместо двоструке +PREFERENCES_CIEART_TOOLTIP;Уколико је омогућено, ради CIECAM02 рачунања са једноструком тачношћу уместо са двоструком. Ово даје мало повећање брзине уз неизоставан губитак на квалитету. +PREFERENCES_CLEARDLG_LINE1;Чишћење оставе +PREFERENCES_CLEARDLG_LINE2;Ово може да потраје неколико секунди. +PREFERENCES_CLEARDLG_TITLE;Сачекајте PREFERENCES_CLIPPINGIND;Показивачи одсечених делова +PREFERENCES_CMETRICINTENT;Колориметријска намера PREFERENCES_CUSTPROFBUILD;Изградња произвољног почетног профила слике PREFERENCES_CUSTPROFBUILDHINT;Извршна датотека (или скрипта) која се позива када изграђујете нови почетни профил за слику.nПрихвата параметре из командне линије ради прављења .pp3 датотеке на основу неких правила:n[Путања до RAW/JPG] [Путања подразумеваног профила] [Бленда] [Експозиција у s] [Жижна дужина mm] [ИСО] [Објектив] [Фото-апарат] +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Кључни формати +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Назив +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;БрОзнаке PREFERENCES_CUSTPROFBUILDPATH;Извршна путања PREFERENCES_CUTOVERLAYBRUSH;Маска исецања боје/провидног +PREFERENCES_D50;5000K +PREFERENCES_D55;5500K +PREFERENCES_D60;6000K +PREFERENCES_D65;6500K PREFERENCES_DARKFRAME;Тамни кадар PREFERENCES_DARKFRAMEFOUND;Нађен PREFERENCES_DARKFRAMESHOTS;снимака PREFERENCES_DARKFRAMETEMPLATES;шаблони PREFERENCES_DATEFORMAT;Формат датума +PREFERENCES_DATEFORMATFRAME;Формат PREFERENCES_DATEFORMATHINT;Можете задати следеће формате:\n%y :година\n%m : месец\n%d : дан\n\nУ Србији се највише користи:\n%d.%m.%y PREFERENCES_DEFAULTLANG;Језик програма PREFERENCES_DEFAULTTHEME;Тема програма @@ -495,9 +727,21 @@ PREFERENCES_FLATFIELDFOUND;Нађено PREFERENCES_FLATFIELDSDIR;Директоријум за равна поља PREFERENCES_FLATFIELDSHOTS;снимака PREFERENCES_FLATFIELDTEMPLATES;шаблони +PREFERENCES_FLUOF2;Флоресцентна F2 +PREFERENCES_FLUOF7;Флоресцентна F7 +PREFERENCES_FLUOF11;Флоресцентна F11 PREFERENCES_FORIMAGE;За датотеке са сликама PREFERENCES_FORRAW;За RAW датотеке PREFERENCES_GIMPPATH;Директоријум са инсталираним Гимпом +PREFERENCES_GREY;Yb луминанса излазног уређаја (%) +PREFERENCES_GREY05;Yb=05 CIE L#30 +PREFERENCES_GREY10;Yb=10 CIE L#40 +PREFERENCES_GREY15;Yb=15 CIE L#45 +PREFERENCES_GREY18;Yb=18 CIE L#50 +PREFERENCES_GREY23;Yb=23 CIE L#55 +PREFERENCES_GREY30;Yb=30 CIE L#60 +PREFERENCES_GREY40;Yb=40 CIE L#70 +PREFERENCES_GTKTHEME;ГТК тема PREFERENCES_HISTOGRAMPOSITIONLEFT;Хистограм у левој површи PREFERENCES_HLTHRESHOLD;Праг за одсечене светле делове PREFERENCES_ICCDIR;ИЦЦ директоријум @@ -508,12 +752,14 @@ PREFERENCES_INTENT_RELATIVE;Релативно колориметријски PREFERENCES_INTENT_SATURATION;Засићени приказ PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Користи угњежђени RAW приказ до измене PREFERENCES_LANGAUTODETECT;Сам откриј +PREFERENCES_MENUGROUPEXTPROGS;Групиши "Отвори са" PREFERENCES_MENUGROUPFILEOPERATIONS;Групиши радње над датотекама PREFERENCES_MENUGROUPLABEL;Групиши обележавање PREFERENCES_MENUGROUPPROFILEOPERATIONS;Групиши радње са профилима PREFERENCES_MENUGROUPRANK;Групиши оцењивање PREFERENCES_MENUOPTIONS;Опције менија PREFERENCES_METADATA;Метаподаци +PREFERENCES_MONITORICC;Профил монитора PREFERENCES_MULTITAB;Режим у више листова PREFERENCES_MULTITABDUALMON;Режим у више листова, на другом монитору PREFERENCES_OUTDIR;Излазни директоријум @@ -523,6 +769,7 @@ PREFERENCES_OUTDIRTEMPLATE;Употреби шаблон PREFERENCES_OUTDIRTEMPLATEHINT;Можете да задате следеће скраћенице за форматирање:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nОви знакови за форматирање се односе на директоријуме, подпутање путања до raw датотеке.\n\nНа пример, уколико је отворена слика /home/ivan/слике/02.09.2010/dsc0012.nef, скраћенице означавају:\n%f=dsc0012, %d1=02.09.2010, %d2=слике, ...\n%p1=/home/ivan/слике/02.09.2010, %p2=/home/ivan/слике, %p3=/home/ivan, ...\n\nУколико желите да сачувате развијену слику поред оригинала, унесите:\n%p1/%f\n\nУколико желите да сачувате излазну слику у директоријум „развијене“ који се налази где и оригинална слика, унесите:\n%p1/развијене/%f\n\nУколико желите да сачувате развијену слику у директоријум „/home/ivan/развијене“, а да структура поддиректоријума остане очувана, унесите:\n%p2/развијене/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Постави преко умањеног приказа PREFERENCES_OVERWRITEOUTPUTFILE;Препиши постојеће излазне датотеке +PREFERENCES_PANFACTORFRAME;Убрзање при померању платна PREFERENCES_PANFACTORLABEL;Фактор PREFERENCES_PARSEDEXT;Екстензије за приказ PREFERENCES_PARSEDEXTADD;Додај екстензију @@ -536,12 +783,16 @@ PREFERENCES_PROFILESAVECACHE;Сачувај параметре обраде у PREFERENCES_PROFILESAVEINPUT;Сачувај парамтре обраде поред улазне датотеке PREFERENCES_PROPERTY;Особина PREFERENCES_PSPATH;Директоријум са инсталираним Адобе Фотошопом +PREFERENCES_RGBDTL_LABEL;Највећи број нири приликом уклањања шума +PREFERENCES_RGBDTL_TOOLTIP;Уклањање шума захтева око 128MB РАМ меморије за слику од 10 мегапиксела или 512MB за слику од 40 мегапиксела, уз додатних 128MB меморије по свакој нити. Што више нити се извршавају заједно то ће брже бити рачунање. Оставите ову вредност на „0“ како би програм аутоматски доделило што је више нитова могуће. PREFERENCES_SELECTFONT;Изаберите фонт PREFERENCES_SELECTLANG;Језик PREFERENCES_SELECTTHEME;Тема PREFERENCES_SET;Постави PREFERENCES_SHOWBASICEXIF;Прикажи основне Exif податке PREFERENCES_SHOWDATETIME;Прикажи датум и време +PREFERENCES_SHOWEXPOSURECOMPENSATION;Додај компензацију експозиције +PREFERENCES_SHOWPROFILESELECTOR;Прикажи избор профила PREFERENCES_SHTHRESHOLD;Праг за одсечене тамне делове PREFERENCES_SINGLETAB;Режим у једном листу PREFERENCES_SINGLETABVERTAB;Режим у једном листу, вертикални листови @@ -550,21 +801,38 @@ PREFERENCES_SND_BATCHQUEUEDONE;Обрађене су заказане датот PREFERENCES_SND_HELP;Унесите путању до датотеке или оставите празно уколико не желите звук. На Windows-у можете да користите „SystemDefault“, „SystemAsterisk“ за системске звуке. PREFERENCES_SND_LNGEDITPROCDONE;Уредник је завршио обраду PREFERENCES_SND_TRESHOLDSECS;бр. секунди +PREFERENCES_SQUAREDETAILWINDOW;Коцкаст прозор са детаљима (брже) PREFERENCES_STARTUPIMDIR;Директоријум по покретању PREFERENCES_TAB_BROWSER;Преглед датотека PREFERENCES_TAB_COLORMGR;Управљање бојама PREFERENCES_TAB_GENERAL;Опште PREFERENCES_TAB_IMPROC;Обрада сликe +PREFERENCES_TAB_PERFORMANCE;Перформанса PREFERENCES_TAB_SOUND;Звуци +PREFERENCES_TP_LABEL;Површ алата: +PREFERENCES_TP_USEICONORTEXT;Користи иконице језичка уместо текста PREFERENCES_TP_VSCROLLBAR;Сакриј клизаче у области са алаткама +PREFERENCES_TUNNELMETADATA;Копирај неизмењене IPTC/XMP (када је слика означена другим програмом) +PREFERENCES_USEBUNDLEDPROFILES;Користи профиле који долазе уз програм PREFERENCES_USESYSTEMTHEME; Користи системску тему +PREFERENCES_VIEW;Баланс беле излазног уређаја (монитор, ТВ, пројакетор и др.) PREFERENCES_WORKFLOW;Ток обраде +PROFILEPANEL_COPYPPASTE;Параметри за копирање +PROFILEPANEL_FILEDLGFILTERANY;Све датотеке +PROFILEPANEL_FILEDLGFILTERPP;Профили за обраду +PROFILEPANEL_GLOBALPROFILES;Профили из програма PROFILEPANEL_LABEL;Профили обраде PROFILEPANEL_LOADDLGLABEL;Учитај профил за обраду... +PROFILEPANEL_LOADPPASTE;Параметри за учитавање +PROFILEPANEL_MODE_TIP;Начин допуне профила који се користи за обраду.\n\nПритиснута дугмад: делимични профили се преводе у потпуне профиле, а недостајуће вредносоти се мењају подразумеваним вредностим.\n\nПуштена дугмад: профили ће бити примењени какви јесу, уз измени само оних вредности које садржи профил. +PROFILEPANEL_MYPROFILES;Моји профили +PROFILEPANEL_PASTEPPASTE;Параметри за убацивање PROFILEPANEL_PCUSTOM;Произвољно PROFILEPANEL_PFILE;Из датотеке +PROFILEPANEL_PINTERNAL;Неутрално PROFILEPANEL_PLASTSAVED;Од последњег чувања PROFILEPANEL_SAVEDLGLABEL;Чува параметре за обраду... +PROFILEPANEL_SAVEPPASTE;Параметри за чување PROFILEPANEL_TOOLTIPCOPY;Копира тренутни профил у оставу PROFILEPANEL_TOOLTIPLOAD;Учитава профил из датотеке PROFILEPANEL_TOOLTIPPASTE; Учитава профил из @@ -574,29 +842,115 @@ PROGRESSBAR_LOADINGTHUMBS;Учитавам приказе... PROGRESSBAR_LOADJPEG;Учитавам JPEG датотеку... PROGRESSBAR_LOADPNG;Учитавам PNG датотеку... PROGRESSBAR_LOADTIFF;Учитавам TIFF датотеку... +PROGRESSBAR_NOIMAGES;Нису пронађене слике PROGRESSBAR_PROCESSING;Обрађујем слику... +PROGRESSBAR_PROCESSING_PROFILESAVED;Обрађујем сачувани профил PROGRESSBAR_READY;Чекам PROGRESSBAR_SAVEJPEG;Чувам JPEG датотеку... PROGRESSBAR_SAVEPNG;Чувам PNG датотеку... PROGRESSBAR_SAVETIFF;Чувам TIFF датотеку... +PROGRESSBAR_SNAPSHOT_ADDED;Додат је снимак +PROGRESSDLG_LOADING;Учитавам датотеку... +PROGRESSDLG_PROCESSING;Обрађујем слику... PROGRESSDLG_PROFILECHANGEDINBROWSER;Профил измењен у разгледачу +PROGRESSDLG_SAVING;Чувам датотеку... P_GAMMA_CURV;гама QINFO_ISO;ИСО QINFO_NOEXIF;Нису доступни Exif подаци. SAVEDLG_AUTOSUFFIX;Сам додај суфикс уколико датотека већ постоји SAVEDLG_FILEFORMAT;Формат датотеке +SAVEDLG_FORCEFORMATOPTS;Приморај могућности за чување SAVEDLG_JPEGQUAL;JPEG квалитет +SAVEDLG_JPGFILTER;JPEG датотеке SAVEDLG_PNGCOMPR;PNG паковање SAVEDLG_PUTTOQUEUE;Заказује слику за обраду SAVEDLG_PUTTOQUEUEHEAD;Премешта слику на почетак заказаних SAVEDLG_PUTTOQUEUETAIL;Премешта слику на крај заказаних SAVEDLG_SAVEIMMEDIATELY;Одмах сачувај SAVEDLG_SAVESPP;Сачувај параметре обраде уз слику +SAVEDLG_SUBSAMP;Подузорковање +SAVEDLG_SUBSAMP_1;Најбоља компресија +SAVEDLG_SUBSAMP_2;Балансирано +SAVEDLG_SUBSAMP_3;Најбољи квалитет +SAVEDLG_SUBSAMP_TOOLTIP;Најбоља компресија: 4:1:1\nБалансирано: 4:2:2\nНајбољи квалитет: 4:4:4 +SAVEDLG_TIFFFILTER;TIFF датотеке SAVEDLG_TIFFUNCOMPRESSED;Незапаковани TIFF +SAVEDLG_WARNFILENAME;Датотека ће бити названа +SHCSELECTOR_TOOLTIP;Кликните десно дугме миша да поново вратите позицију ова три клизача. +THRESHOLDSELECTOR_B;Доле +THRESHOLDSELECTOR_BR;Доле-десно +THRESHOLDSELECTOR_HINT;Притисните дугме Shift за померање појединачних тачака. +THRESHOLDSELECTOR_T;Горе +THRESHOLDSELECTOR_TL;Горе-лево +THRESHOLDSELECTOR_TR;Горе-десно TOOLBAR_TOOLTIP_CROP;Поставља оквир за исецање (пречица: Ц) TOOLBAR_TOOLTIP_HAND;Алат за померање (пречица: Н) TOOLBAR_TOOLTIP_STRAIGHTEN;Исправља линију хоризонта (пречица: С) TOOLBAR_TOOLTIP_WB;Одређује баланс беле из тачке (пречица: W) +TP_BWMIX_ALGO;OYCPM алгоритам +TP_BWMIX_ALGO_LI;Линеарно +TP_BWMIX_ALGO_SP;Специјални ефекти +TP_BWMIX_ALGO_TOOLTIP;Линеарно: производи нормални линеарни одговор.\nСпецијални ефекти: производи специјалне ефекте мешајући канале нелинеарно. +TP_BWMIX_AUTOCH;Ауто +TP_BWMIX_AUTOCH_TIP;Израчунај вредности тако да оптимизује мешање канала. +TP_BWMIX_BLUE;Плава +TP_BWMIX_CC_ENABLED;Подеси комплементарну боју +TP_BWMIX_CC_TOOLTIP;Омогући за аутоматско подешавање комплементарне боје у ROYGCBPM режиму. +TP_BWMIX_CHANNEL;Уједначавање луминансе +TP_BWMIX_CURVEEDITOR1;„Пре“ кривуље +TP_BWMIX_CURVEEDITOR2;„Након“ кривуље +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Крива тонова након ЦБ превођења, на крају третмана. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Крива тонова, тик пред ЦБ превођење.\nМоже да узме у обзир и компоненте боје. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Луминанса на основу нијансе L=f(H).\nОбратите пажњу на екстремне вредности пошто оне могу да направе нежељене ефекте. +TP_BWMIX_CYAN;Светло-плава +TP_BWMIX_FILTER;Филтер боја +TP_BWMIX_FILTER_BLUE;Плава +TP_BWMIX_FILTER_BLUEGREEN;Плаво-зелена +TP_BWMIX_FILTER_GREEN;Зелена +TP_BWMIX_FILTER_GREENYELLOW;Зелено-жута +TP_BWMIX_FILTER_NONE;Ни једна +TP_BWMIX_FILTER_PURPLE;Љубичаста +TP_BWMIX_FILTER_RED;Црвена +TP_BWMIX_FILTER_REDYELLOW;Црвено-Жута +TP_BWMIX_GREEN;Зелена +TP_BWMIX_LABEL;Црна и бела +TP_BWMIX_MAGENTA;Љубичаста +TP_BWMIX_MET;Начин +TP_BWMIX_MET_CHANMIX;Мешање канала +TP_BWMIX_MET_DESAT;Уклањање боје +TP_BWMIX_MET_LUMEQUAL;Уједначавање луминансе +TP_BWMIX_MIXC;Мешање +TP_BWMIX_NEUTRAL;Врати мешање +TP_BWMIX_NEUTRAL_TIP;Врати све вреднсоти (филтер боје, мешање канала) на подразумеване. +TP_BWMIX_ORANGE;Наранџаста +TP_BWMIX_PURPLE;Љубичаста +TP_BWMIX_RED;Црвена +TP_BWMIX_RGBLABEL;Р: %1%% Г: %2%% Б: %3%% Укупно: %4%% +TP_BWMIX_RGBLABEL_HINT;Коначни РГБ фактори који се брину о опцијама за мешање.\n„Укупно“ приказује збир РГБ вредности:\n- у 100% у релативном режиму\n- више (светлије) или мање (тамније) од 100% у апсолутном режиму. +TP_BWMIX_RGB_TOOLTIP;Мешање РГБ канала. Користите постојеће преподешене параметре као водиљу.\nОбратите пажњу на негативне вреднсти које могу да направе грешке унутар слике или изазову неправилно понашање. +TP_BWMIX_SETTING;Преподешено +TP_BWMIX_SETTING_TOOLTIP;Различите подешене вредности (филм, пејзаж и др.) или ручно подешене вредности мешања канала. +TP_BWMIX_SET_HIGHCONTAST;Велики контраст +TP_BWMIX_SET_HIGHSENSIT;Велика осетљивост +TP_BWMIX_SET_HYPERPANCHRO;Јако панхроматски +TP_BWMIX_SET_INFRARED;Инфрацрвено +TP_BWMIX_SET_LANDSCAPE;Пејзаж +TP_BWMIX_SET_LOWSENSIT;Ниска осетљивост +TP_BWMIX_SET_LUMINANCE;Луминанса +TP_BWMIX_SET_NORMCONTAST;Нормални контраст +TP_BWMIX_SET_ORTHOCHRO;Ортохроматски +TP_BWMIX_SET_PANCHRO;Панхроматски +TP_BWMIX_SET_PORTRAIT;Портрет +TP_BWMIX_SET_RGBABS;Апсолутни РГБ мешања канала +TP_BWMIX_SET_RGBREL;Релативни РГБ мешања канала +TP_BWMIX_SET_ROYGCBPMABS;Апсолутни ROYGCBPM мешања канала +TP_BWMIX_SET_ROYGCBPMREL;Релативни ROYGCBPM мешања канала +TP_BWMIX_TCMODE_FILMLIKE;Црно-бело, налик филму +TP_BWMIX_TCMODE_SATANDVALBLENDING;Црно-бели, стапање засићености и вредности +TP_BWMIX_TCMODE_STANDARD;Црно-бели, уобичајени +TP_BWMIX_TCMODE_WEIGHTEDSTD;Црно-бели, мерени стандард +TP_BWMIX_VAL;L +TP_BWMIX_YELLOW;Жута TP_CACORRECTION_BLUE;Плава TP_CACORRECTION_LABEL;Хроматке аберације TP_CACORRECTION_RED;Црвена @@ -605,13 +959,109 @@ TP_CHMIXER_GREEN;Зелена TP_CHMIXER_LABEL;Мешање канала TP_CHMIXER_RED;Црвена TP_CHROMATABERR_LABEL;Хроматске аберације +TP_COARSETRAF_DEGREE;степени: TP_COARSETRAF_TOOLTIP_HFLIP;Изврће слику хоризонтално TP_COARSETRAF_TOOLTIP_ROTLEFT;Окреће слику улево TP_COARSETRAF_TOOLTIP_ROTRIGHT;Окреће слику удесно TP_COARSETRAF_TOOLTIP_VFLIP;Изврће слику вертикално +TP_COLORAPP_ADAPTSCENE;Луминозност сцене +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Апосолутна луминозност окружења сцене (cd/m²).\n1) Рачуна се из Exif података:\nБрзина затварача - ИСО вредност - отвор бленде - корекција експозиције камере.\n2) Рачуна се из беле тачке сирове слике унутар дела програма за компензацију експозиције. +TP_COLORAPP_ADAPTVIEWING;Луминозност за преглед (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Апсолутна луминозност окружења за преглед\n(обично 16cd/m²). +TP_COLORAPP_ADAP_AUTO_TOOLTIP;Уколико је штиклирано (препоручено), програм рачуна оптималне вредности на основу Exif података.\nЗа ручно постављање ових вредности, одштиклирајте ово поље. +TP_COLORAPP_ALGO;Алгоритам +TP_COLORAPP_ALGO_ALL;Све +TP_COLORAPP_ALGO_JC;Светлина + Боја (JC) +TP_COLORAPP_ALGO_JS;Светлина + Хроминанса (JS) +TP_COLORAPP_ALGO_QM;Осветљеност + Живост боја (QM) +TP_COLORAPP_ALGO_TOOLTIP;Омогућава избор између подскупа параметара или свих параметара. +TP_COLORAPP_BADPIXSL;Филтер врућих/лоших пиксела +TP_COLORAPP_BADPIXSL_TOOLTIP;Потискивање врућих/лоших (пресветло обојених) пиксела.\n0 = без ефекта\n1 = медијан\n2 = гаузијан.\n\nОве грешке се јављају услед CIECAM02 ограничења. Други начин за избегавање грешака је да подесите слику тако да избегнете веома тамне сенке. +TP_COLORAPP_BRIGHT;Осветљеност (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Осветљеност у CIECAM02 систему узима у обзир луминансу беле и разликује се у односу на Лаб и РГБ осветљеност. +TP_COLORAPP_CHROMA;Хрома (C) +TP_COLORAPP_CHROMA_M;Живост боја (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Живост боја у CIECAM02 систему се разликује у односу на Лаб и РГБ осветљеност. +TP_COLORAPP_CHROMA_S;Засићеност (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Засићеност у CIECAM02 систему се разликује у односу на Лаб и РГБ осветљеност. +TP_COLORAPP_CHROMA_TOOLTIP;Хрома у CIECAM02 систему се разликује у односу на Лаб и РГБ осветљеност. +TP_COLORAPP_CIECAT_DEGREE;прилагођавање за CAT02 +TP_COLORAPP_CONTRAST;Контраст (J) +TP_COLORAPP_CONTRAST_Q;Контраст (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Контраст у CIECAM02 систему за Q клизач; разликује се од Лаб и РГБ контраста. +TP_COLORAPP_CONTRAST_TOOLTIP;Контраст у CIECAM02 систему за J клизач; разликује се од Лаб и РГБ контраста. +TP_COLORAPP_CURVEEDITOR1;Крива тонова 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Приказује хистограм за L (Лаб) пре CIECAM02.\nУколико је омогућено „CIECAM02 излазни хистограм у кривуљама“, приказујер хистограм за J или Q након CIECAM02.\n\nJ и Q се не приказују у главној површи хистограма.\n\nЗа конаачни изла погледајте главну површ хистограма. +TP_COLORAPP_CURVEEDITOR2;Крива тонова 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Користи се на исти начин као и друга крива тонова експозиције. +TP_COLORAPP_CURVEEDITOR3;Крива боја +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Подешава било хрому, засићеност или живост боја.\n\nПриказује хистограм хроматисе (Лаб) пре CIECAM02.\nУколико је омогућено „CIECAM02 излазни хистограм у кривуљама“, приказује хистограм за C, s или M након CIECAM02.\n\nC, s и M се не приказују у главној површи за хистограм.\nЗа конаачни изла погледајте главну површ хистограма. +TP_COLORAPP_DATACIE;CIECAM02 излазни хистограм у кривуљама +TP_COLORAPP_DATACIE_TOOLTIP;Када је омогућено, хистограми у CIECAM02 кривим приказују приближне вредности/опсеге за J или Q, и C, s или M након CIECAM02 подешавања.\nОвај избор не утиче на приказ у главној површи за хистограм.\n\nКада је искључено, хистограми у CIECAM02 кривим приказују Лаб вредности пре CIECAM02 подешавања. +TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Уколико је штиклирано (препоручено), програм рачина оптималне вредности, које се затим користе за CAT02, а такође за читав CIECAM02.\nДа би поставили вредности ручне, одштиклирајте ово поље (препоручене су вредности изнад 65). +TP_COLORAPP_DEGREE_TOOLTIP;Количина преображаја CIE хроматске адаптације2002. +TP_COLORAPP_GAMUT;Контрола гамута (Лаб) +TP_COLORAPP_GAMUT_TOOLTIP;Омогућава контролу гамута у Лаб режиму. +TP_COLORAPP_HUE;Нијанса (h) +TP_COLORAPP_HUE_TOOLTIP;Нијанса (h) - угао између 0° и 360°. +TP_COLORAPP_LABEL;CIECAM 2002 модел изгледа боја +TP_COLORAPP_LABEL_CAM02;Подешавања слике +TP_COLORAPP_LABEL_SCENE;Услови сцене +TP_COLORAPP_LABEL_VIEWING;Услови за преглед +TP_COLORAPP_LIGHT;Светлина (J) +TP_COLORAPP_LIGHT_TOOLTIP;Светлина у CIECAM02 се разликује од Лаб или РГБ светлине. +TP_COLORAPP_MODEL;WP модел +TP_COLORAPP_MODEL_TOOLTIP;Модел беле-тачке.\n\nБаланс беле [RT] + [излаз]: баланс беле из програма се користи за кадар, CIECAM02 се поставља на D50, а баланс беле излазног уређаја се одређује из Подешавања > Управљање бојама.\n\nБаланс беле [RT+CAT02] + [излаз]: подешавања баланса беле из програма се користе од стране CAT02, а баланс беле излазног уређаја се одређује из Подешавања - Управљање бојама. +TP_COLORAPP_RSTPRO;Заштита црвене и боје коже +TP_COLORAPP_RSTPRO_TOOLTIP;Заштита црвене боје и боје коже (клизачи и криве). +TP_COLORAPP_SHARPCIE;--не користи се-- +TP_COLORAPP_SHARPCIE_TOOLTIP;--не користи се-- +TP_COLORAPP_SURROUND;Окружено +TP_COLORAPP_SURROUND_AVER;Просечно +TP_COLORAPP_SURROUND_DARK;Тамно +TP_COLORAPP_SURROUND_DIM;Затамњено +TP_COLORAPP_SURROUND_EXDARK;Јако тамно +TP_COLORAPP_SURROUND_TOOLTIP;Мења тонове и боје како би се прилагодило условима уређаја за приказ.\n\nПросечно: Просечно осветљено окружење (уобичајено). Слика неће бити измењена.\n\nЗатамњено: Затамњено окружење (ТВ). Слика ће постати за нијансу тамнија.\n\nТамно: Тамно окружење (пројектор). Слика ће постати још више тамна.\n\nЈако тамно: Екстрамно тамно окружење (cutsheet). Слика ће постати изузетно тамна. +TP_COLORAPP_SURSOURCE;Тамно окружење +TP_COLORAPP_SURSOURCE_TOOLTIP;Може да се користи уколико слика има тамне ивице. +TP_COLORAPP_TCMODE_BRIGHTNESS;Освтљеност +TP_COLORAPP_TCMODE_CHROMA;Хрома +TP_COLORAPP_TCMODE_COLORF;Живост боја +TP_COLORAPP_TCMODE_LABEL1;Режим криве 1 +TP_COLORAPP_TCMODE_LABEL2;Режим криве 2 +TP_COLORAPP_TCMODE_LABEL3;Крива у хром режиму +TP_COLORAPP_TCMODE_LIGHTNESS;Светлина +TP_COLORAPP_TCMODE_SATUR;Засићеност +TP_COLORAPP_TONECIE;Мапирање тонова у CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;Уколико је искључена ова опција, мапирање тонова се врши у Лаб окружењу.\nУколико је укључена, мапирање се врши помоћу CIECAM02.\nМорате користити алат за мапирање тонова како би ова опција била примењена. +TP_COLORAPP_WBCAM;Баланс беле [RT+CAT02] + [излаз] +TP_COLORAPP_WBRT;Баланс беле [RT] + [излаз] +TP_COLORBOOST_ACHANNEL;Канал „а“ +TP_COLORBOOST_AMOUNT;Количина +TP_COLORBOOST_AVOIDCOLORCLIP;Избегни одсецање боја +TP_COLORBOOST_BCHANNEL;Канал „б“ +TP_COLORBOOST_CHANNEL;Канал +TP_COLORBOOST_CHSEPARATE;раздвоји +TP_COLORBOOST_ENABLESATLIMITER;Омогући ограничење засићености +TP_COLORBOOST_LABEL;Појачање боја +TP_COLORBOOST_SATLIMIT;Граница за засићеност +TP_COLORDENOISE_EDGESENSITIVE;Осетљиво на ивице +TP_COLORDENOISE_EDGETOLERANCE;Толеранција ивице +TP_COLORDENOISE_LABEL;Уклаљање колорног шума +TP_COLORDENOISE_RADIUS;Полупречник +TP_COLORSHIFT_BLUEYELLOW;Плава-Жута +TP_COLORSHIFT_GREENMAGENTA;Зелена-Љубичаста +TP_COLORSHIFT_LABEL;Померање боја +TP_CROP_DPI;ТПИ= TP_CROP_FIXRATIO;Сразмерно: TP_CROP_GTDIAGONALS;Правило дијагонала +TP_CROP_GTEPASSPORT;Биометријски пасош +TP_CROP_GTFRAME;Оквир TP_CROP_GTGRID;Мрежа +TP_CROP_GTHARMMEANS1;Златни пресек 1 +TP_CROP_GTHARMMEANS2;Златни пресек 2 +TP_CROP_GTHARMMEANS3;Златни пресек 3 +TP_CROP_GTHARMMEANS4;Златни пресек 4 TP_CROP_GTNONE;Ништа TP_CROP_GTRULETHIRDS;Правило трећина TP_CROP_GUIDETYPE;Вођицe: @@ -627,10 +1077,22 @@ TP_DARKFRAME_LABEL;Тамни кадар TP_DEFRINGE_LABEL;Уклаљање ореола TP_DEFRINGE_RADIUS;Полупречник TP_DEFRINGE_THRESHOLD;Праг +TP_DETAIL_AMOUNT;Количина +TP_DIRPYRDENOISE_BLUE;Хроминанса: Плава-Жута TP_DIRPYRDENOISE_CHROMA;Боја +TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Може се употребити за raw или не-raw слике.\n\nЗа слике које нису у raw формату уклањање шума луминансе зависи од гаме улазног профила боја. Подразумева се употреба sRGB профила, па ће ефекат уклањања шума луминансе бити различит уколико се користи профил боја са другом вредношћу гаме. +TP_DIRPYRDENOISE_ENH;Побољшани режим +TP_DIRPYRDENOISE_ENH_TOOLTIP;Повећава квалитет уклањања шума на уштрб око 20% времена за обраду. TP_DIRPYRDENOISE_GAMMA;Гама +TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Гама утиче на јачину уклањања шума преко опсег тонова. Мања вредност ће утицати на сенке, већа ће повећати овај ефекат и на светлије тонове. TP_DIRPYRDENOISE_LABEL;Дирекционо пирамидно уклањање шума +TP_DIRPYRDENOISE_LDETAIL;Детаљи луминансе TP_DIRPYRDENOISE_LUMA;Луминанса +TP_DIRPYRDENOISE_METHOD;Начин +TP_DIRPYRDENOISE_METHOD_TOOLTIP;За рав слике можете користити РГБ или Лаб режиме.\n\nЗа остале слике се користи Лаб, без обзира на избор. +TP_DIRPYRDENOISE_PERF;РГБ режим (raw слике) +TP_DIRPYRDENOISE_RED;Хроминанса - црвена-зелена +TP_DIRPYRDENOISE_RGB;РГБ TP_DIRPYREQUALIZER_LABEL;Детаљни ниво контраста TP_DIRPYREQUALIZER_LUMACOARSEST;грубо TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Контраст- @@ -642,18 +1104,43 @@ TP_DISTORTION_AMOUNT;Количина TP_DISTORTION_AUTO;Сам исправи изобличења TP_DISTORTION_AUTO_TIP;(Експериментално) Аутоматски исправља изобличења неких апарата (М4/3, неки компакти, и др.) TP_DISTORTION_LABEL;Изобличења +TP_EPD_EDGESTOPPING;Изоштравање ивице +TP_EPD_LABEL;Мапирање тонова +TP_EPD_REWEIGHTINGITERATES;Број поновних мерења +TP_EPD_SCALE;Размера +TP_EPD_STRENGTH;Јачина +TP_EPD_TOOLTIP;Мапирање тонова је могуће у Лаб (стандардном) или CIECAM02 режиму.\n\nЗа рад у CIECAM02 режиму укључите:\n1. CIECAM02\n2. Алгоритам="Осветљење + живописност (QM)"\n3. "Мапирање тонова у CIECAM02 осветљењу (Q)" +TP_EQUALIZER_CONTRAST_MINUS;Контраст - +TP_EQUALIZER_CONTRAST_PLUS;Контраст + +TP_EQUALIZER_FINEST;најфиније +TP_EQUALIZER_LABEL;Таласно уједначење +TP_EQUALIZER_LARGEST;најгрубље +TP_EQUALIZER_NEUTRAL;Неутрално +TP_EXPOSCORR_LABEL;Raw бела тачка TP_EXPOSURE_AUTOLEVELS;Ауто-нивои +TP_EXPOSURE_AUTOLEVELS_TIP;Омогућава аутоматско одређивање нивоа, који подешава клизаче експозиције на основу податка о самој слици.\nУкључује чупање светлих делова уколико је неопходно. TP_EXPOSURE_BLACKLEVEL;Црна TP_EXPOSURE_BRIGHTNESS;Осветљеност TP_EXPOSURE_CLIP;Одсеци +TP_EXPOSURE_CLIP_TIP;Део пиксела које ће бити одсечени применом аутоматских нивоа. TP_EXPOSURE_COMPRHIGHLIGHTS;Сабијање светлог TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Праг за чупање светлих делова TP_EXPOSURE_COMPRSHADOWS;Сабијање сенки TP_EXPOSURE_CONTRAST;Контраст TP_EXPOSURE_CURVEEDITOR;Крива нијанси +TP_EXPOSURE_CURVEEDITOR1;Крива тонова 1 +TP_EXPOSURE_CURVEEDITOR2;Крива тонова 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Погледајте „Експозиција > Криве тонова“ унутар чланка на сајту RawPedia како би научили како се постижу најбољи резучтати успотребом две криве тонова. TP_EXPOSURE_EXPCOMP;Компензација TP_EXPOSURE_LABEL;Експозиција TP_EXPOSURE_SATURATION;Засићеност +TP_EXPOSURE_TCMODE_FILMLIKE;Налик фото-филму +TP_EXPOSURE_TCMODE_LABEL1;1. режим криве +TP_EXPOSURE_TCMODE_LABEL2;2. режим криве +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Утапање засићености и вредности +TP_EXPOSURE_TCMODE_STANDARD;Стандард +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Уравнотежени стандард +TP_EXPO_AFTER; Пре интерполације (пре превода у РГБ) TP_FLATFIELD_AUTOSELECT;Сам изабери TP_FLATFIELD_BLURRADIUS;Полупречник замућења TP_FLATFIELD_BLURTYPE;Замути @@ -662,63 +1149,178 @@ TP_FLATFIELD_BT_HORIZONTAL;Хоризонтално TP_FLATFIELD_BT_VERTHORIZ;Хориз. и вертик. TP_FLATFIELD_BT_VERTICAL;Вертикално TP_FLATFIELD_LABEL;Равно поље +TP_GAMMA_COMMENT;(онемогућен је излазни профил, осим „default“) +TP_GAMMA_CURV;Гама TP_GAMMA_FREE;Гама слобода TP_GAMMA_OUTPUT;Излазна гама TP_GAMMA_SLOP;нагиб (линеарни) +TP_GENERAL_11SCALE_TOOLTIP;Ефект овог алата или његових опција се види само у размери 1:1. +TP_GRADIENT_CENTER;Центар +TP_GRADIENT_CENTER_X;Центар X +TP_GRADIENT_CENTER_X_TOOLTIP;Помера градијент улево (негативне вредности) или удесно (позитивне вредности). +TP_GRADIENT_CENTER_Y;Центар Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Помера градијент на горе (негативне вредности) или на доле (позитивне вредности). +TP_GRADIENT_DEGREE;Угао +TP_GRADIENT_DEGREE_TOOLTIP;Окреће угао градијента за одабрани број степени. +TP_GRADIENT_FEATHER;Умекшавање +TP_GRADIENT_FEATHER_TOOLTIP;Ширина градијента у процентима дијагонале слике. +TP_GRADIENT_LABEL;Филтер градијента +TP_GRADIENT_STRENGTH;Јачина +TP_GRADIENT_STRENGTH_TOOLTIP;Јачина филтера у броју тачака прекида. TP_HLREC_BLEND;Утапање TP_HLREC_CIELAB;ЦиеЛаб стапање TP_HLREC_COLOR;Пропагинација боје +TP_HLREC_ENA_TOOLTIP;Може се активирати опцијом „Ауто-нивои“. TP_HLREC_LABEL;Чупање светлих делова TP_HLREC_LUMINANCE;Извлачење луминансе TP_HLREC_METHOD;Начин: +TP_HSVEQUALIZER1;Црвена +TP_HSVEQUALIZER2;Жута +TP_HSVEQUALIZER3;Лимун +TP_HSVEQUALIZER4;Зелена +TP_HSVEQUALIZER5;Водена +TP_HSVEQUALIZER6;Плава +TP_HSVEQUALIZER7;Љубичаста +TP_HSVEQUALIZER8;Магнета TP_HSVEQUALIZER_CHANNEL;ХСВ канал TP_HSVEQUALIZER_HUE;Нијанса TP_HSVEQUALIZER_LABEL;Уједначење ХСВ канала TP_HSVEQUALIZER_SAT;Засићеност TP_HSVEQUALIZER_VAL;Вредност TP_ICM_BLENDCMSMATRIX;Утопи светле делове у матрицу +TP_ICM_BLENDCMSMATRIX_TOOLTIP;Омогућите како би повратили преосветљене делове уколико користите LUT ICC профиле. +TP_ICM_DCPILLUMINANT;Илуминантно +TP_ICM_DCPILLUMINANT_INTERPOLATED;Интерполирано +TP_ICM_FILEDLGFILTERANY;Било која датотека +TP_ICM_FILEDLGFILTERICM;ИЦЦ профили +TP_ICM_GAMMABEFOREINPUT;Профил за примену Гаме TP_ICM_INPUTCAMERA;Подразумевано из апарата TP_ICM_INPUTCAMERAICC;Фото-апарат или стандардни ИЦЦ +TP_ICM_INPUTCAMERA_TOOLTIP;Користи просту матрицу боја из програма dcraw, унапређену RawTherapee верзију (која год да је доступна за ваш модел фото-апарата) или неки од уграђених DNG профила. TP_ICM_INPUTCUSTOM;Произвољно +TP_ICM_INPUTCUSTOM_TOOLTIP;Изаберите жељени DCP/ICC профил боја за фото-апарат. TP_ICM_INPUTDLGLABEL;Изаберите улазни ИЦЦ профил... TP_ICM_INPUTEMBEDDED;Угњежђено, уколико је могуће +TP_ICM_INPUTEMBEDDED_TOOLTIP;Користи профил боја који је уграђен у не-raw датотеке. TP_ICM_INPUTNONE;Нема профила +TP_ICM_INPUTNONE_TOOLTIP;Уопште не користи улазни профил боја.\nПримењује се само у посебним околностима. TP_ICM_INPUTPROFILE;Улазни профил TP_ICM_LABEL;ИЦМ TP_ICM_NOICM;No ICM: sRGB излаз TP_ICM_OUTPUTPROFILE;Излазни профил TP_ICM_SAVEREFERENCE;Сачувај слику као референцу за профил +TP_ICM_SAVEREFERENCE_TOOLTIP;Сачувај линеарну TIFF слику пре примене улазног профила. Резултат може да се користи за калибрацију и израду профила фото-апарата. +TP_ICM_TONECURVE;Користи DCP криву тонова +TP_ICM_TONECURVE_TOOLTIP;Употребљава уграђену DCP криву тонова. Ово подешавање је омогућено само ако изабрани DCP има криву тонова. TP_ICM_WORKINGPROFILE;Радни профил TP_IMPULSEDENOISE_LABEL;Импулсно уклањање шума TP_IMPULSEDENOISE_THRESH;Праг +TP_LABCURVE_AVOIDCOLORCLIP;Онемогући одсецање боје +TP_LABCURVE_AVOIDCOLORSHIFT;Избегни померање боја +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Поставља боје у опсег тренутног радног простора боја и примењује Мунселову корекцију. TP_LABCURVE_BRIGHTNESS;Осветљеност +TP_LABCURVE_CHROMATICITY;Боје +TP_LABCURVE_CHROMA_TOOLTIP;To apply ЦБ toning, set Chromaticity to -100. TP_LABCURVE_CONTRAST;Контраст TP_LABCURVE_CURVEEDITOR;Крива светлости +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Засићена зелена +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Пастелна зелена +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Пастелна црвена +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Засићена црвена +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Засићена плава +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Пастелна плава +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Пастелна жута +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Засићена жута +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Неутрално +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Испрано +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Пастелно +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Засићено +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Боја као функција боје C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Боја као функција нијансе C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Хроминанса на основу луминансе C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Нијанса као функција нијансе H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Светност као функција боје L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Светлост као функција нијансе L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Светлост као функција светлости L=f(L) +TP_LABCURVE_ENABLESATLIMITER;Укључи граничник засићености TP_LABCURVE_LABEL;Лаб крива +TP_LABCURVE_LCREDSK;Ограничи LC на црвену и боју коже +TP_LABCURVE_LCREDSK_TIP;Уколико је укључено, LC крива ће утицати само на црвену и боју коже.\nУ супротном се примењује на све тонове. +TP_LABCURVE_RSTPROTECTION;Заштита црвене и боје коже +TP_LABCURVE_RSTPRO_TOOLTIP;Може се користити са клизачем за Хроминансу и CC кривом. +TP_LABCURVE_SATLIMIT;Граничник засићености +TP_LABCURVE_SATURATION;Засићеност TP_LENSGEOM_AUTOCROP;Сам исеци TP_LENSGEOM_FILL;Сам попуни TP_LENSGEOM_LABEL;Објектив и геометрија +TP_LENSPROFILE_FILEDLGFILTERLCP;Фајлови са изобличењима објектива +TP_LENSPROFILE_LABEL;Профили за исправљање изобличења објектива +TP_LENSPROFILE_USECA;Исправљање хром. аберација +TP_LENSPROFILE_USEDIST;Исправљање изобличења +TP_LENSPROFILE_USEVIGN;Исправљање вињетарења +TP_LUMACURVE_BLACKLEVEL;Црна +TP_LUMACURVE_BRIGHTNESS;Осветљење +TP_LUMACURVE_COMPRHIGHLIGHTS;Сабијање светлог +TP_LUMACURVE_COMPRSHADOWS;Сабијање сенки +TP_LUMACURVE_CONTRAST;Контраст +TP_LUMACURVE_CURVEEDITOR;Крива лиминансе +TP_LUMACURVE_LABEL;Крива луминансе +TP_NEUTRAL;Неутрално +TP_NEUTRAL_TIP;Враћа клизаче експозиције на неутралне вредности.\nПримењује се на исте контроле као у Ауто нивои, без обзира на то да ли сте користили Ауто нивое или не. +TP_PCVIGNETTE_FEATHER;Умекшавање +TP_PCVIGNETTE_FEATHER_TOOLTIP;Умекшавање:\n0 = само углове,\n50 = на половину од центра,\n100 = центар. +TP_PCVIGNETTE_LABEL;Филтер вињетарења +TP_PCVIGNETTE_ROUNDNESS;Заокругљеност +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Заокругљеност:\n0 = квадрат,\n50 = прелаз од квадрата ка кругу,\n100 = круг. +TP_PCVIGNETTE_STRENGTH;Јачина +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Јачина филтера у прекидима (који се достижу на угловима). TP_PERSPECTIVE_HORIZONTAL;Хоризонтална TP_PERSPECTIVE_LABEL;Перспектива TP_PERSPECTIVE_VERTICAL;Вертикална +TP_PFCURVE_CURVEEDITOR_CH;Нијанса +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Одређује јачину уклаљања боје.\nВишље = више,\nНиже = мање. TP_PREPROCESS_GREENEQUIL;Калибрација зелене боје +TP_PREPROCESS_HOTDEADPIXFILT;Избаци прегореле и мртве пикселе +TP_PREPROCESS_HOTDEADPIXFILT_TOOLTIP;Покушава да уклони вруће и мртве пикселе. TP_PREPROCESS_LABEL;Предобрада TP_PREPROCESS_LINEDENOISE;Линијски филтер шума TP_PREPROCESS_NO_FOUND;Није пронађено TP_RAWCACORR_AUTO;Исправи хроматске аберације TP_RAWCACORR_CABLUE;Плава TP_RAWCACORR_CARED;Црвена +TP_RAWEXPOS_BLACKONE;Ниво црне: Црвена TP_RAWEXPOS_BLACKS;Ниво црне +TP_RAWEXPOS_BLACKTHREE;Ниво црне: Зелена 2 +TP_RAWEXPOS_BLACKTWO;Ниво црне: Плава +TP_RAWEXPOS_BLACKZERO;Ниво црне: Зелена 1 (водећа) TP_RAWEXPOS_LINEAR;Линеарни фактор корекције TP_RAWEXPOS_PRESER;Очување светлих делова TP_RAWEXPOS_TWOGREEN;Обе зелене +TP_RAW_ALLENHANCE;Уклони артафакте/шум након расклапања TP_RAW_DCBENHANCE;Примени ДЦБ побољшање TP_RAW_DCBITERATIONS;Број ДЦБ пролаза TP_RAW_DMETHOD;Начин +TP_RAW_DMETHOD_PROGRESSBAR;%1 расклапам мозаик... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Побољшавам мозаик... +TP_RAW_DMETHOD_TOOLTIP;Примедба: IGV и LMMSE служе код великих ИСО вредности слике и служе за испомоћ при уклањање шума како не би дошло до ефекта постеризације или испраног излгеда. TP_RAW_FALSECOLOR;Кораци за пригушивање лажне боје TP_RAW_LABEL;Расклапање мозаика +TP_RAW_LMMSEITERATIONS;Кораци LMMSE побољшања +TP_RAW_LMMSE_TOOLTIP;Додаје гаму (корак 1), медијан (кораци 2-4) и побољшања (кораци 5-6) како би смањио неисправности и побољшао однос сигнал-према-шум. TP_RESIZE_APPLIESTO;Примени на: +TP_RESIZE_BICUBIC;Бикубично +TP_RESIZE_BICUBICSF;Бикубично (мекше) +TP_RESIZE_BICUBICSH;Бикубично (оштрије) +TP_RESIZE_BILINEAR;Билинеарно TP_RESIZE_CROPPEDAREA;Исечену област +TP_RESIZE_DOWNSCALEB;Смањење размере (боље) +TP_RESIZE_DOWNSCALEF;Смањење размере (брже) TP_RESIZE_FITBOX;Ширину и висину TP_RESIZE_FULLIMAGE;Целу слику TP_RESIZE_H;В: @@ -731,15 +1333,26 @@ TP_RESIZE_SCALE;Умањење TP_RESIZE_SPECIFY;Изабери: TP_RESIZE_W;Ш: TP_RESIZE_WIDTH;Ширину +TP_RGBCURVES_BLUE;П +TP_RGBCURVES_CHANNEL;Канал +TP_RGBCURVES_GREEN;З +TP_RGBCURVES_LABEL;РГБ криве +TP_RGBCURVES_LUMAMODE;Режим луминансе +TP_RGBCURVES_LUMAMODE_TOOLTIP;Режим лиминансе омогућава да мењате удео црвеног, зеленог и плавог канала из луминансе слике што не утиче на промену боје фотографије. +TP_RGBCURVES_RED;Ц +TP_ROTATE_AUTOCROP;Сам исеци TP_ROTATE_DEGREE;Степени: +TP_ROTATE_FILL;Попуни TP_ROTATE_LABEL;Ротација TP_ROTATE_SELECTLINE; Постави праву линију +TP_SAVEDIALOG_OK_TIP;Пречица: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Светло TP_SHADOWSHLIGHTS_HLTONALW;Ширина тонова TP_SHADOWSHLIGHTS_LABEL;Сенке/Светло TP_SHADOWSHLIGHTS_LOCALCONTR;Локални контраст TP_SHADOWSHLIGHTS_RADIUS;Полупречник TP_SHADOWSHLIGHTS_SHADOWS;Сенке +TP_SHADOWSHLIGHTS_SHARPMASK;Оштра маска TP_SHADOWSHLIGHTS_SHTONALW;Ширина тонова TP_SHARPENEDGE_AMOUNT;Количина TP_SHARPENEDGE_LABEL;Ивице @@ -759,11 +1372,29 @@ TP_SHARPENING_RLD_AMOUNT;Количина TP_SHARPENING_RLD_DAMPING;Пригушивање TP_SHARPENING_RLD_ITERATIONS;Понављања TP_SHARPENING_THRESHOLD;Праг +TP_SHARPENING_TOOLTIP;Очекујте нешто другачији ефекат када користите CIECAM02. Уколико приметите разлике, подесите их по свом укусу. TP_SHARPENING_USM;Оштрина маске TP_SHARPENMICRO_AMOUNT;Количина TP_SHARPENMICRO_LABEL;Микроконттраст TP_SHARPENMICRO_MATRIX;3×3 матрица уместо 5×5 TP_SHARPENMICRO_UNIFORMITY;Уједначеност +TP_VIBRANCE_AVOIDCOLORSHIFT;Избегни померање боја +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Боја коже +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Црвена/љубичаста +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Црвена +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Црвена/жута +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Жута +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Нијанса на основу HUE H=f(H) +TP_VIBRANCE_LABEL;Живост боја +TP_VIBRANCE_PASTELS;Пастелне боје +TP_VIBRANCE_PASTSATTOG;Повежи засићене и пастелне боје +TP_VIBRANCE_PROTECTSKINS;Очувај боју коже +TP_VIBRANCE_PSTHRESHOLD;Праг за пастелне/засићене боје +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Праг за засићене боје +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Вертикална оса садржи пастелне тонове при дну и засићене тонове на врху.\nХоризонтална оса представља опсег засићења. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Тежина прелаза пастелних/засићених боја +TP_VIBRANCE_SATURATED;Засићене боје TP_VIGNETTING_AMOUNT;Количина TP_VIGNETTING_CENTER;Центар TP_VIGNETTING_CENTER_X;Центар X @@ -773,13 +1404,50 @@ TP_VIGNETTING_RADIUS;Полупречник TP_VIGNETTING_STRENGTH;Јачина TP_WBALANCE_AUTO;Сам одреди TP_WBALANCE_CAMERA;Из апарата +TP_WBALANCE_CLOUDY;Облачно време TP_WBALANCE_CUSTOM;Произвољно +TP_WBALANCE_DAYLIGHT;Дневно светло (сунчано) +TP_WBALANCE_EQBLUERED;Баланс црвене и плаве +TP_WBALANCE_EQBLUERED_TOOLTIP;Дозвољава нестандардно подешавање баланса беле помоћу баланса плаве и црвене боје.\nОво је корисно када:\nа) сликате у нестандардним условима светла (нпр. под водом),\nб) су услови далеко другачији од оних у којима је извршена калибрација,\nв) су матрице или ИЦЦ профили неодговарајући. +TP_WBALANCE_FLASH55;Леика +TP_WBALANCE_FLASH60;Стандардни, Кенон, Пентакс, Олимпус +TP_WBALANCE_FLASH65;Никон, Панасоник, Сони, Минолта +TP_WBALANCE_FLASH_HEADER;Блиц +TP_WBALANCE_FLUO1;F1 - Дневно светло +TP_WBALANCE_FLUO2;F2 - Хладно светло +TP_WBALANCE_FLUO3;F3 - Бело светло +TP_WBALANCE_FLUO4;F4 - Топло-бело светло +TP_WBALANCE_FLUO5;F5 - Дневно светло +TP_WBALANCE_FLUO6;F6 - Светло-бело светло +TP_WBALANCE_FLUO7;F7 - D65 симулатор дневне светлости +TP_WBALANCE_FLUO8;F8 - D50 / Силванија F40 дизајн +TP_WBALANCE_FLUO9;F9 - Хладна, делукс-бела +TP_WBALANCE_FLUO10;F10 - Филипс TL85 +TP_WBALANCE_FLUO11;F11 - Филипс TL84 +TP_WBALANCE_FLUO12;F12 - Филипс TL83 +TP_WBALANCE_FLUO_HEADER;Неонско светло TP_WBALANCE_GREEN;Зеленило +TP_WBALANCE_GTI;ГеТеИ +TP_WBALANCE_HMI;ХаЕмИ +TP_WBALANCE_JUDGEIII;ЏудIII TP_WBALANCE_LABEL;Баланс беле +TP_WBALANCE_LAMP_HEADER;Лампа +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;ЛЕД осветљење +TP_WBALANCE_LED_LSI;LSI Лумелекс 2040 TP_WBALANCE_METHOD;Начин: +TP_WBALANCE_SHADE;У сенци TP_WBALANCE_SIZE;Величина: +TP_WBALANCE_SOLUX35;Солукс 3500K +TP_WBALANCE_SOLUX41;Солукс 4100K +TP_WBALANCE_SOLUX47;Солукс 4700K (произвођач) +TP_WBALANCE_SOLUX47_NG;Солукс 4700K (Нац. галерија) TP_WBALANCE_SPOTWB;Из тачке TP_WBALANCE_TEMPERATURE;Температура +TP_WBALANCE_TUNGSTEN;Обична сијалица +TP_WBALANCE_WATER1;Подводна фотографија 1 +TP_WBALANCE_WATER2;Подводна фотографија 2 +TP_WBALANCE_WATER_HEADER;Подводна фотографија ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Отвара нови прозор са детаљима ZOOMPANEL_ZOOM100;Повећава преглед на 100% z @@ -791,67 +1459,30 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ABOUT_TAB_RELEASENOTES;Release Notes -!BATCHQUEUE_DESTFILENAME;Path and file name !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. +!DIRBROWSER_FOLDERS;Folders !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. -!EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) -!EXPORT_BYPASS_ALL;Select / Unselect All -!EXPORT_BYPASS_DEFRINGE;Bypass Defringe -!EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction -!EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -!EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction -!EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression -!EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps -!EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -!EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame -!EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field -!EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration -!EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter -!EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -!EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening -!EXPORT_BYPASS_SHARPENING;Bypass Sharpening -!EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast -!EXPORT_BYPASS_SH_HQ;Bypass Sharp Mask Shadows/Highlights -!EXPORT_FASTEXPORTOPTIONS;Fast Export Options -!EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -!EXPORT_MAXHEIGHT;Maximum height: -!EXPORT_MAXWIDTH;Maximum width: -!EXPORT_PUTTOQUEUEFAST; Put to queue for fast export -!EXPORT_RAW_DMETHOD;Demosaic method -!EXTPROGTARGET_1;raw -!EXTPROGTARGET_2;queue-processed -!FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_EXTPROGMENU;Open with -!FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow !FILEBROWSER_POPUPCOLORLABEL3;Label: Green !FILEBROWSER_POPUPCOLORLABEL4;Label: Blue !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple -!FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) -!FILEBROWSER_POPUPRANK;Rank +!FILEBROWSER_POPUPOPENINEDITOR;Open in Editor !FILEBROWSER_POPUPRANK0;Unrank !FILEBROWSER_POPUPRANK1;Rank 1 * !FILEBROWSER_POPUPRANK2;Rank 2 ** !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** -!FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -!FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -!FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -!FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -!FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -!FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles !FILECHOOSER_FILTER_CURVE;Curve files @@ -860,111 +1491,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_ASIMAGE;As Image -!GENERAL_AUTO;Automatic -!GENERAL_CLOSE;Close -!GENERAL_WARNING;Warning -!HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. -!HISTORY_MSG_151;Vibrance -!HISTORY_MSG_152;Vib - Pastel tones -!HISTORY_MSG_153;Vib - Saturated tones -!HISTORY_MSG_154;Vib - Protect skin-tones -!HISTORY_MSG_155;Vib - Avoid color shift -!HISTORY_MSG_156;Vib - Link pastel/saturated -!HISTORY_MSG_157;Vib - P/S threshold -!HISTORY_MSG_158;TM - Strength -!HISTORY_MSG_159;TM - Edge stopping -!HISTORY_MSG_160;TM - Scale -!HISTORY_MSG_161;TM - Reweighting iterates -!HISTORY_MSG_162;Tone Mapping -!HISTORY_MSG_163;RGB Curves - Red -!HISTORY_MSG_164;RGB Curves - Green -!HISTORY_MSG_165;RGB Curves - Blue -!HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_167;Demosaicing method -!HISTORY_MSG_168;L*a*b* - CC curve -!HISTORY_MSG_169;L*a*b* - CH curve -!HISTORY_MSG_170;Vibrance - HH curve -!HISTORY_MSG_171;L*a*b* - LC curve -!HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail -!HISTORY_MSG_174;CIECAM02 -!HISTORY_MSG_175;CAM02 - CAT02 adaptation -!HISTORY_MSG_176;CAM02 - Viewing surround -!HISTORY_MSG_177;CAM02 - Scene luminosity -!HISTORY_MSG_178;CAM02 - Viewing luminosity -!HISTORY_MSG_179;CAM02 - White-point model -!HISTORY_MSG_180;CAM02 - Lightness (J) -!HISTORY_MSG_181;CAM02 - Chroma (C) -!HISTORY_MSG_182;CAM02 - Automatic CAT02 -!HISTORY_MSG_183;CAM02 - Contrast (J) -!HISTORY_MSG_184;CAM02 - Scene surround -!HISTORY_MSG_185;CAM02 - Gamut control -!HISTORY_MSG_186;CAM02 - Algorithm -!HISTORY_MSG_187;CAM02 - Red/skin prot. -!HISTORY_MSG_188;CAM02 - Brightness (Q) -!HISTORY_MSG_189;CAM02 - Contrast (Q) -!HISTORY_MSG_190;CAM02 - Saturation (S) -!HISTORY_MSG_191;CAM02 - Colorfulness (M) -!HISTORY_MSG_192;CAM02 - Hue (h) -!HISTORY_MSG_193;CAM02 - Tone curve 1 -!HISTORY_MSG_194;CAM02 - Tone curve 2 -!HISTORY_MSG_195;CAM02 - Tone curve 1 -!HISTORY_MSG_196;CAM02 - Tone curve 2 -!HISTORY_MSG_197;CAM02 - Color curve -!HISTORY_MSG_198;CAM02 - Color curve -!HISTORY_MSG_199;CAM02 - Output histograms -!HISTORY_MSG_200;CAM02 - Tone mapping -!HISTORY_MSG_201;NR - Chrominance - R&G -!HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method -!HISTORY_MSG_204;LMMSE enhancement steps -!HISTORY_MSG_205;CAM02 - Hot/bad pixel filter -!HISTORY_MSG_206;CAT02 - Auto scene luminosity -!HISTORY_MSG_207;Defringe - Hue curve -!HISTORY_MSG_208;WB - B/R equalizer -!HISTORY_MSG_210;GF - Angle -!HISTORY_MSG_211;Graduated Filter -!HISTORY_MSG_212;VF - Strength -!HISTORY_MSG_213;Vignette Filter -!HISTORY_MSG_214;Black-and-White -!HISTORY_MSG_215;B&W - CM - Red -!HISTORY_MSG_216;B&W - CM - Green -!HISTORY_MSG_217;B&W - CM - Blue -!HISTORY_MSG_218;B&W - Gamma - Red -!HISTORY_MSG_219;B&W - Gamma - Green -!HISTORY_MSG_220;B&W - Gamma - Blue -!HISTORY_MSG_221;B&W - Color filter -!HISTORY_MSG_222;B&W - Presets -!HISTORY_MSG_223;B&W - CM - Orange -!HISTORY_MSG_224;B&W - CM - Yellow -!HISTORY_MSG_225;B&W - CM - Cyan -!HISTORY_MSG_226;B&W - CM - Magenta -!HISTORY_MSG_227;B&W - CM - Purple -!HISTORY_MSG_228;B&W - Luminance equalizer -!HISTORY_MSG_229;B&W - Luminance equalizer -!HISTORY_MSG_230;B&W - Mode -!HISTORY_MSG_231;B&W - 'Before' curve -!HISTORY_MSG_232;B&W - 'Before' curve type -!HISTORY_MSG_233;B&W - 'After' curve -!HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer -!HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer -!HISTORY_MSG_238;GF - Feather -!HISTORY_MSG_239;GF - Strength -!HISTORY_MSG_240;GF - Center -!HISTORY_MSG_241;VF - Feather -!HISTORY_MSG_242;VF - Roundness -!HISTORY_MSG_243;VC - Radius -!HISTORY_MSG_244;VC - Strength -!HISTORY_MSG_245;VC - Center -!HISTORY_MSG_246;L*a*b* - CL curve -!HISTORY_MSG_247;L*a*b* - LH curve -!HISTORY_MSG_248;L*a*b* - HH curve -!HISTORY_MSG_249;CbDL - Threshold -!HISTORY_MSG_250;NR - Enhanced -!HISTORY_MSG_251;B&W - Algorithm !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue @@ -1156,29 +1682,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_440;CbDL - Method !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale -!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s -!MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -!MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 -!MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). -!MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -!MAIN_MSG_OPERATIONCANCELLED;Operation cancelled -!MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. -!MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! -!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. -!MAIN_TAB_EXPORT; Fast Export !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet !MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w -!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 -!MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 -!MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 -!MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. -!MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!MAIN_TOOLTIP_PREVIEWG;Preview the Green channel.\nShortcut: g -!MAIN_TOOLTIP_PREVIEWL;Preview the Luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r -!MAIN_TOOLTIP_THRESHOLD;Threshold !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1190,26 +1696,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: -!NAVIGATOR_XY_FULL;Width: %1, Height: %2 -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!PARTIALPASTE_CHANNELMIXERBW;Black-and-white -!PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning -!PARTIALPASTE_EPD;Tone mapping !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_GRADIENT;Graduated filter -!PARTIALPASTE_LENSPROFILE;Lens correction profile -!PARTIALPASTE_PCVIGNETTE;Vignette filter +!PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_RGBCURVES;RGB curves -!PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1217,15 +1712,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_AUTLISVLOW;None !PREFERENCES_AUTLOW;Low !PREFERENCES_AUTSTD;Standard -!PREFERENCES_BEHADDALL;All to 'Add' -!PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. -!PREFERENCES_BEHSETALL;All to 'Set' -!PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. -!PREFERENCES_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization !PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1234,30 +1721,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_CURVEBBOXPOS_BELOW;Below !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID -!PREFERENCES_D50;5000K -!PREFERENCES_D55;5500K -!PREFERENCES_D60;6000K -!PREFERENCES_D65;6500K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLUOF2;Fluorescent F2 -!PREFERENCES_FLUOF7;Fluorescent F7 -!PREFERENCES_FLUOF11;Fluorescent F11 !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. -!PREFERENCES_GREY;Output device's Yb luminance (%) -!PREFERENCES_GREY05;Yb=05 CIE L#30 -!PREFERENCES_GREY10;Yb=10 CIE L#40 -!PREFERENCES_GREY15;Yb=15 CIE L#45 -!PREFERENCES_GREY18;Yb=18 CIE L#50 -!PREFERENCES_GREY23;Yb=23 CIE L#55 -!PREFERENCES_GREY30;Yb=30 CIE L#60 -!PREFERENCES_GREY40;Yb=40 CIE L#70 !PREFERENCES_GREYSC;Scene Yb luminance (%) !PREFERENCES_GREYSC18;Yb=18 CIE L#50 !PREFERENCES_GREYSCA;Automatic @@ -1273,7 +1742,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders !PREFERENCES_MED;Medium (Tile/2) -!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MIN;Mini (100x115) !PREFERENCES_MONINTENT;Default monitor intent !PREFERENCES_MONPROFILE;Default monitor profile @@ -1290,191 +1758,29 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_PROFILE_NONE;None !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. !PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings !PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files !PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar !PREFERENCES_SIMPLAUT;Tool mode !PREFERENCES_SMA;Small (250x287) !PREFERENCES_STDAUT;Standard -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality !PREFERENCES_TIMAX;High !PREFERENCES_TINB;Number of tiles !PREFERENCES_TISTD;Standard -!PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text -!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles -!PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) !PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' !PREFERENCES_WLONE;One level !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No -!PROFILEPANEL_COPYPPASTE;Parameters to copy -!PROFILEPANEL_GLOBALPROFILES;Bundled profiles -!PROFILEPANEL_LOADPPASTE;Parameters to load -!PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. -!PROFILEPANEL_MYPROFILES;My profiles -!PROFILEPANEL_PASTEPPASTE;Parameters to paste -!PROFILEPANEL_PINTERNAL;Neutral -!PROFILEPANEL_SAVEPPASTE;Parameters to save -!PROGRESSBAR_NOIMAGES;No images found -!PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved -!PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added -!SAVEDLG_FORCEFORMATOPTS;Force saving options -!SAVEDLG_SUBSAMP;Subsampling -!SAVEDLG_SUBSAMP_1;Best compression -!SAVEDLG_SUBSAMP_2;Balanced -!SAVEDLG_SUBSAMP_3;Best quality -!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SAVEDLG_WARNFILENAME;File will be named -!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left -!THRESHOLDSELECTOR_BR;Bottom-right -!THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. -!THRESHOLDSELECTOR_T;Top -!THRESHOLDSELECTOR_TL;Top-left -!THRESHOLDSELECTOR_TR;Top-right -!TP_BWMIX_ALGO;Algorithm OYCPM -!TP_BWMIX_ALGO_LI;Linear -!TP_BWMIX_ALGO_SP;Special effects -!TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -!TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. -!TP_BWMIX_CC_ENABLED;Adjust complementary color -!TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. -!TP_BWMIX_CHANNEL;Luminance equalizer -!TP_BWMIX_CURVEEDITOR1;'Before' curve -!TP_BWMIX_CURVEEDITOR2;'After' curve -!TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. -!TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. -!TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. -!TP_BWMIX_FILTER;Color Filter -!TP_BWMIX_FILTER_BLUE;Blue -!TP_BWMIX_FILTER_BLUEGREEN;Blue-Green -!TP_BWMIX_FILTER_GREEN;Green -!TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow -!TP_BWMIX_FILTER_NONE;None -!TP_BWMIX_FILTER_PURPLE;Purple -!TP_BWMIX_FILTER_RED;Red -!TP_BWMIX_FILTER_REDYELLOW;Red-Yellow !TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. !TP_BWMIX_FILTER_YELLOW;Yellow !TP_BWMIX_GAMMA;Gamma Correction !TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. -!TP_BWMIX_LABEL;Black-and-White -!TP_BWMIX_MET;Method -!TP_BWMIX_MET_CHANMIX;Channel Mixer -!TP_BWMIX_MET_DESAT;Desaturation -!TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. -!TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% -!TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. -!TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. -!TP_BWMIX_SETTING;Presets -!TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. -!TP_BWMIX_SET_HIGHCONTAST;High contrast -!TP_BWMIX_SET_HIGHSENSIT;High Sensitivity -!TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic -!TP_BWMIX_SET_INFRARED;Infrared -!TP_BWMIX_SET_LANDSCAPE;Landscape -!TP_BWMIX_SET_LOWSENSIT;Low Sensitivity -!TP_BWMIX_SET_LUMINANCE;Luminance -!TP_BWMIX_SET_NORMCONTAST;Normal Contrast -!TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -!TP_BWMIX_SET_PANCHRO;Panchromatic -!TP_BWMIX_SET_PORTRAIT;Portrait -!TP_BWMIX_SET_RGBABS;Absolute RGB -!TP_BWMIX_SET_RGBREL;Relative RGB -!TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -!TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM -!TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like -!TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending -!TP_BWMIX_TCMODE_STANDARD;B&W Standard -!TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -!TP_BWMIX_VAL;L !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_COLORAPP_ADAPTSCENE;Scene luminosity -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environement (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing luminosity (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environnement\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from Exif data.\nTo set the value manually, uncheck the checkbox first. -!TP_COLORAPP_ALGO;Algorithm -!TP_COLORAPP_ALGO_ALL;All -!TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) -!TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) -!TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) -!TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. -!TP_COLORAPP_BADPIXSL;Hot/bad pixel filter -!TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -!TP_COLORAPP_BRIGHT;Brightness (Q) -!TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. -!TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) -!TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. -!TP_COLORAPP_CHROMA_S;Saturation (S) -!TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -!TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -!TP_COLORAPP_CONTRAST;Contrast (J) -!TP_COLORAPP_CONTRAST_Q;Contrast (Q) -!TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast in CIECAM02 for the Q slider; it differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast in CIECAM02 for the J slider; it differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -!TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. -!TP_COLORAPP_CURVEEDITOR2;Tone curve 2 -!TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. -!TP_COLORAPP_CURVEEDITOR3;Color curve -!TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. -!TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves -!TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. -!TP_COLORAPP_GAMUT;Gamut control (L*a*b*) -!TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. -!TP_COLORAPP_HUE;Hue (h) -!TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. -!TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 -!TP_COLORAPP_LABEL_CAM02;Image Adjustments -!TP_COLORAPP_LABEL_SCENE;Scene Conditions -!TP_COLORAPP_LABEL_VIEWING;Viewing Conditions -!TP_COLORAPP_LIGHT;Lightness (J) -!TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -!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 Preferences > Color Management.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Preferences - Color Management. -!TP_COLORAPP_RSTPRO;Red & skin-tones protection -!TP_COLORAPP_RSTPRO_TOOLTIP;Red and skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- -!TP_COLORAPP_SURROUND;Surround -!TP_COLORAPP_SURROUND_AVER;Average -!TP_COLORAPP_SURROUND_DARK;Dark -!TP_COLORAPP_SURROUND_DIM;Dim -!TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. -!TP_COLORAPP_SURSOURCE;Dark surround -!TP_COLORAPP_SURSOURCE_TOOLTIP;Can be used if image has a dark border. -!TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness -!TP_COLORAPP_TCMODE_CHROMA;Chroma -!TP_COLORAPP_TCMODE_COLORF;Colorfulness -!TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 -!TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 -!TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -!TP_COLORAPP_TCMODE_LIGHTNESS;Lightness -!TP_COLORAPP_TCMODE_SATUR;Saturation -!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_WBCAM;WB [RT+CAT02] + [output] -!TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1511,8 +1817,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_COLORTONING_TWOBY;Special a* and b* !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma -!TP_CROP_GTEPASSPORT;Biometric Passport -!TP_CROP_GTFRAME;Frame !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1525,7 +1829,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global !TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow !TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. !TP_DIRPYRDENOISE_CCCURVE;Chrominance curve !TP_DIRPYRDENOISE_CHROMAFR;Chrominance @@ -1535,14 +1838,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma !TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ. -!TP_DIRPYRDENOISE_ENH;Enhanced mode -!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. !TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABM;L*a*b* !TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail !TP_DIRPYRDENOISE_LM;Luminance only !TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) !TP_DIRPYRDENOISE_LTYPE;Luminance control @@ -1554,10 +1852,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_MEDMETHOD;Median method !TP_DIRPYRDENOISE_MEDTYPE;Median type !TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising -!TP_DIRPYRDENOISE_METHOD;Method !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. !TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 @@ -1569,8 +1865,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview !TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB !TP_DIRPYRDENOISE_RGBM;RGB !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High @@ -1585,26 +1879,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection !TP_DIRPYREQUALIZER_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_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. -!TP_EPD_EDGESTOPPING;Edge stopping !TP_EPD_GAMMA;Gamma -!TP_EPD_LABEL;Tone Mapping -!TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -!TP_EPD_SCALE;Scale -!TP_EPD_STRENGTH;Strength -!TP_EPD_TOOLTIP;Tone mapping is possible in L*a*b* mode (standard) and CIECAM02 mode.\n\nWhen in L*a*b* mode, tone mapping can also be used on the residual image of the Wavelet Levels tool.\n\nTo engage CIECAM02 tone mapping mode enable the following settings:\n1. CIECAM02\n2. Algorithm="Brightness + Colorfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" -!TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. -!TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. -!TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 -!TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 -!TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. -!TP_EXPOSURE_TCMODE_FILMLIKE;Film-like -!TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 -!TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -!TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -!TP_EXPOSURE_TCMODE_STANDARD;Standard -!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMSIMULATION_LABEL;Film Simulation @@ -1613,90 +1890,17 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. -!TP_GAMMA_CURV;Gamma -!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. -!TP_GRADIENT_CENTER;Center -!TP_GRADIENT_CENTER_X;Center X -!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). -!TP_GRADIENT_CENTER_Y;Center Y -!TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). -!TP_GRADIENT_DEGREE;Angle -!TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. -!TP_GRADIENT_FEATHER;Feather -!TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. -!TP_GRADIENT_LABEL;Graduated Filter -!TP_GRADIENT_STRENGTH;Strength -!TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -!TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only enabled if the selected DCP has any. !TP_ICM_APPLYHUESATMAP;Base table !TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled if the selected DCP has one. !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one. -!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles. -!TP_ICM_DCPILLUMINANT;Illuminant -!TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated !TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only enabled if a Dual-Illuminant DCP with interpolation support is selected. !TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. -!TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. -!TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. -!TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. -!TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. -!TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. -!TP_ICM_TONECURVE;Tone curve -!TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only enabled if the selected DCP has a tone curve. -!TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift -!TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. -!TP_LABCURVE_CHROMATICITY;Chromaticity -!TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -!TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated -!TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated -!TP_LABCURVE_CURVEEDITOR_CC;CC -!TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral -!TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull -!TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel -!TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated -!TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) -!TP_LABCURVE_CURVEEDITOR_CH;CH -!TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) -!TP_LABCURVE_CURVEEDITOR_CL;CL -!TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) -!TP_LABCURVE_CURVEEDITOR_HH;HH -!TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) -!TP_LABCURVE_CURVEEDITOR_LC;LC -!TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) -!TP_LABCURVE_CURVEEDITOR_LH;LH -!TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) -!TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) -!TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones -!TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. -!TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection -!TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. -!TP_LENSPROFILE_LABEL;Lens Correction Profile -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction -!TP_NEUTRAL;Reset -!TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -!TP_PCVIGNETTE_FEATHER;Feather -!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -!TP_PCVIGNETTE_LABEL;Vignette Filter -!TP_PCVIGNETTE_ROUNDNESS;Roundness -!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -!TP_PCVIGNETTE_STRENGTH;Strength -!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). -!TP_PFCURVE_CURVEEDITOR_CH;Hue -!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1712,13 +1916,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... -!TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look. !TP_RAW_HD;Threshold !TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. -!TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1802,33 +2001,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask -!TP_RGBCURVES_BLUE;B -!TP_RGBCURVES_CHANNEL;Channel -!TP_RGBCURVES_GREEN;G -!TP_RGBCURVES_LABEL;RGB Curves -!TP_RGBCURVES_LUMAMODE;Luminosity mode -!TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. -!TP_RGBCURVES_RED;R -!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter -!TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask -!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste. -!TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift -!TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) -!TP_VIBRANCE_LABEL;Vibrance -!TP_VIBRANCE_PASTELS;Pastel Tones -!TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones -!TP_VIBRANCE_PROTECTSKINS;Protect skin-tones -!TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold -!TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold -!TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. -!TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting -!TP_VIBRANCE_SATURATED;Saturated Tones !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -1992,41 +2164,4 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_WBALANCE_CLOUDY;Cloudy -!TP_WBALANCE_DAYLIGHT;Daylight (sunny) -!TP_WBALANCE_EQBLUERED;Blue/Red equalizer -!TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. -!TP_WBALANCE_FLASH55;Leica -!TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus -!TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -!TP_WBALANCE_FLASH_HEADER;Flash -!TP_WBALANCE_FLUO1;F1 - Daylight -!TP_WBALANCE_FLUO2;F2 - Cool White -!TP_WBALANCE_FLUO3;F3 - White -!TP_WBALANCE_FLUO4;F4 - Warm White -!TP_WBALANCE_FLUO5;F5 - Daylight -!TP_WBALANCE_FLUO6;F6 - Lite White -!TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator -!TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design -!TP_WBALANCE_FLUO9;F9 - Cool White Deluxe -!TP_WBALANCE_FLUO10;F10 - Philips TL85 -!TP_WBALANCE_FLUO11;F11 - Philips TL84 -!TP_WBALANCE_FLUO12;F12 - Philips TL83 -!TP_WBALANCE_FLUO_HEADER;Fluorescent -!TP_WBALANCE_GTI;GTI -!TP_WBALANCE_HMI;HMI -!TP_WBALANCE_JUDGEIII;JudgeIII -!TP_WBALANCE_LAMP_HEADER;Lamp -!TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 -!TP_WBALANCE_LED_HEADER;LED -!TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -!TP_WBALANCE_SHADE;Shade -!TP_WBALANCE_SOLUX35;Solux 3500K -!TP_WBALANCE_SOLUX41;Solux 4100K -!TP_WBALANCE_SOLUX47;Solux 4700K (vendor) -!TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -!TP_WBALANCE_TUNGSTEN;Tungsten -!TP_WBALANCE_WATER1;UnderWater 1 -!TP_WBALANCE_WATER2;UnderWater 2 -!TP_WBALANCE_WATER_HEADER;UnderWater !ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 5a5f9d454..8f64eddec 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -3,14 +3,18 @@ ABOUT_TAB_BUILD;Izdanje ABOUT_TAB_CREDITS;Zasluge ABOUT_TAB_LICENSE;Licenca +ABOUT_TAB_RELEASENOTES;Beleške o izdanju ABOUT_TAB_SPLASH;Uvod ADJUSTER_RESET_TO_DEFAULT;Vrati na podrazumevano BATCHQUEUE_AUTOSTART;Sam započni +BATCHQUEUE_DESTFILENAME;Putanja i ime datoteke BATCH_PROCESSING;obrada CURVEEDITOR_CURVE;Krivulja CURVEEDITOR_CURVES;Krivulje CURVEEDITOR_CUSTOM;Proizvoljno CURVEEDITOR_DARKS;Tamno +CURVEEDITOR_FILEDLGFILTERANY;Sve datoteke +CURVEEDITOR_FILEDLGFILTERCURVE;Datoteke sa krivama CURVEEDITOR_HIGHLIGHTS;Presvetlo CURVEEDITOR_LIGHTS;Svetlo CURVEEDITOR_LINEAR;Linearno @@ -26,10 +30,10 @@ CURVEEDITOR_TOOLTIPLOAD;Učitava krivulju iz datoteke CURVEEDITOR_TOOLTIPPASTE;Ubacuje krivulju iz ostave CURVEEDITOR_TOOLTIPSAVE;Čuva trenutnu krivulju CURVEEDITOR_TYPE;Vrsta: -DIRBROWSER_FOLDERS;Fascikle EDITWINDOW_TITLE;Uređivanje slike EXIFFILTER_APERTURE;Otvor blende EXIFFILTER_CAMERA;Foto aparat +EXIFFILTER_EXPOSURECOMPENSATION;Kompenzacija ekspozicije (EV) EXIFFILTER_FILETYPE;Vrsta datoteke EXIFFILTER_FOCALLEN;Žižna daljina EXIFFILTER_ISO;ISO @@ -50,6 +54,35 @@ EXIFPANEL_RESETALL;Vrati sve EXIFPANEL_RESETALLHINT;Vraća sve oznake na početne vrednosti EXIFPANEL_RESETHINT;Vraća izabranu oznaku na početnu vrednosti EXIFPANEL_SUBDIRECTORY;Poddirektorijum +EXPORT_BYPASS_ALL;Izaberi / poništi sve +EXPORT_BYPASS_COLORDENOISE;Zanemari uklanjanje kolornog defrišuma +EXPORT_BYPASS_DEFRINGE;Zanemari uklanjanje oreola +EXPORT_BYPASS_DIRPYRDENOISE;Zanemari uklanjanje šuma +EXPORT_BYPASS_DIRPYREQUALIZER;Zanemari detaljni nivo kontrasta +EXPORT_BYPASS_LUMADENOISE;Zanemari uklanjanje šuma luminase +EXPORT_BYPASS_RAW_ALL_ENHANCE;Zanemari uklanjanje artafakta/šuma nakon rasklapanja +EXPORT_BYPASS_RAW_CA;Zanemari [raw] ispravljanje hromatskih aberacija +EXPORT_BYPASS_RAW_CCSTEPS;Zanemari [raw] prigušivanje lažne boje +EXPORT_BYPASS_RAW_DCB_ENHANCE;Zanemari [raw] DCB poboljšanje +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Zanemari [raw] broj DCB prolaza +EXPORT_BYPASS_RAW_DF;Zanemari [raw] tamno polje +EXPORT_BYPASS_RAW_FF;Zanemari [raw] ravno polje +EXPORT_BYPASS_RAW_GREENTHRESH;Zanemari [raw] kalibraciju zelene boje +EXPORT_BYPASS_RAW_LINENOISE;Zanemari [raw] linijski filter šuma +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Zanemari [raw] LMMSE korake za poboljšanje +EXPORT_BYPASS_SHARPENEDGE;Zanemari oštrenje ivice +EXPORT_BYPASS_SHARPENING;Zanemari oštrenje +EXPORT_BYPASS_SHARPENMICRO;Zanemari mikrokontrast +EXPORT_BYPASS_SH_HQ;Zanemari oštru masku za Senke/Svetlo +EXPORT_FASTEXPORTOPTIONS;Opcije za brz izvoz +EXPORT_INSTRUCTIONS;Brz izvoz omogućava da zaobiđete neke od zahtevnih i sporijih procesa prilikom razvijanja slika i da zakažete fotografije za brzo razvijanje. Ovj metod je dobar za brzo razvijanje slika u manjoj rezoluciji, kada vam je bitno da fotografije dobijete što pre ili kada želite primenite zadovoljavajuće parametre za razvijanje većeg broja fotografija odjednom bez izmene njihovih profila. +EXPORT_MAXHEIGHT;Najveća visina: +EXPORT_MAXWIDTH;Najveća dužina: +EXPORT_PUTTOQUEUEFAST; Zakaži za brz izvoz +EXPORT_RAW_DMETHOD;Način rasklapanja mozaika +EXPORT_RESIZEMETHOD;Način promene veličine +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;zakazano-razvijeno FILEBROWSER_ADDDELTEMPLATE;Dodaj/ukloni šablone... FILEBROWSER_APPLYPROFILE;Primeni profil FILEBROWSER_APPLYPROFILE_PARTIAL;Primeni profil (polovično) @@ -61,6 +94,7 @@ FILEBROWSER_CACHE;Ostava FILEBROWSER_CACHECLEARFROMFULL;Očisti iz ostave — sve FILEBROWSER_CACHECLEARFROMPARTIAL;Očisti iz ostave — polovično FILEBROWSER_CLEARPROFILE;Obriši profil +FILEBROWSER_COLORLABEL_TOOLTIP;Natpis u boji.\n\nKoristite priloženi meni ili prečice:\nShift-Ctrl-0 Bez boje\nShift-Ctrl-1 Crvena\nShift-Ctrl-2 Žuta\nShift-Ctrl-3 Zelena\nShift-Ctrl-4 Plana\nShift-Ctrl-5 Ljubičasta FILEBROWSER_COPYPROFILE;Umnoži profil FILEBROWSER_CURRENT_NAME;Trenutno ime: FILEBROWSER_DARKFRAME;Tamni kadar @@ -70,10 +104,12 @@ FILEBROWSER_DELETEDLGMSGINCLPROC;Da li želite da obrišete %1 izabranih datotek FILEBROWSER_EMPTYTRASH;Izbaci smeće FILEBROWSER_EMPTYTRASHHINT;Trajno briše datoteke iz smeća FILEBROWSER_EXEC_CPB;Izgradi početni profil +FILEBROWSER_EXTPROGMENU;Otvori pomoću FILEBROWSER_FLATFIELD;Ravno polje FILEBROWSER_MOVETODARKFDIR;Prebaci u fasciklu sa tamnim kadrovima FILEBROWSER_MOVETOFLATFIELDDIR;Premesti u fascikli sa ravnim poljima FILEBROWSER_NEW_NAME;Novo ime: +FILEBROWSER_OPENDEFAULTVIEWER;Podrazumevani prikaz prozora (zakazano-razvijeno) FILEBROWSER_PARTIALPASTEPROFILE;Delimično ubaci FILEBROWSER_PASTEPROFILE;Ubaci profil FILEBROWSER_POPUPCANCELJOB;Otkaži zadatak @@ -84,9 +120,10 @@ FILEBROWSER_POPUPMOVEEND;Premesti na kraj zakazanih FILEBROWSER_POPUPMOVEHEAD;Premesti na početak zakazanih FILEBROWSER_POPUPMOVETO;Premesti u... FILEBROWSER_POPUPOPEN;Otvori -FILEBROWSER_POPUPOPENINEDITOR;Otvori u Uredniku FILEBROWSER_POPUPPROCESS;Zakaži za obradu +FILEBROWSER_POPUPPROCESSFAST;Dodaj u zakazano (brzi izvoz) FILEBROWSER_POPUPPROFILEOPERATIONS;Profil +FILEBROWSER_POPUPRANK;Ocena FILEBROWSER_POPUPREMOVE;Ukloni iz sistema datoteka FILEBROWSER_POPUPREMOVEINCLPROC;Ukloni iz sistema datoteka i zakazanog FILEBROWSER_POPUPRENAME;Preimenuj @@ -97,7 +134,13 @@ FILEBROWSER_POPUPUNTRASH;Ukloni iz smeća FILEBROWSER_QUERYBUTTONHINT;Očisti polje za pretragu FILEBROWSER_QUERYHINT;Unesite deo imena datoteke za pretragu nCtrl-f postavlja fokus (u Razgledaču datoteka);nEnter pretražuje FILEBROWSER_QUERYLABEL; Traži: +FILEBROWSER_RANK1_TOOLTIP;Ocena 1 *\nPrečica: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Ocena 2 *\nPrečica: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Ocena 3 *\nPrečica: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Ocena 4 *\nPrečica: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Ocena 5 *\nPrečica: Shift-5 FILEBROWSER_RENAMEDLGLABEL;Preimenuj datoteku +FILEBROWSER_RENAMEDLGMSG;Preimenuj datoteku „%1“ u: FILEBROWSER_SELECTDARKFRAME;Izaberi tamni kadar... FILEBROWSER_SELECTFLATFIELD;Izaberi ravno polje... FILEBROWSER_SHOWCOLORLABEL1HINT;Prikazuje slike označene crvenom Alt-1 @@ -125,12 +168,16 @@ FILEBROWSER_STOPPROCESSING;Zaustavi obradu FILEBROWSER_STOPPROCESSINGHINT;Zaustavlja obradu slika FILEBROWSER_THUMBSIZE;Pregled FILEBROWSER_TOOLTIP_STOPPROCESSING;Pokreće obradu fotografija kada ih zakažete +FILEBROWSER_UNRANK_TOOLTIP;Neocenjeno.\nPrečica: Shift-0 +FILEBROWSER_USETEMPLATE;Iskoristi šablon: FILEBROWSER_ZOOMINHINT;Uvećava pregled FILEBROWSER_ZOOMOUTHINT;Umanjuje pregled GENERAL_ABOUT;O programu GENERAL_AFTER;Posle +GENERAL_AUTO;Automatski GENERAL_BEFORE;Pre GENERAL_CANCEL;Otkaži +GENERAL_CLOSE;Zatvori GENERAL_DISABLE;Isključi GENERAL_DISABLED;Isključeno GENERAL_ENABLE;Uključi @@ -144,8 +191,11 @@ GENERAL_OK;U redu GENERAL_PORTRAIT;Uspravno GENERAL_SAVE;Sačuvaj GENERAL_UNCHANGED;(neizmenjeno) +GENERAL_WARNING;Upozorenje HISTOGRAM_TOOLTIP_B;Prikazuje plavi histogram HISTOGRAM_TOOLTIP_BAR;Prikazuje/sakriva RGB indikator. Kliknite desni taster miša na umanjeni prikaz da zamrznete +HISTOGRAM_TOOLTIP_CHRO;Prikaži/sakrij histogram hrominanse. +HISTOGRAM_TOOLTIP_FULL;Uključuje prikaz potpunog ili histograma u razmeri. HISTOGRAM_TOOLTIP_G;Prikazuje zeleni histogram HISTOGRAM_TOOLTIP_L;Prikazuje CieLab hitogram HISTOGRAM_TOOLTIP_R;Prikazuje crveni histogram @@ -195,8 +245,8 @@ HISTORY_MSG_37;Pojačanje boja HISTORY_MSG_38;Način balansiranja bele HISTORY_MSG_39;Temperatura boje HISTORY_MSG_40;Zalenilo boje -HISTORY_MSG_41;Pomeraj boje „A“ -HISTORY_MSG_42;Pomeraj boje „B“ +HISTORY_MSG_41;Pomeranje boje „A“ +HISTORY_MSG_42;Pomeranje boje „B“ HISTORY_MSG_43;Uklanjanje svetlosnog šuma HISTORY_MSG_44;Radijus ukl. svetlosnog šuma HISTORY_MSG_45;Tolerancija ivice ukl. s. šuma @@ -305,9 +355,111 @@ HISTORY_MSG_147;Oštrenje ivica - samo luminansa HISTORY_MSG_148;Mikrokontrast HISTORY_MSG_149;Mikrokontrast - 3x3 matrica HISTORY_MSG_150;Uklanjanje artefakta/šuma nakon rasklapanja mozaika +HISTORY_MSG_151;Živost boja +HISTORY_MSG_152;Živ - Pastelni tonovi +HISTORY_MSG_153;Živ - Zasićeni tonovi +HISTORY_MSG_154;Živ - Zaštiti boju kože +HISTORY_MSG_155;Živ - Izbegni pomeranje boja +HISTORY_MSG_156;Živ - Poveži pastelno i zasićeno +HISTORY_MSG_157;Živ - P/S prag +HISTORY_MSG_158;MT - Jačina +HISTORY_MSG_159;MT - Zaustavljanje ivice +HISTORY_MSG_160;MT - Razmera +HISTORY_MSG_161;MT - Ponavljanje premeravanja +HISTORY_MSG_162;Mapiranje tonova +HISTORY_MSG_163;RGB krive - crvena +HISTORY_MSG_164;RGB krive - zelena +HISTORY_MSG_165;RGB krive - plava +HISTORY_MSG_166;Neutralni nivoi +HISTORY_MSG_167;--neiskorišćeno-- +HISTORY_MSG_168;„CC“ kriva +HISTORY_MSG_169;„CH“ kriva +HISTORY_MSG_170;Živ - kriva +HISTORY_MSG_171;„LC“ kriva +HISTORY_MSG_172;Lab - Zabrani LC +HISTORY_MSG_173;UŠ - Detalji luminanse +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - CAT02 adaptacija +HISTORY_MSG_176;CAM02 - Okolina prikaza +HISTORY_MSG_177;CAM02 - Luminansa kadra +HISTORY_MSG_178;CAM02 - Luminansa prikaza +HISTORY_MSG_179;CAM02 - Model bele tačke +HISTORY_MSG_180;CAM02 - Svetlina (J) +HISTORY_MSG_181;CAM02 - Boja (C) +HISTORY_MSG_182;CAM02 - Automatski CAT02 +HISTORY_MSG_183;CAM02 - Kontrast (J) +HISTORY_MSG_184;CAM02 - Okolina scene +HISTORY_MSG_185;CAM02 - Kontrola širine tonova +HISTORY_MSG_186;CAM02 - Algoritam +HISTORY_MSG_187;CAM02 - Zaštita crvene i boje kože +HISTORY_MSG_188;CAM02 - Svetlina (Q) +HISTORY_MSG_189;CAM02 - Kontrast (Q) +HISTORY_MSG_190;CAM02 - Zasićenost (S) +HISTORY_MSG_191;CAM02 - Živopisnost (M) +HISTORY_MSG_192;CAM02 - Nijansa (h) +HISTORY_MSG_193;CAM02 - Kriva tonova 1 +HISTORY_MSG_194;CAM02 - Kriva tonova 2 +HISTORY_MSG_195;CAM02 - Kriva tonova 1 +HISTORY_MSG_196;CAM02 - Kriva tonova 2 +HISTORY_MSG_197;CAM02 - Kriva boje +HISTORY_MSG_198;CAM02 - Kriva boje +HISTORY_MSG_199;CAM02 - Izlazni histogrami +HISTORY_MSG_200;CAM02 - Mapiranje tonova +HISTORY_MSG_201;UŠ - Hrominansa C,Z +HISTORY_MSG_202;UŠ - Hrominansa P,Y +HISTORY_MSG_203;UŠ - Način +HISTORY_MSG_204;LMMSE koraci poboljšanja +HISTORY_MSG_205;CAM02 - Vrući/loš pikseli +HISTORY_MSG_206;CAT02 - Automatska luminansa kadra +HISTORY_MSG_207;Uklanjanje oreola - kriva nijanse +HISTORY_MSG_208;BB - Balans C i P +HISTORY_MSG_210;FG - Ugao +HISTORY_MSG_211;Filter gradijenta +HISTORY_MSG_212;FV - Jačina +HISTORY_MSG_213;Filter vinjetarenja +HISTORY_MSG_214;Crno-bela slika +HISTORY_MSG_215;CB - CM - Crvena +HISTORY_MSG_216;CB - CM - Zelena +HISTORY_MSG_217;CB - CM - Plava +HISTORY_MSG_218;CB - Gama - Crvena +HISTORY_MSG_219;CB - Gama - Zelena +HISTORY_MSG_220;CB - Gama - Plana +HISTORY_MSG_221;CB - Filter boje +HISTORY_MSG_222;CB - Predpodešavanja +HISTORY_MSG_223;CB - CM - Narandžasta +HISTORY_MSG_224;CB - CM - Žuta +HISTORY_MSG_225;CB - CM - Svetlo plava +HISTORY_MSG_226;CB - CM - Svetlo ljubičasta +HISTORY_MSG_227;CB - CM - Ljubičasta +HISTORY_MSG_228;CB - Ujednačenje luminanse +HISTORY_MSG_229;CB - Ujednačenje luminanse +HISTORY_MSG_230;CB - Režim +HISTORY_MSG_231;CB - Pre krive +HISTORY_MSG_232;CB - Pre vrste krive +HISTORY_MSG_233;CB - Nakon prive +HISTORY_MSG_234;CB - Nakon vrste krive +HISTORY_MSG_235;CB - Automatsko mešanje kanala +HISTORY_MSG_236;--neiskorišćeno-- +HISTORY_MSG_237;CB - Mikser +HISTORY_MSG_238;FG - Umekšanje +HISTORY_MSG_239;FG - Jačina +HISTORY_MSG_240;FG - Centar +HISTORY_MSG_241;FV - Umekšanje +HISTORY_MSG_242;FV - Krivoća +HISTORY_MSG_243;FV - Prečnik +HISTORY_MSG_244;FV - Jačina +HISTORY_MSG_245;FV - Centar +HISTORY_MSG_246;CL kriva +HISTORY_MSG_247;LH kriva +HISTORY_MSG_248;HH kriva +HISTORY_MSG_249;CbDL - Prag +HISTORY_MSG_250;UŠ - Poboljšanje +HISTORY_MSG_251;CB - Algoritam HISTORY_NEWSNAPSHOT;Dodaj +HISTORY_NEWSNAPSHOT_TOOLTIP;Prečica: Alt-s HISTORY_SNAPSHOT;Snimak HISTORY_SNAPSHOTS;Snimak +HRESHOLDSELECTOR_BL;Dole-levo IPTCPANEL_AUTHOR;Autor IPTCPANEL_AUTHORSPOSITION;Zvanje autora IPTCPANEL_AUTHORSPOSITIONHINT;Zvanje jednog ili više autora (jedno po redi). @@ -350,10 +502,14 @@ IPTCPANEL_TITLEHINT;Kratni naziv slike (ime objekta). IPTCPANEL_TRANSREFERENCE;Ref. prenosa IPTCPANEL_TRANSREFERENCEHINT;Kod kojji predstavlja mesto prvobitnog prenosa (referenca prvog prenosa). MAIN_BUTTON_FULLSCREEN;Ceo ekran +MAIN_BUTTON_NAVNEXT_TOOLTIP;Šalje vas na narednu sliku u odnosu na otvorenu u prozoru za uređivanje.\nPrečica: Shift-F4\n\nTakođe, omoguća vam da idete na narednu sliku u odnosu na trenutno izabranu u razgledaču ili filmskoj traci.\nPrečica: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Šalje vas na prethodnu sliku u odnosu na otvorenu u prozoru za uređivanje.\nPrečica: Shift-F3\n\nnTakođe, omoguća vam da idete na narednu sliku u odnosu na trenutno izabranu u razgledaču ili filmskoj traci.\nPrečica: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Usaglašava razgledač datoteka ili filmsku traku sa delom za uređivanje radi umanjenog prikaza trenutno otvorene slike i čisti sve izabrane filtere.\nPrečica: x\n\nKao i prethodna operacija, ali bez čišćenja izabranih filtera:\nPrečica: y\n(Umanjeni prikaz otvorene slike neće biti prikazan ukoliko je izfiltriran). MAIN_BUTTON_PREFERENCES;Postavke MAIN_BUTTON_PUTTOQUEUE;Zakaži MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Dodaje trenutnu sliku u zakazane Ctrl+B MAIN_BUTTON_SAVE;Sačuvaj +MAIN_BUTTON_SAVEAS;Kao... MAIN_BUTTON_SAVE_TOOLTIP;Čuva trenutnu sliku Ctrl+S MAIN_BUTTON_SENDTOEDITOR;Uredi MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Uređuje trenutnu sliku u spoljnom programu Ctrl+E @@ -375,14 +531,20 @@ MAIN_MSG_CANNOTSAVE;Greška pri čuvanju datoteke MAIN_MSG_CANNOTSTARTEDITOR;Ne mogu da pokrenem program za uređivanje. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Izaberite ispravnu putanju u „Postavkama“. MAIN_MSG_EMPTYFILENAME;Nije određeno ime datoteke! +MAIN_MSG_IMAGEUNPROCESSED;Ova radnja zahteva da najpre stavite izabrane slike u listu zakazanih. MAIN_MSG_NAVIGATOR;Navigator +MAIN_MSG_OPERATIONCANCELLED;Radnja je otkazana +MAIN_MSG_PATHDOESNTEXIST;Ne postoji putanja \n\n%1\n\n. Postavite ispravnu putanji iz podešavanja programa. MAIN_MSG_QOVERWRITE;Da li želite da prepišete? +MAIN_MSG_SETPATHFIRST;Morate izabrati ciljnu putanju iz podešavanja programa\nkako bi koristili ovu funkciju! +MAIN_MSG_WRITEFAILED;Ne mogu da upišem\n\n"%1"\n\nProverite da li fascikla postoji i da li imate ovlašćenja za upis u nju. MAIN_TAB_COLOR;Boja MAIN_TAB_COLOR_TOOLTIP;Alt-c MAIN_TAB_DETAIL;Detalji MAIN_TAB_DETAIL_TOOLTIP;Alt-d MAIN_TAB_DEVELOP;Razvijanje MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Brzi izvoz MAIN_TAB_EXPOSURE;Svetlost MAIN_TAB_EXPOSURE_TOOLTIP;Alt-e MAIN_TAB_FILTER;Filter @@ -391,21 +553,55 @@ MAIN_TAB_METADATA;Metapodaci MAIN_TAB_METADATA_TOOLTIP;Alt-m MAIN_TAB_RAW;RAW MAIN_TAB_RAW_TOOLTIP;Alt-r +MAIN_TAB_TAGGING;Oznake MAIN_TAB_TRANSFORM;Ispravke MAIN_TAB_TRANSFORM_TOOLTIP;Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Boja pozadine za pregled: Na osnovu teme\nPrečica: 9 +MAIN_TOOLTIP_BACKCOLOR1;Boja pozadine za pregled: Crna\nPrečica: 9 +MAIN_TOOLTIP_BACKCOLOR2;Boja pozadine za pregled: Bela\nPrečica: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Zaključaj / otključaj pre prikaza\n\nZaključaj: zadrži prethodni prikaz.\nKorisno ukoliko želite da prikažete ukupni efekat više alata.\nPoređenje se još može napraviti i za bilo koje stanje iz Istorije.\n\nOtključaj: prethodni prikaz dolazi nakon prikaza jednog poslednjeg koraka, prikazujući sliku pre primene trenutnog alata. MAIN_TOOLTIP_HIDEHP;Prikazuje/sakriva levu površ, zajedno sa istorijatom (prečica: H) MAIN_TOOLTIP_INDCLIPPEDH;Prikazuje isečene svetle delove MAIN_TOOLTIP_INDCLIPPEDS;Prikazuje isečene tamne delove +MAIN_TOOLTIP_PREVIEWB;Pregled plavog kanaza.\nPrečica: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Prikazuje oblast u fokusu.\nPrečica: Shift-f\n\nNa uvećanju preciznije radi sa slikama koje imaju malu dubinsku oštrinu i malo šuma.\n\nZa precizniji prikaz kod slika sa šumom pregledajte fokus na manjem uvećanju od oko 10-30%.\n\nPrikaz fokusirane oblasti će usporiti pregled fotografija. +MAIN_TOOLTIP_PREVIEWG;Pregled zelenog kanala.\nPrečica: g +MAIN_TOOLTIP_PREVIEWL;Pregled luminanse.\nPrečica: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Pregled crvenog kanala.\nPrečica: r MAIN_TOOLTIP_QINFO;Osnovni podaci o slici I MAIN_TOOLTIP_SHOWHIDELP1;Prikazuje/sakriva levu površ l MAIN_TOOLTIP_SHOWHIDERP1;Prikazuje/sakriva desnu površ Alt-l MAIN_TOOLTIP_SHOWHIDETP1;Prikazuje/sakriva gornju površ Shift-L +MAIN_TOOLTIP_THRESHOLD;Prag MAIN_TOOLTIP_TOGGLE;Prikazuje sliku pre i posle obrade B +NAVIGATOR_B_NA;P = ○ +NAVIGATOR_B_VALUE;P = %1 +NAVIGATOR_G_NA;Z = ○ +NAVIGATOR_G_VALUE;Z = %1 +NAVIGATOR_H_NA;H = ○ +NAVIGATOR_H_VALUE;H = %1 +NAVIGATOR_LAB_A_NA;A = ○ +NAVIGATOR_LAB_A_VALUE;A = %1 +NAVIGATOR_LAB_B_NA;B = ○ +NAVIGATOR_LAB_B_VALUE;B = %1 +NAVIGATOR_LAB_L_NA;L = ○ +NAVIGATOR_LAB_L_VALUE;L = %1 +NAVIGATOR_R_NA;C = ○ +NAVIGATOR_R_VALUE;C = %1 +NAVIGATOR_S_NA;S = ○ +NAVIGATOR_S_VALUE;S = %1 +NAVIGATOR_V_NA;V = ○ +NAVIGATOR_V_VALUE;V = %1 +NAVIGATOR_XY_FULL;Širina = %1, Visina = %2 NAVIGATOR_XY_NA;x = ○, y = ○ +OPTIONS_DEFIMG_MISSING;Nije pronađen ili dostupan podrazumevani profil za slike koje nisu u sirovom formatu.\n\nProverite fasciklu sa profilima, možda ne postoji ili je oštećena.\n\nBiće korišćene podrazumevane vrednosti. +OPTIONS_DEFRAW_MISSING;Nije pronađen ili dostupan podrazumevani profil za slike u sirovom formatu.\n\nProverite fasciklu sa profilima, možda ne postoji ili je oštećena.\n\nBiće korišćene podrazumevane vrednosti. PARTIALPASTE_BASICGROUP;Osnovna podešavanja PARTIALPASTE_CACORRECTION;Ispravljanje aberacija PARTIALPASTE_CHANNELMIXER;Mešanje kanala +PARTIALPASTE_CHANNELMIXERBW;Crno-bela fotografija PARTIALPASTE_COARSETRANS;Rotacija za 90˚ / izvrtanje +PARTIALPASTE_COLORAPP;CIECAM 2002 model izgleda boja PARTIALPASTE_COLORGROUP;Podešavanje boja PARTIALPASTE_COMMONTRANSFORMPARAMS;Sam popuni PARTIALPASTE_COMPOSITIONGROUP;Podešavanje kompozicije @@ -418,6 +614,7 @@ PARTIALPASTE_DIALOGLABEL;Delimočno ubacuje profil za obradu PARTIALPASTE_DIRPYRDENOISE;Uklanjanje šuma PARTIALPASTE_DIRPYREQUALIZER;Kontrast nivoima detalja PARTIALPASTE_DISTORTION;Ispravljanje izobličenja +PARTIALPASTE_EPD;Mapiranje tonova PARTIALPASTE_EVERYTHING;Sve PARTIALPASTE_EXIFCHANGES;Izmene exif podataka PARTIALPASTE_EXPOSURE;Ekspozicija @@ -425,15 +622,21 @@ PARTIALPASTE_FLATFIELDAUTOSELECT;Automatski izbor RK PARTIALPASTE_FLATFIELDBLURRADIUS;Poluprečnik zamućenja RK PARTIALPASTE_FLATFIELDBLURTYPE;Način zamućenja RK PARTIALPASTE_FLATFIELDFILE;Datoteka za ravni kadar +PARTIALPASTE_GRADIENT;Filter gradijenta PARTIALPASTE_HSVEQUALIZER;Ujednačenje HSV +PARTIALPASTE_ICMGAMMA;Izlazna gama PARTIALPASTE_ICMSETTINGS;ICM podešavanja PARTIALPASTE_IMPULSEDENOISE;Impulsno uklanjanje šuma PARTIALPASTE_IPTCINFO;IPTC podavi PARTIALPASTE_LABCURVE;Lab kriva PARTIALPASTE_LENSGROUP;Podešavanja objektiva -PARTIALPASTE_METAGROUP;Metapodaci +PARTIALPASTE_LENSPROFILE;Profil za ispravke objektiva +PARTIALPASTE_LUMACURVE;Kriva luminase +PARTIALPASTE_METAICMGROUP;Metapodaci/ICM podešavanja +PARTIALPASTE_PCVIGNETTE;Filter vinjetarenja PARTIALPASTE_PERSPECTIVE;Perspektiva PARTIALPASTE_PREPROCESS_GREENEQUIL;Ujednačavanje zelene +PARTIALPASTE_PREPROCESS_HOTDEADPIXFILT;Filter vrelih/mrtvih piksela PARTIALPASTE_PREPROCESS_LINEDENOISE;Linijski filter šuma PARTIALPASTE_RAWCACORR_AUTO;Auto hromatske aberacije PARTIALPASTE_RAWCACORR_CABLUE;Plava hrominansa @@ -442,39 +645,68 @@ PARTIALPASTE_RAWEXPOS_BLACK;Nivo crne PARTIALPASTE_RAWEXPOS_LINEAR;Linearni faktor ispravke RAW bele tačke PARTIALPASTE_RAWEXPOS_PRESER;Raw tačka bele uz očuvanje svetlih delova PARTIALPASTE_RAWGROUP;Raw podešavanja +PARTIALPASTE_RAW_ALLENHANCE;Ukloni šum nakon rasklapanja mozaika PARTIALPASTE_RAW_DCBENHANCE;Primeni korak DCB poboljšanja PARTIALPASTE_RAW_DCBITERATIONS;Broj DCB ponavljanja PARTIALPASTE_RAW_DMETHOD;Način rasklapanja mozaika PARTIALPASTE_RAW_FALSECOLOR;Koraci prigušenja lažne boje pri rasklapanju mozaika +PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE koraci poboljšanja PARTIALPASTE_RESIZE;Promena veličine +PARTIALPASTE_RGBCURVES;RGB krive PARTIALPASTE_ROTATION;Rotacija PARTIALPASTE_SHADOWSHIGHLIGHTS;Senke/Svetlost PARTIALPASTE_SHARPENEDGE;Ivice PARTIALPASTE_SHARPENING;Oštrenje PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_VIBRANCE;Živost boja PARTIALPASTE_VIGNETTING;Ispravljanje vinjetarenja PARTIALPASTE_WHITEBALANCE;Balans bele +POPUPBUTTON_SELECTOPTIONHINT;RMB za izmenu opcije PREFERENCES_ADD;Dodaj PREFERENCES_APPLNEXTSTARTUP;primenjuje se nakon ponovnog pokretanja PREFERENCES_AUTOMONPROFILE;Sam primeni profile monitora iz operativnog sistema PREFERENCES_BATCH_PROCESSING;Obrada zakzanog +PREFERENCES_BEHADDALL;Sve u „Dodaj“ +PREFERENCES_BEHADDALLHINT;Postavlja sve parametre u režim Dodaj.\nNjihovo podešavanje pomoću alata iz panela za zakazano će biti razlike sačuvanih vrednosti. PREFERENCES_BEHAVIOR;Ponašanje +PREFERENCES_BEHSETALL;Sve u „Postavi“ +PREFERENCES_BEHSETALLHINT;Postavlja sve parametre u režim Postavi.\nNjihovo podešavanje pomoću alata iz panela za zakazano će biti apsolutne vrednosti kao što su i izabrane. +PREFERENCES_BLACKBODY;Obična sijalica +PREFERENCES_BLINKCLIPPED;Pokaži pretamne/presvetle delove PREFERENCES_CACHECLEARALL;Obriši sve PREFERENCES_CACHECLEARPROFILES;Obriši profile PREFERENCES_CACHECLEARTHUMBS;Obriši prikaze +PREFERENCES_CACHEFORMAT1;Vlasnički (brže i bolje) +PREFERENCES_CACHEFORMAT2;JPEG (manje mesta na disku) PREFERENCES_CACHEMAXENTRIES;Najveći broj mest u ostavi PREFERENCES_CACHEOPTS;Podešavanje ostave +PREFERENCES_CACHETHUMBFORM;Format umanjenih prikaza PREFERENCES_CACHETHUMBHEIGHT;Najveća visina prikaza +PREFERENCES_CIEART;CIECAM02 optimizacija +PREFERENCES_CIEART_LABEL;Jednostruka tačnost umesto dvostruke +PREFERENCES_CIEART_TOOLTIP;Ukoliko je omogućeno, radi CIECAM02 računanja sa jednostrukom tačnošću umesto sa dvostrukom. Ovo daje malo povećanje brzine uz neizostavan gubitak na kvalitetu. +PREFERENCES_CLEARDLG_LINE1;Čišćenje ostave +PREFERENCES_CLEARDLG_LINE2;Ovo može da potraje nekoliko sekundi. +PREFERENCES_CLEARDLG_TITLE;Sačekajte PREFERENCES_CLIPPINGIND;Pokazivači odsečenih delova +PREFERENCES_CMETRICINTENT;Kolorimetrijska namera PREFERENCES_CUSTPROFBUILD;Izgradnja proizvoljnog početnog profila slike PREFERENCES_CUSTPROFBUILDHINT;Izvršna datoteka (ili skripta) koja se poziva kada izgrađujete novi početni profil za sliku.nPrihvata parametre iz komandne linije radi pravljenja .pp3 datoteke na osnovu nekih pravila:n[Putanja do RAW/JPG] [Putanja podrazumevanog profila] [Blenda] [Ekspozicija u s] [Žižna dužina mm] [ISO] [Objektiv] [Foto-aparat] +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Ključni formati +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Naziv +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;BrOznake PREFERENCES_CUSTPROFBUILDPATH;Izvršna putanja PREFERENCES_CUTOVERLAYBRUSH;Maska isecanja boje/providnog +PREFERENCES_D50;5000K +PREFERENCES_D55;5500K +PREFERENCES_D60;6000K +PREFERENCES_D65;6500K PREFERENCES_DARKFRAME;Tamni kadar PREFERENCES_DARKFRAMEFOUND;Nađen PREFERENCES_DARKFRAMESHOTS;snimaka PREFERENCES_DARKFRAMETEMPLATES;šabloni PREFERENCES_DATEFORMAT;Format datuma +PREFERENCES_DATEFORMATFRAME;Format PREFERENCES_DATEFORMATHINT;Možete zadati sledeće formate:\n%y :godina\n%m : mesec\n%d : dan\n\nU Srbiji se najviše koristi:\n%d.%m.%y PREFERENCES_DEFAULTLANG;Jezik programa PREFERENCES_DEFAULTTHEME;Tema programa @@ -495,9 +727,21 @@ PREFERENCES_FLATFIELDFOUND;Nađeno PREFERENCES_FLATFIELDSDIR;Direktorijum za ravna polja PREFERENCES_FLATFIELDSHOTS;snimaka PREFERENCES_FLATFIELDTEMPLATES;šabloni +PREFERENCES_FLUOF2;Florescentna F2 +PREFERENCES_FLUOF7;Florescentna F7 +PREFERENCES_FLUOF11;Florescentna F11 PREFERENCES_FORIMAGE;Za datoteke sa slikama PREFERENCES_FORRAW;Za RAW datoteke PREFERENCES_GIMPPATH;Direktorijum sa instaliranim Gimpom +PREFERENCES_GREY;Yb luminansa izlaznog uređaja (%) +PREFERENCES_GREY05;Yb=05 CIE L#30 +PREFERENCES_GREY10;Yb=10 CIE L#40 +PREFERENCES_GREY15;Yb=15 CIE L#45 +PREFERENCES_GREY18;Yb=18 CIE L#50 +PREFERENCES_GREY23;Yb=23 CIE L#55 +PREFERENCES_GREY30;Yb=30 CIE L#60 +PREFERENCES_GREY40;Yb=40 CIE L#70 +PREFERENCES_GTKTHEME;GTK tema PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram u levoj površi PREFERENCES_HLTHRESHOLD;Prag za odsečene svetle delove PREFERENCES_ICCDIR;ICC direktorijum @@ -508,12 +752,14 @@ PREFERENCES_INTENT_RELATIVE;Relativno kolorimetrijski PREFERENCES_INTENT_SATURATION;Zasićeni prikaz PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Koristi ugnježđeni RAW prikaz do izmene PREFERENCES_LANGAUTODETECT;Sam otkrij +PREFERENCES_MENUGROUPEXTPROGS;Grupiši "Otvori sa" PREFERENCES_MENUGROUPFILEOPERATIONS;Grupiši radnje nad datotekama PREFERENCES_MENUGROUPLABEL;Grupiši obeležavanje PREFERENCES_MENUGROUPPROFILEOPERATIONS;Grupiši radnje sa profilima PREFERENCES_MENUGROUPRANK;Grupiši ocenjivanje PREFERENCES_MENUOPTIONS;Opcije menija PREFERENCES_METADATA;Metapodaci +PREFERENCES_MONITORICC;Profil monitora PREFERENCES_MULTITAB;Režim u više listova PREFERENCES_MULTITABDUALMON;Režim u više listova, na drugom monitoru PREFERENCES_OUTDIR;Izlazni direktorijum @@ -523,6 +769,7 @@ PREFERENCES_OUTDIRTEMPLATE;Upotrebi šablon PREFERENCES_OUTDIRTEMPLATEHINT;Možete da zadate sledeće skraćenice za formatiranje:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nOvi znakovi za formatiranje se odnose na direktorijume, podputanje putanja do raw datoteke.\n\nNa primer, ukoliko je otvorena slika /home/ivan/slike/02.09.2010/dsc0012.nef, skraćenice označavaju:\n%f=dsc0012, %d1=02.09.2010, %d2=slike, ...\n%p1=/home/ivan/slike/02.09.2010, %p2=/home/ivan/slike, %p3=/home/ivan, ...\n\nUkoliko želite da sačuvate razvijenu sliku pored originala, unesite:\n%p1/%f\n\nUkoliko želite da sačuvate izlaznu sliku u direktorijum „razvijene“ koji se nalazi gde i originalna slika, unesite:\n%p1/razvijene/%f\n\nUkoliko želite da sačuvate razvijenu sliku u direktorijum „/home/ivan/razvijene“, a da struktura poddirektorijuma ostane očuvana, unesite:\n%p2/razvijene/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Postavi preko umanjenog prikaza PREFERENCES_OVERWRITEOUTPUTFILE;Prepiši postojeće izlazne datoteke +PREFERENCES_PANFACTORFRAME;Ubrzanje pri pomeranju platna PREFERENCES_PANFACTORLABEL;Faktor PREFERENCES_PARSEDEXT;Ekstenzije za prikaz PREFERENCES_PARSEDEXTADD;Dodaj ekstenziju @@ -536,12 +783,16 @@ PREFERENCES_PROFILESAVECACHE;Sačuvaj parametre obrade u ostavu PREFERENCES_PROFILESAVEINPUT;Sačuvaj paramtre obrade pored ulazne datoteke PREFERENCES_PROPERTY;Osobina PREFERENCES_PSPATH;Direktorijum sa instaliranim Adobe Fotošopom +PREFERENCES_RGBDTL_LABEL;Najveći broj niri prilikom uklanjanja šuma +PREFERENCES_RGBDTL_TOOLTIP;Uklanjanje šuma zahteva oko 128MB RAM memorije za sliku od 10 megapiksela ili 512MB za sliku od 40 megapiksela, uz dodatnih 128MB memorije po svakoj niti. Što više niti se izvršavaju zajedno to će brže biti računanje. Ostavite ovu vrednost na „0“ kako bi program automatski dodelilo što je više nitova moguće. PREFERENCES_SELECTFONT;Izaberite font PREFERENCES_SELECTLANG;Jezik PREFERENCES_SELECTTHEME;Tema PREFERENCES_SET;Postavi PREFERENCES_SHOWBASICEXIF;Prikaži osnovne Exif podatke PREFERENCES_SHOWDATETIME;Prikaži datum i vreme +PREFERENCES_SHOWEXPOSURECOMPENSATION;Dodaj kompenzaciju ekspozicije +PREFERENCES_SHOWPROFILESELECTOR;Prikaži izbor profila PREFERENCES_SHTHRESHOLD;Prag za odsečene tamne delove PREFERENCES_SINGLETAB;Režim u jednom listu PREFERENCES_SINGLETABVERTAB;Režim u jednom listu, vertikalni listovi @@ -550,21 +801,38 @@ PREFERENCES_SND_BATCHQUEUEDONE;Obrađene su zakazane datoteke PREFERENCES_SND_HELP;Unesite putanju do datoteke ili ostavite prazno ukoliko ne želite zvuk. Na Windows-u možete da koristite „SystemDefault“, „SystemAsterisk“ za sistemske zvuke. PREFERENCES_SND_LNGEDITPROCDONE;Urednik je završio obradu PREFERENCES_SND_TRESHOLDSECS;br. sekundi +PREFERENCES_SQUAREDETAILWINDOW;Kockast prozor sa detaljima (brže) PREFERENCES_STARTUPIMDIR;Direktorijum po pokretanju PREFERENCES_TAB_BROWSER;Pregled datoteka PREFERENCES_TAB_COLORMGR;Upravljanje bojama PREFERENCES_TAB_GENERAL;Opšte PREFERENCES_TAB_IMPROC;Obrada slike +PREFERENCES_TAB_PERFORMANCE;Performansa PREFERENCES_TAB_SOUND;Zvuci +PREFERENCES_TP_LABEL;Površ alata: +PREFERENCES_TP_USEICONORTEXT;Koristi ikonice jezička umesto teksta PREFERENCES_TP_VSCROLLBAR;Sakrij klizače u oblasti sa alatkama +PREFERENCES_TUNNELMETADATA;Kopiraj neizmenjene IPTC/XMP (kada je slika označena drugim programom) +PREFERENCES_USEBUNDLEDPROFILES;Koristi profile koji dolaze uz program PREFERENCES_USESYSTEMTHEME; Koristi sistemsku temu +PREFERENCES_VIEW;Balans bele izlaznog uređaja (monitor, TV, projaketor i dr.) PREFERENCES_WORKFLOW;Tok obrade +PROFILEPANEL_COPYPPASTE;Parametri za kopiranje +PROFILEPANEL_FILEDLGFILTERANY;Sve datoteke +PROFILEPANEL_FILEDLGFILTERPP;Profili za obradu +PROFILEPANEL_GLOBALPROFILES;Profili iz programa PROFILEPANEL_LABEL;Profili obrade PROFILEPANEL_LOADDLGLABEL;Učitaj profil za obradu... +PROFILEPANEL_LOADPPASTE;Parametri za učitavanje +PROFILEPANEL_MODE_TIP;Način dopune profila koji se koristi za obradu.\n\nPritisnuta dugmad: delimični profili se prevode u potpune profile, a nedostajuće vrednosoti se menjaju podrazumevanim vrednostim.\n\nPuštena dugmad: profili će biti primenjeni kakvi jesu, uz izmeni samo onih vrednosti koje sadrži profil. +PROFILEPANEL_MYPROFILES;Moji profili +PROFILEPANEL_PASTEPPASTE;Parametri za ubacivanje PROFILEPANEL_PCUSTOM;Proizvoljno PROFILEPANEL_PFILE;Iz datoteke +PROFILEPANEL_PINTERNAL;Neutralno PROFILEPANEL_PLASTSAVED;Od poslednjeg čuvanja PROFILEPANEL_SAVEDLGLABEL;Čuva parametre za obradu... +PROFILEPANEL_SAVEPPASTE;Parametri za čuvanje PROFILEPANEL_TOOLTIPCOPY;Kopira trenutni profil u ostavu PROFILEPANEL_TOOLTIPLOAD;Učitava profil iz datoteke PROFILEPANEL_TOOLTIPPASTE; Učitava profil iz @@ -574,29 +842,115 @@ PROGRESSBAR_LOADINGTHUMBS;Učitavam prikaze... PROGRESSBAR_LOADJPEG;Učitavam JPEG datoteku... PROGRESSBAR_LOADPNG;Učitavam PNG datoteku... PROGRESSBAR_LOADTIFF;Učitavam TIFF datoteku... +PROGRESSBAR_NOIMAGES;Nisu pronađene slike PROGRESSBAR_PROCESSING;Obrađujem sliku... +PROGRESSBAR_PROCESSING_PROFILESAVED;Obrađujem sačuvani profil PROGRESSBAR_READY;Čekam PROGRESSBAR_SAVEJPEG;Čuvam JPEG datoteku... PROGRESSBAR_SAVEPNG;Čuvam PNG datoteku... PROGRESSBAR_SAVETIFF;Čuvam TIFF datoteku... +PROGRESSBAR_SNAPSHOT_ADDED;Dodat je snimak +PROGRESSDLG_LOADING;Učitavam datoteku... +PROGRESSDLG_PROCESSING;Obrađujem sliku... PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil izmenjen u razgledaču +PROGRESSDLG_SAVING;Čuvam datoteku... P_GAMMA_CURV;gama QINFO_ISO;ISO QINFO_NOEXIF;Nisu dostupni Exif podaci. SAVEDLG_AUTOSUFFIX;Sam dodaj sufiks ukoliko datoteka već postoji SAVEDLG_FILEFORMAT;Format datoteke +SAVEDLG_FORCEFORMATOPTS;Primoraj mogućnosti za čuvanje SAVEDLG_JPEGQUAL;JPEG kvalitet +SAVEDLG_JPGFILTER;JPEG datoteke SAVEDLG_PNGCOMPR;PNG pakovanje SAVEDLG_PUTTOQUEUE;Zakazuje sliku za obradu SAVEDLG_PUTTOQUEUEHEAD;Premešta sliku na početak zakazanih SAVEDLG_PUTTOQUEUETAIL;Premešta sliku na kraj zakazanih SAVEDLG_SAVEIMMEDIATELY;Odmah sačuvaj SAVEDLG_SAVESPP;Sačuvaj parametre obrade uz sliku +SAVEDLG_SUBSAMP;Poduzorkovanje +SAVEDLG_SUBSAMP_1;Najbolja kompresija +SAVEDLG_SUBSAMP_2;Balansirano +SAVEDLG_SUBSAMP_3;Najbolji kvalitet +SAVEDLG_SUBSAMP_TOOLTIP;Najbolja kompresija: 4:1:1\nBalansirano: 4:2:2\nNajbolji kvalitet: 4:4:4 +SAVEDLG_TIFFFILTER;TIFF datoteke SAVEDLG_TIFFUNCOMPRESSED;Nezapakovani TIFF +SAVEDLG_WARNFILENAME;Datoteka će biti nazvana +SHCSELECTOR_TOOLTIP;Kliknite desno dugme miša da ponovo vratite poziciju ova tri klizača. +THRESHOLDSELECTOR_B;Dole +THRESHOLDSELECTOR_BR;Dole-desno +THRESHOLDSELECTOR_HINT;Pritisnite dugme Shift za pomeranje pojedinačnih tačaka. +THRESHOLDSELECTOR_T;Gore +THRESHOLDSELECTOR_TL;Gore-levo +THRESHOLDSELECTOR_TR;Gore-desno TOOLBAR_TOOLTIP_CROP;Postavlja okvir za isecanje (prečica: C) TOOLBAR_TOOLTIP_HAND;Alat za pomeranje (prečica: N) TOOLBAR_TOOLTIP_STRAIGHTEN;Ispravlja liniju horizonta (prečica: S) TOOLBAR_TOOLTIP_WB;Određuje balans bele iz tačke (prečica: W) +TP_BWMIX_ALGO;OYCPM algoritam +TP_BWMIX_ALGO_LI;Linearno +TP_BWMIX_ALGO_SP;Specijalni efekti +TP_BWMIX_ALGO_TOOLTIP;Linearno: proizvodi normalni linearni odgovor.\nSpecijalni efekti: proizvodi specijalne efekte mešajući kanale nelinearno. +TP_BWMIX_AUTOCH;Auto +TP_BWMIX_AUTOCH_TIP;Izračunaj vrednosti tako da optimizuje mešanje kanala. +TP_BWMIX_BLUE;Plava +TP_BWMIX_CC_ENABLED;Podesi komplementarnu boju +TP_BWMIX_CC_TOOLTIP;Omogući za automatsko podešavanje komplementarne boje u ROYGCBPM režimu. +TP_BWMIX_CHANNEL;Ujednačavanje luminanse +TP_BWMIX_CURVEEDITOR1;„Pre“ krivulje +TP_BWMIX_CURVEEDITOR2;„Nakon“ krivulje +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Kriva tonova nakon CB prevođenja, na kraju tretmana. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Kriva tonova, tik pred CB prevođenje.\nMože da uzme u obzir i komponente boje. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminansa na osnovu nijanse L=f(H).\nObratite pažnju na ekstremne vrednosti pošto one mogu da naprave neželjene efekte. +TP_BWMIX_CYAN;Svetlo-plava +TP_BWMIX_FILTER;Filter boja +TP_BWMIX_FILTER_BLUE;Plava +TP_BWMIX_FILTER_BLUEGREEN;Plavo-zelena +TP_BWMIX_FILTER_GREEN;Zelena +TP_BWMIX_FILTER_GREENYELLOW;Zeleno-žuta +TP_BWMIX_FILTER_NONE;Ni jedna +TP_BWMIX_FILTER_PURPLE;Ljubičasta +TP_BWMIX_FILTER_RED;Crvena +TP_BWMIX_FILTER_REDYELLOW;Crveno-Žuta +TP_BWMIX_GREEN;Zelena +TP_BWMIX_LABEL;Crna i bela +TP_BWMIX_MAGENTA;Ljubičasta +TP_BWMIX_MET;Način +TP_BWMIX_MET_CHANMIX;Mešanje kanala +TP_BWMIX_MET_DESAT;Uklanjanje boje +TP_BWMIX_MET_LUMEQUAL;Ujednačavanje luminanse +TP_BWMIX_MIXC;Mešanje +TP_BWMIX_NEUTRAL;Vrati mešanje +TP_BWMIX_NEUTRAL_TIP;Vrati sve vrednsoti (filter boje, mešanje kanala) na podrazumevane. +TP_BWMIX_ORANGE;Narandžasta +TP_BWMIX_PURPLE;Ljubičasta +TP_BWMIX_RED;Crvena +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Ukupno: %4%% +TP_BWMIX_RGBLABEL_HINT;Konačni RGB faktori koji se brinu o opcijama za mešanje.\n„Ukupno“ prikazuje zbir RGB vrednosti:\n- u 100% u relativnom režimu\n- više (svetlije) ili manje (tamnije) od 100% u apsolutnom režimu. +TP_BWMIX_RGB_TOOLTIP;Mešanje RGB kanala. Koristite postojeće prepodešene parametre kao vodilju.\nObratite pažnju na negativne vrednsti koje mogu da naprave greške unutar slike ili izazovu nepravilno ponašanje. +TP_BWMIX_SETTING;Prepodešeno +TP_BWMIX_SETTING_TOOLTIP;Različite podešene vrednosti (film, pejzaž i dr.) ili ručno podešene vrednosti mešanja kanala. +TP_BWMIX_SET_HIGHCONTAST;Veliki kontrast +TP_BWMIX_SET_HIGHSENSIT;Velika osetljivost +TP_BWMIX_SET_HYPERPANCHRO;Jako panhromatski +TP_BWMIX_SET_INFRARED;Infracrveno +TP_BWMIX_SET_LANDSCAPE;Pejzaž +TP_BWMIX_SET_LOWSENSIT;Niska osetljivost +TP_BWMIX_SET_LUMINANCE;Luminansa +TP_BWMIX_SET_NORMCONTAST;Normalni kontrast +TP_BWMIX_SET_ORTHOCHRO;Ortohromatski +TP_BWMIX_SET_PANCHRO;Panhromatski +TP_BWMIX_SET_PORTRAIT;Portret +TP_BWMIX_SET_RGBABS;Apsolutni RGB mešanja kanala +TP_BWMIX_SET_RGBREL;Relativni RGB mešanja kanala +TP_BWMIX_SET_ROYGCBPMABS;Apsolutni ROYGCBPM mešanja kanala +TP_BWMIX_SET_ROYGCBPMREL;Relativni ROYGCBPM mešanja kanala +TP_BWMIX_TCMODE_FILMLIKE;Crno-belo, nalik filmu +TP_BWMIX_TCMODE_SATANDVALBLENDING;Crno-beli, stapanje zasićenosti i vrednosti +TP_BWMIX_TCMODE_STANDARD;Crno-beli, uobičajeni +TP_BWMIX_TCMODE_WEIGHTEDSTD;Crno-beli, mereni standard +TP_BWMIX_VAL;L +TP_BWMIX_YELLOW;Žuta TP_CACORRECTION_BLUE;Plava TP_CACORRECTION_LABEL;Hromatke aberacije TP_CACORRECTION_RED;Crvena @@ -605,13 +959,109 @@ TP_CHMIXER_GREEN;Zelena TP_CHMIXER_LABEL;Mešanje kanala TP_CHMIXER_RED;Crvena TP_CHROMATABERR_LABEL;Hromatske aberacije +TP_COARSETRAF_DEGREE;stepeni: TP_COARSETRAF_TOOLTIP_HFLIP;Izvrće sliku horizontalno TP_COARSETRAF_TOOLTIP_ROTLEFT;Okreće sliku ulevo TP_COARSETRAF_TOOLTIP_ROTRIGHT;Okreće sliku udesno TP_COARSETRAF_TOOLTIP_VFLIP;Izvrće sliku vertikalno +TP_COLORAPP_ADAPTSCENE;Luminoznost scene +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Aposolutna luminoznost okruženja scene (cd/m²).\n1) Računa se iz Exif podataka:\nBrzina zatvarača - ISO vrednost - otvor blende - korekcija ekspozicije kamere.\n2) Računa se iz bele tačke sirove slike unutar dela programa za kompenzaciju ekspozicije. +TP_COLORAPP_ADAPTVIEWING;Luminoznost za pregled (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Apsolutna luminoznost okruženja za pregled\n(obično 16cd/m²). +TP_COLORAPP_ADAP_AUTO_TOOLTIP;Ukoliko je štiklirano (preporučeno), program računa optimalne vrednosti na osnovu Exif podataka.\nZa ručno postavljanje ovih vrednosti, odštiklirajte ovo polje. +TP_COLORAPP_ALGO;Algoritam +TP_COLORAPP_ALGO_ALL;Sve +TP_COLORAPP_ALGO_JC;Svetlina + Boja (JC) +TP_COLORAPP_ALGO_JS;Svetlina + Hrominansa (JS) +TP_COLORAPP_ALGO_QM;Osvetljenost + Živost boja (QM) +TP_COLORAPP_ALGO_TOOLTIP;Omogućava izbor između podskupa parametara ili svih parametara. +TP_COLORAPP_BADPIXSL;Filter vrućih/loših piksela +TP_COLORAPP_BADPIXSL_TOOLTIP;Potiskivanje vrućih/loših (presvetlo obojenih) piksela.\n0 = bez efekta\n1 = medijan\n2 = gauzijan.\n\nOve greške se javljaju usled CIECAM02 ograničenja. Drugi način za izbegavanje grešaka je da podesite sliku tako da izbegnete veoma tamne senke. +TP_COLORAPP_BRIGHT;Osvetljenost (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;Osvetljenost u CIECAM02 sistemu uzima u obzir luminansu bele i razlikuje se u odnosu na Lab i RGB osvetljenost. +TP_COLORAPP_CHROMA;Hroma (C) +TP_COLORAPP_CHROMA_M;Živost boja (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;Živost boja u CIECAM02 sistemu se razlikuje u odnosu na Lab i RGB osvetljenost. +TP_COLORAPP_CHROMA_S;Zasićenost (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;Zasićenost u CIECAM02 sistemu se razlikuje u odnosu na Lab i RGB osvetljenost. +TP_COLORAPP_CHROMA_TOOLTIP;Hroma u CIECAM02 sistemu se razlikuje u odnosu na Lab i RGB osvetljenost. +TP_COLORAPP_CIECAT_DEGREE;prilagođavanje za CAT02 +TP_COLORAPP_CONTRAST;Kontrast (J) +TP_COLORAPP_CONTRAST_Q;Kontrast (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast u CIECAM02 sistemu za Q klizač; razlikuje se od Lab i RGB kontrasta. +TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast u CIECAM02 sistemu za J klizač; razlikuje se od Lab i RGB kontrasta. +TP_COLORAPP_CURVEEDITOR1;Kriva tonova 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Prikazuje histogram za L (Lab) pre CIECAM02.\nUkoliko je omogućeno „CIECAM02 izlazni histogram u krivuljama“, prikazujer histogram za J ili Q nakon CIECAM02.\n\nJ i Q se ne prikazuju u glavnoj površi histograma.\n\nZa konaačni izla pogledajte glavnu površ histograma. +TP_COLORAPP_CURVEEDITOR2;Kriva tonova 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Koristi se na isti način kao i druga kriva tonova ekspozicije. +TP_COLORAPP_CURVEEDITOR3;Kriva boja +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Podešava bilo hromu, zasićenost ili živost boja.\n\nPrikazuje histogram hromatise (Lab) pre CIECAM02.\nUkoliko je omogućeno „CIECAM02 izlazni histogram u krivuljama“, prikazuje histogram za C, s ili M nakon CIECAM02.\n\nC, s i M se ne prikazuju u glavnoj površi za histogram.\nZa konaačni izla pogledajte glavnu površ histograma. +TP_COLORAPP_DATACIE;CIECAM02 izlazni histogram u krivuljama +TP_COLORAPP_DATACIE_TOOLTIP;Kada je omogućeno, histogrami u CIECAM02 krivim prikazuju približne vrednosti/opsege za J ili Q, i C, s ili M nakon CIECAM02 podešavanja.\nOvaj izbor ne utiče na prikaz u glavnoj površi za histogram.\n\nKada je isključeno, histogrami u CIECAM02 krivim prikazuju Lab vrednosti pre CIECAM02 podešavanja. +TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Ukoliko je štiklirano (preporučeno), program račina optimalne vrednosti, koje se zatim koriste za CAT02, a takođe za čitav CIECAM02.\nDa bi postavili vrednosti ručne, odštiklirajte ovo polje (preporučene su vrednosti iznad 65). +TP_COLORAPP_DEGREE_TOOLTIP;Količina preobražaja CIE hromatske adaptacije2002. +TP_COLORAPP_GAMUT;Kontrola gamuta (Lab) +TP_COLORAPP_GAMUT_TOOLTIP;Omogućava kontrolu gamuta u Lab režimu. +TP_COLORAPP_HUE;Nijansa (h) +TP_COLORAPP_HUE_TOOLTIP;Nijansa (h) - ugao između 0° i 360°. +TP_COLORAPP_LABEL;CIECAM 2002 model izgleda boja +TP_COLORAPP_LABEL_CAM02;Podešavanja slike +TP_COLORAPP_LABEL_SCENE;Uslovi scene +TP_COLORAPP_LABEL_VIEWING;Uslovi za pregled +TP_COLORAPP_LIGHT;Svetlina (J) +TP_COLORAPP_LIGHT_TOOLTIP;Svetlina u CIECAM02 se razlikuje od Lab ili RGB svetline. +TP_COLORAPP_MODEL;WP model +TP_COLORAPP_MODEL_TOOLTIP;Model bele-tačke.\n\nBalans bele [RT] + [izlaz]: balans bele iz programa se koristi za kadar, CIECAM02 se postavlja na D50, a balans bele izlaznog uređaja se određuje iz Podešavanja > Upravljanje bojama.\n\nBalans bele [RT+CAT02] + [izlaz]: podešavanja balansa bele iz programa se koriste od strane CAT02, a balans bele izlaznog uređaja se određuje iz Podešavanja - Upravljanje bojama. +TP_COLORAPP_RSTPRO;Zaštita crvene i boje kože +TP_COLORAPP_RSTPRO_TOOLTIP;Zaštita crvene boje i boje kože (klizači i krive). +TP_COLORAPP_SHARPCIE;--ne koristi se-- +TP_COLORAPP_SHARPCIE_TOOLTIP;--ne koristi se-- +TP_COLORAPP_SURROUND;Okruženo +TP_COLORAPP_SURROUND_AVER;Prosečno +TP_COLORAPP_SURROUND_DARK;Tamno +TP_COLORAPP_SURROUND_DIM;Zatamnjeno +TP_COLORAPP_SURROUND_EXDARK;Jako tamno +TP_COLORAPP_SURROUND_TOOLTIP;Menja tonove i boje kako bi se prilagodilo uslovima uređaja za prikaz.\n\nProsečno: Prosečno osvetljeno okruženje (uobičajeno). Slika neće biti izmenjena.\n\nZatamnjeno: Zatamnjeno okruženje (TV). Slika će postati za nijansu tamnija.\n\nTamno: Tamno okruženje (projektor). Slika će postati još više tamna.\n\nJako tamno: Ekstramno tamno okruženje (cutsheet). Slika će postati izuzetno tamna. +TP_COLORAPP_SURSOURCE;Tamno okruženje +TP_COLORAPP_SURSOURCE_TOOLTIP;Može da se koristi ukoliko slika ima tamne ivice. +TP_COLORAPP_TCMODE_BRIGHTNESS;Osvtljenost +TP_COLORAPP_TCMODE_CHROMA;Hroma +TP_COLORAPP_TCMODE_COLORF;Živost boja +TP_COLORAPP_TCMODE_LABEL1;Režim krive 1 +TP_COLORAPP_TCMODE_LABEL2;Režim krive 2 +TP_COLORAPP_TCMODE_LABEL3;Kriva u hrom režimu +TP_COLORAPP_TCMODE_LIGHTNESS;Svetlina +TP_COLORAPP_TCMODE_SATUR;Zasićenost +TP_COLORAPP_TONECIE;Mapiranje tonova u CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;Ukoliko je isključena ova opcija, mapiranje tonova se vrši u Lab okruženju.\nUkoliko je uključena, mapiranje se vrši pomoću CIECAM02.\nMorate koristiti alat za mapiranje tonova kako bi ova opcija bila primenjena. +TP_COLORAPP_WBCAM;Balans bele [RT+CAT02] + [izlaz] +TP_COLORAPP_WBRT;Balans bele [RT] + [izlaz] +TP_COLORBOOST_ACHANNEL;Kanal „a“ +TP_COLORBOOST_AMOUNT;Količina +TP_COLORBOOST_AVOIDCOLORCLIP;Izbegni odsecanje boja +TP_COLORBOOST_BCHANNEL;Kanal „b“ +TP_COLORBOOST_CHANNEL;Kanal +TP_COLORBOOST_CHSEPARATE;razdvoji +TP_COLORBOOST_ENABLESATLIMITER;Omogući ograničenje zasićenosti +TP_COLORBOOST_LABEL;Pojačanje boja +TP_COLORBOOST_SATLIMIT;Granica za zasićenost +TP_COLORDENOISE_EDGESENSITIVE;Osetljivo na ivice +TP_COLORDENOISE_EDGETOLERANCE;Tolerancija ivice +TP_COLORDENOISE_LABEL;Uklaljanje kolornog šuma +TP_COLORDENOISE_RADIUS;Poluprečnik +TP_COLORSHIFT_BLUEYELLOW;Plava-Žuta +TP_COLORSHIFT_GREENMAGENTA;Zelena-Ljubičasta +TP_COLORSHIFT_LABEL;Pomeranje boja +TP_CROP_DPI;TPI= TP_CROP_FIXRATIO;Srazmerno: TP_CROP_GTDIAGONALS;Pravilo dijagonala +TP_CROP_GTEPASSPORT;Biometrijski pasoš +TP_CROP_GTFRAME;Okvir TP_CROP_GTGRID;Mreža +TP_CROP_GTHARMMEANS1;Zlatni presek 1 +TP_CROP_GTHARMMEANS2;Zlatni presek 2 +TP_CROP_GTHARMMEANS3;Zlatni presek 3 +TP_CROP_GTHARMMEANS4;Zlatni presek 4 TP_CROP_GTNONE;Ništa TP_CROP_GTRULETHIRDS;Pravilo trećina TP_CROP_GUIDETYPE;Vođice: @@ -627,10 +1077,22 @@ TP_DARKFRAME_LABEL;Tamni kadar TP_DEFRINGE_LABEL;Uklaljanje oreola TP_DEFRINGE_RADIUS;Poluprečnik TP_DEFRINGE_THRESHOLD;Prag +TP_DETAIL_AMOUNT;Količina +TP_DIRPYRDENOISE_BLUE;Hrominansa: Plava-Žuta TP_DIRPYRDENOISE_CHROMA;Boja +TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Može se upotrebiti za raw ili ne-raw slike.\n\nZa slike koje nisu u raw formatu uklanjanje šuma luminanse zavisi od game ulaznog profila boja. Podrazumeva se upotreba sRGB profila, pa će efekat uklanjanja šuma luminanse biti različit ukoliko se koristi profil boja sa drugom vrednošću game. +TP_DIRPYRDENOISE_ENH;Poboljšani režim +TP_DIRPYRDENOISE_ENH_TOOLTIP;Povećava kvalitet uklanjanja šuma na uštrb oko 20% vremena za obradu. TP_DIRPYRDENOISE_GAMMA;Gama +TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gama utiče na jačinu uklanjanja šuma preko opseg tonova. Manja vrednost će uticati na senke, veća će povećati ovaj efekat i na svetlije tonove. TP_DIRPYRDENOISE_LABEL;Direkciono piramidno uklanjanje šuma +TP_DIRPYRDENOISE_LDETAIL;Detalji luminanse TP_DIRPYRDENOISE_LUMA;Luminansa +TP_DIRPYRDENOISE_METHOD;Način +TP_DIRPYRDENOISE_METHOD_TOOLTIP;Za rav slike možete koristiti RGB ili Lab režime.\n\nZa ostale slike se koristi Lab, bez obzira na izbor. +TP_DIRPYRDENOISE_PERF;RGB režim (raw slike) +TP_DIRPYRDENOISE_RED;Hrominansa - crvena-zelena +TP_DIRPYRDENOISE_RGB;RGB TP_DIRPYREQUALIZER_LABEL;Detaljni nivo kontrasta TP_DIRPYREQUALIZER_LUMACOARSEST;grubo TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- @@ -642,18 +1104,43 @@ TP_DISTORTION_AMOUNT;Količina TP_DISTORTION_AUTO;Sam ispravi izobličenja TP_DISTORTION_AUTO_TIP;(Eksperimentalno) Automatski ispravlja izobličenja nekih aparata (M4/3, neki kompakti, i dr.) TP_DISTORTION_LABEL;Izobličenja +TP_EPD_EDGESTOPPING;Izoštravanje ivice +TP_EPD_LABEL;Mapiranje tonova +TP_EPD_REWEIGHTINGITERATES;Broj ponovnih merenja +TP_EPD_SCALE;Razmera +TP_EPD_STRENGTH;Jačina +TP_EPD_TOOLTIP;Mapiranje tonova je moguće u Lab (standardnom) ili CIECAM02 režimu.\n\nZa rad u CIECAM02 režimu uključite:\n1. CIECAM02\n2. Algoritam="Osvetljenje + živopisnost (QM)"\n3. "Mapiranje tonova u CIECAM02 osvetljenju (Q)" +TP_EQUALIZER_CONTRAST_MINUS;Kontrast - +TP_EQUALIZER_CONTRAST_PLUS;Kontrast + +TP_EQUALIZER_FINEST;najfinije +TP_EQUALIZER_LABEL;Talasno ujednačenje +TP_EQUALIZER_LARGEST;najgrublje +TP_EQUALIZER_NEUTRAL;Neutralno +TP_EXPOSCORR_LABEL;Raw bela tačka TP_EXPOSURE_AUTOLEVELS;Auto-nivoi +TP_EXPOSURE_AUTOLEVELS_TIP;Omogućava automatsko određivanje nivoa, koji podešava klizače ekspozicije na osnovu podatka o samoj slici.\nUključuje čupanje svetlih delova ukoliko je neophodno. TP_EXPOSURE_BLACKLEVEL;Crna TP_EXPOSURE_BRIGHTNESS;Osvetljenost TP_EXPOSURE_CLIP;Odseci +TP_EXPOSURE_CLIP_TIP;Deo piksela koje će biti odsečeni primenom automatskih nivoa. TP_EXPOSURE_COMPRHIGHLIGHTS;Sabijanje svetlog TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Prag za čupanje svetlih delova TP_EXPOSURE_COMPRSHADOWS;Sabijanje senki TP_EXPOSURE_CONTRAST;Kontrast TP_EXPOSURE_CURVEEDITOR;Kriva nijansi +TP_EXPOSURE_CURVEEDITOR1;Kriva tonova 1 +TP_EXPOSURE_CURVEEDITOR2;Kriva tonova 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Pogledajte „Ekspozicija > Krive tonova“ unutar članka na sajtu RawPedia kako bi naučili kako se postižu najbolji rezučtati uspotrebom dve krive tonova. TP_EXPOSURE_EXPCOMP;Kompenzacija TP_EXPOSURE_LABEL;Ekspozicija TP_EXPOSURE_SATURATION;Zasićenost +TP_EXPOSURE_TCMODE_FILMLIKE;Nalik foto-filmu +TP_EXPOSURE_TCMODE_LABEL1;1. režim krive +TP_EXPOSURE_TCMODE_LABEL2;2. režim krive +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Utapanje zasićenosti i vrednosti +TP_EXPOSURE_TCMODE_STANDARD;Standard +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Uravnoteženi standard +TP_EXPO_AFTER; Pre interpolacije (pre prevoda u RGB) TP_FLATFIELD_AUTOSELECT;Sam izaberi TP_FLATFIELD_BLURRADIUS;Poluprečnik zamućenja TP_FLATFIELD_BLURTYPE;Zamuti @@ -662,63 +1149,178 @@ TP_FLATFIELD_BT_HORIZONTAL;Horizontalno TP_FLATFIELD_BT_VERTHORIZ;Horiz. i vertik. TP_FLATFIELD_BT_VERTICAL;Vertikalno TP_FLATFIELD_LABEL;Ravno polje +TP_GAMMA_COMMENT;(onemogućen je izlazni profil, osim „default“) +TP_GAMMA_CURV;Gama TP_GAMMA_FREE;Gama sloboda TP_GAMMA_OUTPUT;Izlazna gama TP_GAMMA_SLOP;nagib (linearni) +TP_GENERAL_11SCALE_TOOLTIP;Efekt ovog alata ili njegovih opcija se vidi samo u razmeri 1:1. +TP_GRADIENT_CENTER;Centar +TP_GRADIENT_CENTER_X;Centar X +TP_GRADIENT_CENTER_X_TOOLTIP;Pomera gradijent ulevo (negativne vrednosti) ili udesno (pozitivne vrednosti). +TP_GRADIENT_CENTER_Y;Centar Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Pomera gradijent na gore (negativne vrednosti) ili na dole (pozitivne vrednosti). +TP_GRADIENT_DEGREE;Ugao +TP_GRADIENT_DEGREE_TOOLTIP;Okreće ugao gradijenta za odabrani broj stepeni. +TP_GRADIENT_FEATHER;Umekšavanje +TP_GRADIENT_FEATHER_TOOLTIP;Širina gradijenta u procentima dijagonale slike. +TP_GRADIENT_LABEL;Filter gradijenta +TP_GRADIENT_STRENGTH;Jačina +TP_GRADIENT_STRENGTH_TOOLTIP;Jačina filtera u broju tačaka prekida. TP_HLREC_BLEND;Utapanje TP_HLREC_CIELAB;CieLab stapanje TP_HLREC_COLOR;Propaginacija boje +TP_HLREC_ENA_TOOLTIP;Može se aktivirati opcijom „Auto-nivoi“. TP_HLREC_LABEL;Čupanje svetlih delova TP_HLREC_LUMINANCE;Izvlačenje luminanse TP_HLREC_METHOD;Način: +TP_HSVEQUALIZER1;Crvena +TP_HSVEQUALIZER2;Žuta +TP_HSVEQUALIZER3;Limun +TP_HSVEQUALIZER4;Zelena +TP_HSVEQUALIZER5;Vodena +TP_HSVEQUALIZER6;Plava +TP_HSVEQUALIZER7;Ljubičasta +TP_HSVEQUALIZER8;Magneta TP_HSVEQUALIZER_CHANNEL;HSV kanal TP_HSVEQUALIZER_HUE;Nijansa TP_HSVEQUALIZER_LABEL;Ujednačenje HSV kanala TP_HSVEQUALIZER_SAT;Zasićenost TP_HSVEQUALIZER_VAL;Vrednost TP_ICM_BLENDCMSMATRIX;Utopi svetle delove u matricu +TP_ICM_BLENDCMSMATRIX_TOOLTIP;Omogućite kako bi povratili preosvetljene delove ukoliko koristite LUT ICC profile. +TP_ICM_DCPILLUMINANT;Iluminantno +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolirano +TP_ICM_FILEDLGFILTERANY;Bilo koja datoteka +TP_ICM_FILEDLGFILTERICM;ICC profili +TP_ICM_GAMMABEFOREINPUT;Profil za primenu Game TP_ICM_INPUTCAMERA;Podrazumevano iz aparata TP_ICM_INPUTCAMERAICC;Foto-aparat ili standardni ICC +TP_ICM_INPUTCAMERA_TOOLTIP;Koristi prostu matricu boja iz programa dcraw, unapređenu RawTherapee verziju (koja god da je dostupna za vaš model foto-aparata) ili neki od ugrađenih DNG profila. TP_ICM_INPUTCUSTOM;Proizvoljno +TP_ICM_INPUTCUSTOM_TOOLTIP;Izaberite željeni DCP/ICC profil boja za foto-aparat. TP_ICM_INPUTDLGLABEL;Izaberite ulazni ICC profil... TP_ICM_INPUTEMBEDDED;Ugnježđeno, ukoliko je moguće +TP_ICM_INPUTEMBEDDED_TOOLTIP;Koristi profil boja koji je ugrađen u ne-raw datoteke. TP_ICM_INPUTNONE;Nema profila +TP_ICM_INPUTNONE_TOOLTIP;Uopšte ne koristi ulazni profil boja.\nPrimenjuje se samo u posebnim okolnostima. TP_ICM_INPUTPROFILE;Ulazni profil TP_ICM_LABEL;ICM TP_ICM_NOICM;No ICM: sRGB izlaz TP_ICM_OUTPUTPROFILE;Izlazni profil TP_ICM_SAVEREFERENCE;Sačuvaj sliku kao referencu za profil +TP_ICM_SAVEREFERENCE_TOOLTIP;Sačuvaj linearnu TIFF sliku pre primene ulaznog profila. Rezultat može da se koristi za kalibraciju i izradu profila foto-aparata. +TP_ICM_TONECURVE;Koristi DCP krivu tonova +TP_ICM_TONECURVE_TOOLTIP;Upotrebljava ugrađenu DCP krivu tonova. Ovo podešavanje je omogućeno samo ako izabrani DCP ima krivu tonova. TP_ICM_WORKINGPROFILE;Radni profil TP_IMPULSEDENOISE_LABEL;Impulsno uklanjanje šuma TP_IMPULSEDENOISE_THRESH;Prag +TP_LABCURVE_AVOIDCOLORCLIP;Onemogući odsecanje boje +TP_LABCURVE_AVOIDCOLORSHIFT;Izbegni pomeranje boja +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Postavlja boje u opseg trenutnog radnog prostora boja i primenjuje Munselovu korekciju. TP_LABCURVE_BRIGHTNESS;Osvetljenost +TP_LABCURVE_CHROMATICITY;Boje +TP_LABCURVE_CHROMA_TOOLTIP;To apply CB toning, set Chromaticity to -100. TP_LABCURVE_CONTRAST;Kontrast TP_LABCURVE_CURVEEDITOR;Kriva svetlosti +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Zasićena zelena +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Pastelna zelena +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Pastelna crvena +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Zasićena crvena +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Zasićena plava +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Pastelna plava +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Pastelna žuta +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Zasićena žuta +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutralno +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Isprano +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastelno +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Zasićeno +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Boja kao funkcija boje C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Boja kao funkcija nijanse C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Hrominansa na osnovu luminanse C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Nijansa kao funkcija nijanse H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Svetnost kao funkcija boje L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Svetlost kao funkcija nijanse L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Svetlost kao funkcija svetlosti L=f(L) +TP_LABCURVE_ENABLESATLIMITER;Uključi graničnik zasićenosti TP_LABCURVE_LABEL;Lab kriva +TP_LABCURVE_LCREDSK;Ograniči LC na crvenu i boju kože +TP_LABCURVE_LCREDSK_TIP;Ukoliko je uključeno, LC kriva će uticati samo na crvenu i boju kože.\nU suprotnom se primenjuje na sve tonove. +TP_LABCURVE_RSTPROTECTION;Zaštita crvene i boje kože +TP_LABCURVE_RSTPRO_TOOLTIP;Može se koristiti sa klizačem za Hrominansu i CC krivom. +TP_LABCURVE_SATLIMIT;Graničnik zasićenosti +TP_LABCURVE_SATURATION;Zasićenost TP_LENSGEOM_AUTOCROP;Sam iseci TP_LENSGEOM_FILL;Sam popuni TP_LENSGEOM_LABEL;Objektiv i geometrija +TP_LENSPROFILE_FILEDLGFILTERLCP;Fajlovi sa izobličenjima objektiva +TP_LENSPROFILE_LABEL;Profili za ispravljanje izobličenja objektiva +TP_LENSPROFILE_USECA;Ispravljanje hrom. aberacija +TP_LENSPROFILE_USEDIST;Ispravljanje izobličenja +TP_LENSPROFILE_USEVIGN;Ispravljanje vinjetarenja +TP_LUMACURVE_BLACKLEVEL;Crna +TP_LUMACURVE_BRIGHTNESS;Osvetljenje +TP_LUMACURVE_COMPRHIGHLIGHTS;Sabijanje svetlog +TP_LUMACURVE_COMPRSHADOWS;Sabijanje senki +TP_LUMACURVE_CONTRAST;Kontrast +TP_LUMACURVE_CURVEEDITOR;Kriva liminanse +TP_LUMACURVE_LABEL;Kriva luminanse +TP_NEUTRAL;Neutralno +TP_NEUTRAL_TIP;Vraća klizače ekspozicije na neutralne vrednosti.\nPrimenjuje se na iste kontrole kao u Auto nivoi, bez obzira na to da li ste koristili Auto nivoe ili ne. +TP_PCVIGNETTE_FEATHER;Umekšavanje +TP_PCVIGNETTE_FEATHER_TOOLTIP;Umekšavanje:\n0 = samo uglove,\n50 = na polovinu od centra,\n100 = centar. +TP_PCVIGNETTE_LABEL;Filter vinjetarenja +TP_PCVIGNETTE_ROUNDNESS;Zaokrugljenost +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Zaokrugljenost:\n0 = kvadrat,\n50 = prelaz od kvadrata ka krugu,\n100 = krug. +TP_PCVIGNETTE_STRENGTH;Jačina +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Jačina filtera u prekidima (koji se dostižu na uglovima). TP_PERSPECTIVE_HORIZONTAL;Horizontalna TP_PERSPECTIVE_LABEL;Perspektiva TP_PERSPECTIVE_VERTICAL;Vertikalna +TP_PFCURVE_CURVEEDITOR_CH;Nijansa +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Određuje jačinu uklaljanja boje.\nVišlje = više,\nNiže = manje. TP_PREPROCESS_GREENEQUIL;Kalibracija zelene boje +TP_PREPROCESS_HOTDEADPIXFILT;Izbaci pregorele i mrtve piksele +TP_PREPROCESS_HOTDEADPIXFILT_TOOLTIP;Pokušava da ukloni vruće i mrtve piksele. TP_PREPROCESS_LABEL;Predobrada TP_PREPROCESS_LINEDENOISE;Linijski filter šuma TP_PREPROCESS_NO_FOUND;Nije pronađeno TP_RAWCACORR_AUTO;Ispravi hromatske aberacije TP_RAWCACORR_CABLUE;Plava TP_RAWCACORR_CARED;Crvena +TP_RAWEXPOS_BLACKONE;Nivo crne: Crvena TP_RAWEXPOS_BLACKS;Nivo crne +TP_RAWEXPOS_BLACKTHREE;Nivo crne: Zelena 2 +TP_RAWEXPOS_BLACKTWO;Nivo crne: Plava +TP_RAWEXPOS_BLACKZERO;Nivo crne: Zelena 1 (vodeća) TP_RAWEXPOS_LINEAR;Linearni faktor korekcije TP_RAWEXPOS_PRESER;Očuvanje svetlih delova TP_RAWEXPOS_TWOGREEN;Obe zelene +TP_RAW_ALLENHANCE;Ukloni artafakte/šum nakon rasklapanja TP_RAW_DCBENHANCE;Primeni DCB poboljšanje TP_RAW_DCBITERATIONS;Broj DCB prolaza TP_RAW_DMETHOD;Način +TP_RAW_DMETHOD_PROGRESSBAR;%1 rasklapam mozaik... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Poboljšavam mozaik... +TP_RAW_DMETHOD_TOOLTIP;Primedba: IGV i LMMSE služe kod velikih ISO vrednosti slike i služe za ispomoć pri uklanjanje šuma kako ne bi došlo do efekta posterizacije ili ispranog izlgeda. TP_RAW_FALSECOLOR;Koraci za prigušivanje lažne boje TP_RAW_LABEL;Rasklapanje mozaika +TP_RAW_LMMSEITERATIONS;Koraci LMMSE poboljšanja +TP_RAW_LMMSE_TOOLTIP;Dodaje gamu (korak 1), medijan (koraci 2-4) i poboljšanja (koraci 5-6) kako bi smanjio neispravnosti i poboljšao odnos signal-prema-šum. TP_RESIZE_APPLIESTO;Primeni na: +TP_RESIZE_BICUBIC;Bikubično +TP_RESIZE_BICUBICSF;Bikubično (mekše) +TP_RESIZE_BICUBICSH;Bikubično (oštrije) +TP_RESIZE_BILINEAR;Bilinearno TP_RESIZE_CROPPEDAREA;Isečenu oblast +TP_RESIZE_DOWNSCALEB;Smanjenje razmere (bolje) +TP_RESIZE_DOWNSCALEF;Smanjenje razmere (brže) TP_RESIZE_FITBOX;Širinu i visinu TP_RESIZE_FULLIMAGE;Celu sliku TP_RESIZE_H;V: @@ -731,15 +1333,26 @@ TP_RESIZE_SCALE;Umanjenje TP_RESIZE_SPECIFY;Izaberi: TP_RESIZE_W;Š: TP_RESIZE_WIDTH;Širinu +TP_RGBCURVES_BLUE;P +TP_RGBCURVES_CHANNEL;Kanal +TP_RGBCURVES_GREEN;Z +TP_RGBCURVES_LABEL;RGB krive +TP_RGBCURVES_LUMAMODE;Režim luminanse +TP_RGBCURVES_LUMAMODE_TOOLTIP;Režim liminanse omogućava da menjate udeo crvenog, zelenog i plavog kanala iz luminanse slike što ne utiče na promenu boje fotografije. +TP_RGBCURVES_RED;C +TP_ROTATE_AUTOCROP;Sam iseci TP_ROTATE_DEGREE;Stepeni: +TP_ROTATE_FILL;Popuni TP_ROTATE_LABEL;Rotacija TP_ROTATE_SELECTLINE; Postavi pravu liniju +TP_SAVEDIALOG_OK_TIP;Prečica: Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Svetlo TP_SHADOWSHLIGHTS_HLTONALW;Širina tonova TP_SHADOWSHLIGHTS_LABEL;Senke/Svetlo TP_SHADOWSHLIGHTS_LOCALCONTR;Lokalni kontrast TP_SHADOWSHLIGHTS_RADIUS;Poluprečnik TP_SHADOWSHLIGHTS_SHADOWS;Senke +TP_SHADOWSHLIGHTS_SHARPMASK;Oštra maska TP_SHADOWSHLIGHTS_SHTONALW;Širina tonova TP_SHARPENEDGE_AMOUNT;Količina TP_SHARPENEDGE_LABEL;Ivice @@ -759,11 +1372,29 @@ TP_SHARPENING_RLD_AMOUNT;Količina TP_SHARPENING_RLD_DAMPING;Prigušivanje TP_SHARPENING_RLD_ITERATIONS;Ponavljanja TP_SHARPENING_THRESHOLD;Prag +TP_SHARPENING_TOOLTIP;Očekujte nešto drugačiji efekat kada koristite CIECAM02. Ukoliko primetite razlike, podesite ih po svom ukusu. TP_SHARPENING_USM;Oštrina maske TP_SHARPENMICRO_AMOUNT;Količina TP_SHARPENMICRO_LABEL;Mikrokonttrast TP_SHARPENMICRO_MATRIX;3×3 matrica umesto 5×5 TP_SHARPENMICRO_UNIFORMITY;Ujednačenost +TP_VIBRANCE_AVOIDCOLORSHIFT;Izbegni pomeranje boja +TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Boja kože +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Crvena/ljubičasta +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Crvena +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Crvena/žuta +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Žuta +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Nijansa na osnovu HUE H=f(H) +TP_VIBRANCE_LABEL;Živost boja +TP_VIBRANCE_PASTELS;Pastelne boje +TP_VIBRANCE_PASTSATTOG;Poveži zasićene i pastelne boje +TP_VIBRANCE_PROTECTSKINS;Očuvaj boju kože +TP_VIBRANCE_PSTHRESHOLD;Prag za pastelne/zasićene boje +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Prag za zasićene boje +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;Vertikalna osa sadrži pastelne tonove pri dnu i zasićene tonove na vrhu.\nHorizontalna osa predstavlja opseg zasićenja. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Težina prelaza pastelnih/zasićenih boja +TP_VIBRANCE_SATURATED;Zasićene boje TP_VIGNETTING_AMOUNT;Količina TP_VIGNETTING_CENTER;Centar TP_VIGNETTING_CENTER_X;Centar X @@ -773,17 +1404,54 @@ TP_VIGNETTING_RADIUS;Poluprečnik TP_VIGNETTING_STRENGTH;Jačina TP_WBALANCE_AUTO;Sam odredi TP_WBALANCE_CAMERA;Iz aparata +TP_WBALANCE_CLOUDY;Oblačno vreme TP_WBALANCE_CUSTOM;Proizvoljno +TP_WBALANCE_DAYLIGHT;Dnevno svetlo (sunčano) +TP_WBALANCE_EQBLUERED;Balans crvene i plave +TP_WBALANCE_EQBLUERED_TOOLTIP;Dozvoljava nestandardno podešavanje balansa bele pomoću balansa plave i crvene boje.\nOvo je korisno kada:\na) slikate u nestandardnim uslovima svetla (npr. pod vodom),\nb) su uslovi daleko drugačiji od onih u kojima je izvršena kalibracija,\nv) su matrice ili ICC profili neodgovarajući. +TP_WBALANCE_FLASH55;Leika +TP_WBALANCE_FLASH60;Standardni, Kenon, Pentaks, Olimpus +TP_WBALANCE_FLASH65;Nikon, Panasonik, Soni, Minolta +TP_WBALANCE_FLASH_HEADER;Blic +TP_WBALANCE_FLUO1;F1 - Dnevno svetlo +TP_WBALANCE_FLUO2;F2 - Hladno svetlo +TP_WBALANCE_FLUO3;F3 - Belo svetlo +TP_WBALANCE_FLUO4;F4 - Toplo-belo svetlo +TP_WBALANCE_FLUO5;F5 - Dnevno svetlo +TP_WBALANCE_FLUO6;F6 - Svetlo-belo svetlo +TP_WBALANCE_FLUO7;F7 - D65 simulator dnevne svetlosti +TP_WBALANCE_FLUO8;F8 - D50 / Silvanija F40 dizajn +TP_WBALANCE_FLUO9;F9 - Hladna, deluks-bela +TP_WBALANCE_FLUO10;F10 - Filips TL85 +TP_WBALANCE_FLUO11;F11 - Filips TL84 +TP_WBALANCE_FLUO12;F12 - Filips TL83 +TP_WBALANCE_FLUO_HEADER;Neonsko svetlo TP_WBALANCE_GREEN;Zelenilo +TP_WBALANCE_GTI;GeTeI +TP_WBALANCE_HMI;HaEmI +TP_WBALANCE_JUDGEIII;DžudIII TP_WBALANCE_LABEL;Balans bele +TP_WBALANCE_LAMP_HEADER;Lampa +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED osvetljenje +TP_WBALANCE_LED_LSI;LSI Lumeleks 2040 TP_WBALANCE_METHOD;Način: +TP_WBALANCE_SHADE;U senci TP_WBALANCE_SIZE;Veličina: +TP_WBALANCE_SOLUX35;Soluks 3500K +TP_WBALANCE_SOLUX41;Soluks 4100K +TP_WBALANCE_SOLUX47;Soluks 4700K (proizvođač) +TP_WBALANCE_SOLUX47_NG;Soluks 4700K (Nac. galerija) TP_WBALANCE_SPOTWB;Iz tačke TP_WBALANCE_TEMPERATURE;Temperatura +TP_WBALANCE_TUNGSTEN;Obična sijalica +TP_WBALANCE_WATER1;Podvodna fotografija 1 +TP_WBALANCE_WATER2;Podvodna fotografija 2 +TP_WBALANCE_WATER_HEADER;Podvodna fotografija ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otvara novi prozor sa detaljima ZOOMPANEL_ZOOM100;Povećava pregled na 100% z -ZOOMPANEL_ZOOMFITSCREEN;Uklapa sliku u veličinu prozora f +ZOOMPANEL_ZOOMFITSCREEN;Uklapa sliku u veličinu prozora F ZOOMPANEL_ZOOMIN;Uvećava prikaz slike + ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - @@ -791,67 +1459,30 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ABOUT_TAB_RELEASENOTES;Release Notes -!BATCHQUEUE_DESTFILENAME;Path and file name !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. +!DIRBROWSER_FOLDERS;Folders !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. -!EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) -!EXPORT_BYPASS_ALL;Select / Unselect All -!EXPORT_BYPASS_DEFRINGE;Bypass Defringe -!EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction -!EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -!EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction -!EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression -!EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps -!EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -!EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame -!EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field -!EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration -!EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter -!EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -!EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening -!EXPORT_BYPASS_SHARPENING;Bypass Sharpening -!EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast -!EXPORT_BYPASS_SH_HQ;Bypass Sharp Mask Shadows/Highlights -!EXPORT_FASTEXPORTOPTIONS;Fast Export Options -!EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -!EXPORT_MAXHEIGHT;Maximum height: -!EXPORT_MAXWIDTH;Maximum width: -!EXPORT_PUTTOQUEUEFAST; Put to queue for fast export -!EXPORT_RAW_DMETHOD;Demosaic method -!EXTPROGTARGET_1;raw -!EXTPROGTARGET_2;queue-processed -!FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_EXTPROGMENU;Open with -!FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow !FILEBROWSER_POPUPCOLORLABEL3;Label: Green !FILEBROWSER_POPUPCOLORLABEL4;Label: Blue !FILEBROWSER_POPUPCOLORLABEL5;Label: Purple -!FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) -!FILEBROWSER_POPUPRANK;Rank +!FILEBROWSER_POPUPOPENINEDITOR;Open in Editor !FILEBROWSER_POPUPRANK0;Unrank !FILEBROWSER_POPUPRANK1;Rank 1 * !FILEBROWSER_POPUPRANK2;Rank 2 ** !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** -!FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -!FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -!FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -!FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -!FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 !FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -!FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles !FILECHOOSER_FILTER_CURVE;Curve files @@ -860,111 +1491,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_ASIMAGE;As Image -!GENERAL_AUTO;Automatic -!GENERAL_CLOSE;Close -!GENERAL_WARNING;Warning -!HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. -!HISTORY_MSG_151;Vibrance -!HISTORY_MSG_152;Vib - Pastel tones -!HISTORY_MSG_153;Vib - Saturated tones -!HISTORY_MSG_154;Vib - Protect skin-tones -!HISTORY_MSG_155;Vib - Avoid color shift -!HISTORY_MSG_156;Vib - Link pastel/saturated -!HISTORY_MSG_157;Vib - P/S threshold -!HISTORY_MSG_158;TM - Strength -!HISTORY_MSG_159;TM - Edge stopping -!HISTORY_MSG_160;TM - Scale -!HISTORY_MSG_161;TM - Reweighting iterates -!HISTORY_MSG_162;Tone Mapping -!HISTORY_MSG_163;RGB Curves - Red -!HISTORY_MSG_164;RGB Curves - Green -!HISTORY_MSG_165;RGB Curves - Blue -!HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_167;Demosaicing method -!HISTORY_MSG_168;L*a*b* - CC curve -!HISTORY_MSG_169;L*a*b* - CH curve -!HISTORY_MSG_170;Vibrance - HH curve -!HISTORY_MSG_171;L*a*b* - LC curve -!HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail -!HISTORY_MSG_174;CIECAM02 -!HISTORY_MSG_175;CAM02 - CAT02 adaptation -!HISTORY_MSG_176;CAM02 - Viewing surround -!HISTORY_MSG_177;CAM02 - Scene luminosity -!HISTORY_MSG_178;CAM02 - Viewing luminosity -!HISTORY_MSG_179;CAM02 - White-point model -!HISTORY_MSG_180;CAM02 - Lightness (J) -!HISTORY_MSG_181;CAM02 - Chroma (C) -!HISTORY_MSG_182;CAM02 - Automatic CAT02 -!HISTORY_MSG_183;CAM02 - Contrast (J) -!HISTORY_MSG_184;CAM02 - Scene surround -!HISTORY_MSG_185;CAM02 - Gamut control -!HISTORY_MSG_186;CAM02 - Algorithm -!HISTORY_MSG_187;CAM02 - Red/skin prot. -!HISTORY_MSG_188;CAM02 - Brightness (Q) -!HISTORY_MSG_189;CAM02 - Contrast (Q) -!HISTORY_MSG_190;CAM02 - Saturation (S) -!HISTORY_MSG_191;CAM02 - Colorfulness (M) -!HISTORY_MSG_192;CAM02 - Hue (h) -!HISTORY_MSG_193;CAM02 - Tone curve 1 -!HISTORY_MSG_194;CAM02 - Tone curve 2 -!HISTORY_MSG_195;CAM02 - Tone curve 1 -!HISTORY_MSG_196;CAM02 - Tone curve 2 -!HISTORY_MSG_197;CAM02 - Color curve -!HISTORY_MSG_198;CAM02 - Color curve -!HISTORY_MSG_199;CAM02 - Output histograms -!HISTORY_MSG_200;CAM02 - Tone mapping -!HISTORY_MSG_201;NR - Chrominance - R&G -!HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method -!HISTORY_MSG_204;LMMSE enhancement steps -!HISTORY_MSG_205;CAM02 - Hot/bad pixel filter -!HISTORY_MSG_206;CAT02 - Auto scene luminosity -!HISTORY_MSG_207;Defringe - Hue curve -!HISTORY_MSG_208;WB - B/R equalizer -!HISTORY_MSG_210;GF - Angle -!HISTORY_MSG_211;Graduated Filter -!HISTORY_MSG_212;VF - Strength -!HISTORY_MSG_213;Vignette Filter -!HISTORY_MSG_214;Black-and-White -!HISTORY_MSG_215;B&W - CM - Red -!HISTORY_MSG_216;B&W - CM - Green -!HISTORY_MSG_217;B&W - CM - Blue -!HISTORY_MSG_218;B&W - Gamma - Red -!HISTORY_MSG_219;B&W - Gamma - Green -!HISTORY_MSG_220;B&W - Gamma - Blue -!HISTORY_MSG_221;B&W - Color filter -!HISTORY_MSG_222;B&W - Presets -!HISTORY_MSG_223;B&W - CM - Orange -!HISTORY_MSG_224;B&W - CM - Yellow -!HISTORY_MSG_225;B&W - CM - Cyan -!HISTORY_MSG_226;B&W - CM - Magenta -!HISTORY_MSG_227;B&W - CM - Purple -!HISTORY_MSG_228;B&W - Luminance equalizer -!HISTORY_MSG_229;B&W - Luminance equalizer -!HISTORY_MSG_230;B&W - Mode -!HISTORY_MSG_231;B&W - 'Before' curve -!HISTORY_MSG_232;B&W - 'Before' curve type -!HISTORY_MSG_233;B&W - 'After' curve -!HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer -!HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer -!HISTORY_MSG_238;GF - Feather -!HISTORY_MSG_239;GF - Strength -!HISTORY_MSG_240;GF - Center -!HISTORY_MSG_241;VF - Feather -!HISTORY_MSG_242;VF - Roundness -!HISTORY_MSG_243;VC - Radius -!HISTORY_MSG_244;VC - Strength -!HISTORY_MSG_245;VC - Center -!HISTORY_MSG_246;L*a*b* - CL curve -!HISTORY_MSG_247;L*a*b* - LH curve -!HISTORY_MSG_248;L*a*b* - HH curve -!HISTORY_MSG_249;CbDL - Threshold -!HISTORY_MSG_250;NR - Enhanced -!HISTORY_MSG_251;B&W - Algorithm !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue @@ -1156,29 +1682,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_440;CbDL - Method !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale -!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s -!MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -!MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 -!MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). -!MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -!MAIN_MSG_OPERATIONCANCELLED;Operation cancelled -!MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. -!MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! -!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. -!MAIN_TAB_EXPORT; Fast Export !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_WAVELET;Wavelet !MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w -!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 -!MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 -!MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 -!MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. -!MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!MAIN_TOOLTIP_PREVIEWG;Preview the Green channel.\nShortcut: g -!MAIN_TOOLTIP_PREVIEWL;Preview the Luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r -!MAIN_TOOLTIP_THRESHOLD;Threshold !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1190,26 +1696,15 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: -!NAVIGATOR_XY_FULL;Width: %1, Height: %2 -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!PARTIALPASTE_CHANNELMIXERBW;Black-and-white -!PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning -!PARTIALPASTE_EPD;Tone mapping !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_GRADIENT;Graduated filter -!PARTIALPASTE_LENSPROFILE;Lens correction profile -!PARTIALPASTE_PCVIGNETTE;Vignette filter +!PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_RGBCURVES;RGB curves -!PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1217,15 +1712,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_AUTLISVLOW;None !PREFERENCES_AUTLOW;Low !PREFERENCES_AUTSTD;Standard -!PREFERENCES_BEHADDALL;All to 'Add' -!PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. -!PREFERENCES_BEHSETALL;All to 'Set' -!PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. -!PREFERENCES_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization !PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory @@ -1234,30 +1721,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_CURVEBBOXPOS_BELOW;Below !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID -!PREFERENCES_D50;5000K -!PREFERENCES_D55;5500K -!PREFERENCES_D60;6000K -!PREFERENCES_D65;6500K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLUOF2;Fluorescent F2 -!PREFERENCES_FLUOF7;Fluorescent F7 -!PREFERENCES_FLUOF11;Fluorescent F11 !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Editor's panel and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. -!PREFERENCES_GREY;Output device's Yb luminance (%) -!PREFERENCES_GREY05;Yb=05 CIE L#30 -!PREFERENCES_GREY10;Yb=10 CIE L#40 -!PREFERENCES_GREY15;Yb=15 CIE L#45 -!PREFERENCES_GREY18;Yb=18 CIE L#50 -!PREFERENCES_GREY23;Yb=23 CIE L#55 -!PREFERENCES_GREY30;Yb=30 CIE L#60 -!PREFERENCES_GREY40;Yb=40 CIE L#70 !PREFERENCES_GREYSC;Scene Yb luminance (%) !PREFERENCES_GREYSC18;Yb=18 CIE L#50 !PREFERENCES_GREYSCA;Automatic @@ -1273,7 +1742,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders !PREFERENCES_MED;Medium (Tile/2) -!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MIN;Mini (100x115) !PREFERENCES_MONINTENT;Default monitor intent !PREFERENCES_MONPROFILE;Default monitor profile @@ -1290,191 +1758,29 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_PROFILE_NONE;None !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. !PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings !PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files !PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation !PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar !PREFERENCES_SIMPLAUT;Tool mode !PREFERENCES_SMA;Small (250x287) !PREFERENCES_STDAUT;Standard -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality !PREFERENCES_TIMAX;High !PREFERENCES_TINB;Number of tiles !PREFERENCES_TISTD;Standard -!PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text -!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles -!PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) !PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' !PREFERENCES_WLONE;One level !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No -!PROFILEPANEL_COPYPPASTE;Parameters to copy -!PROFILEPANEL_GLOBALPROFILES;Bundled profiles -!PROFILEPANEL_LOADPPASTE;Parameters to load -!PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. -!PROFILEPANEL_MYPROFILES;My profiles -!PROFILEPANEL_PASTEPPASTE;Parameters to paste -!PROFILEPANEL_PINTERNAL;Neutral -!PROFILEPANEL_SAVEPPASTE;Parameters to save -!PROGRESSBAR_NOIMAGES;No images found -!PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved -!PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added -!SAVEDLG_FORCEFORMATOPTS;Force saving options -!SAVEDLG_SUBSAMP;Subsampling -!SAVEDLG_SUBSAMP_1;Best compression -!SAVEDLG_SUBSAMP_2;Balanced -!SAVEDLG_SUBSAMP_3;Best quality -!SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SAVEDLG_WARNFILENAME;File will be named -!SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left -!THRESHOLDSELECTOR_BR;Bottom-right -!THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. -!THRESHOLDSELECTOR_T;Top -!THRESHOLDSELECTOR_TL;Top-left -!THRESHOLDSELECTOR_TR;Top-right -!TP_BWMIX_ALGO;Algorithm OYCPM -!TP_BWMIX_ALGO_LI;Linear -!TP_BWMIX_ALGO_SP;Special effects -!TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -!TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. -!TP_BWMIX_CC_ENABLED;Adjust complementary color -!TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. -!TP_BWMIX_CHANNEL;Luminance equalizer -!TP_BWMIX_CURVEEDITOR1;'Before' curve -!TP_BWMIX_CURVEEDITOR2;'After' curve -!TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. -!TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. -!TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. -!TP_BWMIX_FILTER;Color Filter -!TP_BWMIX_FILTER_BLUE;Blue -!TP_BWMIX_FILTER_BLUEGREEN;Blue-Green -!TP_BWMIX_FILTER_GREEN;Green -!TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow -!TP_BWMIX_FILTER_NONE;None -!TP_BWMIX_FILTER_PURPLE;Purple -!TP_BWMIX_FILTER_RED;Red -!TP_BWMIX_FILTER_REDYELLOW;Red-Yellow !TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. !TP_BWMIX_FILTER_YELLOW;Yellow !TP_BWMIX_GAMMA;Gamma Correction !TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. -!TP_BWMIX_LABEL;Black-and-White -!TP_BWMIX_MET;Method -!TP_BWMIX_MET_CHANMIX;Channel Mixer -!TP_BWMIX_MET_DESAT;Desaturation -!TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. -!TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% -!TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. -!TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. -!TP_BWMIX_SETTING;Presets -!TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. -!TP_BWMIX_SET_HIGHCONTAST;High contrast -!TP_BWMIX_SET_HIGHSENSIT;High Sensitivity -!TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic -!TP_BWMIX_SET_INFRARED;Infrared -!TP_BWMIX_SET_LANDSCAPE;Landscape -!TP_BWMIX_SET_LOWSENSIT;Low Sensitivity -!TP_BWMIX_SET_LUMINANCE;Luminance -!TP_BWMIX_SET_NORMCONTAST;Normal Contrast -!TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -!TP_BWMIX_SET_PANCHRO;Panchromatic -!TP_BWMIX_SET_PORTRAIT;Portrait -!TP_BWMIX_SET_RGBABS;Absolute RGB -!TP_BWMIX_SET_RGBREL;Relative RGB -!TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -!TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM -!TP_BWMIX_TCMODE_FILMLIKE;B&W Film-like -!TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending -!TP_BWMIX_TCMODE_STANDARD;B&W Standard -!TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -!TP_BWMIX_VAL;L !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_COLORAPP_ADAPTSCENE;Scene luminosity -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environement (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing luminosity (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environnement\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from Exif data.\nTo set the value manually, uncheck the checkbox first. -!TP_COLORAPP_ALGO;Algorithm -!TP_COLORAPP_ALGO_ALL;All -!TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) -!TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) -!TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) -!TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. -!TP_COLORAPP_BADPIXSL;Hot/bad pixel filter -!TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -!TP_COLORAPP_BRIGHT;Brightness (Q) -!TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. -!TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) -!TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. -!TP_COLORAPP_CHROMA_S;Saturation (S) -!TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -!TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -!TP_COLORAPP_CONTRAST;Contrast (J) -!TP_COLORAPP_CONTRAST_Q;Contrast (Q) -!TP_COLORAPP_CONTRAST_Q_TOOLTIP;Contrast in CIECAM02 for the Q slider; it differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CONTRAST_TOOLTIP;Contrast in CIECAM02 for the J slider; it differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -!TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. -!TP_COLORAPP_CURVEEDITOR2;Tone curve 2 -!TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. -!TP_COLORAPP_CURVEEDITOR3;Color curve -!TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. -!TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves -!TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. -!TP_COLORAPP_GAMUT;Gamut control (L*a*b*) -!TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. -!TP_COLORAPP_HUE;Hue (h) -!TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. -!TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 -!TP_COLORAPP_LABEL_CAM02;Image Adjustments -!TP_COLORAPP_LABEL_SCENE;Scene Conditions -!TP_COLORAPP_LABEL_VIEWING;Viewing Conditions -!TP_COLORAPP_LIGHT;Lightness (J) -!TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -!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 Preferences > Color Management.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Preferences - Color Management. -!TP_COLORAPP_RSTPRO;Red & skin-tones protection -!TP_COLORAPP_RSTPRO_TOOLTIP;Red and skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- -!TP_COLORAPP_SURROUND;Surround -!TP_COLORAPP_SURROUND_AVER;Average -!TP_COLORAPP_SURROUND_DARK;Dark -!TP_COLORAPP_SURROUND_DIM;Dim -!TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. -!TP_COLORAPP_SURSOURCE;Dark surround -!TP_COLORAPP_SURSOURCE_TOOLTIP;Can be used if image has a dark border. -!TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness -!TP_COLORAPP_TCMODE_CHROMA;Chroma -!TP_COLORAPP_TCMODE_COLORF;Colorfulness -!TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 -!TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 -!TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -!TP_COLORAPP_TCMODE_LIGHTNESS;Lightness -!TP_COLORAPP_TCMODE_SATUR;Saturation -!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_WBCAM;WB [RT+CAT02] + [output] -!TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1511,8 +1817,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_COLORTONING_TWOBY;Special a* and b* !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma -!TP_CROP_GTEPASSPORT;Biometric Passport -!TP_CROP_GTFRAME;Frame !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1525,7 +1829,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global !TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow !TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. !TP_DIRPYRDENOISE_CCCURVE;Chrominance curve !TP_DIRPYRDENOISE_CHROMAFR;Chrominance @@ -1535,14 +1838,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma !TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. !TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on the gamma of the input color profile. An sRGB gamma is assumed, thus if the image uses an input color profile of a different gamma, the effects of luminance noise reduction will differ. -!TP_DIRPYRDENOISE_ENH;Enhanced mode -!TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. !TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABM;L*a*b* !TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail !TP_DIRPYRDENOISE_LM;Luminance only !TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) !TP_DIRPYRDENOISE_LTYPE;Luminance control @@ -1554,10 +1852,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_MEDMETHOD;Median method !TP_DIRPYRDENOISE_MEDTYPE;Median type !TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising -!TP_DIRPYRDENOISE_METHOD;Method !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. !TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 @@ -1569,8 +1865,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview !TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB !TP_DIRPYRDENOISE_RGBM;RGB !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High @@ -1585,26 +1879,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection !TP_DIRPYREQUALIZER_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_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. -!TP_EPD_EDGESTOPPING;Edge stopping !TP_EPD_GAMMA;Gamma -!TP_EPD_LABEL;Tone Mapping -!TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -!TP_EPD_SCALE;Scale -!TP_EPD_STRENGTH;Strength -!TP_EPD_TOOLTIP;Tone mapping is possible in L*a*b* mode (standard) and CIECAM02 mode.\n\nWhen in L*a*b* mode, tone mapping can also be used on the residual image of the Wavelet Levels tool.\n\nTo engage CIECAM02 tone mapping mode enable the following settings:\n1. CIECAM02\n2. Algorithm="Brightness + Colorfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" -!TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. -!TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. -!TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 -!TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 -!TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. -!TP_EXPOSURE_TCMODE_FILMLIKE;Film-like -!TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 -!TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -!TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -!TP_EXPOSURE_TCMODE_STANDARD;Standard -!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points !TP_FILMSIMULATION_LABEL;Film Simulation @@ -1613,90 +1890,17 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. -!TP_GAMMA_CURV;Gamma -!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. -!TP_GRADIENT_CENTER;Center -!TP_GRADIENT_CENTER_X;Center X -!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). -!TP_GRADIENT_CENTER_Y;Center Y -!TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). -!TP_GRADIENT_DEGREE;Angle -!TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. -!TP_GRADIENT_FEATHER;Feather -!TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. -!TP_GRADIENT_LABEL;Graduated Filter -!TP_GRADIENT_STRENGTH;Strength -!TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -!TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. !TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure !TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only enabled if the selected DCP has any. !TP_ICM_APPLYHUESATMAP;Base table !TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only enabled if the selected DCP has one. !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only enabled if the selected DCP has one. -!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles. -!TP_ICM_DCPILLUMINANT;Illuminant -!TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated !TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only enabled if a Dual-Illuminant DCP with interpolation support is selected. !TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. -!TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. -!TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. -!TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. -!TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. -!TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. -!TP_ICM_TONECURVE;Tone curve -!TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only enabled if the selected DCP has a tone curve. -!TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift -!TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. -!TP_LABCURVE_CHROMATICITY;Chromaticity -!TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -!TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated -!TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated -!TP_LABCURVE_CURVEEDITOR_CC;CC -!TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral -!TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull -!TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel -!TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated -!TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) -!TP_LABCURVE_CURVEEDITOR_CH;CH -!TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) -!TP_LABCURVE_CURVEEDITOR_CL;CL -!TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) -!TP_LABCURVE_CURVEEDITOR_HH;HH -!TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) -!TP_LABCURVE_CURVEEDITOR_LC;LC -!TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) -!TP_LABCURVE_CURVEEDITOR_LH;LH -!TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) -!TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) -!TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones -!TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. -!TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection -!TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. -!TP_LENSPROFILE_LABEL;Lens Correction Profile -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction -!TP_NEUTRAL;Reset -!TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. -!TP_PCVIGNETTE_FEATHER;Feather -!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -!TP_PCVIGNETTE_LABEL;Vignette Filter -!TP_PCVIGNETTE_ROUNDNESS;Roundness -!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -!TP_PCVIGNETTE_STRENGTH;Strength -!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). -!TP_PFCURVE_CURVEEDITOR_CH;Hue -!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1712,13 +1916,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... -!TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look. !TP_RAW_HD;Threshold !TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. -!TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1802,33 +2001,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask -!TP_RGBCURVES_BLUE;B -!TP_RGBCURVES_CHANNEL;Channel -!TP_RGBCURVES_GREEN;G -!TP_RGBCURVES_LABEL;RGB Curves -!TP_RGBCURVES_LUMAMODE;Luminosity mode -!TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. -!TP_RGBCURVES_RED;R -!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter -!TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask -!TP_SHARPENING_TOOLTIP;Expect a slightly different effect when using with CIECAM02. If difference is observed, adjust to taste. -!TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift -!TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) -!TP_VIBRANCE_LABEL;Vibrance -!TP_VIBRANCE_PASTELS;Pastel Tones -!TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones -!TP_VIBRANCE_PROTECTSKINS;Protect skin-tones -!TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold -!TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold -!TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. -!TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting -!TP_VIBRANCE_SATURATED;Saturated Tones !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -1992,41 +2164,4 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_WBALANCE_CLOUDY;Cloudy -!TP_WBALANCE_DAYLIGHT;Daylight (sunny) -!TP_WBALANCE_EQBLUERED;Blue/Red equalizer -!TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. -!TP_WBALANCE_FLASH55;Leica -!TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus -!TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -!TP_WBALANCE_FLASH_HEADER;Flash -!TP_WBALANCE_FLUO1;F1 - Daylight -!TP_WBALANCE_FLUO2;F2 - Cool White -!TP_WBALANCE_FLUO3;F3 - White -!TP_WBALANCE_FLUO4;F4 - Warm White -!TP_WBALANCE_FLUO5;F5 - Daylight -!TP_WBALANCE_FLUO6;F6 - Lite White -!TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator -!TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design -!TP_WBALANCE_FLUO9;F9 - Cool White Deluxe -!TP_WBALANCE_FLUO10;F10 - Philips TL85 -!TP_WBALANCE_FLUO11;F11 - Philips TL84 -!TP_WBALANCE_FLUO12;F12 - Philips TL83 -!TP_WBALANCE_FLUO_HEADER;Fluorescent -!TP_WBALANCE_GTI;GTI -!TP_WBALANCE_HMI;HMI -!TP_WBALANCE_JUDGEIII;JudgeIII -!TP_WBALANCE_LAMP_HEADER;Lamp -!TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 -!TP_WBALANCE_LED_HEADER;LED -!TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -!TP_WBALANCE_SHADE;Shade -!TP_WBALANCE_SOLUX35;Solux 3500K -!TP_WBALANCE_SOLUX41;Solux 4100K -!TP_WBALANCE_SOLUX47;Solux 4700K (vendor) -!TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -!TP_WBALANCE_TUNGSTEN;Tungsten -!TP_WBALANCE_WATER1;UnderWater 1 -!TP_WBALANCE_WATER2;UnderWater 2 -!TP_WBALANCE_WATER_HEADER;UnderWater !ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f From 3160efde8176972f032123391aeb4a27c512d1bd Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 24 Aug 2016 11:01:42 +0200 Subject: [PATCH 174/232] camconst.json updated by IliasG, closes #3298 --- rtengine/camconst.json | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index c7bef9ee2..f5a9e0118 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -801,6 +801,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { // Quality b, scaling factors missing but guessed safely "make_model": [ "Canon EOS 600D", "Canon EOS Rebel T3i", "Canon EOS Kiss X5", "Canon EOS 1200D", "Canon EOS Rebel T5", "Canon EOS Kiss X70" ], + // "dcraw_matrix": [ 13254,-6296,-1798,184,2753,90,1438,-566,1129 ], // Infrared guessed "dcraw_matrix": [ 6461,-907,-882,-4300,12184,2378,-819,1944,5931 ], // dcp D65 colormatrix2 "ranges": { "white": [ @@ -1049,7 +1050,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know }, { // Quality B, - "make_model": "Canon PowerShot G7 X", + "make_model": [ "Canon PowerShot G7 X", "Canon PowerShot G7 X Mark II" ], "dcraw_matrix": [ 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 ], // DNG_V8.7 D65 // "raw_crop": [ 116, 24, 5504, 3680 ], // Sensor size 5632x3710. Largest useful frame 120-5616X28-3702 = 5504x3682, 4pix RTborders, Left Border 120-4, Top border 28-4 "raw_crop": [ 128, 36, 5480, 3656 ], // Default official 3/2 frame 5472X3648, 4pix borders, Left Border 132-4, Top border 40-4 @@ -1126,9 +1127,9 @@ Quality X: unknown, ie we knowing to little about the camera properties to know }, { // Quality B - "make_model": "FUJIFILM X-PRO2", + "make_model": [ "FUJIFILM X-PRO2", "FUJIFILM X-T2" ], "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 - "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop + // "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop "ranges": { "white": 16100 } }, @@ -1312,7 +1313,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know // "dcraw_matrix": [ 9336,-3405,14,-7321,14779,2764,-914,1171,8248 ], // illuminant A "ranges": { "white": [ 15500, 15500, 15500 ] } // Non linearities start at 15500 (hi ISOs) 15850 (low ISOs) with long exposures (>2sec) and LENR ON .. nominal 15892 - // white 15500 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15750*4095/16383=3936 + // white 15500 is correct for 14-bit files, for 12-bit files RT auto_calculates it 15500*4095/16383=3874 }, { // Quality B, @@ -1617,8 +1618,8 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // G7 Quality A, GX80 Quality B, BLs and WLs are same, color matrix looks to also be same as G7 - "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70", "Panasonic DMC-GX80", "Panasonic DMC-GX85" ], + { // Quality A, + "make_model": [ "Panasonic DMC-G7", "Panasonic DMC-G70" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.1 D65 "ranges": { "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset @@ -1630,6 +1631,18 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, { // Quality B, + "make_model": [ "Panasonic DMC-GX80", "Panasonic DMC-GX85", "Panasonic DMC-GX7MK2" ], + "dcraw_matrix": [ 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 ],// DNG_v9.6 D65 + "ranges": { + "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "white": [ + { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111 + { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626 + { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, + { // Quality B, "make_model": "Panasonic DMC-GX8", "dcraw_matrix": [ 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 ], // DNG_v9.1.1 D65 "ranges": { @@ -1861,8 +1874,8 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 800, "white": 16300 } }, { // Quality B, - "make_model": "Sony DSC-RX10M2", - "dcraw_matrix": [ 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 ], // DNG_v9.1.1 D65 + "make_model": [ "Sony DSC-RX10M2", "Sony DSC-RX10M3" ], + "dcraw_matrix": [ 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 ], // DNG_v9.6 D65 "ranges": { "black": 800, "white": 16300 } }, From 39a57cbb3b6ea1b4c2c0b78daee333ba2addc38f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 24 Aug 2016 21:28:01 +0200 Subject: [PATCH 175/232] Disabled StopWatch --- rtengine/improcfun.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 34e2eeb34..9bbdb022f 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" From 294f16c7415d3b9ae3c4305ec8e64c19ee022e87 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 25 Aug 2016 19:28:05 +0200 Subject: [PATCH 176/232] RGB Curves Luminosity mode: ~ 40% speedup --- rtengine/color.cc | 6 +-- rtengine/improcfun.cc | 106 ++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 69 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index c6f69d968..60d355b26 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -2137,7 +2137,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef) #endif { - const float ClipLevel = 65535.0f; + constexpr float ClipLevel = 65535.0f; bool inGamut; #ifdef _DEBUG neg = false, more_rgb = false; @@ -2146,7 +2146,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr do { inGamut = true; - //Lprov1=LL; float aprov1 = Chprov1 * sincosval.y; float bprov1 = Chprov1 * sincosval.x; @@ -2156,9 +2155,8 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr float fz = fy - (0.005f * bprov1); float x_ = 65535.0f * f2xyz(fx) * D50x; - // float y_ = 65535.0f * f2xyz(fy); float z_ = 65535.0f * f2xyz(fz) * D50z; - float y_ = (Lprov1 > epskap) ? 65535.0 * fy * fy * fy : 65535.0 * Lprov1 / kappa; + float y_ = (Lprov1 > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * Lprov1 / kappa; xyz2rgb(x_, y_, z_, R, G, B, wip); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 9bbdb022f..112ef9826 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -2977,19 +2977,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer TMatrix wprof = iccStore->workingSpaceMatrix (params->icm.working); TMatrix wiprof = iccStore->workingSpaceInverseMatrix (params->icm.working); - double toxyz[3][3] = { + float toxyz[3][3] = { { - ( wprof[0][0] / Color::D50x), - ( wprof[0][1] / Color::D50x), - ( wprof[0][2] / Color::D50x) + static_cast( wprof[0][0] / Color::D50x), + static_cast( wprof[0][1] / Color::D50x), + static_cast( wprof[0][2] / Color::D50x) }, { - ( wprof[1][0]), - ( wprof[1][1]), - ( wprof[1][2]) + static_cast( wprof[1][0]), + static_cast( wprof[1][1]), + static_cast( wprof[1][2]) }, { - ( wprof[2][0] / Color::D50z), - ( wprof[2][1] / Color::D50z), - ( wprof[2][2] / Color::D50z) + static_cast( wprof[2][0] / Color::D50z), + static_cast( wprof[2][1] / Color::D50z), + static_cast( wprof[2][2] / Color::D50z) } }; @@ -3628,60 +3628,48 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r1, g1, b1, r2, g2, b2, L_1, L_2, Lfactor, a_1, b_1, x_, y_, z_, R, G, B ; - float y, fy, yy, fyy, x, z, fx, fz; - // rgb values before RGB curves - r1 = rtemp[ti * TS + tj] ; - g1 = gtemp[ti * TS + tj] ; - b1 = btemp[ti * TS + tj] ; + float r = rtemp[ti * TS + tj] ; + float g = gtemp[ti * TS + tj] ; + float b = btemp[ti * TS + tj] ; //convert to Lab to get a&b before RGB curves - x = toxyz[0][0] * r1 + toxyz[0][1] * g1 + toxyz[0][2] * b1; - y = toxyz[1][0] * r1 + toxyz[1][1] * g1 + toxyz[1][2] * b1; - z = toxyz[2][0] * r1 + toxyz[2][1] * g1 + toxyz[2][2] * b1; + 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; - fx = (x < 65535.0f ? Color::cachef[std::max(x, 0.f)] : 327.68f * std::cbrt(x / MAXVALF)); - fy = (y < 65535.0f ? Color::cachef[std::max(y, 0.f)] : 327.68f * std::cbrt(y / MAXVALF)); - fz = (z < 65535.0f ? Color::cachef[std::max(z, 0.f)] : 327.68f * std::cbrt(z / MAXVALF)); + float fx = x < 65535.0f ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF); + float fy = y < 65535.0f ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF); + float fz = z < 65535.0f ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF); - L_1 = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; - a_1 = (500.0f * (fx - fy) ); - b_1 = (200.0f * (fy - fz) ); + float a_1 = 500.0f * (fx - fy); + float b_1 = 200.0f * (fy - fz); // rgb values after RGB curves if (rCurve) { - r2 = rCurve[ rtemp[ti * TS + tj]]; - } else { - r2 = r1; + r = rCurve[r]; } if (gCurve) { - g2 = gCurve[ gtemp[ti * TS + tj]]; - } else { - g2 = g1; + g = gCurve[g]; } if (bCurve) { - b2 = bCurve[ btemp[ti * TS + tj]]; - } else { - b2 = b1; + b = bCurve[b]; } // Luminosity after // only Luminance in Lab - yy = toxyz[1][0] * r2 + toxyz[1][1] * g2 + toxyz[1][2] * b2; - fyy = (yy < 65535.0f ? Color::cachef[std::max(yy, 0.f)] : 327.68f * std::cbrt(yy / MAXVALF)); - L_2 = (116.0f * fyy - 5242.88f); + float newy = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; + float newfy = newy < 65535.0f ? Color::cachef[newy] : 327.68f * std::cbrt(newy / MAXVALF); + float L_2 = 116.0f * newfy - 5242.88f; //gamut control if(settings->rgbcurveslumamode_gamut) { - float RR, GG, BB; - float HH, Lpro, Chpro; - Lpro = L_2 / 327.68f; - Chpro = sqrt(SQR(a_1) + SQR(b_1)) / 327.68f; - HH = xatan2f(b_1, a_1); + float Lpro = L_2 / 327.68f; + float Chpro = sqrtf(SQR(a_1) + SQR(b_1)) / 327.68f; + float HH = xatan2f(b_1, a_1); // According to mathematical laws we can get the sin and cos of HH by simple operations - float2 sincosval; + float2 sincosval; if(Chpro == 0.0f) { sincosval.y = 1.0f; @@ -3695,30 +3683,18 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bool neg = false; bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, Lpro, Chpro, RR, GG, BB, wip, highlight, 0.15f, 0.96f, neg, more_rgb); + Color::gamutLchonly(HH, sincosval, Lpro, Chpro, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, Lpro, Chpro, RR, GG, BB, wip, highlight, 0.15f, 0.96f); + Color::gamutLchonly(HH, sincosval, Lpro, Chpro, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip, highlight, 0.15f, 0.96f); #endif - - //Color::gamutLchonly(HH,Lpro,Chpro, RR, GG, BB, wip, highlight, 0.15f, 0.96f); - - - -// float2 sincosval = xsincosf(HH); - - L_2 = Lpro * 327.68f; - a_1 = 327.68f * Chpro * sincosval.y; - b_1 = 327.68f * Chpro * sincosval.x; - } //end of gamut control - - //calculate RGB with L_2 and old value of a and b - Color::Lab2XYZ(L_2, a_1, b_1, x_, y_, z_) ; - Color::xyz2rgb(x_, y_, z_, R, G, B, wip); - - rtemp[ti * TS + tj] = R; - gtemp[ti * TS + tj] = G; - btemp[ti * TS + tj] = B; + //end of gamut control + } else { + float x_, y_, z_; + //calculate RGB with L_2 and old value of a and b + Color::Lab2XYZ(L_2, a_1, b_1, x_, y_, z_) ; + Color::xyz2rgb(x_, y_, z_, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip); + } } } } From 7a2dd888bb438fef1ba08b6c92911f08e1b2d0a4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Aug 2016 14:20:47 +0200 Subject: [PATCH 177/232] RGB Curves Luminosity mode, reduce number of atan2 calculations --- rtengine/color.cc | 7 ++++++- rtengine/improcfun.cc | 13 +++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 60d355b26..872f47522 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -2142,7 +2142,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr #ifdef _DEBUG neg = false, more_rgb = false; #endif - + float ChprovSave = Chprov1; do { inGamut = true; @@ -2165,6 +2165,11 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr #ifdef _DEBUG neg = true; #endif + if (isnan(HH)) { + float atemp = ChprovSave * sincosval.y * 327.68; + float btemp = ChprovSave * sincosval.x * 327.68; + HH = xatan2f(btemp, atemp); + } if (Lprov1 < 0.1f) { Lprov1 = 0.1f; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 112ef9826..29ac45ca9 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3637,9 +3637,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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 fx = x < 65535.0f ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF); - float fy = y < 65535.0f ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF); - float fz = z < 65535.0f ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF); + float fx = x < MAXVALF ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF); + float fy = y < MAXVALF ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF); + float fz = z < MAXVALF ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF); float a_1 = 500.0f * (fx - fy); float b_1 = 200.0f * (fy - fz); @@ -3660,15 +3660,16 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Luminosity after // only Luminance in Lab float newy = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float newfy = newy < 65535.0f ? Color::cachef[newy] : 327.68f * std::cbrt(newy / MAXVALF); + float newfy = newy < MAXVALF ? Color::cachef[newy] : 327.68f * std::cbrt(newy / MAXVALF); float L_2 = 116.0f * newfy - 5242.88f; //gamut control if(settings->rgbcurveslumamode_gamut) { float Lpro = L_2 / 327.68f; float Chpro = sqrtf(SQR(a_1) + SQR(b_1)) / 327.68f; - float HH = xatan2f(b_1, a_1); - // According to mathematical laws we can get the sin and cos of HH by simple operations + float HH = NAN; // we set HH to NAN, because then it will be calculated in Color::gamutLchonly only if needed +// float HH = xatan2f(b_1, a_1); + // According to mathematical laws we can get the sin and cos of HH by simple operations even if we don't calculate HH float2 sincosval; if(Chpro == 0.0f) { From 66054ca50dca6a3b868c62f8b896e34fd371131d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 26 Aug 2016 16:38:14 +0200 Subject: [PATCH 178/232] RGB curves luminosity mode: Experimental patch to equalize the strength of R, G and B curve --- rtengine/improcfun.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 29ac45ca9..eb85e6577 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2992,6 +2992,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer static_cast( wprof[2][2] / Color::D50z) } }; + float maxFactorToxyz = max(toxyz[1][0],toxyz[1][1],toxyz[1][2]); + float equalR = maxFactorToxyz / toxyz[1][0]; + float equalG = maxFactorToxyz / toxyz[1][1]; + float equalB = maxFactorToxyz / toxyz[1][2]; //inverse matrix user select double wip[3][3] = { @@ -3646,15 +3650,18 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // rgb values after RGB curves if (rCurve) { - r = rCurve[r]; + float rNew = rCurve[r]; + r += (rNew - r) * equalR; } if (gCurve) { - g = gCurve[g]; + float gNew = gCurve[g]; + g += (gNew - g) * equalG; } if (bCurve) { - b = bCurve[b]; + float bNew = bCurve[b]; + b += (bNew - b) * equalB; } // Luminosity after From 6d4e82b94f8cb0a315f7c67a4c44f4b261e01d12 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 27 Aug 2016 22:58:16 +0200 Subject: [PATCH 179/232] Speedups for B&W conversion --- rtengine/color.cc | 47 +++++++++++++++++++++++++++++-- rtengine/color.h | 2 ++ rtengine/improcfun.cc | 65 +++++++++++++++++++------------------------ 3 files changed, 74 insertions(+), 40 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index c6f69d968..e6afbd86e 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -24,6 +24,8 @@ #include "sleef.c" #include "opthelper.h" +#define pow_F(a,b) (xexpf(b*xlogf(a))) + using namespace std; namespace rtengine @@ -857,6 +859,14 @@ void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, co b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ; } +void Color::xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][3]) // for black & white we need only r channel +{ + //Transform to output color. Standard sRGB is D65, but internal representation is D50 + //Note that it is only at this point that we should have need of clipping color data + + r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ; +} + // same for float void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]) { @@ -874,19 +884,39 @@ void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat } #endif // __SSE2__ +#ifdef __SSE2__ +void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) +{ + // correct gamma for black and white image : pseudo TRC curve of ICC profil + vfloat rgbv = _mm_set_ps(0.f, b, g, r); + vfloat gammabwv = _mm_set_ps(0.f, gammabwb, gammabwg, gammabwr); + vfloat c65535v = F2V(65535.f); + rgbv /= c65535v; + rgbv = vmaxf(rgbv, ZEROV); + rgbv = pow_F(rgbv, gammabwv); + rgbv *= c65535v; + float temp[4] ALIGNED16; + STVF(temp[0], rgbv); + r = temp[0]; + g = temp[1]; + b = temp[2]; +} + +#else void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { // correct gamma for black and white image : pseudo TRC curve of ICC profil b /= 65535.0f; - b = pow (max(b, 0.0f), gammabwb); + b = pow_F (max(b, 0.0f), gammabwb); b *= 65535.0f; r /= 65535.0f; - r = pow (max(r, 0.0f), gammabwr); + r = pow_F (max(r, 0.0f), gammabwr); r *= 65535.0f; g /= 65535.0f; - g = pow (max(g, 0.0f), gammabwg); + g = pow_F (max(g, 0.0f), gammabwg); g *= 65535.0f; } +#endif /** @brief Compute the B&W constants for the B&W processing and its tool's GUI * @@ -1492,6 +1522,17 @@ 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; } +void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white +{ + float LL = L / 327.68f; + float fy = (0.00862069f * LL) + 0.137932f; // (L+16)/116 + float fxz = 65535.f * f2xyz(fy); + x = fxz * D50x; + z = fxz * D50z; + y = (LL > epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / kappa; +} + + #ifdef __SSE2__ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z) { diff --git a/rtengine/color.h b/rtengine/color.h index 1ae721e5a..c61861421 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -408,6 +408,7 @@ public: * @param rgb_xyz[3][3] transformation matrix to use for the conversion */ static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]); + static void xyz2r (float x, float y, float z, float &r, const double rgb_xyz[3][3]); static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]); #ifdef __SSE2__ static void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]); @@ -441,6 +442,7 @@ public: * @param z Z coordinate [0 ; 65535] ; can be negative! (return value) */ 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); #ifdef __SSE2__ static void Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &z); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 9bbdb022f..2fadfabe4 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -//#define BENCHMARK +#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -4127,23 +4127,26 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artifacts for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - //rgb=>lab - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; + //rgb => xyz float X, Y, Z; + Color::rgbxyz(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], X, Y, Z, wp); + //xyz => Lab float L, aa, bb; - Color::rgbxyz(r, g, b, X, Y, Z, wp); - //convert Lab Color::XYZ2Lab(X, Y, Z, L, aa, bb); - //end rgb=>lab - //lab ==> Ch - float CC = sqrt(SQR(aa / 327.68f) + SQR(bb / 327.68f)); //CC chromaticity in 0..180 or more + float CC = sqrtf(SQR(aa) + SQR(bb)) / 327.68f; //CC chromaticity in 0..180 or more float HH = xatan2f(bb, aa); // HH hue in -3.141 +3.141 - float l_r;//Luminance Lab in 0..1 - l_r = L / 32768.f; + float2 sincosval; + + if(CC == 0.0f) { + sincosval.y = 1.f; + sincosval.x = 0.0f; + } else { + sincosval.y = aa / (CC * 327.68f); + sincosval.x = bb / (CC * 327.68f); + } if (bwlCurveEnabled) { + L /= 32768.f; double hr = Color::huelab_to_huehsv2(HH); float valparam = float((bwlCurve->getVal(hr) - 0.5f) * 2.0f); //get l_r=f(H) float kcc = (CC / 70.f); //take Chroma into account...70 "middle" of chromaticity (arbitrary and simple), one can imagine other algorithme @@ -4151,47 +4154,35 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer valparam *= kcc; if(valparam > 0.f) { - l_r = (1.f - valparam) * l_r + valparam * (1.f - SQR(SQR(SQR(SQR(1.f - min(l_r, 1.0f)))))); // SQR (SQR((SQR) to increase action in low light + L = (1.f - valparam) * L + valparam * (1.f - SQR(SQR(SQR(SQR(1.f - min(L, 1.0f)))))); // SQR (SQR((SQR) to increase action in low light } else { - l_r *= (1.f + valparam); //for negative + L *= (1.f + valparam); //for negative } + L *= 32768.f; } - L = l_r * 32768.f; float RR, GG, BB; - float Lr; - Lr = L / 327.68f; //for gamutlch + L /= 327.68f; #ifdef _DEBUG bool neg = false; bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, Lr, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f, neg, more_rgb); + Color::gamutLchonly(HH, sincosval, L, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else //gamut control : Lab values are in gamut - Color::gamutLchonly(HH, Lr, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f); + Color::gamutLchonly(HH, sincosval, L, CC, RR, GG, BB, wip, highlight, 0.15f, 0.96f); #endif - //convert CH ==> ab - L = Lr * 327.68f; - // float a_,b_; - // a_=0.f;//grey - // b_=0.f;//grey - //convert lab=>rgb - Color::Lab2XYZ(L, 0.f, 0.f, X, Y, Z); - float rr_, gg_, bb_; - Color::xyz2rgb(X, Y, Z, rr_, gg_, bb_, wip); - rtemp[ti * TS + tj] = gtemp[ti * TS + tj] = btemp[ti * TS + tj] = rr_; - // tmpImage->r(i,j) = tmpImage->g(i,j) = tmpImage->b(i,j) = CLIP(val[0]*kcorec); + L *= 327.68f; + //convert l => rgb + Color::L2XYZ(L, X, Y, Z); + float newRed; // We use the red channel for bw + Color::xyz2r(X, Y, Z, newRed, wip); + rtemp[ti * TS + tj] = gtemp[ti * TS + tj] = btemp[ti * TS + tj] = newRed; if (hasgammabw) { + //gamma correction: pseudo TRC curve Color::trcGammaBW (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], gammabwr, gammabwg, gammabwb); } - - //gamma correction: pseudo TRC curve - // if (hasgammabw) - // Color::trcGammaBW (rr_, gg_, bb_, gammabwr, gammabwg, gammabwb); - // rtemp[ti*TS+tj] = rr_; - // gtemp[ti*TS+tj] = gg_; - // btemp[ti*TS+tj] = bb_; } } } From 84614a11e82bc2bc2ccbb8366503929e97101976 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 28 Aug 2016 14:47:01 +0200 Subject: [PATCH 180/232] B&W: Speedup for Color::trcGammaBW --- rtengine/color.cc | 40 ++++++++++++++++---- rtengine/color.h | 3 ++ rtengine/improcfun.cc | 87 +++++++++++++++++-------------------------- 3 files changed, 70 insertions(+), 60 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index e6afbd86e..66887f550 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -888,7 +888,7 @@ void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { // correct gamma for black and white image : pseudo TRC curve of ICC profil - vfloat rgbv = _mm_set_ps(0.f, b, g, r); + vfloat rgbv = _mm_set_ps(0.f, r, r, r); // input channel is always r vfloat gammabwv = _mm_set_ps(0.f, gammabwb, gammabwg, gammabwr); vfloat c65535v = F2V(65535.f); rgbv /= c65535v; @@ -901,19 +901,45 @@ void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gamm g = temp[1]; b = temp[2]; } +void Color::trcGammaBWRow (float *r, float *g, float *b, int width, float gammabwr, float gammabwg, float gammabwb) +{ + // correct gamma for black and white image : pseudo TRC curve of ICC profil + vfloat c65535v = F2V(65535.f); + vfloat gammabwrv = F2V(gammabwr); + vfloat gammabwgv = F2V(gammabwg); + vfloat gammabwbv = F2V(gammabwb); + int i = 0; + for(; i < width - 3; i += 4 ) { + vfloat inv = _mm_loadu_ps(&r[i]); // input channel is always r + inv /= c65535v; + inv = vmaxf(inv, ZEROV); + vfloat rv = pow_F(inv, gammabwrv); + vfloat gv = pow_F(inv, gammabwgv); + vfloat bv = pow_F(inv, gammabwbv); + rv *= c65535v; + gv *= c65535v; + bv *= c65535v; + _mm_storeu_ps(&r[i], rv); + _mm_storeu_ps(&g[i], gv); + _mm_storeu_ps(&b[i], bv); + } + for(; i < width; i++) { + trcGammaBW(r[i], g[i], b[i], gammabwr, gammabwg, gammabwb); + } +} #else void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { // correct gamma for black and white image : pseudo TRC curve of ICC profil - b /= 65535.0f; - b = pow_F (max(b, 0.0f), gammabwb); + float in = r; // input channel is always r + in /= 65535.0f; + in = max(in, 0.f); + b = pow_F (in, gammabwb); b *= 65535.0f; - r /= 65535.0f; - r = pow_F (max(r, 0.0f), gammabwr); + r = pow_F (in, gammabwr); r *= 65535.0f; - g /= 65535.0f; - g = pow_F (max(g, 0.0f), gammabwg); + g = pow_F (in, gammabwg); g *= 65535.0f; } #endif diff --git a/rtengine/color.h b/rtengine/color.h index c61861421..e9b38c509 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -894,6 +894,9 @@ public: * @param gammabwb gamma value for red channel [>0] */ static void trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb); +#ifdef __SSE2__ + static void trcGammaBWRow (float *r, float *g, float *b, int width, float gammabwr, float gammabwg, float gammabwb); +#endif /** @brief Compute the B&W constants for the Black and White processing and its GUI diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2fadfabe4..7fcee7512 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4114,15 +4114,23 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // -------------------------------------------------- +#ifndef __SSE2__ //gamma correction: pseudo TRC curve if (hasgammabw) { Color::trcGammaBW (r, g, b, gammabwr, gammabwg, gammabwb); } - +#endif rtemp[ti * TS + tj] = r; gtemp[ti * TS + tj] = g; btemp[ti * TS + tj] = b; } +#ifdef __SSE2__ + if (hasgammabw) { + //gamma correction: pseudo TRC curve + Color::trcGammaBWRow (&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); + } +#endif + } } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artifacts for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -4178,12 +4186,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float newRed; // We use the red channel for bw Color::xyz2r(X, Y, Z, newRed, wip); rtemp[ti * TS + tj] = gtemp[ti * TS + tj] = btemp[ti * TS + tj] = newRed; - +#ifndef __SSE2__ if (hasgammabw) { //gamma correction: pseudo TRC curve Color::trcGammaBW (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], gammabwr, gammabwg, gammabwb); } +#endif } +#ifdef __SSE2__ + if (hasgammabw) { + //gamma correction: pseudo TRC curve + Color::trcGammaBWRow (&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], tW - jstart, gammabwr, gammabwg, gammabwb); + } +#endif } } } @@ -4389,13 +4404,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (algm == 2) { //channel-mixer //end auto chmix - float mix[3][3]; - if (computeMixerAuto) { // auto channel-mixer - #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 5) reduction(+:nr,ng,nb) + #pragma omp parallel for schedule(dynamic, 16) reduction(+:nr,ng,nb) #endif for (int i = 0; i < tH; i++) { @@ -4434,44 +4446,29 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta, params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm); - mix[0][0] = bwr; - mix[1][0] = bwr; - mix[2][0] = bwr; - mix[0][1] = bwg; - mix[1][1] = bwg; - mix[2][1] = bwg; - mix[0][2] = bwb; - mix[1][2] = bwb; - mix[2][2] = bwb; - #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic, 5) + #pragma omp parallel for schedule(dynamic, 16) #endif for (int i = 0; i < tH; i++) { - float in[3], val[3]; - for (int j = 0; j < tW; j++) { - in[0] = tmpImage->r(i, j); - in[1] = tmpImage->g(i, j); - in[2] = tmpImage->b(i, j); //mix channel - for (int end = 0; end < 3 ; end++) { - val[end] = 0.f; - - for (int beg = 0; beg < 3 ; beg++) { - val[end] += mix[end][beg] * in[beg]; - } - } - - tmpImage->r(i, j) = tmpImage->g(i, j) = tmpImage->b(i, j) = CLIP(val[0] * kcorec); + tmpImage->r(i, j) = tmpImage->g(i, j) = tmpImage->b(i, j) = CLIP((bwr * tmpImage->r(i, j) + bwg * tmpImage->g(i, j) + bwb * tmpImage->b(i, j)) * kcorec); +#ifndef __SSE2__ //gamma correction: pseudo TRC curve if (hasgammabw) { Color::trcGammaBW (tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), gammabwr, gammabwg, gammabwb); } +#endif } +#ifdef __SSE2__ + if (hasgammabw) { + //gamma correction: pseudo TRC curve + Color::trcGammaBWRow (tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), tW, gammabwr, gammabwg, gammabwb); + } +#endif } } @@ -4774,29 +4771,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float fx, fy, fz; - fx = (x < 65535.0f ? Color::cachef[std::max(x, 0.f)] : 327.68f * std::cbrt(x / MAXVALF)); - fy = (y < 65535.0f ? Color::cachef[std::max(y, 0.f)] : 327.68f * std::cbrt(y / MAXVALF)); - fz = (z < 65535.0f ? Color::cachef[std::max(z, 0.f)] : 327.68f * std::cbrt(z / MAXVALF)); - - lab->L[i][j] = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; - lab->a[i][j] = (500.0f * (fx - fy) ); - lab->b[i][j] = (200.0f * (fy - fz) ); - - - //test for color accuracy - /*float fy = (0.00862069 * lab->L[i][j])/327.68 + 0.137932; // (L+16)/116 - float fx = (0.002 * lab->a[i][j])/327.68 + fy; - float fz = fy - (0.005 * lab->b[i][j])/327.68; - - float x_ = 65535*Lab2xyz(fx)*Color::D50x; - float y_ = 65535*Lab2xyz(fy); - float z_ = 65535*Lab2xyz(fz)*Color::D50z; - - int R,G,B; - xyz2srgb(x_,y_,z_,R,G,B); - r=(float)R; g=(float)G; b=(float)B; - float xxx=1;*/ + fx = (x < MAXVALF ? Color::cachef[x] : 327.68f * std::cbrt(x / MAXVALF)); + fy = (y < MAXVALF ? Color::cachef[y] : 327.68f * std::cbrt(y / MAXVALF)); + fz = (z < MAXVALF ? Color::cachef[z] : 327.68f * std::cbrt(z / MAXVALF)); + lab->L[i][j] = 116.0f * fy - 5242.88f; //5242.88=16.0*327.68; + lab->a[i][j] = 500.0f * (fx - fy); + lab->b[i][j] = 200.0f * (fy - fz); } } From 46334c046242405409f1644d81829751a34945c6 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 28 Aug 2016 19:59:46 +0200 Subject: [PATCH 181/232] Disables StopWatch --- rtengine/improcfun.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index eb85e6577..c9bc41d71 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" From 2ba7e296d01fff8534ce8538d69f426f174dc5fd Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 29 Aug 2016 01:35:19 +0200 Subject: [PATCH 182/232] Bugfix: Options::readFromFile should not reset the options values. They are initialy set in the constructor then should only be updated by each call to this method. --- rtgui/options.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index e723361be..ab887edfe 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -734,8 +734,6 @@ int Options::readFromFile (Glib::ustring fname) try { if (keyFile.load_from_file (fname)) { - setDefaults (); - // -------------------------------------------------------------------------------------------------------- if (keyFile.has_group ("General")) { @@ -1781,14 +1779,10 @@ int Options::readFromFile (Glib::ustring fname) if (options.rtSettings.verbose) { printf("Options::readFromFile / Error code %d while reading values from \"%s\":\n%s\n", err.code(), fname.c_str(), err.what().c_str()); } - - setDefaults (); } catch (...) { if (options.rtSettings.verbose) { printf("Options::readFromFile / Unknown exception while trying to load \"%s\"!\n", fname.c_str()); } - - setDefaults (); } return 1; From 6a19178e52a29ae80dd02a9bdfaf810807319fab Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 30 Aug 2016 01:53:27 +0200 Subject: [PATCH 183/232] Enable whole area of magnification windows for moving, fixes #3378 --- rtgui/cropwindow.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 6d39e0212..c4b555e8f 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -1029,8 +1029,7 @@ bool CropWindow::onArea (CursorArea a, int x, int y) } getObservedFrameArea (x1, y1, w, h); - return x > x1 - 6 && y > y1 - 6 && x < x1 + w - 1 + 6 && y < y1 + h - 1 + 6 && - !(x > x1 + 2 && y > y1 + 2 && x < x1 + w - 1 - 2 && y < y1 + h - 1 - 2); + return x >= x1 && x <= x1 + w && y >= y1 && y <= y1 + h; } return false; From 388d43ebcec62c9bdd9e8e0afec876a689d5ad89 Mon Sep 17 00:00:00 2001 From: Hombre Date: Wed, 31 Aug 2016 03:58:07 +0200 Subject: [PATCH 184/232] Adding new units for the RGB and HSV values in the Navigator tool (below Histogram). Click on one of thes two columns to cycle to a new unit independantly, between [0-1], [0-255], [%] (Hue stays in degree instead of percent). The current unit is saved in Options for new Editor tabs or between sessions. --- rtgui/navigator.cc | 113 +++++++++++++++++++++++++++++++++++++++++---- rtgui/navigator.h | 7 +++ rtgui/options.cc | 12 +++++ rtgui/options.h | 9 ++++ 4 files changed, 132 insertions(+), 9 deletions(-) diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 4f7e638f2..eea574d24 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -26,9 +26,11 @@ #include "../rtengine/rt_math.h" #include "options.h" +extern Options options; + using namespace rtengine; -Navigator::Navigator () +Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(options.navHSVUnit) { set_label (M("MAIN_MSG_NAVIGATOR")); @@ -127,6 +129,7 @@ Navigator::Navigator () // RGB + Gtk::EventBox *evBox1 = Gtk::manage (new Gtk::EventBox()); Gtk::HBox* hbox1 = Gtk::manage (new Gtk::HBox ()); // container Gtk::Table* table1 = Gtk::manage (new Gtk::Table (3, 2)); @@ -139,11 +142,15 @@ Navigator::Navigator () table1->attach (*lB, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 4, 0); table1->attach (*B, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - hbox1->pack_start (*table1, Gtk::PACK_EXPAND_WIDGET, 4); + evBox1->add (*table1); + evBox1->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Navigator::cycleUnitsRGB)); + + hbox1->pack_start (*evBox1, Gtk::PACK_EXPAND_WIDGET, 4); hbox1->pack_start (*Gtk::manage (new Gtk::VSeparator()), Gtk::PACK_SHRINK, 4); table0->attach (*hbox1, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); // HSV + Gtk::EventBox *evBox2 = Gtk::manage (new Gtk::EventBox()); Gtk::HBox* hbox2 = Gtk::manage (new Gtk::HBox ()); // container Gtk::Table* table2 = Gtk::manage (new Gtk::Table (3, 2)); @@ -156,7 +163,10 @@ Navigator::Navigator () table2->attach (*lV, 0, 1, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 4, 0); table2->attach (*V, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); - hbox2->pack_start (*table2, Gtk::PACK_EXPAND_WIDGET, 4); + evBox2->add (*table2); + evBox2->signal_button_release_event().connect_notify( sigc::mem_fun(*this, &Navigator::cycleUnitsHSV)); + + hbox2->pack_start (*evBox2, Gtk::PACK_EXPAND_WIDGET, 4); hbox2->pack_start (*Gtk::manage (new Gtk::VSeparator()), Gtk::PACK_SHRINK, 4); table0->attach (*hbox2, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 0, 0); @@ -214,15 +224,45 @@ void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustrin } else { position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - R->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%")); - G->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%")); - B->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%")); + switch (currentRGBUnit) { + case (Options::NavigatorUnit::NU_0_1): + R->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f)); + G->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f)); + B->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f)); + break; + case (Options::NavigatorUnit::NU_0_255): + R->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), r)); + G->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), g)); + B->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), b)); + break; + case (Options::NavigatorUnit::NU_PERCENT): + default: + R->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%")); + G->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%")); + B->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%")); + break; + } float h, s, v; Color::rgb2hsv (r * 0xffff / 0xff, g * 0xffff / 0xff, b * 0xffff / 0xff, h, s, v); - H->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), h * 360.f) + Glib::ustring("\xc2\xb0")); - S->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), s * 100.f) + Glib::ustring("%")); - V->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), v * 100.f) + Glib::ustring("%")); + switch (currentHSVUnit) { + case (Options::NavigatorUnit::NU_0_1): + H->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), h)); + S->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), s)); + V->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), v)); + break; + case (Options::NavigatorUnit::NU_0_255): + H->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), h * 255)); + S->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), s * 255)); + V->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), v * 255)); + break; + case (Options::NavigatorUnit::NU_PERCENT): + default: + H->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), h * 360.f) + Glib::ustring("\xc2\xb0")); + S->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), s * 100.f) + Glib::ustring("%")); + V->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), v * 100.f) + Glib::ustring("%")); + break; + } float LAB_a, LAB_b, LAB_l; //rgb2lab (r, g, b, LAB_l, LAB_a, LAB_b); @@ -233,6 +273,61 @@ void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustrin } } +void Navigator::cycleUnitsRGB (GdkEventButton *event) { + uint16_t v = (uint16_t)currentRGBUnit; + ++v; + if (v == (uint16_t)Options::NavigatorUnit::NU__COUNT) { + v = 0; + } + options.navRGBUnit = currentRGBUnit = (Options::NavigatorUnit)v; + + switch (currentRGBUnit) { + case Options::NavigatorUnit::NU_0_1: + R->set_text ("[0-1]"); + G->set_text ("[0-1]"); + B->set_text ("[0-1]"); + break; + case Options::NavigatorUnit::NU_0_255: + R->set_text ("[0-255]"); + G->set_text ("[0-255]"); + B->set_text ("[0-255]"); + break; + case Options::NavigatorUnit::NU_PERCENT: + default: + R->set_text ("[%]"); + G->set_text ("[%]"); + B->set_text ("[%]"); + break; + } +} + +void Navigator::cycleUnitsHSV (GdkEventButton *event) { + uint16_t v = (uint16_t)currentHSVUnit; + ++v; + if (v == (uint16_t)Options::NavigatorUnit::NU__COUNT) { + v = 0; + } + options.navHSVUnit = currentHSVUnit = (Options::NavigatorUnit)v; + + switch (currentHSVUnit) { + case Options::NavigatorUnit::NU_0_1: + H->set_text ("[0-1]"); + S->set_text ("[0-1]"); + V->set_text ("[0-1]"); + break; + case Options::NavigatorUnit::NU_0_255: + H->set_text ("[0-255]"); + S->set_text ("[0-255]"); + V->set_text ("[0-255]"); + break; + case Options::NavigatorUnit::NU_PERCENT: + default: + H->set_text ("[\xc2\xb0]"); + S->set_text ("[%]"); + V->set_text ("[%]"); + break; + } +} void Navigator::rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b) { diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 3abf34a2f..e0b79d8dd 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -22,6 +22,7 @@ #include #include "previewwindow.h" #include "pointermotionlistener.h" +#include "options.h" #include "../rtengine/iccstore.h" class Navigator : public Gtk::Frame, public PointerMotionListener @@ -29,6 +30,12 @@ class Navigator : public Gtk::Frame, public PointerMotionListener typedef const double (*TMatrix)[3]; +private: + Options::NavigatorUnit currentRGBUnit; + Options::NavigatorUnit currentHSVUnit; + void cycleUnitsRGB (GdkEventButton *event); + void cycleUnitsHSV (GdkEventButton *event); + protected: Gtk::Label* position; Gtk::Label *R, *G, *B; diff --git a/rtgui/options.cc b/rtgui/options.cc index e723361be..cec5eaef8 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -353,6 +353,8 @@ void Options::setDefaults () fbShowExpComp = false; fbShowHidden = false; fbArrangement = 2; // was 0 + navRGBUnit = NavigatorUnit::NU_PERCENT; + navHSVUnit = NavigatorUnit::NU_PERCENT; multiUser = true; profilePath = "profiles"; loadSaveProfilePath = ""; // will be corrected in load as otherwise construction fails @@ -1407,6 +1409,14 @@ int Options::readFromFile (Glib::ustring fname) histogramFullMode = keyFile.get_boolean ("GUI", "HistogramFullMode"); } + if (keyFile.has_key ("GUI", "NavigatorRGBUnit")) { + navRGBUnit = (NavigatorUnit)keyFile.get_integer ("GUI", "NavigatorRGBUnit"); + } + + if (keyFile.has_key ("GUI", "NavigatorHSVUnit")) { + navHSVUnit = (NavigatorUnit)keyFile.get_integer ("GUI", "NavigatorHSVUnit"); + } + if (keyFile.has_key ("GUI", "ShowFilmStripToolBar")) { showFilmStripToolBar = keyFile.get_boolean ("GUI", "ShowFilmStripToolBar"); } @@ -2010,6 +2020,8 @@ int Options::saveToFile (Glib::ustring fname) keyFile.set_integer ("GUI", "HistogramPosition", histogramPosition); keyFile.set_boolean ("GUI", "HistogramBar", histogramBar); keyFile.set_boolean ("GUI", "HistogramFullMode", histogramFullMode); + keyFile.set_integer ("GUI", "NavigatorRGBUnit", (int)navRGBUnit); + keyFile.set_integer ("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean ("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); keyFile.set_boolean ("GUI", "HideTPVScrollbar", hideTPVScrollbar); diff --git a/rtgui/options.h b/rtgui/options.h index 4da827f36..8d374d4cd 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -86,6 +86,13 @@ private: const Glib::ustring& entryName, Glib::ustring& destination); public: + + enum class NavigatorUnit { + NU_PERCENT, + NU_0_255, + NU_0_1, + NU__COUNT, + }; bool savesParamsAtExit; SaveFormat saveFormat, saveFormatBatch; Glib::ustring savePathTemplate; @@ -133,6 +140,8 @@ public: bool fbShowExpComp; bool fbShowHidden; int fbArrangement; + NavigatorUnit navRGBUnit; + NavigatorUnit navHSVUnit; bool multiUser; static Glib::ustring rtdir; Glib::ustring version; From f3d46f4c3768d04931651cb9989feaf3070279cd Mon Sep 17 00:00:00 2001 From: Hombre Date: Wed, 31 Aug 2016 13:40:02 +0200 Subject: [PATCH 185/232] Minor code adjustment --- rtgui/navigator.cc | 28 ++++++++++++++-------------- rtgui/options.cc | 4 ++-- rtgui/options.h | 8 ++++---- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index eea574d24..049b4ec7e 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -225,17 +225,17 @@ void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustrin position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); switch (currentRGBUnit) { - case (Options::NavigatorUnit::NU_0_1): + case (Options::NavigatorUnit::R0_1): R->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f)); G->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f)); B->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f)); break; - case (Options::NavigatorUnit::NU_0_255): + case (Options::NavigatorUnit::R0_255): R->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), r)); G->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), g)); B->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), b)); break; - case (Options::NavigatorUnit::NU_PERCENT): + case (Options::NavigatorUnit::PERCENT): default: R->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%")); G->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%")); @@ -246,17 +246,17 @@ void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustrin float h, s, v; Color::rgb2hsv (r * 0xffff / 0xff, g * 0xffff / 0xff, b * 0xffff / 0xff, h, s, v); switch (currentHSVUnit) { - case (Options::NavigatorUnit::NU_0_1): + case (Options::NavigatorUnit::R0_1): H->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), h)); S->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), s)); V->set_text (Glib::ustring::format(std::fixed, std::setprecision(4), v)); break; - case (Options::NavigatorUnit::NU_0_255): + case (Options::NavigatorUnit::R0_255): H->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), h * 255)); S->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), s * 255)); V->set_text (Glib::ustring::format(std::fixed, std::setprecision(0), v * 255)); break; - case (Options::NavigatorUnit::NU_PERCENT): + case (Options::NavigatorUnit::PERCENT): default: H->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), h * 360.f) + Glib::ustring("\xc2\xb0")); S->set_text (Glib::ustring::format(std::fixed, std::setprecision(1), s * 100.f) + Glib::ustring("%")); @@ -276,23 +276,23 @@ void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustrin void Navigator::cycleUnitsRGB (GdkEventButton *event) { uint16_t v = (uint16_t)currentRGBUnit; ++v; - if (v == (uint16_t)Options::NavigatorUnit::NU__COUNT) { + if (v == (uint16_t)Options::NavigatorUnit::_COUNT) { v = 0; } options.navRGBUnit = currentRGBUnit = (Options::NavigatorUnit)v; switch (currentRGBUnit) { - case Options::NavigatorUnit::NU_0_1: + case Options::NavigatorUnit::R0_1: R->set_text ("[0-1]"); G->set_text ("[0-1]"); B->set_text ("[0-1]"); break; - case Options::NavigatorUnit::NU_0_255: + case Options::NavigatorUnit::R0_255: R->set_text ("[0-255]"); G->set_text ("[0-255]"); B->set_text ("[0-255]"); break; - case Options::NavigatorUnit::NU_PERCENT: + case Options::NavigatorUnit::PERCENT: default: R->set_text ("[%]"); G->set_text ("[%]"); @@ -304,23 +304,23 @@ void Navigator::cycleUnitsRGB (GdkEventButton *event) { void Navigator::cycleUnitsHSV (GdkEventButton *event) { uint16_t v = (uint16_t)currentHSVUnit; ++v; - if (v == (uint16_t)Options::NavigatorUnit::NU__COUNT) { + if (v == (uint16_t)Options::NavigatorUnit::_COUNT) { v = 0; } options.navHSVUnit = currentHSVUnit = (Options::NavigatorUnit)v; switch (currentHSVUnit) { - case Options::NavigatorUnit::NU_0_1: + case Options::NavigatorUnit::R0_1: H->set_text ("[0-1]"); S->set_text ("[0-1]"); V->set_text ("[0-1]"); break; - case Options::NavigatorUnit::NU_0_255: + case Options::NavigatorUnit::R0_255: H->set_text ("[0-255]"); S->set_text ("[0-255]"); V->set_text ("[0-255]"); break; - case Options::NavigatorUnit::NU_PERCENT: + case Options::NavigatorUnit::PERCENT: default: H->set_text ("[\xc2\xb0]"); S->set_text ("[%]"); diff --git a/rtgui/options.cc b/rtgui/options.cc index cec5eaef8..e7ac7f0df 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -353,8 +353,8 @@ void Options::setDefaults () fbShowExpComp = false; fbShowHidden = false; fbArrangement = 2; // was 0 - navRGBUnit = NavigatorUnit::NU_PERCENT; - navHSVUnit = NavigatorUnit::NU_PERCENT; + navRGBUnit = NavigatorUnit::PERCENT; + navHSVUnit = NavigatorUnit::PERCENT; multiUser = true; profilePath = "profiles"; loadSaveProfilePath = ""; // will be corrected in load as otherwise construction fails diff --git a/rtgui/options.h b/rtgui/options.h index 8d374d4cd..c25708674 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -88,10 +88,10 @@ private: public: enum class NavigatorUnit { - NU_PERCENT, - NU_0_255, - NU_0_1, - NU__COUNT, + PERCENT, + R0_255, + R0_1, + _COUNT }; bool savesParamsAtExit; SaveFormat saveFormat, saveFormatBatch; From db6b43e3c0c6d18cae33d48e80935dc99a620be2 Mon Sep 17 00:00:00 2001 From: Beep6581 Date: Wed, 31 Aug 2016 14:12:31 +0200 Subject: [PATCH 186/232] Updated links Added link to RawTherapee forum at pixls.us Removed dead link to Michael's code documentation. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e90807b73..93dbfec59 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ Of course, professionals may use RawTherapee too while enjoying complete freedom Website: http://rawtherapee.com/ +Forum: +https://discuss.pixls.us/c/software/rawtherapee + Features: http://rawpedia.rawtherapee.com/Features @@ -25,9 +28,6 @@ http://rawtherapee.com/downloads Download source code tarballs: http://rawtherapee.com/shared/source/ -Source code documentation: -http://michaelezra.com/projects/rt/documentation/ - Git handbook: http://git-scm.com/book/en/ From dc4bbe906ba92ddc66f98a3c26ce19822bfb99ab Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 2 Sep 2016 21:04:23 +0200 Subject: [PATCH 187/232] Avoid possible buffer underrun in ImProcFunctions::Mad and ImProcFunctions::MadRgb --- rtengine/FTblockDN.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 288c9c994..69e846f3c 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2146,6 +2146,9 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) float ImProcFunctions::Mad(float * DataList, const int datalen) { + if(datalen <= 0) { // Avoid possible buffer underrun + return 0; + } //computes Median Absolute Deviation //DataList values should mostly have abs val < 256 because we are in Lab mode @@ -2172,6 +2175,9 @@ float ImProcFunctions::Mad(float * DataList, const int datalen) float ImProcFunctions::MadRgb(float * DataList, const int datalen) { + if(datalen <= 0) { // Avoid possible buffer underrun + return 0; + } //computes Median Absolute Deviation //DataList values should mostly have abs val < 65536 because we are in RGB mode From 40794f8e15f73ab0834b98691648ab9ddef4a0ac Mon Sep 17 00:00:00 2001 From: Hombre Date: Sat, 3 Sep 2016 21:44:02 +0200 Subject: [PATCH 188/232] Add full support of c++11 to the Eclipse IDE ...(i.e. including when building the index), with the help of -DCMAKE_ECLIPSE_VERSION="4.6.0" (set to your version, of course) on the command line. Without this, the declared symbols are wrong and c++11 is not supported by the IDE (vs the build makefiles). --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4ecf0903..ad0bd2e16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,13 @@ else (WIN32) cmake_minimum_required(VERSION 2.6) endif (WIN32) +# 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) + # 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) +endif() + PROJECT(RawTherapee) # the default target is 'Debug' From b04596ec605e7c4febc09c9559b65020306ab249 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 4 Sep 2016 02:55:57 +0200 Subject: [PATCH 189/232] Fixing a small glitch in the main cmakefile --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4ecf0903..4ef5b3d3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,7 +255,7 @@ if (WITH_BZIP) find_package(BZip2) if (BZIP2_FOUND) add_definitions (-DBZIP_SUPPORT) - set (EXTRA_INCDIR ${EXTRA_LIB} ${BZIP2_INCLUDE_DIR}) + set (EXTRA_INCDIR ${BZIP2_INCLUDE_DIR}) set (EXTRA_LIB ${EXTRA_LIB} ${BZIP2_LIBRARIES}) endif (BZIP2_FOUND) endif (WITH_BZIP) From 3ddb4171d29c85c736d97902905260792714e4c9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 5 Sep 2016 10:40:28 +0200 Subject: [PATCH 190/232] Fix a crash in denoise --- rtengine/FTblockDN.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 69e846f3c..c121ce7a1 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -879,13 +879,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef realred = interm_med + intermred; - if (realred < 0.f) { + if (realred <= 0.f) { realred = 0.001f; } realblue = interm_med + intermblue; - if (realblue < 0.f) { + if (realblue <= 0.f) { realblue = 0.001f; } From 0f21a0de6c1339fa7e8364d736af11dc1838b6f5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 7 Sep 2016 16:44:16 +0200 Subject: [PATCH 191/232] Speedups for denoise, fixes #3418 --- rtengine/FTblockDN.cc | 97 ++++++++++++++++++----------------- rtengine/color.cc | 61 ++++++++++++++++++++++ rtengine/color.h | 18 +++++-- rtengine/dcrop.cc | 4 +- rtengine/improccoordinator.cc | 1 + rtengine/improccoordinator.h | 8 +++ rtengine/sleefsseavx.c | 37 +++++++++++++ 7 files changed, 174 insertions(+), 52 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 69e846f3c..4ccc63c3a 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -37,7 +37,8 @@ #include "opthelper.h" #include "cplx_wavelet_dec.h" #include "median.h" - +#define BENCHMARK +#include "StopWatch.h" #ifdef _OPENMP #include #endif @@ -426,6 +427,7 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi) { +BENCHFUN //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -588,19 +590,19 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } - float gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; LUTf gamcurve(65536, LUT_CLIP_BELOW); + float gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; + MyTime t1e, t2e; + t1e.set(); if (denoiseMethodRgb) { - for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamma(static_cast(i) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; - } + Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); } else { - for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamman(static_cast(i) / 65535.0, gam)) * 32768.0f; - } + Color::gammanf2lut(gamcurve, gam, 65535.f, 32768.f); } + t2e.set(); + printf("gamcurve performed in %d usec:\n", t2e.etime(t1e)); // inverse gamma transform for output data float igam = 1.f / gam; @@ -609,15 +611,16 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf igamcurve(65536, LUT_CLIP_BELOW); + MyTime t11e, t21e; + t11e.set(); + if (denoiseMethodRgb) { - for (int i = 0; i < 65536; ++i) { - igamcurve[i] = (Color::gamma(static_cast(i) / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - } + Color::gammaf2lut(igamcurve, igam, igamthresh, igamslope, 32768.f, 65535.f); } else { - for (int i = 0; i < 65536; ++i) { - igamcurve[i] = (Color::gamman(static_cast(i) / 32768.0f, igam) * 65535.0f); - } + Color::gammanf2lut(igamcurve, igam, 32768.f, 65535.f); } + t21e.set(); + printf("igamcurve performed in %d usec:\n", t21e.etime(t11e)); const float gain = pow (2.0f, float(expcomp)); float noisevar_Ldetail = SQR(static_cast(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); @@ -922,9 +925,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef B_ = (*denoiseigamtab)[B_]; //apply gamma noise standard (slider) - R_ = R_ < 65535.0f ? gamcurve[R_] : (Color::gammanf(R_ / 65535.f, gam) * 32768.0f); - G_ = G_ < 65535.0f ? gamcurve[G_] : (Color::gammanf(G_ / 65535.f, gam) * 32768.0f); - B_ = B_ < 65535.0f ? gamcurve[B_] : (Color::gammanf(B_ / 65535.f, gam) * 32768.0f); + R_ = R_ < 65535.f ? gamcurve[R_] : (Color::gammanf(R_ / 65535.f, gam) * 32768.f); + G_ = G_ < 65535.f ? gamcurve[G_] : (Color::gammanf(G_ / 65535.f, gam) * 32768.f); + B_ = B_ < 65535.f ? gamcurve[B_] : (Color::gammanf(B_ / 65535.f, gam) * 32768.f); //true conversion xyz=>Lab float X, Y, Z; @@ -966,9 +969,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Y = gain * src->g(i, j); float Z = gain * src->b(i, j); //conversion colorspace to determine luminance with no gamma - X = X < 65535.0f ? gamcurve[X] : (Color::gamma(static_cast(X) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma(static_cast(Y) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma(static_cast(Z) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + X = X < 65535.f ? gamcurve[X] : (Color::gammaf(X / 65535.f, gam, gamthresh, gamslope) * 32768.f); + Y = Y < 65535.f ? gamcurve[Y] : (Color::gammaf(Y / 65535.f, gam, gamthresh, gamslope) * 32768.f); + Z = Z < 65535.f ? gamcurve[Z] : (Color::gammaf(Z / 65535.f, gam, gamthresh, gamslope) * 32768.f); //end chroma labdn->L[i1][j1] = Y; labdn->a[i1][j1] = (X - Y); @@ -1009,9 +1012,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float btmp = Color::igammatab_srgb[ src->b(i, j) ]; //modification Jacques feb 2013 // gamma slider different from raw - rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman(static_cast(rtmp) / 65535.0, gam) * 32768.0f); - gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman(static_cast(gtmp) / 65535.0, gam) * 32768.0f); - btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman(static_cast(btmp) / 65535.0, gam) * 32768.0f); + rtmp = rtmp < 65535.f ? gamcurve[rtmp] : (Color::gammanf(rtmp / 65535.f, gam) * 32768.f); + gtmp = gtmp < 65535.f ? gamcurve[gtmp] : (Color::gammanf(gtmp / 65535.f, gam) * 32768.f); + btmp = btmp < 65535.f ? gamcurve[btmp] : (Color::gammanf(btmp / 65535.f, gam) * 32768.f); float X, Y, Z; Color::rgbxyz(rtmp, gtmp, btmp, X, Y, Z, wp); @@ -1650,9 +1653,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Z = Y - (labdn->b[i1][j1]); - X = X < 32768.0f ? igamcurve[X] : (Color::gamma(X / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - Y = Y < 32768.0f ? igamcurve[Y] : (Color::gamma(Y / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - Z = Z < 32768.0f ? igamcurve[Z] : (Color::gamma(Z / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); + X = X < 32768.f ? igamcurve[X] : (Color::gammaf(X / 32768.f, igam, igamthresh, igamslope) * 65535.f); + Y = Y < 32768.f ? igamcurve[Y] : (Color::gammaf(Y / 32768.f, igam, igamthresh, igamslope) * 65535.f); + Z = Z < 32768.f ? igamcurve[Z] : (Color::gammaf(Z / 32768.f, igam, igamthresh, igamslope) * 65535.f); if (numtiles == 1) { dsttmp->r(i, j) = newGain * X; @@ -1695,9 +1698,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float r_, g_, b_; Color::xyz2rgb(X, Y, Z, r_, g_, b_, wip); //gamma slider is different from Raw - r_ = r_ < 32768.0f ? igamcurve[r_] : (Color::gamman(r_ / 32768.0f, igam) * 65535.0f); - g_ = g_ < 32768.0f ? igamcurve[g_] : (Color::gamman(g_ / 32768.0f, igam) * 65535.0f); - b_ = b_ < 32768.0f ? igamcurve[b_] : (Color::gamman(b_ / 32768.0f, igam) * 65535.0f); + r_ = r_ < 32768.f ? igamcurve[r_] : (Color::gammanf(r_ / 32768.f, igam) * 65535.f); + g_ = g_ < 32768.f ? igamcurve[g_] : (Color::gammanf(g_ / 32768.f, igam) * 65535.f); + b_ = b_ < 32768.f ? igamcurve[b_] : (Color::gammanf(b_ / 32768.f, igam) * 65535.f); if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; @@ -2982,7 +2985,7 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition & } } -void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope) +SSEFUNCTION void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope) { gam = dnparams.gamma; gamthresh = 0.001f; @@ -2995,18 +2998,20 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa } } - gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); + MyTime t1e, t2e; + t1e.set(); + if (denoiseMethodRgb) { - for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamma(static_cast(i) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; - } + gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; + Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); } else { - for (int i = 0; i < 65536; ++i) { - gamcurve[i] = (Color::gamman(static_cast(i) / 65535.0, gam)) * 32768.0f; - } + Color::gammanf2lut(gamcurve, gam, 65535.f, 32768.f); } + t2e.set(); + printf("gamcurve in RGB_denoise_infoGamCurve performed in %d usec:\n", t2e.etime(t1e)); + } void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) @@ -3424,9 +3429,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat B_ = (*denoiseigamtab)[B_]; //apply gamma noise standard (slider) - R_ = R_ < 65535.0f ? gamcurve[R_] : (Color::gamman(static_cast(R_) / 65535.0, gam) * 32768.0f); - G_ = G_ < 65535.0f ? gamcurve[G_] : (Color::gamman(static_cast(G_) / 65535.0, gam) * 32768.0f); - B_ = B_ < 65535.0f ? gamcurve[B_] : (Color::gamman(static_cast(B_) / 65535.0, gam) * 32768.0f); + R_ = R_ < 65535.f ? gamcurve[R_] : (Color::gammanf(R_ / 65535.f, gam) * 32768.f); + G_ = G_ < 65535.f ? gamcurve[G_] : (Color::gammanf(G_ / 65535.f, gam) * 32768.f); + B_ = B_ < 65535.f ? gamcurve[B_] : (Color::gammanf(B_ / 65535.f, gam) * 32768.f); //true conversion xyz=>Lab float X, Y, Z; Color::rgbxyz(R_, G_, B_, X, Y, Z, wp); @@ -3451,9 +3456,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float Y = gain * src->g(i, j); float Z = gain * src->b(i, j); - X = X < 65535.0f ? gamcurve[X] : (Color::gamma(static_cast(X) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Y = Y < 65535.0f ? gamcurve[Y] : (Color::gamma(static_cast(Y) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); - Z = Z < 65535.0f ? gamcurve[Z] : (Color::gamma(static_cast(Z) / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 32768.0f); + X = X < 65535.f ? gamcurve[X] : (Color::gammaf(X / 65535.f, gam, gamthresh, gamslope) * 32768.f); + Y = Y < 65535.f ? gamcurve[Y] : (Color::gammaf(Y / 65535.f, gam, gamthresh, gamslope) * 32768.f); + Z = Z < 65535.f ? gamcurve[Z] : (Color::gammaf(Z / 65535.f, gam, gamthresh, gamslope) * 32768.f); labdn->a[i1][j1] = (X - Y); labdn->b[i1][j1] = (Y - Z); @@ -3480,9 +3485,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float btmp = Color::igammatab_srgb[ src->b(i, j) ]; //modification Jacques feb 2013 // gamma slider different from raw - rtmp = rtmp < 65535.0f ? gamcurve[rtmp] : (Color::gamman(static_cast(rtmp) / 65535.0, gam) * 32768.0f); - gtmp = gtmp < 65535.0f ? gamcurve[gtmp] : (Color::gamman(static_cast(gtmp) / 65535.0, gam) * 32768.0f); - btmp = btmp < 65535.0f ? gamcurve[btmp] : (Color::gamman(static_cast(btmp) / 65535.0, gam) * 32768.0f); + rtmp = rtmp < 65535.f ? gamcurve[rtmp] : (Color::gammanf(rtmp / 65535.f, gam) * 32768.f); + gtmp = gtmp < 65535.f ? gamcurve[gtmp] : (Color::gammanf(gtmp / 65535.f, gam) * 32768.f); + btmp = btmp < 65535.f ? gamcurve[btmp] : (Color::gammanf(btmp / 65535.f, gam) * 32768.f); float X, Y, Z; Color::rgbxyz(rtmp, gtmp, btmp, X, Y, Z, wp); diff --git a/rtengine/color.cc b/rtengine/color.cc index 872f47522..fa4a79840 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1478,6 +1478,67 @@ void Color::calcGamma (double pwr, double ts, int mode, int imax, double &gamma0 return; } } +void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor) +{ +#ifdef __SSE2__ + // SSE2 version is more than 6 times faster than scalar version + vfloat iv = _mm_set_ps(3.f,2.f,1.f,0.f); + vfloat fourv = F2V(4.f); + vfloat gammav = F2V(1.f / gamma); + vfloat slopev = F2V((slope / divisor) * factor); + vfloat divisorv = F2V(xlogf(divisor)); + vfloat factorv = F2V(factor); + vfloat comparev = F2V(start * divisor); + int border = start * divisor; + int border1 = border - (border & 3); + int border2 = border1 + 4; + int i = 0; + for(; i < border1; i += 4) { + vfloat resultv = iv * slopev; + _mm_storeu_ps(&gammacurve[i], resultv); + iv += fourv; + } + for(; i < border2; i += 4) { + vfloat result0v = iv * slopev; + vfloat result1v = xexpf((xlogf(iv) - divisorv) * gammav) * factorv; + _mm_storeu_ps(&gammacurve[i], vself(vmaskf_le(iv, comparev), result0v, result1v)); + iv += fourv; + } + for(; i < 65536; i += 4) { + vfloat resultv = xexpfNoCheck((xlogfNoCheck(iv) - divisorv) * gammav) * factorv; + _mm_storeu_ps(&gammacurve[i], resultv); + iv += fourv; + } +#else + for (int i = 0; i < 65536; ++i) { + gammacurve[i] = gammaf(static_cast(i) / divisor, gamma, start, slope) * factor; + } +#endif +} + +void Color::gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float factor) //standard gamma without slope... +{ +#ifdef __SSE2__ + // SSE2 version is more than 6 times faster than scalar version + vfloat iv = _mm_set_ps(3.f,2.f,1.f,0.f); + vfloat fourv = F2V(4.f); + vfloat gammav = F2V(1.f / gamma); + vfloat divisorv = F2V(xlogf(divisor)); + vfloat factorv = F2V(factor); + vfloat resultv = xexpf((xlogf(iv) - divisorv) * gammav) * factorv; + _mm_storeu_ps(&gammacurve[0], resultv); + iv += fourv; + for(int i=4; i < 65536; i += 4) { + resultv = xexpfNoCheck((xlogfNoCheck(iv) - divisorv) * gammav) * factorv; + _mm_storeu_ps(&gammacurve[i], resultv); + iv += fourv; + } +#else + for (int i = 0; i < 65536; ++i) { + gammacurve[i] = Color::gammanf(static_cast(i) / divisor, gamma) * factor; + } +#endif +} void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) { diff --git a/rtengine/color.h b/rtengine/color.h index 1ae721e5a..c7699e9c5 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1104,6 +1104,15 @@ public: { return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add); } + + static inline float gammaf (float x, float gamma, float start, float slope) + { + return x <= start ? x*slope : xexpf(xlogf(x) / gamma); + } + + //fills a LUT of size 65536 using gamma with slope... + static void gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, float divisor, float factor); + static inline double igamma (double x, double gamma, double start, double slope, double mul, double add) { return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma) ); @@ -1118,7 +1127,7 @@ public: */ static inline double gamman (double x, double gamma) //standard gamma without slope... { - return (x = exp(log(x) / gamma)); + return exp(log(x) / gamma); } /** @@ -1129,9 +1138,10 @@ public: */ static inline float gammanf (float x, float gamma) //standard gamma without slope... { - return (x = xexpf(xlogf(x) / gamma)); + return xexpf(xlogf(x) / gamma); } - + //fills a LUT of size 65536 using gamma without slope... + static void gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float factor); /** * @brief Very simply inverse gamma @@ -1141,7 +1151,7 @@ public: */ static inline double igamman (double x, double gamma) //standard inverse gamma without slope... { - return (x = exp(log(x) * gamma) ); + return exp(log(x) * gamma); } diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 93aca0f6d..6bf3f2273 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -380,7 +380,7 @@ void Crop::update (int todo) } } - if(skip == 1 && params.dirpyrDenoise.enabled && ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO"))) { + if(skip == 1 && params.dirpyrDenoise.enabled && !parent->denoiseInfoStore.valid && ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO"))) { MyTime t1aue, t2aue; t1aue.set(); @@ -587,7 +587,7 @@ void Crop::update (int todo) params.dirpyrDenoise.chroma = chM / (autoNR * multip * adjustr); params.dirpyrDenoise.redchro = maxr; params.dirpyrDenoise.bluechro = maxb; - + parent->denoiseInfoStore.valid = true; if(parent->adnListener) { parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index a6354bd56..8925b29e0 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -320,6 +320,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) ipf.setScale (scale); imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw); + denoiseInfoStore.valid = false; //ColorTemp::CAT02 (orig_prev, ¶ms) ; // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); /* Issue 2785, disabled some 1:1 tools diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 5cc03cb72..a1124ff01 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -325,6 +325,14 @@ public: { return imgsrc; } + + class denoiseinfostore { + public: + bool valid; + + denoiseinfostore() : valid(false) {}; + } denoiseInfoStore; + }; } #endif diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index a9f49f143..1b0c9a0ae 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -1275,6 +1275,25 @@ static INLINE vfloat xlogf0(vfloat d) { return x; } +static INLINE vfloat xlogfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > 0 e.g. when filling a lookup table + vfloat x, x2, t, m; + vint2 e; + + e = vilogbp1f(vmulf(d, vcast_vf_f(0.7071f))); + m = vldexpf(d, vsubi2(vcast_vi2_i(0), e)); + + x = vdivf(vaddf(vcast_vf_f(-1.0f), m), vaddf(vcast_vf_f(1.0f), m)); + x2 = vmulf(x, x); + + t = vcast_vf_f(0.2371599674224853515625f); + t = vmlaf(t, x2, vcast_vf_f(0.285279005765914916992188f)); + t = vmlaf(t, x2, vcast_vf_f(0.400005519390106201171875f)); + t = vmlaf(t, x2, vcast_vf_f(0.666666567325592041015625f)); + t = vmlaf(t, x2, vcast_vf_f(2.0f)); + + return vaddf(vmulf(x, t), vmulf(vcast_vf_f(0.693147180559945286226764f), vcast_vf_vi2(e))); + +} static INLINE vfloat xexpf(vfloat d) { vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); @@ -1299,6 +1318,24 @@ static INLINE vfloat xexpf(vfloat d) { return u; } +static INLINE vfloat xexpfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > -104.f e.g. when filling a lookup table + vint2 q = vrint_vi2_vf(vmulf(d, vcast_vf_f(R_LN2f))); + vfloat s, u; + + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Uf),d); + s = vmlaf(vcast_vf_vi2(q), vcast_vf_f(-L2Lf),s); + + u = vcast_vf_f(0.00136324646882712841033936f); + u = vmlaf(u, s, vcast_vf_f(0.00836596917361021041870117f)); + u = vmlaf(u, s, vcast_vf_f(0.0416710823774337768554688f)); + u = vmlaf(u, s, vcast_vf_f(0.166665524244308471679688f)); + u = vmlaf(u, s, vcast_vf_f(0.499999850988388061523438f)); + + u = vaddf(vcast_vf_f(1.0f), vmlaf(vmulf(s, s), u, s)); + + return vldexpf(u, q); +} + static INLINE vfloat xcbrtf(vfloat d) { vfloat x, y, q = vcast_vf_f(1.0), t; vint2 e, qu, re; From ef83e6b591a211afe8d4471c6933b3953ae2fd4e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 7 Sep 2016 23:34:06 +0200 Subject: [PATCH 192/232] Removed StopWatches and corrected some bugs from latest commit --- rtengine/FTblockDN.cc | 19 ------------------- rtengine/dcrop.cc | 26 ++++++++++---------------- rtengine/improccoordinator.h | 10 ++++++---- 3 files changed, 16 insertions(+), 39 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 4ccc63c3a..8229417e4 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -37,8 +37,6 @@ #include "opthelper.h" #include "cplx_wavelet_dec.h" #include "median.h" -#define BENCHMARK -#include "StopWatch.h" #ifdef _OPENMP #include #endif @@ -427,7 +425,6 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi) { -BENCHFUN //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -594,15 +591,11 @@ BENCHFUN LUTf gamcurve(65536, LUT_CLIP_BELOW); float gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; - MyTime t1e, t2e; - t1e.set(); if (denoiseMethodRgb) { Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); } else { Color::gammanf2lut(gamcurve, gam, 65535.f, 32768.f); } - t2e.set(); - printf("gamcurve performed in %d usec:\n", t2e.etime(t1e)); // inverse gamma transform for output data float igam = 1.f / gam; @@ -611,16 +604,11 @@ BENCHFUN LUTf igamcurve(65536, LUT_CLIP_BELOW); - MyTime t11e, t21e; - t11e.set(); - if (denoiseMethodRgb) { Color::gammaf2lut(igamcurve, igam, igamthresh, igamslope, 32768.f, 65535.f); } else { Color::gammanf2lut(igamcurve, igam, 32768.f, 65535.f); } - t21e.set(); - printf("igamcurve performed in %d usec:\n", t21e.etime(t11e)); const float gain = pow (2.0f, float(expcomp)); float noisevar_Ldetail = SQR(static_cast(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); @@ -821,7 +809,6 @@ BENCHFUN {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} }; - // begin tile processing of image #ifdef _OPENMP #pragma omp parallel num_threads(numthreads) if (numthreads>1) @@ -3000,18 +2987,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::Dir bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); - MyTime t1e, t2e; - t1e.set(); - if (denoiseMethodRgb) { gamslope = exp(log(static_cast(gamthresh)) / gam) / gamthresh; Color::gammaf2lut(gamcurve, gam, gamthresh, gamslope, 65535.f, 32768.f); } else { Color::gammanf2lut(gamcurve, gam, 65535.f, 32768.f); } - t2e.set(); - printf("gamcurve in RGB_denoise_infoGamCurve performed in %d usec:\n", t2e.etime(t1e)); - } void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 6bf3f2273..1e5aba77c 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -191,9 +191,6 @@ void Crop::update (int todo) parent->ipf.Tile_calc (tilesize, overlap, kall, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); kall = 0; - float *ch_M = new float [9];//allocate memory - float *max_r = new float [9]; - float *max_b = new float [9]; float *min_b = new float [9]; float *min_r = new float [9]; float *lumL = new float [9]; @@ -462,9 +459,9 @@ void Crop::update (int todo) //printf("DCROP skip=%d cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f\n",skip, chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema); Nb[hcr * 3 + wcr] = nb; - ch_M[hcr * 3 + wcr] = pondcorrec * chaut; - max_r[hcr * 3 + wcr] = pondcorrec * maxredaut; - max_b[hcr * 3 + wcr] = pondcorrec * maxblueaut; + parent->denoiseInfoStore.ch_M[hcr * 3 + wcr] = pondcorrec * chaut; + parent->denoiseInfoStore.max_r[hcr * 3 + wcr] = pondcorrec * maxredaut; + parent->denoiseInfoStore.max_b[hcr * 3 + wcr] = pondcorrec * maxblueaut; min_r[hcr * 3 + wcr] = pondcorrec * minredaut; min_b[hcr * 3 + wcr] = pondcorrec * minblueaut; lumL[hcr * 3 + wcr] = lumema; @@ -524,20 +521,20 @@ void Crop::update (int todo) int lissage = settings->leveldnliss; for (int k = 0; k < 9; k++) { - float maxmax = max(max_r[k], max_b[k]); - parent->ipf.calcautodn_info (ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]); + float maxmax = max(parent->denoiseInfoStore.max_r[k], parent->denoiseInfoStore.max_b[k]); + parent->ipf.calcautodn_info (parent->denoiseInfoStore.ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]); // printf("ch_M=%f delta=%f\n",ch_M[k], delta[k]); } for (int k = 0; k < 9; k++) { - if(max_r[k] > max_b[k]) { + if(parent->denoiseInfoStore.max_r[k] > parent->denoiseInfoStore.max_b[k]) { Max_R[k] = (delta[k]) / ((autoNRmax * multip * adjustr * lowdenoise) / 2.f); - Min_B[k] = -(ch_M[k] - min_b[k]) / (autoNRmax * multip * adjustr * lowdenoise); + Min_B[k] = -(parent->denoiseInfoStore.ch_M[k] - min_b[k]) / (autoNRmax * multip * adjustr * lowdenoise); Max_B[k] = 0.f; Min_R[k] = 0.f; } else { Max_B[k] = (delta[k]) / ((autoNRmax * multip * adjustr * lowdenoise) / 2.f); - Min_R[k] = - (ch_M[k] - min_r[k]) / (autoNRmax * multip * adjustr * lowdenoise); + Min_R[k] = - (parent->denoiseInfoStore.ch_M[k] - min_r[k]) / (autoNRmax * multip * adjustr * lowdenoise); Min_B[k] = 0.f; Max_R[k] = 0.f; } @@ -545,7 +542,7 @@ void Crop::update (int todo) for (int k = 0; k < 9; k++) { // printf("ch_M= %f Max_R=%f Max_B=%f min_r=%f min_b=%f\n",ch_M[k],Max_R[k], Max_B[k],Min_R[k], Min_B[k]); - chM += ch_M[k]; + chM += parent->denoiseInfoStore.ch_M[k]; MaxBMoy += Max_B[k]; MaxRMoy += Max_R[k]; MinRMoy += Min_R[k]; @@ -644,7 +641,7 @@ void Crop::update (int todo) int kall = 0; float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi; - parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, ch_M, max_r, max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); + parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); if (parent->adnListener) { parent->adnListener->noiseChanged(nresi, highresi); @@ -665,9 +662,6 @@ void Crop::update (int todo) parent->imgsrc->convertColorSpace(origCrop, params.icm, parent->currWB); - delete [] ch_M; - delete [] max_r; - delete [] max_b; delete [] min_r; delete [] min_b; delete [] lumL; diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index a1124ff01..776484791 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -326,11 +326,13 @@ public: return imgsrc; } - class denoiseinfostore { - public: - bool valid; + struct { + float chM; + float max_r[9]; + float max_b[9]; + float ch_M[9]; + bool valid = false; - denoiseinfostore() : valid(false) {}; } denoiseInfoStore; }; From 5bb20c413e889e397d005357c45003822989f606 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Sep 2016 16:04:43 +0200 Subject: [PATCH 193/232] Cleaned code, also reduced base memory usage of RT by 1 MB --- rtengine/FTblockDN.cc | 66 +++----------------- rtengine/color.cc | 138 +++++++++++++++++++++++++----------------- rtengine/color.h | 11 ++-- 3 files changed, 95 insertions(+), 120 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8229417e4..8ff22864c 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -613,36 +613,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const float gain = pow (2.0f, float(expcomp)); float noisevar_Ldetail = SQR(static_cast(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); - if (settings->verbose) { - printf("Denoise Lab=%i\n", settings->denoiselabgamma); - } - - // To avoid branches in loops we access the gammatabs by pointers - // modify arbitrary data for Lab..I have test : nothing, gamma 2.6 11 - gamma 4 5 - gamma 5.5 10 - // we can put other as gamma g=2.6 slope=11, etc. - // but noting to do with real gamma !!!: it's only for data Lab # data RGB - // finally I opted fot gamma55 and with options we can change - - LUTf *denoisegamtab; - LUTf *denoiseigamtab; - - switch(settings->denoiselabgamma) { - case 0: - denoisegamtab = &(Color::gammatab_26_11); - denoiseigamtab = &(Color::igammatab_26_11); - break; - - case 1: - denoisegamtab = &(Color::gammatab_4); - denoiseigamtab = &(Color::igammatab_4); - break; - - default: - denoisegamtab = &(Color::gammatab_55); - denoiseigamtab = &(Color::igammatab_55); - break; - } - array2D tilemask_in(TS, TS); array2D tilemask_out(TS, TS); @@ -907,9 +877,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float G_ = gain * src->g(i, j); float B_ = gain * src->b(i, j); - R_ = (*denoiseigamtab)[R_]; - G_ = (*denoiseigamtab)[G_]; - B_ = (*denoiseigamtab)[B_]; + R_ = Color::denoiseIGammaTab[R_]; + G_ = Color::denoiseIGammaTab[G_]; + B_ = Color::denoiseIGammaTab[B_]; //apply gamma noise standard (slider) R_ = R_ < 65535.f ? gamcurve[R_] : (Color::gammanf(R_ / 65535.f, gam) * 32768.f); @@ -1602,9 +1572,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef b_ = b_ < 32768.f ? igamcurve[b_] : (Color::gammanf(b_ / 32768.f, igam) * 65535.f); //readapt arbitrary gamma (inverse from beginning) - r_ = (*denoisegamtab)[r_]; - g_ = (*denoisegamtab)[g_]; - b_ = (*denoisegamtab)[b_]; + r_ = Color::denoiseGammaTab[r_]; + g_ = Color::denoiseGammaTab[g_]; + b_ = Color::denoiseGammaTab[b_]; if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; @@ -3242,24 +3212,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat int nb = 0; int comptlevel = 0; - // To avoid branches in loops we access the gammatabs by pointers - LUTf *denoiseigamtab; - - switch(settings->denoiselabgamma) { - case 0: - denoiseigamtab = &(Color::igammatab_26_11); - break; - - case 1: - denoiseigamtab = &(Color::igammatab_4); - break; - - default: - denoiseigamtab = &(Color::igammatab_55); - break; - } - - for (int tiletop = 0; tiletop < imheight; tiletop += tileHskip) { for (int tileleft = 0; tileleft < imwidth; tileleft += tileWskip) { @@ -3405,9 +3357,9 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float G_ = gain * src->g(i, j); float B_ = gain * src->b(i, j); - R_ = (*denoiseigamtab)[R_]; - G_ = (*denoiseigamtab)[G_]; - B_ = (*denoiseigamtab)[B_]; + R_ = Color::denoiseIGammaTab[R_]; + G_ = Color::denoiseIGammaTab[G_]; + B_ = Color::denoiseIGammaTab[B_]; //apply gamma noise standard (slider) R_ = R_ < 65535.f ? gamcurve[R_] : (Color::gammanf(R_ / 65535.f, gam) * 32768.f); diff --git a/rtengine/color.cc b/rtengine/color.cc index fa4a79840..e19cfb616 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -41,15 +41,10 @@ LUTf Color::igammatab_srgb; LUTf Color::igammatab_srgb1; LUTf Color::gammatab_srgb; LUTf Color::gammatab_srgb1; -// LUTf Color::igammatab_709; -// LUTf Color::gammatab_709; -LUTf Color::igammatab_55; -LUTf Color::gammatab_55; -LUTf Color::igammatab_4; -LUTf Color::gammatab_4; -LUTf Color::igammatab_26_11; -LUTf Color::gammatab_26_11; +LUTf Color::denoiseGammaTab; +LUTf Color::denoiseIGammaTab; + LUTf Color::igammatab_24_17; LUTf Color::gammatab_24_17a; LUTf Color::gammatab_13_2; @@ -148,13 +143,10 @@ void Color::init () igammatab_srgb1(maxindex, 0); gammatab_srgb(maxindex, 0); gammatab_srgb1(maxindex, 0); - igammatab_55(maxindex, 0); - gammatab_55(maxindex, 0); - igammatab_4(maxindex, 0); - gammatab_4(maxindex, 0); - igammatab_26_11(maxindex, 0); - gammatab_26_11(maxindex, 0); + denoiseGammaTab(maxindex, 0); + denoiseIGammaTab(maxindex, 0); + igammatab_24_17(maxindex, 0); gammatab_24_17a(maxindex, LUT_CLIP_ABOVE | LUT_CLIP_BELOW); gammatab_13_2(maxindex, 0); @@ -193,6 +185,7 @@ void Color::init () { gammatab_srgb[i] = gammatab_srgb1[i] = gamma2(i / 65535.0); } + gammatab_srgb *= 65535.f; gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags } @@ -200,9 +193,11 @@ void Color::init () #pragma omp section #endif { - for (int i = 0; i < maxindex; i++) { + for (int i = 0; i < maxindex; i++) + { igammatab_srgb[i] = igammatab_srgb1[i] = igamma2 (i / 65535.0); } + igammatab_srgb *= 65535.f; } #ifdef _OPENMP @@ -211,42 +206,74 @@ void Color::init () { double rsRGBGamma = 1.0 / sRGBGamma; - for (int i = 0; i < maxindex; i++) { + for (int i = 0; i < maxindex; i++) + { double val = pow (i / 65535.0, rsRGBGamma); gammatab[i] = 65535.0 * val; gammatabThumb[i] = (unsigned char)(255.0 * val); } } + #ifdef _OPENMP #pragma omp section #endif + // modify arbitrary data for Lab..I have test : nothing, gamma 2.6 11 - gamma 4 5 - gamma 5.5 10 + // we can put other as gamma g=2.6 slope=11, etc. + // but noting to do with real gamma !!!: it's only for data Lab # data RGB + // finally I opted for gamma55 and with options we can change - for (int i = 0; i < maxindex; i++) { - gammatab_55[i] = 65535.0 * gamma55 (i / 65535.0); + switch(settings->denoiselabgamma) { + case 0: + for (int i = 0; i < maxindex; i++) { + denoiseGammaTab[i] = 65535.0 * gamma26_11 (i / 65535.0); + } + + break; + + case 1: + for (int i = 0; i < maxindex; i++) { + denoiseGammaTab[i] = 65535.0 * gamma4 (i / 65535.0); + } + + break; + + default: + for (int i = 0; i < maxindex; i++) { + denoiseGammaTab[i] = 65535.0 * gamma55 (i / 65535.0); + } + + break; } #ifdef _OPENMP #pragma omp section #endif + // modify arbitrary data for Lab..I have test : nothing, gamma 2.6 11 - gamma 4 5 - gamma 5.5 10 + // we can put other as gamma g=2.6 slope=11, etc. + // but noting to do with real gamma !!!: it's only for data Lab # data RGB + // finally I opted for gamma55 and with options we can change - for (int i = 0; i < maxindex; i++) { - igammatab_55[i] = 65535.0 * igamma55 (i / 65535.0); - } + switch(settings->denoiselabgamma) { + case 0: + for (int i = 0; i < maxindex; i++) { + denoiseIGammaTab[i] = 65535.0 * igamma26_11 (i / 65535.0); + } -#ifdef _OPENMP - #pragma omp section -#endif + break; - for (int i = 0; i < maxindex; i++) { - gammatab_4[i] = 65535.0 * gamma4 (i / 65535.0); - } + case 1: + for (int i = 0; i < maxindex; i++) { + denoiseIGammaTab[i] = 65535.0 * igamma4 (i / 65535.0); + } -#ifdef _OPENMP - #pragma omp section -#endif + break; - for (int i = 0; i < maxindex; i++) { - igammatab_4[i] = 65535.0 * igamma4 (i / 65535.0); + default: + for (int i = 0; i < maxindex; i++) { + denoiseIGammaTab[i] = 65535.0 * igamma55 (i / 65535.0); + } + + break; } #ifdef _OPENMP @@ -297,22 +324,6 @@ void Color::init () igammatab_145_3[i] = 65535.0 * igamma145_3 (i / 65535.0); } -#ifdef _OPENMP - #pragma omp section -#endif - - for (int i = 0; i < maxindex; i++) { - gammatab_26_11[i] = 65535.0 * gamma26_11 (i / 65535.0); - } - -#ifdef _OPENMP - #pragma omp section -#endif - - for (int i = 0; i < maxindex; i++) { - igammatab_26_11[i] = 65535.0 * igamma26_11 (i / 65535.0); - } - #ifdef _OPENMP #pragma omp section #endif @@ -1482,7 +1493,7 @@ void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, { #ifdef __SSE2__ // SSE2 version is more than 6 times faster than scalar version - vfloat iv = _mm_set_ps(3.f,2.f,1.f,0.f); + vfloat iv = _mm_set_ps(3.f, 2.f, 1.f, 0.f); vfloat fourv = F2V(4.f); vfloat gammav = F2V(1.f / gamma); vfloat slopev = F2V((slope / divisor) * factor); @@ -1493,26 +1504,32 @@ void Color::gammaf2lut (LUTf &gammacurve, float gamma, float start, float slope, int border1 = border - (border & 3); int border2 = border1 + 4; int i = 0; + for(; i < border1; i += 4) { vfloat resultv = iv * slopev; - _mm_storeu_ps(&gammacurve[i], resultv); + STVFU(gammacurve[i], resultv); iv += fourv; } + for(; i < border2; i += 4) { vfloat result0v = iv * slopev; vfloat result1v = xexpf((xlogf(iv) - divisorv) * gammav) * factorv; - _mm_storeu_ps(&gammacurve[i], vself(vmaskf_le(iv, comparev), result0v, result1v)); + STVFU(gammacurve[i], vself(vmaskf_le(iv, comparev), result0v, result1v)); iv += fourv; } + for(; i < 65536; i += 4) { vfloat resultv = xexpfNoCheck((xlogfNoCheck(iv) - divisorv) * gammav) * factorv; - _mm_storeu_ps(&gammacurve[i], resultv); + STVFU(gammacurve[i], resultv); iv += fourv; } + #else + for (int i = 0; i < 65536; ++i) { gammacurve[i] = gammaf(static_cast(i) / divisor, gamma, start, slope) * factor; } + #endif } @@ -1520,23 +1537,30 @@ void Color::gammanf2lut (LUTf &gammacurve, float gamma, float divisor, float fac { #ifdef __SSE2__ // SSE2 version is more than 6 times faster than scalar version - vfloat iv = _mm_set_ps(3.f,2.f,1.f,0.f); + vfloat iv = _mm_set_ps(3.f, 2.f, 1.f, 0.f); vfloat fourv = F2V(4.f); vfloat gammav = F2V(1.f / gamma); vfloat divisorv = F2V(xlogf(divisor)); vfloat factorv = F2V(factor); + + // first input value is zero => we have to use the xlogf function which checks this vfloat resultv = xexpf((xlogf(iv) - divisorv) * gammav) * factorv; - _mm_storeu_ps(&gammacurve[0], resultv); + STVFU(gammacurve[0], resultv); iv += fourv; - for(int i=4; i < 65536; i += 4) { + + // inside the loop we can use xlogfNoCheck and xexpfNoCheck because we know about the input values + for(int i = 4; i < 65536; i += 4) { resultv = xexpfNoCheck((xlogfNoCheck(iv) - divisorv) * gammav) * factorv; - _mm_storeu_ps(&gammacurve[i], resultv); + STVFU(gammacurve[i], resultv); iv += fourv; } + #else + for (int i = 0; i < 65536; ++i) { gammacurve[i] = Color::gammanf(static_cast(i) / divisor, gamma) * factor; } + #endif } @@ -2204,6 +2228,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr neg = false, more_rgb = false; #endif float ChprovSave = Chprov1; + do { inGamut = true; @@ -2226,6 +2251,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr #ifdef _DEBUG neg = true; #endif + if (isnan(HH)) { float atemp = ChprovSave * sincosval.y * 327.68; float btemp = ChprovSave * sincosval.x * 327.68; diff --git a/rtengine/color.h b/rtengine/color.h index c7699e9c5..0f6b24797 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -132,13 +132,10 @@ public: static LUTf igammatab_srgb1; static LUTf gammatab_srgb; static LUTf gammatab_srgb1; - static LUTf igammatab_55; - static LUTf gammatab_55; - static LUTf igammatab_4; - static LUTf gammatab_4; - static LUTf igammatab_26_11; - static LUTf gammatab_26_11; + static LUTf denoiseGammaTab; + static LUTf denoiseIGammaTab; + static LUTf igammatab_24_17; static LUTf gammatab_24_17a; static LUTf gammatab_13_2; @@ -1107,7 +1104,7 @@ public: static inline float gammaf (float x, float gamma, float start, float slope) { - return x <= start ? x*slope : xexpf(xlogf(x) / gamma); + return x <= start ? x * slope : xexpf(xlogf(x) / gamma); } //fills a LUT of size 65536 using gamma with slope... From d564d17425e2677bf1f24b77088cb7e61957fc09 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Sep 2016 16:36:18 +0200 Subject: [PATCH 194/232] mentioned the author of the sleef library in the header of the sleef source files, removed unused sleef.h --- rtengine/helperavx.h | 6 +++++ rtengine/helpersse2.h | 9 ++++++++ rtengine/sleef.c | 9 ++++++++ rtengine/sleef.h | 51 ------------------------------------------ rtengine/sleefsseavx.c | 10 +++++++++ 5 files changed, 34 insertions(+), 51 deletions(-) delete mode 100644 rtengine/sleef.h diff --git a/rtengine/helperavx.h b/rtengine/helperavx.h index eb32277c3..528760a92 100644 --- a/rtengine/helperavx.h +++ b/rtengine/helperavx.h @@ -1,3 +1,9 @@ +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author: Naoki Shibata +// +//////////////////////////////////////////////////////////////// #ifndef __AVX__ #error Please specify -mavx. #endif diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h index 0f1fc5759..23dd016fa 100644 --- a/rtengine/helpersse2.h +++ b/rtengine/helpersse2.h @@ -1,3 +1,12 @@ +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author of original version: Naoki Shibata +// +// This version contains modifications made by Ingo Weyrich +// +//////////////////////////////////////////////////////////////// + #ifndef __SSE2__ #error Please specify -msse2. #endif diff --git a/rtengine/sleef.c b/rtengine/sleef.c index 2377aea79..bc38a3cfb 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -1,3 +1,12 @@ +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author of original version: Naoki Shibata +// +// This version contains modifications made by Ingo Weyrich +// +//////////////////////////////////////////////////////////////// + #ifndef _SLEEFC_ #define _SLEEFC_ diff --git a/rtengine/sleef.h b/rtengine/sleef.h deleted file mode 100644 index 101a4faff..000000000 --- a/rtengine/sleef.h +++ /dev/null @@ -1,51 +0,0 @@ -typedef struct { - double x, y; -} double2; - -typedef struct { - float x, y; -} float2; - -double xsin(double d); -double xcos(double d); -double2 xsincos(double d); -double xtan(double d); -double xasin(double s); -double xacos(double s); -double xatan(double s); -double xatan2(double y, double x); -double xlog(double d); -double xexp(double d); -double xpow(double x, double y); - -double xsinh(double x); -double xcosh(double x); -double xtanh(double x); -double xasinh(double x); -double xacosh(double x); -double xatanh(double x); -double xldexp(double x, int q); -int xilogb(double d); - -double xfma(double x, double y, double z); -double xsqrt(double d); -double xcbrt(double d); - -double xexp2(double a); -double xexp10(double a); -double xexpm1(double a); -double xlog10(double a); -double xlog1p(double a); - -float xsinf(float d); -float xcosf(float d); -float2 xsincosf(float d); -float xtanf(float d); -float xasinf(float s); -float xacosf(float s); -float xatanf(float s); -float xatan2f(float y, float x); -float xlogf(float d); -float xexpf(float d); -float xpowf(float x, float y); -float xcbrtf(float d); diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index 1b0c9a0ae..a55fcf897 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -1,3 +1,13 @@ +//////////////////////////////////////////////////////////////// +// +// this code was taken from http://shibatch.sourceforge.net/ +// Many thanks to the author of original version: Naoki Shibata +// +// This version contains modifications made by Ingo Weyrich +// +//////////////////////////////////////////////////////////////// + + #ifndef SLEEFSSEAVX #define SLEEFSSEAVX From 344d97537816e0e799087a73839e17826d43077f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Sep 2016 21:36:37 +0200 Subject: [PATCH 195/232] Removed stopwatch --- rtengine/color.cc | 6 +++--- rtengine/improcfun.cc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 66887f550..171a7efcd 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -887,7 +887,7 @@ void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat #ifdef __SSE2__ void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { - // correct gamma for black and white image : pseudo TRC curve of ICC profil + // correct gamma for black and white image : pseudo TRC curve of ICC profile vfloat rgbv = _mm_set_ps(0.f, r, r, r); // input channel is always r vfloat gammabwv = _mm_set_ps(0.f, gammabwb, gammabwg, gammabwr); vfloat c65535v = F2V(65535.f); @@ -903,7 +903,7 @@ void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gamm } void Color::trcGammaBWRow (float *r, float *g, float *b, int width, float gammabwr, float gammabwg, float gammabwb) { - // correct gamma for black and white image : pseudo TRC curve of ICC profil + // correct gamma for black and white image : pseudo TRC curve of ICC profile vfloat c65535v = F2V(65535.f); vfloat gammabwrv = F2V(gammabwr); vfloat gammabwgv = F2V(gammabwg); @@ -931,7 +931,7 @@ void Color::trcGammaBWRow (float *r, float *g, float *b, int width, float gammab #else void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb) { - // correct gamma for black and white image : pseudo TRC curve of ICC profil + // correct gamma for black and white image : pseudo TRC curve of ICC profile float in = r; // input channel is always r in /= 65535.0f; in = max(in, 0.f); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7fcee7512..3d3d9de9c 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,7 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -#define BENCHMARK +//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -4132,7 +4132,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #endif } - } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artifacts + } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artefacts for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { //rgb => xyz From 3ffe983140ecb59966a3b929f8fbb196d452c2a1 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 9 Sep 2016 21:54:51 +0200 Subject: [PATCH 196/232] Small code cleanups --- rtengine/FTblockDN.cc | 4 ++-- rtengine/improccoordinator.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 8ff22864c..6c608cfc9 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -2106,7 +2106,7 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) float ImProcFunctions::Mad(float * DataList, const int datalen) { - if(datalen <= 0) { // Avoid possible buffer underrun + if(datalen <= 1) { // Avoid possible buffer underrun return 0; } @@ -2135,7 +2135,7 @@ float ImProcFunctions::Mad(float * DataList, const int datalen) float ImProcFunctions::MadRgb(float * DataList, const int datalen) { - if(datalen <= 0) { // Avoid possible buffer underrun + if(datalen <= 1) { // Avoid possible buffer underrun return 0; } diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 776484791..0fb0041f3 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -326,12 +326,13 @@ public: return imgsrc; } - struct { + struct DenoiseInfoStore { + DenoiseInfoStore () : valid(false) {} float chM; float max_r[9]; float max_b[9]; float ch_M[9]; - bool valid = false; + bool valid; } denoiseInfoStore; From a7dc063f35580ff7430d8954f620b6666ce03d1b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 10 Sep 2016 17:58:07 +0200 Subject: [PATCH 197/232] Added Canon EOS 5D Mark IV to camconst.json, kudos to IliasG --- rtengine/camconst.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index f5a9e0118..280efc26f 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -500,6 +500,36 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, + { // Quality C, Color Matrix same as 80D (color model 13) + // White Levels not properly indicated (look same as 80D's so copied from there), aperture scaling missing, scaling factors are guessed + "make_model": "Canon EOS 5D Mark IV", + "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // 80D, DNG_V9.5 D65 + "raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533 + "masked_areas": [ 54, 4, 4534, 132 ], + "ranges": { + "white": [ + { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243 + { "iso": [ 160 ], "levels": 13000 }, // nominal 13097, + { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415 + { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150 + { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000 + ], + "white_max": 16383, + "aperture_scaling": [ + /* note: need for more data to properly fill all scale factors */ + { "aperture": 1.4, "scale_factor": 1.200 }, // guessed + { "aperture": 1.6, "scale_factor": 1.080 }, // guessed + { "aperture": 1.8, "scale_factor": 1.055 }, // guessed + { "aperture": 2.0, "scale_factor": 1.030 }, // guessed + { "aperture": 2.2, "scale_factor": 1.025 }, // guessed + { "aperture": 2.5, "scale_factor": 1.020 }, // guessed + { "aperture": 2.8, "scale_factor": 1.000 }, // + { "aperture": 3.2, "scale_factor": 1.000 }, // + { "aperture": 3.5, "scale_factor": 1.000 } // + ] + } + }, + { // Quality C, intermediate ISO samples missing but safely guessed, aperture scaling measures missing "make_model": [ "Canon EOS 5DS R", "Canon EOS 5DS" ], // "dcraw_matrix": [ 6848,-1661,-221,-3904,10931,3434,-470,1251,6039 ], // DNG_V9.0 A From 1c17be663bed1f5f3081ae9884a4c4af56d0675a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 11 Sep 2016 23:49:37 +0200 Subject: [PATCH 198/232] fixes #3425, A combination of settings in Wavelet's Edge Sharpnes tool crashes RawTherapee --- rtengine/ipwavelet.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 0f09f1ddd..93e4da318 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2753,13 +2753,13 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (cp.reinforce == 3) { if(rad < lim0 / 60.f && level == 0) { - expkoef *= repart; //reduce effect for low values of rad and level=0==> quasi only level 1 is effective + 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) { - expkoef /= repart; //increase effect for low values of rad and level=1==> quasi only level 0 is effective + expkoef /= abs(repart); //increase effect for low values of rad and level=1==> quasi only level 0 is effective } } From 6b769fb13315fb2c55def4449ce23a929c77e2d2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 12 Sep 2016 12:54:46 +0200 Subject: [PATCH 199/232] Correction to last commit --- rtengine/ipwavelet.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 93e4da318..d5aa54890 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -2759,7 +2759,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if (cp.reinforce == 1) { if(rad < lim0 / 60.f && level == 1) { - expkoef /= abs(repart); //increase effect for low values of rad and level=1==> quasi only level 0 is effective + expkoef /= repart; //increase effect for low values of rad and level=1==> quasi only level 0 is effective } } From 298e91b1a041bd0000c38032f0379054c6ee23f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 14 Sep 2016 21:00:15 +0200 Subject: [PATCH 200/232] Fix "FocusDistance*"-EXIF for Canon (#3422) Kudos to @cm7695 for finding and fixing! --- rtexif/canonattribs.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index e013b2534..692133a4b 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -1844,8 +1844,6 @@ const TagAttrib canonShotInfoAttribs[] = { {0, AC_WRITE, 0, 0, 16, AUTO, "AutoExposureBracketing", &caAutoExposureBracketingInterpreter}, {0, AC_WRITE, 0, 0, 17, AUTO, "AEBBracketValue", &stdInterpreter}, {0, AC_WRITE, 0, 0, 18, AUTO, "ControlMode", &caControModeInterpreter}, - {0, AC_WRITE, 0, 0, 19, AUTO, "FocusDistanceUpper", &caFocusDistanceInterpreter}, - {0, AC_WRITE, 0, 0, 20, AUTO, "FocusDistanceLower", &caFocusDistanceInterpreter}, {0, AC_WRITE, 0, 0, 21, AUTO, "FNumber" , &caApertureInterpreter}, {0, AC_WRITE, 0, 0, 22, AUTO, "ExposureTime", &caExposureTimeInterpreter}, {0, AC_WRITE, 0, 0, 24, AUTO, "BulbDuration", &stdInterpreter}, @@ -1872,6 +1870,8 @@ const TagAttrib canonFileInfoAttribs[] = { {0, AC_WRITE, 0, 0, 14, AUTO, "FilterEffect" , &caFilterEffectInterpreter}, {0, AC_WRITE, 0, 0, 15, AUTO, "ToningEffect" , &caToningEffectInterpreter}, {0, AC_WRITE, 0, 0, 19, AUTO, "LiveViewShooting" , &caOnOffInterpreter}, + {0, AC_WRITE, 0, 0, 20, AUTO, "FocusDistanceUpper", &caFocusDistanceInterpreter}, + {0, AC_WRITE, 0, 0, 21, AUTO, "FocusDistanceLower", &caFocusDistanceInterpreter}, {0, AC_WRITE, 0, 0, 25, AUTO, "FlashExposureLock" , &caOnOffInterpreter}, { -1, AC_DONTWRITE, 0, 0, 0, AUTO, "", NULL}, }; From cb034284be3f33921952dd28acd6c0fa951b3e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 14 Sep 2016 21:36:44 +0200 Subject: [PATCH 201/232] Use full range in `ImageDatas::convertTo<>` (#3429) Kudos to @mmmtok for finding and fixing! --- rtengine/iimage.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 1f82ea3e6..2eded8208 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -58,10 +58,10 @@ enum TypeInterpolation { TI_Nearest, TI_Bilinear }; class ImageDatas : virtual public ImageDimensions { public: - template - void convertTo (S srcValue, D &dstValue) + template + void convertTo(S src, D& dst) const { - dstValue = static_cast(srcValue); + dst = src; } // parameters that will never be used, replaced by the subclasses r, g and b parameters! @@ -100,30 +100,30 @@ public: }; -template <> -inline void ImageDatas::convertTo (const unsigned short srcValue, unsigned char &dstValue) +template<> +inline void ImageDatas::convertTo(unsigned short src, unsigned char& dst) const { - dstValue = (unsigned char)(srcValue >> 8); + dst = src / 257; } -template <> -inline void ImageDatas::convertTo (const unsigned char srcValue, int &dstValue) +template<> +inline void ImageDatas::convertTo(unsigned char src, int& dst) const { - dstValue = (int)(srcValue) << 8; + dst = static_cast(src) * 257; } -template <> -inline void ImageDatas::convertTo (const unsigned char srcValue, unsigned short &dstValue) +template<> +inline void ImageDatas::convertTo(unsigned char src, unsigned short& dst) const { - dstValue = (unsigned short)(srcValue) << 8; + dst = static_cast(src) * 257; } -template <> -inline void ImageDatas::convertTo (const float srcValue, unsigned char &dstValue) +template<> +inline void ImageDatas::convertTo(float src, unsigned char& dst) const { - dstValue = (unsigned char)( (unsigned short)(srcValue) >> 8 ); + dst = static_cast(src) / 257; } -template <> -inline void ImageDatas::convertTo (const unsigned char srcValue, float &dstValue) +template<> +inline void ImageDatas::convertTo(unsigned char src, float& dst) const { - dstValue = float( (unsigned short)(srcValue) << 8 ); + dst = static_cast(src) * 257; } // -------------------------------------------------------------------- From 309b823f93d426367d192b2a9e5a5a03e5345b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 17 Sep 2016 17:32:46 +0200 Subject: [PATCH 202/232] Fix range in `Image*` classes (#3429) --- rtengine/image16.cc | 36 ++++++++++++++++++------------------ rtengine/image8.cc | 8 ++++---- rtengine/imagefloat.cc | 20 ++++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 937e2d19d..9d41f96c5 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -28,9 +28,9 @@ namespace void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) { for (int i = 0, ix = 0; i < width; i++) { - buffer[ix++] = red[i] >> 8; - buffer[ix++] = green[i] >> 8; - buffer[ix++] = blue[i] >> 8; + buffer[ix++] = red[i] / 257; + buffer[ix++] = green[i] / 257; + buffer[ix++] = blue[i] / 257; } } @@ -92,10 +92,10 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa case (IIOSF_UNSIGNED_CHAR): { int ix = 0; - for (int i = 0; i < width; i++) { - r(row, i) = (unsigned short)(buffer[ix++]) << 8; - g(row, i) = (unsigned short)(buffer[ix++]) << 8; - b(row, i) = (unsigned short)(buffer[ix++]) << 8; + for (int i = 0; i < width; ++i) { + r(row, i) = static_cast(buffer[ix++]) * 257; + g(row, i) = static_cast(buffer[ix++]) * 257; + b(row, i) = static_cast(buffer[ix++]) * 257; } break; @@ -105,7 +105,7 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa unsigned short* sbuffer = (unsigned short*) buffer; int ix = 0; - for (int i = 0; i < width; i++) { + for (int i = 0; i < width; ++i) { r(row, i) = sbuffer[ix++]; g(row, i) = sbuffer[ix++]; b(row, i) = sbuffer[ix++]; @@ -298,11 +298,11 @@ Image16::to8() { Image8* img8 = new Image8(width, height); - for ( int h = 0; h < height; ++h ) { - for ( int w = 0; w < width; ++w ) { - img8->r(h, w) = (unsigned char)( r(h, w) >> 8); - img8->g(h, w) = (unsigned char)( g(h, w) >> 8); - img8->b(h, w) = (unsigned char)( b(h, w) >> 8); + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + img8->r(h, w) = r(h, w) / 257; + img8->g(h, w) = g(h, w) / 257; + img8->b(h, w) = b(h, w) / 257; } } @@ -314,11 +314,11 @@ Image16::tofloat() { Imagefloat* imgfloat = new Imagefloat(width, height); - for ( int h = 0; h < height; ++h ) { - for ( int w = 0; w < width; ++w ) { - imgfloat->r(h, w) = (float)r(h, w); - imgfloat->g(h, w) = (float)g(h, w); - imgfloat->b(h, w) = (float)b(h, w); + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + imgfloat->r(h, w) = r(h, w); + imgfloat->g(h, w) = g(h, w); + imgfloat->b(h, w) = b(h, w); } } diff --git a/rtengine/image8.cc b/rtengine/image8.cc index b27851a76..1cc648eb5 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -49,8 +49,8 @@ void Image8::getScanline (int row, unsigned char* buffer, int bps) } else if (bps == 16) { unsigned short* sbuffer = (unsigned short*) buffer; - for (int i = 0, ix = row * width * 3; i < width * 3; i++, ix++) { - sbuffer[i] = (unsigned short)(data[ix]) << 8; + for (int i = 0, ix = row * width * 3; i < width * 3; ++i, ++ix) { + sbuffer[i] = static_cast(data[ix]) * 257; } } } @@ -73,8 +73,8 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minVal case (IIOSF_UNSIGNED_SHORT): { unsigned short* sbuffer = (unsigned short*) buffer; - for (int i = 0, ix = row * width * 3; i < width * 3; i++, ix++) { - data[ix] = sbuffer[i] >> 8; + for (int i = 0, ix = row * width * 3; i < width * 3; ++i, ++ix) { + data[ix] = sbuffer[i] / 257; } break; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 26ea8ae6e..fb4ccae2e 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -333,11 +333,11 @@ Imagefloat::to8() #pragma omp parallel for schedule(static) #endif - for ( int h = 0; h < height; ++h ) { - for ( int w = 0; w < width; ++w ) { - img8->r(h, w) = (unsigned char)( (unsigned short)(r(h, w)) >> 8); - img8->g(h, w) = (unsigned char)( (unsigned short)(g(h, w)) >> 8); - img8->b(h, w) = (unsigned char)( (unsigned short)(b(h, w)) >> 8); + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + img8->r(h, w) = static_cast(r(h, w)) / 257; + img8->g(h, w) = static_cast(g(h, w)) / 257; + img8->b(h, w) = static_cast(b(h, w)) / 257; } } @@ -352,11 +352,11 @@ Imagefloat::to16() #pragma omp parallel for schedule(static) #endif - for ( int h = 0; h < height; ++h ) { - for ( int w = 0; w < width; ++w ) { - img16->r( h, w) = (unsigned short)(r(h, w)); - img16->g( h, w) = (unsigned short)(g(h, w)); - img16->b( h, w) = (unsigned short)(b(h, w)); + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + img16->r(h, w) = r(h, w); + img16->g(h, w) = g(h, w); + img16->b(h, w) = b(h, w); } } From c67b986744d21b803de17dba71f1d82d6bc38a7e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 21 Sep 2016 00:22:42 +0200 Subject: [PATCH 203/232] add faster implementation to clip float to [0;65535] and round --- rtengine/rt_math.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 0836c8be7..b5c93d127 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -80,7 +80,7 @@ inline _Tp intp(_Tp a, _Tp b, _Tp c) // following is valid: // intp(a, b+x, c+x) = intp(a, b, c) + x // intp(a, b*x, c*x) = intp(a, b, c) * x - return a * (b-c) + c; + return a * (b - c) + c; } template @@ -101,5 +101,17 @@ inline T norminf(const T& x, const T& y) return std::max(std::abs(x), std::abs(y)); } -} +inline int float2uint16range(float d) // clips input to [0;65535] and rounds +{ + d = CLIP(d); // clip to [0;65535] +#ifdef __SSE2__ // this only works in IEEE 754 maths. For simplicity I restricted it to SSE2. We can enhance it later, but we have to take care of endianness then. + d += 12582912.f; + return reinterpret_cast(d); +#else // fall back to slow std::round() + return std::round(d); +#endif +} + +} + #endif From f17011cec400b0730a8f9ead26069ddb1390bd82 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 21 Sep 2016 00:24:44 +0200 Subject: [PATCH 204/232] use faster implementation to clip float to [0;65535] and round in rtengine::lab2rgb16b and rtengine::lab2rgb16 --- rtengine/iplab2rgb.cc | 45 +++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 489ca60bc..d37ba362d 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -26,6 +26,19 @@ #include "curves.h" #include "alignedbuffer.h" #include "color.h" +#define BENCHMARK +#include "StopWatch.h" + +namespace +{ + +int float2intx(float d) +{ + d += 12582912.f; + return reinterpret_cast(d); +} +} + namespace rtengine { @@ -241,8 +254,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, // for default (not gamma) Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, RenderingIntent intent, bool bw) { - - //gamutmap(lab); + BENCHFUN if (cx < 0) { cx = 0; @@ -279,7 +291,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int for (int j = cx; j < cx + cw; j++) { float fy = (0.0086206897f * rL[j]) / 327.68f + 0.1379310345f; // (L+16)/116 - float fx = (0.002 * ra[j]) / 327.68f + fy; + float fx = (0.002f * ra[j]) / 327.68f + fy; float fz = fy - (0.005f * rb[j]) / 327.68f; float LL = rL[j] / 327.68f; @@ -288,15 +300,14 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int float z_ = 65535.0f * (float) Color::f2xyz(fz) * Color::D50z; float y_ = (LL > Color::epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / Color::kappa; - xa[j - cx] = CLIP((int) round(x_)); - ya[j - cx] = CLIP((int) round(y_)); - za[j - cx] = CLIP((int) round(z_)); + xa[j - cx] = float2uint16range(x_); + ya[j - cx] = float2uint16range(y_); + za[j - cx] = float2uint16range(z_); if(bw && y_ < 65535.f ) { //force Bw value and take highlight into account - xa[j - cx] = (int) round(y_ * Color::D50x ); - za[j - cx] = (int) round(y_ * Color::D50z); + xa[j - cx] = float2uint16range(y_ * Color::D50x); + za[j - cx] = float2uint16range(y_ * Color::D50z); } - } } @@ -345,7 +356,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int // for gamma options (BT709...sRGB linear...) Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, RenderingIntent intent, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6, bool bw) { - +BENCHFUN //gamutmap(lab); if (cx < 0) { @@ -539,7 +550,7 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int // 7 parameters for smoother curves cmsWhitePointFromTemp(&xyD, t50); GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, 5, Parameters);//5 = more smoother than 4 - cmsHPROFILE oprofdef = cmsCreateRGBProfileTHR(NULL, &xyD, &Primaries, GammaTRC); //oprofdef become Outputprofile + cmsHPROFILE oprofdef = cmsCreateRGBProfileTHR(NULL, &xyD, &Primaries, GammaTRC); //oprofdef becomes Outputprofile cmsFreeToneCurve(GammaTRC[0]); @@ -567,13 +578,13 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int float z_ = 65535.0f * (float)Color::f2xyz(fz) * Color::D50z; float y_ = (LL > Color::epskap) ? (float) 65535.0 * fy * fy * fy : 65535.0f * LL / Color::kappa; - xa[j - cx] = CLIP((int) round(x_)) ; - ya[j - cx] = CLIP((int) round(y_)); - za[j - cx] = CLIP((int) round(z_)); + xa[j - cx] = float2uint16range(x_); + ya[j - cx] = float2uint16range(y_); + za[j - cx] = float2uint16range(z_); if(bw && y_ < 65535.f) { //force Bw value and take highlight into account - xa[j - cx] = (int) round(y_ * Color::D50x); - za[j - cx] = (int) round(y_ * Color::D50z); + xa[j - cx] = float2uint16range(y_ * Color::D50x); + za[j - cx] = float2uint16range(y_ * Color::D50z); } } @@ -581,7 +592,7 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprofdef, TYPE_RGB_16, intent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprofdef, TYPE_RGB_16, intent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); lcmsMutex->unlock (); image->ExecCMSTransform(hTransform); From 29c4d936aa3c7f4801fadc1d15e45c15e7a7e5ba Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 21 Sep 2016 00:35:02 +0200 Subject: [PATCH 205/232] cleaned code --- rtengine/iplab2rgb.cc | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index d37ba362d..c5eeb1a2a 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -29,17 +29,6 @@ #define BENCHMARK #include "StopWatch.h" -namespace -{ - -int float2intx(float d) -{ - d += 12582912.f; - return reinterpret_cast(d); -} -} - - namespace rtengine { From ab2be87333407451ae090f6bc3f86b6910ea0056 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 21 Sep 2016 14:05:30 +0200 Subject: [PATCH 206/232] Simplified float2uint16range(..), removed StopWatches --- rtengine/iplab2rgb.cc | 26 +++++++++----------------- rtengine/rt_math.h | 7 +------ 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index c5eeb1a2a..576af00c3 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -26,8 +26,6 @@ #include "curves.h" #include "alignedbuffer.h" #include "color.h" -#define BENCHMARK -#include "StopWatch.h" namespace rtengine { @@ -79,9 +77,7 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) cmsDoTransform (monitorTransform, buffer, data + ix, W); } } - } // End of parallelization - } else { int W = lab->W; @@ -129,7 +125,6 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, RenderingIntent intent, bool standard_gamma) { - //gamutmap(lab); if (cx < 0) { cx = 0; @@ -243,7 +238,6 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, // for default (not gamma) Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, RenderingIntent intent, bool bw) { - BENCHFUN if (cx < 0) { cx = 0; @@ -264,10 +258,10 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int Image16* image = new Image16 (cw, ch); cmsHPROFILE oprof = iccStore->getProfile (profile); - - if (oprof) { +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int i = cy; i < cy + ch; i++) { float* rL = lab->L[i]; @@ -309,7 +303,9 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int cmsDeleteTransform(hTransform); } else { +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int i = cy; i < cy + ch; i++) { float R, G, B; @@ -345,8 +341,6 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int // for gamma options (BT709...sRGB linear...) Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, RenderingIntent intent, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6, bool bw) { -BENCHFUN - //gamutmap(lab); if (cx < 0) { cx = 0; @@ -506,13 +500,11 @@ BENCHFUN Color::calcGamma(pwr, ts, mode, imax, g_a0, g_a1, g_a2, g_a3, g_a4, g_a5); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 ga4 = g_a3 * ts; - //printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); ga0 = gampos; ga1 = 1. / (1.0 + g_a4); ga2 = g_a4 / (1.0 + g_a4); ga3 = 1. / slpos; ga5 = 0.0; - //printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0,ga1,ga2,ga3,ga4); } @@ -543,9 +535,10 @@ BENCHFUN cmsFreeToneCurve(GammaTRC[0]); - if (oprofdef) { +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int i = cy; i < cy + ch; i++) { float* rL = lab->L[i]; @@ -575,7 +568,6 @@ BENCHFUN xa[j - cx] = float2uint16range(y_ * Color::D50x); za[j - cx] = float2uint16range(y_ * Color::D50z); } - } } @@ -587,8 +579,10 @@ BENCHFUN image->ExecCMSTransform(hTransform); cmsDeleteTransform(hTransform); } else { - // +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif + for (int i = cy; i < cy + ch; i++) { float R, G, B; float* rL = lab->L[i]; @@ -619,6 +613,4 @@ BENCHFUN return image; } -//#include "sRGBgamutbdy.cc" - } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index b5c93d127..f55f7c1b2 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -104,12 +104,7 @@ inline T norminf(const T& x, const T& y) inline int float2uint16range(float d) // clips input to [0;65535] and rounds { d = CLIP(d); // clip to [0;65535] -#ifdef __SSE2__ // this only works in IEEE 754 maths. For simplicity I restricted it to SSE2. We can enhance it later, but we have to take care of endianness then. - d += 12582912.f; - return reinterpret_cast(d); -#else // fall back to slow std::round() - return std::round(d); -#endif + return d + 0.5f; } } From 1e268105dbcb3d8653166907cb87589b87839a89 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 21 Sep 2016 21:01:51 +0200 Subject: [PATCH 207/232] replaced code to convert from Lab to XYZ by calling Color::Lab2XYZ(..) --- rtengine/iplab2rgb.cc | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 576af00c3..c12e3463e 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -272,16 +272,8 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int short* za = (short*)image->b(i - cy); for (int j = cx; j < cx + cw; j++) { - - float fy = (0.0086206897f * rL[j]) / 327.68f + 0.1379310345f; // (L+16)/116 - float fx = (0.002f * ra[j]) / 327.68f + fy; - float fz = fy - (0.005f * rb[j]) / 327.68f; - float LL = rL[j] / 327.68f; - - float x_ = 65535.0f * (float) Color::f2xyz(fx) * Color::D50x; - //float y_ = 65535.0 * Color::f2xyz(fy); - float z_ = 65535.0f * (float) Color::f2xyz(fz) * Color::D50z; - float y_ = (LL > Color::epskap) ? 65535.0f * fy * fy * fy : 65535.0f * LL / Color::kappa; + float x_, y_, z_; + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_); xa[j - cx] = float2uint16range(x_); ya[j - cx] = float2uint16range(y_); @@ -549,16 +541,8 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int short* za = (short*)image->b(i - cy); for (int j = cx; j < cx + cw; j++) { - - float fy = (0.0086206897f * rL[j]) / 327.68f + 0.1379310345f; // (L+16)/116 - float fx = (0.002f * ra[j]) / 327.68f + fy; - float fz = fy - (0.005f * rb[j]) / 327.68f; - float LL = rL[j] / 327.68f; - - float x_ = 65535.0f * (float)Color::f2xyz(fx) * Color::D50x; - // float y_ = 65535.0 * Color::f2xyz(fy); - float z_ = 65535.0f * (float)Color::f2xyz(fz) * Color::D50z; - float y_ = (LL > Color::epskap) ? (float) 65535.0 * fy * fy * fy : 65535.0f * LL / Color::kappa; + float x_, y_, z_; + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_); xa[j - cx] = float2uint16range(x_); ya[j - cx] = float2uint16range(y_); From 540e95a0634f646c8d8110de56724a3cde8eb363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 21 Sep 2016 21:16:24 +0200 Subject: [PATCH 208/232] Fix "MeasuredEV2" (#3422) Kudos to @cm7695! --- rtexif/canonattribs.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 692133a4b..bd14c6514 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -1846,8 +1846,8 @@ const TagAttrib canonShotInfoAttribs[] = { {0, AC_WRITE, 0, 0, 18, AUTO, "ControlMode", &caControModeInterpreter}, {0, AC_WRITE, 0, 0, 21, AUTO, "FNumber" , &caApertureInterpreter}, {0, AC_WRITE, 0, 0, 22, AUTO, "ExposureTime", &caExposureTimeInterpreter}, + {0, AC_WRITE, 0, 0, 23, AUTO, "MeasuredEV2", &caMeasuredEVInterpreter}, {0, AC_WRITE, 0, 0, 24, AUTO, "BulbDuration", &stdInterpreter}, - {0, AC_WRITE, 0, 0, 24, AUTO, "MeasuredEV2", &caMeasuredEVInterpreter}, {0, AC_WRITE, 0, 0, 26, AUTO, "CameraType", &caCameraTypeInterpreter}, {0, AC_WRITE, 0, 0, 27, AUTO, "AutoRotate", &caAutoRotateInterpreter}, {0, AC_WRITE, 0, 0, 28, AUTO, "NDFilter", &caOnOffInterpreter}, From 1e7b8035c41196b0585b2c1c103761d71083e19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 21 Sep 2016 21:54:46 +0200 Subject: [PATCH 209/232] Round when converting to 8 bits (#3429) --- rtengine/iimage.h | 10 +++++----- rtengine/image16.cc | 12 ++++++------ rtengine/image8.cc | 2 +- rtengine/imagefloat.cc | 6 +++--- rtengine/iplab2rgb.cc | 12 ++++++------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 2eded8208..4362f369a 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -103,27 +103,27 @@ public: template<> inline void ImageDatas::convertTo(unsigned short src, unsigned char& dst) const { - dst = src / 257; + dst = (src + 128) / 257; } template<> inline void ImageDatas::convertTo(unsigned char src, int& dst) const { - dst = static_cast(src) * 257; + dst = src * 257; } template<> inline void ImageDatas::convertTo(unsigned char src, unsigned short& dst) const { - dst = static_cast(src) * 257; + dst = src * 257; } template<> inline void ImageDatas::convertTo(float src, unsigned char& dst) const { - dst = static_cast(src) / 257; + dst = (static_cast(src) + 128) / 257; } template<> inline void ImageDatas::convertTo(unsigned char src, float& dst) const { - dst = static_cast(src) * 257; + dst = src * 257; } // -------------------------------------------------------------------- diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 9d41f96c5..11a05902f 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -28,9 +28,9 @@ namespace void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) { for (int i = 0, ix = 0; i < width; i++) { - buffer[ix++] = red[i] / 257; - buffer[ix++] = green[i] / 257; - buffer[ix++] = blue[i] / 257; + buffer[ix++] = (red[i] + 128) / 257; + buffer[ix++] = (green[i] + 128) / 257; + buffer[ix++] = (blue[i] + 128) / 257; } } @@ -300,9 +300,9 @@ Image16::to8() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img8->r(h, w) = r(h, w) / 257; - img8->g(h, w) = g(h, w) / 257; - img8->b(h, w) = b(h, w) / 257; + img8->r(h, w) = (r(h, w) + 128) / 257; + img8->g(h, w) = (g(h, w) + 128) / 257; + img8->b(h, w) = (b(h, w) + 128) / 257; } } diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 1cc648eb5..41589993d 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -74,7 +74,7 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minVal unsigned short* sbuffer = (unsigned short*) buffer; for (int i = 0, ix = row * width * 3; i < width * 3; ++i, ++ix) { - data[ix] = sbuffer[i] / 257; + data[ix] = (sbuffer[i] + 128) / 257; } break; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index fb4ccae2e..7f84f1cab 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -335,9 +335,9 @@ Imagefloat::to8() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img8->r(h, w) = static_cast(r(h, w)) / 257; - img8->g(h, w) = static_cast(g(h, w)) / 257; - img8->b(h, w) = static_cast(b(h, w)) / 257; + img8->r(h, w) = (static_cast(r(h, w)) + 128) / 257; + img8->g(h, w) = (static_cast(g(h, w)) + 128) / 257; + img8->b(h, w) = (static_cast(b(h, w)) + 128) / 257; } } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 489ca60bc..843bdaa9c 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -117,9 +117,9 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) /* copy RGB */ //int R1=((int)gamma2curve[(R)]) - data[ix++] = ((int)Color::gamma2curve[R]) >> 8; - data[ix++] = ((int)Color::gamma2curve[G]) >> 8; - data[ix++] = ((int)Color::gamma2curve[B]) >> 8; + data[ix++] = (static_cast(Color::gamma2curve[R]) + 128) / 257; + data[ix++] = (static_cast(Color::gamma2curve[G]) + 128) / 257; + data[ix++] = (static_cast(Color::gamma2curve[B]) + 128) / 257; } } } @@ -229,9 +229,9 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Color::xyz2rgb(x_, y_, z_, R, G, B, xyz_rgb); - image->data[ix++] = (int)Color::gamma2curve[R] >> 8; - image->data[ix++] = (int)Color::gamma2curve[G] >> 8; - image->data[ix++] = (int)Color::gamma2curve[B] >> 8; + image->data[ix++] = (static_cast(Color::gamma2curve[R]) + 128) / 257; + image->data[ix++] = (static_cast(Color::gamma2curve[G]) + 128) / 257; + image->data[ix++] = (static_cast(Color::gamma2curve[B]) + 128) / 257; } } } From 76355590628322f5484f8085e6370cecbac2eb63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 22 Sep 2016 21:22:35 +0200 Subject: [PATCH 210/232] Add Ingo's missing optimization (#3432) --- rtengine/iplab2rgb.cc | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 9a3e710e7..419854523 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -101,15 +101,7 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) //float L1=rL[j],a1=ra[j],b1=rb[j];//for testing - fy = (0.00862069 * rL[j]) / 327.68 + 0.137932; // (L+16)/116 - fx = (0.002 * ra[j]) / 327.68 + fy; - fz = fy - (0.005 * rb[j]) / 327.68; - LL = rL[j] / 327.68; - - x_ = 65535.0 * Color::f2xyz(fx) * Color::D50x; - // y_ = 65535.0 * Color::f2xyz(fy); - z_ = 65535.0 * Color::f2xyz(fz) * Color::D50z; - y_ = (LL > Color::epskap) ? 65535.0 * fy * fy * fy : 65535.0 * LL / Color::kappa; + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); Color::xyz2srgb(x_, y_, z_, R, G, B); From 759676788b186a25fa5c6ebd287b94da62d4b6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 22 Sep 2016 21:52:07 +0200 Subject: [PATCH 211/232] Use BABL method for 16-to-8 bit conversion (#3429) --- rtengine/iimage.h | 4 ++-- rtengine/image16.cc | 12 ++++++------ rtengine/image8.cc | 2 +- rtengine/imagefloat.cc | 6 +++--- rtengine/iplab2rgb.cc | 12 ++++++------ rtengine/rt_math.h | 20 ++++++++++++-------- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/rtengine/iimage.h b/rtengine/iimage.h index 4362f369a..cd49c1329 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -103,7 +103,7 @@ public: template<> inline void ImageDatas::convertTo(unsigned short src, unsigned char& dst) const { - dst = (src + 128) / 257; + dst = uint16ToUint8Rounded(src); } template<> inline void ImageDatas::convertTo(unsigned char src, int& dst) const @@ -118,7 +118,7 @@ inline void ImageDatas::convertTo(unsigned char src, unsigned short& dst) const template<> inline void ImageDatas::convertTo(float src, unsigned char& dst) const { - dst = (static_cast(src) + 128) / 257; + dst = uint16ToUint8Rounded(src); } template<> inline void ImageDatas::convertTo(unsigned char src, float& dst) const diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 11a05902f..b61170e03 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -28,9 +28,9 @@ namespace void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) { for (int i = 0, ix = 0; i < width; i++) { - buffer[ix++] = (red[i] + 128) / 257; - buffer[ix++] = (green[i] + 128) / 257; - buffer[ix++] = (blue[i] + 128) / 257; + buffer[ix++] = rtengine::uint16ToUint8Rounded(red[i]); + buffer[ix++] = rtengine::uint16ToUint8Rounded(green[i]); + buffer[ix++] = rtengine::uint16ToUint8Rounded(blue[i]); } } @@ -300,9 +300,9 @@ Image16::to8() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img8->r(h, w) = (r(h, w) + 128) / 257; - img8->g(h, w) = (g(h, w) + 128) / 257; - img8->b(h, w) = (b(h, w) + 128) / 257; + img8->r(h, w) = uint16ToUint8Rounded(r(h, w)); + img8->g(h, w) = uint16ToUint8Rounded(g(h, w)); + img8->b(h, w) = uint16ToUint8Rounded(b(h, w)); } } diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 41589993d..d7a49138b 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -74,7 +74,7 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minVal unsigned short* sbuffer = (unsigned short*) buffer; for (int i = 0, ix = row * width * 3; i < width * 3; ++i, ++ix) { - data[ix] = (sbuffer[i] + 128) / 257; + data[ix] = uint16ToUint8Rounded(sbuffer[i]); } break; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 7f84f1cab..ae4a1a09b 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -335,9 +335,9 @@ Imagefloat::to8() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img8->r(h, w) = (static_cast(r(h, w)) + 128) / 257; - img8->g(h, w) = (static_cast(g(h, w)) + 128) / 257; - img8->b(h, w) = (static_cast(b(h, w)) + 128) / 257; + img8->r(h, w) = uint16ToUint8Rounded(r(h, w)); + img8->g(h, w) = uint16ToUint8Rounded(g(h, w)); + img8->b(h, w) = uint16ToUint8Rounded(b(h, w)); } } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 419854523..8aff50886 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -107,9 +107,9 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) /* copy RGB */ //int R1=((int)gamma2curve[(R)]) - data[ix++] = (static_cast(Color::gamma2curve[R]) + 128) / 257; - data[ix++] = (static_cast(Color::gamma2curve[G]) + 128) / 257; - data[ix++] = (static_cast(Color::gamma2curve[B]) + 128) / 257; + data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); + data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); + data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); } } } @@ -218,9 +218,9 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Color::xyz2rgb(x_, y_, z_, R, G, B, xyz_rgb); - image->data[ix++] = (static_cast(Color::gamma2curve[R]) + 128) / 257; - image->data[ix++] = (static_cast(Color::gamma2curve[G]) + 128) / 257; - image->data[ix++] = (static_cast(Color::gamma2curve[B]) + 128) / 257; + image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); + image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); + image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); } } } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index f55f7c1b2..67d883080 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -1,14 +1,15 @@ -#ifndef _MYMATH_ -#define _MYMATH_ -#include -#include +#pragma once +#include +#include +#include namespace rtengine { -static const int MAXVAL = 0xffff; -static const float MAXVALF = float(MAXVAL); // float version of MAXVAL -static const double MAXVALD = double(MAXVAL); // double version of MAXVAL + +constexpr int MAXVAL = 0xffff; +constexpr float MAXVALF = static_cast(MAXVAL); // float version of MAXVAL +constexpr double MAXVALD = static_cast(MAXVAL); // double version of MAXVAL template inline _Tp SQR (_Tp x) @@ -107,6 +108,9 @@ inline int float2uint16range(float d) // clips input to [0;65535] and rounds return d + 0.5f; } +constexpr std::uint8_t uint16ToUint8Rounded(std::uint16_t i) +{ + return ((i + 128) - ((i + 128) >> 8)) >> 8; } -#endif +} From b32ace88a99800605bcf35da0e2874810447baef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 22 Sep 2016 22:00:05 +0200 Subject: [PATCH 212/232] Fix `Tag::toString()` for `LONG` type (#3422) --- rtexif/rtexif.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index dd49ab23d..91f52ce55 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1553,11 +1553,11 @@ void Tag::toString (char* buffer, int ofs) break; case SLONG: - sprintf (b, "%ld", (long)toInt(4 * i + ofs)); + sprintf (b, "%d", toInt(4 * i + ofs)); break; case LONG: - sprintf (b, "%lu", (unsigned long)toInt(4 * i + ofs)); + sprintf (b, "%u", toInt(4 * i + ofs)); break; case SRATIONAL: From a5af13228d57af4a088889cac9f1098f267006ed Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sat, 24 Sep 2016 13:57:28 +0200 Subject: [PATCH 213/232] camconst.json updated by IliasG, closes #3298 --- rtengine/camconst.json | 54 +++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 280efc26f..bba957405 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -500,32 +500,34 @@ Quality X: unknown, ie we knowing to little about the camera properties to know } }, - { // Quality C, Color Matrix same as 80D (color model 13) - // White Levels not properly indicated (look same as 80D's so copied from there), aperture scaling missing, scaling factors are guessed + { // Quality B, some intermediate ISO samples missing, LENR samples missing + // so White Levels not properly indicated, some aperture scaling missing "make_model": "Canon EOS 5D Mark IV", - "dcraw_matrix": [ 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 ], // 80D, DNG_V9.5 D65 + "dcraw_matrix": [ 6446,-366,-864,-4436,12204,2513,-952,2496,6348 ], // DNG_V9.7 D65 "raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533 "masked_areas": [ 54, 4, 4534, 132 ], "ranges": { "white": [ - { "iso": [ 100, 125, 200, 250 ], "levels": 16200 }, // nominal 16383, LENR blue 16243 - { "iso": [ 160 ], "levels": 13000 }, // nominal 13097, - { "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 13200 }, // G1,G2 13415 - { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16150 }, // nominal 16383, LENR ISO3200 16150 - { "iso": [ 6400, 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243, LENR B 16000 + { "iso": [ 100, 125, 200, 250 ], "levels": 16100 }, // nominal 16383, LENR? + { "iso": [ 160 ], "levels": 13000 }, // nominal f8-13105 + { "iso": [ 320, 640, 1250, 2500 ], "levels": 13300 }, // G1,G2 F4.0-13422-F2.8-13562-13616 + { "iso": [ 5000, 10000, 20000 ], "levels": 13200 }, // G1,G2 F4.0-13422-F2.8-13562-13616 + { "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16100 }, // nominal 16383, + { "iso": [ 6400, 8000, 12800, 16000, 25600, 32000 ], "levels": 16000 }, // R,G1,G2 16383, LENR? + { "iso": [ 40000, 51200, 102400 ], "levels": 15800 } // 16383, LENR? ], "white_max": 16383, "aperture_scaling": [ /* note: need for more data to properly fill all scale factors */ - { "aperture": 1.4, "scale_factor": 1.200 }, // guessed - { "aperture": 1.6, "scale_factor": 1.080 }, // guessed - { "aperture": 1.8, "scale_factor": 1.055 }, // guessed - { "aperture": 2.0, "scale_factor": 1.030 }, // guessed - { "aperture": 2.2, "scale_factor": 1.025 }, // guessed - { "aperture": 2.5, "scale_factor": 1.020 }, // guessed - { "aperture": 2.8, "scale_factor": 1.000 }, // - { "aperture": 3.2, "scale_factor": 1.000 }, // - { "aperture": 3.5, "scale_factor": 1.000 } // + { "aperture": 1.4, "scale_factor": 1.130 }, // + { "aperture": 1.6, "scale_factor": 1.100 }, // + { "aperture": 1.8, "scale_factor": 1.070 }, // + { "aperture": 2.0, "scale_factor": 1.050 }, // 14171/13422=1.055 + { "aperture": 2.2, "scale_factor": 1.035 }, // 13954/13422=1.039 + { "aperture": 2.5, "scale_factor": 1.025 }, // 11400/11000=1.028 + { "aperture": 2.8, "scale_factor": 1.015 }, // 13562/13422 - 13731,13688,13562 + { "aperture": 3.2, "scale_factor": 1.010 }, // + { "aperture": 3.5, "scale_factor": 1.005 } // 13508/13422 ] } }, @@ -1287,6 +1289,12 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 0, "white": 16300 } // WL typical 16383 set to 16300 for safety }, + { // Quality B + "make_model": "Nikon D3400", + "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v9.7 d65 + "ranges": { "white": 16300 } // WL value is for 14-bit files, RT auto adapts it for 12-bit files. WL typical 16383 set to 16300 for safety + }, + { // Quality B "make_model": "Nikon D5300", "dcraw_matrix": [ 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 ], // adobe dng_v8.8 d65 @@ -1671,6 +1679,18 @@ Quality X: unknown, ie we knowing to little about the camera properties to know { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 ] } + }, + { // Quality B, Same as Panasonic G7 + "make_model": [ "Panasonic DMC-G8", "Panasonic DMC-G80", "Panasonic DMC-G81", "Panasonic DMC-G85" ], + "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ],// DNG_v9.7 D65 + "ranges": { + "black": 16, // 16 is BL offset. Dcraw/RT read the base black from exif and calculates total BL = BLbase+BLoffset + "white": [ + { "iso": 100, "levels": 2300 }, // gaussian 2300-2700 exif_linearitylimit 2111 + { "iso": 125, "levels": 3180 }, // gaussian 3200-3600 exif_linearitylimit 2626 + { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } }, { // Quality B, "make_model": "Panasonic DMC-GX8", From 4076e1d5aada5d74d52f6c21fe93e08cd54600a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 26 Sep 2016 21:16:20 +0200 Subject: [PATCH 214/232] Add Ingo's optimization in another place, too (#3432) --- rtengine/iplab2rgb.cc | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 8aff50886..4c2da72a4 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -88,16 +88,16 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int i = 0; i < H; i++) { + for (int i = 0; i < H; ++i) { float* rL = lab->L[i]; float* ra = lab->a[i]; float* rb = lab->b[i]; int ix = i * 3 * W; float R, G, B; - float fy, fx, fz, x_, y_, z_, LL; + float x_, y_, z_; - for (int j = 0; j < W; j++) { + for (int j = 0; j < W; ++j) { //float L1=rL[j],a1=ra[j],b1=rb[j];//for testing @@ -197,24 +197,17 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, #pragma omp parallel for schedule(dynamic,16) if (multiThread) #endif - for (int i = cy; i < cy + ch; i++) { - float R, G, B; + for (int i = cy; i < cy + ch; ++i) { float* rL = lab->L[i]; float* ra = lab->a[i]; float* rb = lab->b[i]; int ix = 3 * i * cw; - for (int j = cx; j < cx + cw; j++) { + float R, G, B; + float x_, y_, z_; - float fy = (0.00862069 * rL[j]) / 327.68 + 0.137932; // (L+16)/116 - float fx = (0.002 * ra[j]) / 327.68 + fy; - float fz = fy - (0.005 * rb[j]) / 327.68; - float LL = rL[j] / 327.68; - - float x_ = 65535.0 * Color::f2xyz(fx) * Color::D50x; - //float y_ = 65535.0 * Color::f2xyz(fy); - float z_ = 65535.0 * Color::f2xyz(fz) * Color::D50z; - float y_ = (LL > Color::epskap) ? 65535.0 * fy * fy * fy : 65535.0 * LL / Color::kappa; + for (int j = cx; j < cx + cw; ++j) { + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_); Color::xyz2rgb(x_, y_, z_, R, G, B, xyz_rgb); From d8be9933e2a100eca98d2076c330ed8982c792c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 26 Sep 2016 21:31:46 +0200 Subject: [PATCH 215/232] Fix "-Wignored-attributes" with vector arguments in `rtengine/median.h` See [GCC bug 69884](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69884). --- rtengine/median.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/median.h b/rtengine/median.h index c2ef5fd27..d3cd8c826 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -24,6 +24,10 @@ #include "opthelper.h" +#if defined __GNUC__ && __GNUC__>=6 && defined __SSE2__ + #pragma GCC diagnostic ignored "-Wignored-attributes" +#endif + template inline T median(std::array array) { From d076223293e0cb53dfad5496c3610c318960676e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 27 Sep 2016 14:47:37 +0200 Subject: [PATCH 216/232] Added attributions in median.h --- rtengine/median.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rtengine/median.h b/rtengine/median.h index c2ef5fd27..6226d2520 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -15,6 +15,16 @@ * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . + * + * This median implementations from Floessie and Ingo Weyrich are inspired by this work: + * + * http://ndevilla.free.fr/median/median.pdf + * http://pages.ripco.net/~jgamble/nw.html + * https://github.com/hoytech/Algorithm-Networksort-Chooser + * + * Instead of using the PIX_SORT and PIX_SWAP macros we use std::min() and std::max() + * because it turned out that it generates much faster (branch free) code on machines which support SSE + * */ #pragma once From 8b94684d325389452a19f815b5ed7ffa262df468 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 27 Sep 2016 15:56:07 +0200 Subject: [PATCH 217/232] Fix Denoise - Median tooltip --- rtdata/languages/default | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 5998c585d..199258b66 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1,6 +1,6 @@ #00 default translation file #01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. -#02 Translators please append a comment with the date of translation and your name(s) as used in the RawTherapee forum or Google Code project to the top of your translation, e.g.: +#02 Translators please append a comment with the date of translation and your name(s) as used in the RawTherapee forum or GitHub Code project to the top of your translation, e.g.: #03 2525-12-24 Zager and Evans ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Credits @@ -1354,8 +1354,8 @@ TP_DEFRINGE_THRESHOLD;Threshold TP_DIRPYRDENOISE_33;3×3 strong TP_DIRPYRDENOISE_55;5×5 strong TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (slow) -TP_DIRPYRDENOISE_99;9x9 (very slow) +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9x9 TP_DIRPYRDENOISE_ABM;Chroma only TP_DIRPYRDENOISE_AUT;Automatic global TP_DIRPYRDENOISE_AUTO;Automatic global From 18c0f7ad9189ef55bfcb5ee6e23111ffef731c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 27 Sep 2016 21:16:30 +0200 Subject: [PATCH 218/232] Fix remaining Denoise - Median tooltips (#3360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also replace 'x' with '×' for uniformity. --- rtdata/languages/Catala | 4 ++-- rtdata/languages/Chinese (Simplified) | 4 ++-- rtdata/languages/Chinese (Traditional) | 4 ++-- rtdata/languages/Czech | 4 ++-- rtdata/languages/Dansk | 4 ++-- rtdata/languages/Deutsch | 10 +++++----- rtdata/languages/English (UK) | 4 ++-- rtdata/languages/English (US) | 4 ++-- rtdata/languages/Espanol | 4 ++-- rtdata/languages/Euskara | 4 ++-- rtdata/languages/Francais | 4 ++-- rtdata/languages/Greek | 4 ++-- rtdata/languages/Hebrew | 4 ++-- rtdata/languages/Italiano | 4 ++-- rtdata/languages/Japanese | 6 +++--- rtdata/languages/LICENSE | 0 rtdata/languages/Latvian | 4 ++-- rtdata/languages/Magyar | 4 ++-- rtdata/languages/Nederlands | 10 +++++----- rtdata/languages/Norsk BM | 4 ++-- rtdata/languages/Polish | 4 ++-- rtdata/languages/Polish (Latin Characters) | 4 ++-- rtdata/languages/Portugues (Brasil) | 4 ++-- rtdata/languages/Russian | 4 ++-- rtdata/languages/Serbian (Cyrilic Characters) | 4 ++-- rtdata/languages/Serbian (Latin Characters) | 4 ++-- rtdata/languages/Slovak | 4 ++-- rtdata/languages/Suomi | 4 ++-- rtdata/languages/Swedish | 4 ++-- rtdata/languages/Turkish | 4 ++-- rtdata/languages/default | 2 +- 31 files changed, 66 insertions(+), 66 deletions(-) mode change 100755 => 100644 rtdata/languages/LICENSE diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index afcb829a2..f9f393139 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1625,8 +1625,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 48b139f0f..ad1c06481 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1559,8 +1559,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 055d1f2b2..9ce592251 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -1433,8 +1433,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 4a2e3a9bd..918c87557 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1357,8 +1357,8 @@ TP_DEFRINGE_THRESHOLD;Práh TP_DIRPYRDENOISE_33;3×3 silný TP_DIRPYRDENOISE_55;5×5 silný TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (pomalý) -TP_DIRPYRDENOISE_99;9x9 (velmi pomalé) +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Pouze barevnost TP_DIRPYRDENOISE_AUT;Automatická celková TP_DIRPYRDENOISE_AUTO;Automatická celková diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index c22a60c37..772933ef5 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 1f2a579ac..f65001418 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1380,11 +1380,11 @@ TP_DARKFRAME_LABEL;Dunkelbild TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwellenwert -TP_DIRPYRDENOISE_33;3x3 stark -TP_DIRPYRDENOISE_55;5x5 stark -TP_DIRPYRDENOISE_55SOFT;5x5 -TP_DIRPYRDENOISE_77;7x7 (langsam) -TP_DIRPYRDENOISE_99;9x9 (sehr langsam) +TP_DIRPYRDENOISE_33;3×3 stark +TP_DIRPYRDENOISE_55;5×5 stark +TP_DIRPYRDENOISE_55SOFT;5×5 +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Nur Farbe TP_DIRPYRDENOISE_AUT;Automatisch Global TP_DIRPYRDENOISE_AUTO;Automatisch Global diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 2f97b36d1..20966492f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1389,8 +1389,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index f7a82441c..5b3578336 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1355,8 +1355,8 @@ !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 215c21390..ddcc4a362 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1165,7 +1165,7 @@ TP_DEFRINGE_THRESHOLD;Umbral TP_DIRPYRDENOISE_33;3×3 fuerte TP_DIRPYRDENOISE_55;5×5 fuerte TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (lento) +TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Crominancia: Azul-Amarillo TP_DIRPYRDENOISE_CHROMA;Crominancia: Maestra TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modula la acción de eliminación de ruido 'de luminancia' @@ -1795,7 +1795,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 5a7e068d2..94bc87b4b 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index d35371458..7c3e411b4 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1298,8 +1298,8 @@ TP_DEFRINGE_THRESHOLD;Seuil TP_DIRPYRDENOISE_33;3×3 fort TP_DIRPYRDENOISE_55;5×5 fort TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (lent) -TP_DIRPYRDENOISE_99;9x9 (très lent) +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Chroma uniquement TP_DIRPYRDENOISE_AUT;Global automatique TP_DIRPYRDENOISE_AUTO;Global automatique diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 1929b0059..2f66d779f 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -1430,8 +1430,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 54396a92f..10de78b94 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 94329b411..e752f8acf 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1697,8 +1697,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 967e57e4d..8a9fdff4d 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1331,9 +1331,9 @@ TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 TP_DIRPYRDENOISE_33;強い3x3 TP_DIRPYRDENOISE_55;強い5x5 -TP_DIRPYRDENOISE_55SOFT;5x5 -TP_DIRPYRDENOISE_77;7x7(遅い) -TP_DIRPYRDENOISE_99;9x9 (非常に遅い) +TP_DIRPYRDENOISE_55SOFT;5×5 +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;色ノイズだけ TP_DIRPYRDENOISE_AUT;自動(分割方式) TP_DIRPYRDENOISE_AUTO;自動(分割方式) diff --git a/rtdata/languages/LICENSE b/rtdata/languages/LICENSE old mode 100755 new mode 100644 diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index bfbbf4d76..20fbad2f8 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 5183cb9de..fc3cdf366 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1577,8 +1577,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 88f71e101..239120a91 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1360,11 +1360,11 @@ TP_DARKFRAME_LABEL;Donkerframe TP_DEFRINGE_LABEL;Verzachten (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Straal TP_DEFRINGE_THRESHOLD;Drempel -TP_DIRPYRDENOISE_33;3x3 sterk -TP_DIRPYRDENOISE_55;5x5 sterk -TP_DIRPYRDENOISE_55SOFT;5x5 -TP_DIRPYRDENOISE_77;7x7 (langzaam) -TP_DIRPYRDENOISE_99;9x9 (erg langzaam) +TP_DIRPYRDENOISE_33;3×3 sterk +TP_DIRPYRDENOISE_55;5×5 sterk +TP_DIRPYRDENOISE_55SOFT;5×5 +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Alleen chroma TP_DIRPYRDENOISE_AUT;Automatisch algemeen TP_DIRPYRDENOISE_AUTO;Automatisch algemeen diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 222667cd5..807b9c95e 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -1430,8 +1430,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 323d6ac8a..366761246 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1120,7 +1120,7 @@ TP_DEFRINGE_THRESHOLD;Próg TP_DIRPYRDENOISE_33;3×3 silne TP_DIRPYRDENOISE_55;5×5 silne TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (wolne) +TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Chrominancja - Błękit-żółć TP_DIRPYRDENOISE_CHROMA;Chrominancja - Główna TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje działanie usuwania szumów luminancji @@ -1743,7 +1743,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 1967a9e4e..37569990e 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1120,7 +1120,7 @@ TP_DEFRINGE_THRESHOLD;Prog TP_DIRPYRDENOISE_33;3×3 silne TP_DIRPYRDENOISE_55;5×5 silne TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (wolne) +TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Chrominancja - Blekit-zolc TP_DIRPYRDENOISE_CHROMA;Chrominancja - Glowna TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje dzialanie usuwania szumow luminancji @@ -1743,7 +1743,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 06cc8b37d..a655ae6e9 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 5b9625741..969890ad6 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1691,8 +1691,8 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 73e43b15d..35d1f1749 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1823,8 +1823,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 8f64eddec..ea67134d3 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1823,8 +1823,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index a3ed2994b..422c08e3b 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1470,8 +1470,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index f7962a735..a3f79f469 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -1431,8 +1431,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index f3ba72af8..d4d5d3e10 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1243,8 +1243,8 @@ TP_DEFRINGE_THRESHOLD;Tröskelvärde TP_DIRPYRDENOISE_33;3×3 kraftig TP_DIRPYRDENOISE_55;5×5 kraftig TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 (långsam) -TP_DIRPYRDENOISE_99;9x9 (mycket långsam) +TP_DIRPYRDENOISE_77;7×7 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Endast chroma TP_DIRPYRDENOISE_AUTO_TOOLTIP;Försök att utvärdera chroma-bruset\nVar försiktig, den här beräkningen görs på genomsnittet och är tämligen subjektiv! TP_DIRPYRDENOISE_BLUE;Krominans - Blå-Gul diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index b3de5a01f..38c0a1ecf 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -1430,8 +1430,8 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DIRPYRDENOISE_33;3×3 strong !TP_DIRPYRDENOISE_55;5×5 strong !TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 (slow) -!TP_DIRPYRDENOISE_99;9x9 (very slow) +!TP_DIRPYRDENOISE_77;7×7 +!TP_DIRPYRDENOISE_99;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global diff --git a/rtdata/languages/default b/rtdata/languages/default index 199258b66..acd6c00d8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1355,7 +1355,7 @@ TP_DIRPYRDENOISE_33;3×3 strong TP_DIRPYRDENOISE_55;5×5 strong TP_DIRPYRDENOISE_55SOFT;5×5 TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9x9 +TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Chroma only TP_DIRPYRDENOISE_AUT;Automatic global TP_DIRPYRDENOISE_AUTO;Automatic global From 7d21cbfaa6956fb03198966712366cf00e8eea1b Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 27 Sep 2016 23:13:55 +0200 Subject: [PATCH 219/232] Reworked Median (NR) wording, updated RawPedia accordingly. --- rtdata/languages/default | 18 +++++++++--------- rtgui/dirpyrdenoise.cc | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index acd6c00d8..af23e7d12 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1,6 +1,6 @@ #00 default translation file #01 Developers should add translations to this file and then run the 'generateTranslationDiffs' Bash script to update other locales. -#02 Translators please append a comment with the date of translation and your name(s) as used in the RawTherapee forum or GitHub Code project to the top of your translation, e.g.: +#02 Translators please append a comment here with the current date and your name(s) as used in the RawTherapee forum or GitHub page, e.g.: #03 2525-12-24 Zager and Evans ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Credits @@ -1351,11 +1351,12 @@ TP_DARKFRAME_LABEL;Dark-Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold -TP_DIRPYRDENOISE_33;3×3 strong -TP_DIRPYRDENOISE_55;5×5 strong -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 +TP_DIRPYRDENOISE_3X3;3×3 +TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +TP_DIRPYRDENOISE_5X5;5×5 +TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +TP_DIRPYRDENOISE_7X7;7×7 +TP_DIRPYRDENOISE_9X9;9x9 TP_DIRPYRDENOISE_ABM;Chroma only TP_DIRPYRDENOISE_AUT;Automatic global TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1398,12 +1399,12 @@ TP_DIRPYRDENOISE_METHOD11;Quality TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. TP_DIRPYRDENOISE_PASSES;Median iterations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. TP_DIRPYRDENOISE_PON;Auto multi-zones TP_DIRPYRDENOISE_PRE;Preview multi-zones TP_DIRPYRDENOISE_PREV;Preview @@ -1414,7 +1415,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standard TP_DIRPYRDENOISE_SHALBI;High TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 5eac04b2a..5bff14ef2 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -218,21 +218,21 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP methodmedconn = methodmed->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::methodmedChanged) ); rgbmethod = Gtk::manage (new MyComboBoxText ()); - rgbmethod->append_text (M("TP_DIRPYRDENOISE_SOFT")); - rgbmethod->append_text (M("TP_DIRPYRDENOISE_33")); - rgbmethod->append_text (M("TP_DIRPYRDENOISE_55SOFT")); + rgbmethod->append_text (M("TP_DIRPYRDENOISE_3X3_SOFT")); + rgbmethod->append_text (M("TP_DIRPYRDENOISE_3X3")); + rgbmethod->append_text (M("TP_DIRPYRDENOISE_5X5_SOFT")); rgbmethod->set_active (0); rgbmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); rgbmethodconn = rgbmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::rgbmethodChanged) ); medmethod = Gtk::manage (new MyComboBoxText ()); - medmethod->append_text (M("TP_DIRPYRDENOISE_SOFT")); - medmethod->append_text (M("TP_DIRPYRDENOISE_33")); - medmethod->append_text (M("TP_DIRPYRDENOISE_55SOFT")); - medmethod->append_text (M("TP_DIRPYRDENOISE_55")); - medmethod->append_text (M("TP_DIRPYRDENOISE_77")); - medmethod->append_text (M("TP_DIRPYRDENOISE_99")); + medmethod->append_text (M("TP_DIRPYRDENOISE_3X3_SOFT")); + medmethod->append_text (M("TP_DIRPYRDENOISE_3X3")); + medmethod->append_text (M("TP_DIRPYRDENOISE_5X5_SOFT")); + medmethod->append_text (M("TP_DIRPYRDENOISE_5X5")); + medmethod->append_text (M("TP_DIRPYRDENOISE_7X7")); + medmethod->append_text (M("TP_DIRPYRDENOISE_9X9")); medmethod->set_active (0); medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); medmethodconn = medmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::medmethodChanged) ); From c339eddcc9bf6233fe10ae7d939079616f654325 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 27 Sep 2016 23:14:17 +0200 Subject: [PATCH 220/232] Regenerated translation files. --- rtdata/languages/Catala | 16 +++++++-------- rtdata/languages/Chinese (Simplified) | 16 +++++++-------- rtdata/languages/Chinese (Traditional) | 16 +++++++-------- rtdata/languages/Czech | 16 +++++++-------- rtdata/languages/Dansk | 16 +++++++-------- rtdata/languages/Deutsch | 20 +++++++++++-------- rtdata/languages/English (UK) | 16 +++++++-------- rtdata/languages/English (US) | 16 +++++++-------- rtdata/languages/Espanol | 16 +++++++-------- rtdata/languages/Euskara | 16 +++++++-------- rtdata/languages/Francais | 16 +++++++-------- rtdata/languages/Greek | 16 +++++++-------- rtdata/languages/Hebrew | 16 +++++++-------- rtdata/languages/Italiano | 16 +++++++-------- rtdata/languages/Japanese | 16 +++++++-------- rtdata/languages/LICENSE | 0 rtdata/languages/Latvian | 16 +++++++-------- rtdata/languages/Magyar | 16 +++++++-------- rtdata/languages/Nederlands | 16 +++++++-------- rtdata/languages/Norsk BM | 16 +++++++-------- rtdata/languages/Polish | 16 +++++++-------- rtdata/languages/Polish (Latin Characters) | 16 +++++++-------- rtdata/languages/Portugues (Brasil) | 16 +++++++-------- rtdata/languages/Russian | 16 +++++++-------- rtdata/languages/Serbian (Cyrilic Characters) | 16 +++++++-------- rtdata/languages/Serbian (Latin Characters) | 16 +++++++-------- rtdata/languages/Slovak | 16 +++++++-------- rtdata/languages/Suomi | 16 +++++++-------- rtdata/languages/Swedish | 16 +++++++-------- rtdata/languages/Turkish | 16 +++++++-------- 30 files changed, 236 insertions(+), 232 deletions(-) mode change 100644 => 100755 rtdata/languages/LICENSE diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index f9f393139..3d5c4863c 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1622,11 +1622,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1664,12 +1665,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1680,7 +1681,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index ad1c06481..70748624f 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1556,11 +1556,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1600,12 +1601,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1615,7 +1616,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 9ce592251..a4dfae140 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -1430,11 +1430,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1477,12 +1478,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1493,7 +1494,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 918c87557..fd7aad1f9 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1354,11 +1354,6 @@ TP_DARKFRAME_LABEL;Tmavý snímek TP_DEFRINGE_LABEL;Odstranění lemu TP_DEFRINGE_RADIUS;Poloměr TP_DEFRINGE_THRESHOLD;Práh -TP_DIRPYRDENOISE_33;3×3 silný -TP_DIRPYRDENOISE_55;5×5 silný -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Pouze barevnost TP_DIRPYRDENOISE_AUT;Automatická celková TP_DIRPYRDENOISE_AUTO;Automatická celková @@ -1401,12 +1396,10 @@ TP_DIRPYRDENOISE_METHOD11;Kvalita TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Kvalita může být přizpůsobena vzoru šumu. Nastavení "Vysoká" vylepší efekt redukce šumu za cenu navýšení času zpracování. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Pro raw obrázky může být použita jak RGB tak i L*a*b* metoda.\n\nPro ostatní obrázky bude vždy použita metoda L*a*b* bez ohledu na výběr. TP_DIRPYRDENOISE_METM_TOOLTIP;Pokud je použito 'Pouze Jas' a 'L*a*b*' metody, bude při odstranění šumu použit filtr medián hned po vlnkové transformaci.\nPokud je použit "RGB" mód, bude filtr použit až na úplný závěr procesu redukce šumu. -TP_DIRPYRDENOISE_MET_TOOLTIP;Aplikuje filtr medián požadované velikosti. Čím větší velikost, tím déle to trvá.\n\n3×3 jemný: upraví 5 pixelů v rozsahu jednoho pixelu.\n3×3: upraví 9 pixelů v rozsahu jednoho pixelu.\n5×5 jemný; upraví 13 pixelů v rozsahu dvou pixelů.\n5×5: upraví 25 pixelů v rozsahu dvou pixelů.\n7×7: upraví 49 pixelů v rozsahu tří pixelů.\n9×9: upraví 81 pixelů v rozsahu čtyř pixelů.\n\nV některých případech může být větší kvality dosaženo pomocí několika průběhů s menším rozsahem než jedním průběhem s velkým rozsahem. TP_DIRPYRDENOISE_NOISELABEL;Náhled šumu: Průměr=%1 Výšky=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Náhled šumu: Průměr= - Výšky= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zobrazuje zbývající úroveň zašumění části obrázku viditelného v náhledu po vlnkové transformaci.\n\n>300 Hodně šumu\n100-300 Šum\n50-100 Málo šumu\n<50 Velmi málo šumu\n\nUpozornění: hodnoty RGB a L*a*b* režimu se budou lišit. Protože v RGB režimu nedochází ke kompletnímu oddělení jasu a barev jsou RGB hodnoty jméně přesné TP_DIRPYRDENOISE_PASSES;Počet průchodů mediánu -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Aplikování medián filtru 3×3 se třemi průchody často vede k lepšímu výsledku než jednou aplikovaný filtr 7×7. TP_DIRPYRDENOISE_PON;Více zónová automatika TP_DIRPYRDENOISE_PRE;Více zónový náhled TP_DIRPYRDENOISE_PREV;Náhled @@ -1417,7 +1410,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Běžná TP_DIRPYRDENOISE_SHALBI;Vysoká TP_DIRPYRDENOISE_SLI;Posuvník -TP_DIRPYRDENOISE_SOFT;3×3 TP_DIRPYRDENOISE_TILELABEL;Velikost dlaždice=%1, Střed: Tx=%2 Ty=%3 TP_DIRPYREQUALIZER_ALGO;Rozsah pleťových tónů TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Jemný: blíž k barvám pleti, minimalizuje zásahy na ostatních barvách.\nVelký: více zabrání vzniku artefaktů. @@ -2025,6 +2017,14 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 772933ef5..f63f74969 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index f65001418..12a66c991 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1380,11 +1380,6 @@ TP_DARKFRAME_LABEL;Dunkelbild TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwellenwert -TP_DIRPYRDENOISE_33;3×3 stark -TP_DIRPYRDENOISE_55;5×5 stark -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Nur Farbe TP_DIRPYRDENOISE_AUT;Automatisch Global TP_DIRPYRDENOISE_AUTO;Automatisch Global @@ -1427,12 +1422,10 @@ TP_DIRPYRDENOISE_METHOD11;Qualität TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Einstellung der Qualität der Rauschreduzierung. Die Einstellung “Hoch“ verbessert die Rauschreduzierung auf Kosten der Verarbeitungszeit. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Für RAW-Bilder kann entweder die RGB- oder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der Auswahl immer die L*a*b*-Methode verwendet. TP_DIRPYRDENOISE_METM_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“, wird der Medianfilter nach den Waveletschritten verarbeitet.\nBei RGB wird der Medianfilter am Ende der Rauschreduzierung verarbeitet. -TP_DIRPYRDENOISE_MET_TOOLTIP;Wendet einen Medianfilter mit der angegebenen Größe an. Je größer der Bereich, desto länger dauert die Verarbeitung..\n\n3x3: Verarbeitet 5 Pixel in einem 1-Pixelbereich.\n3x3 stark: Verarbeitet 9 Pixel in einem 1-Pixelbereich.\n5x5: Verarbeitet 13 Pixel in einem 2-Pixelbereich.\n5x5 stark: Verarbeitet 25 Pixel in einem 2-Pixelbereich.\n7x7: Verarbeitet 49 Pixel in einem 3-Pixelbereich.\n9x9: Verarbeitet 81 Pixel in einem 4-Pixelbereich.\n\nManchmal erzielt man mit einem kleinen Bereich mit mehreren Iterationen eine bessere Qualität als mit einem großen Bereich. TP_DIRPYRDENOISE_NOISELABEL;Rauschen: Mittelwert=%1 Hoch=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Rauschen: Mittelwert = --- Hoch = --- TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs in der 100%-Ansicht an.\n\n<50: Sehr wenig Rauschen\n50 - 100: Wenig Rauschen\n100 - 300: Durchschnittliches Rauschen\n>300: Hohes Rauschen\n\nDie Werte unterscheiden sich im L*a*b*- und RGB-Modus. Die RGB-Werte sind ungenauer, da der RGB-Modus Luminanz und Chrominanz nicht komplett trennt. TP_DIRPYRDENOISE_PASSES;Medianiterationen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Ein 3x3-Medianfilter mit 3 Iterationen erzielt oft bessere Ergebnisse als ein 7x7-Medianfilter mit nur einer Iteration. TP_DIRPYRDENOISE_PON;Auto-Multizonen TP_DIRPYRDENOISE_PRE;Vorschau TP_DIRPYRDENOISE_PREV;Vorschau @@ -1443,7 +1436,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standard TP_DIRPYRDENOISE_SHALBI;Hoch TP_DIRPYRDENOISE_SLI;Regler -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYRDENOISE_TILELABEL;Kachelgröße=%1 Zentrum: Tx=%2 Ty=%2 TP_DIRPYREQUALIZER_ALGO;Hautfarbtonbereich TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fein: Ist näher an den Hautfarbtönen und minimiert den Einfluss auf andere Farben.\n\nGrob: Minimiert Artefakte. @@ -2053,3 +2045,15 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 20966492f..3acddbed5 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1386,11 +1386,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1431,12 +1432,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1446,7 +1447,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DIRPYREQUALIZER_HUESKIN;Skin hue !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 5b3578336..550798ed0 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1352,11 +1352,12 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1399,12 +1400,12 @@ !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1415,7 +1416,6 @@ !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index ddcc4a362..a6b52f597 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1162,10 +1162,6 @@ TP_DARKFRAME_LABEL;Toma Negra TP_DEFRINGE_LABEL;Quitar borde púrpura TP_DEFRINGE_RADIUS;Radio TP_DEFRINGE_THRESHOLD;Umbral -TP_DIRPYRDENOISE_33;3×3 fuerte -TP_DIRPYRDENOISE_55;5×5 fuerte -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Crominancia: Azul-Amarillo TP_DIRPYRDENOISE_CHROMA;Crominancia: Maestra TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modula la acción de eliminación de ruido 'de luminancia' @@ -1189,15 +1185,12 @@ TP_DIRPYRDENOISE_METHOD11;Calidad TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La Calidad puede ser adaptada a un patrón de ruido. Al seleccionar "Alto" se incrementa el efecto de reducción de ruido a costa de prolongar el tiempo de procesamiento. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Para imágenes raw puede usar tanto el método RGB como el Lab.\n\nPara imágenes no raw el método Lab será usado de todas maneras, ignorando el método seleccionado. TP_DIRPYRDENOISE_METM_TOOLTIP;Cuando se utiliza "Sólo Luminancia" y los métodos "Lab", el filtro Median será aplicado inmediatamente después de cada proceso de toda la cadena de reducción de ruido.\nCuando se utiliza el modo "RGB", el filtro Median se aplicará al final de toda la cadena de procesos de reducción de ruido. -TP_DIRPYRDENOISE_MET_TOOLTIP;Aplicar el filtro Median al tamaño deseado. Cuanto mayor sea el tamaño, demandará más tiempo.\n\n3x3 suave: procesar 5 píxeles en un rango de 1 píxel.\n3x3: procesar 9 píxeles en un rango de 1 píxel.\n5x5 suave: procesar 13 píxeles en un rango de 2 píxeles.\n5x5: procesar 25 píxeles en un rango de 2 píxeles.\n7x7: procesar 49 píxeles en un rango 3 píxeles.\n\nAlgunas veces es posible lograr una mayor calidad ejecutando varias iteraciones con un rango pequeño, que con una sóla iteración con un rango amplio. TP_DIRPYRDENOISE_PASSES;Iteracciones Median -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Aplicar el filtro Median 3x3 con 3 iteraciones, a menudo produce mejores resultados que aplicar una sola vez 7x7. TP_DIRPYRDENOISE_RED;Crominancia: Rojo-Verde TP_DIRPYRDENOISE_RGB;RGB TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Estándar TP_DIRPYRDENOISE_SHALBI;Alto -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYREQUALIZER_ALGO;Rango de Color de Piel TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fino: cercano a los colores de la piel, minimizando la acción en otros colores\nAmplio: evita más elementos extraños. TP_DIRPYREQUALIZER_HUESKIN;Matiz de la piel @@ -1795,7 +1788,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1815,9 +1813,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 94bc87b4b..5a5f50b1a 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 7c3e411b4..668bf103c 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1295,11 +1295,6 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil -TP_DIRPYRDENOISE_33;3×3 fort -TP_DIRPYRDENOISE_55;5×5 fort -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Chroma uniquement TP_DIRPYRDENOISE_AUT;Global automatique TP_DIRPYRDENOISE_AUTO;Global automatique @@ -1342,12 +1337,10 @@ TP_DIRPYRDENOISE_METHOD11;Qualité TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La qualité peut être adapté à la trame du bruit. Régler sur "haut" augmentera l'effet de la réduction de bruit au prix d'un temps de traitement plus long. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Pour les images raw, les méthodes RVB ou Lab peuvent être utilisées.\n\nPour les images non-raw la méthode Lab sera utilisée, indépendamment de ce qu'indique ce bouton. TP_DIRPYRDENOISE_METM_TOOLTIP;Lorsque vous utilisez les méthodes "Luminance seulement" et "Lab", un filtrage médian sera effectué juste après l'étape des ondelettes dans le pipeline de la réduction de bruit.\nEm mode "RVB", il sera effectué à la toute fin du pipeline de la réduction de bruit. -TP_DIRPYRDENOISE_MET_TOOLTIP;Applique un filtre médian de la taille souhaité. Plus il est large, plus cela prendra de temps.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. TP_DIRPYRDENOISE_NOISELABEL;Bruit de l'aperçu: Moyen=%1 Haut=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Bruit de l'aperçu: Moyen= - Haut= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;Affiche les niveaux de bruit résiduel de la partie de l'image visible dans l'aperçu après les ondelettes.\n\n>300 Très bruité\n100-300 Bruité\n50-100 Peu bruité\n<50 Très peu bruité\n\nAttention, les valeurs diffèreront entre le mode RVB et L*a*b*. Les valeurs RVB sont moins précises car le mode RVB ne séparent pas complètement la luminance et la chrominance. TP_DIRPYRDENOISE_PASSE;Itérations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Appliquer 3 itération du filtre médian 3x3 donne de meilleurs résultats qu'appliquer une seule fois le filtre 7x7. TP_DIRPYRDENOISE_PON;Multi-zones auto TP_DIRPYRDENOISE_PRE;Aperçu multi-zones TP_DIRPYRDENOISE_PREV;Aperçu @@ -1358,7 +1351,6 @@ TP_DIRPYRDENOISE_RGBM;RVB TP_DIRPYRDENOISE_SHAL;Standard TP_DIRPYRDENOISE_SHALBI;Haut TP_DIRPYRDENOISE_SLI;Curseur -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYRDENOISE_TILELABEL;Taille des tuiles =%1, Centre: Tx=%2 Ty=%3 TP_DIRPYREQUALIZER_ALGO;Domaine des tons chairs TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fin: plus proche des tons chairs, minimisant l'actions sur les autres couleurs\nLarge: évite plus d'artéfacts @@ -1942,7 +1934,15 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_COLORTONING_NEUTRAL;Reset sliders +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_PASSES;Median iterations +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 2f66d779f..54da61d39 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -1427,11 +1427,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1474,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1490,7 +1491,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 10de78b94..2f10d945a 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index e752f8acf..ed7c308c6 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1694,11 +1694,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1728,12 +1729,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1742,7 +1743,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_EPD_GAMMA;Gamma diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8a9fdff4d..c8352a7fc 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1329,11 +1329,6 @@ TP_DARKFRAME_LABEL;ダークフレーム TP_DEFRINGE_LABEL;フリンジ低減 TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 -TP_DIRPYRDENOISE_33;強い3x3 -TP_DIRPYRDENOISE_55;強い5x5 -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;色ノイズだけ TP_DIRPYRDENOISE_AUT;自動(分割方式) TP_DIRPYRDENOISE_AUTO;自動(分割方式) @@ -1376,12 +1371,10 @@ TP_DIRPYRDENOISE_METHOD11;ノイズ低減の質 TP_DIRPYRDENOISE_METHOD11_TOOLTIP;ノイズの状態に応じて低減効果の質を選べます:1-標準 2-高い\n2の方がノイズ低減効果は高くなりますが、その分処理時間が増えます。 TP_DIRPYRDENOISE_METHOD_TOOLTIP;raw画像は、RGBまたはL*a*b*方式のいずれかを使用することができます。\n\nraw以外の画像は、選択にかかわらずL*a*b*方式が採用されます TP_DIRPYRDENOISE_METM_TOOLTIP;フィルタリングの方式で、"輝度のみ"と"L*a*b*"を選択した場合、メディアンフィルタリングはノイズ低減行程でウェーブレット変換が行われた直後に適用されます\n"RGB"モードの場合は、ノイズ低減行程の最後で適用されます -TP_DIRPYRDENOISE_MET_TOOLTIP;適用するメディアンフィルターのサイズを決めます。大きくするとその分処理時間が増えます。\n\nソフトな3x3:1ピクセル範囲で5ピクセルの処理を行います\n強い3x3:1ピクセル範囲で9ピクセルの処理を行います\nソフトな5x5:2ピクセル範囲で13ピクセルの処理を行います\n強い5x5:2ピクセル範囲で25ピクセルの処理を行います\n7x7:3ピクセル範囲で49ピクセルの処理を行います\n9x9:4ピクセル範囲で81ピクセルの処理を行います\n\n小さいフィルターを使って、繰り返し処理をした方が、大きいフィルターを1回使うより結果が良いこともあります。 TP_DIRPYRDENOISE_NOISELABEL;プレビューのノイズ: 中間色度=%1 高色度=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;プレビューのノイズ: 中間色度= - 高色度= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;ウェーブレット変換後、プレビューで見える部分画像で残ったノイズのレベルを表示します\n\n>300以上 非常にノイズが多い\n100~300 ノイズが多い\n50~100 ノイズが少ない\n50以下 ノイズが非常に少ない\n\n算出値はRGBとL*a*b*モードでは異なります。RGBモードは輝度と色を完全に切り離すことが出来ないので、算出値の精度は劣ります。 TP_DIRPYRDENOISE_PASSES;フィルタリングの繰り返し回数 -TP_DIRPYRDENOISE_PASSES_TOOLTIP;3x3のメディアンフィルターを3回繰り返して適用する方が、7x7のフィルターを1回適用するより、良い結果を生むことが多いです TP_DIRPYRDENOISE_PON;自動(多分割方式) TP_DIRPYRDENOISE_PRE;自動(プレビュー方式) TP_DIRPYRDENOISE_PREV;プレビュー方式 @@ -1392,7 +1385,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;標準 TP_DIRPYRDENOISE_SHALBI;高い TP_DIRPYRDENOISE_SLI;スライダー -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYRDENOISE_TILELABEL;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3 TP_DIRPYREQUALIZER_ALGO;肌色の範囲 TP_DIRPYREQUALIZER_ALGO_TOOLTIP;ファイン:撮影の肌色に近い部分に働くアルゴリズム、他の色への影響を最小限に抑えます\n広範: アーティファクトの増加を避けるアルゴリズムです @@ -1975,6 +1967,14 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/LICENSE b/rtdata/languages/LICENSE old mode 100644 new mode 100755 diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 20fbad2f8..46ae366e0 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index fc3cdf366..8fec58639 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1574,11 +1574,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1617,12 +1618,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1633,7 +1634,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 239120a91..406214184 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1360,11 +1360,6 @@ TP_DARKFRAME_LABEL;Donkerframe TP_DEFRINGE_LABEL;Verzachten (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Straal TP_DEFRINGE_THRESHOLD;Drempel -TP_DIRPYRDENOISE_33;3×3 sterk -TP_DIRPYRDENOISE_55;5×5 sterk -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Alleen chroma TP_DIRPYRDENOISE_AUT;Automatisch algemeen TP_DIRPYRDENOISE_AUTO;Automatisch algemeen @@ -1407,13 +1402,11 @@ TP_DIRPYRDENOISE_METHOD11;Kwaliteit TP_DIRPYRDENOISE_METHOD11_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd TP_DIRPYRDENOISE_METHOD_TOOLTIP;Voor raw afbeeldingen kan RGB of Lab methode worden gebruikt.\n\nVoor niet-raw afbeeldingen zal altijd de Lab methode worden gebruikt, ongeacht de geselecteerde methode. TP_DIRPYRDENOISE_METM_TOOLTIP;De "Alleen Luminantie" en "L*a*b*" methodes worden meteen na de wavelet stap uitgevoerd bij het onderdrukken van ruis.\nDe "RGB" methode, wordt echter als laatste stap uitgevoerd bij ruisonderdrukking. -TP_DIRPYRDENOISE_MET_TOOLTIP;Mediaan filters. Hoe groter de omvang, hoe langer de verwerking.\n\n3x3: bewerkt 5 pixels in een 1-pixel reeks.\n3x3 sterk: bewerkt 9 pixels in een 1-pixel reeks.\n5x5 soft: bewerkt 13 pixels in een 2-pixel reeks.\n5x5: bewerkt 25 pixels in een 2-pixel reeks.\n7x7: bewerkt 49 pixels in een 3-pixel reeks.\n9x9: bewerkt 81 pixels in een 4-pixel reeks.\n\nSoms is het mogelijk om een beter resultaat te behalen door meerdere iteraties met een kleinere reeks uit te voeren dan 1 iteratie met een grotere reeks. TP_DIRPYRDENOISE_NOISELABEL;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. TP_DIRPYRDENOISE_PASSE;Herhalingen TP_DIRPYRDENOISE_PASSES;Mediaan herhalingen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Een 3x3 filter met drie herhalingen geeft meestal een beter resultaat dan eenmaal het 7x7 filter. TP_DIRPYRDENOISE_PON;Auto multi-zone TP_DIRPYRDENOISE_PRE;Voorbeeld multi-zone TP_DIRPYRDENOISE_PREV;Voorbeeld @@ -1424,7 +1417,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standaard TP_DIRPYRDENOISE_SHALBI;Hoog TP_DIRPYRDENOISE_SLI;Schuifbalk -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYRDENOISE_TILELABEL;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 TP_DIRPYREQUALIZER_ALGO;Algoritme Huid TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fijn: behoud de kleuren van de huid, minimaliseert de actie op andere kleuren\nGroot: vermijd artefacten @@ -2041,6 +2033,14 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale !TP_BWMIX_AUTOCH;Auto +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 807b9c95e..5427563d7 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -1427,11 +1427,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1474,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1490,7 +1491,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 366761246..216ee924c 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1117,10 +1117,6 @@ TP_DARKFRAME_LABEL;Czarna klatka TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promień TP_DEFRINGE_THRESHOLD;Próg -TP_DIRPYRDENOISE_33;3×3 silne -TP_DIRPYRDENOISE_55;5×5 silne -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Chrominancja - Błękit-żółć TP_DIRPYRDENOISE_CHROMA;Chrominancja - Główna TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje działanie usuwania szumów luminancji @@ -1144,15 +1140,12 @@ TP_DIRPYRDENOISE_METHOD11;Jakość TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Dla obrazów raw można używać metody RGB oraz L*a*b*.\n\nDla obrazów nie-raw metoda L*a*b* zostanie użyta niezależnie od wyboru. TP_DIRPYRDENOISE_METM_TOOLTIP;Przy użyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. -TP_DIRPYRDENOISE_MET_TOOLTIP;Zasrosuj filtrowanie mediana o oknie pożądanego rozmiaru. Im większy rozmiar okna, tym dłużej przetwarzanie zajmie.\n\n3x3 miękki: użyje 5 pikseli w zasięgu 1 pikseli.\n3x3: użyje 9 pikseli w zasięgu 1 pikseli.\n5x5 miękki: użyje 13 pikseli w zasięgu 2 pikseli.\n5x5: użyje 25 pikseli w zasięgu 2 pikseli.\n7x7: użyje 49 pikseli w zasięgu 3 pikseli.\n\nCzasem można uzyskać wyższą jakość wielokrotnym powtórzeniem filtru przy użyciu małego okna niz przy jednokrotnym przetworzeniu przy użyciu dużego okna. TP_DIRPYRDENOISE_PASSES;Liczba powtórzeń mediana -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Trzykrotne powtórzenie filtru mediana przy użyciu okna o rozmiarze 3x3 często skutkuje wyższą jakością niż jednokrotne z oknem o rozmiarze 7x7. TP_DIRPYRDENOISE_RED;Chrominancja - Czerwień-zieleń TP_DIRPYRDENOISE_RGB;RGB TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standardowa TP_DIRPYRDENOISE_SHALBI;Wysoka -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skóry TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcień skóry @@ -1743,7 +1736,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1763,9 +1761,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 37569990e..170bd52d7 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1117,10 +1117,6 @@ TP_DARKFRAME_LABEL;Czarna klatka TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promien TP_DEFRINGE_THRESHOLD;Prog -TP_DIRPYRDENOISE_33;3×3 silne -TP_DIRPYRDENOISE_55;5×5 silne -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 TP_DIRPYRDENOISE_BLUE;Chrominancja - Blekit-zolc TP_DIRPYRDENOISE_CHROMA;Chrominancja - Glowna TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje dzialanie usuwania szumow luminancji @@ -1144,15 +1140,12 @@ TP_DIRPYRDENOISE_METHOD11;Jakosc TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakosc moze zostac dopasowana do wzoru szumow. Ustawienie "wysoka" ulepsza odszumianie okolo 20% wzrostu czasu przetwarzania. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Dla obrazow raw mozna uzywac metody RGB oraz L*a*b*.\n\nDla obrazow nie-raw metoda L*a*b* zostanie uzyta niezaleznie od wyboru. TP_DIRPYRDENOISE_METM_TOOLTIP;Przy uzyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. -TP_DIRPYRDENOISE_MET_TOOLTIP;Zasrosuj filtrowanie mediana o oknie pozadanego rozmiaru. Im wiekszy rozmiar okna, tym dluzej przetwarzanie zajmie.\n\n3x3 miekki: uzyje 5 pikseli w zasiegu 1 pikseli.\n3x3: uzyje 9 pikseli w zasiegu 1 pikseli.\n5x5 miekki: uzyje 13 pikseli w zasiegu 2 pikseli.\n5x5: uzyje 25 pikseli w zasiegu 2 pikseli.\n7x7: uzyje 49 pikseli w zasiegu 3 pikseli.\n\nCzasem mozna uzyskac wyzsza jakosc wielokrotnym powtorzeniem filtru przy uzyciu malego okna niz przy jednokrotnym przetworzeniu przy uzyciu duzego okna. TP_DIRPYRDENOISE_PASSES;Liczba powtorzen mediana -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Trzykrotne powtorzenie filtru mediana przy uzyciu okna o rozmiarze 3x3 czesto skutkuje wyzsza jakoscia niz jednokrotne z oknem o rozmiarze 7x7. TP_DIRPYRDENOISE_RED;Chrominancja - Czerwien-zielen TP_DIRPYRDENOISE_RGB;RGB TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standardowa TP_DIRPYRDENOISE_SHALBI;Wysoka -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skory TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcien skory @@ -1743,7 +1736,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1763,9 +1761,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index a655ae6e9..ff9d89f18 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 969890ad6..883128411 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1688,11 +1688,12 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1722,12 +1723,12 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1736,7 +1737,6 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 35d1f1749..57e334ae5 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1820,11 +1820,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1855,12 +1856,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1869,7 +1870,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index ea67134d3..0246c9a36 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1820,11 +1820,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1855,12 +1856,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1869,7 +1870,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 422c08e3b..d78119721 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1467,11 +1467,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1510,12 +1511,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1526,7 +1527,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index a3f79f469..20bad26da 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -1428,11 +1428,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1491,7 +1492,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index d4d5d3e10..d6556b8c2 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1240,11 +1240,6 @@ TP_DARKFRAME_LABEL;Svartbild TP_DEFRINGE_LABEL;Fyll ut överstrålning TP_DEFRINGE_RADIUS;Radie TP_DEFRINGE_THRESHOLD;Tröskelvärde -TP_DIRPYRDENOISE_33;3×3 kraftig -TP_DIRPYRDENOISE_55;5×5 kraftig -TP_DIRPYRDENOISE_55SOFT;5×5 -TP_DIRPYRDENOISE_77;7×7 -TP_DIRPYRDENOISE_99;9×9 TP_DIRPYRDENOISE_ABM;Endast chroma TP_DIRPYRDENOISE_AUTO_TOOLTIP;Försök att utvärdera chroma-bruset\nVar försiktig, den här beräkningen görs på genomsnittet och är tämligen subjektiv! TP_DIRPYRDENOISE_BLUE;Krominans - Blå-Gul @@ -1278,7 +1273,6 @@ TP_DIRPYRDENOISE_RGBM;RGB TP_DIRPYRDENOISE_SHAL;Standard TP_DIRPYRDENOISE_SHALBI;Hög TP_DIRPYRDENOISE_SLI;Reglage -TP_DIRPYRDENOISE_SOFT;3x3 TP_DIRPYREQUALIZER_ALGO;Algoritm för hudtoner TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fin: närmre hudens färger, minimerar inverkan på andra färger\nStor: undvik än mer artefakter TP_DIRPYREQUALIZER_ARTIF;Reducera artefakter @@ -1830,6 +1824,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_COLORTONING_TWOALL;Special chroma !TP_COLORTONING_TWOBY;Special a* and b* !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global !TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. @@ -1846,12 +1846,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 38c0a1ecf..329a9627a 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -1427,11 +1427,12 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_33;3×3 strong -!TP_DIRPYRDENOISE_55;5×5 strong -!TP_DIRPYRDENOISE_55SOFT;5×5 -!TP_DIRPYRDENOISE_77;7×7 -!TP_DIRPYRDENOISE_99;9×9 +!TP_DIRPYRDENOISE_3X3;3×3 +!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_5X5;5×5 +!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft +!TP_DIRPYRDENOISE_7X7;7×7 +!TP_DIRPYRDENOISE_9X9;9x9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1474,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired size. The larger the size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 1-pixel range.\n3x3: treats 9 pixels in a 1-pixel range.\n5x5 soft: treats 13 pixels in a 2-pixel range.\n5x5: treats 25 pixels in a 2-pixel range.\n7x7: treats 49 pixels in a 3-pixel range.\n9x9: treats 81 pixels in a 4-pixel range.\n\nSometimes it is possible to achieve higher quality running several iterations with a small range than one iteration with a large range. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying a 3x3 median filter with three iterations often leads to better results than applying 7x7 once. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview @@ -1490,7 +1491,6 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DIRPYRDENOISE_SHAL;Standard !TP_DIRPYRDENOISE_SHALBI;High !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_SOFT;3x3 !TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. From 6ba96a10e97aee695d2a4b272a14c8a84cb71476 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 27 Sep 2016 23:24:02 +0200 Subject: [PATCH 221/232] =?UTF-8?q?Replaced=20"x"=20with=20Floessie's=20"?= =?UTF-8?q?=C3=97".?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtdata/languages/Catala | 10 +++++----- rtdata/languages/Chinese (Simplified) | 10 +++++----- rtdata/languages/Chinese (Traditional) | 10 +++++----- rtdata/languages/Czech | 8 ++++---- rtdata/languages/Dansk | 10 +++++----- rtdata/languages/Deutsch | 8 ++++---- rtdata/languages/English (UK) | 10 +++++----- rtdata/languages/English (US) | 10 +++++----- rtdata/languages/Espanol | 10 +++++----- rtdata/languages/Euskara | 10 +++++----- rtdata/languages/Francais | 10 +++++----- rtdata/languages/Greek | 10 +++++----- rtdata/languages/Hebrew | 10 +++++----- rtdata/languages/Italiano | 10 +++++----- rtdata/languages/Japanese | 10 +++++----- rtdata/languages/Latvian | 10 +++++----- rtdata/languages/Magyar | 10 +++++----- rtdata/languages/Nederlands | 10 +++++----- rtdata/languages/Norsk BM | 10 +++++----- rtdata/languages/Polish | 10 +++++----- rtdata/languages/Polish (Latin Characters) | 10 +++++----- rtdata/languages/Portugues (Brasil) | 10 +++++----- rtdata/languages/Russian | 10 +++++----- rtdata/languages/Serbian (Cyrilic Characters) | 10 +++++----- rtdata/languages/Serbian (Latin Characters) | 10 +++++----- rtdata/languages/Slovak | 10 +++++----- rtdata/languages/Suomi | 10 +++++----- rtdata/languages/Swedish | 10 +++++----- rtdata/languages/Turkish | 10 +++++----- rtdata/languages/default | 10 +++++----- 30 files changed, 148 insertions(+), 148 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 3d5c4863c..c31e73a4d 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -335,7 +335,7 @@ HISTORY_MSG_145;Microcontrast - uniformitat HISTORY_MSG_146;Afinament de vores HISTORY_MSG_147;Afinant vores - només luminància HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - matriu 3x3 +HISTORY_MSG_149;Microcontrast - matriu 3×3 HISTORY_MSG_150;Artefactes en post-demosaicat/reducció de soroll HISTORY_MSG_151;Vibrància HISTORY_MSG_152;Vibrància - tons pastel @@ -1623,11 +1623,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1665,12 +1665,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 70748624f..9807768f9 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -943,7 +943,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_144;Microcontrast - Quantity !HISTORY_MSG_145;Microcontrast - Uniformity !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1557,11 +1557,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1601,12 +1601,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index a4dfae140..b0dd37f50 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -663,7 +663,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1431,11 +1431,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1478,12 +1478,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index fd7aad1f9..8b2db6ca4 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2018,13 +2018,13 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_9X9;9×9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index f63f74969..177dfce05 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 12a66c991..90cec593b 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2050,10 +2050,10 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - !!!!!!!!!!!!!!!!!!!!!!!!! !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_9X9;9×9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 3acddbed5..ccd06a0ec 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -469,7 +469,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1387,11 +1387,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1432,12 +1432,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 550798ed0..280402073 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -380,7 +380,7 @@ !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1353,11 +1353,11 @@ !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1400,12 +1400,12 @@ !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index a6b52f597..cb00de1d3 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -421,7 +421,7 @@ HISTORY_MSG_145;Micro-contraste - Uniformidad HISTORY_MSG_146;Enfoque de bordes (EB) HISTORY_MSG_147;EB - Sólo luminancia HISTORY_MSG_148;Micro-contraste -HISTORY_MSG_149;Micro-contraste - matriz 3x3 +HISTORY_MSG_149;Micro-contraste - matriz 3×3 HISTORY_MSG_150;Reducción artefactos/ruido post interpolado HISTORY_MSG_151;Vibranza (Vib) HISTORY_MSG_152;Vib - Tonos pastel @@ -1789,11 +1789,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1813,11 +1813,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 5a5f50b1a..772ef25ce 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 668bf103c..bdb1c72cd 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -376,7 +376,7 @@ HISTORY_MSG_145;Microcontraste - Uniformité HISTORY_MSG_146;Netteté des bords HISTORY_MSG_147;Bords - Luminance uniquement HISTORY_MSG_148;Microcontraste -HISTORY_MSG_149;Microcontraste - Matrice 3x3 +HISTORY_MSG_149;Microcontraste - Matrice 3×3 HISTORY_MSG_150;Réduction du bruit/artefact post-dématriçage HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib. - Tons pastels @@ -1935,14 +1935,14 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_COLORTONING_NEUTRAL;Reset sliders !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_9X9;9×9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 54da61d39..1af0dc7d4 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -658,7 +658,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1428,11 +1428,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 2f10d945a..5d5911e9a 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index ed7c308c6..211e7190a 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -365,7 +365,7 @@ HISTORY_MSG_145;Microcontrasto - Uniformità HISTORY_MSG_146;Nitidezza ai Bordi (ES) HISTORY_MSG_147;ES - Solo luminanza HISTORY_MSG_148;Microcontrasto -HISTORY_MSG_149;Microcontrasto - Matrice 3x3 +HISTORY_MSG_149;Microcontrasto - Matrice 3×3 HISTORY_MSG_150;Rid. rumore/artefatti di demosaic. HISTORY_MSG_151;Vividezza HISTORY_MSG_152;Vividezza - Toni Pastello @@ -1695,11 +1695,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1729,12 +1729,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index c8352a7fc..071d76020 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -409,7 +409,7 @@ HISTORY_MSG_145;マイクロコントラスト - 均等 HISTORY_MSG_146;エッジ シャープ化 HISTORY_MSG_147;エッジ シャープ化 - 輝度のみ HISTORY_MSG_148;マイクロコントラスト -HISTORY_MSG_149;マイクロコントラスト - 3x3 マトリクス +HISTORY_MSG_149;マイクロコントラスト - 3×3 マトリクス HISTORY_MSG_150;デモザイク後にアーティファクトとノイズを軽減 HISTORY_MSG_151;自然な彩度 HISTORY_MSG_152;自然な彩度 - 明清色トーン @@ -1968,13 +1968,13 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_9X9;9×9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now? !TP_ICM_PROFILEINTENT;Rendering Intent !TP_NEUTRAL;Reset diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 46ae366e0..25a0e2052 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 8fec58639..e4ee4d113 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -328,7 +328,7 @@ HISTORY_MSG_145;Mikrokontraszt - egységesség HISTORY_MSG_146;Élek élesítése HISTORY_MSG_147;Élek élesítése - csak luminencia HISTORY_MSG_148;Mikrokontraszt -HISTORY_MSG_149;Mikrokontraszt - 3x3 mátrix +HISTORY_MSG_149;Mikrokontraszt - 3×3 mátrix HISTORY_MSG_150;Interpoláció utáni műtermék-/zajcsökkentés HISTORY_MSG_151;Vibrancia HISTORY_MSG_152;Vibrancia - Pastel tones @@ -1575,11 +1575,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1618,12 +1618,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 406214184..abfc6c9a1 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -391,7 +391,7 @@ HISTORY_MSG_145;Microcontrast - Uniformiteit HISTORY_MSG_146;Randen verscherpen HISTORY_MSG_147;RV - Luminantie HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3x3 matrix +HISTORY_MSG_149;Microcontrast - 3×3 matrix HISTORY_MSG_150;Nabewerking demozaïek HISTORY_MSG_151;Levendigheid HISTORY_MSG_152;LV - Pasteltinten @@ -2034,13 +2034,13 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_442;Retinex - Scale !TP_BWMIX_AUTOCH;Auto !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_9X9;9×9 +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 5427563d7..376e12be5 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -658,7 +658,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1428,11 +1428,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 216ee924c..c5e74ced3 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -369,7 +369,7 @@ HISTORY_MSG_145;Mikrokontrast - Jednolitość HISTORY_MSG_146;Wyostrzanie krawędzi HISTORY_MSG_147;Wyostrzanie krawędzi - tylko luminacja HISTORY_MSG_148;Mikrokontrast -HISTORY_MSG_149;Mikrokontrast - matryca 3x3 +HISTORY_MSG_149;Mikrokontrast - matryca 3×3 HISTORY_MSG_150;Redukcja szumu i artefaktów po demozaikowaniu HISTORY_MSG_151;Jaskrawość HISTORY_MSG_152;Jaskrawość - Ppastelowe @@ -1737,11 +1737,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1761,11 +1761,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 170bd52d7..c82e4b3e1 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -369,7 +369,7 @@ HISTORY_MSG_145;Mikrokontrast - Jednolitosc HISTORY_MSG_146;Wyostrzanie krawedzi HISTORY_MSG_147;Wyostrzanie krawedzi - tylko luminacja HISTORY_MSG_148;Mikrokontrast -HISTORY_MSG_149;Mikrokontrast - matryca 3x3 +HISTORY_MSG_149;Mikrokontrast - matryca 3×3 HISTORY_MSG_150;Redukcja szumu i artefaktow po demozaikowaniu HISTORY_MSG_151;Jaskrawosc HISTORY_MSG_152;Jaskrawosc - Ppastelowe @@ -1737,11 +1737,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1761,11 +1761,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_DIRPYRDENOISE_LUMAFR_TOOLTIP;Wavelet on luminance and Fourier transform for luminance detail !TP_DIRPYRDENOISE_MAN;Manual !TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index ff9d89f18..5f0f5918a 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 883128411..de6a7c749 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -364,7 +364,7 @@ HISTORY_MSG_145;Микроконтраст: Равномерность HISTORY_MSG_146;Резкость контуров HISTORY_MSG_147;РК: Только освещенность HISTORY_MSG_148;Микроконтраст -HISTORY_MSG_149;Микроконтраст: матрица 3x3 +HISTORY_MSG_149;Микроконтраст: матрица 3×3 HISTORY_MSG_150;Пост-демозаик шумоподавление HISTORY_MSG_151;Резонанс HISTORY_MSG_152;Рез: Пастельные тона @@ -1689,11 +1689,11 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1723,12 +1723,12 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 57e334ae5..c805a5de6 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -353,7 +353,7 @@ HISTORY_MSG_145;Микроконтраст - уједначеност HISTORY_MSG_146;Оштрење ивица HISTORY_MSG_147;Оштрење ивица - само луминанса HISTORY_MSG_148;Микроконтраст -HISTORY_MSG_149;Микроконтраст - 3x3 матрица +HISTORY_MSG_149;Микроконтраст - 3×3 матрица HISTORY_MSG_150;Уклањање артефакта/шума након расклапања мозаика HISTORY_MSG_151;Живост боја HISTORY_MSG_152;Жив - Пастелни тонови @@ -1821,11 +1821,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1856,12 +1856,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 0246c9a36..45d05c8ce 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -353,7 +353,7 @@ HISTORY_MSG_145;Mikrokontrast - ujednačenost HISTORY_MSG_146;Oštrenje ivica HISTORY_MSG_147;Oštrenje ivica - samo luminansa HISTORY_MSG_148;Mikrokontrast -HISTORY_MSG_149;Mikrokontrast - 3x3 matrica +HISTORY_MSG_149;Mikrokontrast - 3×3 matrica HISTORY_MSG_150;Uklanjanje artefakta/šuma nakon rasklapanja mozaika HISTORY_MSG_151;Živost boja HISTORY_MSG_152;Živ - Pastelni tonovi @@ -1821,11 +1821,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1856,12 +1856,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_DIRPYRDENOISE_METHOD11;Quality !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index d78119721..b61b42e65 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -722,7 +722,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1468,11 +1468,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1511,12 +1511,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 20bad26da..8f0ce27bc 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -660,7 +660,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1429,11 +1429,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1476,12 +1476,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index d6556b8c2..599b344bc 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -374,7 +374,7 @@ HISTORY_MSG_145;Mikrokontrast - Enhetlighet HISTORY_MSG_146;Kantskärpning HISTORY_MSG_147;Kantskärpning - Endast luminans HISTORY_MSG_148;Mikrokontrast -HISTORY_MSG_149;Mikrokontrast - 3x3-matris +HISTORY_MSG_149;Mikrokontrast - 3×3-matris HISTORY_MSG_150;Reducering av artefakter och brus e. demosaicing HISTORY_MSG_151;Lyster HISTORY_MSG_152;Lyster - Pastelltoner @@ -1825,11 +1825,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_COLORTONING_TWOBY;Special a* and b* !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global !TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. @@ -1846,12 +1846,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_DIRPYRDENOISE_MED_TOOLTIP;Enabled median denoising !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 329a9627a..7e064ce8e 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -659,7 +659,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_146;Edge sharpening !HISTORY_MSG_147;ES - Luminance only !HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3x3 matrix +!HISTORY_MSG_149;Microcontrast - 3×3 matrix !HISTORY_MSG_150;Post-demosaic artifact/noise red. !HISTORY_MSG_151;Vibrance !HISTORY_MSG_152;Vib - Pastel tones @@ -1428,11 +1428,11 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold !TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 !TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft !TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9x9 +!TP_DIRPYRDENOISE_9X9;9×9 !TP_DIRPYRDENOISE_ABM;Chroma only !TP_DIRPYRDENOISE_AUT;Automatic global !TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1475,12 +1475,12 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. !TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. !TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 !TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - !TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. !TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. !TP_DIRPYRDENOISE_PON;Auto multi-zones !TP_DIRPYRDENOISE_PRE;Preview multi-zones !TP_DIRPYRDENOISE_PREV;Preview diff --git a/rtdata/languages/default b/rtdata/languages/default index af23e7d12..fc1c2ea2b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -379,7 +379,7 @@ HISTORY_MSG_145;Microcontrast - Uniformity HISTORY_MSG_146;Edge sharpening HISTORY_MSG_147;ES - Luminance only HISTORY_MSG_148;Microcontrast -HISTORY_MSG_149;Microcontrast - 3x3 matrix +HISTORY_MSG_149;Microcontrast - 3×3 matrix HISTORY_MSG_150;Post-demosaic artifact/noise red. HISTORY_MSG_151;Vibrance HISTORY_MSG_152;Vib - Pastel tones @@ -1352,11 +1352,11 @@ TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3x3 soft +TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft TP_DIRPYRDENOISE_5X5;5×5 TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9x9 +TP_DIRPYRDENOISE_9X9;9×9 TP_DIRPYRDENOISE_ABM;Chroma only TP_DIRPYRDENOISE_AUT;Automatic global TP_DIRPYRDENOISE_AUTO;Automatic global @@ -1399,12 +1399,12 @@ TP_DIRPYRDENOISE_METHOD11;Quality TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3x3 soft: treats 5 pixels in a 3x3 pixel window.\n3x3: treats 9 pixels in a 3x3 pixel window.\n5x5 soft: treats 13 pixels in a 5x5 pixel window.\n5x5: treats 25 pixels in a 5x5 pixel window.\n7x7: treats 49 pixels in a 7x7 pixel window.\n9x9: treats 81 pixels in a 9x9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. TP_DIRPYRDENOISE_PASSES;Median iterations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3x3 window size often leads to better results than using one median filter iteration with a 7x7 window size. +TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. TP_DIRPYRDENOISE_PON;Auto multi-zones TP_DIRPYRDENOISE_PRE;Preview multi-zones TP_DIRPYRDENOISE_PREV;Preview From 4b54f985008522e307507f3d3af882e0b07da074 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 28 Sep 2016 00:03:23 +0200 Subject: [PATCH 222/232] Syncing translation files with gtk3 branch. --- rtdata/languages/Catala | 2 ++ rtdata/languages/Chinese (Simplified) | 2 ++ rtdata/languages/Chinese (Traditional) | 2 ++ rtdata/languages/Czech | 2 ++ rtdata/languages/Dansk | 2 ++ rtdata/languages/English (UK) | 2 ++ rtdata/languages/English (US) | 2 ++ rtdata/languages/Espanol | 2 ++ rtdata/languages/Euskara | 2 ++ rtdata/languages/Francais | 2 ++ rtdata/languages/Greek | 2 ++ rtdata/languages/Hebrew | 2 ++ rtdata/languages/Italiano | 2 ++ rtdata/languages/Japanese | 2 ++ rtdata/languages/Latvian | 2 ++ rtdata/languages/Magyar | 2 ++ rtdata/languages/Nederlands | 2 ++ rtdata/languages/Norsk BM | 2 ++ rtdata/languages/Polish | 2 ++ rtdata/languages/Polish (Latin Characters) | 2 ++ rtdata/languages/Portugues (Brasil) | 2 ++ rtdata/languages/Russian | 2 ++ rtdata/languages/Serbian (Cyrilic Characters) | 2 ++ rtdata/languages/Serbian (Latin Characters) | 2 ++ rtdata/languages/Slovak | 2 ++ rtdata/languages/Suomi | 2 ++ rtdata/languages/Swedish | 2 ++ rtdata/languages/Turkish | 2 ++ rtdata/languages/default | 2 ++ 29 files changed, 58 insertions(+) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index c31e73a4d..d54566400 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1031,9 +1031,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_OPEN;Open !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_174;CIECAM02 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 9807768f9..9b6385249 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -892,7 +892,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index b0dd37f50..c797a80d8 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -586,11 +586,13 @@ TP_WBALANCE_TEMPERATURE;色溫 !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 8b2db6ca4..f3142f30d 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1988,6 +1988,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +!GENERAL_APPLY;Apply +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_427;Output rendering intent !HISTORY_MSG_428;Monitor rendering intent diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 177dfce05..67ab884c8 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index ccd06a0ec..f960286c8 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -295,6 +295,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_ABOUT;About !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before @@ -310,6 +311,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_NO;No !GENERAL_NONE;None !GENERAL_OK;OK +!GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save !GENERAL_UNCHANGED;(Unchanged) diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 280402073..f38615acd 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -200,6 +200,7 @@ !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_ABOUT;About !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before @@ -215,6 +216,7 @@ !GENERAL_NO;No !GENERAL_NONE;None !GENERAL_OK;OK +!GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save !GENERAL_UNCHANGED;(Unchanged) diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index cb00de1d3..fc06babc8 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1554,7 +1554,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 772ef25ce..1d4df36ae 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index bdb1c72cd..c13f02fdf 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1881,6 +1881,8 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +!GENERAL_APPLY;Apply +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 1af0dc7d4..13d87c84c 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -579,12 +579,14 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 5d5911e9a..f91ac1f95 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 211e7190a..eabb2ff60 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1383,7 +1383,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_256;NR - Median type !HISTORY_MSG_257;Color Toning diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 071d76020..34211dbb3 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1915,6 +1915,8 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +!GENERAL_APPLY;Apply +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 25a0e2052..8e93725bb 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index e4ee4d113..dc4129b8f 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -951,9 +951,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_OPEN;Open !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index abfc6c9a1..54e0a68e1 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2029,6 +2029,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_APPLY;Apply +!GENERAL_OPEN;Open !HISTORY_MSG_439;Retinex - Process !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 376e12be5..a3554ca16 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -579,12 +579,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index c5e74ced3..584409e96 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1511,7 +1511,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index c82e4b3e1..5ff2cc31b 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1511,7 +1511,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 5f0f5918a..9891c07b3 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;Temperatura !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index de6a7c749..b792e92bc 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1322,7 +1322,9 @@ ZOOMPANEL_ZOOMOUT;Удалить - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index c805a5de6..5145322d2 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1490,7 +1490,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 45d05c8ce..c770ad345 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1490,7 +1490,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_OPEN;Open !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index b61b42e65..90eef3409 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -655,11 +655,13 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 8f0ce27bc..612df257d 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -581,12 +581,14 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 599b344bc..fbdb4c3ae 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1716,6 +1716,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. +!GENERAL_APPLY;Apply +!GENERAL_OPEN;Open !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_256;NR - Median type !HISTORY_MSG_257;Color Toning diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 7e064ce8e..0af0611d5 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -580,12 +580,14 @@ TP_WBALANCE_TEMPERATURE;Isı !FILECHOOSER_FILTER_SAME;Same format as current photo !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_AFTER;After +!GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close !GENERAL_FILE;File !GENERAL_NONE;None +!GENERAL_OPEN;Open !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. diff --git a/rtdata/languages/default b/rtdata/languages/default index fc1c2ea2b..71d2263c7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -199,6 +199,7 @@ FILECHOOSER_FILTER_SAME;Same format as current photo FILECHOOSER_FILTER_TIFF;TIFF files GENERAL_ABOUT;About GENERAL_AFTER;After +GENERAL_APPLY;Apply GENERAL_ASIMAGE;As Image GENERAL_AUTO;Automatic GENERAL_BEFORE;Before @@ -214,6 +215,7 @@ GENERAL_NA;n/a GENERAL_NO;No GENERAL_NONE;None GENERAL_OK;OK +GENERAL_OPEN;Open GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Save GENERAL_UNCHANGED;(Unchanged) From 8e6cfcb76653f227452806e56b31466ff5f6384a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 29 Sep 2016 18:21:37 +0200 Subject: [PATCH 223/232] Fix use-after-free of `ImageArea::mainCropWindow` (#3048) --- rtengine/median.h | 2 +- rtgui/editorpanel.cc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/median.h b/rtengine/median.h index fa0e893f4..d7a6b37de 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * This median implementations from Floessie and Ingo Weyrich are inspired by this work: + * These median implementations from Flössie and Ingo Weyrich are inspired by this work: * * http://ndevilla.free.fr/median/median.pdf * http://pages.ripco.net/~jgamble/nw.html diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 80dc3dfae..93a20c294 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -781,6 +781,7 @@ void EditorPanel::close () if(iareapanel) { iareapanel->imageArea->setPreviewHandler (NULL); iareapanel->imageArea->setImProcCoordinator (NULL); + iareapanel->imageArea->unsubscribe(); } rtengine::StagedImageProcessor::destroy (ipc); From 5b2ebce7d602da8e2e3057d61f400df740e7ad26 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 29 Sep 2016 22:54:38 +0200 Subject: [PATCH 224/232] Use same logic to auto select darkframe in gui and engine --- rtengine/rawimagesource.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index a7ca7d86c..15e9d0c5e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1655,7 +1655,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le rid = dfm.searchDarkFrame( raw.dark_frame ); } } else { - rid = dfm.searchDarkFrame( ri->get_maker(), ri->get_model(), ri->get_ISOspeed(), ri->get_shutter(), ri->get_timestamp()); + rid = dfm.searchDarkFrame( idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); } if( rid && settings->verbose) { From bf273043115b55172d27ce52d27b8f6d90914426 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 29 Sep 2016 23:39:10 +0200 Subject: [PATCH 225/232] Use same logic to auto select darkframe in gui and engine also for darkframe hotpixels detection --- rtengine/rawimagesource.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 15e9d0c5e..d2bdf9763 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1322,8 +1322,8 @@ SSEFUNCTION int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thres for (int i = 2; i < H - 2; i++) { for (int j = 2; j < W - 2; j++) { const float& temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], - rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], - rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); + rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], + rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); cfablur[i * W + j] = rawData[i][j] - temp; } } @@ -1655,7 +1655,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le rid = dfm.searchDarkFrame( raw.dark_frame ); } } else { - rid = dfm.searchDarkFrame( idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); + rid = dfm.searchDarkFrame(idata->getMake(), idata->getModel(), idata->getISOSpeed(), idata->getShutterSpeed(), idata->getDateTimeAsTS()); } if( rid && settings->verbose) { @@ -1726,7 +1726,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le bp = 0; if( raw.df_autoselect ) { - bp = dfm.getHotPixels( ri->get_maker(), ri->get_model(), ri->get_ISOspeed(), ri->get_shutter(), ri->get_timestamp()); + 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 ); } @@ -3775,10 +3775,11 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam pre_mul[2] }; const DCPProfile::Matrix cam_matrix = {{ - {camMatrix[0][0], camMatrix[0][1], camMatrix[0][2]}, - {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, - {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} - }}; + {camMatrix[0][0], camMatrix[0][1], camMatrix[0][2]}, + {camMatrix[1][0], camMatrix[1][1], camMatrix[1][2]}, + {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} + } + }; dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, cmp.applyHueSatMap); return; } From f6e9f7a8aeec0113b9a4f3ca0bdada85d9cfc601 Mon Sep 17 00:00:00 2001 From: Philip Rinn Date: Fri, 30 Sep 2016 22:51:46 +0200 Subject: [PATCH 226/232] Fix buffer overflow in dcraw Apply patch from https://github.com/LibRaw/LibRaw/commit/89d065424f09b788f443734d44857289489ca9e2, this fixes CVE-2015-8366. --- rtengine/dcraw.cc | 5 +- rtengine/dcraw.patch | 114 ++++++++++++++++++++++++------------------- 2 files changed, 67 insertions(+), 52 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 2bcb0175e..3593f2777 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -3221,7 +3221,10 @@ void CLASS smal_decode_segment (unsigned seg[2][2], int holes) diff = diff ? -diff : 0x80; if (ftell(ifp) + 12 >= seg[1][1]) diff = 0; - raw_image[pix] = pred[pix & 1] += diff; + if(pix>=raw_width*raw_height) + derror(); + else + raw_image[pix] = pred[pix & 1] += diff; if (!(pix & 1) && HOLE(pix / raw_width)) pix += 2; } maximum = 0xff; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index ad2997ae0..82f2ec9b8 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2016-06-04 20:34:18.405932434 +0200 -+++ dcraw.cc 2016-07-09 17:40:46.405632563 +0200 +--- dcraw.c 2016-09-30 21:19:28.312191811 +0200 ++++ dcraw.cc 2016-09-30 22:41:28.157442526 +0200 @@ -1,3 +1,16 @@ +/*RT*/#include +/*RT*/#include @@ -778,7 +778,19 @@ } void CLASS samsung_load_raw() -@@ -3038,7 +3354,7 @@ +@@ -2905,7 +3221,10 @@ + diff = diff ? -diff : 0x80; + if (ftell(ifp) + 12 >= seg[1][1]) + diff = 0; +- raw_image[pix] = pred[pix & 1] += diff; ++ if(pix>=raw_width*raw_height) ++ derror(); ++ else ++ raw_image[pix] = pred[pix & 1] += diff; + if (!(pix & 1) && HOLE(pix / raw_width)) pix += 2; + } + maximum = 0xff; +@@ -3038,7 +3357,7 @@ void CLASS foveon_decoder (unsigned size, unsigned code) { @@ -787,7 +799,7 @@ struct decode *cur; int i, len; -@@ -3135,7 +3451,7 @@ +@@ -3135,7 +3454,7 @@ pred[c] += diff[dindex->leaf]; if (pred[c] >> 16 && ~pred[c] >> 16) derror(); } @@ -796,7 +808,7 @@ } } } -@@ -3746,6 +4062,8 @@ +@@ -3746,6 +4065,8 @@ if (load_raw == &CLASS phase_one_load_raw || load_raw == &CLASS phase_one_load_raw_c) phase_one_correct(); @@ -805,7 +817,7 @@ if (fuji_width) { for (row=0; row < raw_height-top_margin*2; row++) { for (col=0; col < fuji_width << !fuji_layout; col++) { -@@ -3761,10 +4079,13 @@ +@@ -3761,10 +4082,13 @@ } } } else { @@ -821,7 +833,7 @@ if (mask[0][3] > 0) goto mask_set; if (load_raw == &CLASS canon_load_raw || load_raw == &CLASS lossless_jpeg_load_raw) { -@@ -4366,239 +4687,8 @@ +@@ -4366,239 +4690,8 @@ } } @@ -872,7 +884,8 @@ - This algorithm is officially called: - - "Interpolation using a Threshold-based variable number of gradients" -- ++/* RT: delete interpolation functions */ + - described in http://scien.stanford.edu/pages/labsite/1999/psych221/projects/99/tingchen/algodep/vargra.html - - I've extended the basic idea to work with non-Bayer filter arrays. @@ -1016,8 +1029,7 @@ - - border_interpolate(3); - if (verbose) fprintf (stderr,_("PPG interpolation...\n")); -+/* RT: delete interpolation functions */ - +- -/* Fill in the green layer with gradients and pattern recognition: */ - for (row=3; row < height-3; row++) - for (col=3+(FC(row,3) & 1), c=FC(row,col); col < width-3; col+=2) { @@ -1062,7 +1074,7 @@ void CLASS cielab (ushort rgb[3], short lab[3]) { -@@ -4864,112 +4954,7 @@ +@@ -4864,112 +4957,7 @@ } #undef fcol @@ -1175,7 +1187,7 @@ #undef TS void CLASS median_filter() -@@ -5139,7 +5124,7 @@ +@@ -5139,7 +5127,7 @@ } } @@ -1184,7 +1196,7 @@ void CLASS parse_makernote (int base, int uptag) { -@@ -5244,6 +5229,11 @@ +@@ -5244,6 +5232,11 @@ tag |= uptag << 16; if (tag == 2 && strstr(make,"NIKON") && !iso_speed) iso_speed = (get2(),get2()); @@ -1196,7 +1208,7 @@ if (tag == 4 && len > 26 && len < 35) { if ((i=(get4(),get2())) != 0x7fff && !iso_speed) iso_speed = 50 * pow (2, i/32.0 - 4); -@@ -5296,12 +5286,16 @@ +@@ -5296,12 +5289,16 @@ cam_mul[2] = get4() << 2; } } @@ -1214,7 +1226,7 @@ if (tag == 0x1d) while ((c = fgetc(ifp)) && c != EOF) serial = serial*10 + (isdigit(c) ? c - '0' : c % 10); -@@ -5491,14 +5485,14 @@ +@@ -5491,14 +5488,14 @@ while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { @@ -1232,7 +1244,7 @@ shutter = pow (2, expo); break; case 37378: aperture = pow (2, getreal(type)/2); break; case 37386: focal_len = getreal(type); break; -@@ -5667,28 +5661,33 @@ +@@ -5667,28 +5664,33 @@ } } @@ -1272,7 +1284,7 @@ entries = get2(); if (entries > 512) return 1; while (entries--) { -@@ -5758,7 +5757,8 @@ +@@ -5758,7 +5760,8 @@ fgets (make, 64, ifp); break; case 272: /* Model */ @@ -1282,7 +1294,7 @@ break; case 280: /* Panasonic RW2 offset */ if (type != 4) break; -@@ -5818,6 +5818,9 @@ +@@ -5818,6 +5821,9 @@ case 315: /* Artist */ fread (artist, 64, 1, ifp); break; @@ -1292,7 +1304,7 @@ case 322: /* TileWidth */ tiff_ifd[ifd].tile_width = getint(type); break; -@@ -5833,6 +5836,9 @@ +@@ -5833,6 +5839,9 @@ is_raw = 5; } break; @@ -1302,7 +1314,7 @@ case 330: /* SubIFDs */ if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) { load_raw = &CLASS sony_arw_load_raw; -@@ -5846,6 +5852,9 @@ +@@ -5846,6 +5855,9 @@ fseek (ifp, i+4, SEEK_SET); } break; @@ -1312,7 +1324,7 @@ case 400: strcpy (make, "Sarnoff"); maximum = 0xfff; -@@ -6063,12 +6072,21 @@ +@@ -6063,12 +6075,21 @@ case 61450: cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ @@ -1340,7 +1352,7 @@ case 50715: /* BlackLevelDeltaH */ case 50716: /* BlackLevelDeltaV */ for (num=i=0; i < (len & 0xffff); i++) -@@ -6085,13 +6103,13 @@ +@@ -6085,13 +6106,13 @@ case 50721: /* ColorMatrix1 */ case 50722: /* ColorMatrix2 */ FORCC for (j=0; j < 3; j++) @@ -1356,7 +1368,7 @@ break; case 50727: /* AnalogBalance */ FORCC ab[c] = getreal(type); -@@ -6114,6 +6132,11 @@ +@@ -6114,6 +6135,11 @@ case 50752: read_shorts (cr2_slice, 3); break; @@ -1368,7 +1380,7 @@ case 50829: /* ActiveArea */ top_margin = getint(type); left_margin = getint(type); -@@ -6146,21 +6169,27 @@ +@@ -6146,21 +6172,27 @@ fread (buf, sony_length, 1, ifp); sony_decrypt (buf, sony_length/4, 1, sony_key); sfp = ifp; @@ -1404,7 +1416,7 @@ cam_xyz_coeff (cmatrix, cam_xyz); } if (asn[0]) { -@@ -6168,13 +6197,14 @@ +@@ -6168,13 +6200,14 @@ FORCC cam_mul[c] = 1 / asn[c]; } if (!use_cm) @@ -1420,7 +1432,7 @@ fseek (ifp, base, SEEK_SET); order = get2(); -@@ -6206,6 +6236,7 @@ +@@ -6206,6 +6239,7 @@ shutter = tiff_ifd[i].shutter; tiff_ifd[i].shutter = shutter; } @@ -1428,7 +1440,7 @@ for (i=0; i < tiff_nifds; i++) { if (max_samp < tiff_ifd[i].samples) max_samp = tiff_ifd[i].samples; -@@ -6266,7 +6297,12 @@ +@@ -6266,7 +6300,12 @@ case 8: load_raw = &CLASS eight_bit_load_raw; break; case 12: if (tiff_ifd[raw].phint == 2) load_flags = 6; @@ -1442,7 +1454,7 @@ case 14: load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && -@@ -6305,6 +6341,7 @@ +@@ -6305,6 +6344,7 @@ case 32803: load_raw = &CLASS kodak_65000_load_raw; } case 32867: case 34892: break; @@ -1450,7 +1462,7 @@ default: is_raw = 0; } if (!dng_version) -@@ -6390,7 +6427,7 @@ +@@ -6390,7 +6430,7 @@ { const char *file, *ext; char *jname, *jfile, *jext; @@ -1459,7 +1471,7 @@ ext = strrchr (ifname, '.'); file = strrchr (ifname, '/'); -@@ -6412,13 +6449,14 @@ +@@ -6412,13 +6452,14 @@ } else while (isdigit(*--jext)) { if (*jext != '9') { @@ -1476,7 +1488,7 @@ if (verbose) fprintf (stderr,_("Reading metadata from %s ...\n"), jname); parse_tiff (12); -@@ -6693,6 +6731,7 @@ +@@ -6693,6 +6734,7 @@ load_raw = ph1.format < 3 ? &CLASS phase_one_load_raw : &CLASS phase_one_load_raw_c; maximum = 0xffff; @@ -1484,7 +1496,7 @@ strcpy (make, "Phase One"); if (model[0]) return; switch (raw_height) { -@@ -6761,7 +6800,11 @@ +@@ -6761,7 +6803,11 @@ order = get2(); hlen = get4(); if (get4() == 0x48454150) /* "HEAP" */ @@ -1496,7 +1508,7 @@ if (parse_tiff (save+6)) apply_tiff(); fseek (ifp, save+len, SEEK_SET); } -@@ -7033,7 +7076,8 @@ +@@ -7033,7 +7079,8 @@ { static const struct { const char *prefix; @@ -1506,7 +1518,7 @@ } table[] = { { "AgfaPhoto DC-833m", 0, 0, /* DJC */ { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, -@@ -7977,12 +8021,12 @@ +@@ -7977,12 +8024,12 @@ { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, { "Sony DSC-RX100", 0, 0, { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, @@ -1521,7 +1533,7 @@ { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, -@@ -8088,6 +8132,33 @@ +@@ -8088,6 +8135,33 @@ } break; } @@ -1555,7 +1567,7 @@ } void CLASS simple_coeff (int index) -@@ -8410,7 +8481,7 @@ +@@ -8410,7 +8484,7 @@ tiff_flip = flip = filters = UINT_MAX; /* unknown */ raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; maximum = height = width = top_margin = left_margin = 0; @@ -1564,7 +1576,7 @@ iso_speed = shutter = aperture = focal_len = unique_id = 0; tiff_nifds = 0; memset (tiff_ifd, 0, sizeof tiff_ifd); -@@ -8442,13 +8513,20 @@ +@@ -8442,13 +8516,20 @@ fread (head, 1, 32, ifp); fseek (ifp, 0, SEEK_END); flen = fsize = ftell(ifp); @@ -1587,7 +1599,7 @@ parse_ciff (hlen, flen-hlen, 0); load_raw = &CLASS canon_load_raw; } else if (parse_tiff(0)) apply_tiff(); -@@ -8494,6 +8572,7 @@ +@@ -8494,6 +8575,7 @@ fseek (ifp, 100+28*(shot_select > 0), SEEK_SET); parse_tiff (data_offset = get4()); parse_tiff (thumb_offset+12); @@ -1595,7 +1607,7 @@ apply_tiff(); } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); -@@ -8607,9 +8686,10 @@ +@@ -8607,9 +8689,10 @@ if (make[0] == 0) parse_smal (0, flen); if (make[0] == 0) { parse_jpeg(0); @@ -1609,7 +1621,7 @@ strcpy (make, "OmniVision"); data_offset = ftell(ifp) + 0x8000-32; width = raw_width; -@@ -8618,6 +8698,7 @@ +@@ -8618,6 +8701,7 @@ filters = 0x16161616; } else is_raw = 0; } @@ -1617,7 +1629,7 @@ for (i=0; i < sizeof corp / sizeof *corp; i++) if (strcasestr (make, corp[i])) /* Simplify company names */ -@@ -8649,7 +8730,7 @@ +@@ -8649,7 +8733,7 @@ if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ { height = 3124; width = 4688; filters = 0x16161616; } if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) @@ -1626,7 +1638,7 @@ if (width >= 4960 && !strncmp(model,"K-5",3)) { left_margin = 10; width = 4950; filters = 0x16161616; } if (width == 4736 && !strcmp(model,"K-7")) -@@ -8669,6 +8750,7 @@ +@@ -8669,6 +8753,7 @@ case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; case 7: load_raw = &CLASS lossless_dng_load_raw; break; @@ -1634,7 +1646,7 @@ case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; } -@@ -8725,6 +8807,7 @@ +@@ -8725,6 +8810,7 @@ if (height > width) pixel_aspect = 2; filters = 0; simple_coeff(0); @@ -1642,7 +1654,7 @@ } else if (!strcmp(make,"Canon") && tiff_bps == 15) { switch (width) { case 3344: width -= 66; -@@ -9034,24 +9117,53 @@ +@@ -9034,24 +9120,53 @@ if (load_raw == &CLASS lossless_jpeg_load_raw) load_raw = &CLASS hasselblad_load_raw; if (raw_width == 7262) { @@ -1701,7 +1713,7 @@ } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); -@@ -9109,6 +9221,7 @@ +@@ -9109,6 +9224,7 @@ filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { @@ -1709,7 +1721,7 @@ if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { -@@ -9126,6 +9239,7 @@ +@@ -9126,6 +9242,7 @@ } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; @@ -1717,7 +1729,7 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -9201,13 +9315,15 @@ +@@ -9201,13 +9318,15 @@ width -= 6; } else if (!strcmp(make,"Sony") && raw_width == 7392) { width -= 30; @@ -1740,7 +1752,7 @@ } else if (!strcmp(model,"DSLR-A100")) { if (width == 3880) { height--; -@@ -9357,6 +9473,18 @@ +@@ -9357,6 +9476,18 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1759,7 +1771,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9371,9 +9499,9 @@ +@@ -9371,9 +9502,9 @@ if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; @@ -1771,7 +1783,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -9452,199 +9580,250 @@ +@@ -9452,199 +9583,250 @@ } #endif @@ -2205,7 +2217,7 @@ struct tiff_tag { ushort tag, type; int count; -@@ -9667,594 +9846,11 @@ +@@ -9667,594 +9849,11 @@ char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; From 4ca8239f3f8260f5c8c770e3cd663f7f329ff0a7 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sat, 1 Oct 2016 11:27:18 +0200 Subject: [PATCH 227/232] Deutsch translation updated by TooWaBoo, closes #3442 --- rtdata/languages/Deutsch | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 90cec593b..9c7478cf7 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -28,6 +28,7 @@ #27 2016-02-12 Retinexübersetzung (TooWaBoo) RT4.2.730 #28 2016-03-19 Erweiterung/Korrekturen (TooWaBoo) RT4.2.880 #29 2016-05-24 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1005 +#30 2016-09-30 Erweiterung/Korrekturen (TooWaBoo) RT4.2.1234 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -1380,6 +1381,12 @@ TP_DARKFRAME_LABEL;Dunkelbild TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwellenwert +TP_DIRPYRDENOISE_3X3;3×3 +TP_DIRPYRDENOISE_3X3_SOFT;3×3 weich +TP_DIRPYRDENOISE_5X5;5×5 +TP_DIRPYRDENOISE_5X5_SOFT;5×5 weich +TP_DIRPYRDENOISE_7X7;7×7 +TP_DIRPYRDENOISE_9X9;9×9 TP_DIRPYRDENOISE_ABM;Nur Farbe TP_DIRPYRDENOISE_AUT;Automatisch Global TP_DIRPYRDENOISE_AUTO;Automatisch Global @@ -1422,10 +1429,12 @@ TP_DIRPYRDENOISE_METHOD11;Qualität TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Einstellung der Qualität der Rauschreduzierung. Die Einstellung “Hoch“ verbessert die Rauschreduzierung auf Kosten der Verarbeitungszeit. TP_DIRPYRDENOISE_METHOD_TOOLTIP;Für RAW-Bilder kann entweder die RGB- oder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der Auswahl immer die L*a*b*-Methode verwendet. TP_DIRPYRDENOISE_METM_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“, wird der Medianfilter nach den Waveletschritten verarbeitet.\nBei RGB wird der Medianfilter am Ende der Rauschreduzierung verarbeitet. +TP_DIRPYRDENOISE_MET_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen. Je größer das Fenster, umso länger dauert die Verarbeitungszeit.\n\n3×3 weich: Nutzt 5 Pixel in einem 3×3-Pixelfenster.\n3×3: Nutzt 9 Pixel in einem 3×3-Pixelfenster.\n5×5 weich: Nutzt 13 Pixel in einem 5×5-Pixelfenster.\n5×5: Nutzt 25 Pixel in einem 5×5-Pixelfenster.\n7×7: Nutzt 49 Pixel in einem 7×7-Pixelfenster.\n9×9: Nutzt 81 Pixel in einem 9×9-Pixelfenster.\n\nManchmal ist das Ergebnis mit einem kleineren Fenster und mehreren Iterationen besser, als mit einem größeren und nur einer Iteration. TP_DIRPYRDENOISE_NOISELABEL;Rauschen: Mittelwert=%1 Hoch=%2 TP_DIRPYRDENOISE_NOISELABELEMPTY;Rauschen: Mittelwert = --- Hoch = --- TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs in der 100%-Ansicht an.\n\n<50: Sehr wenig Rauschen\n50 - 100: Wenig Rauschen\n100 - 300: Durchschnittliches Rauschen\n>300: Hohes Rauschen\n\nDie Werte unterscheiden sich im L*a*b*- und RGB-Modus. Die RGB-Werte sind ungenauer, da der RGB-Modus Luminanz und Chrominanz nicht komplett trennt. TP_DIRPYRDENOISE_PASSES;Medianiterationen +TP_DIRPYRDENOISE_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit mehreren Iterationen zu besseren Ergebnissen als ein 7×7-Fenster mit nur einer Iteration. TP_DIRPYRDENOISE_PON;Auto-Multizonen TP_DIRPYRDENOISE_PRE;Vorschau TP_DIRPYRDENOISE_PREV;Vorschau @@ -1490,7 +1499,7 @@ TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewichteter Standard TP_EXPOS_BLACKPOINT_LABEL;Schwarzpunkt TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt TP_FILMSIMULATION_LABEL;Filmsimulation -TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Film Simulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden? TP_FILMSIMULATION_STRENGTH;Intensität TP_FILMSIMULATION_ZEROCLUTSFOUND;HaldCLUT-Verzeichnis in den Einstellungen festlegen TP_FLATFIELD_AUTOSELECT;Automatische Auswahl @@ -1953,7 +1962,7 @@ TP_WAVELET_NPHIGH;Hoch TP_WAVELET_NPLOW;Niedrig TP_WAVELET_NPNONE;Keine TP_WAVELET_NPTYPE;Benachbarte Pixel -TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet einen Pixel und acht seiner Nachbarn. Sind die Unterschiede gering, werden die Kanten geschärft. +TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet ein Pixel und acht seiner Nachbarn. Sind die Unterschiede gering, werden die Kanten geschärft. TP_WAVELET_OPACITY;Deckkraft Blau/Gelb TP_WAVELET_OPACITYW;Kontrastausgleichskurve TP_WAVELET_OPACITYWL;Lokale Kontrastkurve @@ -2045,15 +2054,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. From ca0afa8d5f3cc7d09b6bab32d155a87c550f0d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 1 Oct 2016 12:38:24 +0200 Subject: [PATCH 228/232] Fix incompatibility with glibmm 2.50 (#3440) Kudos to @Hombre57 for the suggestion. --- rtgui/dirbrowser.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index d3fc8bf79..6f25f0f47 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -59,7 +59,7 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool } catch (const Glib::Exception& exception) { if (options.rtSettings.verbose) { - std::cerr << "Failed to list subdirectories of \"" << dir << "\": " << exception.what () << std::endl; + std::cerr << "Failed to list subdirectories of \"" << dir->get_basename() << "\": " << exception.what () << std::endl; } } From 6d85d350397712bf166ca93a287878878f4c45ee Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 3 Oct 2016 22:05:02 +0200 Subject: [PATCH 229/232] Removed non-ASCII characters from code files, closes #3445 --- rtengine/EdgePreservingDecomposition.h | 87 +++++++++++++++----------- rtengine/boxblur.h | 2 +- rtengine/cache.h | 2 +- rtengine/camconst.json | 2 +- rtengine/colortemp.cc | 8 +-- rtengine/dirpyrLab_equalizer.cc | 2 +- rtengine/dirpyr_equalizer.cc | 2 +- rtengine/median.h | 2 +- rtengine/settings.h | 2 +- rtgui/dirpyrequalizer.cc | 2 +- rtgui/dirpyrequalizer.h | 2 +- 11 files changed, 65 insertions(+), 48 deletions(-) diff --git a/rtengine/EdgePreservingDecomposition.h b/rtengine/EdgePreservingDecomposition.h index 558caa5db..04ebfe3b6 100644 --- a/rtengine/EdgePreservingDecomposition.h +++ b/rtengine/EdgePreservingDecomposition.h @@ -1,47 +1,64 @@ #pragma once /* -The EdgePreservingDecomposition files contain standard C++ (standard except the first line) code for creating and, to a -limited extent (create your own uses!), messing with multi scale edge preserving decompositions of a 32 bit single channel -image. As a byproduct it contains a lot of linear algebra which can be useful for optimization problems that -you want to solve in rectangles on rectangular grids. +The EdgePreservingDecomposition files contain standard C++ (standard except the +first line) code for creating and, to a limited extent (create your own uses!), +messing with multi scale edge preserving decompositions of a 32 bit single +channel image. As a byproduct it contains a lot of linear algebra which can be +useful for optimization problems that you want to solve in rectangles on +rectangular grids. -Anyway. Basically, this is an implementation of what's presented in the following papers: - Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation - An Iterative Solution Method for Linear Systems of Which the Coefficient Matrix is a Symetric M-Matrix - Color correction for tone mapping - Wikipedia, the free encyclopedia +Anyway. Basically, this is an implementation of what's presented in the +following papers: +- Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation +- An Iterative Solution Method for Linear Systems of Which the Coefficient + Matrix is a Symetric M-Matrix +- Color correction for tone mapping +- Wikipedia, the free encyclopedia -First one is most of what matters, next two are details, last everything else. I did a few things differently, especially: - Reformulated the minimization with finite elements instead of finite differences. This results in better conditioning, - slightly better accuracy (less artifacts), the possibility of a better picked edge stopping function, but more memory consumption. - - A single rotationally invariant edge stopping function is used instead of two non-invariant ones. - - Incomplete Cholseky factorization instead of Szeliski's LAHBF. Slower, but not subject to any patents. - - For tone mapping, original images are decomposed instead of their logarithms, and just one decomposition is made; - I find that this way works plenty good (theirs isn't better or worse... just different) and is simpler. +First one is most of what matters, next two are details, last everything else. +I did a few things differently, especially: +- Reformulated the minimization with finite elements instead of finite + differences. This results in better conditioning, slightly better accuracy + (less artifacts), the possibility of a better picked edge stopping function, + but more memory consumption. +- A single rotationally invariant edge stopping function is used instead of two + non-invariant ones. +- Incomplete Cholseky factorization instead of Szeliski's LAHBF. Slower, but + not subject to any patents. +- For tone mapping, original images are decomposed instead of their logarithms, + and just one decomposition is made; +- I find that this way works plenty good (theirs isn't better or worse... just + different) and is simpler. Written by ben_pcc in Portland, Oregon, USA. Some history: - Late April 2010, I develop interest in this stuff because photos of my ceramics lack local contrast. - Mid 2010, it works but is too slow to be useful. - Fall 2010, various unsuccessful attempts at speeding up are tried. - Early December 2010, I get off the path of least resistance and write a matrix storage class with incomplete Cholesky decomposition. - 31 December 2010, the FEM reformulation works very well. - 1 January 2011, I'm cleaning up this file and readying it for initial release. - 12 - 14 November 2011, further cleanup, improvements, bug fixes, integration into Raw Therapee. +- Late April 2010, I develop interest in this stuff because photos of my + ceramics lack local contrast. +- Mid 2010, it works but is too slow to be useful. +- Fall 2010, various unsuccessful attempts at speeding up are tried. +- Early December 2010, I get off the path of least resistance and write a + matrix storage class with incomplete Cholesky decomposition. +- 31 December 2010, the FEM reformulation works very well. +- 1 January 2011, I'm cleaning up this file and readying it for initial release. +- 12 - 14 November 2011, further cleanup, improvements, bug fixes, integration + into Raw Therapee. -It's likely that I'll take apart and rerelease contents of this file (in the distant future) as most of it isn't edge preserving decomposition -and rather supporting material. SparseConjugateGradient alone is a workhorse I and a few others have been exploiting for a few years. +It's likely that I'll take apart and rerelease contents of this file (in the +distant future) as most of it isn't edge preserving decomposition and rather +supporting material. SparseConjugateGradient alone is a workhorse I and a few +others have been exploiting for a few years. -EdgePreservingDecomposition.h and EdgePreservingDecomposition.cpp are released under the following licence: - � It's free. - � You may not incorporate this code as part of proprietary or commercial software, but via freeware you may use its output for profit. - � You may modify and redistribute, but keep this big comment block intact and not for profit in any way unless I give specific permission. - � If you're unsure about anything else, treat as public domain. - � Don't be a dick. +EdgePreservingDecomposition.h and EdgePreservingDecomposition.cpp are released +under the following licence: +- It's free. +- You may not incorporate this code as part of proprietary or commercial + software, but via freeware you may use its output for profit. +- You may modify and redistribute, but keep this big comment block intact and + not for profit in any way unless I give specific permission. +- If you're unsure about anything else, treat as public domain. +- Don't be a dick. -My email address is my screen name followed by @yahoo.com. I'm also known as ben_s or nonbasketless. Enjoy! +My email address is my screen name followed by @yahoo.com. I'm also known as +ben_s or nonbasketless. Enjoy! */ diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index b360c3042..0fa31fc2a 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright © 2010 Emil Martinec + * Copyright (C) 2010 Emil Martinec * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rtengine/cache.h b/rtengine/cache.h index 2e53aab2a..f14d7c6d9 100644 --- a/rtengine/cache.h +++ b/rtengine/cache.h @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (c) 2016 Flössie + * Copyright (C) 2016 Floessie * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rtengine/camconst.json b/rtengine/camconst.json index bba957405..cf3e976ce 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1457,7 +1457,7 @@ Quality X: unknown, ie we knowing to little about the camera properties to know "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset }, - { // Quality Β, + { // Quality B, "make_model": [ "Panasonic DMC-FZ300", "Panasonic DMC-FZ330" ], "dcraw_matrix": [ 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 ], // DNG-V9.1.1 "ranges": { "black": 15, "white": 4050 } // 15 is BL offset. Dcraw/RT read the base offset from exif and calculates total BL = BLbase+BLoffset diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 8d3847e79..7b271960d 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -34,7 +34,7 @@ namespace rtengine extern const Settings* settings; -static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis observer 2� +static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2 degree Standard Observer. {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, {0.001368, 0.000039, 0.006450001}, {0.002236, 0.000064, 0.01054999}, {0.004243, 0.000120, 0.02005001}, @@ -295,7 +295,7 @@ const double ColorTemp::Solux4100_spect[97] = { 62.40, 61.373, 59.75, 58.1810, 56.25, 54.395, 51.90, 49.496, 47.05, 44.620 }; -//spectral data for Solux lamp : near Daylight (for example "mus�e d'Orsay..") - 4700K +//spectral data for Solux lamp : near Daylight (for example "Musee d'Orsay") - 4700K const double ColorTemp::Solux4700_spect[97] = { 0.4590, 0.83, 1.2011, 1.53, 1.8647, 2.15, 2.5338, 3.06, 3.5809, 3.99, 4.4137, 4.82, 5.2228, 5.63, 6.0387, 6.53, 6.9944, 7.55, 8.0266, 8.475, 8.9276, 8.90, 9.7840, 10.20, 10.6390, 11.00, 11.3600, 11.75, 12.1340, 12.36, 12.5880, 12.74, 12.8790, 13.07, 13.2560, 13.38, 13.5220, 13.41, 13.3070, 13.35, 13.3990, 13.37, 13.3420, 13.39, 13.4220, 13.65, 13.2710, 13.25, 13.2330, 13.12, 13.0110, 12.93, 12.8470, 12.805, 12.7630, 12.66, 12.5760, 12.563, 12.5490, @@ -1797,7 +1797,7 @@ The next 3 methods are inspired from: this values are often called xBar yBar zBar and are characteristics of a color / illuminant -values cie_colour_match[][3] = Observer 2� x2, y2, z2 +values cie_colour_match[][3] = Observer 2 degree Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increase precision used by J.Walker and pass to 350nm to 830nm */ @@ -1855,7 +1855,7 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou this values are often called xBar yBar zBar and are characteristics of a color / illuminant - values cie_colour_match[][3] = Observer 2� x2, y2, z2 + values cie_colour_match[][3] = 2 degree Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increased the precision used by J.Walker and pass from 350nm to 830nm */ diff --git a/rtengine/dirpyrLab_equalizer.cc b/rtengine/dirpyrLab_equalizer.cc index 93a1b1ff1..fc5fc70a0 100644 --- a/rtengine/dirpyrLab_equalizer.cc +++ b/rtengine/dirpyrLab_equalizer.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * © 2010 Emil Martinec + * (C) 2010 Emil Martinec * */ diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index f82b7f8bf..a3a6d81b0 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * © 2010 Emil Martinec + * (C) 2010 Emil Martinec * */ diff --git a/rtengine/median.h b/rtengine/median.h index d7a6b37de..b30a9354e 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * These median implementations from Flössie and Ingo Weyrich are inspired by this work: + * These median implementations from Floessie and Ingo Weyrich are inspired by this work: * * http://ndevilla.free.fr/median/median.pdf * http://pages.ripco.net/~jgamble/nw.html diff --git a/rtengine/settings.h b/rtengine/settings.h index 4053a547f..8810322be 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -71,7 +71,7 @@ public: int nrwavlevel; bool daubech; bool ciebadpixgauss; - int CRI_color; // N� for display Lab value ; 0 disabled + int CRI_color; // Number for display Lab value; 0 = disabled int denoiselabgamma; // 0=gamma 26 11 1=gamma 40 5 2 =gamma 55 10 // double colortoningab; // // double decaction; diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc index 7996a340e..53b4805ff 100644 --- a/rtgui/dirpyrequalizer.cc +++ b/rtgui/dirpyrequalizer.cc @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * © 2010 Emil Martinec + * (C) 2010 Emil Martinec */ #include "dirpyrequalizer.h" diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index 9b806989c..d30e4d307 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * © 2010 Emil Martinec + * (C) 2010 Emil Martinec */ #ifndef DIRPYREQUALIZER_H_INCLUDED From 1c9b84aadba560d75e44357992afd49f81252c8e Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 3 Oct 2016 22:44:13 +0200 Subject: [PATCH 230/232] Moved RT.ico from rtgui into rtdata/icons/ --- {rtgui => rtdata/icons}/RT.ico | Bin rtgui/myicon.rc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {rtgui => rtdata/icons}/RT.ico (100%) diff --git a/rtgui/RT.ico b/rtdata/icons/RT.ico similarity index 100% rename from rtgui/RT.ico rename to rtdata/icons/RT.ico diff --git a/rtgui/myicon.rc b/rtgui/myicon.rc index 94f2ab31a..b5f390783 100644 --- a/rtgui/myicon.rc +++ b/rtgui/myicon.rc @@ -1 +1 @@ -1 ICON "RT.ico" +1 ICON "../rtdata/icons/RT.ico" From 162c65e69657f924f1690d2d124f3689d9909b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 4 Oct 2016 20:36:28 +0200 Subject: [PATCH 231/232] Use `get_parse_name()` in `rtgui/dirbrowser.cc` (#3444) This will print the full path and is consistent with the gtk3 branch. --- rtgui/dirbrowser.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 6f25f0f47..9eaf38587 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -59,7 +59,7 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool } catch (const Glib::Exception& exception) { if (options.rtSettings.verbose) { - std::cerr << "Failed to list subdirectories of \"" << dir->get_basename() << "\": " << exception.what () << std::endl; + std::cerr << "Failed to list subdirectories of \"" << dir->get_parse_name() << "\": " << exception.what () << std::endl; } } From 897b9d92ee4f6472141f9960950fbe21dc0c2116 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 5 Oct 2016 21:32:45 +0200 Subject: [PATCH 232/232] Fix non-ASCII characters, fixes #3445 --- rtengine/cache.h | 2 +- rtengine/colortemp.cc | 8 ++++---- rtengine/median.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/cache.h b/rtengine/cache.h index f14d7c6d9..ea567542c 100644 --- a/rtengine/cache.h +++ b/rtengine/cache.h @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (C) 2016 Floessie + * Copyright (C) 2016 Flössie * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 7b271960d..1514357d8 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -34,7 +34,7 @@ namespace rtengine extern const Settings* settings; -static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2 degree Standard Observer. +static const double cie_colour_match_jd[97][3] = {//350nm to 830nm 5 nm J.Desmis 2° Standard Observer. {0.0000000, 0.000000, 0.000000}, {0.0000000, 0.000000, 0.000000}, {0.0001299, 0.0003917, 0.0006061}, {0.0002321, 0.000006965, 0.001086}, {0.0004149, 0.00001239, 0.001946}, {0.0007416, 0.00002202, 0.003846}, {0.001368, 0.000039, 0.006450001}, {0.002236, 0.000064, 0.01054999}, {0.004243, 0.000120, 0.02005001}, @@ -295,7 +295,7 @@ const double ColorTemp::Solux4100_spect[97] = { 62.40, 61.373, 59.75, 58.1810, 56.25, 54.395, 51.90, 49.496, 47.05, 44.620 }; -//spectral data for Solux lamp : near Daylight (for example "Musee d'Orsay") - 4700K +//spectral data for Solux lamp : near Daylight (for example "Musée d'Orsay") - 4700K const double ColorTemp::Solux4700_spect[97] = { 0.4590, 0.83, 1.2011, 1.53, 1.8647, 2.15, 2.5338, 3.06, 3.5809, 3.99, 4.4137, 4.82, 5.2228, 5.63, 6.0387, 6.53, 6.9944, 7.55, 8.0266, 8.475, 8.9276, 8.90, 9.7840, 10.20, 10.6390, 11.00, 11.3600, 11.75, 12.1340, 12.36, 12.5880, 12.74, 12.8790, 13.07, 13.2560, 13.38, 13.5220, 13.41, 13.3070, 13.35, 13.3990, 13.37, 13.3420, 13.39, 13.4220, 13.65, 13.2710, 13.25, 13.2330, 13.12, 13.0110, 12.93, 12.8470, 12.805, 12.7630, 12.66, 12.5760, 12.563, 12.5490, @@ -1797,7 +1797,7 @@ The next 3 methods are inspired from: this values are often called xBar yBar zBar and are characteristics of a color / illuminant -values cie_colour_match[][3] = Observer 2 degree Standard Observer x2, y2, z2 +values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increase precision used by J.Walker and pass to 350nm to 830nm */ @@ -1855,7 +1855,7 @@ void ColorTemp::spectrum_to_xyz_preset(const double* spec_intens, double &x, dou this values are often called xBar yBar zBar and are characteristics of a color / illuminant - values cie_colour_match[][3] = 2 degree Standard Observer x2, y2, z2 + values cie_colour_match[][3] = 2° Standard Observer x2, y2, z2 E.g. for 380nm: x2=0.001368 y2=0.000039 z2=0.006451 round in J.Walker to 0.0014 0.0000 0.0065 above I have increased the precision used by J.Walker and pass from 350nm to 830nm */ diff --git a/rtengine/median.h b/rtengine/median.h index b30a9354e..d7a6b37de 100644 --- a/rtengine/median.h +++ b/rtengine/median.h @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . * - * These median implementations from Floessie and Ingo Weyrich are inspired by this work: + * These median implementations from Flössie and Ingo Weyrich are inspired by this work: * * http://ndevilla.free.fr/median/median.pdf * http://pages.ripco.net/~jgamble/nw.html

      j#|c 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 z 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