From bc8b8902e643fcf2f0771b42b1badd6da902ca9e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 20 Nov 2017 00:10:51 +0100 Subject: [PATCH 001/200] make rtengine::processImage return an Imagefloat instead of an Image16 This is for supporting saving to 32-bit float TIFFs --- rtengine/image16.cc | 80 +++++++++++++++++------------------ rtengine/image16.h | 2 +- rtengine/imagefloat.cc | 62 +++++++++++++++++++++++++++ rtengine/imagefloat.h | 1 + rtengine/improccoordinator.cc | 15 +++---- rtengine/improcfun.h | 6 +-- rtengine/iplab2rgb.cc | 13 +++--- rtengine/ipresize.cc | 10 ++--- rtengine/rtengine.h | 4 +- rtengine/simpleprocess.cc | 20 ++++----- rtgui/batchqueue.cc | 2 +- rtgui/batchqueue.h | 2 +- rtgui/editorpanel.cc | 26 ++++++------ rtgui/editorpanel.h | 8 ++-- rtgui/main-cli.cc | 2 +- 15 files changed, 157 insertions(+), 96 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index e0f7470a6..1bd0680d0 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -325,50 +325,50 @@ Image16::tofloat() return imgfloat; } -// Parallized transformation; create transform with cmsFLAGS_NOCACHE! -void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) -{ - // LittleCMS cannot parallelize planar Lab float images - // so build temporary buffers to allow multi processor execution -#ifdef _OPENMP - #pragma omp parallel -#endif - { - AlignedBuffer bufferLab(width * 3); - AlignedBuffer bufferRGB(width * 3); +// // Parallized transformation; create transform with cmsFLAGS_NOCACHE! +// void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) +// { +// // LittleCMS cannot parallelize planar Lab float images +// // so build temporary buffers to allow multi processor execution +// #ifdef _OPENMP +// #pragma omp parallel +// #endif +// { +// AlignedBuffer bufferLab(width * 3); +// AlignedBuffer bufferRGB(width * 3); -#ifdef _OPENMP - #pragma omp for schedule(static) -#endif +// #ifdef _OPENMP +// #pragma omp for schedule(static) +// #endif - for (int y = cy; y < cy + height; y++) - { - unsigned short *pRGB, *pR, *pG, *pB; - float *pLab, *pL, *pa, *pb; +// for (int y = cy; y < cy + height; y++) +// { +// unsigned short *pRGB, *pR, *pG, *pB; +// float *pLab, *pL, *pa, *pb; - pLab= bufferLab.data; - pL = labImage.L[y] + cx; - pa = labImage.a[y] + cx; - pb = labImage.b[y] + cx; +// pLab= bufferLab.data; +// pL = labImage.L[y] + cx; +// pa = labImage.a[y] + cx; +// pb = labImage.b[y] + cx; - for (int x = 0; x < width; x++) { - *(pLab++) = *(pL++) / 327.68f; - *(pLab++) = *(pa++) / 327.68f; - *(pLab++) = *(pb++) / 327.68f; - } +// for (int x = 0; x < width; x++) { +// *(pLab++) = *(pL++) / 327.68f; +// *(pLab++) = *(pa++) / 327.68f; +// *(pLab++) = *(pb++) / 327.68f; +// } - cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); +// cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); - pRGB = bufferRGB.data; - pR = r(y - cy); - pG = g(y - cy); - pB = b(y - cy); +// pRGB = bufferRGB.data; +// pR = r(y - cy); +// pG = g(y - cy); +// pB = b(y - cy); - for (int x = 0; x < width; x++) { - *(pR++) = *(pRGB++); - *(pG++) = *(pRGB++); - *(pB++) = *(pRGB++); - } - } // End of parallelization - } -} +// for (int x = 0; x < width; x++) { +// *(pR++) = *(pRGB++); +// *(pG++) = *(pRGB++); +// *(pB++) = *(pRGB++); +// } +// } // End of parallelization +// } +// } diff --git a/rtengine/image16.h b/rtengine/image16.h index 4d74dfbc4..ee402d556 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -96,7 +96,7 @@ public: delete this; } - void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); + /* void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); */ }; } diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 30871c9b1..41b10552a 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -154,11 +154,25 @@ void Imagefloat::getScanline (int row, unsigned char* buffer, int bps) int ix = 0; float* sbuffer = (float*) buffer; + // agriggio -- assume the image is normalized to [0, 65535] for (int i = 0; i < width; i++) { + sbuffer[ix++] = r(row, i) / 65535.f; + sbuffer[ix++] = g(row, i) / 65535.f; + sbuffer[ix++] = b(row, i) / 65535.f; + } + } else if (bps == 16) { + unsigned short *sbuffer = (unsigned short *)buffer; + for (int i = 0, ix = 0; i < width; i++) { sbuffer[ix++] = r(row, i); sbuffer[ix++] = g(row, i); sbuffer[ix++] = b(row, i); } + } else if (bps == 8) { + for (int i = 0, ix = 0; i < width; i++) { + buffer[ix++] = rtengine::uint16ToUint8Rounded(r(row, i)); + buffer[ix++] = rtengine::uint16ToUint8Rounded(g(row, i)); + buffer[ix++] = rtengine::uint16ToUint8Rounded(b(row, i)); + } } } @@ -511,3 +525,51 @@ void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) } // End of parallelization } } + +// Parallized transformation; create transform with cmsFLAGS_NOCACHE! +void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) +{ + // LittleCMS cannot parallelize planar Lab float images + // so build temporary buffers to allow multi processor execution +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer bufferLab(width * 3); + AlignedBuffer bufferRGB(width * 3); + +#ifdef _OPENMP + #pragma omp for schedule(static) +#endif + + for (int y = cy; y < cy + height; y++) + { + float *pRGB, *pR, *pG, *pB; + float *pLab, *pL, *pa, *pb; + + pLab= bufferLab.data; + pL = labImage.L[y] + cx; + pa = labImage.a[y] + cx; + pb = labImage.b[y] + cx; + + for (int x = 0; x < width; x++) { + *(pLab++) = *(pL++) / 327.68f; + *(pLab++) = *(pa++) / 327.68f; + *(pLab++) = *(pb++) / 327.68f; + } + + cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); + + pRGB = bufferRGB.data; + pR = r(y - cy); + pG = g(y - cy); + pB = b(y - cy); + + for (int x = 0; x < width; x++) { + *(pR++) = *(pRGB++); + *(pG++) = *(pRGB++); + *(pB++) = *(pRGB++); + } + } // End of parallelization + } +} diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 7348588df..753406d25 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -106,6 +106,7 @@ public: void calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist); void ExecCMSTransform(cmsHTRANSFORM hTransform); + void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); }; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 96710ee63..976676fc3 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1270,21 +1270,18 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool } } - Image16* im16 = im->to16(); - delete im; - int imw, imh; double tmpScale = ipf.resizeScale (¶ms, fW, fH, imw, imh); if (tmpScale != 1.0) { - Image16* tempImage = new Image16 (imw, imh); - ipf.resize (im16, tempImage, tmpScale); - delete im16; - im16 = tempImage; + Imagefloat* tempImage = new Imagefloat (imw, imh); + ipf.resize (im, tempImage, tmpScale); + delete im; + im = tempImage; } - im16->saveTIFF (fname, 16, true); - delete im16; + im->saveTIFF (fname, 16, true); + delete im; if (plistener) { plistener->setProgressState (false); diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 08c3fa4cc..74ae1e754 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -239,9 +239,9 @@ public: void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const FramesMetaData *metadata, int rawRotationDeg, bool fullImage); float resizeScale (const ProcParams* params, int fw, int fh, int &imw, int &imh); void lab2monitorRgb (LabImage* lab, Image8* image); - void resize (Image16* src, Image16* dst, float dScale); + void resize (Imagefloat* src, Imagefloat* dst, float dScale); void Lanczos (const LabImage* src, LabImage* dst, float scale); - void Lanczos (const Image16* src, Image16* dst, float scale); + void Lanczos (const Imagefloat* src, Imagefloat* dst, float scale); void deconvsharpening (float** luminance, float** buffer, int W, int H, const SharpeningParams &sharpenParam); void MLsharpen (LabImage* lab);// Manuel's clarity / sharpening @@ -347,7 +347,7 @@ public: void ToneMapFattal02(Imagefloat *rgb); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); - Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); + Imagefloat* lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); // CieImage *ciec; 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 LensCorrection *pLCPMap = nullptr); diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index abef0a878..ba2fe6ffb 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -262,7 +262,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, * If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform * otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve */ -Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga) +Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga) { if (cx < 0) { @@ -281,7 +281,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch = lab->H - cy; } - Image16* image = new Image16 (cw, ch); + Imagefloat* image = new Imagefloat (cw, ch); cmsHPROFILE oprof = nullptr; if (ga) { @@ -300,11 +300,12 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int } lcmsMutex->lock (); cmsHPROFILE iprof = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, oprof, TYPE_RGB_16, icm.outputIntent, flags); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); lcmsMutex->unlock (); image->ExecCMSTransform(hTransform, *lab, cx, cy); cmsDeleteTransform(hTransform); + image->normalizeFloatTo65535(); } else { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) @@ -329,9 +330,9 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int Color::xyz2srgb(x_, y_, z_, R, G, B); - image->r(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(R)]; - image->g(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(G)]; - image->b(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(B)]; + image->r(i - cy, j - cx) = Color::gamma2curve[CLIP(R)]; + image->g(i - cy, j - cx) = Color::gamma2curve[CLIP(G)]; + image->b(i - cy, j - cx) = Color::gamma2curve[CLIP(B)]; } } } diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index 644e180c7..1a48e5c43 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -46,7 +46,7 @@ static inline float Lanc (float x, float a) } } -void ImProcFunctions::Lanczos (const Image16* src, Image16* dst, float scale) +void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float scale) { const float delta = 1.0f / scale; @@ -159,9 +159,9 @@ void ImProcFunctions::Lanczos (const Image16* src, Image16* dst, float scale) b += wh[k] * lb[jj]; } - dst->r (i, j) = CLIP (static_cast (r)); - dst->g (i, j) = CLIP (static_cast (g)); - dst->b (i, j) = CLIP (static_cast (b)); + dst->r (i, j) = CLIP (r);//static_cast (r)); + dst->g (i, j) = CLIP (g);//static_cast (g)); + dst->b (i, j) = CLIP (b);//static_cast (b)); } } @@ -396,7 +396,7 @@ float ImProcFunctions::resizeScale (const ProcParams* params, int fw, int fh, in return (float)dScale; } -void ImProcFunctions::resize (Image16* src, Image16* dst, float dScale) +void ImProcFunctions::resize (Imagefloat* src, Imagefloat* dst, float dScale) { #ifdef PROFILE time_t t1 = clock(); diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index edf903352..53ed06385 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -534,7 +534,7 @@ public: * @param pl is an optional ProgressListener if you want to keep track of the progress * @param tunnelMetaData tunnels IPTC and XMP to output without change * @return the resulting image, with the output profile applied, exif and iptc data set. You have to save it or you can access the pixel data directly. */ -IImage16* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool tunnelMetaData = false, bool flush = false); +IImagefloat* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool tunnelMetaData = false, bool flush = false); /** This class is used to control the batch processing. The class implementing this interface will be called when the full processing of an * image is ready and the next job to process is needed. */ @@ -545,7 +545,7 @@ public: * there is no jobs left. * @param img is the result of the last ProcessingJob * @return the next ProcessingJob to process */ - virtual ProcessingJob* imageReady (IImage16* img) = 0; + virtual ProcessingJob* imageReady (IImagefloat* img) = 0; virtual void error (Glib::ustring message) = 0; }; /** This function performs all the image processinf steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately, diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index dc285ce63..45595a379 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -66,7 +66,7 @@ public: { } - Image16 *operator()() + Imagefloat *operator()() { if (!job->fast) { return normal_pipeline(); @@ -76,7 +76,7 @@ public: } private: - Image16 *normal_pipeline() + Imagefloat *normal_pipeline() { if (!stage_init()) { return nullptr; @@ -87,7 +87,7 @@ private: return stage_finish(); } - Image16 *fast_pipeline() + Imagefloat *fast_pipeline() { if (!job->pparams.resize.enabled) { return normal_pipeline(); @@ -831,7 +831,7 @@ private: } } - Image16 *stage_finish() + Imagefloat *stage_finish() { procparams::ProcParams& params = job->pparams; //ImProcFunctions ipf (¶ms, true); @@ -1227,7 +1227,7 @@ private: } } - Image16* readyImg = nullptr; + Imagefloat* readyImg = nullptr; cmsHPROFILE jprof = nullptr; bool customGamma = false; bool useLCMS = false; @@ -1237,7 +1237,7 @@ private: GammaValues ga; // if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; - readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, &ga); + readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm, &ga); customGamma = true; //or selected Free gamma @@ -1251,7 +1251,7 @@ private: // if Default gamma mode: we use the profile selected in the "Output profile" combobox; // gamma come from the selected profile, otherwise it comes from "Free gamma" tool - readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm); + readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); if (settings->verbose) { printf ("Output profile_: \"%s\"\n", params.icm.output.c_str()); @@ -1281,7 +1281,7 @@ private: } if (tmpScale != 1.0 && params.resize.method == "Nearest") { // resize rgb data (gamma applied) - Image16* tempImage = new Image16 (imw, imh); + Imagefloat* tempImage = new Imagefloat (imw, imh); ipf.resize (readyImg, tempImage, tmpScale); delete readyImg; readyImg = tempImage; @@ -1566,7 +1566,7 @@ private: } // namespace -IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool tunnelMetaData, bool flush) +IImagefloat* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool tunnelMetaData, bool flush) { ImageProcessor proc (pjob, errorCode, pl, tunnelMetaData, flush); return proc(); @@ -1579,7 +1579,7 @@ void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl, bo while (currentJob) { int errorCode; - IImage16* img = processImage (currentJob, errorCode, bpl, tunnelMetaData, true); + IImagefloat* img = processImage (currentJob, errorCode, bpl, tunnelMetaData, true); if (errorCode) { bpl->error (M ("MAIN_MSG_CANNOTLOAD")); diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 43ee5d79d..a2409a39f 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -578,7 +578,7 @@ void BatchQueue::startProcessing () } } -rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) +rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) { // save image img diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 68373838e..0d91542b6 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -62,7 +62,7 @@ public: return (!fd.empty()); } - rtengine::ProcessingJob* imageReady (rtengine::IImage16* img); + rtengine::ProcessingJob* imageReady (rtengine::IImagefloat* img); void error (Glib::ustring msg); void setProgress (double p); void rightClicked (ThumbBrowserEntryBase* entry); diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index c2bec8692..7099007b6 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1751,9 +1751,9 @@ void EditorPanel::procParamsChanged (Thumbnail* thm, int whoChangedIt) } } -bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) +bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { - rtengine::IImage16* img = pc->returnValue(); + rtengine::IImagefloat* img = pc->returnValue(); delete pc; if ( img ) { @@ -1764,13 +1764,13 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, Gl img->setSaveProgressListener (parent->getProgressListener()); if (sf.format == "tif") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsTIFF), fname, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fname, sf.tiffBits, sf.tiffUncompressed), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else if (sf.format == "png") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsPNG), fname, sf.pngBits), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsPNG), fname, sf.pngBits), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else if (sf.format == "jpg") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsJPEG), fname, sf.jpegQuality, sf.jpegSubSamp), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsJPEG), fname, sf.jpegQuality, sf.jpegSubSamp), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else { delete ld; @@ -1791,7 +1791,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, Gl return false; } -bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) +bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { img->free (); @@ -1916,7 +1916,7 @@ void EditorPanel::saveAsPressed () ipc->getParams (&pparams); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - ProgressConnector *ld = new ProgressConnector(); + ProgressConnector *ld = new ProgressConnector(); ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_saveImage ), ld, fnameOut, sf, pparams)); saveimgas->set_sensitive (false); @@ -1960,7 +1960,7 @@ void EditorPanel::sendToGimpPressed () rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - ProgressConnector *ld = new ProgressConnector(); + ProgressConnector *ld = new ProgressConnector(); ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_sendToGimp ), ld, openThm->getFileName() )); saveimgas->set_sensitive (false); @@ -1975,7 +1975,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm rtengine::ProcessingJob *job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); // save immediately - rtengine::IImage16 *img = rtengine::processImage (job, err, nullptr, options.tunnelMetaData, false); + rtengine::IImagefloat *img = rtengine::processImage (job, err, nullptr, options.tunnelMetaData, false); int err = 0; @@ -2015,10 +2015,10 @@ void EditorPanel::syncFileBrowser() // synchronize filebrowser with image in E } } -bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname) +bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname) { - rtengine::IImage16* img = pc->returnValue(); + rtengine::IImagefloat* img = pc->returnValue(); delete pc; if (img) { @@ -2050,7 +2050,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, ProgressConnector *ld = new ProgressConnector(); img->setSaveProgressListener (parent->getProgressListener()); - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_sentToGimp), ld, img, fileName)); } else { Glib::ustring msg_ = Glib::ustring (" Error during image processing\n"); @@ -2063,7 +2063,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, return false; } -bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring filename) +bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename) { img->free (); int errore = pc->returnValue(); diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 5beb9ee7d..50fc337ed 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -146,10 +146,10 @@ private: void close (); BatchQueueEntry* createBatchQueueEntry (); - bool idle_imageSaved (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); - bool idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); - bool idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname); - bool idle_sentToGimp (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring filename); + bool idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); + bool idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); + bool idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname); + bool idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename); Glib::ustring lastSaveAsFileName; bool realized; diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 1d1917e8c..233e04956 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -822,7 +822,7 @@ int processLineParams ( int argc, char **argv ) } // Process image - rtengine::IImage16* resultImage = rtengine::processImage (job, errorCode, nullptr, options.tunnelMetaData); + rtengine::IImagefloat* resultImage = rtengine::processImage (job, errorCode, nullptr, options.tunnelMetaData); if ( !resultImage ) { errors++; From 912f9f436b1163c2235426eca4d8830eebcd4966 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 20 Nov 2017 00:11:18 +0100 Subject: [PATCH 002/200] added support for 32-bit floating-point TIFF output --- rtengine/imageio.cc | 23 ++++++++++++++++------- rtexif/rtexif.cc | 2 ++ rtgui/saveformatpanel.cc | 12 +++++++++--- rtgui/saveformatpanel.h | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ff9c9b559..e7a45ecf6 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1250,20 +1250,28 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = bps == 16 && exifRoot->getOrder() == rtexif::MOTOROLA; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; #else - bool needsReverse = bps == 16 && exifRoot->getOrder() == rtexif::INTEL; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; #endif for (int i = 0; i < height; i++) { getScanline (i, linebuffer, bps); - if (needsReverse) - for (int i = 0; i < lineWidth; i += 2) { - char c = linebuffer[i]; - linebuffer[i] = linebuffer[i + 1]; - linebuffer[i + 1] = c; + if (needsReverse) { + if (bps == 16) { + for (int i = 0; i < lineWidth; i += 2) { + char c = linebuffer[i]; + linebuffer[i] = linebuffer[i + 1]; + linebuffer[i + 1] = c; + } + } else { + for (int i = 0; i < lineWidth; i += 4) { + std::swap(linebuffer[i], linebuffer[i+3]); + std::swap(linebuffer[i+1], linebuffer[i+2]); + } } + } fwrite (linebuffer, lineWidth, 1, file); @@ -1362,6 +1370,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); if (!uncompressed) { TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_NONE); diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index bc0e2002f..1701b3058 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -3240,6 +3240,8 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro Tag* stripOffs = new Tag (cl, lookupAttrib (ifdAttribs, "StripOffsets")); stripOffs->initInt (0, LONG, strips); cl->replaceTag (stripOffs); + Tag *sampleFormat = new Tag (cl, lookupAttrib (ifdAttribs, "SampleFormat"), bps == 32 ? 3 : 1, SHORT); + cl->replaceTag (sampleFormat); for (int i = 0; i < strips - 1; i++) { stripBC->setInt (rps * W * 3 * bps / 8, i * 4); diff --git a/rtgui/saveformatpanel.cc b/rtgui/saveformatpanel.cc index 13e687595..fef05de23 100644 --- a/rtgui/saveformatpanel.cc +++ b/rtgui/saveformatpanel.cc @@ -40,14 +40,16 @@ SaveFormatPanel::SaveFormatPanel () : listener (nullptr) format->append ("JPEG (8 bit)"); format->append ("TIFF (8 bit)"); format->append ("TIFF (16 bit)"); + format->append ("TIFF (32 bit float)"); format->append ("PNG (8 bit)"); format->append ("PNG (16 bit)"); fstr[0] = "jpg"; fstr[1] = "tif"; fstr[2] = "tif"; - fstr[3] = "png"; + fstr[3] = "tif"; fstr[4] = "png"; + fstr[5] = "png"; hb1->attach (*flab, 0, 0, 1, 1); hb1->attach (*format, 1, 0, 1, 1); @@ -121,8 +123,10 @@ void SaveFormatPanel::init (SaveFormat &sf) if (sf.format == "jpg") { format->set_active (0); } else if (sf.format == "png" && sf.pngBits == 16) { - format->set_active (4); + format->set_active (5); } else if (sf.format == "png" && sf.pngBits == 8) { + format->set_active (4); + } else if (sf.format == "tif" && sf.tiffBits == 32) { format->set_active (3); } else if (sf.format == "tif" && sf.tiffBits == 16) { format->set_active (2); @@ -146,7 +150,7 @@ SaveFormat SaveFormatPanel::getFormat () int sel = format->get_active_row_number(); sf.format = fstr[sel]; - if (sel == 4) { + if (sel == 5) { sf.pngBits = 16; } else { sf.pngBits = 8; @@ -154,6 +158,8 @@ SaveFormat SaveFormatPanel::getFormat () if (sel == 2) { sf.tiffBits = 16; + } else if (sel == 3) { + sf.tiffBits = 32; } else { sf.tiffBits = 8; } diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index 76ae7055d..8dc493051 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -44,7 +44,7 @@ protected: Gtk::Grid* jpegOpts; Gtk::Label* jpegSubSampLabel; FormatChangeListener* listener; - Glib::ustring fstr[5]; + Glib::ustring fstr[6]; Gtk::CheckButton* savesPP; From 30ff43ad367618bdee518c1411dd4553692cae51 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 8 Dec 2017 23:24:42 +0100 Subject: [PATCH 003/200] Tool panel vertical scrollbar bug in Linux #3413 When the vertical scrollbar is set to hidden, one cannot scroll the toolbox vertically using the mouse scrollwheel in Linux. This patch works around the problem by forcing the scrollbar to always be visible in Linux. --- rtgui/options.cc | 6 +++++- rtgui/preferences.cc | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index d1b91c3ac..69e5c4bc9 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1366,10 +1366,14 @@ void Options::readFromFile (Glib::ustring fname) FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } +#ifdef __linux__ + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + hideTPVScrollbar = false; +#else if (keyFile.has_key ("GUI", "HideTPVScrollbar")) { hideTPVScrollbar = keyFile.get_boolean ("GUI", "HideTPVScrollbar"); } - +#endif if (keyFile.has_key ("GUI", "UseIconNoText")) { UseIconNoText = keyFile.get_boolean ("GUI", "UseIconNoText"); } diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 7e6018ff0..ac3f4991c 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1003,6 +1003,11 @@ Gtk::Widget* Preferences::getGeneralPanel () setExpandAlignProperties (hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); ckbHideTPVScrollbar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_VSCROLLBAR")) ); setExpandAlignProperties (ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); +#ifdef __linux__ + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + ckbHideTPVScrollbar->set_active(false); + ckbHideTPVScrollbar->set_sensitive(false); +#endif ckbUseIconNoText = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_USEICONORTEXT")) ); setExpandAlignProperties (ckbUseIconNoText, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); workflowGrid->attach_next_to (*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); From b963f368af73a8004b4af9a303150c65120970a2 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 9 Dec 2017 18:09:13 +0100 Subject: [PATCH 004/200] Added On/Off switch for White Balance Candidate fix for #3542 --- rtengine/improccoordinator.cc | 12 ++++++++---- rtengine/procevents.h | 3 +-- rtengine/procparams.cc | 6 +++++- rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 4 ++-- rtengine/rtthumbnail.cc | 23 ++++++++++++++++------- rtengine/simpleprocess.cc | 4 +++- rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 1 + rtgui/whitebalance.cc | 34 ++++++++++++++++++++++++++++------ rtgui/whitebalance.h | 1 + 11 files changed, 72 insertions(+), 23 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 008344dd7..9c80eed9e 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -296,7 +296,9 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { currWB = imgsrc->getWB (); } else if (params.wb.method == "Auto") { if (lastAwbEqual != params.wb.equal || lastAwbTempBias != params.wb.tempBias) { @@ -320,10 +322,12 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) currWB = autoWB; } - params.wb.temperature = currWB.getTemp (); - params.wb.green = currWB.getGreen (); + if (params.wb.enabled) { + params.wb.temperature = currWB.getTemp (); + params.wb.green = currWB.getGreen (); + } - if (params.wb.method == "Auto" && awbListener) { + if (params.wb.method == "Auto" && awbListener && params.wb.enabled) { awbListener->WBChanged (params.wb.temperature, params.wb.green); } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 3aa5505b5..169b22584 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -511,14 +511,13 @@ enum ProcEvent { EvCATgreensc = 481, EvCATybscen = 482, EvCATAutoyb = 483, - // profiled lens correction new events EvLensCorrMode = 484, EvLensCorrLensfunCamera = 485, EvLensCorrLensfunLens = 486, - // Fattal tone mapping EvTMFattalEnabled = 487, EvTMFattalThreshold = 488, EvTMFattalAmount = 489, + EvWBEnabled = 490, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9f0c13f6d..ff5f0b386 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1094,6 +1094,7 @@ bool VibranceParams::operator !=(const VibranceParams& other) const } WBParams::WBParams() : + enabled(true), method("Camera"), temperature(6504), green(1.0), @@ -1105,7 +1106,8 @@ WBParams::WBParams() : bool WBParams::operator ==(const WBParams& other) const { return - method == other.method + enabled == other.enabled + && method == other.method && temperature == other.temperature && green == other.green && equal == other.equal @@ -2864,6 +2866,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->sharpenMicro.uniformity, "SharpenMicro", "Uniformity", sharpenMicro.uniformity, keyFile); // WB + saveToKeyfile(!pedited || pedited->wb.enabled, "White Balance", "Enabled", wb.enabled, keyFile); saveToKeyfile(!pedited || pedited->wb.method, "White Balance", "Setting", wb.method, keyFile); saveToKeyfile(!pedited || pedited->wb.temperature, "White Balance", "Temperature", wb.temperature, keyFile); saveToKeyfile(!pedited || pedited->wb.green, "White Balance", "Green", wb.green, keyFile); @@ -3696,6 +3699,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("White Balance")) { + assignFromKeyfile(keyFile, "White Balance", "Enabled", pedited, wb.enabled, pedited->wb.enabled); assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 00e6f9389..35f7b79f9 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -538,6 +538,7 @@ struct WBEntry { }; struct WBParams { + bool enabled; Glib::ustring method; int temperature; double green; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index c95b53c0a..676c1efbf 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -516,7 +516,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DARKFRAME, // EvLensCorrLensfunLens ALLNORAW, // EvTMFattalEnabled HDR, // EvTMFattalThreshold - HDR // EvTMFattalAmount - + HDR, // EvTMFattalAmount + ALLNORAW // EvWBEnabled }; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 8adab4ec5..fcc039a81 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -944,7 +944,9 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT // compute WB multipliers ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { //recall colorMatrix is rgb_cam double cam_r = colorMatrix[0][0] * camwbRed + colorMatrix[0][1] * camwbGreen + colorMatrix[0][2] * camwbBlue; double cam_g = colorMatrix[1][0] * camwbRed + colorMatrix[1][1] * camwbGreen + colorMatrix[1][2] * camwbBlue; @@ -954,12 +956,19 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom"); } - double r, g, b; - currWB.getMultipliers (r, g, b); - //iColorMatrix is cam_rgb - double rm = iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b; - double gm = iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b; - double bm = iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b; + double rm, gm, bm; + if (currWB.getTemp() < 0) { + rm = redMultiplier; + gm = greenMultiplier; + bm = blueMultiplier; + } else { + double r, g, b; + currWB.getMultipliers (r, g, b); + //iColorMatrix is cam_rgb + rm = iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b; + gm = iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b; + bm = iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b; + } rm = camwbRed / rm; gm = camwbGreen / gm; bm = camwbBlue / bm; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index ece818440..5bcaca925 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -223,7 +223,9 @@ private: // set the color temperature currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { currWB = imgsrc->getWB (); } else if (params.wb.method == "Auto") { double rm, gm, bm; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 62643221a..b649272db 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -219,6 +219,7 @@ void ParamsEdited::set (bool v) //colorBoost.avoidclip = v; //colorBoost.enable_saturationlimiter = v; //colorBoost.saturationlimit = v; + wb.enabled = v; wb.method = v; wb.green = v; wb.temperature = v; @@ -758,6 +759,7 @@ void ParamsEdited::initFrom (const std::vector //colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip; //colorBoost.enable_saturationlimiter = colorBoost.enable_saturationlimiter && p.colorBoost.enable_saturationlimiter == other.colorBoost.enable_saturationlimiter; //colorBoost.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit; + wb.enabled = wb.enabled && p.wb.enabled == other.wb.enabled; wb.method = wb.method && p.wb.method == other.wb.method; wb.green = wb.green && p.wb.green == other.wb.green; wb.equal = wb.equal && p.wb.equal == other.wb.equal; @@ -1664,6 +1666,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten //if (colorBoost.avoidclip) toEdit.colorBoost.avoidclip = mods.colorBoost.avoidclip; //if (colorBoost.enable_saturationlimiter)toEdit.colorBoost.enable_saturationlimiter = mods.colorBoost.enable_saturationlimiter; //if (colorBoost.saturationlimit) toEdit.colorBoost.saturationlimit = mods.colorBoost.saturationlimit; + if (wb.enabled) { + toEdit.wb.enabled = mods.wb.enabled; + } + if (wb.method) { toEdit.wb.method = mods.wb.method; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index a571f5484..f8f76f036 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -229,6 +229,7 @@ class WBParamsEdited { public: + bool enabled; bool method; bool temperature; bool green; diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 7dbc02b4e..57d73b15f 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -147,7 +147,7 @@ static double wbTemp2Slider(double temp) return sval; } -WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL")), wbp(nullptr), wblistener(nullptr) +WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), false, true), wbp(nullptr), wblistener(nullptr) { Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); @@ -349,9 +349,23 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); } + +void WhiteBalance::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvWBEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvWBEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWBEnabled, M("GENERAL_DISABLED")); + } + } +} + + void WhiteBalance::adjusterChanged (Adjuster* a, double newval) { - int tVal = (int)temp->getValue(); double gVal = green->getValue(); double eVal = equal->getValue(); @@ -400,7 +414,7 @@ void WhiteBalance::adjusterChanged (Adjuster* a, double newval) // Recomputing AutoWB if it's the current method will happen in improccoordinator.cc - if (listener) { + if (listener && getEnabled()) { if (a == temp) { listener->panelChanged (EvWBTemp, Glib::ustring::format ((int)a->getValue())); } else if (a == green) { @@ -415,7 +429,6 @@ void WhiteBalance::adjusterChanged (Adjuster* a, double newval) void WhiteBalance::optChanged () { - Gtk::TreeModel::Row row = getActiveMethod(); if (row == refTreeModel->children().end()) { @@ -520,7 +533,7 @@ void WhiteBalance::optChanged () } } - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvWBMethod, row[methodColumns.colLabel]); } } @@ -528,7 +541,6 @@ void WhiteBalance::optChanged () void WhiteBalance::spotPressed () { - if (wblistener) { wblistener->spotWBRequested (getSize()); } @@ -667,6 +679,11 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) tempBias->set_sensitive(wbValues.type == WBEntry::Type::AUTO); } + setEnabled(pp->wb.enabled); + if (pedited) { + set_inconsistent(multiImage && !pedited->wb.enabled); + } + methconn.block (false); enableListener (); } @@ -682,8 +699,11 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) pedited->wb.equal = equal->getEditedState (); pedited->wb.tempBias = tempBias->getEditedState (); pedited->wb.method = row[methodColumns.colLabel] != M("GENERAL_UNCHANGED"); + pedited->wb.enabled = !get_inconsistent(); } + pp->wb.enabled = getEnabled(); + const std::pair ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI); if (ppMethod.first) { @@ -756,6 +776,7 @@ void WhiteBalance::setWB (int vtemp, double vgreen) methconn.block(true); const std::pair wbValues = findWBEntry("Custom", WBLT_PP); + setEnabled(true); temp->setValue (vtemp); green->setValue (vgreen); opt = setActiveMethod(wbValues.second.GUILabel); @@ -876,6 +897,7 @@ void WhiteBalance::WBChanged(double temperature, double greenVal) { GThreadLock lock; disableListener(); + setEnabled(true); temp->setValue(temperature); green->setValue(greenVal); temp->setDefault(temperature); diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index d1fafcea3..ecf65f476 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -119,6 +119,7 @@ public: void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd); void trimValues (rtengine::procparams::ProcParams* pp); + void enabledChanged(); }; #endif From 6a9e6729fd6fe4bef65d9a8ca2bc8389765ccb81 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 9 Dec 2017 23:53:29 +0100 Subject: [PATCH 005/200] Added history msg for WB enabled --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7ee50152b..e4f6a5912 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -722,6 +722,7 @@ HISTORY_MSG_487;Lens Correction - Lens HISTORY_MSG_488;HDR Tone Mapping HISTORY_MSG_489;HDR TM - Threshold HISTORY_MSG_490;HDR TM - Amount +HISTORY_MSG_491;White Balance HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot From 11ca61e3e2fdc13d2420a19798f3ca5227b9ab45 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 9 Dec 2017 23:54:27 +0100 Subject: [PATCH 006/200] added on/off switches for Channel Mixer, HSV Equalizer and RGB Curves --- rtdata/languages/default | 1 + rtengine/improcfun.cc | 11 ++++++----- rtengine/procevents.h | 1 + rtengine/procparams.cc | 39 +++++++++++++++++++++++++++++++++++++-- rtengine/procparams.h | 3 +++ rtengine/refreshmap.cc | 3 ++- rtgui/chmixer.cc | 30 ++++++++++++++++++++++++++---- rtgui/chmixer.h | 1 + rtgui/hsvequalizer.cc | 23 ++++++++++++++++++++--- rtgui/hsvequalizer.h | 1 + rtgui/paramsedited.cc | 18 ++++++++++++++++++ rtgui/paramsedited.h | 3 +++ rtgui/ppversion.h | 4 +++- rtgui/rgbcurves.cc | 25 +++++++++++++++++++++---- rtgui/rgbcurves.h | 1 + 15 files changed, 144 insertions(+), 20 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index e4f6a5912..0e532f149 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -723,6 +723,7 @@ HISTORY_MSG_488;HDR Tone Mapping HISTORY_MSG_489;HDR TM - Threshold HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance +HISTORY_MSG_492;RGB Curves HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index ad7e4260d..7552cf523 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3146,7 +3146,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer {wprof[2][0], wprof[2][1], wprof[2][2]} }; - bool mixchannels = (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || + bool mixchannels = params->chmixer.enabled && + (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || params->chmixer.green[0] != 0 || params->chmixer.green[1] != 100 || params->chmixer.green[2] != 0 || params->chmixer.blue[0] != 0 || params->chmixer.blue[1] != 0 || params->chmixer.blue[2] != 100); @@ -3159,9 +3160,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at (0); FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at (0); FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at (0); - bool hCurveEnabled = hCurveType > FCT_Linear; - bool sCurveEnabled = sCurveType > FCT_Linear; - bool vCurveEnabled = vCurveType > FCT_Linear; + bool hCurveEnabled = params->hsvequalizer.enabled && hCurveType > FCT_Linear; + bool sCurveEnabled = params->hsvequalizer.enabled && sCurveType > FCT_Linear; + bool vCurveEnabled = params->hsvequalizer.enabled && vCurveType > FCT_Linear; bool bwlCurveEnabled = bwlCurveType > FCT_Linear; // TODO: We should create a 'skip' value like for CurveFactory::complexsgnCurve (rtengine/curves.cc) @@ -3760,7 +3761,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (rCurve || gCurve || bCurve) { // if any of the RGB curves is engaged + if (params->rgbCurves.enabled && (rCurve || gCurve || bCurve)) { // if any of the RGB curves is engaged if (!params->rgbCurves.lumamode) { // normal RGB mode for (int i = istart, ti = 0; i < tH; i++, ti++) { diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 169b22584..bde32f92f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -518,6 +518,7 @@ enum ProcEvent { EvTMFattalThreshold = 488, EvTMFattalAmount = 489, EvWBEnabled = 490, + EvRGBEnabled = 491, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ff5f0b386..82e47769f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -559,6 +559,7 @@ bool LCurveParams::operator !=(const LCurveParams& other) const } RGBCurvesParams::RGBCurvesParams() : + enabled(false), lumamode(false), rcurve{ DCT_Linear @@ -575,7 +576,8 @@ RGBCurvesParams::RGBCurvesParams() : bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const { return - lumamode == other.lumamode + enabled == other.enabled + && lumamode == other.lumamode && rcurve == other.rcurve && gcurve == other.gcurve && bcurve == other.bcurve; @@ -1753,6 +1755,7 @@ bool VignettingParams::operator !=(const VignettingParams& other) const } ChannelMixerParams::ChannelMixerParams() : + enabled(false), red{ 100, 0, @@ -1773,6 +1776,9 @@ ChannelMixerParams::ChannelMixerParams() : bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const { + if (enabled != other.enabled) { + return false; + } for (unsigned int i = 0; i < 3; ++i) { if ( red[i] != other.red[i] @@ -2261,6 +2267,7 @@ bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) cons } HSVEqualizerParams::HSVEqualizerParams() : + enabled(false), hcurve{ FCT_Linear }, @@ -2276,7 +2283,8 @@ HSVEqualizerParams::HSVEqualizerParams() : bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const { return - hcurve == other.hcurve + enabled == other.enabled + && hcurve == other.hcurve && scurve == other.scurve && vcurve == other.vcurve; } @@ -2746,6 +2754,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); // Channel mixer + saveToKeyfile(!pedited || pedited->chmixer.enabled, "Channel Mixer", "Enabled", chmixer.enabled, keyFile); 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); @@ -3226,6 +3235,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile); // HSV Equalizer + saveToKeyfile(!pedited || pedited->hsvequalizer.enabled, "HSV Equalizer", "Enabled", hsvequalizer.enabled, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); @@ -3235,6 +3245,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile); saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.enabled, "RGB Curves", "Enabled", rgbCurves.enabled, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile); saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile); @@ -3454,6 +3465,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("Channel Mixer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "Channel Mixer", "Enabled", pedited, chmixer.enabled, pedited->chmixer.enabled); + } else { + chmixer.enabled = true; + if (pedited) { + pedited->chmixer.enabled = true; + } + } if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); @@ -4392,6 +4411,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("HSV Equalizer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "HSV Equalizer", "Enabled", pedited, hsvequalizer.enabled, pedited->hsvequalizer.enabled); + } else { + hsvequalizer.enabled = true; + if (pedited) { + pedited->hsvequalizer.enabled = true; + } + } if (ppVersion >= 300) { assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve); assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve); @@ -4400,6 +4427,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("RGB Curves")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "RGB Curves", "Enabled", pedited, rgbCurves.enabled, pedited->rgbCurves.enabled); + } else { + rgbCurves.enabled = true; + if (pedited) { + pedited->rgbCurves.enabled = true; + } + } assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode); assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve); assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 35f7b79f9..f7e23771a 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -367,6 +367,7 @@ struct LCurveParams * Parameters of the RGB curves */ struct RGBCurvesParams { + bool enabled; bool lumamode; std::vector rcurve; std::vector gcurve; @@ -896,6 +897,7 @@ struct VignettingParams { * Parameters of the color mixer */ struct ChannelMixerParams { + bool enabled; int red[3]; int green[3]; int blue[3]; @@ -1138,6 +1140,7 @@ struct DirPyrEqualizerParams { * HSV equalizer params */ struct HSVEqualizerParams { + bool enabled; std::vector hcurve; std::vector scurve; std::vector vcurve; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 676c1efbf..86b602562 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -517,6 +517,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { ALLNORAW, // EvTMFattalEnabled HDR, // EvTMFattalThreshold HDR, // EvTMFattalAmount - ALLNORAW // EvWBEnabled + ALLNORAW, // EvWBEnabled + RGBCURVE // EvRGBEnabled }; diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index 7d71da9a9..c6c098883 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -22,7 +22,7 @@ using namespace rtengine; using namespace rtengine::procparams; -ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL")) +ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true) { imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-RR.png")); @@ -99,12 +99,16 @@ void ChMixer::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); - if (pedited) + setEnabled(pp->chmixer.enabled); + + if (pedited) { for (int i = 0; i < 3; i++) { red[i]->setEditedState (pedited->chmixer.red[i] ? Edited : UnEdited); green[i]->setEditedState (pedited->chmixer.green[i] ? Edited : UnEdited); blue[i]->setEditedState (pedited->chmixer.blue[i] ? Edited : UnEdited); } + set_inconsistent(multiImage && !pedited->chmixer.enabled); + } for (int i = 0; i < 3; i++) { red[i]->setValue (pp->chmixer.red[i]); @@ -123,13 +127,16 @@ void ChMixer::write (ProcParams* pp, ParamsEdited* pedited) pp->chmixer.green[i] = (int) green[i]->getValue (); pp->chmixer.blue[i] = (int) blue[i]->getValue (); } + pp->chmixer.enabled = getEnabled(); - if (pedited) + if (pedited) { for (int i = 0; i < 3; i++) { pedited->chmixer.red[i] = red[i]->getEditedState (); pedited->chmixer.green[i] = green[i]->getEditedState (); pedited->chmixer.blue[i] = blue[i]->getEditedState (); } + pedited->chmixer.enabled = !get_inconsistent(); + } } void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) @@ -158,7 +165,7 @@ void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi void ChMixer::adjusterChanged (Adjuster* a, double newval) { - if (listener) { + if (listener && getEnabled()) { Glib::ustring descr = Glib::ustring::compose ("R=%1,%2,%3\nG=%4,%5,%6\nB=%7,%8,%9", (int)red[0]->getValue(), (int)red[1]->getValue(), (int)red[2]->getValue(), (int)green[0]->getValue(), (int)green[1]->getValue(), (int)green[2]->getValue(), @@ -167,6 +174,21 @@ void ChMixer::adjusterChanged (Adjuster* a, double newval) } } + +void ChMixer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvChMixer, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvChMixer, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvChMixer, M("GENERAL_DISABLED")); + } + } +} + + void ChMixer::setBatchMode (bool batchMode) { diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index bd85517de..410ac0d16 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -44,6 +44,7 @@ public: void adjusterChanged (Adjuster* a, double newval); void setAdjusterBehavior (bool rgbadd); void trimValues (rtengine::procparams::ProcParams* pp); + void enabledChanged(); }; #endif diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index e74848cf3..1dfb017a7 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -25,7 +25,7 @@ using namespace rtengine::procparams; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL")) +HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"), false, true) { std::vector bottomMilestones; @@ -84,11 +84,13 @@ void HSVEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) hshape->setUnChanged (!pedited->hsvequalizer.hcurve); sshape->setUnChanged (!pedited->hsvequalizer.scurve); vshape->setUnChanged (!pedited->hsvequalizer.vcurve); + set_inconsistent(multiImage && !pedited->hsvequalizer.enabled); } hshape->setCurve (pp->hsvequalizer.hcurve); sshape->setCurve (pp->hsvequalizer.scurve); vshape->setCurve (pp->hsvequalizer.vcurve); + setEnabled(pp->hsvequalizer.enabled); enableListener (); } @@ -116,7 +118,7 @@ void HSVEqualizer::autoOpenCurve () void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->hsvequalizer.enabled = getEnabled(); pp->hsvequalizer.hcurve = hshape->getCurve (); pp->hsvequalizer.scurve = sshape->getCurve (); pp->hsvequalizer.vcurve = vshape->getCurve (); @@ -126,6 +128,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) pedited->hsvequalizer.hcurve = !hshape->isUnChanged (); pedited->hsvequalizer.scurve = !sshape->isUnChanged (); pedited->hsvequalizer.vcurve = !vshape->isUnChanged (); + pedited->hsvequalizer.enabled = !get_inconsistent(); } } @@ -138,7 +141,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) void HSVEqualizer::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == hshape) { listener->panelChanged (EvHSVEqualizerH, M("HISTORY_CUSTOMCURVE")); } @@ -199,3 +202,17 @@ void HSVEqualizer::setBatchMode (bool batchMode) curveEditorG->setBatchMode (batchMode); } + + +void HSVEqualizer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_DISABLED")); + } + } +} diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index d02cc378c..fc3d22984 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -54,6 +54,7 @@ public: virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); //void adjusterChanged (Adjuster* a, double newval); + void enabledChanged(); }; #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b649272db..57fd7646f 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -97,6 +97,7 @@ void ParamsEdited::set (bool v) labCurve.avoidcolorshift = v; labCurve.rstprotection = v; labCurve.lcredsk = v; + rgbCurves.enabled = v; rgbCurves.lumamode = v; rgbCurves.rcurve = v; rgbCurves.gcurve = v; @@ -320,6 +321,7 @@ void ParamsEdited::set (bool v) vignetting.strength = v; vignetting.centerX = v; vignetting.centerY = v; + chmixer.enabled = v; chmixer.red[0] = v; chmixer.red[1] = v; chmixer.red[2] = v; @@ -548,6 +550,7 @@ void ParamsEdited::set (bool v) dirpyrequalizer.skinprotect = v; dirpyrequalizer.hueskin = v; //dirpyrequalizer.algo = v; + hsvequalizer.enabled = v; hsvequalizer.hcurve = v; hsvequalizer.scurve = v; hsvequalizer.vcurve = v; @@ -638,6 +641,7 @@ void ParamsEdited::initFrom (const std::vector labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift; labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection; labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk; + rgbCurves.enabled = rgbCurves.enabled && p.rgbCurves.enabled == other.rgbCurves.enabled; rgbCurves.lumamode = rgbCurves.lumamode && p.rgbCurves.lumamode == other.rgbCurves.lumamode; rgbCurves.rcurve = rgbCurves.rcurve && p.rgbCurves.rcurve == other.rgbCurves.rcurve; rgbCurves.gcurve = rgbCurves.gcurve && p.rgbCurves.gcurve == other.rgbCurves.gcurve; @@ -865,6 +869,7 @@ void ParamsEdited::initFrom (const std::vector vignetting.strength = vignetting.strength && p.vignetting.strength == other.vignetting.strength; vignetting.centerX = vignetting.centerX && p.vignetting.centerX == other.vignetting.centerX; vignetting.centerY = vignetting.centerY && p.vignetting.centerY == other.vignetting.centerY; + chmixer.enabled = chmixer.enabled && p.chmixer.enabled == other.chmixer.enabled; chmixer.red[0] = chmixer.red[0] && p.chmixer.red[0] == other.chmixer.red[0]; chmixer.red[1] = chmixer.red[1] && p.chmixer.red[1] == other.chmixer.red[1]; chmixer.red[2] = chmixer.red[2] && p.chmixer.red[2] == other.chmixer.red[2]; @@ -1086,6 +1091,7 @@ void ParamsEdited::initFrom (const std::vector dirpyrequalizer.skinprotect = dirpyrequalizer.skinprotect && p.dirpyrequalizer.skinprotect == other.dirpyrequalizer.skinprotect; // dirpyrequalizer.algo = dirpyrequalizer.algo && p.dirpyrequalizer.algo == other.dirpyrequalizer.algo; dirpyrequalizer.hueskin = dirpyrequalizer.hueskin && p.dirpyrequalizer.hueskin == other.dirpyrequalizer.hueskin; + hsvequalizer.enabled = hsvequalizer.enabled && p.hsvequalizer.enabled == other.hsvequalizer.enabled; hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve; hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve; hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve; @@ -1358,6 +1364,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.labCurve.lcredsk = mods.labCurve.lcredsk; } + if (rgbCurves.enabled) { + toEdit.rgbCurves.enabled = mods.rgbCurves.enabled; + } + if (rgbCurves.lumamode) { toEdit.rgbCurves.lumamode = mods.rgbCurves.lumamode; } @@ -2195,6 +2205,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.vignetting.centerY = dontforceSet && options.baBehav[ADDSET_VIGN_CENTER] ? toEdit.vignetting.centerY + mods.vignetting.centerY : mods.vignetting.centerY; } + if (chmixer.enabled) { + toEdit.chmixer.enabled = mods.chmixer.enabled; + } + for (int i = 0; i < 3; i++) { if (chmixer.red[i]) { toEdit.chmixer.red[i] = dontforceSet && options.baBehav[ADDSET_CHMIXER] ? toEdit.chmixer.red[i] + mods.chmixer.red[i] : mods.chmixer.red[i]; @@ -3014,6 +3028,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten } // if (dirpyrequalizer.algo) toEdit.dirpyrequalizer.algo = mods.dirpyrequalizer.algo; + if (hsvequalizer.enabled) { + toEdit.hsvequalizer.enabled = mods.hsvequalizer.enabled; + } + if (hsvequalizer.hcurve) { toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index f8f76f036..62fd8c9f4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -123,6 +123,7 @@ class RGBCurvesParamsEdited { public: + bool enabled; bool lumamode; bool rcurve; bool gcurve; @@ -488,6 +489,7 @@ class ChannelMixerParamsEdited { public: + bool enabled; bool red[3]; bool green[3]; bool blue[3]; @@ -678,6 +680,7 @@ class HSVEqualizerParamsEdited { public: + bool enabled; bool hcurve; bool scurve; bool vcurve; diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index d799be406..c6f2598b0 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,11 +1,13 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 328 +#define PPVERSION 329 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 329 2017-12-09 + Added 'Enabled' flag for Channel Mixer, RGB Curves and HSV Equalizer 328 2017-11-22 Fix wrong type of ff_clipControl 327 2017-09-15 diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index d9c970f7a..d32633bf4 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -21,7 +21,7 @@ using namespace rtengine; using namespace rtengine::procparams; -RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL")) +RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"), false, true) { lumamode = Gtk::manage (new Gtk::CheckButton (M("TP_RGBCURVES_LUMAMODE"))); @@ -84,6 +84,7 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited) Gshape->setUnChanged (!pedited->rgbCurves.gcurve); Bshape->setUnChanged (!pedited->rgbCurves.bcurve); lumamode->set_inconsistent (!pedited->rgbCurves.lumamode); + set_inconsistent(multiImage && !pedited->rgbCurves.enabled); } lumamodeConn.block (true); @@ -96,6 +97,8 @@ void RGBCurves::read (const ProcParams* pp, const ParamsEdited* pedited) Gshape->setCurve (pp->rgbCurves.gcurve); Bshape->setCurve (pp->rgbCurves.bcurve); + setEnabled(pp->rgbCurves.enabled); + enableListener (); } @@ -122,13 +125,14 @@ void RGBCurves::autoOpenCurve () void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->rgbCurves.enabled = getEnabled(); pp->rgbCurves.rcurve = Rshape->getCurve (); pp->rgbCurves.gcurve = Gshape->getCurve (); pp->rgbCurves.bcurve = Bshape->getCurve (); pp->rgbCurves.lumamode = lumamode->get_active(); if (pedited) { + pedited->rgbCurves.enabled = !get_inconsistent(); pedited->rgbCurves.rcurve = !Rshape->isUnChanged (); pedited->rgbCurves.gcurve = !Gshape->isUnChanged (); pedited->rgbCurves.bcurve = !Bshape->isUnChanged (); @@ -146,7 +150,7 @@ void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited) void RGBCurves::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == Rshape) { listener->panelChanged (EvRGBrCurve, M("HISTORY_CUSTOMCURVE")); } @@ -177,7 +181,7 @@ void RGBCurves::lumamodeChanged () lastLumamode = lumamode->get_active (); } - if (listener) { + if (listener && getEnabled()) { if (lumamode->get_active ()) { listener->panelChanged (EvRGBrCurveLumamode, M("GENERAL_ENABLED")); } else { @@ -202,3 +206,16 @@ void RGBCurves::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & his // Bshape->updateBackgroundHistogram (histBlue); } + +void RGBCurves::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvRGBEnabled, M("GENERAL_DISABLED")); + } + } +} diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index efca76422..dfcba71f9 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -53,6 +53,7 @@ public: void curveChanged (CurveEditor* ce); void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI); void lumamodeChanged (); + void enabledChanged(); }; #endif From 890d896817fe84e516ed7042d8cfe9ca176af295 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 12 Dec 2017 20:49:43 +0100 Subject: [PATCH 007/200] Initial support for pixel-shift for the Sony A7RIII Only with ARQ files for now, and no sony-specific constants for motion correction yet --- rtengine/dcraw.cc | 40 ++++++++++++++++++++++++++++++++++++++++ rtengine/dcraw.h | 1 + rtengine/pixelshift.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 9ae313530..b843404e5 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2349,6 +2349,35 @@ void CLASS unpacked_load_raw() && (unsigned) (col-left_margin) < width) derror(); } + +// RT +void CLASS sony_arq_load_raw() +{ + int row, col, bits=0; + ushort samples[4]; + + while (1 << ++bits < maximum); + for (row=0; row < ((shot_select < 2) ? 1 : raw_height); row++) { + for (col=0; col < ((row == 0) ? raw_width : 1); col++) { + RAW(row,col) = 0; + } + } + for (row=0; row < raw_height; row++) { + int r = row + (shot_select & 1); + for (col=0; col < raw_width; col++) { + int c = col + ((shot_select >> 1) & 1); + read_shorts(samples, 4); + if (r < raw_height && c < raw_width) { + RAW(r,c) = samples[(2 * (r & 1)) + (c & 1)]; + if ((RAW(r,c) >>= load_flags) >> bits + && (unsigned) (row-top_margin) < height + && (unsigned) (col-left_margin) < width) derror(); + } + } + } +} + + void CLASS sinar_4shot_load_raw() { ushort *pixel; @@ -6524,6 +6553,17 @@ void CLASS apply_tiff() if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*7 > raw_width*raw_height) load_raw = &CLASS olympus_load_raw; + // ------- RT ------- + if (!strncmp(make,"SONY",4) && + !strncmp(model,"ILCE-7RM3",9) && + tiff_samples == 4 && + tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { + load_raw = &CLASS sony_arq_load_raw; + colors = 3; + is_raw = 4; + filters = 0x94949494; + } + // ------------------ } break; case 6: case 7: case 99: diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 0a10f9732..5a2790801 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -409,6 +409,7 @@ sony_decrypt_t sony_decrypt; void sony_load_raw(); void sony_arw_load_raw(); void sony_arw2_load_raw(); +void sony_arq_load_raw(); // RT void smal_decode_segment (unsigned seg[2][2], int holes); void smal_v6_load_raw(); diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 256aaaf63..c2c0231a1 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -295,6 +295,43 @@ void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUT *array2D_ptr; + RawDataFrameReorder(const std::string &model, array2D_ptr *rawDataFrames): + model_(model), + frames_(rawDataFrames) + { + if (model_ == "ILCE-7RM3") { + std::swap(frames_[2], frames_[3]); + } + } + + ~RawDataFrameReorder() + { + if (model_ == "ILCE-7RM3") { + std::swap(frames_[2], frames_[3]); + } + } + + unsigned int getframe(unsigned int frame) + { + if (model_ == "ILCE-7RM3") { + if (frame == 2) { + return 3; + } else if (frame == 3) { + return 2; + } + } + return frame; + } + +private: + std::string model_; + array2D_ptr *frames_; +}; + + } using namespace std; @@ -307,6 +344,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA return; } + RawDataFrameReorder reorder_frames(model, rawDataFrames); + frame = reorder_frames.getframe(frame); + RAWParams::BayerSensor bayerParams = bayerParamsIn; bayerParams.pixelShiftAutomatic = true; From 4ef705cdd650e55748cf32d2384ddb73b2f788ad Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 12 Dec 2017 21:08:31 +0100 Subject: [PATCH 008/200] fixed behaviour of "WB off" for non-raw images --- rtengine/image16.cc | 25 +++++++++++++++---------- rtengine/image8.cc | 25 +++++++++++++++---------- rtengine/imagefloat.cc | 25 +++++++++++++++---------- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/rtengine/image16.cc b/rtengine/image16.cc index e0f7470a6..426fc289c 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -137,17 +137,22 @@ void Image16::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, Preview { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 56c2a63ee..86294236b 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -97,17 +97,22 @@ Image8* Image8::copy () void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 30871c9b1..d5b17ed80 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -175,17 +175,22 @@ void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, Prev { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; From f2c8230608c1fb15dfde1a82752795c0ca90f1aa Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 12 Dec 2017 21:28:39 +0100 Subject: [PATCH 009/200] Renamed folder for bundled pixel shift profiles --- .../profiles/{Pentax Pixel Shift => Pixel Shift}/PS ISO High.pp3 | 0 .../profiles/{Pentax Pixel Shift => Pixel Shift}/PS ISO Low.pp3 | 0 .../{Pentax Pixel Shift => Pixel Shift}/PS ISO Medium.pp3 | 0 .../profiles/{Pentax Pixel Shift => Pixel Shift}/PS No Motion.pp3 | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename rtdata/profiles/{Pentax Pixel Shift => Pixel Shift}/PS ISO High.pp3 (100%) rename rtdata/profiles/{Pentax Pixel Shift => Pixel Shift}/PS ISO Low.pp3 (100%) rename rtdata/profiles/{Pentax Pixel Shift => Pixel Shift}/PS ISO Medium.pp3 (100%) rename rtdata/profiles/{Pentax Pixel Shift => Pixel Shift}/PS No Motion.pp3 (100%) diff --git a/rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3 b/rtdata/profiles/Pixel Shift/PS ISO High.pp3 similarity index 100% rename from rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3 rename to rtdata/profiles/Pixel Shift/PS ISO High.pp3 diff --git a/rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3 b/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 similarity index 100% rename from rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3 rename to rtdata/profiles/Pixel Shift/PS ISO Low.pp3 diff --git a/rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3 b/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 similarity index 100% rename from rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3 rename to rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 diff --git a/rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3 b/rtdata/profiles/Pixel Shift/PS No Motion.pp3 similarity index 100% rename from rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3 rename to rtdata/profiles/Pixel Shift/PS No Motion.pp3 From 1fdf44660af8ea5f70243779974f2483600e60ab Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 12 Dec 2017 21:38:44 +0100 Subject: [PATCH 010/200] exposed maker to pixelshift code for future use --- rtengine/pixelshift.cc | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index c2c0231a1..875f87a2f 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -336,7 +336,7 @@ private: using namespace std; using namespace rtengine; -void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParamsIn, unsigned int frame, const std::string &model, float rawWpCorrection) +void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParamsIn, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection) { if(numFrames != 4) { // fallback for non pixelshift files diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index bcc16d5cb..d8fba268a 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2036,7 +2036,7 @@ void RawImageSource::demosaic(const RAWParams &raw) } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE) ) { amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT) ) { - pixelshift(0, 0, W, H, raw.bayersensor, currFrame, ri->get_model(), raw.expos); + pixelshift(0, 0, W, H, raw.bayersensor, currFrame, ri->get_maker(), ri->get_model(), raw.expos); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCB) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD)) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 4924b955a..d1496d4fd 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -269,7 +269,7 @@ protected: void xtransborder_interpolate (int border); void xtrans_interpolate (const int passes, const bool useCieLab); void fast_xtrans_interpolate (); - void pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &model, float rawWpCorrection); + void pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B); From aeb7863a243d113e800d31631894fa6745fa3586 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 12 Dec 2017 22:20:44 +0100 Subject: [PATCH 011/200] RCD border artifacts fixed. Now 8 border pixels are used for interpolation in RCD as 4 caused artifacts. Fixes #4225, patch by agriggio. --- rtengine/demosaic_algos.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index d83b90cef..16c0204dd 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -4213,7 +4213,7 @@ void RawImageSource::rcd_demosaic() } } - border_interpolate2(width, height, 4); + border_interpolate2(width, height, 8); if (plistener) { plistener->setProgress(1); From 48cc4511cc0e1bc1f58291a28f3bb09c9b86ae92 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 13 Dec 2017 00:10:56 +0100 Subject: [PATCH 012/200] generateTranslationDiffs --- rtdata/languages/Catala | 7 +++++-- rtdata/languages/Chinese (Simplified) | 7 +++++-- rtdata/languages/Chinese (Traditional) | 7 +++++-- rtdata/languages/Czech | 7 +++++-- rtdata/languages/Dansk | 7 +++++-- rtdata/languages/Deutsch | 17 ++++++++++------- rtdata/languages/English (UK) | 7 +++++-- rtdata/languages/English (US) | 7 +++++-- rtdata/languages/Espanol | 7 +++++-- rtdata/languages/Euskara | 7 +++++-- rtdata/languages/Francais | 7 +++++++ rtdata/languages/Greek | 7 +++++-- rtdata/languages/Hebrew | 7 +++++-- rtdata/languages/Italiano | 7 +++++-- rtdata/languages/Japanese | 7 +++++-- rtdata/languages/Latvian | 7 +++++-- rtdata/languages/Magyar | 7 +++++-- rtdata/languages/Nederlands | 7 +++++-- rtdata/languages/Norsk BM | 7 +++++-- rtdata/languages/Polish | 7 +++++-- rtdata/languages/Polish (Latin Characters) | 7 +++++-- rtdata/languages/Portugues (Brasil) | 7 +++++-- rtdata/languages/Russian | 7 +++++-- rtdata/languages/Serbian (Cyrilic Characters) | 7 +++++-- rtdata/languages/Serbian (Latin Characters) | 7 +++++-- rtdata/languages/Slovak | 7 +++++-- rtdata/languages/Suomi | 7 +++++-- rtdata/languages/Swedish | 7 +++++-- rtdata/languages/Turkish | 7 +++++-- 29 files changed, 152 insertions(+), 61 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index eda2ad2ad..756df1be3 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1319,6 +1319,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1661,14 +1663,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1915,6 +1917,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 51aed581d..fccf5f847 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1427,6 +1427,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1607,14 +1609,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 !TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1886,6 +1888,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 2476aeb41..09439c2e4 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -979,6 +979,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1462,14 +1464,14 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1842,6 +1844,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 29cf45b3d..8c965e74d 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2184,6 +2184,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters @@ -2209,10 +2211,11 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_RAW_RCD;RCD !TP_TM_FATTAL_AMOUNT;Amount !TP_TM_FATTAL_LABEL;HDR Tone Mapping !TP_TM_FATTAL_THRESHOLD;Threshold diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 0b619b706..079d4d6d8 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 08da90847..cf2f43c95 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -764,6 +764,9 @@ HISTORY_MSG_484;(CIECAM02) - Szene\nAuto Yb% HISTORY_MSG_485;(Objektivkorrektur)\nProfil HISTORY_MSG_486;(Objektivkorrektur)\nProfil - Kamera HISTORY_MSG_487;(Objektivkorrektur)\nProfil - Objektiv +HISTORY_MSG_488;(HDR-Dynamikkompression) +HISTORY_MSG_489;(HDR-Dynamikkompression)\nSchwelle +HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -970,6 +973,7 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Schatten/Lichter PARTIALPASTE_SHARPENEDGE;Kantenschärfung PARTIALPASTE_SHARPENING;Schärfung PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_TM_FATTAL;HDR-Dynamikkompression PARTIALPASTE_VIBRANCE;Dynamik PARTIALPASTE_VIGNETTING;Vignettierungskorrektur PARTIALPASTE_WAVELETGROUP;Wavelet @@ -1970,6 +1974,9 @@ TP_SHARPENMICRO_AMOUNT;Intensität TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;3×3-Matrix statt 5×5-Matrix TP_SHARPENMICRO_UNIFORMITY;Gleichmäßigkeit +TP_TM_FATTAL_AMOUNT;Intensität +TP_TM_FATTAL_LABEL;HDR-Dynamikkompression +TP_TM_FATTAL_THRESHOLD;Schwelle TP_VIBRANCE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hautfarbtöne @@ -2217,10 +2224,6 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -HISTORY_MSG_488;(HDR-Dynamikkompression) -HISTORY_MSG_489;(HDR-Dynamikkompression)\nSchwelle -HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität -PARTIALPASTE_TM_FATTAL;HDR-Dynamikkompression -TP_TM_FATTAL_AMOUNT;Intensität -TP_TM_FATTAL_LABEL;HDR-Dynamikkompression -TP_TM_FATTAL_THRESHOLD;Schwelle +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!TP_RAW_RCD;RCD diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index e4bbcacd8..ac956b114 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -805,6 +805,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1414,14 +1416,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1799,6 +1801,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 31093bc2b..f251950ee 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -723,6 +723,8 @@ !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1373,14 +1375,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1789,6 +1791,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index ec6dcfb37..f27d211db 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1711,6 +1711,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1864,10 +1866,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1990,6 +1992,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 8718554f5..57cdc631a 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index e9efe4005..293ddd6be 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2174,3 +2174,10 @@ ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: f ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: + ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!TP_RAW_RCD;RCD diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 4ffc14338..57cd9d0b3 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -974,6 +974,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1459,14 +1461,14 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1837,6 +1839,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index ef8717fa3..ed89ba392 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 034d16928..f532f3270 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1585,6 +1585,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1735,10 +1737,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1928,6 +1930,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index ae9ff5b7f..33b81ce8f 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1962,6 +1962,8 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -2045,10 +2047,10 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_DIRPYRDENOISE_3X3;3×3 !TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft !TP_DIRPYRDENOISE_5X5;5×5 @@ -2124,6 +2126,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 56e1fabb7..cbfa1d6ae 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index abddd957a..da38b0c4c 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1248,6 +1248,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1612,14 +1614,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1908,6 +1910,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 0ea147eb8..6aaa8ce28 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2156,6 +2156,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters @@ -2184,13 +2186,14 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. +!TP_RAW_RCD;RCD !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 7e68880b8..6a483966c 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -974,6 +974,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1459,14 +1461,14 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1837,6 +1839,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 3c54cc184..7af8c1404 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1668,6 +1668,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1812,10 +1814,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1937,6 +1939,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 85b9e3f0b..4064a96a2 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1668,6 +1668,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1812,10 +1814,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 @@ -1937,6 +1939,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 661f24483..894e5405e 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index a67674975..150ca91e3 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1528,6 +1528,8 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1725,14 +1727,14 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1930,6 +1932,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index b6f614cce..bdc693b54 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1561,6 +1561,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1727,10 +1729,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1929,6 +1931,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 6feba1bf3..58bcc871d 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1561,6 +1561,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1727,10 +1729,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1929,6 +1931,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index f589c3ee1..c42c22637 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1037,6 +1037,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1499,14 +1501,14 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1849,6 +1851,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index ecdcfff8a..1f14fad7c 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -976,6 +976,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1460,14 +1462,14 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1838,6 +1840,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 0f3ddaafd..989207c05 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1955,6 +1955,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -2027,10 +2029,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. @@ -2115,6 +2117,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_MAP;Mask equalizer !TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 937e0dabb..ac3fa70a0 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -975,6 +975,8 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_488;HDR Tone Mapping !HISTORY_MSG_489;HDR TM - Threshold !HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1459,14 +1461,14 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_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_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1837,6 +1839,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !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 From 2c8349887bc0da7c84905f61cb370611982a1e0b Mon Sep 17 00:00:00 2001 From: Hombre Date: Wed, 13 Dec 2017 02:09:15 +0100 Subject: [PATCH 013/200] Adding PS icon to Sony's ARQ files (see #4222) --- rtengine/imagedata.cc | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 47688fca6..f3516e5a8 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -473,7 +473,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // ----------------------- Special file type detection (HDR, PixelShift) ------------------------ - uint16 bitspersample = 0, sampleformat = 0, photometric = 0, compression = 0; + uint16 bitspersample = 0, samplesperpixel = 0, sampleformat = 0, photometric = 0, compression = 0; rtexif::Tag* bps = frameRootDir->findTag("BitsPerSample"); rtexif::Tag* spp = frameRootDir->findTag("SamplesPerPixel"); rtexif::Tag* sf = frameRootDir->findTag("SampleFormat"); @@ -535,6 +535,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } bitspersample = bps->toInt(); + samplesperpixel = spp->toInt(); photometric = pi->toInt(); if (photometric == PHOTOMETRIC_LOGLUV) { @@ -582,6 +583,26 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* sampleFormat = IIOSF_UNSIGNED_SHORT; } } + } else if (photometric == 34892 || photometric == 32892 /* Linear RAW (see DNG spec ; 32892 seem to be a flaw from Sony's ARQ files) */) { + if (sampleformat == SAMPLEFORMAT_IEEEFP) { + sampleFormat = IIOSF_FLOAT; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } else if (sampleformat == SAMPLEFORMAT_INT || sampleformat == SAMPLEFORMAT_UINT) { + if (bitspersample == 8) { // shouldn't occur... + sampleFormat = IIOSF_UNSIGNED_CHAR; + } else if (bitspersample <= 16) { + sampleFormat = IIOSF_UNSIGNED_SHORT; + if (mnote && (!make.compare (0, 4, "SONY")) && bitspersample >= 12 && samplesperpixel == 4) { + isPixelShift = true; +#if PRINT_HDR_PS_DETECTION + printf("PixelShift detected ! -> \"Make\" = SONY, bitsPerPixel > 8, samplesPerPixel == 4\n"); +#endif + } + } + } } else if (photometric == PHOTOMETRIC_LOGLUV) { if (compression == COMPRESSION_SGILOG24) { sampleFormat = IIOSF_LOGLUV24; @@ -764,7 +785,7 @@ FrameData *FramesData::getFrameData (unsigned int frame) const bool FramesData::getPixelShift (unsigned int frame) const { - // So far only Pentax provide multi-frame HDR file. + // So far only Pentax and Sony provide multi-frame HDR file. // Only the first frame contains the HDR tag // If more brand have to be supported, this rule may need // to evolve From 816fbef394f799b53e3ae6ea3ea0f6b4314bddcc Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 13 Dec 2017 14:37:15 +0100 Subject: [PATCH 014/200] use the "correct" order for loading frames in sony_arq_load_raw instead of reordering in pixelshift This is cleaner (avoids having to add special cases for camera maker/model in pixelshift) --- rtengine/dcraw.cc | 8 +++++--- rtengine/pixelshift.cc | 41 ----------------------------------------- 2 files changed, 5 insertions(+), 44 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index b843404e5..75891c589 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2353,19 +2353,21 @@ void CLASS unpacked_load_raw() // RT void CLASS sony_arq_load_raw() { + static unsigned frame2pos[] = { 0, 1, 3, 2 }; int row, col, bits=0; ushort samples[4]; + unsigned frame = frame2pos[shot_select]; while (1 << ++bits < maximum); - for (row=0; row < ((shot_select < 2) ? 1 : raw_height); row++) { + for (row=0; row < ((frame < 2) ? 1 : raw_height); row++) { for (col=0; col < ((row == 0) ? raw_width : 1); col++) { RAW(row,col) = 0; } } for (row=0; row < raw_height; row++) { - int r = row + (shot_select & 1); + int r = row + (frame & 1); for (col=0; col < raw_width; col++) { - int c = col + ((shot_select >> 1) & 1); + int c = col + ((frame >> 1) & 1); read_shorts(samples, 4); if (r < raw_height && c < raw_width) { RAW(r,c) = samples[(2 * (r & 1)) + (c & 1)]; diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 875f87a2f..821983190 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -294,44 +294,6 @@ void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUT *array2D_ptr; - RawDataFrameReorder(const std::string &model, array2D_ptr *rawDataFrames): - model_(model), - frames_(rawDataFrames) - { - if (model_ == "ILCE-7RM3") { - std::swap(frames_[2], frames_[3]); - } - } - - ~RawDataFrameReorder() - { - if (model_ == "ILCE-7RM3") { - std::swap(frames_[2], frames_[3]); - } - } - - unsigned int getframe(unsigned int frame) - { - if (model_ == "ILCE-7RM3") { - if (frame == 2) { - return 3; - } else if (frame == 3) { - return 2; - } - } - return frame; - } - -private: - std::string model_; - array2D_ptr *frames_; -}; - - } using namespace std; @@ -344,9 +306,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA return; } - RawDataFrameReorder reorder_frames(model, rawDataFrames); - frame = reorder_frames.getframe(frame); - RAWParams::BayerSensor bayerParams = bayerParamsIn; bayerParams.pixelShiftAutomatic = true; From a3f7783adfb6f5c647615e588e9f1812f5af3a63 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Wed, 13 Dec 2017 18:29:50 +0100 Subject: [PATCH 015/200] Update Deutsch locale --- rtdata/languages/Deutsch | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index cf2f43c95..f011096b8 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -46,6 +46,7 @@ #45 15.10.2017 Erweiterung (TooWaBoo) RT 5.3 #46 18.10.2017 Erweiterung (TooWaBoo) RT 5.3 #47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 +#48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -2224,6 +2225,6 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!HISTORY_MSG_491;White Balance -!HISTORY_MSG_492;RGB Curves -!TP_RAW_RCD;RCD +HISTORY_MSG_491;(Weißabgleich) +HISTORY_MSG_492;(RGB-Kurven) +TP_RAW_RCD;RCD From a17084f6388df890af10775b95af23daf6652d7e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 13 Dec 2017 20:34:18 +0100 Subject: [PATCH 016/200] pixelshift: add preliminary constants and camconst.json entry for Sony ILCE-7RM3, kudos to @iliasg for providing them --- rtengine/camconst.json | 7 +++++++ rtengine/pixelshift.cc | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 5a3a18fd1..610a22310 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2285,6 +2285,13 @@ Camera constants: "ranges": { "black": 800, "white": 16300 } }, + { // Quality C, + "make_model": "Sony ILCE-7RM3", + "dcraw_matrix": [ 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 ], // DNG_v10.1 D65 + "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage + "ranges": { "black": 512, "white": 16300 } + }, + { // Quality C, No proper color data, beta samples, frame set to official jpeg, "make_model": [ "XIAOYI M1", "YI TECHNOLOGY M1" ], "dcraw_matrix": [ 7158,-1911,-606,-3603,10669,2530,-659,1236,5530 ], // XIAO YI DNG D65 diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 821983190..b5c5fb88c 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////// // -// Algorithm for Pentax Pixel Shift raw files with motion detection +// Algorithm for Pentax/Sony Pixel Shift raw files with motion detection // // Copyright (C) 2016 - 2017 Ingo Weyrich // @@ -504,6 +504,42 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA static const float ePerIsoK70 = 0.5f; + // preliminary ILCE-7RM3 data, good fidelity except from A) small innaccuracy at places + // due to integer scaling quantization, B) much different noise behavior of PDAF pixels + static const float nReadILCE7RM3[] = { 4.2f, // ISO 100 + 3.9f, // ISO 125 + 3.6f, // ISO 160 + 3.55f, // ISO 200 + 3.5f, // ISO 250 + 3.45f, // ISO 320 + 3.35f, // ISO 400 + 3.3f, // ISO 500 + 1.3f, // ISO 640 + 1.2f, // ISO 800 + 1.2f, // ISO 1000 + 1.2f, // ISO 1250 + 1.15f, // ISO 1600 + 1.2f, // ISO 2000 + 1.15f, // ISO 2500 + 1.15f, // ISO 3200 + 1.1f, // ISO 4000 + 1.1f, // ISO 5000 + 1.05f, // ISO 6400 + 1.05f, // ISO 8000 + 1.05f, // ISO 10000 + 1.0f, // ISO 12800 + 1.0f, // ISO 16000 + 1.0f, // ISO 20000 + 1.0f, // ISO 25600 + 1.0f, // ISO 32000 + 1.0f, // ISO 40000 + 1.0f, // ISO 51200 + 1.1f, // ISO 64000 + 1.1f, // ISO 80000 + 1.1f, // ISO 102400 + }; + static const float ePerIsoILCE7RM3 = 0.8f; + if(plistener) { plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT))); plistener->setProgress(0.0); @@ -530,6 +566,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA } else if(model.find("K-1") != string::npos) { nRead = nReadK1[nReadIndex]; eperIsoModel = ePerIsoK1; + } else if(model.find("ILCE-7RM3") != string::npos) { + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; } else { // as long as we don't have values for Pentax KP, we use the values from K-70 nRead = nReadK70[nReadIndex]; eperIsoModel = ePerIsoK70; From b8ff7c4f7d9fca5b0b9c41d6f9e27e9bb5fa5de2 Mon Sep 17 00:00:00 2001 From: Hombre Date: Wed, 13 Dec 2017 23:35:00 +0100 Subject: [PATCH 017/200] Attempt to fix #4223 : "i586 build broken (reported by Marcin Bajor)" --- rtgui/exifpanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index da2659a4f..cd054e7ab 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -47,7 +47,7 @@ ExifPanel::ExifPanel () : idata (nullptr) exifTree->set_model (exifTreeModel); exifTree->set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_NONE); exifTree->set_row_separator_func ( - [&] (const Glib::RefPtr& model, const Gtk::TreeModel::iterator & row) { + [&] (const Glib::RefPtr& model, const Gtk::TreeModel::iterator & row)-> bool { return row->get_value (exifColumns.isSeparator); } ); From acd17ac51044688df1089c29596ea98c8009f19b Mon Sep 17 00:00:00 2001 From: Benitoite Date: Wed, 13 Dec 2017 16:40:50 -0800 Subject: [PATCH 018/200] MacOS: update macosx_bundle.sh Copies libiomp5 and liblensfun.1 to Frameworks, and uses lensfun db 2. --- tools/osx/macosx_bundle.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 8b9cbccb6..20a140ce5 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -156,7 +156,13 @@ ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" -cp /opt/local/share/lensfun/version_1/* "${RESOURCES}/share/lensfun" +cp /opt/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" + +# Copy liblensfun to Frameworks +cp /opt/local/lib/liblensfun.1.dylib "${RESOURCES}/../Frameworks" + +# Copy libiomp5 to Frameworks +cp /opt/local/lib/libomp/libiomp5.dylib "${RESOURCES}/../Frameworks" # Copy the libiomp5 license into the app bundle cp "${PROJECT_SOURCE_DIR}/licenses/osx_libiomp5_LICENSE.txt" "${RESOURCES}" From 566413957965696452223ac41ee86d5d3d1f44df Mon Sep 17 00:00:00 2001 From: Benitoite Date: Wed, 13 Dec 2017 18:23:21 -0800 Subject: [PATCH 019/200] include string header for colortemp.h To fix mac clang compilation ````error: implicit instantiation of undefined template 'std::__1::basic_string, std::__1::allocator >' std::string method;```` --- rtengine/colortemp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h index d96e6f5ce..145c8ed20 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -21,6 +21,7 @@ #include #include +#include namespace rtengine { From 1854147ce92ef7c0a9b56dff5024c3f4e331fd2c Mon Sep 17 00:00:00 2001 From: Desmis Date: Thu, 14 Dec 2017 09:09:10 +0100 Subject: [PATCH 020/200] Change MINTEMP0 to 2000 in colorapperance to avoid crash --- rtgui/colorappearance.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 7a31ae39f..c9fb1baa3 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -21,7 +21,7 @@ #include "guiutils.h" #include "../rtengine/color.h" -#define MINTEMP0 1500 //1200 +#define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 #define CENTERTEMP0 5000 #define MINGREEN0 0.8 From a595cae6d6709233a3f238a0e829877122bf4693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mari=C3=A1n=20Kyral?= Date: Thu, 14 Dec 2017 19:59:34 +0100 Subject: [PATCH 021/200] Czech translation update --- rtdata/languages/Czech | 164 ++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 85 deletions(-) diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 8c965e74d..67c2cf0e3 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -38,7 +38,7 @@ #37 2017-01-10 updated by mkyral #38 2017-04-26 updated by mkyral #39 2017-07-21 updated by mkyral - +#40 2017-12-13 updated by mkyral ABOUT_TAB_BUILD;Verze ABOUT_TAB_CREDITS;Zásluhy ABOUT_TAB_LICENSE;Licence @@ -73,6 +73,7 @@ CURVEEDITOR_TOOLTIPPASTE;Vložit křivku ze schránky. CURVEEDITOR_TOOLTIPSAVE;Uložit současnou křivku. CURVEEDITOR_TYPE;Typ DIRBROWSER_FOLDERS;Složky +DONT_SHOW_AGAIN;Zprávu znova nezobrazovat. DYNPROFILEEDITOR_DELETE;Smazat DYNPROFILEEDITOR_EDIT;Upravit DYNPROFILEEDITOR_EDIT_RULE;Upravit pravidlo dynamického profilu @@ -107,6 +108,7 @@ EXIFPANEL_RESET;Obnovit EXIFPANEL_RESETALL;Obnovit vše EXIFPANEL_RESETALLHINT;Obnoví původní hodnoty u všech štítků. EXIFPANEL_RESETHINT;Obnoví původní hodnoty u vybraných štítků. +EXIFPANEL_SHOWALL;Zobrazit vše EXIFPANEL_SUBDIRECTORY;Podadresář EXPORT_BYPASS;Kroky zpracování pro přeskočení EXPORT_BYPASS_ALL;Vybrat / Zrušit výběr všeho @@ -271,6 +273,7 @@ GENERAL_PORTRAIT;Na výšku GENERAL_SAVE;Uložit GENERAL_UNCHANGED;(Beze změny) GENERAL_WARNING;Varování +GIMP_PLUGIN_INFO;Vítejte v RawTherapee doplňku pro GIMP!\nPo dokončení úprav prostě zavřete hlavní okno RawTherapee a obrázek bude automaticky načten GIMPem. HISTOGRAM_TOOLTIP_B;Skrýt/Zobrazit histogram modré. HISTOGRAM_TOOLTIP_BAR;Skrýt/Zobrazit řádek RGB indikátoru\nKlikněte pravým tlačítkem myši na náhled pro zmrazení/uvolnění. HISTOGRAM_TOOLTIP_CHRO;Skrýt/Zobrazit histogram barevnosti. @@ -316,9 +319,9 @@ HISTORY_MSG_30;RLD - Poloměr HISTORY_MSG_31;RLD - Míra HISTORY_MSG_32;RLD - Útlum HISTORY_MSG_33;RLD - Průchody -HISTORY_MSG_34;LCP korekce zkreslení -HISTORY_MSG_35;LCP korekce vinětace -HISTORY_MSG_36;LCP korekce CA +HISTORY_MSG_34;Korekce objektivu - Zkreslení +HISTORY_MSG_35;Korekce objektivu - Vinětace +HISTORY_MSG_36;Korekce objektivu - ChA HISTORY_MSG_37;Expozice - Automatické úrovně HISTORY_MSG_38;Vyvážení bílé - Metoda HISTORY_MSG_39;VB - Teplota @@ -367,7 +370,7 @@ HISTORY_MSG_81;Změna velikosti HISTORY_MSG_82;Profil změněn HISTORY_MSG_83;S/S - Maska ostrosti HISTORY_MSG_84;Korekce perspektivy -HISTORY_MSG_85;LCP +HISTORY_MSG_85;Korekce objektivu - LCP soubor HISTORY_MSG_86;RGB křivky - Režim svítivost HISTORY_MSG_87;Redukce impulzního šumu HISTORY_MSG_88;Redukce impulzního šumu - práh @@ -741,6 +744,23 @@ HISTORY_MSG_472;PS - plynulé přechody HISTORY_MSG_473;PS - Použít LMMSE HISTORY_MSG_474;PS - korekce HISTORY_MSG_475;PS - korekce kanálu +HISTORY_MSG_476;CAM02 - Teplota (výstup) +HISTORY_MSG_477;CAM02 - Zelená (výstup) +HISTORY_MSG_478;CAM02 - Yb (výstup) +HISTORY_MSG_479;CAM02 - CAT02 přizpůsobení (výstup) +HISTORY_MSG_480;CAM02 - Automatická CAT02 (výstup) +HISTORY_MSG_481;CAM02 - Teplota scény +HISTORY_MSG_482;CAM02 - Zelená scény +HISTORY_MSG_483;CAM02 - Yb scény +HISTORY_MSG_484;CAT02 - Automatická Yb scény +HISTORY_MSG_485;Korekce objektivu +HISTORY_MSG_486;Korekce objektivu - Fotoaparát +HISTORY_MSG_487;Korekce objektivu - Objektiv +HISTORY_MSG_488;HDR Mapování tónů +HISTORY_MSG_489;HDR TM - Práh +HISTORY_MSG_490;HDR TM - Míra +HISTORY_MSG_491;Vyvážení bílé +HISTORY_MSG_492;RGB křivky HISTORY_NEWSNAPSHOT;Přidat HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s HISTORY_SNAPSHOT;Snímek @@ -787,6 +807,10 @@ IPTCPANEL_TITLE;Titulek IPTCPANEL_TITLEHINT;Vložte krátké, popisné a lidsky čitelné jméno obrázku. Například název souboru. IPTCPANEL_TRANSREFERENCE;Číslo úlohy IPTCPANEL_TRANSREFERENCEHINT;Zadejte číslo nebo identifikátor potřebný v pracovním postupu nebo pro sledování. +LENSPROFILE_CORRECTION_AUTOMATCH;Automatický dohledané korekční parametry +LENSPROFILE_CORRECTION_LCPFILE;LCP Soubor +LENSPROFILE_CORRECTION_MANUAL;Ruční korekční parametry +LENSPROFILE_LENS_WARNING;Varování: crop factor použitý pro profilování objektivu je větší než crop factor fotoaparátu. Výsledek může být nesprávný. MAIN_BUTTON_FULLSCREEN;Celá obrazovka MAIN_BUTTON_NAVNEXT_TOOLTIP;Přejít k dalšímu obrázku relativnímu k obrázku otevřenému v editoru.\nZkratka: Shift-F4\n\nPřejít k dalšímu obrázku relativnímu k vybranému náhledu v prohlížeči souborů nebo na filmovém pásu:\nZkratka: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Přejít k předchozímu obrázku relativnímu k obrázku otevřenému v editoru.\nZkratka: Shift-F3\n\nPřejít k předchozímu obrázku relativnímu k vybranému náhledu v prohlížeči souborů nebo na filmovém pásu:\nZkratka: F3 @@ -845,6 +869,7 @@ MAIN_TAB_WAVELET_TOOLTIP;Zkratka: Alt-w MAIN_TOOLTIP_BACKCOLOR0;Barva pozadí náhledu: Dle motivu\nZkratka: 9 MAIN_TOOLTIP_BACKCOLOR1;Barva pozadí náhledu: Černá\nZkratka: 9 MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: Bílá\nZkratka: 9 +MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: Středně šedá\nZkratka: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Zamknout / Odemknout pohled Před\n\nZamknout: ponechá pohled Před nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\nOdemknout: pohled Před bude následovat pohled Poté, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje. MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: l MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: < @@ -912,7 +937,7 @@ PARTIALPASTE_IMPULSEDENOISE;Redukce impulzního šumu PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;L*a*b* úpravy PARTIALPASTE_LENSGROUP;Nastavení související s objektivy -PARTIALPASTE_LENSPROFILE;Korekční profil objektivu +PARTIALPASTE_LENSPROFILE;Korekční profily objektivů PARTIALPASTE_METAGROUP;Metadata PARTIALPASTE_PCVIGNETTE;Viněta PARTIALPASTE_PERSPECTIVE;Perspektiva @@ -933,7 +958,7 @@ PARTIALPASTE_RAW_DMETHOD;Metoda demozajkování PARTIALPASTE_RAW_FALSECOLOR;Potlačení chybných barev PARTIALPASTE_RAW_IMAGENUM;Dílčí snímek PARTIALPASTE_RAW_LMMSEITERATIONS;Kroky rozšíření LMMSE -PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift PARTIALPASTE_RESIZE;Změna velikosti PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;RGB křivky @@ -942,6 +967,7 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Stíny/Světla PARTIALPASTE_SHARPENEDGE;Hrany PARTIALPASTE_SHARPENING;Doostření (USM/RL) PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_TM_FATTAL;HDR mapování tónů PARTIALPASTE_VIBRANCE;Živost PARTIALPASTE_VIGNETTING;Korekce vinětace PARTIALPASTE_WAVELETGROUP;Úrovně vlnky @@ -954,6 +980,7 @@ PREFERENCES_AUTLISSTD;Vysoké PREFERENCES_AUTLISVLOW;Ne PREFERENCES_AUTLOW;Nízká PREFERENCES_AUTOMONPROFILE;Použít barevný profil hlavního monitoru z operačního systému +PREFERENCES_AUTOSAVE_TP_OPEN;Před ukončením automaticky uložit\nstav sbalení/rozbalení nástrojů. PREFERENCES_AUTSTD;Běžná PREFERENCES_BATCH_PROCESSING;Dávkové zpracování PREFERENCES_BEHADDALL;Vše do 'Přidat' @@ -989,18 +1016,20 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Jméno PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Cesta k programu PREFERENCES_CUTOVERLAYBRUSH;Barva masky ořezu/průhlednosti -PREFERENCES_D50;5000K +PREFERENCES_D50;Nastavení v hlavní nabídce +PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K PREFERENCES_DARKFRAMEFOUND;Nalezeno PREFERENCES_DARKFRAMESHOTS;snímků -PREFERENCES_DARKFRAMETEMPLATES;šablon +PREFERENCES_DARKFRAMETEMPLATES;šablony PREFERENCES_DATEFORMAT;Formát data PREFERENCES_DATEFORMATHINT;Lze použít následující formátovací řetězce:\n%y\t- rok (year)\n%m\t- měsíc (month)\n%d\t- den (day)\n\nNapříklad český formát data:\n%d. %m. %y PREFERENCES_DAUB_LABEL;Použít D6 Daubechiesové vlnky namísto D4 PREFERENCES_DAUB_TOOLTIP;Nástroje Redukce šumu a Úrovně vlnky používají Daubechiesové mateřskou vlnku. Pokud místo D4 vyberete D6 zvýší se počet ortogonálních Daubechiesové koeficientů a pravděpodobně zvýší kvalitu úrovní malého měřítka. Není zde rozdíl ve spotřebě paměti nebo délce zpracování. PREFERENCES_DIRDARKFRAMES;Složka tmavých snímků +PREFERENCES_DIRECTORIES;Složky PREFERENCES_DIRHOME;Domovská složka PREFERENCES_DIRLAST;Poslední navštívená složka PREFERENCES_DIROTHER;Jiná @@ -1016,7 +1045,7 @@ PREFERENCES_FILEFORMAT;Formát souboru PREFERENCES_FLATFIELDFOUND;Nalezeno PREFERENCES_FLATFIELDSDIR;Složka Flat Field souborů PREFERENCES_FLATFIELDSHOTS;snímků -PREFERENCES_FLATFIELDTEMPLATES;šablon +PREFERENCES_FLATFIELDTEMPLATES;šablony PREFERENCES_FLUOF2;Fluorescenční F2 PREFERENCES_FLUOF7;Fluorescenční F7 PREFERENCES_FLUOF11;Fluorescenční F11 @@ -1029,7 +1058,8 @@ PREFERENCES_GREY;Yb svítivost výstupního zařízení (%) 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_GREY18;Nastavení v hlavní nabídce +PREFERENCES_GREY18_OLD;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 @@ -1051,6 +1081,7 @@ PREFERENCES_INTENT_PERCEPTUAL;Vnímání PREFERENCES_INTENT_RELATIVE;Relativní kolorimetrie PREFERENCES_INTENT_SATURATION;Nasycení PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Ukázat vložené JPEG náhledy u needitovaných snímků +PREFERENCES_LANG;Jazyk PREFERENCES_LANGAUTODETECT;Použít systémový jazyk PREFERENCES_LEVAUTDN;Úroveň odšumění PREFERENCES_LEVDN;Velikost buňky @@ -1112,6 +1143,7 @@ PREFERENCES_REMEMBERZOOMPAN;Zapamatovat si procento přiblížení a posun obrá PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Zapamatovat si procento přiblížení a posun aktuálního obrázku a použít tyto hodnoty při otevírání nového obrázku.\n\nTato volba funguje pouze v režimu "Mód jedné karty editoru" a volba "Metoda demozajkování pro náhled při přiblížení menším než 100%" je nastavena na "Stejně jako v PP3". PREFERENCES_RGBDTL_LABEL;Maximální počet vláken pro redukci šumu a úrovně vlnky PREFERENCES_RGBDTL_TOOLTIP;Pro automatické nastavení maximálního možného počtu vláken ponechte nastaveno na "0". Čím více vláken běží paralelně, tím rychlejší je výpočet. Paměťové nároky najdete na RawPedii. +PREFERENCES_SAVE_TP_OPEN_NOW;Uložit stav sbalení/rozbalení nástrojů hned PREFERENCES_SELECTFONT;Vyberte hlavní písmo PREFERENCES_SELECTFONT_COLPICKER;Vybrat písmo pro Průzkumníka barev PREFERENCES_SELECTLANG;Volba jazyka @@ -1142,6 +1174,7 @@ PREFERENCES_TAB_GENERAL;Obecné PREFERENCES_TAB_IMPROC;Zpracování obrázku PREFERENCES_TAB_PERFORMANCE;Výkon a kvalita PREFERENCES_TAB_SOUND;Zvuky +PREFERENCES_THEME;Vzhled PREFERENCES_TIMAX;Vysoký PREFERENCES_TINB;Počet dlaždic PREFERENCES_TISTD;Běžný @@ -1165,7 +1198,7 @@ PROFILEPANEL_MODE_TIP;Režim uplatnění profilu zpracování.\n\nTlačítko je PROFILEPANEL_MYPROFILES;Mé profily PROFILEPANEL_PASTEPPASTE;Parametry pro vložení PROFILEPANEL_PCUSTOM;Vlastní -PROFILEPANEL_PDYNAMIC;Dynamiký +PROFILEPANEL_PDYNAMIC;Dynamický PROFILEPANEL_PFILE;Ze souboru PROFILEPANEL_PINTERNAL;Neutrální PROFILEPANEL_PLASTSAVED;Poslední uschovaný @@ -1189,13 +1222,21 @@ PROGRESSBAR_SAVEPNG;Ukládání PNG souboru... PROGRESSBAR_SAVETIFF;Ukládání TIFF souboru... PROGRESSBAR_SNAPSHOT_ADDED;Snímek přidán PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil upracování změněn v prohlížeči +QINFO_FRAMECOUNT;%2 snímků +QINFO_HDR;HDR / %2 snímků QINFO_ISO;ISO QINFO_NOEXIF;Exif údaje nejsou k dispozici. +QINFO_PIXELSHIFT;Pixel Shift / %2 snímků +SAMPLEFORMAT_0;Neznámý datový formát +SAMPLEFORMAT_1;Neznaménkový, 8 bitů +SAMPLEFORMAT_2;Neznaménkový, 16 bitů +SAMPLEFORMAT_4;LogLuv, 24 bitů +SAMPLEFORMAT_8;LogLuv, 32 bitů +SAMPLEFORMAT_16;S pohyblivou čárkou, 32 bitů SAVEDLG_AUTOSUFFIX;Automaticky přidat příponu pokud soubor již existuje SAVEDLG_FILEFORMAT;Formát souboru SAVEDLG_FORCEFORMATOPTS;Vynutit volby uložení SAVEDLG_JPEGQUAL;Kvalita JPEG -SAVEDLG_PNGCOMPR;PNG Komprese SAVEDLG_PUTTOQUEUE;Vložit soubor do fronty SAVEDLG_PUTTOQUEUEHEAD;Vložit na začátek fronty SAVEDLG_PUTTOQUEUETAIL;Vložit na konec fronty @@ -1209,8 +1250,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Nejlepší komprese:\nJ:a:b 4:2:0\nh/v 2/2\nO polovinu s SAVEDLG_TIFFUNCOMPRESSED;Nekomprimovaný TIFF SAVEDLG_WARNFILENAME;Soubor bude pojmenován SHCSELECTOR_TOOLTIP;Klikněte pravým tlačítkem myši pro obnovení výchozí pozice těchto tří posuvníků. -SOFTPROOF_GAMUTCHECK_TOOLTIP;Pokud je aktivní, budou pixely mimo barevnou paletu výstupního profilu označeny šedou barvou. -SOFTPROOF_TOOLTIP;Jemně korekční\nPokud je aktivní, umožní vám simulovat vykreslení dle výstupního profilu ICM. Nejužitečnější pro simulaci tiskového výstupu. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Pokud je aktivní, budou pixely mimo barevnou paletu profilu tiskárnyoznačeny šedou barvou. +SOFTPROOF_TOOLTIP;Jemně korekční\nPokud je aktivní, umožní vám simulovat výstup tiskárny pomocí profilu tiskárny nastaveného v Volby > Správa barev. THRESHOLDSELECTOR_B;Dole THRESHOLDSELECTOR_BL;Dole vlevo THRESHOLDSELECTOR_BR;Dole vpravo @@ -1299,11 +1340,11 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Překlopit horizontálně. TP_COARSETRAF_TOOLTIP_ROTLEFT;Otočit doleva.\n\nZkratky:\n[ - režim více karet editoru,\nAlt-[- režim jedné karty editoru. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Otočit doprava.\n\nZkratky:\n] - režim více karet editoru,\nAlt-]- režim jedné karty editoru. TP_COARSETRAF_TOOLTIP_VFLIP;Překlopit vertikálně. -TP_COLORAPP_ADAPTSCENE;Svítivost scény -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolutní jas scény prostředí(cd/m²).\n 1) Vypočítáno z Exifu:\nRychlost závěrky - citlivost - clona - expoziční korekce fotoaparátu.\n 2) Vypočítáno z hodnoty raw bílého bodu a expoziční kompenzace Rawtherapee. -TP_COLORAPP_ADAPTVIEWING;Svítivost prohlížení (cd/m²) +TP_COLORAPP_ADAPTSCENE;Absolutní jas scény +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolutní jas scény prostředí (cd/m²).\n 1) Vypočítáno z Exifu:\nRychlost závěrky - citlivost - clona - expoziční korekce fotoaparátu.\n 2) Vypočítáno z hodnoty raw bílého bodu a expoziční kompenzace Rawtherapee. +TP_COLORAPP_ADAPTVIEWING;Absolutní jas prohlížení (cd/m²) TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolutní jas prostředí prohlížení\n(obvykle 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RT vypočítá optimální hodnotu z Exif dat.\nPokud si přejete zadat hodnotu ručně, nejprve zrušte zatržení tohoto pole. +TP_COLORAPP_ADAP_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RawTherapee vypočítá optimální hodnotu z Exif dat.\nPokud si přejete zadat hodnotu ručně, nejprve zrušte zatržení tohoto pole. TP_COLORAPP_ALGO;Algoritmus TP_COLORAPP_ALGO_ALL;Vše TP_COLORAPP_ALGO_JC;Světlost + Barevnost (JC) @@ -1323,8 +1364,8 @@ TP_COLORAPP_CHROMA_TOOLTIP;Barevnost se v CIECAM02 liší od barevnosti L*a*b* a TP_COLORAPP_CIECAT_DEGREE;CAT02 přizpůsobení TP_COLORAPP_CONTRAST;Kontrast (I) TP_COLORAPP_CONTRAST_Q;Kontrast (O) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast pro posuvník Q se v CIECAM02 liší od kontrastu L*a*b* a RGB. -TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast pro posuvník J se v CIECAM02 liší od kontrastu L*a*b* a RGB. +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. +TP_COLORAPP_CONTRAST_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. TP_COLORAPP_CURVEEDITOR1;Tónová křivka 1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Zobrazuje histogram L* (L*a*b*) křivky před CIECAM02.\nPokud je volba "Zobrazit CIECAM02 histogramy výstupu v křivkách" povolena, zobrazí histogram J nebo Q po CIECAM02 .\n\nJ a Q histogramy nejsou na hlavním panelu zobrazeny.\n\nHistogram konečného výsledku je zobrazen na hlavním panelu. TP_COLORAPP_CURVEEDITOR2;Tónová křivka 2 @@ -1335,6 +1376,7 @@ TP_COLORAPP_DATACIE;CIECAM02 histogramy výstupu v křivkách TP_COLORAPP_DATACIE_TOOLTIP;Pokud je povoleno, zobrazuje histogram v CIECAM02 křivkách přibližné hodnoty/rozsahy po CIECAM02 úpravách J nebo Q, a C, S nebo M.\nVýběr neovlivňuje histogram na hlavním panelu.\n\nPokud je zakázáno, zobrazuje histogram v CIECAM02 křivkách L*a*b* hodnoty před CIECAM02 úpravami. TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RawTherapee vypočítá optimální hodnotu, jenž následně používá jak CAT02 tak i celý CIECAM02.\nZakažte, pokud si přejete zadat hodnotu ručně (doporučeny jsou hodnoty nad 65). TP_COLORAPP_DEGREE_TOOLTIP;Míra CIE Chromatic Adaptation Transform 2002. +TP_COLORAPP_FREE;Volná teplota + zelená + CAT02 + [výstup] TP_COLORAPP_GAMUT;Kontrola palety (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Povolí kontrolu palety v L*a*b* režimu. TP_COLORAPP_HUE;Odstín (h) @@ -1346,7 +1388,9 @@ TP_COLORAPP_LABEL_VIEWING;Podmínky zobrazení TP_COLORAPP_LIGHT;Světlost (I) TP_COLORAPP_LIGHT_TOOLTIP;Světlost v CIECAM02 se liší od světlosti v L*a*b* a RGB. TP_COLORAPP_MODEL;VB - Model -TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RT , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno ve Volby > Správa barev.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RT nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno ve Volby > Správa barev. +TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RawTherapee , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RawTherapee nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nVolná teplota+zelená + CAT02 + [výstup]: teplota a zelená je vybrána uživatelem, vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení. +TP_COLORAPP_NEUTRAL;Obnovit +TP_COLORAPP_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek. TP_COLORAPP_RSTPRO;Ochrana červených a pleťových tónů TP_COLORAPP_RSTPRO_TOOLTIP;Ochrana červených a pleťových tónů ovlivňuje posuvníky i křivky. TP_COLORAPP_SHARPCIE;--nepoužito-- @@ -1367,10 +1411,14 @@ TP_COLORAPP_TCMODE_LABEL2;Mód křivky 2 TP_COLORAPP_TCMODE_LABEL3;Mód barevné křivky TP_COLORAPP_TCMODE_LIGHTNESS;Světlost TP_COLORAPP_TCMODE_SATUR;Nasycení +TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Tint=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504 TP_COLORAPP_TONECIE;Mapování tónů pomocí CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Pokud je volba zakázána, probíhá mapování tónů v prostoru L*a*b*.\nPokud je volba povolena. probíhá mapování tónů pomocí CIECAM02.\nAby měla tato volba efekt, musí být povolen nástroj Mapování tónů. TP_COLORAPP_WBCAM;WB [RT+CAT02] + [výstup] TP_COLORAPP_WBRT;WB [RT] + [výstup] +TP_COLORAPP_YB;Yb% (střední jas) +TP_COLORAPP_YBSCENE;Yb% (střední jas) +TP_COLORAPP_YBSCENE_TOOLTIP;Pokud je povolena automatika, Yb je vypočteno ze střední hodnoty jasu aktuálního obrázku TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automaticky TP_COLORTONING_BALANCE;Vyvážené @@ -1587,7 +1635,7 @@ TP_HSVEQUALIZER_LABEL;HSV korekce TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Základní expozice -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Použije vložený DCP základní posun expozice. Toto nastavení je dostupné pouze ji pokud DCP obsahuje. +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Použije vložený DCP základní posun expozice. Toto nastavení je dostupné pouze pokud ji vybrané DCP obsahuje. TP_ICM_APPLYHUESATMAP;Základní tabulka TP_ICM_APPLYHUESATMAP_TOOLTIP;Použije vloženou DCP základní tabulku (HueSatMap). Toto nastavení je dostupné pouze pokud ji vybrané DCP obsahuje. TP_ICM_APPLYLOOKTABLE;Tabulka vzhledu @@ -1597,7 +1645,7 @@ TP_ICM_BLENDCMSMATRIX_TOOLTIP;Povolit obnovení vypálených jasů při použit TP_ICM_BPC;Kompenzace černého bodu TP_ICM_DCPILLUMINANT;Osvětlení TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolované -TP_ICM_DCPILLUMINANT_TOOLTIP;Vyberte které vložené DCP osvětlení se má použít. Ve výchozím stavu se použije "interpolované", což je mix mezi dvěma osvětleními založenými na vyvážení bílé. Nastavené je dostupné pouze v případě, že je povoleno dvojité DCP osvětlení s podporou interpolace. +TP_ICM_DCPILLUMINANT_TOOLTIP;Vyberte které vložené DCP osvětlení se má použít. Ve výchozím stavu se použije "interpolované", což je mix mezi dvěma osvětleními založenými na vyvážení bílé. Nastavené je povoleno pouze v případě, že je vybráno\t dvojité DCP osvětlení s podporou interpolace. TP_ICM_INPUTCAMERA;Standard fotoaparátu TP_ICM_INPUTCAMERAICC;Automatický dohledaný profil fotoaparátu TP_ICM_INPUTCAMERAICC_TOOLTIP;Použít RawTherapee specifický DCP nebo ICC vstupní barevný profil fotoaparátu jenž je mnohem přesnější než zjednodušená matice. Není dostupné pro všechny fotoaparáty. Profily jsou uloženy ve složkách /iccprofiles/input a /dcpprofiles a jsou automaticky vybrány dle jména souboru shodného s fotoaparátem. @@ -1619,7 +1667,7 @@ TP_ICM_SAVEREFERENCE_APPLYWB;Aplikovat vyvážení bílé TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Obecně se vyvážení bílé aplikuje při ukládání obrázku pro vytvoření ICC profilů a neaplikuje při vytváření DCP profilů. TP_ICM_SAVEREFERENCE_TOOLTIP;Uloží lineární TIFF obrázek před aplikováním vstupního profilu. Výsledek může být použit pro kalibraci a generování profilu fotoaparátu. TP_ICM_TONECURVE;Tónová křivka -TP_ICM_TONECURVE_TOOLTIP;Použije vloženou DCP tónovou křivku. Nastavení je dostupné pouze v případě, že DCP obsahuje tónovou křivku. +TP_ICM_TONECURVE_TOOLTIP;Použije vloženou DCP tónovou křivku. Nastavení je dostupné pouze v případě, že vybrané DCP obsahuje tónovou křivku. TP_ICM_WORKINGPROFILE;Pracovní barevný prostor TP_IMPULSEDENOISE_LABEL;Redukce impulzního šumu TP_IMPULSEDENOISE_THRESH;Práh @@ -1663,7 +1711,7 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Pracuje s posuvníkem barevnosti a CC křivkou. TP_LENSGEOM_AUTOCROP;Automatický ořez TP_LENSGEOM_FILL;Automatické vyplnění TP_LENSGEOM_LABEL;Objektiv / Geometrie -TP_LENSPROFILE_LABEL;Korekční profil objektivu +TP_LENSPROFILE_LABEL;Korekční profily objektivů TP_LENSPROFILE_USECA;Korekce chromatické aberace TP_LENSPROFILE_USEDIST;Korekce zkreslení TP_LENSPROFILE_USEVIGN;Korekce vinětace @@ -1779,6 +1827,7 @@ TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Vyhlazení přechodů mezi oblastmi s pohybem a TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev faktor modrý TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev faktor zelený TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev faktor červený +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Snímač s Bayerovou maskou TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Tří průchodová dává lepší výsledky (doporučeno pro fotky s nízkým ISO).\nJednoprůchodová je téměř k nerozeznání od tří průchodové pro vysoké ISO a je rychlejší. TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí @@ -1919,6 +1968,9 @@ TP_SHARPENMICRO_AMOUNT;Kvantita TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;Matice 3×3 namísto 5×5 TP_SHARPENMICRO_UNIFORMITY;Jednolitost +TP_TM_FATTAL_AMOUNT;Míra +TP_TM_FATTAL_LABEL;HDR Mapování tónů +TP_TM_FATTAL_THRESHOLD;Práh TP_VIBRANCE_AVOIDCOLORSHIFT;Zabránit posunu barev TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tóny pleti @@ -2112,7 +2164,7 @@ TP_WBALANCE_CLOUDY;Zataženo TP_WBALANCE_CUSTOM;Vlastní TP_WBALANCE_DAYLIGHT;Denní světlo (slunečno) TP_WBALANCE_EQBLUERED;Korekce modrá/červená -TP_WBALANCE_EQBLUERED_TOOLTIP;Umožňuje odchýlení se od normálního chování "vyvážení bílé" pomocí změny vyvážení modré a červené.\nToto může být užitečné v těchto případech:\na) podmínky jsou velmi odlišné od standardních (například pod vodou),\nb) podmínky se velmi liší od podmínek za kterých probíhala kalibrace,\nc) nevhodné snímače nebo ICC profily. +TP_WBALANCE_EQBLUERED_TOOLTIP;Umožňuje odchýlení se od normálního chování "vyvážení bílé" pomocí změny vyvážení modré a červené.\nToto může být užitečné v těchto případech:\na) podmínky jsou velmi odlišné od běžného osvětlení (například pod vodou),\nb) podmínky se velmi liší od podmínek za kterých probíhala kalibrace,\nc) nevhodné snímače nebo ICC profily. TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta @@ -2161,61 +2213,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit obrazovce\nZkratka: Alt-ff ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: + ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!DONT_SHOW_AGAIN;Don't show this message again. -!EXIFPANEL_SHOWALL;Show all -!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -!HISTORY_MSG_476;CAM02 - Temp out -!HISTORY_MSG_477;CAM02 - Green out -!HISTORY_MSG_478;CAM02 - Yb out -!HISTORY_MSG_479;CAM02 - CAT02 adaptation out -!HISTORY_MSG_480;CAM02 - Automatic CAT02 out -!HISTORY_MSG_481;CAM02 - Temp scene -!HISTORY_MSG_482;CAM02 - Green scene -!HISTORY_MSG_483;CAM02 - Yb scene -!HISTORY_MSG_484;CAM02 - Auto Yb scene -!HISTORY_MSG_485;Lens Correction -!HISTORY_MSG_486;Lens Correction - Camera -!HISTORY_MSG_487;Lens Correction - Lens -!HISTORY_MSG_488;HDR Tone Mapping -!HISTORY_MSG_489;HDR TM - Threshold -!HISTORY_MSG_490;HDR TM - Amount -!HISTORY_MSG_491;White Balance -!HISTORY_MSG_492;RGB Curves -!LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters -!LENSPROFILE_CORRECTION_LCPFILE;LCP File -!LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters -!LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_D50_OLD;5000K -!PREFERENCES_DIRECTORIES;Directories -!PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 -!PREFERENCES_LANG;Language -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_THEME;Theme -!QINFO_FRAMECOUNT;%2 frames -!QINFO_HDR;HDR / %2 frame(s) -!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) -!SAMPLEFORMAT_0;Unknown data format -!SAMPLEFORMAT_1;Unsigned 8 bits -!SAMPLEFORMAT_2;Unsigned 16 bits -!SAMPLEFORMAT_4;LogLuv 24 bits -!SAMPLEFORMAT_8;LogLuv 32 bits -!SAMPLEFORMAT_16;32 bits floating point -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -!TP_COLORAPP_NEUTRAL;Reset -!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 -!TP_COLORAPP_YB;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance -!TP_RAW_RCD;RCD -!TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold From a46f96d32d5b0f3c783f6500fb343574399b1639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 14 Dec 2017 20:12:25 +0100 Subject: [PATCH 022/200] Fix build with libsigc++ 2.3.1 (fixes #4223) --- rtgui/exifpanel.cc | 11 ++++++----- rtgui/exifpanel.h | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index cd054e7ab..168106804 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -46,11 +46,7 @@ ExifPanel::ExifPanel () : idata (nullptr) exifTreeModel = Gtk::TreeStore::create (exifColumns); exifTree->set_model (exifTreeModel); exifTree->set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_NONE); - exifTree->set_row_separator_func ( - [&] (const Glib::RefPtr& model, const Gtk::TreeModel::iterator & row)-> bool { - return row->get_value (exifColumns.isSeparator); - } - ); + exifTree->set_row_separator_func (sigc::mem_fun(*this, &ExifPanel::rowSeperatorFunc)); delicon = RTImage::createFromFile ("gtk-close.png"); keepicon = RTImage::createFromFile ("gtk-apply.png"); @@ -540,6 +536,11 @@ void ExifPanel::showAlltoggled () setImageData (idata); } +bool ExifPanel::rowSeperatorFunc(const Glib::RefPtr& model, const Gtk::TreeModel::iterator& iter) +{ + return iter->get_value(exifColumns.isSeparator); +} + void ExifPanel::editTag (Gtk::TreeModel::Children root, Glib::ustring name, Glib::ustring value) { diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index b9d76f25d..5121eff4f 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -93,6 +93,7 @@ private: void resetAllPressed(); void addPressed(); void showAlltoggled(); + bool rowSeperatorFunc(const Glib::RefPtr& model, const Gtk::TreeModel::iterator& iter); public: ExifPanel (); From caa68ff49b8161a56371116d49dd8afd8118fb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 14 Dec 2017 20:42:45 +0100 Subject: [PATCH 023/200] (Try to) fix warnings that popped up in #4223 The only place I don't know how to fix is the `-fvar-tracking-assignments` warning in `ProcParams::save()` as there is nothing to constify. --- rtengine/lcp.cc | 2 +- rtexif/canonattribs.cc | 718 +++++++++++++++++++++-------------------- rtexif/rtexif.cc | 2 +- 3 files changed, 362 insertions(+), 360 deletions(-) diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index 15e68d9f1..baaa88767 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -361,7 +361,7 @@ void rtengine::LCPProfile::calcParams( const float focDist = aPersModel[pm]->focDist; const float focDistLog = std::log(focDist) + euler; - double meanErr; + double meanErr = 0.0; if (aPersModel[pm]->hasModeData(mode)) { double lowMeanErr = 0.0; diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index c1ab6f4f2..3b0d9c9ef 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -555,364 +555,366 @@ class CALensInterpreter : public IntLensInterpreter< int > public: CALensInterpreter () { - choices.insert (p_t (1, "Canon EF 50mm f/1.8")); - choices.insert (p_t (2, "Canon EF 28mm f/2.8")); - choices.insert (p_t (3, "Canon EF 135mm f/2.8 Soft")); - choices.insert (p_t (4, "Canon EF 35-105mm f/3.5-4.5 or Sigma Lens")); - choices.insert (p_t (4, "Sigma UC Zoom 35-135mm f/4-5.6")); - choices.insert (p_t (5, "Canon EF 35-70mm f/3.5-4.5")); - choices.insert (p_t (6, "Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens")); - choices.insert (p_t (6, "Sigma 18-50mm f/3.5-5.6 DC")); - choices.insert (p_t (6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP")); - choices.insert (p_t (6, "Tokina AF 193-2 19-35mm f/3.5-4.5")); - choices.insert (p_t (6, "Sigma 28-80mm f/3.5-5.6 II Macro")); - choices.insert (p_t (7, "Canon EF 100-300mm f/5.6L")); - choices.insert (p_t (8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens")); - choices.insert (p_t (8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro")); - choices.insert (p_t (8, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6")); - choices.insert (p_t (9, "Canon EF 70-210mm f/4")); - choices.insert (p_t (9, "Sigma 55-200mm f/4-5.6 DC")); - choices.insert (p_t (10, "Canon EF 50mm f/2.5 Macro or Sigma Lens")); - choices.insert (p_t (10, "Sigma 50mm f/2.8 EX")); - choices.insert (p_t (10, "Sigma 28mm f/1.8")); - choices.insert (p_t (10, "Sigma 105mm f/2.8 Macro EX")); - choices.insert (p_t (10, "Sigma 70mm f/2.8 EX DG Macro EF")); - choices.insert (p_t (11, "Canon EF 35mm f/2")); - choices.insert (p_t (13, "Canon EF 15mm f/2.8 Fisheye")); - choices.insert (p_t (14, "Canon EF 50-200mm f/3.5-4.5L")); - choices.insert (p_t (15, "Canon EF 50-200mm f/3.5-4.5")); - choices.insert (p_t (16, "Canon EF 35-135mm f/3.5-4.5")); - choices.insert (p_t (17, "Canon EF 35-70mm f/3.5-4.5A")); - choices.insert (p_t (18, "Canon EF 28-70mm f/3.5-4.5")); - choices.insert (p_t (20, "Canon EF 100-200mm f/4.5A")); - choices.insert (p_t (21, "Canon EF 80-200mm f/2.8L")); - choices.insert (p_t (22, "Canon EF 20-35mm f/2.8L or Tokina Lens")); - choices.insert (p_t (22, "Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical")); - choices.insert (p_t (23, "Canon EF 35-105mm f/3.5-4.5")); - choices.insert (p_t (24, "Canon EF 35-80mm f/4-5.6 Power Zoom")); - choices.insert (p_t (25, "Canon EF 35-80mm f/4-5.6 Power Zoom")); - choices.insert (p_t (26, "Canon EF 100mm f/2.8 Macro or Other Lens")); - choices.insert (p_t (26, "Cosina 100mm f/3.5 Macro AF")); - choices.insert (p_t (26, "Tamron SP AF 90mm f/2.8 Di Macro")); - choices.insert (p_t (26, "Tamron SP AF 180mm f/3.5 Di Macro")); - choices.insert (p_t (26, "Carl Zeiss Planar T* 50mm f/1.4")); - choices.insert (p_t (27, "Canon EF 35-80mm f/4-5.6")); - choices.insert (p_t (28, "Canon EF 80-200mm f/4.5-5.6 or Tamron Lens")); - choices.insert (p_t (28, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF")); - choices.insert (p_t (28, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro")); - choices.insert (p_t (28, "Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro")); - choices.insert (p_t (28, "Tamron AF Aspherical 28-200mm f/3.8-5.6")); - choices.insert (p_t (29, "Canon EF 50mm f/1.8 II")); - choices.insert (p_t (30, "Canon EF 35-105mm f/4.5-5.6")); - choices.insert (p_t (31, "Canon EF 75-300mm f/4-5.6 or Tamron Lens")); - choices.insert (p_t (31, "Tamron SP AF 300mm f/2.8 LD IF")); - choices.insert (p_t (32, "Canon EF 24mm f/2.8 or Sigma Lens")); - choices.insert (p_t (32, "Sigma 15mm f/2.8 EX Fisheye")); - choices.insert (p_t (33, "Voigtlander or Carl Zeiss Lens")); - choices.insert (p_t (33, "Voigtlander Ultron 40mm f/2 SLII Aspherical")); - choices.insert (p_t (33, "Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical")); - choices.insert (p_t (33, "Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 15mm f/2.8 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 18mm f/3.5 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 21mm f/2.8 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 25mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 28mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 35mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 35mm f/1.4 ZE")); - choices.insert (p_t (33, "Carl Zeiss Planar T* 50mm f/1.4 ZE")); - choices.insert (p_t (33, "Carl Zeiss Makro-Planar T* 50mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Makro-Planar T* 100mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE")); - choices.insert (p_t (35, "Canon EF 35-80mm f/4-5.6")); - choices.insert (p_t (36, "Canon EF 38-76mm f/4.5-5.6")); - choices.insert (p_t (37, "Canon EF 35-80mm f/4-5.6 or Tamron Lens")); - choices.insert (p_t (37, "Tamron 70-200mm f/2.8 Di LD IF Macro")); - choices.insert (p_t (37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20")); - choices.insert (p_t (37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]")); - choices.insert (p_t (37, "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro")); - choices.insert (p_t (38, "Canon EF 80-200mm f/4.5-5.6")); - choices.insert (p_t (39, "Canon EF 75-300mm f/4-5.6")); - choices.insert (p_t (40, "Canon EF 28-80mm f/3.5-5.6")); - choices.insert (p_t (41, "Canon EF 28-90mm f/4-5.6")); - choices.insert (p_t (42, "Canon EF 28-200mm f/3.5-5.6 or Tamron Lens")); - choices.insert (p_t (42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20")); - choices.insert (p_t (43, "Canon EF 28-105mm f/4-5.6")); - 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")); - choices.insert (p_t (51, "Canon EF-S 18-135mm f/3.5-5.6 IS")); - choices.insert (p_t (52, "Canon EF-S 18-55mm f/3.5-5.6 IS II")); - choices.insert (p_t (53, "Canon EF-S 18-55mm f/3.5-5.6 III")); - choices.insert (p_t (54, "Canon EF-S 55-250mm f/4-5.6 IS II")); - choices.insert (p_t (60, "Irix 11mm f/4")); - choices.insert (p_t (80, "Canon TS-E 50mm f/2.8L Macro")); - choices.insert (p_t (81, "Canon TS-E 90mm f/2.8L Macro")); - choices.insert (p_t (82, "Canon TS-E 135mm f/4L Macro")); - choices.insert (p_t (94, "Canon TS-E 17mm f/4L")); - choices.insert (p_t (95, "Canon TS-E 24mm f/3.5L II")); - choices.insert (p_t (124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo")); - choices.insert (p_t (125, "Canon TS-E 24mm f/3.5L")); - choices.insert (p_t (126, "Canon TS-E 45mm f/2.8")); - choices.insert (p_t (127, "Canon TS-E 90mm f/2.8")); - choices.insert (p_t (129, "Canon EF 300mm f/2.8L")); - choices.insert (p_t (130, "Canon EF 50mm f/1.0L")); - choices.insert (p_t (131, "Canon EF 28-80mm f/2.8-4L or Sigma Lens")); - choices.insert (p_t (131, "Sigma 8mm f/3.5 EX DG Circular Fisheye")); - choices.insert (p_t (131, "Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM")); - choices.insert (p_t (131, "Sigma 17-70mm f/2.8-4.5 DC Macro")); - choices.insert (p_t (131, "Sigma APO 50-150mm f/2.8 [II] EX DC HSM")); - choices.insert (p_t (131, "Sigma APO 120-300mm f/2.8 EX DG HSM")); - choices.insert (p_t (131, "Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye")); - choices.insert (p_t (131, "Sigma 70-200mm f/2.8 APO EX HSM")); - choices.insert (p_t (132, "Canon EF 1200mm f/5.6L")); - choices.insert (p_t (134, "Canon EF 600mm f/4L IS")); - choices.insert (p_t (135, "Canon EF 200mm f/1.8L")); - choices.insert (p_t (136, "Canon EF 300mm f/2.8L")); - choices.insert (p_t (137, "Canon EF 85mm f/1.2L or Sigma or Tamron Lens")); - choices.insert (p_t (137, "Sigma 18-50mm f/2.8-4.5 DC OS HSM")); - choices.insert (p_t (137, "Sigma 50-200mm f/4-5.6 DC OS HSM")); - 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 | 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 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")); - choices.insert (p_t (137, "Tamron SP 60mm f/2 Macro Di II")); - choices.insert (p_t (137, "Sigma 10-20mm f/3.5 EX DC HSM")); - choices.insert (p_t (137, "Tamron SP 24-70mm f/2.8 Di VC USD")); - choices.insert (p_t (137, "Sigma 18-35mm f/1.8 DC HSM")); - choices.insert (p_t (137, "Sigma 12-24mm f/4.5-5.6 DG HSM II")); - choices.insert (p_t (138, "Canon EF 28-80mm f/2.8-4L")); - choices.insert (p_t (139, "Canon EF 400mm f/2.8L")); - 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 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")); - choices.insert (p_t (147, "Canon EF 35-135mm f/4-5.6 USM")); - choices.insert (p_t (148, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (149, "Canon EF 100mm f/2 USM")); - choices.insert (p_t (150, "Canon EF 14mm f/2.8L or Sigma Lens")); - choices.insert (p_t (150, "Sigma 20mm EX f/1.8")); - choices.insert (p_t (150, "Sigma 30mm f/1.4 DC HSM")); - choices.insert (p_t (150, "Sigma 24mm f/1.8 DG Macro EX")); - choices.insert (p_t (150, "Sigma 28mm f/1.8 DG Macro EX")); - choices.insert (p_t (151, "Canon EF 200mm f/2.8L")); - choices.insert (p_t (152, "Canon EF 300mm f/4L IS or Sigma Lens")); - choices.insert (p_t (152, "Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM")); - choices.insert (p_t (152, "Sigma 14mm f/2.8 EX Aspherical HSM")); - choices.insert (p_t (152, "Sigma 10-20mm f/4-5.6")); - choices.insert (p_t (152, "Sigma 100-300mm f/4")); - choices.insert (p_t (153, "Canon EF 35-350mm f/3.5-5.6L or Sigma or Tamron Lens")); - choices.insert (p_t (153, "Sigma 50-500mm f/4-6.3 APO HSM EX")); - 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 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")); - choices.insert (p_t (161, "Sigma 24-60mm f/2.8 EX DG")); - choices.insert (p_t (161, "Tamron AF 17-50mm f/2.8 Di-II LD Aspherical")); - choices.insert (p_t (161, "Tamron 90mm f/2.8")); - choices.insert (p_t (161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF")); - choices.insert (p_t (161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro")); - choices.insert (p_t (162, "Canon EF 200mm f/2.8L")); - choices.insert (p_t (163, "Canon EF 300mm f/4L")); - choices.insert (p_t (164, "Canon EF 400mm f/5.6L")); - 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 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")); - choices.insert (p_t (169, "Sigma 18-50mm f/2.8 Macro")); - choices.insert (p_t (169, "Sigma 50mm f/1.4 EX DG HSM")); - choices.insert (p_t (169, "Sigma 85mm f/1.4 EX DG HSM")); - choices.insert (p_t (169, "Sigma 30mm f/1.4 EX DC HSM")); - choices.insert (p_t (169, "Sigma 35mm f/1.4 DG HSM")); - choices.insert (p_t (170, "Canon EF 200mm f/2.8L II")); - choices.insert (p_t (171, "Canon EF 300mm f/4L")); - choices.insert (p_t (172, "Canon EF 400mm f/5.6L or Sigma Lens")); - choices.insert (p_t (172, "Sigma 150-600mm f/5-6.3 DG OS HSM | S")); - 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 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 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 (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 (183, "Sigma 100-400mm f/5-6.3 DG OS HSM")); - 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")); - choices.insert (p_t (187, "Canon EF 70-200mm f/4L + 1.4x")); - choices.insert (p_t (188, "Canon EF 70-200mm f/4L + 2x")); - choices.insert (p_t (189, "Canon EF 70-200mm f/4L + 2.8x")); - choices.insert (p_t (190, "Canon EF 100mm f/2.8 Macro USM")); - choices.insert (p_t (191, "Canon EF 400mm f/4 DO IS")); - choices.insert (p_t (193, "Canon EF 35-80mm f/4-5.6 USM")); - choices.insert (p_t (194, "Canon EF 80-200mm f/4.5-5.6 USM")); - choices.insert (p_t (195, "Canon EF 35-105mm f/4.5-5.6 USM")); - choices.insert (p_t (196, "Canon EF 75-300mm f/4-5.6 USM")); - choices.insert (p_t (197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens")); - choices.insert (p_t (197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS")); - choices.insert (p_t (198, "Canon EF 50mm f/1.4 USM or Zeiss Lens")); - choices.insert (p_t (198, "Zeiss Otus 55mm f/1.4 ZE")); - choices.insert (p_t (198, "Zeiss Otus 85mm f/1.4 ZE")); - choices.insert (p_t (199, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (200, "Canon EF 75-300mm f/4-5.6 USM")); - choices.insert (p_t (201, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (202, "Canon EF 28-80mm f/3.5-5.6 USM IV")); - choices.insert (p_t (208, "Canon EF 22-55mm f/4-5.6 USM")); - choices.insert (p_t (209, "Canon EF 55-200mm f/4.5-5.6")); - choices.insert (p_t (210, "Canon EF 28-90mm f/4-5.6 USM")); - choices.insert (p_t (211, "Canon EF 28-200mm f/3.5-5.6 USM")); - choices.insert (p_t (212, "Canon EF 28-105mm f/4-5.6 USM")); - 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")); - choices.insert (p_t (224, "Canon EF 70-200mm f/2.8L IS")); - choices.insert (p_t (225, "Canon EF 70-200mm f/2.8L IS + 1.4x")); - choices.insert (p_t (226, "Canon EF 70-200mm f/2.8L IS + 2x")); - choices.insert (p_t (227, "Canon EF 70-200mm f/2.8L IS + 2.8x")); - choices.insert (p_t (228, "Canon EF 28-105mm f/3.5-4.5 USM")); - choices.insert (p_t (229, "Canon EF 16-35mm f/2.8L")); - choices.insert (p_t (230, "Canon EF 24-70mm f/2.8L")); - choices.insert (p_t (231, "Canon EF 17-40mm f/4L")); - 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-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")); - choices.insert (p_t (238, "Canon EF 70-300mm f/4-5.6 IS USM")); - choices.insert (p_t (239, "Canon EF 85mm f/1.2L II")); - choices.insert (p_t (240, "Canon EF-S 17-55mm f/2.8 IS USM")); - choices.insert (p_t (241, "Canon EF 50mm f/1.2L")); - choices.insert (p_t (242, "Canon EF 70-200mm f/4L IS")); - choices.insert (p_t (243, "Canon EF 70-200mm f/4L IS + 1.4x")); - choices.insert (p_t (244, "Canon EF 70-200mm f/4L IS + 2x")); - 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 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 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")); - choices.insert (p_t (254, "Canon EF 100mm f/2.8L Macro IS USM")); - choices.insert (p_t (255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens")); - choices.insert (p_t (255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro")); - choices.insert (p_t (488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM")); - choices.insert (p_t (489, "Canon EF 70-300mm f/4-5.6L IS USM")); - choices.insert (p_t (490, "Canon EF 8-15mm f/4L Fisheye USM")); - choices.insert (p_t (491, "Canon EF 300mm f/2.8L IS II USM or Tamron Lens")); - choices.insert (p_t (491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)")); - choices.insert (p_t (491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)")); - choices.insert (p_t (492, "Canon EF 400mm f/2.8L IS II USM")); - choices.insert (p_t (493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM")); - choices.insert (p_t (493, "Canon EF 24-105mm f/4L IS USM")); - choices.insert (p_t (494, "Canon EF 600mm f/4.0L IS II USM")); - choices.insert (p_t (495, "Canon EF 24-70mm f/2.8L II USM or Sigma Lens")); - choices.insert (p_t (495, "Sigma 24-70mm F2.8 DG OS HSM | A")); - choices.insert (p_t (496, "Canon EF 200-400mm f/4L IS USM")); - choices.insert (p_t (499, "Canon EF 200-400mm f/4L IS USM + 1.4x")); - choices.insert (p_t (502, "Canon EF 28mm f/2.8 IS USM")); - choices.insert (p_t (503, "Canon EF 24mm f/2.8 IS USM")); - choices.insert (p_t (504, "Canon EF 24-70mm f/4L IS USM")); - choices.insert (p_t (505, "Canon EF 35mm f/2 IS USM")); - choices.insert (p_t (506, "Canon EF 400mm f/4 DO IS II USM")); - 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 or Tamron Lens")); - choices.insert (p_t (508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD")); - choices.insert (p_t (747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens")); - choices.insert (p_t (747, "Tamron SP 150-600mm F5-6.3 Di VC USD G2")); - 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 (751, "Canon EF 16-35mm f/2.8L III USM")); - choices.insert (p_t (752, "Canon EF 24-105mm f/4L IS 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")); - choices.insert (p_t (4144, "Canon EF 40mm f/2.8 STM")); - choices.insert (p_t (4145, "Canon EF-M 22mm f/2 STM")); - choices.insert (p_t (4146, "Canon EF-S 18-55mm f/3.5-5.6 IS STM")); - choices.insert (p_t (4147, "Canon EF-M 11-22mm f/4-5.6 IS STM")); - choices.insert (p_t (4148, "Canon EF-S 55-250mm f/4-5.6 IS STM")); - 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 (4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM")); - choices.insert (p_t (4158, "Canon EF-S 18-55mm f/4-5.6 IS STM")); - choices.insert (p_t (4160, "Canon EF-S 35mm f/2.8 Macro IS STM")); - choices.insert (p_t (36910, "Canon EF 70-300mm f/4-5.6 IS II USM")); - choices.insert (p_t (36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM")); - choices.insert (p_t (61491, "Canon CN-E 14mm T3.1 L F")); - choices.insert (p_t (61492, "Canon CN-E 24mm T1.5 L F")); - choices.insert (p_t (61494, "Canon CN-E 85mm T1.3 L F")); - choices.insert (p_t (61495, "Canon CN-E 135mm T2.2 L F")); - choices.insert (p_t (61496, "Canon CN-E 35mm T1.5 L F")); - choices.insert (p_t (65535, "n/a")); + choices = { + {1, "Canon EF 50mm f/1.8"}, + {2, "Canon EF 28mm f/2.8"}, + {3, "Canon EF 135mm f/2.8 Soft"}, + {4, "Canon EF 35-105mm f/3.5-4.5 or Sigma Lens"}, + {4, "Sigma UC Zoom 35-135mm f/4-5.6"}, + {5, "Canon EF 35-70mm f/3.5-4.5"}, + {6, "Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens"}, + {6, "Sigma 18-50mm f/3.5-5.6 DC"}, + {6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP"}, + {6, "Tokina AF 193-2 19-35mm f/3.5-4.5"}, + {6, "Sigma 28-80mm f/3.5-5.6 II Macro"}, + {7, "Canon EF 100-300mm f/5.6L"}, + {8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens"}, + {8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro"}, + {8, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6"}, + {9, "Canon EF 70-210mm f/4"}, + {9, "Sigma 55-200mm f/4-5.6 DC"}, + {10, "Canon EF 50mm f/2.5 Macro or Sigma Lens"}, + {10, "Sigma 50mm f/2.8 EX"}, + {10, "Sigma 28mm f/1.8"}, + {10, "Sigma 105mm f/2.8 Macro EX"}, + {10, "Sigma 70mm f/2.8 EX DG Macro EF"}, + {11, "Canon EF 35mm f/2"}, + {13, "Canon EF 15mm f/2.8 Fisheye"}, + {14, "Canon EF 50-200mm f/3.5-4.5L"}, + {15, "Canon EF 50-200mm f/3.5-4.5"}, + {16, "Canon EF 35-135mm f/3.5-4.5"}, + {17, "Canon EF 35-70mm f/3.5-4.5A"}, + {18, "Canon EF 28-70mm f/3.5-4.5"}, + {20, "Canon EF 100-200mm f/4.5A"}, + {21, "Canon EF 80-200mm f/2.8L"}, + {22, "Canon EF 20-35mm f/2.8L or Tokina Lens"}, + {22, "Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical"}, + {23, "Canon EF 35-105mm f/3.5-4.5"}, + {24, "Canon EF 35-80mm f/4-5.6 Power Zoom"}, + {25, "Canon EF 35-80mm f/4-5.6 Power Zoom"}, + {26, "Canon EF 100mm f/2.8 Macro or Other Lens"}, + {26, "Cosina 100mm f/3.5 Macro AF"}, + {26, "Tamron SP AF 90mm f/2.8 Di Macro"}, + {26, "Tamron SP AF 180mm f/3.5 Di Macro"}, + {26, "Carl Zeiss Planar T* 50mm f/1.4"}, + {27, "Canon EF 35-80mm f/4-5.6"}, + {28, "Canon EF 80-200mm f/4.5-5.6 or Tamron Lens"}, + {28, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, + {28, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {28, "Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro"}, + {28, "Tamron AF Aspherical 28-200mm f/3.8-5.6"}, + {29, "Canon EF 50mm f/1.8 II"}, + {30, "Canon EF 35-105mm f/4.5-5.6"}, + {31, "Canon EF 75-300mm f/4-5.6 or Tamron Lens"}, + {31, "Tamron SP AF 300mm f/2.8 LD IF"}, + {32, "Canon EF 24mm f/2.8 or Sigma Lens"}, + {32, "Sigma 15mm f/2.8 EX Fisheye"}, + {33, "Voigtlander or Carl Zeiss Lens"}, + {33, "Voigtlander Ultron 40mm f/2 SLII Aspherical"}, + {33, "Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical"}, + {33, "Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus"}, + {33, "Carl Zeiss Distagon T* 15mm f/2.8 ZE"}, + {33, "Carl Zeiss Distagon T* 18mm f/3.5 ZE"}, + {33, "Carl Zeiss Distagon T* 21mm f/2.8 ZE"}, + {33, "Carl Zeiss Distagon T* 25mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 28mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 35mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 35mm f/1.4 ZE"}, + {33, "Carl Zeiss Planar T* 50mm f/1.4 ZE"}, + {33, "Carl Zeiss Makro-Planar T* 50mm f/2 ZE"}, + {33, "Carl Zeiss Makro-Planar T* 100mm f/2 ZE"}, + {33, "Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE"}, + {35, "Canon EF 35-80mm f/4-5.6"}, + {36, "Canon EF 38-76mm f/4.5-5.6"}, + {37, "Canon EF 35-80mm f/4-5.6 or Tamron Lens"}, + {37, "Tamron 70-200mm f/2.8 Di LD IF Macro"}, + {37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]"}, + {37, "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro"}, + {38, "Canon EF 80-200mm f/4.5-5.6"}, + {39, "Canon EF 75-300mm f/4-5.6"}, + {40, "Canon EF 28-80mm f/3.5-5.6"}, + {41, "Canon EF 28-90mm f/4-5.6"}, + {42, "Canon EF 28-200mm f/3.5-5.6 or Tamron Lens"}, + {42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {43, "Canon EF 28-105mm f/4-5.6"}, + {44, "Canon EF 90-300mm f/4.5-5.6"}, + {45, "Canon EF-S 18-55mm f/3.5-5.6 [II]"}, + {46, "Canon EF 28-90mm f/4-5.6"}, + {47, "Zeiss Milvus 35mm f/2 or 50mm f/2"}, + {47, "Zeiss Milvus 50mm f/2 Makro"}, + {48, "Canon EF-S 18-55mm f/3.5-5.6 IS"}, + {49, "Canon EF-S 55-250mm f/4-5.6 IS"}, + {50, "Canon EF-S 18-200mm f/3.5-5.6 IS"}, + {51, "Canon EF-S 18-135mm f/3.5-5.6 IS"}, + {52, "Canon EF-S 18-55mm f/3.5-5.6 IS II"}, + {53, "Canon EF-S 18-55mm f/3.5-5.6 III"}, + {54, "Canon EF-S 55-250mm f/4-5.6 IS II"}, + {60, "Irix 11mm f/4"}, + {80, "Canon TS-E 50mm f/2.8L Macro"}, + {81, "Canon TS-E 90mm f/2.8L Macro"}, + {82, "Canon TS-E 135mm f/4L Macro"}, + {94, "Canon TS-E 17mm f/4L"}, + {95, "Canon TS-E 24mm f/3.5L II"}, + {124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo"}, + {125, "Canon TS-E 24mm f/3.5L"}, + {126, "Canon TS-E 45mm f/2.8"}, + {127, "Canon TS-E 90mm f/2.8"}, + {129, "Canon EF 300mm f/2.8L"}, + {130, "Canon EF 50mm f/1.0L"}, + {131, "Canon EF 28-80mm f/2.8-4L or Sigma Lens"}, + {131, "Sigma 8mm f/3.5 EX DG Circular Fisheye"}, + {131, "Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM"}, + {131, "Sigma 17-70mm f/2.8-4.5 DC Macro"}, + {131, "Sigma APO 50-150mm f/2.8 [II] EX DC HSM"}, + {131, "Sigma APO 120-300mm f/2.8 EX DG HSM"}, + {131, "Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye"}, + {131, "Sigma 70-200mm f/2.8 APO EX HSM"}, + {132, "Canon EF 1200mm f/5.6L"}, + {134, "Canon EF 600mm f/4L IS"}, + {135, "Canon EF 200mm f/1.8L"}, + {136, "Canon EF 300mm f/2.8L"}, + {137, "Canon EF 85mm f/1.2L or Sigma or Tamron Lens"}, + {137, "Sigma 18-50mm f/2.8-4.5 DC OS HSM"}, + {137, "Sigma 50-200mm f/4-5.6 DC OS HSM"}, + {137, "Sigma 18-250mm f/3.5-6.3 DC OS HSM"}, + {137, "Sigma 24-70mm f/2.8 IF EX DG HSM"}, + {137, "Sigma 18-125mm f/3.8-5.6 DC OS HSM"}, + {137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, + {137, "Sigma 17-50mm f/2.8 OS HSM"}, + {137, "Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]"}, + {137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD"}, + {137, "Sigma 8-16mm f/4.5-5.6 DC HSM"}, + {137, "Tamron SP 17-50mm f/2.8 XR Di II VC"}, + {137, "Tamron SP 60mm f/2 Macro Di II"}, + {137, "Sigma 10-20mm f/3.5 EX DC HSM"}, + {137, "Tamron SP 24-70mm f/2.8 Di VC USD"}, + {137, "Sigma 18-35mm f/1.8 DC HSM"}, + {137, "Sigma 12-24mm f/4.5-5.6 DG HSM II"}, + {138, "Canon EF 28-80mm f/2.8-4L"}, + {139, "Canon EF 400mm f/2.8L"}, + {140, "Canon EF 500mm f/4.5L"}, + {141, "Canon EF 500mm f/4.5L"}, + {142, "Canon EF 300mm f/2.8L IS"}, + {143, "Canon EF 500mm f/4L IS or Sigma Lens"}, + {143, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM"}, + {144, "Canon EF 35-135mm f/4-5.6 USM"}, + {145, "Canon EF 100-300mm f/4.5-5.6 USM"}, + {146, "Canon EF 70-210mm f/3.5-4.5 USM"}, + {147, "Canon EF 35-135mm f/4-5.6 USM"}, + {148, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {149, "Canon EF 100mm f/2 USM"}, + {150, "Canon EF 14mm f/2.8L or Sigma Lens"}, + {150, "Sigma 20mm EX f/1.8"}, + {150, "Sigma 30mm f/1.4 DC HSM"}, + {150, "Sigma 24mm f/1.8 DG Macro EX"}, + {150, "Sigma 28mm f/1.8 DG Macro EX"}, + {151, "Canon EF 200mm f/2.8L"}, + {152, "Canon EF 300mm f/4L IS or Sigma Lens"}, + {152, "Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM"}, + {152, "Sigma 14mm f/2.8 EX Aspherical HSM"}, + {152, "Sigma 10-20mm f/4-5.6"}, + {152, "Sigma 100-300mm f/4"}, + {153, "Canon EF 35-350mm f/3.5-5.6L or Sigma or Tamron Lens"}, + {153, "Sigma 50-500mm f/4-6.3 APO HSM EX"}, + {153, "Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro"}, + {153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14"}, + {153, "Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro"}, + {154, "Canon EF 20mm f/2.8 USM or Zeiss Lens"}, + {154, "Zeiss Milvus 21mm f/2.8"}, + {155, "Canon EF 85mm f/1.8 USM"}, + {156, "Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens"}, + {156, "Tamron SP 70-300mm f/4.0-5.6 Di VC USD"}, + {156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, + {160, "Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens"}, + {160, "Tamron AF 19-35mm f/3.5-4.5"}, + {160, "Tokina AT-X 124 AF Pro DX 12-24mm f/4"}, + {160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye"}, + {160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8"}, + {160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8"}, + {161, "Canon EF 28-70mm f/2.8L or Sigma or Tamron Lens"}, + {161, "Sigma 24-70mm f/2.8 EX"}, + {161, "Sigma 28-70mm f/2.8 EX"}, + {161, "Sigma 24-60mm f/2.8 EX DG"}, + {161, "Tamron AF 17-50mm f/2.8 Di-II LD Aspherical"}, + {161, "Tamron 90mm f/2.8"}, + {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, + {161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {162, "Canon EF 200mm f/2.8L"}, + {163, "Canon EF 300mm f/4L"}, + {164, "Canon EF 400mm f/5.6L"}, + {165, "Canon EF 70-200mm f/2.8 L"}, + {166, "Canon EF 70-200mm f/2.8 L + 1.4x"}, + {167, "Canon EF 70-200mm f/2.8 L + 2x"}, + {168, "Canon EF 28mm f/1.8 USM or Sigma Lens"}, + {168, "Sigma 50-100mm f/1.8 DC HSM | A"}, + {169, "Canon EF 17-35mm f/2.8L or Sigma Lens"}, + {169, "Sigma 18-200mm f/3.5-6.3 DC OS"}, + {169, "Sigma 15-30mm f/3.5-4.5 EX DG Aspherical"}, + {169, "Sigma 18-50mm f/2.8 Macro"}, + {169, "Sigma 50mm f/1.4 EX DG HSM"}, + {169, "Sigma 85mm f/1.4 EX DG HSM"}, + {169, "Sigma 30mm f/1.4 EX DC HSM"}, + {169, "Sigma 35mm f/1.4 DG HSM"}, + {170, "Canon EF 200mm f/2.8L II"}, + {171, "Canon EF 300mm f/4L"}, + {172, "Canon EF 400mm f/5.6L or Sigma Lens"}, + {172, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, + {173, "Canon EF 180mm Macro f/3.5L or Sigma Lens"}, + {173, "Sigma 180mm EX HSM Macro f/3.5"}, + {173, "Sigma APO Macro 150mm f/2.8 EX DG HSM"}, + {174, "Canon EF 135mm f/2L or Other Lens"}, + {174, "Sigma 70-200mm f/2.8 EX DG APO OS HSM"}, + {174, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM"}, + {174, "Sigma 150-500mm f/5-6.3 APO DG OS HSM"}, + {174, "Zeiss Milvus 100mm f/2 Makro"}, + {175, "Canon EF 400mm f/2.8L"}, + {176, "Canon EF 24-85mm f/3.5-4.5 USM"}, + {177, "Canon EF 300mm f/4L IS"}, + {178, "Canon EF 28-135mm f/3.5-5.6 IS"}, + {179, "Canon EF 24mm f/1.4L"}, + {180, "Canon EF 35mm f/1.4L or Other Lens"}, + {180, "Sigma 50mm f/1.4 DG HSM | A"}, + {180, "Sigma 24mm f/1.4 DG HSM | A"}, + {180, "Zeiss Milvus 50mm f/1.4"}, + {180, "Zeiss Milvus 85mm f/1.4"}, + {180, "Zeiss Otus 28mm f/1.4 ZE"}, + {181, "Canon EF 100-400mm f/4.5-5.6L IS + 1.4x or Sigma Lens"}, + {181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x"}, + {182, "Canon EF 100-400mm f/4.5-5.6L IS + 2x or Sigma Lens"}, + {182, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x"}, + {183, "Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens"}, + {183, "Sigma 150mm f/2.8 EX DG OS HSM APO Macro"}, + {183, "Sigma 105mm f/2.8 EX DG OS HSM Macro"}, + {183, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C"}, + {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, + {183, "Sigma 100-400mm f/5-6.3 DG OS HSM"}, + {184, "Canon EF 400mm f/2.8L + 2x"}, + {185, "Canon EF 600mm f/4L IS"}, + {186, "Canon EF 70-200mm f/4L"}, + {187, "Canon EF 70-200mm f/4L + 1.4x"}, + {188, "Canon EF 70-200mm f/4L + 2x"}, + {189, "Canon EF 70-200mm f/4L + 2.8x"}, + {190, "Canon EF 100mm f/2.8 Macro USM"}, + {191, "Canon EF 400mm f/4 DO IS"}, + {193, "Canon EF 35-80mm f/4-5.6 USM"}, + {194, "Canon EF 80-200mm f/4.5-5.6 USM"}, + {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, + {196, "Canon EF 75-300mm f/4-5.6 USM"}, + {197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens"}, + {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS"}, + {198, "Canon EF 50mm f/1.4 USM or Zeiss Lens"}, + {198, "Zeiss Otus 55mm f/1.4 ZE"}, + {198, "Zeiss Otus 85mm f/1.4 ZE"}, + {199, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {200, "Canon EF 75-300mm f/4-5.6 USM"}, + {201, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {202, "Canon EF 28-80mm f/3.5-5.6 USM IV"}, + {208, "Canon EF 22-55mm f/4-5.6 USM"}, + {209, "Canon EF 55-200mm f/4.5-5.6"}, + {210, "Canon EF 28-90mm f/4-5.6 USM"}, + {211, "Canon EF 28-200mm f/3.5-5.6 USM"}, + {212, "Canon EF 28-105mm f/4-5.6 USM"}, + {213, "Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens"}, + {213, "Tamron SP 150-600mm f/5-6.3 Di VC USD"}, + {213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro"}, + {213, "Tamron SP 35mm f/1.8 Di VC USD"}, + {213, "Tamron SP 45mm f/1.8 Di VC USD"}, + {214, "Canon EF-S 18-55mm f/3.5-5.6 USM"}, + {215, "Canon EF 55-200mm f/4.5-5.6 II USM"}, + {217, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD"}, + {224, "Canon EF 70-200mm f/2.8L IS"}, + {225, "Canon EF 70-200mm f/2.8L IS + 1.4x"}, + {226, "Canon EF 70-200mm f/2.8L IS + 2x"}, + {227, "Canon EF 70-200mm f/2.8L IS + 2.8x"}, + {228, "Canon EF 28-105mm f/3.5-4.5 USM"}, + {229, "Canon EF 16-35mm f/2.8L"}, + {230, "Canon EF 24-70mm f/2.8L"}, + {231, "Canon EF 17-40mm f/4L"}, + {232, "Canon EF 70-300mm f/4.5-5.6 DO IS USM"}, + {233, "Canon EF 28-300mm f/3.5-5.6L IS"}, + {234, "Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens"}, + {234, "Tokina AT-X 12-28 PRO DX 12-28mm f/4"}, + {235, "Canon EF-S 10-22mm f/3.5-4.5 USM"}, + {236, "Canon EF-S 60mm f/2.8 Macro USM"}, + {237, "Canon EF 24-105mm f/4L IS"}, + {238, "Canon EF 70-300mm f/4-5.6 IS USM"}, + {239, "Canon EF 85mm f/1.2L II"}, + {240, "Canon EF-S 17-55mm f/2.8 IS USM"}, + {241, "Canon EF 50mm f/1.2L"}, + {242, "Canon EF 70-200mm f/4L IS"}, + {243, "Canon EF 70-200mm f/4L IS + 1.4x"}, + {244, "Canon EF 70-200mm f/4L IS + 2x"}, + {245, "Canon EF 70-200mm f/4L IS + 2.8x"}, + {246, "Canon EF 16-35mm f/2.8L II"}, + {247, "Canon EF 14mm f/2.8L II USM"}, + {248, "Canon EF 200mm f/2L IS or Sigma Lens"}, + {248, "Sigma 24-35mm f/2 DG HSM | A"}, + {249, "Canon EF 800mm f/5.6L IS"}, + {250, "Canon EF 24mm f/1.4L II or Sigma Lens"}, + {250, "Sigma 20mm f/1.4 DG HSM | A"}, + {251, "Canon EF 70-200mm f/2.8L IS II USM"}, + {252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x"}, + {253, "Canon EF 70-200mm f/2.8L IS II USM + 2x"}, + {254, "Canon EF 100mm f/2.8L Macro IS USM"}, + {255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens"}, + {255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM"}, + {489, "Canon EF 70-300mm f/4-5.6L IS USM"}, + {490, "Canon EF 8-15mm f/4L Fisheye USM"}, + {491, "Canon EF 300mm f/2.8L IS II USM or Tamron Lens"}, + {491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, + {491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, + {492, "Canon EF 400mm f/2.8L IS II USM"}, + {493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM"}, + {493, "Canon EF 24-105mm f/4L IS USM"}, + {494, "Canon EF 600mm f/4.0L IS II USM"}, + {495, "Canon EF 24-70mm f/2.8L II USM or Sigma Lens"}, + {495, "Sigma 24-70mm F2.8 DG OS HSM | A"}, + {496, "Canon EF 200-400mm f/4L IS USM"}, + {499, "Canon EF 200-400mm f/4L IS USM + 1.4x"}, + {502, "Canon EF 28mm f/2.8 IS USM"}, + {503, "Canon EF 24mm f/2.8 IS USM"}, + {504, "Canon EF 24-70mm f/4L IS USM"}, + {505, "Canon EF 35mm f/2 IS USM"}, + {506, "Canon EF 400mm f/4 DO IS II USM"}, + {507, "Canon EF 16-35mm f/4L IS USM"}, + {508, "Canon EF 11-24mm f/4L USM or Tamron Lens"}, + {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD"}, + {747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens"}, + {747, "Tamron SP 150-600mm F5-6.3 Di VC USD G2"}, + {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x"}, + {750, "Canon EF 35mm f/1.4L II USM"}, + {751, "Canon EF 16-35mm f/2.8L III USM"}, + {752, "Canon EF 24-105mm f/4L IS II USM"}, + {4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM"}, + {4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens"}, + {4143, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, + {4144, "Canon EF 40mm f/2.8 STM"}, + {4145, "Canon EF-M 22mm f/2 STM"}, + {4146, "Canon EF-S 18-55mm f/3.5-5.6 IS STM"}, + {4147, "Canon EF-M 11-22mm f/4-5.6 IS STM"}, + {4148, "Canon EF-S 55-250mm f/4-5.6 IS STM"}, + {4149, "Canon EF-M 55-200mm f/4.5-6.3 IS STM"}, + {4150, "Canon EF-S 10-18mm f/4.5-5.6 IS STM"}, + {4152, "Canon EF 24-105mm f/3.5-5.6 IS STM"}, + {4153, "Canon EF-M 15-45mm f/3.5-6.3 IS STM"}, + {4154, "Canon EF-S 24mm f/2.8 STM"}, + {4155, "Canon EF-M 28mm f/3.5 Macro IS STM"}, + {4156, "Canon EF 50mm f/1.8 STM"}, + {4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM"}, + {4158, "Canon EF-S 18-55mm f/4-5.6 IS STM"}, + {4160, "Canon EF-S 35mm f/2.8 Macro IS STM"}, + {36910, "Canon EF 70-300mm f/4-5.6 IS II USM"}, + {36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM"}, + {61491, "Canon CN-E 14mm T3.1 L F"}, + {61492, "Canon CN-E 24mm T1.5 L F"}, + {61494, "Canon CN-E 85mm T1.3 L F"}, + {61495, "Canon CN-E 135mm T2.2 L F"}, + {61496, "Canon CN-E 35mm T1.5 L F"}, + {65535, "n/a"} + }; } virtual std::string toString (Tag* t) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 8b57fd239..a5d10f762 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1671,7 +1671,7 @@ void Tag::toString (char* buffer, int ofs) strcpy (buffer, ""); - for (size_t i = 0; i < std::min(maxcount, valuesize - ofs); i++) { + for (ssize_t i = 0; i < std::min(maxcount, valuesize - ofs); i++) { if (i > 0) { strcat (buffer, ", "); } From 7d430adbc6386b41693d9fd07cfcb5c4f802f764 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 15 Dec 2017 18:59:26 +0100 Subject: [PATCH 024/200] pixelshift: Optionally use one green instead of averaging two greens --- rtdata/languages/default | 6 +- rtengine/pixelshift.cc | 27 +- rtengine/procevents.h | 1 + rtengine/procparams.cc | 5 + rtengine/procparams.cc.save-failed | 4857 ++++++++++++++++++++++++++++ rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 +- rtengine/rtengine.h | 2 +- rtgui/bayerprocess.cc | 13 + rtgui/bayerprocess.h | 1 + rtgui/paramsedited.cc | 8 +- rtgui/paramsedited.h | 1 + 12 files changed, 4917 insertions(+), 8 deletions(-) create mode 100644 rtengine/procparams.cc.save-failed diff --git a/rtdata/languages/default b/rtdata/languages/default index 7ee50152b..efb6c4a31 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1726,7 +1726,7 @@ TP_RAW_DCBITERATIONS;Number of DCB iterations TP_RAW_DMETHOD;Method 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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;False color suppression steps TP_RAW_FAST;Fast @@ -1735,7 +1735,7 @@ TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, bu TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Sub-image -TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. TP_RAW_LABEL;Demosaicing TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1757,6 +1757,7 @@ TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median @@ -1775,6 +1776,7 @@ TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical TP_RAW_PIXELSHIFTNREADISO;nRead +TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index b5c5fb88c..511e4c95d 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -925,11 +925,25 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA const float blend = smoothFactor == 0.f ? 1.f : pow_F(std::max(psMask[i][j] - 1.f, 0.f), smoothFactor); #endif redDest[j + offsX] = intp(blend, redDest[j + offsX], psRed[i][j] ); - greenDest[j + offsX] = intp(blend, greenDest[j + offsX], ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f); + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + greenDest[j + offsX] = intp(blend, greenDest[j + offsX], (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]); + } else { + greenDest[j + offsX] = intp(blend, greenDest[j + offsX], ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f); + } blueDest[j + offsX] = intp(blend, blueDest[j + offsX], psBlue[i][j]); } else { redDest[j + offsX] = psRed[i][j]; - greenDest[j + offsX] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + greenDest[j + offsX] = (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]; + } else { + greenDest[j + offsX] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + } blueDest[j + offsX] = psBlue[i][j]; } } @@ -962,7 +976,14 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA for(; j < winw - 1; ++j) { // set red, green and blue values - green[i][j] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + green[i][j] = (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]; + } else { + green[i][j] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + } nonGreenDest0[j] = (*rawDataFrames[(offset << 1) + offset])[i][j + offset] * ngbright[ng][(offset << 1) + offset]; nonGreenDest1[j] = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1] * ngbright[ng ^ 1][2 - offset]; offset ^= 1; // 0 => 1 or 1 => 0 diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 3aa5505b5..f9b049679 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -519,6 +519,7 @@ enum ProcEvent { EvTMFattalEnabled = 487, EvTMFattalThreshold = 488, EvTMFattalAmount = 489, + EvPixelShiftOneGreen = 490, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 9f0c13f6d..0137ee7b6 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2341,6 +2341,7 @@ RAWParams::BayerSensor::BayerSensor() : pixelShiftSmoothFactor(0.7), pixelShiftExp0(false), pixelShiftLmmse(false), + pixelShiftOneGreen(false), pixelShiftEqualBright(false), pixelShiftEqualBrightChannel(false), pixelShiftNonGreenCross(true), @@ -2390,6 +2391,7 @@ bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const && pixelShiftSmoothFactor == other.pixelShiftSmoothFactor && pixelShiftExp0 == other.pixelShiftExp0 && pixelShiftLmmse == other.pixelShiftLmmse + && pixelShiftOneGreen == other.pixelShiftOneGreen && pixelShiftEqualBright == other.pixelShiftEqualBright && pixelShiftEqualBrightChannel == other.pixelShiftEqualBrightChannel && pixelShiftNonGreenCross == other.pixelShiftNonGreenCross @@ -2428,6 +2430,7 @@ void RAWParams::BayerSensor::setPixelShiftDefaults() pixelShiftSmoothFactor = 0.7; pixelShiftExp0 = false; pixelShiftLmmse = false; + pixelShiftOneGreen = false; pixelShiftEqualBright = false; pixelShiftEqualBrightChannel = false; pixelShiftNonGreenCross = true; @@ -3318,6 +3321,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSmooth, "RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftExp0, "RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftLmmse, "RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBright, "RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel, "RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross, "RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross, keyFile); @@ -4576,6 +4580,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftSmoothFactor", pedited, raw.bayersensor.pixelShiftSmoothFactor, pedited->raw.bayersensor.pixelShiftSmooth); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftExp0", pedited, raw.bayersensor.pixelShiftExp0, pedited->raw.bayersensor.pixelShiftExp0); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftLmmse", pedited, raw.bayersensor.pixelShiftLmmse, pedited->raw.bayersensor.pixelShiftLmmse); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBright", pedited, raw.bayersensor.pixelShiftEqualBright, pedited->raw.bayersensor.pixelShiftEqualBright); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBrightChannel", pedited, raw.bayersensor.pixelShiftEqualBrightChannel, pedited->raw.bayersensor.pixelShiftEqualBrightChannel); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross", pedited, raw.bayersensor.pixelShiftNonGreenCross, pedited->raw.bayersensor.pixelShiftNonGreenCross); diff --git a/rtengine/procparams.cc.save-failed b/rtengine/procparams.cc.save-failed new file mode 100644 index 000000000..0137ee7b6 --- /dev/null +++ b/rtengine/procparams.cc.save-failed @@ -0,0 +1,4857 @@ +/* + * 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 . + */ + +#include + +#include + +#include + +#include "curves.h" +#include "procparams.h" + +#include "../rtgui/multilangmgr.h" +#include "../rtgui/options.h" +#include "../rtgui/paramsedited.h" +#include "../rtgui/ppversion.h" +#include "../rtgui/version.h" + +using namespace std; +extern Options options; + +namespace +{ + +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; + } + + if (prefix != "") { + if (embedded_fname.length() < prefix.length() || embedded_fname.substr (0, prefix.length()) != prefix) { + return embedded_fname; + } + + embedded_fname = embedded_fname.substr (prefix.length()); + } + + if (Glib::path_is_absolute (embedded_fname)) { + return prefix + embedded_fname; + } + + Glib::ustring absPath = prefix + Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S + embedded_fname; + return absPath; +} + +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; + } + + Glib::ustring prefix = ""; + + if (embedded_fname.length() > 5 && embedded_fname.substr (0, 5) == "file:") { + embedded_fname = embedded_fname.substr (5); + prefix = "file:"; + } + + if (!Glib::path_is_absolute (embedded_fname)) { + return prefix + embedded_fname; + } + + Glib::ustring dir1 = Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S; + Glib::ustring dir2 = Glib::path_get_dirname (embedded_fname) + G_DIR_SEPARATOR_S; + + if (dir2.substr (0, dir1.length()) != dir1) { + // it's in a different directory, ie not inside + return prefix + embedded_fname; + } + + return prefix + embedded_fname.substr (dir1.length()); +} + +void avoidEmptyCurve (std::vector &curve) +{ + if (curve.empty()) { + curve.push_back (FCT_Linear); + } +} + +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + int& value +) +{ + value = keyfile.get_integer(group_name, key); +} + +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + double& value +) +{ + value = keyfile.get_double(group_name, key); +} + +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool& value +) +{ + value = keyfile.get_boolean(group_name, key); +} + +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + Glib::ustring& value +) +{ + value = keyfile.get_string(group_name, key); +} + +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + std::vector& value +) +{ + value = keyfile.get_double_list(group_name, key); + avoidEmptyCurve(value); +} + +template +bool assignFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool has_params_edited, + T& value, + bool& params_edited_value +) +{ + if (keyfile.has_key(group_name, key)) { + getFromKeyfile(keyfile, group_name, key, value); + + if (has_params_edited) { + params_edited_value = true; + } + + return true; + } + return false; +} + +template::value>::type> +bool assignFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool has_params_edited, + const std::map& mapping, + T& value, + bool& params_edited_value +) +{ + if (keyfile.has_key(group_name, key)) { + Glib::ustring v; + getFromKeyfile(keyfile, group_name, key, v); + + const typename std::map::const_iterator m = mapping.find(v); + + if (m != mapping.end()) { + value = m->second; + } else { + return false; + } + + if (has_params_edited) { + params_edited_value = true; + } + + return true; + } + return false; +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + int value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_integer(group_name, key, value); +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + double value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_double(group_name, key, value); +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + bool value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_boolean(group_name, key, value); +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const Glib::ustring& value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_string(group_name, key, value); +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::vector& value, + Glib::KeyFile& keyfile +) +{ + const Glib::ArrayHandle list = value; + keyfile.set_integer_list(group_name, key, list); +} + +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::vector& value, + Glib::KeyFile& keyfile +) +{ + const Glib::ArrayHandle list = value; + keyfile.set_double_list(group_name, key, list); +} + +template +bool saveToKeyfile( + bool save, + const Glib::ustring& group_name, + const Glib::ustring& key, + const T& value, + Glib::KeyFile& keyfile +) +{ + if (save) { + putToKeyfile(group_name, key, value, keyfile); + return true; + } + return false; +} + +template::value>::type> +bool saveToKeyfile( + bool save, + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::map& mapping, + const T& value, + Glib::KeyFile& keyfile +) +{ + if (save) { + const typename std::map::const_iterator m = mapping.find(value); + + if (m != mapping.end()) { + keyfile.set_string(group_name, key, m->second); + return true; + } + } + return false; +} + +} + +namespace rtengine +{ + +namespace procparams +{ + +ToneCurveParams::ToneCurveParams() : + autoexp(false), + clip(0.02), + hrenabled(false), + method("Blend"), + expcomp(0), + curve{ + DCT_Linear + }, + curve2{ + DCT_Linear + }, + curveMode(ToneCurveParams::TcMode::STD), + curveMode2(ToneCurveParams::TcMode::STD), + brightness(0), + black(0), + contrast(0), + saturation(0), + shcompr(50), + hlcompr(0), + hlcomprthresh(33) +{ +} + +bool ToneCurveParams::operator ==(const ToneCurveParams& other) const +{ + return + autoexp == other.autoexp + && clip == other.clip + && hrenabled == other.hrenabled + && method == other.method + && expcomp == other.expcomp + && curve == other.curve + && curve2 == other.curve2 + && curveMode == other.curveMode + && curveMode2 == other.curveMode2 + && brightness == other.brightness + && black == other.black + && contrast == other.contrast + && saturation == other.saturation + && shcompr == other.shcompr + && hlcompr == other.hlcompr + && hlcomprthresh == other.hlcomprthresh; +} + +bool ToneCurveParams::operator !=(const ToneCurveParams& other) const +{ + return !(*this == other); +} + +bool ToneCurveParams::HLReconstructionNecessary(const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw) +{ + if (options.rtSettings.verbose) { + printf("histRedRaw[ 0]=%07d, histGreenRaw[ 0]=%07d, histBlueRaw[ 0]=%07d\nhistRedRaw[255]=%07d, histGreenRaw[255]=%07d, histBlueRaw[255]=%07d\n", + histRedRaw[0], histGreenRaw[0], histBlueRaw[0], histRedRaw[255], histGreenRaw[255], histBlueRaw[255]); + } + + return + histRedRaw[255] > 50 + || histGreenRaw[255] > 50 + || histBlueRaw[255] > 50 + || histRedRaw[0] > 50 + || histGreenRaw[0] > 50 + || histBlueRaw[0] > 50; +} + +RetinexParams::RetinexParams() : + enabled(false), + cdcurve{ + DCT_Linear + }, + cdHcurve{ + DCT_Linear + }, + lhcurve{ + DCT_Linear + }, + transmissionCurve{ + FCT_MinMaxCPoints, + 0.00, + 0.50, + 0.35, + 0.35, + 0.60, + 0.75, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + gaintransmissionCurve{ + FCT_MinMaxCPoints, + 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 + }, + mapcurve{ + DCT_Linear + }, + str(20), + scal(3), + iter(1), + grad(1), + grads(1), + gam(1.30), + slope(3.), + neigh(80), + offs(0), + highlights(0), + htonalwidth(80), + shadows(0), + stonalwidth(80), + radius(40), + retinexMethod("high"), + retinexcolorspace("Lab"), + gammaretinex("none"), + mapMethod("none"), + viewMethod("none"), + vart(200), + limd(8), + highl(4), + skal(3), + medianmap(false) +{ +} + +bool RetinexParams::operator ==(const RetinexParams& other) const +{ + return + enabled == other.enabled + && cdcurve == other.cdcurve + && cdHcurve == other.cdHcurve + && lhcurve == other.lhcurve + && transmissionCurve == other.transmissionCurve + && gaintransmissionCurve == other.gaintransmissionCurve + && mapcurve == other.mapcurve + && str == other.str + && scal == other.scal + && iter == other.iter + && grad == other.grad + && grads == other.grads + && gam == other.gam + && slope == other.slope + && neigh == other.neigh + && offs == other.offs + && highlights == other.highlights + && htonalwidth == other.htonalwidth + && shadows == other.shadows + && stonalwidth == other.stonalwidth + && radius == other.radius + && retinexMethod == other.retinexMethod + && retinexcolorspace == other.retinexcolorspace + && gammaretinex == other.gammaretinex + && mapMethod == other.mapMethod + && viewMethod == other.viewMethod + && vart == other.vart + && limd == other.limd + && highl == other.highl + && skal == other.skal + && medianmap == other.medianmap; +} + +bool RetinexParams::operator !=(const RetinexParams& other) const +{ + return !(*this == other); +} + +void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const +{ + transmissionCurveLUT.Set(this->transmissionCurve); + gaintransmissionCurveLUT.Set(this->gaintransmissionCurve); + +} + +LCurveParams::LCurveParams() : + lcurve{ + DCT_Linear + }, + acurve{ + DCT_Linear + }, + bcurve{ + DCT_Linear + }, + cccurve{ + DCT_Linear + }, + chcurve{ + FCT_Linear + }, + lhcurve{ + FCT_Linear + }, + hhcurve{ + FCT_Linear + }, + lccurve{ + DCT_Linear + }, + clcurve{ + DCT_Linear + }, + brightness(0), + contrast(0), + chromaticity(0), + avoidcolorshift(false), + rstprotection(0), + lcredsk(true) +{ +} + +bool LCurveParams::operator ==(const LCurveParams& other) const +{ + return + lcurve == other.lcurve + && acurve == other.acurve + && bcurve == other.bcurve + && cccurve == other.cccurve + && chcurve == other.chcurve + && lhcurve == other.lhcurve + && hhcurve == other.hhcurve + && lccurve == other.lccurve + && clcurve == other.clcurve + && brightness == other.brightness + && contrast == other.contrast + && chromaticity == other.chromaticity + && avoidcolorshift == other.avoidcolorshift + && rstprotection == other.rstprotection + && lcredsk == other.lcredsk; +} + +bool LCurveParams::operator !=(const LCurveParams& other) const +{ + return !(*this == other); +} + +RGBCurvesParams::RGBCurvesParams() : + lumamode(false), + rcurve{ + DCT_Linear + }, + gcurve{ + DCT_Linear + }, + bcurve{ + DCT_Linear + } +{ +} + +bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const +{ + return + lumamode == other.lumamode + && rcurve == other.rcurve + && gcurve == other.gcurve + && bcurve == other.bcurve; +} + +bool RGBCurvesParams::operator !=(const RGBCurvesParams& other) const +{ + return !(*this == other); +} + +ColorToningParams::ColorToningParams() : + enabled(false), + autosat(true), + opacityCurve{ + FCT_MinMaxCPoints, + 0.00, + 0.3, + 0.35, + 0.00, + 0.25, + 0.8, + 0.35, + 0.35, + 0.70, + 0.8, + 0.35, + 0.35, + 1.00, + 0.3, + 0.00, + 0.00 + }, + colorCurve{ + FCT_MinMaxCPoints, + 0.050, + 0.62, + 0.25, + 0.25, + 0.585, + 0.11, + 0.25, + 0.25 + }, + satProtectionThreshold(30), + saturatedOpacity(80), + strength(50), + balance(0), + hlColSat(60, 80, false), + shadowsColSat (80, 208, false), + clcurve{ + DCT_NURBS, + 0.00, + 0.00, + 0.35, + 0.65, + 1.00, + 1.00 + }, + cl2curve{ + DCT_NURBS, + 0.00, + 0.00, + 0.35, + 0.65, + 1.00, + 1.00 + }, + method("Lab"), + twocolor("Std"), + redlow(0.0), + greenlow(0.0), + bluelow(0.0), + redmed(0.0), + greenmed(0.0), + bluemed(0.0), + redhigh(0.0), + greenhigh(0.0), + bluehigh(0.0), + satlow(0.0), + sathigh(0.0), + lumamode(true) +{ +} + +bool ColorToningParams::operator ==(const ColorToningParams& other) const +{ + return + enabled == other.enabled + && autosat == other.autosat + && opacityCurve == other.opacityCurve + && colorCurve == other.colorCurve + && satProtectionThreshold == other.satProtectionThreshold + && saturatedOpacity == other.saturatedOpacity + && strength == other.strength + && balance == other.balance + && hlColSat == other.hlColSat + && shadowsColSat == other.shadowsColSat + && clcurve == other.clcurve + && cl2curve == other.cl2curve + && method == other.method + && twocolor == other.twocolor + && redlow == other.redlow + && greenlow == other.greenlow + && bluelow == other.bluelow + && redmed == other.redmed + && greenmed == other.greenmed + && bluemed == other.bluemed + && redhigh == other.redhigh + && greenhigh == other.greenhigh + && bluehigh == other.bluehigh + && satlow == other.satlow + && sathigh == other.sathigh + && lumamode == other.lumamode; +} + +bool ColorToningParams::operator !=(const ColorToningParams& other) const +{ + return !(*this == other); +} + +void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vector& opacityCurve) const +{ + // check if non null first + if (!redlow && !greenlow && !bluelow && !redmed && !greenmed && !bluemed && !redhigh && !greenhigh && !bluehigh) { + colorCurve.resize (1); + colorCurve.at (0) = FCT_Linear; + opacityCurve.resize (1); + opacityCurve.at (0) = FCT_Linear; + return; + } + + float low[3]; // RGB color for shadows + float med[3]; // RGB color for mid-tones + float high[3]; // RGB color for highlights + float lowSat = 0.f; + float medSat = 0.f; + float highSat = 0.f; + float minTmp, maxTmp; + +// Fill the shadow mixer values of the Color TOning tool + low[0] = float (redlow ) / 100.f; // [-1. ; +1.] + low[1] = float (greenlow) / 100.f; // [-1. ; +1.] + low[2] = float (bluelow ) / 100.f; // [-1. ; +1.] + minTmp = min (low[0], low[1], low[2]); + maxTmp = max (low[0], low[1], low[2]); + + if (maxTmp - minTmp > 0.005f) { + float v[3]; + lowSat = (maxTmp - minTmp) / 2.f; + + if (low[0] == minTmp) { + v[0] = 0.f; + } else if (low[1] == minTmp) { + v[1] = 0.f; + } else if (low[2] == minTmp) { + v[2] = 0.f; + } + + if (low[0] == maxTmp) { + v[0] = 1.f; + } else if (low[1] == maxTmp) { + v[1] = 1.f; + } else if (low[2] == maxTmp) { + v[2] = 1.f; + } + + if (low[0] != minTmp && low[0] != maxTmp) { + v[0] = (low[0] - minTmp) / (maxTmp - minTmp); + } else if (low[1] != minTmp && low[1] != maxTmp) { + v[1] = (low[1] - minTmp) / (maxTmp - minTmp); + } else if (low[2] != minTmp && low[2] != maxTmp) { + v[2] = (low[2] - minTmp) / (maxTmp - minTmp); + } + + low[0] = v[0]; + low[1] = v[1]; + low[2] = v[2]; + } else { + low[0] = low[1] = low[2] = 1.f; + } + +// Fill the mid-tones mixer values of the Color TOning tool + med[0] = float (redmed ) / 100.f; // [-1. ; +1.] + med[1] = float (greenmed) / 100.f; // [-1. ; +1.] + med[2] = float (bluemed ) / 100.f; // [-1. ; +1.] + minTmp = min (med[0], med[1], med[2]); + maxTmp = max (med[0], med[1], med[2]); + + if (maxTmp - minTmp > 0.005f) { + float v[3]; + medSat = (maxTmp - minTmp) / 2.f; + + if (med[0] == minTmp) { + v[0] = 0.f; + } else if (med[1] == minTmp) { + v[1] = 0.f; + } else if (med[2] == minTmp) { + v[2] = 0.f; + } + + if (med[0] == maxTmp) { + v[0] = 1.f; + } else if (med[1] == maxTmp) { + v[1] = 1.f; + } else if (med[2] == maxTmp) { + v[2] = 1.f; + } + + if (med[0] != minTmp && med[0] != maxTmp) { + v[0] = (med[0] - minTmp) / (maxTmp - minTmp); + } else if (med[1] != minTmp && med[1] != maxTmp) { + v[1] = (med[1] - minTmp) / (maxTmp - minTmp); + } else if (med[2] != minTmp && med[2] != maxTmp) { + v[2] = (med[2] - minTmp) / (maxTmp - minTmp); + } + + med[0] = v[0]; + med[1] = v[1]; + med[2] = v[2]; + } else { + med[0] = med[1] = med[2] = 1.f; + } + + // Fill the highlight mixer values of the Color TOning tool + high[0] = float (redhigh ) / 100.f; // [-1. ; +1.] + high[1] = float (greenhigh) / 100.f; // [-1. ; +1.] + high[2] = float (bluehigh ) / 100.f; // [-1. ; +1.] + minTmp = min (high[0], high[1], high[2]); + maxTmp = max (high[0], high[1], high[2]); + + if (maxTmp - minTmp > 0.005f) { + float v[3]; + highSat = (maxTmp - minTmp) / 2.f; + + if (high[0] == minTmp) { + v[0] = 0.f; + } else if (high[1] == minTmp) { + v[1] = 0.f; + } else if (high[2] == minTmp) { + v[2] = 0.f; + } + + if (high[0] == maxTmp) { + v[0] = 1.f; + } else if (high[1] == maxTmp) { + v[1] = 1.f; + } else if (high[2] == maxTmp) { + v[2] = 1.f; + } + + if (high[0] != minTmp && high[0] != maxTmp) { + v[0] = (high[0] - minTmp) / (maxTmp - minTmp); + } else if (high[1] != minTmp && high[1] != maxTmp) { + v[1] = (high[1] - minTmp) / (maxTmp - minTmp); + } else if (high[2] != minTmp && high[2] != maxTmp) { + v[2] = (high[2] - minTmp) / (maxTmp - minTmp); + } + + high[0] = v[0]; + high[1] = v[1]; + high[2] = v[2]; + } else { + high[0] = high[1] = high[2] = 1.f; + } + + const double xPosLow = 0.1; + const double xPosMed = 0.4; + const double xPosHigh = 0.7; + + colorCurve.resize ( medSat != 0.f ? 13 : 9 ); + colorCurve.at (0) = FCT_MinMaxCPoints; + opacityCurve.resize (13); + opacityCurve.at (0) = FCT_MinMaxCPoints; + + float h, s, l; + int idx = 1; + + if (lowSat == 0.f) { + if (medSat != 0.f) { + Color::rgb2hsl (med[0], med[1], med[2], h, s, l); + } else { // highSat can't be null if the 2 other ones are! + Color::rgb2hsl (high[0], high[1], high[2], h, s, l); + } + } else { + Color::rgb2hsl (low[0], low[1], low[2], h, s, l); + } + + colorCurve.at (idx++) = xPosLow; + colorCurve.at (idx++) = h; + colorCurve.at (idx++) = 0.35; + colorCurve.at (idx++) = 0.35; + + if (medSat != 0.f) { + Color::rgb2hsl (med[0], med[1], med[2], h, s, l); + colorCurve.at (idx++) = xPosMed; + colorCurve.at (idx++) = h; + colorCurve.at (idx++) = 0.35; + colorCurve.at (idx++) = 0.35; + } + + if (highSat == 0.f) { + if (medSat != 0.f) { + Color::rgb2hsl (med[0], med[1], med[2], h, s, l); + } else { // lowSat can't be null if the 2 other ones are! + Color::rgb2hsl (low[0], low[1], low[2], h, s, l); + } + } else { + Color::rgb2hsl (high[0], high[1], high[2], h, s, l); + } + + colorCurve.at (idx++) = xPosHigh; + colorCurve.at (idx++) = h; + colorCurve.at (idx++) = 0.35; + colorCurve.at (idx) = 0.35; + + opacityCurve.at (1) = xPosLow; + opacityCurve.at (2) = double (lowSat); + opacityCurve.at (3) = 0.35; + opacityCurve.at (4) = 0.35; + opacityCurve.at (5) = xPosMed; + opacityCurve.at (6) = double (medSat); + opacityCurve.at (7) = 0.35; + opacityCurve.at (8) = 0.35; + opacityCurve.at (9) = xPosHigh; + opacityCurve.at (10) = double (highSat); + opacityCurve.at (11) = 0.35; + opacityCurve.at (12) = 0.35; +} + +void ColorToningParams::slidersToCurve(std::vector& colorCurve, std::vector& opacityCurve) const +{ + if (hlColSat.getBottom() == 0 && shadowsColSat.getBottom() == 0) { // if both opacity are null, set both curves to Linear + colorCurve.resize (1); + colorCurve.at (0) = FCT_Linear; + opacityCurve.resize (1); + opacityCurve.at (0) = FCT_Linear; + return; + } + + colorCurve.resize (9); + colorCurve.at (0) = FCT_MinMaxCPoints; + colorCurve.at (1) = 0.26 + 0.12 * double (balance) / 100.; + colorCurve.at (2) = double (shadowsColSat.getTop()) / 360.; + colorCurve.at (3) = 0.35; + colorCurve.at (4) = 0.35; + colorCurve.at (5) = 0.64 + 0.12 * double (balance) / 100.; + colorCurve.at (6) = double (hlColSat.getTop()) / 360.; + colorCurve.at (7) = 0.35; + colorCurve.at (8) = 0.35; + + opacityCurve.resize (9); + opacityCurve.at (0) = FCT_MinMaxCPoints; + opacityCurve.at (1) = colorCurve.at (1); + opacityCurve.at (2) = double (shadowsColSat.getBottom()) / 100.; + opacityCurve.at (3) = 0.35; + opacityCurve.at (4) = 0.35; + opacityCurve.at (5) = colorCurve.at (5); + opacityCurve.at (6) = double (hlColSat.getBottom()) / 100.; + opacityCurve.at (7) = 0.35; + opacityCurve.at (8) = 0.35; +} + +void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurve& opacityCurveLUT, const double xyz_rgb[3][3], bool& opautili) const +{ + float satur = 0.8f; + float lumin = 0.5f; //middle of luminance for optimization of gamut - no real importance...as we work in XYZ and gamut control + + // Transform slider values to control points + std::vector cCurve, oCurve; + + if (method == "RGBSliders" || method == "Splitlr") { + slidersToCurve (cCurve, oCurve); + } else if (method == "Splitco") { + mixerToCurve (cCurve, oCurve); + } else { + cCurve = this->colorCurve; + oCurve = this->opacityCurve; + } + + if (method == "Lab") { + if (twocolor == "Separ") { + satur = 0.9f; + } + + if (twocolor == "All" || twocolor == "Two") { + satur = 0.9f; + } + + colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); + opacityCurveLUT.Set (oCurve, opautili); + } else if (method == "Splitlr" || method == "Splitco") { + colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); + opacityCurveLUT.Set (oCurve, opautili); + } else if (method.substr (0, 3) == "RGB") { + colorCurveLUT.SetRGB (cCurve); + opacityCurveLUT.Set (oCurve, opautili); + } +} + +SharpeningParams::SharpeningParams() : + enabled(false), + radius(0.5), + amount(200), + threshold(20, 80, 2000, 1200, false), + edgesonly(false), + edges_radius(1.9), + edges_tolerance(1800), + halocontrol(false), + halocontrol_amount(85), + method("usm"), + deconvamount(75), + deconvradius(0.75), + deconviter(30), + deconvdamping(20) +{ +} + +bool SharpeningParams::operator ==(const SharpeningParams& other) const +{ + return + enabled == other.enabled + && radius == other.radius + && amount == other.amount + && threshold == other.threshold + && edgesonly == other.edgesonly + && edges_radius == other.edges_radius + && edges_tolerance == other.edges_tolerance + && halocontrol == other.halocontrol + && halocontrol_amount == other.halocontrol_amount + && method == other.method + && deconvamount == other.deconvamount + && deconvradius == other.deconvradius + && deconviter == other.deconviter + && deconvdamping == other.deconvdamping; +} + +bool SharpeningParams::operator !=(const SharpeningParams& other) const +{ + return !(*this == other); +} + +SharpenEdgeParams::SharpenEdgeParams() : + enabled(false), + passes(2), + amount(50.0), + threechannels(false) +{ +} + +bool SharpenEdgeParams::operator ==(const SharpenEdgeParams& other) const +{ + return + enabled == other.enabled + && passes == other.passes + && amount == other.amount + && threechannels == other.threechannels; +} + +bool SharpenEdgeParams::operator !=(const SharpenEdgeParams& other) const +{ + return !(*this == other); +} + +SharpenMicroParams::SharpenMicroParams() : + enabled(false), + matrix(false), + amount(20.0), + uniformity(50.0) +{ +} + +bool SharpenMicroParams::operator ==(const SharpenMicroParams& other) const +{ + return + enabled == other.enabled + && matrix == other.matrix + && amount == other.amount + && uniformity == other.uniformity; +} + +bool SharpenMicroParams::operator !=(const SharpenMicroParams& other) const +{ + return !(*this == other); +} + +VibranceParams::VibranceParams() : + enabled(false), + pastels(0), + saturated(0), + psthreshold(0, 75, false), + protectskins(false), + avoidcolorshift(true), + pastsattog(true), + skintonescurve{ + DCT_Linear + } +{ +} + +bool VibranceParams::operator ==(const VibranceParams& other) const +{ + return + enabled == other.enabled + && pastels == other.pastels + && saturated == other.saturated + && psthreshold == other.psthreshold + && protectskins == other.protectskins + && avoidcolorshift == other.avoidcolorshift + && pastsattog == other.pastsattog + && skintonescurve == other.skintonescurve; +} + +bool VibranceParams::operator !=(const VibranceParams& other) const +{ + return !(*this == other); +} + +WBParams::WBParams() : + method("Camera"), + temperature(6504), + green(1.0), + equal(1.0), + tempBias(0.0) +{ +} + +bool WBParams::operator ==(const WBParams& other) const +{ + return + method == other.method + && temperature == other.temperature + && green == other.green + && equal == other.equal + && tempBias == other.tempBias; +} + +bool WBParams::operator !=(const WBParams& other) const +{ + return !(*this == other); +} + +const std::vector& WBParams::getWbEntries() +{ + static const std::vector wb_entries = { + {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, + {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, + {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, + {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, + {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, + {"Water 1", WBEntry::Type::WATER, M("TP_WBALANCE_WATER1"), 35000, 0.3f, 1.1f, 0.f}, + {"Water 2", WBEntry::Type::WATER, M("TP_WBALANCE_WATER2"), 48000, 0.63f, 1.38f, 0.f}, + {"Tungsten", WBEntry::Type::TUNGSTEN, M("TP_WBALANCE_TUNGSTEN"), 2856, 1.f, 1.f, 0.f}, + {"Fluo F1", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO1"), 6430, 1.f, 1.f, 0.f}, + {"Fluo F2", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO2"), 4230, 1.f, 1.f, 0.f}, + {"Fluo F3", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO3"), 3450, 1.f, 1.f, 0.f}, + {"Fluo F4", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO4"), 2940, 1.f, 1.f, 0.f}, + {"Fluo F5", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO5"), 6350, 1.f, 1.f, 0.f}, + {"Fluo F6", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO6"), 4150, 1.f, 1.f, 0.f}, + {"Fluo F7", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO7"), 6500, 1.f, 1.f, 0.f}, + {"Fluo F8", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO8"), 5020, 1.f, 1.f, 0.f}, + {"Fluo F9", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO9"), 4330, 1.f, 1.f, 0.f}, + {"Fluo F10", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO10"), 5300, 1.f, 1.f, 0.f}, + {"Fluo F11", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO11"), 4000, 1.f, 1.f, 0.f}, + {"Fluo F12", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO12"), 3000, 1.f, 1.f, 0.f}, + {"HMI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_HMI"), 4800, 1.f, 1.f, 0.f}, + {"GTI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_GTI"), 5000, 1.f, 1.f, 0.f}, + {"JudgeIII Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_JUDGEIII"), 5100, 1.f, 1.f, 0.f}, + {"Solux Lamp 3500K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX35"), 3480, 1.f, 1.f, 0.f}, + {"Solux Lamp 4100K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX41"), 3930, 1.f, 1.f, 0.f}, + {"Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47"), 4700, 1.f, 1.f, 0.f}, + {"NG Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47_NG"), 4480, 1.f, 1.f, 0.f}, + {"LED LSI Lumelex 2040", WBEntry::Type::LED, M("TP_WBALANCE_LED_LSI"), 2970, 1.f, 1.f, 0.f}, + {"LED CRS SP12 WWMR16", WBEntry::Type::LED, M("TP_WBALANCE_LED_CRS"), 3050, 1.f, 1.f, 0.f}, + {"Flash 5500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH55"), 5500, 1.f, 1.f, 0.f}, + {"Flash 6000K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH60"), 6000, 1.f, 1.f, 0.f}, + {"Flash 6500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH65"), 6500, 1.f, 1.f, 0.f}, + // Should remain the last one + {"Custom", WBEntry::Type::CUSTOM, M ("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} + }; + + return wb_entries; +} + +ColorAppearanceParams::ColorAppearanceParams() : + enabled(false), + degree(90), + autodegree(true), + degreeout(90), + autodegreeout(true), + curve{ + DCT_Linear + }, + curve2{ + DCT_Linear + }, + curve3{ + DCT_Linear + }, + curveMode(TcMode::LIGHT), + curveMode2(TcMode::LIGHT), + curveMode3(CtcMode::CHROMA), + surround("Average"), + surrsrc("Average"), + adapscen(2000.0), + autoadapscen(true), + ybscen(18), + autoybscen(true), + adaplum(16), + badpixsl(0), + wbmodel("RawT"), + algo("No"), + contrast(0.0), + qcontrast(0.0), + jlight(0.0), + qbright(0.0), + chroma(0.0), + schroma(0.0), + mchroma(0.0), + colorh(0.0), + rstprotection(0.0), + surrsource(false), + gamut(true), + datacie(false), + tonecie(false), + tempout(5000), + ybout(18), + greenout(1.0), + tempsc(5000), + greensc(1.0) +{ +} + +bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) const +{ + return + enabled == other.enabled + && degree == other.degree + && autodegree == other.autodegree + && degreeout == other.degreeout + && autodegreeout == other.autodegreeout + && curve == other.curve + && curve2 == other.curve2 + && curve3 == other.curve3 + && curveMode == other.curveMode + && curveMode2 == other.curveMode2 + && curveMode3 == other.curveMode3 + && surround == other.surround + && surrsrc == other.surrsrc + && adapscen == other.adapscen + && autoadapscen == other.autoadapscen + && ybscen == other.ybscen + && autoybscen == other.autoybscen + && adaplum == other.adaplum + && badpixsl == other.badpixsl + && wbmodel == other.wbmodel + && algo == other.algo + && contrast == other.contrast + && qcontrast == other.qcontrast + && jlight == other.jlight + && qbright == other.qbright + && chroma == other.chroma + && schroma == other.schroma + && mchroma == other.mchroma + && colorh == other.colorh + && rstprotection == other.rstprotection + && surrsource == other.surrsource + && gamut == other.gamut + && datacie == other.datacie + && tonecie == other.tonecie + && tempout == other.tempout + && ybout == other.ybout + && greenout == other.greenout + && tempsc == other.tempsc + && greensc == other.greensc; +} + +bool ColorAppearanceParams::operator !=(const ColorAppearanceParams& other) const +{ + return !(*this == other); +} + +DefringeParams::DefringeParams() : + enabled(false), + radius(2.0), + threshold(13), + huecurve{ + FCT_MinMaxCPoints, + 0.166666667, + 0., + 0.35, + 0.35, + 0.347, + 0., + 0.35, + 0.35, + 0.513667426, + 0, + 0.35, + 0.35, + 0.668944571, + 0., + 0.35, + 0.35, + 0.8287775246, + 0.97835991, + 0.35, + 0.35, + 0.9908883827, + 0., + 0.35, + 0.35 + } +{ +} + +bool DefringeParams::operator ==(const DefringeParams& other) const +{ + return + enabled == other.enabled + && radius == other.radius + && threshold == other.threshold + && huecurve == other.huecurve; +} + +bool DefringeParams::operator !=(const DefringeParams& other) const +{ + return !(*this == other); +} + +ImpulseDenoiseParams::ImpulseDenoiseParams() : + enabled(false), + thresh(50) +{ +} + +bool ImpulseDenoiseParams::operator ==(const ImpulseDenoiseParams& other) const +{ + return + enabled == other.enabled + && thresh == other.thresh; +} + +bool ImpulseDenoiseParams::operator !=(const ImpulseDenoiseParams& other) const +{ + return !(*this == other); +} + +DirPyrDenoiseParams::DirPyrDenoiseParams() : + lcurve{ + FCT_MinMaxCPoints, + 0.05, + 0.15, + 0.35, + 0.35, + 0.55, + 0.04, + 0.35, + 0.35 + }, + cccurve{ + FCT_MinMaxCPoints, + 0.05, + 0.50, + 0.35, + 0.35, + 0.35, + 0.05, + 0.35, + 0.35 + }, + enabled(false), + enhance(false), + median(false), + perform(false), + luma(0), + Ldetail(0), + chroma(15), + redchro(0), + bluechro(0), + gamma(1.7), + dmethod("Lab"), + Lmethod("SLI"), + Cmethod("MAN"), + C2method("AUTO"), + smethod("shal"), + medmethod("soft"), + methodmed("none"), + rgbmethod("soft"), + passes(1) +{ +} + +bool DirPyrDenoiseParams::operator ==(const DirPyrDenoiseParams& other) const +{ + return + lcurve == other.lcurve + && cccurve == other.cccurve + && enabled == other.enabled + && enhance == other.enhance + && median == other.median + && perform == other.perform + && luma == other.luma + && Ldetail == other.Ldetail + && chroma == other.chroma + && redchro == other.redchro + && bluechro == other.bluechro + && gamma == other.gamma + && dmethod == other.dmethod + && Lmethod == other.Lmethod + && Cmethod == other.Cmethod + && C2method == other.C2method + && smethod == other.smethod + && medmethod == other.medmethod + && methodmed == other.methodmed + && rgbmethod == other.rgbmethod + && passes == other.passes; +} + +bool DirPyrDenoiseParams::operator !=(const DirPyrDenoiseParams& other) const +{ + return !(*this == other); +} + +void DirPyrDenoiseParams::getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const +{ + lCurve.Set(this->lcurve); + cCurve.Set(this->cccurve); +} + +EPDParams::EPDParams() : + enabled(false), + strength(0.5), + gamma(1.0), + edgeStopping(1.4), + scale(1.0), + reweightingIterates(0) +{ +} + +bool EPDParams::operator ==(const EPDParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength + && gamma == other.gamma + && edgeStopping == other.edgeStopping + && scale == other.scale + && reweightingIterates == other.reweightingIterates; +} + +bool EPDParams::operator !=(const EPDParams& other) const +{ + return !(*this == other); +} + +FattalToneMappingParams::FattalToneMappingParams() : + enabled(false), + threshold(0), + amount(1) +{ +} + +bool FattalToneMappingParams::operator ==(const FattalToneMappingParams& other) const +{ + return + enabled == other.enabled + && threshold == other.threshold + && amount == other.amount; +} + +bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) const +{ + return !(*this == other); +} + +SHParams::SHParams() : + enabled(false), + hq(false), + highlights(0), + htonalwidth(80), + shadows(0), + stonalwidth(80), + localcontrast(0), + radius(40) +{ +} + +bool SHParams::operator ==(const SHParams& other) const +{ + return + enabled == other.enabled + && hq == other.hq + && highlights == other.highlights + && htonalwidth == other.htonalwidth + && shadows == other.shadows + && stonalwidth == other.stonalwidth + && localcontrast == other.localcontrast + && radius == other.radius; +} + +bool SHParams::operator !=(const SHParams& other) const +{ + return !(*this == other); +} + +CropParams::CropParams() : + enabled(false), + x(-1), + y(-1), + w(15000), + h(15000), + fixratio(true), + ratio("3:2"), + orientation("As Image"), + guide("Frame") +{ +} + +bool CropParams::operator ==(const CropParams& other) const +{ + return + enabled == other.enabled + && x == other.x + && y == other.y + && w == other.w + && h == other.h + && fixratio == other.fixratio + && ratio == other.ratio + && orientation == other.orientation + && guide == other.guide; +} + +bool CropParams::operator !=(const CropParams& other) const +{ + return !(*this == other); +} + +void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, int& x1, int& x2, int& y1, int& y2) const +{ + x1 = 0, x2 = resizedWidth, y1 = 0, y2 = resizedHeight; + + if (enabled) { + x1 = min(resizedWidth - 1, max (0, x / scale)); + y1 = min(resizedHeight - 1, max (0, y / scale)); + x2 = min(resizedWidth, max (0, (x + w) / scale)); + y2 = min(resizedHeight, max (0, (y + h) / scale)); + } +} + +CoarseTransformParams::CoarseTransformParams() : + rotate(0), + hflip(false), + vflip(false) +{ +} + +bool CoarseTransformParams::operator ==(const CoarseTransformParams& other) const +{ + return + rotate == other.rotate + && hflip == other.hflip + && vflip == other.vflip; +} + +bool CoarseTransformParams::operator !=(const CoarseTransformParams& other) const +{ + return !(*this == other); +} + +CommonTransformParams::CommonTransformParams() : + autofill(true) +{ +} + +bool CommonTransformParams::operator ==(const CommonTransformParams& other) const +{ + return autofill == other.autofill; +} + +bool CommonTransformParams::operator !=(const CommonTransformParams& other) const +{ + return !(*this == other); +} + +RotateParams::RotateParams() : + degree(0.0) +{ +} + +bool RotateParams::operator ==(const RotateParams& other) const +{ + return degree == other.degree; +} + +bool RotateParams::operator !=(const RotateParams& other) const +{ + return !(*this == other); +} + +DistortionParams::DistortionParams() : + amount(0.0) +{ +} + +bool DistortionParams::operator ==(const DistortionParams& other) const +{ + return amount == other.amount; +} + +bool DistortionParams::operator !=(const DistortionParams& other) const +{ + return !(*this == other); +} + +LensProfParams::LensProfParams() : + lcMode(LcMode::NONE), + useDist(true), + useVign(true), + useCA(false) +{ +} + +bool LensProfParams::operator ==(const LensProfParams& other) const +{ + return + lcMode == other.lcMode + && lcpFile == other.lcpFile + && useCA == other.useCA + && lfCameraMake == other.lfCameraMake + && lfCameraModel == other.lfCameraModel + && lfLens == other.lfLens; +} + +bool LensProfParams::operator !=(const LensProfParams& other) const +{ + return !(*this == other); +} + +bool LensProfParams::useLensfun() const +{ + return lcMode == LcMode::LENSFUNAUTOMATCH || lcMode == LcMode::LENSFUNMANUAL; +} + +bool LensProfParams::lfAutoMatch() const +{ + return lcMode == LcMode::LENSFUNAUTOMATCH; +} + +bool LensProfParams::useLcp() const +{ + return lcMode == LcMode::LCP && lcpFile.length() > 0; +} + +bool LensProfParams::lfManual() const +{ + return lcMode == LcMode::LENSFUNMANUAL; +} + +const std::vector& LensProfParams::getMethodStrings() const +{ + static const std::vector method_strings = { + "none", + "lfauto", + "lfmanual", + "lcp" + }; + return method_strings; +} + +Glib::ustring LensProfParams::getMethodString(LcMode mode) const +{ + return getMethodStrings()[toUnderlying(mode)]; +} + +LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode) const +{ + for (std::vector::size_type i = 0; i < getMethodStrings().size(); ++i) { + if (getMethodStrings()[i] == mode) { + return static_cast(i); + } + } + return LcMode::NONE; +} + +PerspectiveParams::PerspectiveParams() : + horizontal(0.0), + vertical(0.0) +{ +} + +bool PerspectiveParams::operator ==(const PerspectiveParams& other) const +{ + return + horizontal == other.horizontal + && vertical == other.vertical; +} + +bool PerspectiveParams::operator !=(const PerspectiveParams& other) const +{ + return !(*this == other); +} + +GradientParams::GradientParams() : + enabled(false), + degree(0.0), + feather(25), + strength(0.60), + centerX(0), + centerY(0) +{ +} + +bool GradientParams::operator ==(const GradientParams& other) const +{ + return + enabled == other.enabled + && degree == other.degree + && feather == other.feather + && strength == other.strength + && centerX == other.centerX + && centerY == other.centerY; +} + +bool GradientParams::operator !=(const GradientParams& other) const +{ + return !(*this == other); +} + +PCVignetteParams::PCVignetteParams() : + enabled(false), + strength(0.60), + feather(50), + roundness(50) +{ +} + +bool PCVignetteParams::operator ==(const PCVignetteParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength + && feather == other.feather + && roundness == other.roundness; +} + +bool PCVignetteParams::operator !=(const PCVignetteParams& other) const +{ + return !(*this == other); +} + +VignettingParams::VignettingParams() : + amount(0), + radius(50), + strength(1), + centerX(0), + centerY(0) +{ +} + +bool VignettingParams::operator ==(const VignettingParams& other) const +{ + return + amount == other.amount + && radius == other.radius + && strength == other.strength + && centerX == other.centerX + && centerY == other.centerY; +} + +bool VignettingParams::operator !=(const VignettingParams& other) const +{ + return !(*this == other); +} + +ChannelMixerParams::ChannelMixerParams() : + red{ + 100, + 0, + 0 + }, + green{ + 0, + 100, + 0 + }, + blue{ + 0, + 0, + 100 + } +{ +} + +bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const +{ + for (unsigned int i = 0; i < 3; ++i) { + if ( + red[i] != other.red[i] + || green[i] != other.green[i] + || blue[i] != other.blue[i] + ) { + return false; + } + } + return true; +} + +bool ChannelMixerParams::operator !=(const ChannelMixerParams& other) const +{ + return !(*this == other); +} + +BlackWhiteParams::BlackWhiteParams() : + beforeCurve{ + DCT_Linear + }, + beforeCurveMode(BlackWhiteParams::TcMode::STD_BW), + afterCurve{ + DCT_Linear + }, + afterCurveMode(BlackWhiteParams::TcMode::STD_BW), + algo("SP"), + luminanceCurve{ + FCT_Linear + }, + autoc(false), + enabledcc(true), + enabled(false), + filter("None"), + setting("NormalContrast"), + method("Desaturation"), + mixerRed(33), + mixerOrange(33), + mixerYellow(33), + mixerGreen(33), + mixerCyan(33), + mixerBlue(33), + mixerMagenta(33), + mixerPurple(33), + gammaRed(0), + gammaGreen(0), + gammaBlue(0) +{ +} + +bool BlackWhiteParams::operator ==(const BlackWhiteParams& other) const +{ + return + beforeCurve == other.beforeCurve + && beforeCurveMode == other.beforeCurveMode + && afterCurve == other.afterCurve + && afterCurveMode == other.afterCurveMode + && algo == other.algo + && luminanceCurve == other.luminanceCurve + && autoc == other.autoc + && enabledcc == other.enabledcc + && enabled == other.enabled + && filter == other.filter + && setting == other.setting + && method == other.method + && mixerRed == other.mixerRed + && mixerOrange == other.mixerOrange + && mixerYellow == other.mixerYellow + && mixerGreen == other.mixerGreen + && mixerCyan == other.mixerCyan + && mixerBlue == other.mixerBlue + && mixerMagenta == other.mixerMagenta + && mixerPurple == other.mixerPurple + && gammaRed == other.gammaRed + && gammaGreen == other.gammaGreen + && gammaBlue == other.gammaBlue; +} + +bool BlackWhiteParams::operator !=(const BlackWhiteParams& other) const +{ + return !(*this == other); +} + +CACorrParams::CACorrParams() : + red(0.0), + blue(0.0) +{ +} + +bool CACorrParams::operator ==(const CACorrParams& other) const +{ + return + red == other.red + && blue == other.blue; +} + +bool CACorrParams::operator !=(const CACorrParams& other) const +{ + return !(*this == other); +} + +ResizeParams::ResizeParams() : + enabled(false), + scale(1.0), + appliesTo("Cropped area"), + method("Lanczos"), + dataspec(3), + width(900), + height(900) +{ +} + +bool ResizeParams::operator ==(const ResizeParams& other) const +{ + return + enabled == other.enabled + && scale == other.scale + && appliesTo == other.appliesTo + && method == other.method + && dataspec == other.dataspec + && width == other.width + && height == other.height; +} + +bool ResizeParams::operator !=(const ResizeParams& other) const +{ + return !(*this == other); +} + +const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring ("No ICM: sRGB output"); + +ColorManagementParams::ColorManagementParams() : + input("(cameraICC)"), + toneCurve(false), + applyLookTable(false), + applyBaselineExposureOffset(true), + applyHueSatMap(true), + dcpIlluminant(0), + working("ProPhoto"), + output("RT_sRGB"), + outputIntent(RI_RELATIVE), + outputBPC(true), + gamma("default"), + gampos(2.22), + slpos(4.5), + freegamma(false) +{ +} + +bool ColorManagementParams::operator ==(const ColorManagementParams& other) const +{ + return + input == other.input + && toneCurve == other.toneCurve + && applyLookTable == other.applyLookTable + && applyBaselineExposureOffset == other.applyBaselineExposureOffset + && applyHueSatMap == other.applyHueSatMap + && dcpIlluminant == other.dcpIlluminant + && working == other.working + && output == other.output + && outputIntent == other.outputIntent + && outputBPC == other.outputBPC + && gamma == other.gamma + && gampos == other.gampos + && slpos == other.slpos + && freegamma == other.freegamma; +} + +bool ColorManagementParams::operator !=(const ColorManagementParams& other) const +{ + return !(*this == other); +} + +WaveletParams::WaveletParams() : + ccwcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.25, + 0.35, + 0.35, + 0.50, + 0.75, + 0.35, + 0.35, + 0.90, + 0.0, + 0.35, + 0.35 + }, + opacityCurveRG{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + opacityCurveBY{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + opacityCurveW{ + static_cast(FCT_MinMaxCPoints), + 0.00, + 0.35, + 0.35, + 0.00, + 0.35, + 0.75, + 0.35, + 0.35, + 0.60, + 0.75, + 0.35, + 0.35, + 1.00, + 0.35, + 0.00, + 0.00 + }, + opacityCurveWL{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + hhcurve{ + FCT_Linear + }, + Chcurve{ + FCT_Linear + }, + wavclCurve { + DCT_Linear + }, + enabled(false), + median(false), + medianlev(false), + linkedg(true), + cbenab(false), + greenlow(0), + bluelow(0), + greenmed(0), + bluemed(0), + greenhigh(0), + bluehigh(0), + lipst(false), + avoid(false), + tmr(false), + strength(100), + balance(0), + iter(0), + expcontrast(false), + expchroma(false), + c{}, + ch{}, + expedge(false), + expresid(false), + expfinal(false), + exptoning(false), + expnoise(false), + Lmethod("4_"), + CLmethod("all"), + Backmethod("grey"), + Tilesmethod("full"), + daubcoeffmethod("4_"), + CHmethod("without"), + Medgreinf("less"), + CHSLmethod("SL"), + EDmethod("CU"), + NPmethod("none"), + BAmethod("none"), + TMmethod("cont"), + Dirmethod("all"), + HSmethod("with"), + rescon(0), + resconH(0), + reschro(0), + tmrs(0), + gamma(1), + sup(0), + sky(0.0), + thres(7), + chroma(5), + chro(0), + threshold(5), + threshold2(4), + edgedetect(90), + edgedetectthr(20), + edgedetectthr2(0), + edgesensi(60), + edgeampli(10), + contrast(0), + edgrad(15), + edgval(0), + edgthresh(10), + thr(35), + thrH(65), + skinprotect(0.0), + hueskin(-5, 25, 170, 120, false), + hueskin2(-260, -250, -130, -140, false), + hllev(50, 75, 100, 98, false), + bllev(0, 2, 50, 25, false), + pastlev(0, 2, 30, 20, false), + satlev(30, 45, 130, 100, false), + edgcont(0, 10, 75, 40, false), + level0noise(0, 0, false), + level1noise(0, 0, false), + level2noise(0, 0, false), + level3noise(0, 0, false) +{ +} + +bool WaveletParams::operator ==(const WaveletParams& other) const +{ + return + ccwcurve == other.ccwcurve + && opacityCurveRG == other.opacityCurveRG + && opacityCurveBY == other.opacityCurveBY + && opacityCurveW == other.opacityCurveW + && opacityCurveWL == other.opacityCurveWL + && hhcurve == other.hhcurve + && Chcurve == other.Chcurve + && wavclCurve == other.wavclCurve + && enabled == other.enabled + && median == other.median + && medianlev == other.medianlev + && linkedg == other.linkedg + && cbenab == other.cbenab + && greenlow == other.greenlow + && bluelow == other.bluelow + && greenmed == other.greenmed + && bluemed == other.bluemed + && greenhigh == other.greenhigh + && bluehigh == other.bluehigh + && lipst == other.lipst + && avoid == other.avoid + && tmr == other.tmr + && strength == other.strength + && balance == other.balance + && iter == other.iter + && expcontrast == other.expcontrast + && expchroma == other.expchroma + && [this, &other]() -> bool + { + for (unsigned int i = 0; i < 9; ++i) { + if (c[i] != other.c[i] || ch[i] != other.ch[i]) { + return false; + } + } + return true; + }() + && expedge == other.expedge + && expresid == other.expresid + && expfinal == other.expfinal + && exptoning == other.exptoning + && expnoise == other.expnoise + && Lmethod == other.Lmethod + && CLmethod == other.CLmethod + && Backmethod == other.Backmethod + && Tilesmethod == other.Tilesmethod + && daubcoeffmethod == other.daubcoeffmethod + && CHmethod == other.CHmethod + && Medgreinf == other.Medgreinf + && CHSLmethod == other.CHSLmethod + && EDmethod == other.EDmethod + && NPmethod == other.NPmethod + && BAmethod == other.BAmethod + && TMmethod == other.TMmethod + && Dirmethod == other.Dirmethod + && HSmethod == other.HSmethod + && rescon == other.rescon + && resconH == other.resconH + && reschro == other.reschro + && tmrs == other.tmrs + && gamma == other.gamma + && sup == other.sup + && sky == other.sky + && thres == other.thres + && chroma == other.chroma + && chro == other.chro + && threshold == other.threshold + && threshold2 == other.threshold2 + && edgedetect == other.edgedetect + && edgedetectthr == other.edgedetectthr + && edgedetectthr2 == other.edgedetectthr2 + && edgesensi == other.edgesensi + && edgeampli == other.edgeampli + && contrast == other.contrast + && edgrad == other.edgrad + && edgval == other.edgval + && edgthresh == other.edgthresh + && thr == other.thr + && thrH == other.thrH + && skinprotect == other.skinprotect + && hueskin == other.hueskin + && hueskin2 == other.hueskin2 + && hllev == other.hllev + && bllev == other.bllev + && pastlev == other.pastlev + && satlev == other.satlev + && edgcont == other.edgcont + && level0noise == other.level0noise + && level1noise == other.level1noise + && level2noise == other.level2noise + && level3noise == other.level3noise; +} + +bool WaveletParams::operator !=(const WaveletParams& other) const +{ + return !(*this == other); +} + +void WaveletParams::getCurves( + WavCurve& cCurve, + WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveBY& opacityCurveLUTBY, + WavOpacityCurveW& opacityCurveLUTW, + WavOpacityCurveWL& opacityCurveLUTWL +) const +{ + cCurve.Set (this->ccwcurve); + opacityCurveLUTRG.Set (this->opacityCurveRG); + opacityCurveLUTBY.Set (this->opacityCurveBY); + opacityCurveLUTW.Set (this->opacityCurveW); + opacityCurveLUTWL.Set (this->opacityCurveWL); + +} + +DirPyrEqualizerParams::DirPyrEqualizerParams() : + enabled(false), + gamutlab(false), + mult{ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + }, + threshold(0.2), + skinprotect(0.0), + hueskin (-5, 25, 170, 120, false), + cbdlMethod("bef") +{ +} + +bool DirPyrEqualizerParams::operator ==(const DirPyrEqualizerParams& other) const +{ + return + enabled == other.enabled + && gamutlab == other.gamutlab + && [this, &other]() -> bool + { + for (unsigned int i = 0; i < 6; ++i) { + if (mult[i] != other.mult[i]) { + return false; + } + } + return true; + }() + && threshold == other.threshold + && skinprotect == other.skinprotect + && hueskin == other.hueskin + && cbdlMethod == other.cbdlMethod; +} + +bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) const +{ + return !(*this == other); +} + +HSVEqualizerParams::HSVEqualizerParams() : + hcurve{ + FCT_Linear + }, + scurve{ + FCT_Linear + }, + vcurve{ + FCT_Linear + } +{ +} + +bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const +{ + return + hcurve == other.hcurve + && scurve == other.scurve + && vcurve == other.vcurve; +} + +bool HSVEqualizerParams::operator !=(const HSVEqualizerParams& other) const +{ + return !(*this == other); +} + +FilmSimulationParams::FilmSimulationParams() : + enabled(false), + strength(100) +{ +} + +bool FilmSimulationParams::operator ==(const FilmSimulationParams& other) const +{ + return + enabled == other.enabled + && clutFilename == other.clutFilename + && strength == other.strength; +} + +bool FilmSimulationParams::operator !=(const FilmSimulationParams& other) const +{ + return !(*this == other); +} + +RAWParams::BayerSensor::BayerSensor() : + method(getMethodString(Method::AMAZE)), + imageNum(0), + ccSteps(0), + black0(0.0), + black1(0.0), + black2(0.0), + black3(0.0), + twogreen(true), + linenoise(0), + greenthresh(0), + dcb_iterations(2), + lmmse_iterations(2), + pixelShiftMotion(0), + pixelShiftMotionCorrection(PSMotionCorrection::GRID_3X3_NEW), + pixelShiftMotionCorrectionMethod(PSMotionCorrectionMethod::AUTO), + pixelShiftStddevFactorGreen(5.0), + pixelShiftStddevFactorRed(5.0), + pixelShiftStddevFactorBlue(5.0), + pixelShiftEperIso(0.0), + pixelShiftNreadIso(0.0), + pixelShiftPrnu(1.0), + pixelShiftSigma(1.0), + pixelShiftSum(3.0), + pixelShiftRedBlueWeight(0.7), + pixelShiftShowMotion(false), + pixelShiftShowMotionMaskOnly(false), + pixelShiftAutomatic(true), + pixelShiftNonGreenHorizontal(false), + pixelShiftNonGreenVertical(false), + pixelShiftHoleFill(true), + pixelShiftMedian(false), + pixelShiftMedian3(false), + pixelShiftGreen(true), + pixelShiftBlur(true), + pixelShiftSmoothFactor(0.7), + pixelShiftExp0(false), + pixelShiftLmmse(false), + pixelShiftOneGreen(false), + pixelShiftEqualBright(false), + pixelShiftEqualBrightChannel(false), + pixelShiftNonGreenCross(true), + pixelShiftNonGreenCross2(false), + pixelShiftNonGreenAmaze(false), + dcb_enhance(true) +{ +} + +bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const +{ + return + method == other.method + && imageNum == other.imageNum + && ccSteps == other.ccSteps + && black0 == other.black0 + && black1 == other.black1 + && black2 == other.black2 + && black3 == other.black3 + && twogreen == other.twogreen + && linenoise == other.linenoise + && greenthresh == other.greenthresh + && dcb_iterations == other.dcb_iterations + && lmmse_iterations == other.lmmse_iterations + && pixelShiftMotion == other.pixelShiftMotion + && pixelShiftMotionCorrection == other.pixelShiftMotionCorrection + && pixelShiftMotionCorrectionMethod == other.pixelShiftMotionCorrectionMethod + && pixelShiftStddevFactorGreen == other.pixelShiftStddevFactorGreen + && pixelShiftStddevFactorRed == other.pixelShiftStddevFactorRed + && pixelShiftStddevFactorBlue == other.pixelShiftStddevFactorBlue + && pixelShiftEperIso == other.pixelShiftEperIso + && pixelShiftNreadIso == other.pixelShiftNreadIso + && pixelShiftPrnu == other.pixelShiftPrnu + && pixelShiftSigma == other.pixelShiftSigma + && pixelShiftSum == other.pixelShiftSum + && pixelShiftRedBlueWeight == other.pixelShiftRedBlueWeight + && pixelShiftShowMotion == other.pixelShiftShowMotion + && pixelShiftShowMotionMaskOnly == other.pixelShiftShowMotionMaskOnly + && pixelShiftAutomatic == other.pixelShiftAutomatic + && pixelShiftNonGreenHorizontal == other.pixelShiftNonGreenHorizontal + && pixelShiftNonGreenVertical == other.pixelShiftNonGreenVertical + && pixelShiftHoleFill == other.pixelShiftHoleFill + && pixelShiftMedian == other.pixelShiftMedian + && pixelShiftMedian3 == other.pixelShiftMedian3 + && pixelShiftGreen == other.pixelShiftGreen + && pixelShiftBlur == other.pixelShiftBlur + && pixelShiftSmoothFactor == other.pixelShiftSmoothFactor + && pixelShiftExp0 == other.pixelShiftExp0 + && pixelShiftLmmse == other.pixelShiftLmmse + && pixelShiftOneGreen == other.pixelShiftOneGreen + && pixelShiftEqualBright == other.pixelShiftEqualBright + && pixelShiftEqualBrightChannel == other.pixelShiftEqualBrightChannel + && pixelShiftNonGreenCross == other.pixelShiftNonGreenCross + && pixelShiftNonGreenCross2 == other.pixelShiftNonGreenCross2 + && pixelShiftNonGreenAmaze == other.pixelShiftNonGreenAmaze + && dcb_enhance == other.dcb_enhance; +} + +bool RAWParams::BayerSensor::operator !=(const BayerSensor& other) const +{ + return !(*this == other); +} + +void RAWParams::BayerSensor::setPixelShiftDefaults() +{ + pixelShiftMotion = 0; + pixelShiftMotionCorrection = RAWParams::BayerSensor::PSMotionCorrection::GRID_3X3_NEW; + pixelShiftMotionCorrectionMethod = RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO; + pixelShiftStddevFactorGreen = 5.0; + pixelShiftStddevFactorRed = 5.0; + pixelShiftStddevFactorBlue = 5.0; + pixelShiftEperIso = 0.0; + pixelShiftNreadIso = 0.0; + pixelShiftPrnu = 1.0; + pixelShiftSigma = 1.0; + pixelShiftSum = 3.0; + pixelShiftRedBlueWeight = 0.7; + pixelShiftAutomatic = true; + pixelShiftNonGreenHorizontal = false; + pixelShiftNonGreenVertical = false; + pixelShiftHoleFill = true; + pixelShiftMedian = false; + pixelShiftMedian3 = false; + pixelShiftGreen = true; + pixelShiftBlur = true; + pixelShiftSmoothFactor = 0.7; + pixelShiftExp0 = false; + pixelShiftLmmse = false; + pixelShiftOneGreen = false; + pixelShiftEqualBright = false; + pixelShiftEqualBrightChannel = false; + pixelShiftNonGreenCross = true; + pixelShiftNonGreenCross2 = false; + pixelShiftNonGreenAmaze = false; +} + +const std::vector& RAWParams::BayerSensor::getMethodStrings() +{ + static const std::vector method_strings { + "amaze", + "igv", + "lmmse", + "eahd", + "hphd", + "vng4", + "dcb", + "ahd", + "rcd", + "fast", + "mono", + "none", + "pixelshift" + }; + return method_strings; +} + +Glib::ustring RAWParams::BayerSensor::getMethodString(Method method) +{ + return getMethodStrings()[toUnderlying(method)]; +} + +RAWParams::XTransSensor::XTransSensor() : + method(getMethodString(Method::THREE_PASS)), + ccSteps(0), + blackred(0.0), + blackgreen(0.0), + blackblue(0.0) +{ +} + +bool RAWParams::XTransSensor::operator ==(const XTransSensor& other) const +{ + return + method == other.method + && ccSteps == other.ccSteps + && blackred == other.blackred + && blackgreen == other.blackgreen + && blackblue == other.blackblue; +} + +bool RAWParams::XTransSensor::operator !=(const XTransSensor& other) const +{ + return !(*this == other); +} + +const std::vector& RAWParams::XTransSensor::getMethodStrings() +{ + static const std::vector method_strings { + "3-pass (best)", + "1-pass (medium)", + "fast", + "mono", + "none" + }; + return method_strings; +} + +Glib::ustring RAWParams::XTransSensor::getMethodString(Method method) +{ + return getMethodStrings()[toUnderlying(method)]; +} + +RAWParams::RAWParams() : + df_autoselect(false), + ff_AutoSelect(false), + ff_BlurRadius(32), + ff_BlurType(getFlatFieldBlurTypeString(FlatFieldBlurType::AREA)), + ff_AutoClipControl(false), + ff_clipControl(0), + ca_autocorrect(false), + cared(0.0), + cablue(0.0), + expos(1.0), + preser(0.0), + hotPixelFilter(false), + deadPixelFilter(false), + hotdeadpix_thresh(100) +{ +} + +bool RAWParams::operator ==(const RAWParams& other) const +{ + return + bayersensor == other.bayersensor + && xtranssensor == other.xtranssensor + && dark_frame == other.dark_frame + && df_autoselect == other.df_autoselect + && ff_file == other.ff_file + && ff_AutoSelect == other.ff_AutoSelect + && ff_BlurRadius == other.ff_BlurRadius + && ff_BlurType == other.ff_BlurType + && ff_AutoClipControl == other.ff_AutoClipControl + && ff_clipControl == other.ff_clipControl + && ca_autocorrect == other.ca_autocorrect + && cared == other.cared + && cablue == other.cablue + && expos == other.expos + && preser == other.preser + && hotPixelFilter == other.hotPixelFilter + && deadPixelFilter == other.deadPixelFilter + && hotdeadpix_thresh == other.hotdeadpix_thresh; +} + +bool RAWParams::operator !=(const RAWParams& other) const +{ + return !(*this == other); +} + +const std::vector& RAWParams::getFlatFieldBlurTypeStrings() +{ + static const std::vector blur_type_strings { + "Area Flatfield", + "Vertical Flatfield", + "Horizontal Flatfield", + "V+H Flatfield" + }; + return blur_type_strings; +} + +Glib::ustring RAWParams::getFlatFieldBlurTypeString(FlatFieldBlurType type) +{ + return getFlatFieldBlurTypeStrings()[toUnderlying(type)]; +} + +ProcParams::ProcParams () +{ + setDefaults (); +} + +void ProcParams::setDefaults () +{ + toneCurve = ToneCurveParams(); + + labCurve = LCurveParams(); + + rgbCurves = RGBCurvesParams(); + + colorToning = ColorToningParams(); + + sharpenEdge = SharpenEdgeParams(); + + sharpenMicro = SharpenMicroParams(); + + sharpening = SharpeningParams(); + + prsharpening = SharpeningParams(); + prsharpening.method = "rld"; + prsharpening.deconvamount = 100; + prsharpening.deconvradius = 0.45; + prsharpening.deconviter = 100; + prsharpening.deconvdamping = 0; + + vibrance = VibranceParams(); + + wb = WBParams(); + + colorappearance = ColorAppearanceParams(); + + defringe = DefringeParams(); + + impulseDenoise = ImpulseDenoiseParams(); + + dirpyrDenoise = DirPyrDenoiseParams(); + + epd = EPDParams(); + + fattal = FattalToneMappingParams(); + + sh = SHParams(); + + crop = CropParams(); + + coarse = CoarseTransformParams(); + + commonTrans = CommonTransformParams(); + + rotate = RotateParams(); + + distortion = DistortionParams(); + + lensProf = LensProfParams(); + + perspective = PerspectiveParams(); + + gradient = GradientParams(); + + pcvignette = PCVignetteParams(); + + vignetting = VignettingParams(); + + chmixer = ChannelMixerParams(); + + blackwhite = BlackWhiteParams(); + + cacorrection = CACorrParams(); + + resize = ResizeParams(); + + icm = ColorManagementParams(); + + wavelet = WaveletParams(); + + dirpyrequalizer = DirPyrEqualizerParams(); + + hsvequalizer = HSVEqualizerParams(); + + filmSimulation = FilmSimulationParams(); + + raw = RAWParams(); + + exif.clear (); + iptc.clear (); + + rank = 0; + colorlabel = 0; + inTrash = false; + + ppVersion = PPVERSION; +} + +int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bool fnameAbsolute, ParamsEdited* pedited) +{ + if (fname.empty () && fname2.empty ()) { + return 0; + } + + Glib::ustring sPParams; + + try { + Glib::KeyFile keyFile; + +// Version + keyFile.set_string ("Version", "AppVersion", RTVERSION); + keyFile.set_integer ("Version", "Version", PPVERSION); + + saveToKeyfile(!pedited || pedited->general.rank, "General", "Rank", rank, keyFile); + saveToKeyfile(!pedited || pedited->general.colorlabel, "General", "ColorLabel", colorlabel, keyFile); + saveToKeyfile(!pedited || pedited->general.intrash, "General", "InTrash", inTrash, keyFile); + +// Tone curve + saveToKeyfile(!pedited || pedited->toneCurve.autoexp, "Exposure", "Auto", toneCurve.autoexp, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.clip, "Exposure", "Clip", toneCurve.clip, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.expcomp, "Exposure", "Compensation", toneCurve.expcomp, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.brightness, "Exposure", "Brightness", toneCurve.brightness, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.contrast, "Exposure", "Contrast", toneCurve.contrast, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.saturation, "Exposure", "Saturation", toneCurve.saturation, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.black, "Exposure", "Black", toneCurve.black, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlcompr, "Exposure", "HighlightCompr", toneCurve.hlcompr, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlcomprthresh, "Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.shcompr, "Exposure", "ShadowCompr", toneCurve.shcompr, keyFile); + +// Highlight recovery + saveToKeyfile(!pedited || pedited->toneCurve.hrenabled, "HLRecovery", "Enabled", toneCurve.hrenabled, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.method, "HLRecovery", "Method", toneCurve.method, keyFile); + + const std::map tc_mapping = { + {ToneCurveParams::TcMode::STD, "Standard"}, + {ToneCurveParams::TcMode::FILMLIKE, "FilmLike"}, + {ToneCurveParams::TcMode::SATANDVALBLENDING, "SatAndValueBlending"}, + {ToneCurveParams::TcMode::WEIGHTEDSTD,"WeightedStd"}, + {ToneCurveParams::TcMode::LUMINANCE, "Luminance"}, + {ToneCurveParams::TcMode::PERCEPTUAL, "Perceptual"} + }; + + saveToKeyfile(!pedited || pedited->toneCurve.curveMode, "Exposure", "CurveMode", tc_mapping, toneCurve.curveMode, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.curveMode2, "Exposure", "CurveMode2", tc_mapping, toneCurve.curveMode2, keyFile); + + saveToKeyfile(!pedited || pedited->toneCurve.curve, "Exposure", "Curve", toneCurve.curve, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.curve2, "Exposure", "Curve2", toneCurve.curve2, keyFile); + +// Retinex + saveToKeyfile(!pedited || pedited->retinex.enabled, "Retinex", "Enabled", retinex.enabled, keyFile); + saveToKeyfile(!pedited || pedited->retinex.str, "Retinex", "Str", retinex.str, keyFile); + saveToKeyfile(!pedited || pedited->retinex.scal, "Retinex", "Scal", retinex.scal, keyFile); + saveToKeyfile(!pedited || pedited->retinex.iter, "Retinex", "Iter", retinex.iter, keyFile); + saveToKeyfile(!pedited || pedited->retinex.grad, "Retinex", "Grad", retinex.grad, keyFile); + saveToKeyfile(!pedited || pedited->retinex.grads, "Retinex", "Grads", retinex.grads, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gam, "Retinex", "Gam", retinex.gam, keyFile); + saveToKeyfile(!pedited || pedited->retinex.slope, "Retinex", "Slope", retinex.slope, keyFile); + saveToKeyfile(!pedited || pedited->retinex.medianmap, "Retinex", "Median", retinex.medianmap, keyFile); + + saveToKeyfile(!pedited || pedited->retinex.neigh, "Retinex", "Neigh", retinex.neigh, keyFile); + saveToKeyfile(!pedited || pedited->retinex.offs, "Retinex", "Offs", retinex.offs, keyFile); + saveToKeyfile(!pedited || pedited->retinex.vart, "Retinex", "Vart", retinex.vart, keyFile); + saveToKeyfile(!pedited || pedited->retinex.limd, "Retinex", "Limd", retinex.limd, keyFile); + saveToKeyfile(!pedited || pedited->retinex.highl, "Retinex", "highl", retinex.highl, keyFile); + saveToKeyfile(!pedited || pedited->retinex.skal, "Retinex", "skal", retinex.skal, keyFile); + saveToKeyfile(!pedited || pedited->retinex.retinexMethod, "Retinex", "RetinexMethod", retinex.retinexMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.mapMethod, "Retinex", "mapMethod", retinex.mapMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.viewMethod, "Retinex", "viewMethod", retinex.viewMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.retinexcolorspace, "Retinex", "Retinexcolorspace", retinex.retinexcolorspace, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gammaretinex, "Retinex", "Gammaretinex", retinex.gammaretinex, keyFile); + saveToKeyfile(!pedited || pedited->retinex.cdcurve, "Retinex", "CDCurve", retinex.cdcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.mapcurve, "Retinex", "MAPCurve", retinex.mapcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.cdHcurve, "Retinex", "CDHCurve", retinex.cdHcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.lhcurve, "Retinex", "LHCurve", retinex.lhcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.highlights, "Retinex", "Highlights", retinex.highlights, keyFile); + saveToKeyfile(!pedited || pedited->retinex.htonalwidth, "Retinex", "HighlightTonalWidth", retinex.htonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->retinex.shadows, "Retinex", "Shadows", retinex.shadows, keyFile); + saveToKeyfile(!pedited || pedited->retinex.stonalwidth, "Retinex", "ShadowTonalWidth", retinex.stonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->retinex.radius, "Retinex", "Radius", retinex.radius, keyFile); + saveToKeyfile(!pedited || pedited->retinex.transmissionCurve, "Retinex", "TransmissionCurve", retinex.transmissionCurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); + +// 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); + } + +// Black & White + saveToKeyfile(!pedited || pedited->blackwhite.enabled, "Black & White", "Enabled", blackwhite.enabled, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.method, "Black & White", "Method", blackwhite.method, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.autoc, "Black & White", "Auto", blackwhite.autoc, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.enabledcc, "Black & White", "ComplementaryColors", blackwhite.enabledcc, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.setting, "Black & White", "Setting", blackwhite.setting, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.filter, "Black & White", "Filter", blackwhite.filter, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerRed, "Black & White", "MixerRed", blackwhite.mixerRed, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerOrange, "Black & White", "MixerOrange", blackwhite.mixerOrange, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerYellow, "Black & White", "MixerYellow", blackwhite.mixerYellow, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerGreen, "Black & White", "MixerGreen", blackwhite.mixerGreen, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerCyan, "Black & White", "MixerCyan", blackwhite.mixerCyan, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerBlue, "Black & White", "MixerBlue", blackwhite.mixerBlue, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerMagenta, "Black & White", "MixerMagenta", blackwhite.mixerMagenta, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerPurple, "Black & White", "MixerPurple", blackwhite.mixerPurple, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaRed, "Black & White", "GammaRed", blackwhite.gammaRed, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaGreen, "Black & White", "GammaGreen", blackwhite.gammaGreen, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaBlue, "Black & White", "GammaBlue", blackwhite.gammaBlue, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.algo, "Black & White", "Algorithm", blackwhite.algo, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.luminanceCurve, "Black & White", "LuminanceCurve", blackwhite.luminanceCurve, keyFile); + saveToKeyfile( + !pedited || pedited->blackwhite.beforeCurveMode, + "Black & White", + "BeforeCurveMode", + { + {BlackWhiteParams::TcMode::STD_BW, "Standard"}, + {BlackWhiteParams::TcMode::FILMLIKE_BW, "FilmLike"}, + {BlackWhiteParams::TcMode::SATANDVALBLENDING_BW, "SatAndValueBlending"}, + {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} + + }, + blackwhite.beforeCurveMode, + keyFile + ); + saveToKeyfile( + !pedited || pedited->blackwhite.afterCurveMode, + "Black & White", + "AfterCurveMode", + { + {BlackWhiteParams::TcMode::STD_BW, "Standard"}, + {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} + + }, + blackwhite.afterCurveMode, + keyFile + ); + saveToKeyfile(!pedited || pedited->blackwhite.beforeCurve, "Black & White", "BeforeCurve", blackwhite.beforeCurve, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.afterCurve, "Black & White", "AfterCurve", blackwhite.afterCurve, keyFile); + +// Luma curve + saveToKeyfile(!pedited || pedited->labCurve.brightness, "Luminance Curve", "Brightness", labCurve.brightness, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.contrast, "Luminance Curve", "Contrast", labCurve.contrast, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.chromaticity, "Luminance Curve", "Chromaticity", labCurve.chromaticity, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.avoidcolorshift, "Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.rstprotection, "Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lcredsk, "Luminance Curve", "LCredsk", labCurve.lcredsk, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lcurve, "Luminance Curve", "LCurve", labCurve.lcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.acurve, "Luminance Curve", "aCurve", labCurve.acurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.bcurve, "Luminance Curve", "bCurve", labCurve.bcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.cccurve, "Luminance Curve", "ccCurve", labCurve.cccurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.chcurve, "Luminance Curve", "chCurve", labCurve.chcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lhcurve, "Luminance Curve", "lhCurve", labCurve.lhcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.hhcurve, "Luminance Curve", "hhCurve", labCurve.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lccurve, "Luminance Curve", "LcCurve", labCurve.lccurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.clcurve, "Luminance Curve", "ClCurve", labCurve.clcurve, keyFile); + +// Sharpening + saveToKeyfile(!pedited || pedited->sharpening.enabled, "Sharpening", "Enabled", sharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.method, "Sharpening", "Method", sharpening.method, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.radius, "Sharpening", "Radius", sharpening.radius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.amount, "Sharpening", "Amount", sharpening.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.threshold, "Sharpening", "Threshold", sharpening.threshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edgesonly, "Sharpening", "OnlyEdges", sharpening.edgesonly, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edges_radius, "Sharpening", "EdgedetectionRadius", sharpening.edges_radius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edges_tolerance, "Sharpening", "EdgeTolerance", sharpening.edges_tolerance, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.halocontrol, "Sharpening", "HalocontrolEnabled", sharpening.halocontrol, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.halocontrol_amount, "Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvradius, "Sharpening", "DeconvRadius", sharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvamount, "Sharpening", "DeconvAmount", sharpening.deconvamount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvdamping, "Sharpening", "DeconvDamping", sharpening.deconvdamping, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconviter, "Sharpening", "DeconvIterations", sharpening.deconviter, keyFile); + +// Vibrance + saveToKeyfile(!pedited || pedited->vibrance.enabled, "Vibrance", "Enabled", vibrance.enabled, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.pastels, "Vibrance", "Pastels", vibrance.pastels, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.saturated, "Vibrance", "Saturated", vibrance.saturated, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.psthreshold, "Vibrance", "PSThreshold", vibrance.psthreshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->vibrance.protectskins, "Vibrance", "ProtectSkins", vibrance.protectskins, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.avoidcolorshift, "Vibrance", "AvoidColorShift", vibrance.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.pastsattog, "Vibrance", "PastSatTog", vibrance.pastsattog, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.skintonescurve, "Vibrance", "SkinTonesCurve", vibrance.skintonescurve, keyFile); + +// Edge sharpening + saveToKeyfile(!pedited || pedited->sharpenEdge.enabled, "SharpenEdge", "Enabled", sharpenEdge.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.passes, "SharpenEdge", "Passes", sharpenEdge.passes, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.amount, "SharpenEdge", "Strength", sharpenEdge.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.threechannels, "SharpenEdge", "ThreeChannels", sharpenEdge.threechannels, keyFile); + +// Micro-contrast sharpening + saveToKeyfile(!pedited || pedited->sharpenMicro.enabled, "SharpenMicro", "Enabled", sharpenMicro.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.matrix, "SharpenMicro", "Matrix", sharpenMicro.matrix, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.amount, "SharpenMicro", "Strength", sharpenMicro.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.uniformity, "SharpenMicro", "Uniformity", sharpenMicro.uniformity, keyFile); + +// WB + saveToKeyfile(!pedited || pedited->wb.method, "White Balance", "Setting", wb.method, keyFile); + saveToKeyfile(!pedited || pedited->wb.temperature, "White Balance", "Temperature", wb.temperature, keyFile); + saveToKeyfile(!pedited || pedited->wb.green, "White Balance", "Green", wb.green, keyFile); + saveToKeyfile(!pedited || pedited->wb.equal, "White Balance", "Equal", wb.equal, keyFile); + saveToKeyfile(!pedited || pedited->wb.tempBias, "White Balance", "TemperatureBias", wb.tempBias, keyFile); + +// Colorappearance + saveToKeyfile(!pedited || pedited->colorappearance.enabled, "Color appearance", "Enabled", colorappearance.enabled, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.degree, "Color appearance", "Degree", colorappearance.degree, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autodegree, "Color appearance", "AutoDegree", colorappearance.autodegree, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.degreeout, "Color appearance", "Degreeout", colorappearance.degreeout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autodegreeout, "Color appearance", "AutoDegreeout", colorappearance.autodegreeout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surround, "Color appearance", "Surround", colorappearance.surround, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surrsrc, "Color appearance", "Surrsrc", colorappearance.surrsrc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.wbmodel, "Color appearance", "Model", colorappearance.wbmodel, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.algo, "Color appearance", "Algorithm", colorappearance.algo, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.jlight, "Color appearance", "J-Light", colorappearance.jlight, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.qbright, "Color appearance", "Q-Bright", colorappearance.qbright, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.chroma, "Color appearance", "C-Chroma", colorappearance.chroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.schroma, "Color appearance", "S-Chroma", colorappearance.schroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.mchroma, "Color appearance", "M-Chroma", colorappearance.mchroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.contrast, "Color appearance", "J-Contrast", colorappearance.contrast, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.qcontrast, "Color appearance", "Q-Contrast", colorappearance.qcontrast, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.colorh, "Color appearance", "H-Hue", colorappearance.colorh, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.rstprotection, "Color appearance", "RSTProtection", colorappearance.rstprotection, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.adapscen, "Color appearance", "AdaptScene", colorappearance.adapscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autoadapscen, "Color appearance", "AutoAdapscen", colorappearance.autoadapscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.ybscen, "Color appearance", "YbScene", colorappearance.ybscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autoybscen, "Color appearance", "Autoybscen", colorappearance.autoybscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surrsource, "Color appearance", "SurrSource", colorappearance.surrsource, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.gamut, "Color appearance", "Gamut", colorappearance.gamut, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tempout, "Color appearance", "Tempout", colorappearance.tempout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.greenout, "Color appearance", "Greenout", colorappearance.greenout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tempsc, "Color appearance", "Tempsc", colorappearance.tempsc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.greensc, "Color appearance", "Greensc", colorappearance.greensc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.ybout, "Color appearance", "Ybout", colorappearance.ybout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.datacie, "Color appearance", "Datacie", colorappearance.datacie, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tonecie, "Color appearance", "Tonecie", colorappearance.tonecie, keyFile); + + const std::map ca_mapping = { + {ColorAppearanceParams::TcMode::LIGHT, "Lightness"}, + {ColorAppearanceParams::TcMode::BRIGHT, "Brightness"} + }; + + saveToKeyfile(!pedited || pedited->colorappearance.curveMode, "Color appearance", "CurveMode", ca_mapping, colorappearance.curveMode, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curveMode2, "Color appearance", "CurveMode2", ca_mapping, colorappearance.curveMode2, keyFile); + saveToKeyfile( + !pedited || pedited->colorappearance.curveMode3, + "Color appearance", + "CurveMode3", + { + {ColorAppearanceParams::CtcMode::CHROMA, "Chroma"}, + {ColorAppearanceParams::CtcMode::SATUR, "Saturation"}, + {ColorAppearanceParams::CtcMode::COLORF, "Colorfullness"} + + }, + colorappearance.curveMode3, + keyFile + ); + saveToKeyfile(!pedited || pedited->colorappearance.curve, "Color appearance", "Curve", colorappearance.curve, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curve2, "Color appearance", "Curve2", colorappearance.curve2, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curve3, "Color appearance", "Curve3", colorappearance.curve3, keyFile); + +// Impulse denoise + saveToKeyfile(!pedited || pedited->impulseDenoise.enabled, "Impulse Denoising", "Enabled", impulseDenoise.enabled, keyFile); + saveToKeyfile(!pedited || pedited->impulseDenoise.thresh, "Impulse Denoising", "Threshold", impulseDenoise.thresh, keyFile); + +// Defringe + saveToKeyfile(!pedited || pedited->defringe.enabled, "Defringing", "Enabled", defringe.enabled, keyFile); + saveToKeyfile(!pedited || pedited->defringe.radius, "Defringing", "Radius", defringe.radius, keyFile); + saveToKeyfile(!pedited || pedited->defringe.threshold, "Defringing", "Threshold", defringe.threshold, keyFile); + saveToKeyfile(!pedited || pedited->defringe.huecurve, "Defringing", "HueCurve", defringe.huecurve, keyFile); + +// Directional pyramid denoising + saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.median, "Directional Pyramid Denoising", "Median", dirpyrDenoise.median, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.luma, "Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Ldetail, "Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.chroma, "Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.dmethod, "Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Lmethod, "Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod, keyFile); + if (dirpyrDenoise.Cmethod == "PRE") { + dirpyrDenoise.Cmethod = "MAN"; // Never save 'auto chroma preview mode' to pp3 + } + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Cmethod, "Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod, keyFile); + if (dirpyrDenoise.C2method == "PREV") { + dirpyrDenoise.C2method = "MANU"; + } + saveToKeyfile(!pedited || pedited->dirpyrDenoise.C2method, "Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.smethod, "Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.medmethod, "Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.rgbmethod, "Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.methodmed, "Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.redchro, "Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.bluechro, "Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.gamma, "Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.passes, "Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.lcurve, "Directional Pyramid Denoising", "LCurve", dirpyrDenoise.lcurve, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.cccurve, "Directional Pyramid Denoising", "CCCurve", dirpyrDenoise.cccurve, keyFile); + +// EPD + saveToKeyfile(!pedited || pedited->epd.enabled, "EPD", "Enabled", epd.enabled, keyFile); + saveToKeyfile(!pedited || pedited->epd.strength, "EPD", "Strength", epd.strength, keyFile); + saveToKeyfile(!pedited || pedited->epd.gamma, "EPD", "Gamma", epd.gamma, keyFile); + saveToKeyfile(!pedited || pedited->epd.edgeStopping, "EPD", "EdgeStopping", epd.edgeStopping, keyFile); + saveToKeyfile(!pedited || pedited->epd.scale, "EPD", "Scale", epd.scale, keyFile); + saveToKeyfile(!pedited || pedited->epd.reweightingIterates, "EPD", "ReweightingIterates", epd.reweightingIterates, keyFile); + +// Fattal + saveToKeyfile(!pedited || pedited->fattal.enabled, "FattalToneMapping", "Enabled", fattal.enabled, keyFile); + saveToKeyfile(!pedited || pedited->fattal.threshold, "FattalToneMapping", "Threshold", fattal.threshold, keyFile); + saveToKeyfile(!pedited || pedited->fattal.amount, "FattalToneMapping", "Amount", fattal.amount, keyFile); + +// Shadows & highlights + saveToKeyfile(!pedited || pedited->sh.enabled, "Shadows & Highlights", "Enabled", sh.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sh.hq, "Shadows & Highlights", "HighQuality", sh.hq, keyFile); + saveToKeyfile(!pedited || pedited->sh.highlights, "Shadows & Highlights", "Highlights", sh.highlights, keyFile); + saveToKeyfile(!pedited || pedited->sh.htonalwidth, "Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile); + saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->sh.localcontrast, "Shadows & Highlights", "LocalContrast", sh.localcontrast, keyFile); + saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile); + +// Crop + saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile); + saveToKeyfile(!pedited || pedited->crop.x, "Crop", "X", crop.x, keyFile); + saveToKeyfile(!pedited || pedited->crop.y, "Crop", "Y", crop.y, keyFile); + saveToKeyfile(!pedited || pedited->crop.w, "Crop", "W", crop.w, keyFile); + saveToKeyfile(!pedited || pedited->crop.h, "Crop", "H", crop.h, keyFile); + saveToKeyfile(!pedited || pedited->crop.fixratio, "Crop", "FixedRatio", crop.fixratio, keyFile); + saveToKeyfile(!pedited || pedited->crop.ratio, "Crop", "Ratio", crop.ratio, keyFile); + saveToKeyfile(!pedited || pedited->crop.orientation, "Crop", "Orientation", crop.orientation, keyFile); + saveToKeyfile(!pedited || pedited->crop.guide, "Crop", "Guide", crop.guide, keyFile); + +// Coarse transformation + saveToKeyfile(!pedited || pedited->coarse.rotate, "Coarse Transformation", "Rotate", coarse.rotate, keyFile); + saveToKeyfile(!pedited || pedited->coarse.hflip, "Coarse Transformation", "HorizontalFlip", coarse.hflip, keyFile); + saveToKeyfile(!pedited || pedited->coarse.vflip, "Coarse Transformation", "VerticalFlip", coarse.vflip, keyFile); + +// Common properties for transformations + saveToKeyfile(!pedited || pedited->commonTrans.autofill, "Common Properties for Transformations", "AutoFill", commonTrans.autofill, keyFile); + +// Rotation + saveToKeyfile(!pedited || pedited->rotate.degree, "Rotation", "Degree", rotate.degree, keyFile); + +// Distortion + saveToKeyfile(!pedited || pedited->distortion.amount, "Distortion", "Amount", distortion.amount, keyFile); + +// Lens profile + saveToKeyfile(!pedited || pedited->lensProf.lcMode, "LensProfile", "LcMode", lensProf.getMethodString (lensProf.lcMode), keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lcpFile, "LensProfile", "LCPFile", relativePathIfInside (fname, fnameAbsolute, lensProf.lcpFile), keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useDist, "LensProfile", "UseDistortion", lensProf.useDist, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useVign, "LensProfile", "UseVignette", lensProf.useVign, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useCA, "LensProfile", "UseCA", lensProf.useCA, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfCameraMake, "LensProfile", "LFCameraMake", lensProf.lfCameraMake, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfCameraModel, "LensProfile", "LFCameraModel", lensProf.lfCameraModel, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfLens, "LensProfile", "LFLens", lensProf.lfLens, keyFile); + +// Perspective correction + saveToKeyfile(!pedited || pedited->perspective.horizontal, "Perspective", "Horizontal", perspective.horizontal, keyFile); + saveToKeyfile(!pedited || pedited->perspective.vertical, "Perspective", "Vertical", perspective.vertical, keyFile); + +// Gradient + saveToKeyfile(!pedited || pedited->gradient.enabled, "Gradient", "Enabled", gradient.enabled, keyFile); + saveToKeyfile(!pedited || pedited->gradient.degree, "Gradient", "Degree", gradient.degree, keyFile); + saveToKeyfile(!pedited || pedited->gradient.feather, "Gradient", "Feather", gradient.feather, keyFile); + saveToKeyfile(!pedited || pedited->gradient.strength, "Gradient", "Strength", gradient.strength, keyFile); + saveToKeyfile(!pedited || pedited->gradient.centerX, "Gradient", "CenterX", gradient.centerX, keyFile); + saveToKeyfile(!pedited || pedited->gradient.centerY, "Gradient", "CenterY", gradient.centerY, keyFile); + +// Post-crop vignette + saveToKeyfile(!pedited || pedited->pcvignette.enabled, "PCVignette", "Enabled", pcvignette.enabled, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.strength, "PCVignette", "Strength", pcvignette.strength, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.feather, "PCVignette", "Feather", pcvignette.feather, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.roundness, "PCVignette", "Roundness", pcvignette.roundness, keyFile); + +// C/A correction + saveToKeyfile(!pedited || pedited->cacorrection.red, "CACorrection", "Red", cacorrection.red, keyFile); + saveToKeyfile(!pedited || pedited->cacorrection.blue, "CACorrection", "Blue", cacorrection.blue, keyFile); + +// Vignetting correction + saveToKeyfile(!pedited || pedited->vignetting.amount, "Vignetting Correction", "Amount", vignetting.amount, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.radius, "Vignetting Correction", "Radius", vignetting.radius, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.strength, "Vignetting Correction", "Strength", vignetting.strength, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.centerX, "Vignetting Correction", "CenterX", vignetting.centerX, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.centerY, "Vignetting Correction", "CenterY", vignetting.centerY, keyFile); + +// Resize + saveToKeyfile(!pedited || pedited->resize.enabled, "Resize", "Enabled", resize.enabled, keyFile); + saveToKeyfile(!pedited || pedited->resize.scale, "Resize", "Scale", resize.scale, keyFile); + saveToKeyfile(!pedited || pedited->resize.appliesTo, "Resize", "AppliesTo", resize.appliesTo, keyFile); + saveToKeyfile(!pedited || pedited->resize.method, "Resize", "Method", resize.method, keyFile); + saveToKeyfile(!pedited || pedited->resize.dataspec, "Resize", "DataSpecified", resize.dataspec, keyFile); + saveToKeyfile(!pedited || pedited->resize.width, "Resize", "Width", resize.width, keyFile); + saveToKeyfile(!pedited || pedited->resize.height, "Resize", "Height", resize.height, keyFile); + +// Post resize sharpening + saveToKeyfile(!pedited || pedited->prsharpening.enabled, "PostResizeSharpening", "Enabled", prsharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.method, "PostResizeSharpening", "Method", prsharpening.method, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.radius, "PostResizeSharpening", "Radius", prsharpening.radius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.amount, "PostResizeSharpening", "Amount", prsharpening.amount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.threshold, "PostResizeSharpening", "Threshold", prsharpening.threshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edgesonly, "PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edges_radius, "PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edges_tolerance, "PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.halocontrol, "PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.halocontrol_amount, "PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvradius, "PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvamount, "PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvdamping, "PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconviter, "PostResizeSharpening", "DeconvIterations", prsharpening.deconviter, keyFile); + +// Color management + saveToKeyfile(!pedited || pedited->icm.input, "Color Management", "InputProfile", relativePathIfInside (fname, fnameAbsolute, icm.input), keyFile); + saveToKeyfile(!pedited || pedited->icm.toneCurve, "Color Management", "ToneCurve", icm.toneCurve, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyLookTable, "Color Management", "ApplyLookTable", icm.applyLookTable, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyBaselineExposureOffset, "Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyHueSatMap, "Color Management", "ApplyHueSatMap", icm.applyHueSatMap, keyFile); + saveToKeyfile(!pedited || pedited->icm.dcpIlluminant, "Color Management", "DCPIlluminant", icm.dcpIlluminant, keyFile); + saveToKeyfile(!pedited || pedited->icm.working, "Color Management", "WorkingProfile", icm.working, keyFile); + saveToKeyfile(!pedited || pedited->icm.output, "Color Management", "OutputProfile", icm.output, keyFile); + saveToKeyfile( + !pedited || icm.outputIntent, + "Color Management", + "OutputProfileIntent", + { + {RI_PERCEPTUAL, "Perceptual"}, + {RI_RELATIVE, "Relative"}, + {RI_SATURATION, "Saturation"}, + {RI_ABSOLUTE, "Absolute"} + + }, + icm.outputIntent, + keyFile + ); + saveToKeyfile(!pedited || pedited->icm.outputBPC, "Color Management", "OutputBPC", icm.outputBPC, keyFile); + saveToKeyfile(!pedited || pedited->icm.gamma, "Color Management", "Gammafree", icm.gamma, keyFile); + saveToKeyfile(!pedited || pedited->icm.freegamma, "Color Management", "Freegamma", icm.freegamma, keyFile); + saveToKeyfile(!pedited || pedited->icm.gampos, "Color Management", "GammaValue", icm.gampos, keyFile); + saveToKeyfile(!pedited || pedited->icm.slpos, "Color Management", "GammaSlope", icm.slpos, keyFile); + +// Wavelet + saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.daubcoeffmethod, "Wavelet", "DaubMethod", wavelet.daubcoeffmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CLmethod, "Wavelet", "ChoiceLevMethod", wavelet.CLmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Backmethod, "Wavelet", "BackMethod", wavelet.Backmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Lmethod, "Wavelet", "LevMethod", wavelet.Lmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Dirmethod, "Wavelet", "DirMethod", wavelet.Dirmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenhigh, "Wavelet", "CBgreenhigh", wavelet.greenhigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenmed, "Wavelet", "CBgreenmed", wavelet.greenmed, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenlow, "Wavelet", "CBgreenlow", wavelet.greenlow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); + + for (int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Contrast" << (i + 1); + + saveToKeyfile(!pedited || pedited->wavelet.c[i], "Wavelet", ss.str(), wavelet.c[i], keyFile); + } + + for (int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Chroma" << (i + 1); + + saveToKeyfile(!pedited || pedited->wavelet.ch[i], "Wavelet", ss.str(), wavelet.ch[i], keyFile); + } + + saveToKeyfile(!pedited || pedited->wavelet.sup, "Wavelet", "ContExtra", wavelet.sup, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.HSmethod, "Wavelet", "HSMethod", wavelet.HSmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hllev, "Wavelet", "HLRange", wavelet.hllev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bllev, "Wavelet", "SHRange", wavelet.bllev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgcont, "Wavelet", "Edgcont", wavelet.edgcont.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level0noise, "Wavelet", "Level0noise", wavelet.level0noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level1noise, "Wavelet", "Level1noise", wavelet.level1noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level2noise, "Wavelet", "Level2noise", wavelet.level2noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level3noise, "Wavelet", "Level3noise", wavelet.level3noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.threshold, "Wavelet", "ThresholdHighlight", wavelet.threshold, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.threshold2, "Wavelet", "ThresholdShadow", wavelet.threshold2, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetect, "Wavelet", "Edgedetect", wavelet.edgedetect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr, "Wavelet", "Edgedetectthr", wavelet.edgedetectthr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr2, "Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgesensi, "Wavelet", "Edgesensi", wavelet.edgesensi, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgeampli, "Wavelet", "Edgeampli", wavelet.edgeampli, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chroma, "Wavelet", "ThresholdChroma", wavelet.chroma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CHmethod, "Wavelet", "CHromaMethod", wavelet.CHmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Medgreinf, "Wavelet", "Medgreinf", wavelet.Medgreinf, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CHSLmethod, "Wavelet", "CHSLromaMethod", wavelet.CHSLmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.EDmethod, "Wavelet", "EDMethod", wavelet.EDmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.NPmethod, "Wavelet", "NPMethod", wavelet.NPmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.BAmethod, "Wavelet", "BAMethod", wavelet.BAmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hhcurve, "Wavelet", "HHcurve", wavelet.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Chcurve, "Wavelet", "CHcurve", wavelet.Chcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavclCurve, "Wavelet", "WavclCurve", wavelet.wavclCurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.median, "Wavelet", "Median", wavelet.median, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.medianlev, "Wavelet", "Medianlev", wavelet.medianlev, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.linkedg, "Wavelet", "Linkedg", wavelet.linkedg, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.gamma, "Wavelet", "Residualgamma", wavelet.gamma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sky, "Wavelet", "HueRangeResidual", wavelet.sky, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hueskin2, "Wavelet", "HueRange", wavelet.hueskin2.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.contrast, "Wavelet", "Contrast", wavelet.contrast, keyFile); + +// Directional pyramid equalizer + saveToKeyfile(!pedited || pedited->dirpyrequalizer.enabled, "Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.gamutlab, "Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.cbdlMethod, "Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod, keyFile); + + for (int i = 0; i < 6; i++) { + std::stringstream ss; + ss << "Mult" << i; + + saveToKeyfile(!pedited || pedited->dirpyrequalizer.mult[i], "Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i], keyFile); + } + + saveToKeyfile(!pedited || pedited->dirpyrequalizer.threshold, "Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.skinprotect, "Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile); + +// HSV Equalizer + saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile); + saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); + saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); + +// Film simulation + saveToKeyfile(!pedited || pedited->filmSimulation.enabled, "Film Simulation", "Enabled", filmSimulation.enabled, keyFile); + saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile); + saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile); + + saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.bcurve, "RGB Curves", "bCurve", rgbCurves.bcurve, keyFile); + +// Color toning + saveToKeyfile(!pedited || pedited->colorToning.enabled, "ColorToning", "Enabled", colorToning.enabled, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.method, "ColorToning", "Method", colorToning.method, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.lumamode, "ColorToning", "Lumamode", colorToning.lumamode, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.twocolor, "ColorToning", "Twocolor", colorToning.twocolor, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redlow, "ColorToning", "Redlow", colorToning.redlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenlow, "ColorToning", "Greenlow", colorToning.greenlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluelow, "ColorToning", "Bluelow", colorToning.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.satlow, "ColorToning", "Satlow", colorToning.satlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.balance, "ColorToning", "Balance", colorToning.balance, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.sathigh, "ColorToning", "Sathigh", colorToning.sathigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redmed, "ColorToning", "Redmed", colorToning.redmed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenmed, "ColorToning", "Greenmed", colorToning.greenmed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluemed, "ColorToning", "Bluemed", colorToning.bluemed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redhigh, "ColorToning", "Redhigh", colorToning.redhigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenhigh, "ColorToning", "Greenhigh", colorToning.greenhigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluehigh, "ColorToning", "Bluehigh", colorToning.bluehigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.autosat, "ColorToning", "Autosat", colorToning.autosat, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.opacityCurve, "ColorToning", "OpacityCurve", colorToning.opacityCurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.colorCurve, "ColorToning", "ColorCurve", colorToning.colorCurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.satprotectionthreshold, "ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.saturatedopacity, "ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.strength, "ColorToning", "Strength", colorToning.strength, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.hlColSat, "ColorToning", "HighlightsColorSaturation", colorToning.hlColSat.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->colorToning.shadowsColSat, "ColorToning", "ShadowsColorSaturation", colorToning.shadowsColSat.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->colorToning.clcurve, "ColorToning", "ClCurve", colorToning.clcurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.cl2curve, "ColorToning", "Cl2Curve", colorToning.cl2curve, keyFile); + +// Raw + saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame), keyFile); + saveToKeyfile(!pedited || pedited->raw.df_autoselect, "RAW", "DarkFrameAuto", raw.df_autoselect, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_file, "RAW", "FlatFieldFile", relativePathIfInside (fname, fnameAbsolute, raw.ff_file), keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_AutoSelect, "RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_BlurRadius, "RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_BlurType, "RAW", "FlatFieldBlurType", raw.ff_BlurType, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_AutoClipControl, "RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_clipControl, "RAW", "FlatFieldClipControl", raw.ff_clipControl, keyFile); + saveToKeyfile(!pedited || pedited->raw.ca_autocorrect, "RAW", "CA", raw.ca_autocorrect, keyFile); + saveToKeyfile(!pedited || pedited->raw.cared, "RAW", "CARed", raw.cared, keyFile); + saveToKeyfile(!pedited || pedited->raw.cablue, "RAW", "CABlue", raw.cablue, keyFile); + saveToKeyfile(!pedited || pedited->raw.hotPixelFilter, "RAW", "HotPixelFilter", raw.hotPixelFilter, keyFile); + saveToKeyfile(!pedited || pedited->raw.deadPixelFilter, "RAW", "DeadPixelFilter", raw.deadPixelFilter, keyFile); + saveToKeyfile(!pedited || pedited->raw.hotdeadpix_thresh, "RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.method, "RAW Bayer", "Method", raw.bayersensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.imageNum, "RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.ccSteps, "RAW Bayer", "CcSteps", raw.bayersensor.ccSteps, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack0, "RAW Bayer", "PreBlack0", raw.bayersensor.black0, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack1, "RAW Bayer", "PreBlack1", raw.bayersensor.black1, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack2, "RAW Bayer", "PreBlack2", raw.bayersensor.black2, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack3, "RAW Bayer", "PreBlack3", raw.bayersensor.black3, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exTwoGreen, "RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.linenoise, "RAW Bayer", "LineDenoise", raw.bayersensor.linenoise, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.greenEq, "RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbIterations, "RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbEnhance, "RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.lmmseIterations, "RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotion, "RAW Bayer", "PixelShiftMotion", raw.bayersensor.pixelShiftMotion, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrection, "RAW Bayer", "PixelShiftMotionCorrection", toUnderlying(raw.bayersensor.pixelShiftMotionCorrection), keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod, "RAW Bayer", "PixelShiftMotionCorrectionMethod", toUnderlying(raw.bayersensor.pixelShiftMotionCorrectionMethod), keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorGreen, "RAW Bayer", "pixelShiftStddevFactorGreen", raw.bayersensor.pixelShiftStddevFactorGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorRed, "RAW Bayer", "pixelShiftStddevFactorRed", raw.bayersensor.pixelShiftStddevFactorRed, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorBlue, "RAW Bayer", "pixelShiftStddevFactorBlue", raw.bayersensor.pixelShiftStddevFactorBlue, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEperIso, "RAW Bayer", "PixelShiftEperIso", raw.bayersensor.pixelShiftEperIso, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNreadIso, "RAW Bayer", "PixelShiftNreadIso", raw.bayersensor.pixelShiftNreadIso, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftPrnu, "RAW Bayer", "PixelShiftPrnu", raw.bayersensor.pixelShiftPrnu, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSigma, "RAW Bayer", "PixelShiftSigma", raw.bayersensor.pixelShiftSigma, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSum, "RAW Bayer", "PixelShiftSum", raw.bayersensor.pixelShiftSum, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftRedBlueWeight, "RAW Bayer", "PixelShiftRedBlueWeight", raw.bayersensor.pixelShiftRedBlueWeight, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotion, "RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelShiftShowMotion, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly, "RAW Bayer", "PixelShiftShowMotionMaskOnly", raw.bayersensor.pixelShiftShowMotionMaskOnly, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftAutomatic, "RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenHorizontal, "RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenVertical, "RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftHoleFill, "RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian, "RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian3, "RAW Bayer", "pixelShiftMedian3", raw.bayersensor.pixelShiftMedian3, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftGreen, "RAW Bayer", "pixelShiftGreen", raw.bayersensor.pixelShiftGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftBlur, "RAW Bayer", "pixelShiftBlur", raw.bayersensor.pixelShiftBlur, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSmooth, "RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftExp0, "RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftLmmse, "RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBright, "RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel, "RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross, "RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross2, "RAW Bayer", "pixelShiftNonGreenCross2", raw.bayersensor.pixelShiftNonGreenCross2, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenAmaze, "RAW Bayer", "pixelShiftNonGreenAmaze", raw.bayersensor.pixelShiftNonGreenAmaze, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.method, "RAW X-Trans", "Method", raw.xtranssensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.ccSteps, "RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackRed, "RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackGreen, "RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackBlue, "RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue, keyFile); + +// Raw exposition + saveToKeyfile(!pedited || pedited->raw.exPos, "RAW", "PreExposure", raw.expos, keyFile); + saveToKeyfile(!pedited || pedited->raw.exPreser, "RAW", "PrePreserv", raw.preser, keyFile); + +// 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); + } + } + +// 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&) {} + + if (sPParams.empty ()) { + return 1; + } + + int error1, error2; + error1 = write (fname, sPParams); + + if (!fname2.empty ()) { + + error2 = write (fname2, sPParams); + // If at least one file has been saved, it's a success + return error1 & error2; + } else { + return error1; + } +} + +int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) +{ + setlocale (LC_NUMERIC, "C"); // to set decimal point to "." + + if (fname.empty()) { + return 1; + } + + Glib::KeyFile keyFile; + + try { + if (pedited) { + pedited->set (false); + } + + if (!Glib::file_test(fname, Glib::FILE_TEST_EXISTS) || + !keyFile.load_from_file(fname)) { + return 1; + } + + ppVersion = PPVERSION; + appVersion = RTVERSION; + + if (keyFile.has_group ("Version")) { + if (keyFile.has_key ("Version", "AppVersion")) { + appVersion = keyFile.get_string ("Version", "AppVersion"); + } + + if (keyFile.has_key ("Version", "Version")) { + ppVersion = keyFile.get_integer ("Version", "Version"); + } + } + + if (keyFile.has_group ("General")) { + assignFromKeyfile(keyFile, "General", "Rank", pedited, rank, pedited->general.rank); + assignFromKeyfile(keyFile, "General", "ColorLabel", pedited, colorlabel, pedited->general.colorlabel); + assignFromKeyfile(keyFile, "General", "InTrash", pedited, inTrash, pedited->general.intrash); + } + + if (keyFile.has_group ("Exposure")) { + if (ppVersion < PPVERSION_AEXP) { + toneCurve.autoexp = false; // prevent execution of autoexp when opening file created with earlier verions of autoexp algorithm + } else { + assignFromKeyfile(keyFile, "Exposure", "Auto", pedited, toneCurve.autoexp, pedited->toneCurve.autoexp); + } + assignFromKeyfile(keyFile, "Exposure", "Clip", pedited, toneCurve.clip, pedited->toneCurve.clip); + assignFromKeyfile(keyFile, "Exposure", "Compensation", pedited, toneCurve.expcomp, pedited->toneCurve.expcomp); + assignFromKeyfile(keyFile, "Exposure", "Brightness", pedited, toneCurve.brightness, pedited->toneCurve.brightness); + assignFromKeyfile(keyFile, "Exposure", "Contrast", pedited, toneCurve.contrast, pedited->toneCurve.contrast); + assignFromKeyfile(keyFile, "Exposure", "Saturation", pedited, toneCurve.saturation, pedited->toneCurve.saturation); + assignFromKeyfile(keyFile, "Exposure", "Black", pedited, toneCurve.black, pedited->toneCurve.black); + assignFromKeyfile(keyFile, "Exposure", "HighlightCompr", pedited, toneCurve.hlcompr, pedited->toneCurve.hlcompr); + assignFromKeyfile(keyFile, "Exposure", "HighlightComprThreshold", pedited, toneCurve.hlcomprthresh, pedited->toneCurve.hlcomprthresh); + assignFromKeyfile(keyFile, "Exposure", "ShadowCompr", pedited, toneCurve.shcompr, pedited->toneCurve.shcompr); + if (toneCurve.shcompr > 100) { + toneCurve.shcompr = 100; // older pp3 files can have values above 100. + } + + const std::map tc_mapping = { + {"Standard", ToneCurveParams::TcMode::STD}, + {"FilmLike", ToneCurveParams::TcMode::FILMLIKE}, + {"SatAndValueBlending", ToneCurveParams::TcMode::SATANDVALBLENDING}, + {"WeightedStd", ToneCurveParams::TcMode::WEIGHTEDSTD}, + {"Luminance", ToneCurveParams::TcMode::LUMINANCE}, + {"Perceptual", ToneCurveParams::TcMode::PERCEPTUAL} + }; + + assignFromKeyfile(keyFile, "Exposure", "CurveMode", pedited, tc_mapping, toneCurve.curveMode, pedited->toneCurve.curveMode); + assignFromKeyfile(keyFile, "Exposure", "CurveMode2", pedited, tc_mapping, toneCurve.curveMode2, pedited->toneCurve.curveMode2); + + if (ppVersion > 200) { + assignFromKeyfile(keyFile, "Exposure", "Curve", pedited, toneCurve.curve, pedited->toneCurve.curve); + assignFromKeyfile(keyFile, "Exposure", "Curve2", pedited, toneCurve.curve2, pedited->toneCurve.curve2); + } + } + + if (keyFile.has_group ("HLRecovery")) { + assignFromKeyfile(keyFile, "HLRecovery", "Enabled", pedited, toneCurve.hrenabled, pedited->toneCurve.hrenabled); + assignFromKeyfile(keyFile, "HLRecovery", "Method", pedited, toneCurve.method, pedited->toneCurve.method); + } + + if (keyFile.has_group ("Channel Mixer")) { + if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { + const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); + const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); + const std::vector bmix = keyFile.get_integer_list ("Channel Mixer", "Blue"); + + if (rmix.size() == 3 && gmix.size() == 3 && bmix.size() == 3) { + memcpy (chmixer.red, rmix.data(), 3 * sizeof (int)); + memcpy (chmixer.green, gmix.data(), 3 * sizeof (int)); + memcpy (chmixer.blue, bmix.data(), 3 * sizeof (int)); + } + + if (pedited) { + pedited->chmixer.red[0] = pedited->chmixer.red[1] = pedited->chmixer.red[2] = true; + pedited->chmixer.green[0] = pedited->chmixer.green[1] = pedited->chmixer.green[2] = true; + pedited->chmixer.blue[0] = pedited->chmixer.blue[1] = pedited->chmixer.blue[2] = true; + } + } + } + + if (keyFile.has_group ("Black & White")) { + assignFromKeyfile(keyFile, "Black & White", "Enabled", pedited, blackwhite.enabled, pedited->blackwhite.enabled); + assignFromKeyfile(keyFile, "Black & White", "Method", pedited, blackwhite.method, pedited->blackwhite.method); + assignFromKeyfile(keyFile, "Black & White", "Auto", pedited, blackwhite.autoc, pedited->blackwhite.autoc); + assignFromKeyfile(keyFile, "Black & White", "ComplementaryColors", pedited, blackwhite.enabledcc, pedited->blackwhite.enabledcc); + assignFromKeyfile(keyFile, "Black & White", "MixerRed", pedited, blackwhite.mixerRed, pedited->blackwhite.mixerRed); + assignFromKeyfile(keyFile, "Black & White", "MixerOrange", pedited, blackwhite.mixerOrange, pedited->blackwhite.mixerOrange); + assignFromKeyfile(keyFile, "Black & White", "MixerYellow", pedited, blackwhite.mixerYellow, pedited->blackwhite.mixerYellow); + assignFromKeyfile(keyFile, "Black & White", "MixerGreen", pedited, blackwhite.mixerGreen, pedited->blackwhite.mixerGreen); + assignFromKeyfile(keyFile, "Black & White", "MixerCyan", pedited, blackwhite.mixerCyan, pedited->blackwhite.mixerCyan); + assignFromKeyfile(keyFile, "Black & White", "MixerBlue", pedited, blackwhite.mixerBlue, pedited->blackwhite.mixerBlue); + assignFromKeyfile(keyFile, "Black & White", "MixerMagenta", pedited, blackwhite.mixerMagenta, pedited->blackwhite.mixerMagenta); + assignFromKeyfile(keyFile, "Black & White", "MixerPurple", pedited, blackwhite.mixerPurple, pedited->blackwhite.mixerPurple); + assignFromKeyfile(keyFile, "Black & White", "GammaRed", pedited, blackwhite.gammaRed, pedited->blackwhite.gammaRed); + assignFromKeyfile(keyFile, "Black & White", "GammaGreen", pedited, blackwhite.gammaGreen, pedited->blackwhite.gammaGreen); + assignFromKeyfile(keyFile, "Black & White", "GammaBlue", pedited, blackwhite.gammaBlue, pedited->blackwhite.gammaBlue); + assignFromKeyfile(keyFile, "Black & White", "Filter", pedited, blackwhite.filter, pedited->blackwhite.filter); + assignFromKeyfile(keyFile, "Black & White", "Setting", pedited, blackwhite.setting, pedited->blackwhite.setting); + assignFromKeyfile(keyFile, "Black & White", "LuminanceCurve", pedited, blackwhite.luminanceCurve, pedited->blackwhite.luminanceCurve); + + assignFromKeyfile(keyFile, "Black & White", "BeforeCurve", pedited, blackwhite.beforeCurve, pedited->blackwhite.beforeCurve); + + assignFromKeyfile(keyFile, "Black & White", "Algorithm", pedited, blackwhite.algo, pedited->blackwhite.algo); + assignFromKeyfile( + keyFile, + "Black & White", + "BeforeCurveMode", + pedited, + { + {"Standard", BlackWhiteParams::TcMode::STD_BW}, + {"FilmLike", BlackWhiteParams::TcMode::FILMLIKE_BW}, + {"SatAndValueBlending", BlackWhiteParams::TcMode::SATANDVALBLENDING_BW}, + {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} + }, + blackwhite.beforeCurveMode, + pedited->blackwhite.beforeCurveMode + ); + + assignFromKeyfile(keyFile, "Black & White", "AfterCurve", pedited, blackwhite.afterCurve, pedited->blackwhite.afterCurve); + assignFromKeyfile( + keyFile, + "Black & White", + "AfterCurveMode", + pedited, + { + {"Standard", BlackWhiteParams::TcMode::STD_BW}, + {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} + }, + blackwhite.afterCurveMode, + pedited->blackwhite.afterCurveMode + ); + } + + if (keyFile.has_group ("Retinex")) { + assignFromKeyfile(keyFile, "Retinex", "Median", pedited, retinex.medianmap, pedited->retinex.medianmap); + assignFromKeyfile(keyFile, "Retinex", "RetinexMethod", pedited, retinex.retinexMethod, pedited->retinex.retinexMethod); + assignFromKeyfile(keyFile, "Retinex", "mapMethod", pedited, retinex.mapMethod, pedited->retinex.mapMethod); + assignFromKeyfile(keyFile, "Retinex", "viewMethod", pedited, retinex.viewMethod, pedited->retinex.viewMethod); + + assignFromKeyfile(keyFile, "Retinex", "Retinexcolorspace", pedited, retinex.retinexcolorspace, pedited->retinex.retinexcolorspace); + assignFromKeyfile(keyFile, "Retinex", "Gammaretinex", pedited, retinex.gammaretinex, pedited->retinex.gammaretinex); + assignFromKeyfile(keyFile, "Retinex", "Enabled", pedited, retinex.enabled, pedited->retinex.enabled); + assignFromKeyfile(keyFile, "Retinex", "Neigh", pedited, retinex.neigh, pedited->retinex.neigh); + assignFromKeyfile(keyFile, "Retinex", "Str", pedited, retinex.str, pedited->retinex.str); + assignFromKeyfile(keyFile, "Retinex", "Scal", pedited, retinex.scal, pedited->retinex.scal); + assignFromKeyfile(keyFile, "Retinex", "Iter", pedited, retinex.iter, pedited->retinex.iter); + assignFromKeyfile(keyFile, "Retinex", "Grad", pedited, retinex.grad, pedited->retinex.grad); + assignFromKeyfile(keyFile, "Retinex", "Grads", pedited, retinex.grads, pedited->retinex.grads); + assignFromKeyfile(keyFile, "Retinex", "Gam", pedited, retinex.gam, pedited->retinex.gam); + assignFromKeyfile(keyFile, "Retinex", "Slope", pedited, retinex.slope, pedited->retinex.slope); + assignFromKeyfile(keyFile, "Retinex", "Offs", pedited, retinex.offs, pedited->retinex.offs); + assignFromKeyfile(keyFile, "Retinex", "Vart", pedited, retinex.vart, pedited->retinex.vart); + assignFromKeyfile(keyFile, "Retinex", "Limd", pedited, retinex.limd, pedited->retinex.limd); + assignFromKeyfile(keyFile, "Retinex", "highl", pedited, retinex.highl, pedited->retinex.highl); + assignFromKeyfile(keyFile, "Retinex", "skal", pedited, retinex.skal, pedited->retinex.skal); + assignFromKeyfile(keyFile, "Retinex", "CDCurve", pedited, retinex.cdcurve, pedited->retinex.cdcurve); + + assignFromKeyfile(keyFile, "Retinex", "MAPCurve", pedited, retinex.mapcurve, pedited->retinex.mapcurve); + + assignFromKeyfile(keyFile, "Retinex", "CDHCurve", pedited, retinex.cdHcurve, pedited->retinex.cdHcurve); + + assignFromKeyfile(keyFile, "Retinex", "LHCurve", pedited, retinex.lhcurve, pedited->retinex.lhcurve); + + assignFromKeyfile(keyFile, "Retinex", "Highlights", pedited, retinex.highlights, pedited->retinex.highlights); + assignFromKeyfile(keyFile, "Retinex", "HighlightTonalWidth", pedited, retinex.htonalwidth, pedited->retinex.htonalwidth); + assignFromKeyfile(keyFile, "Retinex", "Shadows", pedited, retinex.shadows, pedited->retinex.shadows); + assignFromKeyfile(keyFile, "Retinex", "ShadowTonalWidth", pedited, retinex.stonalwidth, pedited->retinex.stonalwidth); + + assignFromKeyfile(keyFile, "Retinex", "Radius", pedited, retinex.radius, pedited->retinex.radius); + + assignFromKeyfile(keyFile, "Retinex", "TransmissionCurve", pedited, retinex.transmissionCurve, pedited->retinex.transmissionCurve); + + assignFromKeyfile(keyFile, "Retinex", "GainTransmissionCurve", pedited, retinex.gaintransmissionCurve, pedited->retinex.gaintransmissionCurve); + } + + if (keyFile.has_group ("Luminance Curve")) { + assignFromKeyfile(keyFile, "Luminance Curve", "Brightness", pedited, labCurve.brightness, pedited->labCurve.brightness); + assignFromKeyfile(keyFile, "Luminance Curve", "Contrast", pedited, labCurve.contrast, pedited->labCurve.contrast); + + if (ppVersion < 303) { + // transform Saturation into Chromaticity + // if Saturation == 0, should we set BWToning on? + assignFromKeyfile(keyFile, "Luminance Curve", "Saturation", pedited, labCurve.chromaticity, pedited->labCurve.chromaticity); + // transform AvoidColorClipping into AvoidColorShift + assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorClipping", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); + } else { + 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; + } + } + + assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorShift", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); + assignFromKeyfile(keyFile, "Luminance Curve", "RedAndSkinTonesProtection", pedited, labCurve.rstprotection, pedited->labCurve.rstprotection); + } + + assignFromKeyfile(keyFile, "Luminance Curve", "LCredsk", pedited, labCurve.lcredsk, pedited->labCurve.lcredsk); + + if (ppVersion < 314) { + // Backward compatibility: If BWtoning is true, Chromaticity has to be set to -100, which will produce the same effect + // and will enable the b&w toning mode ('a' & 'b' curves) + if (keyFile.has_key ("Luminance Curve", "BWtoning")) { + if ( keyFile.get_boolean ("Luminance Curve", "BWtoning")) { + labCurve.chromaticity = -100; + + if (pedited) { + pedited->labCurve.chromaticity = true; + } + } + } + } + + assignFromKeyfile(keyFile, "Luminance Curve", "LCurve", pedited, labCurve.lcurve, pedited->labCurve.lcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "aCurve", pedited, labCurve.acurve, pedited->labCurve.acurve); + assignFromKeyfile(keyFile, "Luminance Curve", "bCurve", pedited, labCurve.bcurve, pedited->labCurve.bcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "ccCurve", pedited, labCurve.cccurve, pedited->labCurve.cccurve); + assignFromKeyfile(keyFile, "Luminance Curve", "chCurve", pedited, labCurve.chcurve, pedited->labCurve.chcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "lhCurve", pedited, labCurve.lhcurve, pedited->labCurve.lhcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "hhCurve", pedited, labCurve.hhcurve, pedited->labCurve.hhcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "LcCurve", pedited, labCurve.lccurve, pedited->labCurve.lccurve); + assignFromKeyfile(keyFile, "Luminance Curve", "ClCurve", pedited, labCurve.clcurve, pedited->labCurve.clcurve); + } + + if (keyFile.has_group ("Sharpening")) { + assignFromKeyfile(keyFile, "Sharpening", "Enabled", pedited, sharpening.enabled, pedited->sharpening.enabled); + assignFromKeyfile(keyFile, "Sharpening", "Radius", pedited, sharpening.radius, pedited->sharpening.radius); + assignFromKeyfile(keyFile, "Sharpening", "Amount", pedited, sharpening.amount, pedited->sharpening.amount); + + if (keyFile.has_key ("Sharpening", "Threshold")) { + if (ppVersion < 302) { + int thresh = min (keyFile.get_integer ("Sharpening", "Threshold"), 2000); + sharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization + } else { + const std::vector thresh = keyFile.get_integer_list ("Sharpening", "Threshold"); + + if (thresh.size() >= 4) { + sharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); + } + } + + if (pedited) { + pedited->sharpening.threshold = true; + } + } + + assignFromKeyfile(keyFile, "Sharpening", "OnlyEdges", pedited, sharpening.edgesonly, pedited->sharpening.edgesonly); + assignFromKeyfile(keyFile, "Sharpening", "EdgedetectionRadius", pedited, sharpening.edges_radius, pedited->sharpening.edges_radius); + assignFromKeyfile(keyFile, "Sharpening", "EdgeTolerance", pedited, sharpening.edges_tolerance, pedited->sharpening.edges_tolerance); + assignFromKeyfile(keyFile, "Sharpening", "HalocontrolEnabled", pedited, sharpening.halocontrol, pedited->sharpening.halocontrol); + assignFromKeyfile(keyFile, "Sharpening", "HalocontrolAmount", pedited, sharpening.halocontrol_amount, pedited->sharpening.halocontrol_amount); + assignFromKeyfile(keyFile, "Sharpening", "Method", pedited, sharpening.method, pedited->sharpening.method); + assignFromKeyfile(keyFile, "Sharpening", "DeconvRadius", pedited, sharpening.deconvradius, pedited->sharpening.deconvradius); + assignFromKeyfile(keyFile, "Sharpening", "DeconvAmount", pedited, sharpening.deconvamount, pedited->sharpening.deconvamount); + assignFromKeyfile(keyFile, "Sharpening", "DeconvDamping", pedited, sharpening.deconvdamping, pedited->sharpening.deconvdamping); + assignFromKeyfile(keyFile, "Sharpening", "DeconvIterations", pedited, sharpening.deconviter, pedited->sharpening.deconviter); + } + + if (keyFile.has_group ("SharpenEdge")) { + assignFromKeyfile(keyFile, "SharpenEdge", "Enabled", pedited, sharpenEdge.enabled, pedited->sharpenEdge.enabled); + assignFromKeyfile(keyFile, "SharpenEdge", "Passes", pedited, sharpenEdge.passes, pedited->sharpenEdge.passes); + assignFromKeyfile(keyFile, "SharpenEdge", "Strength", pedited, sharpenEdge.amount, pedited->sharpenEdge.amount); + assignFromKeyfile(keyFile, "SharpenEdge", "ThreeChannels", pedited, sharpenEdge.threechannels, pedited->sharpenEdge.threechannels); + } + + if (keyFile.has_group ("SharpenMicro")) { + assignFromKeyfile(keyFile, "SharpenMicro", "Enabled", pedited, sharpenMicro.enabled, pedited->sharpenMicro.enabled); + assignFromKeyfile(keyFile, "SharpenMicro", "Matrix", pedited, sharpenMicro.matrix, pedited->sharpenMicro.matrix); + assignFromKeyfile(keyFile, "SharpenMicro", "Strength", pedited, sharpenMicro.amount, pedited->sharpenMicro.amount); + assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, sharpenMicro.uniformity, pedited->sharpenMicro.uniformity); + } + + if (keyFile.has_group ("Vibrance")) { + assignFromKeyfile(keyFile, "Vibrance", "Enabled", pedited, vibrance.enabled, pedited->vibrance.enabled); + assignFromKeyfile(keyFile, "Vibrance", "Pastels", pedited, vibrance.pastels, pedited->vibrance.pastels); + assignFromKeyfile(keyFile, "Vibrance", "Saturated", pedited, vibrance.saturated, pedited->vibrance.saturated); + + if (keyFile.has_key ("Vibrance", "PSThreshold")) { + if (ppVersion < 302) { + int thresh = keyFile.get_integer ("Vibrance", "PSThreshold"); + vibrance.psthreshold.setValues (thresh, thresh); + } else { + const std::vector thresh = keyFile.get_integer_list ("Vibrance", "PSThreshold"); + + if (thresh.size() >= 2 ) { + vibrance.psthreshold.setValues (thresh[0], thresh[1]); + } + } + + if (pedited) { + pedited->vibrance.psthreshold = true; + } + } + + assignFromKeyfile(keyFile, "Vibrance", "ProtectSkins", pedited, vibrance.protectskins, pedited->vibrance.protectskins); + assignFromKeyfile(keyFile, "Vibrance", "AvoidColorShift", pedited, vibrance.avoidcolorshift, pedited->vibrance.avoidcolorshift); + assignFromKeyfile(keyFile, "Vibrance", "PastSatTog", pedited, vibrance.pastsattog, pedited->vibrance.pastsattog); + assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); + } + + if (keyFile.has_group ("White Balance")) { + assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); + assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); + assignFromKeyfile(keyFile, "White Balance", "Equal", pedited, wb.equal, pedited->wb.equal); + assignFromKeyfile(keyFile, "White Balance", "TemperatureBias", pedited, wb.tempBias, pedited->wb.tempBias); + } + + if (keyFile.has_group ("Defringing")) { + assignFromKeyfile(keyFile, "Defringing", "Enabled", pedited, defringe.enabled, pedited->defringe.enabled); + assignFromKeyfile(keyFile, "Defringing", "Radius", pedited, defringe.radius, pedited->defringe.radius); + + if (keyFile.has_key ("Defringing", "Threshold")) { + defringe.threshold = (float)keyFile.get_integer ("Defringing", "Threshold"); + + if (pedited) { + pedited->defringe.threshold = true; + } + } + + if (ppVersion < 310) { + defringe.threshold = sqrt (defringe.threshold * 33.f / 5.f); + } + + assignFromKeyfile(keyFile, "Defringing", "HueCurve", pedited, defringe.huecurve, pedited->defringe.huecurve); + } + + if (keyFile.has_group ("Color appearance")) { + assignFromKeyfile(keyFile, "Color appearance", "Enabled", pedited, colorappearance.enabled, pedited->colorappearance.enabled); + assignFromKeyfile(keyFile, "Color appearance", "Degree", pedited, colorappearance.degree, pedited->colorappearance.degree); + assignFromKeyfile(keyFile, "Color appearance", "AutoDegree", pedited, colorappearance.autodegree, pedited->colorappearance.autodegree); + assignFromKeyfile(keyFile, "Color appearance", "Degreeout", pedited, colorappearance.degreeout, pedited->colorappearance.degreeout); + + assignFromKeyfile(keyFile, "Color appearance", "AutoDegreeout", pedited, colorappearance.autodegreeout, pedited->colorappearance.autodegreeout); + + assignFromKeyfile(keyFile, "Color appearance", "Surround", pedited, colorappearance.surround, pedited->colorappearance.surround); + assignFromKeyfile(keyFile, "Color appearance", "Surrsrc", pedited, colorappearance.surrsrc, pedited->colorappearance.surrsrc); + assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); + assignFromKeyfile(keyFile, "Color appearance", "Badpixsl", pedited, colorappearance.badpixsl, pedited->colorappearance.badpixsl); + assignFromKeyfile(keyFile, "Color appearance", "Model", pedited, colorappearance.wbmodel, pedited->colorappearance.wbmodel); + assignFromKeyfile(keyFile, "Color appearance", "Algorithm", pedited, colorappearance.algo, pedited->colorappearance.algo); + assignFromKeyfile(keyFile, "Color appearance", "J-Light", pedited, colorappearance.jlight, pedited->colorappearance.jlight); + assignFromKeyfile(keyFile, "Color appearance", "Q-Bright", pedited, colorappearance.qbright, pedited->colorappearance.qbright); + assignFromKeyfile(keyFile, "Color appearance", "C-Chroma", pedited, colorappearance.chroma, pedited->colorappearance.chroma); + assignFromKeyfile(keyFile, "Color appearance", "S-Chroma", pedited, colorappearance.schroma, pedited->colorappearance.schroma); + assignFromKeyfile(keyFile, "Color appearance", "M-Chroma", pedited, colorappearance.mchroma, pedited->colorappearance.mchroma); + assignFromKeyfile(keyFile, "Color appearance", "RSTProtection", pedited, colorappearance.rstprotection, pedited->colorappearance.rstprotection); + assignFromKeyfile(keyFile, "Color appearance", "J-Contrast", pedited, colorappearance.contrast, pedited->colorappearance.contrast); + assignFromKeyfile(keyFile, "Color appearance", "Q-Contrast", pedited, colorappearance.qcontrast, pedited->colorappearance.qcontrast); + assignFromKeyfile(keyFile, "Color appearance", "H-Hue", pedited, colorappearance.colorh, pedited->colorappearance.colorh); + assignFromKeyfile(keyFile, "Color appearance", "AdaptScene", pedited, colorappearance.adapscen, pedited->colorappearance.adapscen); + assignFromKeyfile(keyFile, "Color appearance", "AutoAdapscen", pedited, colorappearance.autoadapscen, pedited->colorappearance.autoadapscen); + assignFromKeyfile(keyFile, "Color appearance", "YbScene", pedited, colorappearance.ybscen, pedited->colorappearance.ybscen); + assignFromKeyfile(keyFile, "Color appearance", "Autoybscen", pedited, colorappearance.autoybscen, pedited->colorappearance.autoybscen); + assignFromKeyfile(keyFile, "Color appearance", "SurrSource", pedited, colorappearance.surrsource, pedited->colorappearance.surrsource); + assignFromKeyfile(keyFile, "Color appearance", "Gamut", pedited, colorappearance.gamut, pedited->colorappearance.gamut); + assignFromKeyfile(keyFile, "Color appearance", "Tempout", pedited, colorappearance.tempout, pedited->colorappearance.tempout); + assignFromKeyfile(keyFile, "Color appearance", "Greenout", pedited, colorappearance.greenout, pedited->colorappearance.greenout); + assignFromKeyfile(keyFile, "Color appearance", "Tempsc", pedited, colorappearance.tempsc, pedited->colorappearance.tempsc); + assignFromKeyfile(keyFile, "Color appearance", "Greensc", pedited, colorappearance.greensc, pedited->colorappearance.greensc); + assignFromKeyfile(keyFile, "Color appearance", "Ybout", pedited, colorappearance.ybout, pedited->colorappearance.ybout); + assignFromKeyfile(keyFile, "Color appearance", "Datacie", pedited, colorappearance.datacie, pedited->colorappearance.datacie); + assignFromKeyfile(keyFile, "Color appearance", "Tonecie", pedited, colorappearance.tonecie, pedited->colorappearance.tonecie); + + const std::map tc_mapping = { + {"Lightness", ColorAppearanceParams::TcMode::LIGHT}, + {"Brightness", ColorAppearanceParams::TcMode::BRIGHT} + }; + assignFromKeyfile(keyFile, "Color appearance", "CurveMode", pedited, tc_mapping, colorappearance.curveMode, pedited->colorappearance.curveMode); + assignFromKeyfile(keyFile, "Color appearance", "CurveMode2", pedited, tc_mapping, colorappearance.curveMode2, pedited->colorappearance.curveMode2); + + assignFromKeyfile( + keyFile, + "Color appearance", + "CurveMode3", + pedited, + { + {"Chroma", ColorAppearanceParams::CtcMode::CHROMA}, + {"Saturation", ColorAppearanceParams::CtcMode::SATUR}, + {"Colorfullness", ColorAppearanceParams::CtcMode::COLORF} + }, + colorappearance.curveMode3, + pedited->colorappearance.curveMode3 + ); + + if (ppVersion > 200) { + assignFromKeyfile(keyFile, "Color appearance", "Curve", pedited, colorappearance.curve, pedited->colorappearance.curve); + assignFromKeyfile(keyFile, "Color appearance", "Curve2", pedited, colorappearance.curve2, pedited->colorappearance.curve2); + assignFromKeyfile(keyFile, "Color appearance", "Curve3", pedited, colorappearance.curve3, pedited->colorappearance.curve3); + } + + } + + if (keyFile.has_group ("Impulse Denoising")) { + assignFromKeyfile(keyFile, "Impulse Denoising", "Enabled", pedited, impulseDenoise.enabled, pedited->impulseDenoise.enabled); + assignFromKeyfile(keyFile, "Impulse Denoising", "Threshold", pedited, impulseDenoise.thresh, pedited->impulseDenoise.thresh); + } + + if (keyFile.has_group ("Directional Pyramid Denoising")) {//TODO: No longer an accurate description for FT denoise + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enabled", pedited, dirpyrDenoise.enabled, pedited->dirpyrDenoise.enabled); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enhance", pedited, dirpyrDenoise.enhance, pedited->dirpyrDenoise.enhance); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Median", pedited, dirpyrDenoise.median, pedited->dirpyrDenoise.median); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Luma", pedited, dirpyrDenoise.luma, pedited->dirpyrDenoise.luma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Ldetail", pedited, dirpyrDenoise.Ldetail, pedited->dirpyrDenoise.Ldetail); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Chroma", pedited, dirpyrDenoise.chroma, pedited->dirpyrDenoise.chroma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Method", pedited, dirpyrDenoise.dmethod, pedited->dirpyrDenoise.dmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LMethod", pedited, dirpyrDenoise.Lmethod, pedited->dirpyrDenoise.Lmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CMethod", pedited, dirpyrDenoise.Cmethod, pedited->dirpyrDenoise.Cmethod); + + if (dirpyrDenoise.Cmethod == "PRE") { + dirpyrDenoise.Cmethod = "MAN"; // Never load 'auto chroma preview mode' from pp3 + } + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "C2Method", pedited, dirpyrDenoise.C2method, pedited->dirpyrDenoise.C2method); + if (dirpyrDenoise.C2method == "PREV") { + dirpyrDenoise.C2method = "MANU"; + } + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "SMethod", pedited, dirpyrDenoise.smethod, pedited->dirpyrDenoise.smethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MedMethod", pedited, dirpyrDenoise.medmethod, pedited->dirpyrDenoise.medmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MethodMed", pedited, dirpyrDenoise.methodmed, pedited->dirpyrDenoise.methodmed); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "RGBMethod", pedited, dirpyrDenoise.rgbmethod, pedited->dirpyrDenoise.rgbmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LCurve", pedited, dirpyrDenoise.lcurve, pedited->dirpyrDenoise.lcurve); + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CCCurve", pedited, dirpyrDenoise.cccurve, pedited->dirpyrDenoise.cccurve); + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Redchro", pedited, dirpyrDenoise.redchro, pedited->dirpyrDenoise.redchro); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Bluechro", pedited, dirpyrDenoise.bluechro, pedited->dirpyrDenoise.bluechro); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Gamma", pedited, dirpyrDenoise.gamma, pedited->dirpyrDenoise.gamma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Passes", pedited, dirpyrDenoise.passes, pedited->dirpyrDenoise.passes); + } + + if (keyFile.has_group ("EPD")) { + assignFromKeyfile(keyFile, "EPD", "Enabled", pedited, epd.enabled, pedited->epd.enabled); + assignFromKeyfile(keyFile, "EPD", "Strength", pedited, epd.strength, pedited->epd.strength); + assignFromKeyfile(keyFile, "EPD", "Gamma", pedited, epd.gamma, pedited->epd.gamma); + assignFromKeyfile(keyFile, "EPD", "EdgeStopping", pedited, epd.edgeStopping, pedited->epd.edgeStopping); + assignFromKeyfile(keyFile, "EPD", "Scale", pedited, epd.scale, pedited->epd.scale); + assignFromKeyfile(keyFile, "EPD", "ReweightingIterates", pedited, epd.reweightingIterates, pedited->epd.reweightingIterates); + } + + if (keyFile.has_group ("FattalToneMapping")) { + assignFromKeyfile(keyFile, "FattalToneMapping", "Enabled", pedited, fattal.enabled, pedited->fattal.enabled); + assignFromKeyfile(keyFile, "FattalToneMapping", "Threshold", pedited, fattal.threshold, pedited->fattal.threshold); + assignFromKeyfile(keyFile, "FattalToneMapping", "Amount", pedited, fattal.amount, pedited->fattal.amount); + } + + if (keyFile.has_group ("Shadows & Highlights")) { + assignFromKeyfile(keyFile, "Shadows & Highlights", "Enabled", pedited, sh.enabled, pedited->sh.enabled); + assignFromKeyfile(keyFile, "Shadows & Highlights", "HighQuality", pedited, sh.hq, pedited->sh.hq); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Highlights", pedited, sh.highlights, pedited->sh.highlights); + assignFromKeyfile(keyFile, "Shadows & Highlights", "HighlightTonalWidth", pedited, sh.htonalwidth, pedited->sh.htonalwidth); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows); + assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth); + assignFromKeyfile(keyFile, "Shadows & Highlights", "LocalContrast", pedited, sh.localcontrast, pedited->sh.localcontrast); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius); + } + + if (keyFile.has_group ("Crop")) { + assignFromKeyfile(keyFile, "Crop", "Enabled", pedited, crop.enabled, pedited->crop.enabled); + assignFromKeyfile(keyFile, "Crop", "X", pedited, crop.x, pedited->crop.x); + assignFromKeyfile(keyFile, "Crop", "Y", pedited, crop.y, pedited->crop.y); + + if (keyFile.has_key ("Crop", "W")) { + crop.w = std::max (keyFile.get_integer ("Crop", "W"), 1); + + if (pedited) { + pedited->crop.w = true; + } + } + + if (keyFile.has_key ("Crop", "H")) { + crop.h = std::max (keyFile.get_integer ("Crop", "H"), 1); + + if (pedited) { + pedited->crop.h = true; + } + } + + assignFromKeyfile(keyFile, "Crop", "FixedRatio", pedited, crop.fixratio, pedited->crop.fixratio); + + if (assignFromKeyfile(keyFile, "Crop", "Ratio", pedited, crop.ratio, pedited->crop.ratio)) { + //backwards compatibility for crop.ratio + if (crop.ratio == "DIN") { + crop.ratio = "1.414 - DIN EN ISO 216"; + } + + if (crop.ratio == "8.5:11") { + crop.ratio = "8.5:11 - US Letter"; + } + + if (crop.ratio == "11:17") { + crop.ratio = "11:17 - Tabloid"; + } + } + assignFromKeyfile(keyFile, "Crop", "Orientation", pedited, crop.orientation, pedited->crop.orientation); + assignFromKeyfile(keyFile, "Crop", "Guide", pedited, crop.guide, pedited->crop.guide); + } + + if (keyFile.has_group ("Coarse Transformation")) { + assignFromKeyfile(keyFile, "Coarse Transformation", "Rotate", pedited, coarse.rotate, pedited->coarse.rotate); + assignFromKeyfile(keyFile, "Coarse Transformation", "HorizontalFlip", pedited, coarse.hflip, pedited->coarse.hflip); + assignFromKeyfile(keyFile, "Coarse Transformation", "VerticalFlip", pedited, coarse.vflip, pedited->coarse.vflip); + } + + if (keyFile.has_group ("Rotation")) { + assignFromKeyfile(keyFile, "Rotation", "Degree", pedited, rotate.degree, pedited->rotate.degree); + } + + if (keyFile.has_group ("Common Properties for Transformations")) { + assignFromKeyfile(keyFile, "Common Properties for Transformations", "AutoFill", pedited, commonTrans.autofill, pedited->commonTrans.autofill); + } + + if (keyFile.has_group ("Distortion")) { + assignFromKeyfile(keyFile, "Distortion", "Amount", pedited, distortion.amount, pedited->distortion.amount); + } + + if (keyFile.has_group ("LensProfile")) { + if (keyFile.has_key ("LensProfile", "LcMode")) { + lensProf.lcMode = lensProf.getMethodNumber (keyFile.get_string ("LensProfile", "LcMode")); + + if (pedited) { + pedited->lensProf.lcMode = true; + } + } + + if (keyFile.has_key ("LensProfile", "LCPFile")) { + lensProf.lcpFile = expandRelativePath (fname, "", keyFile.get_string ("LensProfile", "LCPFile")); + + if (pedited) { + pedited->lensProf.lcpFile = true; + } + + if (ppVersion < 327 && !lensProf.lcpFile.empty()) { + lensProf.lcMode = LensProfParams::LcMode::LCP; + } + } + + assignFromKeyfile(keyFile, "LensProfile", "UseDistortion", pedited, lensProf.useDist, pedited->lensProf.useDist); + assignFromKeyfile(keyFile, "LensProfile", "UseVignette", pedited, lensProf.useVign, pedited->lensProf.useVign); + assignFromKeyfile(keyFile, "LensProfile", "UseCA", pedited, lensProf.useCA, pedited->lensProf.useCA); + + if (keyFile.has_key("LensProfile", "LFCameraMake")) { + lensProf.lfCameraMake = keyFile.get_string("LensProfile", "LFCameraMake"); + if (pedited) { + pedited->lensProf.lfCameraMake = true; + } + } + + if (keyFile.has_key("LensProfile", "LFCameraModel")) { + lensProf.lfCameraModel = keyFile.get_string("LensProfile", "LFCameraModel"); + if (pedited) { + pedited->lensProf.lfCameraModel = true; + } + } + + if (keyFile.has_key("LensProfile", "LFLens")) { + lensProf.lfLens = keyFile.get_string("LensProfile", "LFLens"); + if (pedited) { + pedited->lensProf.lfLens = true; + } + } + } + + if (keyFile.has_group ("Perspective")) { + assignFromKeyfile(keyFile, "Perspective", "Horizontal", pedited, perspective.horizontal, pedited->perspective.horizontal); + assignFromKeyfile(keyFile, "Perspective", "Vertical", pedited, perspective.vertical, pedited->perspective.vertical); + } + + if (keyFile.has_group ("Gradient")) { + assignFromKeyfile(keyFile, "Gradient", "Enabled", pedited, gradient.enabled, pedited->gradient.enabled); + assignFromKeyfile(keyFile, "Gradient", "Degree", pedited, gradient.degree, pedited->gradient.degree); + assignFromKeyfile(keyFile, "Gradient", "Feather", pedited, gradient.feather, pedited->gradient.feather); + assignFromKeyfile(keyFile, "Gradient", "Strength", pedited, gradient.strength, pedited->gradient.strength); + assignFromKeyfile(keyFile, "Gradient", "CenterX", pedited, gradient.centerX, pedited->gradient.centerX); + assignFromKeyfile(keyFile, "Gradient", "CenterY", pedited, gradient.centerY, pedited->gradient.centerY); + } + + if (keyFile.has_group ("PCVignette")) { + assignFromKeyfile(keyFile, "PCVignette", "Enabled", pedited, pcvignette.enabled, pedited->pcvignette.enabled); + assignFromKeyfile(keyFile, "PCVignette", "Strength", pedited, pcvignette.strength, pedited->pcvignette.strength); + assignFromKeyfile(keyFile, "PCVignette", "Feather", pedited, pcvignette.feather, pedited->pcvignette.feather); + assignFromKeyfile(keyFile, "PCVignette", "Roundness", pedited, pcvignette.roundness, pedited->pcvignette.roundness); + } + + if (keyFile.has_group ("CACorrection")) { + assignFromKeyfile(keyFile, "CACorrection", "Red", pedited, cacorrection.red, pedited->cacorrection.red); + assignFromKeyfile(keyFile, "CACorrection", "Blue", pedited, cacorrection.blue, pedited->cacorrection.blue); + } + + if (keyFile.has_group ("Vignetting Correction")) { + assignFromKeyfile(keyFile, "Vignetting Correction", "Amount", pedited, vignetting.amount, pedited->vignetting.amount); + assignFromKeyfile(keyFile, "Vignetting Correction", "Radius", pedited, vignetting.radius, pedited->vignetting.radius); + assignFromKeyfile(keyFile, "Vignetting Correction", "Strength", pedited, vignetting.strength, pedited->vignetting.strength); + assignFromKeyfile(keyFile, "Vignetting Correction", "CenterX", pedited, vignetting.centerX, pedited->vignetting.centerX); + assignFromKeyfile(keyFile, "Vignetting Correction", "CenterY", pedited, vignetting.centerY, pedited->vignetting.centerY); + } + + if (keyFile.has_group ("Resize")) { + assignFromKeyfile(keyFile, "Resize", "Enabled", pedited, resize.enabled, pedited->resize.enabled); + assignFromKeyfile(keyFile, "Resize", "Scale", pedited, resize.scale, pedited->resize.scale); + assignFromKeyfile(keyFile, "Resize", "AppliesTo", pedited, resize.appliesTo, pedited->resize.appliesTo); + assignFromKeyfile(keyFile, "Resize", "Method", pedited, resize.method, pedited->resize.method); + assignFromKeyfile(keyFile, "Resize", "DataSpecified", pedited, resize.dataspec, pedited->resize.dataspec); + assignFromKeyfile(keyFile, "Resize", "Width", pedited, resize.width, pedited->resize.width); + assignFromKeyfile(keyFile, "Resize", "Height", pedited, resize.height, pedited->resize.height); + } + + if (keyFile.has_group ("PostResizeSharpening")) { + assignFromKeyfile(keyFile, "PostResizeSharpening", "Enabled", pedited, prsharpening.enabled, pedited->prsharpening.enabled); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Radius", pedited, prsharpening.radius, pedited->prsharpening.radius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Amount", pedited, prsharpening.amount, pedited->prsharpening.amount); + + if (keyFile.has_key ("PostResizeSharpening", "Threshold")) { + if (ppVersion < 302) { + int thresh = min (keyFile.get_integer ("PostResizeSharpening", "Threshold"), 2000); + prsharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization + } else { + const std::vector thresh = keyFile.get_integer_list ("PostResizeSharpening", "Threshold"); + + if (thresh.size() >= 4) { + prsharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); + } + } + + if (pedited) { + pedited->prsharpening.threshold = true; + } + } + + assignFromKeyfile(keyFile, "PostResizeSharpening", "OnlyEdges", pedited, prsharpening.edgesonly, pedited->prsharpening.edgesonly); + assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgedetectionRadius", pedited, prsharpening.edges_radius, pedited->prsharpening.edges_radius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgeTolerance", pedited, prsharpening.edges_tolerance, pedited->prsharpening.edges_tolerance); + assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolEnabled", pedited, prsharpening.halocontrol, pedited->prsharpening.halocontrol); + assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolAmount", pedited, prsharpening.halocontrol_amount, pedited->prsharpening.halocontrol_amount); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Method", pedited, prsharpening.method, pedited->prsharpening.method); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvRadius", pedited, prsharpening.deconvradius, pedited->prsharpening.deconvradius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvAmount", pedited, prsharpening.deconvamount, pedited->prsharpening.deconvamount); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvDamping", pedited, prsharpening.deconvdamping, pedited->prsharpening.deconvdamping); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvIterations", pedited, prsharpening.deconviter, pedited->prsharpening.deconviter); + } + + if (keyFile.has_group ("Color Management")) { + if (keyFile.has_key ("Color Management", "InputProfile")) { + icm.input = expandRelativePath (fname, "file:", keyFile.get_string ("Color Management", "InputProfile")); + + if (pedited) { + pedited->icm.input = true; + } + } + + assignFromKeyfile(keyFile, "Color Management", "ToneCurve", pedited, icm.toneCurve, pedited->icm.toneCurve); + assignFromKeyfile(keyFile, "Color Management", "ApplyLookTable", pedited, icm.applyLookTable, pedited->icm.applyLookTable); + assignFromKeyfile(keyFile, "Color Management", "ApplyBaselineExposureOffset", pedited, icm.applyBaselineExposureOffset, pedited->icm.applyBaselineExposureOffset); + assignFromKeyfile(keyFile, "Color Management", "ApplyHueSatMap", pedited, icm.applyHueSatMap, pedited->icm.applyHueSatMap); + assignFromKeyfile(keyFile, "Color Management", "DCPIlluminant", pedited, icm.dcpIlluminant, pedited->icm.dcpIlluminant); + assignFromKeyfile(keyFile, "Color Management", "WorkingProfile", pedited, icm.working, pedited->icm.working); + assignFromKeyfile(keyFile, "Color Management", "OutputProfile", pedited, icm.output, pedited->icm.output); + + if (keyFile.has_key ("Color Management", "OutputProfileIntent")) { + Glib::ustring intent = keyFile.get_string ("Color Management", "OutputProfileIntent"); + + if (intent == "Perceptual") { + icm.outputIntent = RI_PERCEPTUAL; + } else if (intent == "Relative") { + icm.outputIntent = RI_RELATIVE; + } else if (intent == "Saturation") { + icm.outputIntent = RI_SATURATION; + } else if (intent == "Absolute") { + icm.outputIntent = RI_ABSOLUTE; + } + + if (pedited) { + pedited->icm.outputIntent = true; + } + } + + assignFromKeyfile(keyFile, "Color Management", "OutputBPC", pedited, icm.outputBPC, pedited->icm.outputBPC); + assignFromKeyfile(keyFile, "Color Management", "Gammafree", pedited, icm.gamma, pedited->icm.gamma); + assignFromKeyfile(keyFile, "Color Management", "Freegamma", pedited, icm.freegamma, pedited->icm.freegamma); + assignFromKeyfile(keyFile, "Color Management", "GammaValue", pedited, icm.gampos, pedited->icm.gampos); + assignFromKeyfile(keyFile, "Color Management", "GammaSlope", pedited, icm.slpos, pedited->icm.slpos); + } + + if (keyFile.has_group ("Wavelet")) { + assignFromKeyfile(keyFile, "Wavelet", "Enabled", pedited, wavelet.enabled, pedited->wavelet.enabled); + assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); + assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); + assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); + assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); + assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); + assignFromKeyfile(keyFile, "Wavelet", "Linkedg", pedited, wavelet.linkedg, pedited->wavelet.linkedg); + assignFromKeyfile(keyFile, "Wavelet", "CBenab", pedited, wavelet.cbenab, pedited->wavelet.cbenab); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenhigh", pedited, wavelet.greenhigh, pedited->wavelet.greenhigh); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenmed", pedited, wavelet.greenmed, pedited->wavelet.greenmed); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenlow", pedited, wavelet.greenlow, pedited->wavelet.greenlow); + assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); + assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); + assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); + assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); + assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); + assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, wavelet.Lmethod, pedited->wavelet.Lmethod); + assignFromKeyfile(keyFile, "Wavelet", "ChoiceLevMethod", pedited, wavelet.CLmethod, pedited->wavelet.CLmethod); + assignFromKeyfile(keyFile, "Wavelet", "BackMethod", pedited, wavelet.Backmethod, pedited->wavelet.Backmethod); + assignFromKeyfile(keyFile, "Wavelet", "TilesMethod", pedited, wavelet.Tilesmethod, pedited->wavelet.Tilesmethod); + assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); + assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); + assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); + assignFromKeyfile(keyFile, "Wavelet", "CHSLromaMethod", pedited, wavelet.CHSLmethod, pedited->wavelet.CHSLmethod); + assignFromKeyfile(keyFile, "Wavelet", "EDMethod", pedited, wavelet.EDmethod, pedited->wavelet.EDmethod); + assignFromKeyfile(keyFile, "Wavelet", "NPMethod", pedited, wavelet.NPmethod, pedited->wavelet.NPmethod); + assignFromKeyfile(keyFile, "Wavelet", "BAMethod", pedited, wavelet.BAmethod, pedited->wavelet.BAmethod); + assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); + assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); + assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); + assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); + assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); + assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); + assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); + assignFromKeyfile(keyFile, "Wavelet", "Residualgamma", pedited, wavelet.gamma, pedited->wavelet.gamma); + assignFromKeyfile(keyFile, "Wavelet", "ContExtra", pedited, wavelet.sup, pedited->wavelet.sup); + assignFromKeyfile(keyFile, "Wavelet", "HueRangeResidual", pedited, wavelet.sky, pedited->wavelet.sky); + assignFromKeyfile(keyFile, "Wavelet", "MaxLev", pedited, wavelet.thres, pedited->wavelet.thres); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdHighlight", pedited, wavelet.threshold, pedited->wavelet.threshold); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdShadow", pedited, wavelet.threshold2, pedited->wavelet.threshold2); + assignFromKeyfile(keyFile, "Wavelet", "Edgedetect", pedited, wavelet.edgedetect, pedited->wavelet.edgedetect); + assignFromKeyfile(keyFile, "Wavelet", "Edgedetectthr", pedited, wavelet.edgedetectthr, pedited->wavelet.edgedetectthr); + assignFromKeyfile(keyFile, "Wavelet", "EdgedetectthrHi", pedited, wavelet.edgedetectthr2, pedited->wavelet.edgedetectthr2); + assignFromKeyfile(keyFile, "Wavelet", "Edgesensi", pedited, wavelet.edgesensi, pedited->wavelet.edgesensi); + assignFromKeyfile(keyFile, "Wavelet", "Edgeampli", pedited, wavelet.edgeampli, pedited->wavelet.edgeampli); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdChroma", pedited, wavelet.chroma, pedited->wavelet.chroma); + assignFromKeyfile(keyFile, "Wavelet", "ChromaLink", pedited, wavelet.chro, pedited->wavelet.chro); + assignFromKeyfile(keyFile, "Wavelet", "Contrast", pedited, wavelet.contrast, pedited->wavelet.contrast); + assignFromKeyfile(keyFile, "Wavelet", "Edgrad", pedited, wavelet.edgrad, pedited->wavelet.edgrad); + assignFromKeyfile(keyFile, "Wavelet", "Edgval", pedited, wavelet.edgval, pedited->wavelet.edgval); + assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); + assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); + assignFromKeyfile(keyFile, "Wavelet", "HHcurve", pedited, wavelet.hhcurve, pedited->wavelet.hhcurve); + assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); + assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); + + if (keyFile.has_key ("Wavelet", "Hueskin")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Hueskin"); + + if (thresh.size() >= 4) { + wavelet.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.hueskin = true; + } + } + + if (keyFile.has_key ("Wavelet", "HueRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HueRange"); + + if (thresh.size() >= 4) { + wavelet.hueskin2.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.hueskin2 = true; + } + } + + if (keyFile.has_key ("Wavelet", "HLRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HLRange"); + + if (thresh.size() >= 4) { + wavelet.hllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.hllev = true; + } + } + + if (keyFile.has_key ("Wavelet", "SHRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "SHRange"); + + if (thresh.size() >= 4) { + wavelet.bllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.bllev = true; + } + } + + if (keyFile.has_key ("Wavelet", "Edgcont")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Edgcont"); + + if (thresh.size() >= 4) { + wavelet.edgcont.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.edgcont = true; + } + } + + if (keyFile.has_key ("Wavelet", "Level0noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level0noise"); + + if (thresh.size() >= 2) { + wavelet.level0noise.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.level0noise = true; + } + } + + if (keyFile.has_key ("Wavelet", "Level1noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level1noise"); + + if (thresh.size() >= 2) { + wavelet.level1noise.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.level1noise = true; + } + } + + if (keyFile.has_key ("Wavelet", "Level2noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level2noise"); + + if (thresh.size() >= 2) { + wavelet.level2noise.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.level2noise = true; + } + } + + if (keyFile.has_key ("Wavelet", "Level3noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); + + if (thresh.size() >= 2) { + wavelet.level3noise.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->wavelet.level3noise = true; + } + } + + if (keyFile.has_key ("Wavelet", "Pastlev")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); + + if (thresh.size() >= 4) { + wavelet.pastlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.pastlev = true; + } + } + + if (keyFile.has_key ("Wavelet", "Satlev")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Satlev"); + + if (thresh.size() >= 4) { + wavelet.satlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->wavelet.satlev = true; + } + } + + assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); + assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); + assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); + + for (int i = 0; i < 9; ++i) { + std::stringstream ss; + ss << "Contrast" << (i + 1); + + if (keyFile.has_key ("Wavelet", ss.str())) { + wavelet.c[i] = keyFile.get_integer ("Wavelet", ss.str()); + + if (pedited) { + pedited->wavelet.c[i] = true; + } + } + } + + for (int i = 0; i < 9; ++i) { + std::stringstream ss; + ss << "Chroma" << (i + 1); + + if (keyFile.has_key ("Wavelet", ss.str())) { + wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); + + if (pedited) { + pedited->wavelet.ch[i] = true; + } + } + } + assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); + assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); + assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); + assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); + assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); + } + + if (keyFile.has_group ("Directional Pyramid Equalizer")) { + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Enabled", pedited, dirpyrequalizer.enabled, pedited->dirpyrequalizer.enabled); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Gamutlab", pedited, dirpyrequalizer.gamutlab, pedited->dirpyrequalizer.gamutlab); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "cbdlMethod", pedited, dirpyrequalizer.cbdlMethod, pedited->dirpyrequalizer.cbdlMethod); + + if (keyFile.has_key ("Directional Pyramid Equalizer", "Hueskin")) { + const std::vector thresh = keyFile.get_integer_list ("Directional Pyramid Equalizer", "Hueskin"); + + if (thresh.size() >= 4) { + dirpyrequalizer.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } + + if (pedited) { + pedited->dirpyrequalizer.hueskin = true; + } + } + + if (ppVersion < 316) { + for (int i = 0; i < 5; i ++) { + std::stringstream ss; + ss << "Mult" << i; + + if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { + if (i == 4) { + dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + + if (pedited) { + pedited->dirpyrequalizer.threshold = true; + } + } else { + dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + + if (pedited) { + pedited->dirpyrequalizer.mult[i] = true; + } + } + } + } + + dirpyrequalizer.mult[4] = 1.0; + } else { + // 5 level wavelet + dedicated threshold parameter + for (int i = 0; i < 6; i ++) { + std::stringstream ss; + ss << "Mult" << i; + + if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { + dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + + if (pedited) { + pedited->dirpyrequalizer.mult[i] = true; + } + } + } + + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Threshold", pedited, dirpyrequalizer.threshold, pedited->dirpyrequalizer.threshold); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Skinprotect", pedited, dirpyrequalizer.skinprotect, pedited->dirpyrequalizer.skinprotect); + } + } + + if (keyFile.has_group ("Film Simulation")) { + assignFromKeyfile(keyFile, "Film Simulation", "Enabled", pedited, filmSimulation.enabled, pedited->filmSimulation.enabled); + assignFromKeyfile(keyFile, "Film Simulation", "ClutFilename", pedited, filmSimulation.clutFilename, pedited->filmSimulation.clutFilename); + if (keyFile.has_key ("Film Simulation", "Strength")) { + if (ppVersion < 321) { + filmSimulation.strength = keyFile.get_double ("Film Simulation", "Strength") * 100 + 0.1; + } else { + filmSimulation.strength = keyFile.get_integer ("Film Simulation", "Strength"); + } + + if (pedited) { + pedited->filmSimulation.strength = true; + } + } + } + + if (keyFile.has_group ("HSV Equalizer")) { + if (ppVersion >= 300) { + assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve); + assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve); + assignFromKeyfile(keyFile, "HSV Equalizer", "VCurve", pedited, hsvequalizer.vcurve, pedited->hsvequalizer.vcurve); + } + } + + if (keyFile.has_group ("RGB Curves")) { + assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode); + assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve); + assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve); + assignFromKeyfile(keyFile, "RGB Curves", "bCurve", pedited, rgbCurves.bcurve, pedited->rgbCurves.bcurve); + } + + if (keyFile.has_group ("ColorToning")) { + assignFromKeyfile(keyFile, "ColorToning", "Enabled", pedited, colorToning.enabled, pedited->colorToning.enabled); + assignFromKeyfile(keyFile, "ColorToning", "Method", pedited, colorToning.method, pedited->colorToning.method); + assignFromKeyfile(keyFile, "ColorToning", "Lumamode", pedited, colorToning.lumamode, pedited->colorToning.lumamode); + assignFromKeyfile(keyFile, "ColorToning", "Twocolor", pedited, colorToning.twocolor, pedited->colorToning.twocolor); + assignFromKeyfile(keyFile, "ColorToning", "OpacityCurve", pedited, colorToning.opacityCurve, pedited->colorToning.opacityCurve); + assignFromKeyfile(keyFile, "ColorToning", "ColorCurve", pedited, colorToning.colorCurve, pedited->colorToning.colorCurve); + assignFromKeyfile(keyFile, "ColorToning", "Autosat", pedited, colorToning.autosat, pedited->colorToning.autosat); + assignFromKeyfile(keyFile, "ColorToning", "SatProtectionThreshold", pedited, colorToning.satProtectionThreshold, pedited->colorToning.satprotectionthreshold); + assignFromKeyfile(keyFile, "ColorToning", "SaturatedOpacity", pedited, colorToning.saturatedOpacity, pedited->colorToning.saturatedopacity); + assignFromKeyfile(keyFile, "ColorToning", "Strength", pedited, colorToning.strength, pedited->colorToning.strength); + + if (keyFile.has_key ("ColorToning", "HighlightsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list ("ColorToning", "HighlightsColorSaturation"); + + if (thresh.size() >= 2) { + colorToning.hlColSat.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->colorToning.hlColSat = true; + } + } + + if (keyFile.has_key ("ColorToning", "ShadowsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list ("ColorToning", "ShadowsColorSaturation"); + + if (thresh.size() >= 2) { + colorToning.shadowsColSat.setValues (thresh[0], thresh[1]); + } + + if (pedited) { + pedited->colorToning.shadowsColSat = true; + } + } + + assignFromKeyfile(keyFile, "ColorToning", "ClCurve", pedited, colorToning.clcurve, pedited->colorToning.clcurve); + assignFromKeyfile(keyFile, "ColorToning", "Cl2Curve", pedited, colorToning.cl2curve, pedited->colorToning.cl2curve); + assignFromKeyfile(keyFile, "ColorToning", "Redlow", pedited, colorToning.redlow, pedited->colorToning.redlow); + assignFromKeyfile(keyFile, "ColorToning", "Greenlow", pedited, colorToning.greenlow, pedited->colorToning.greenlow); + assignFromKeyfile(keyFile, "ColorToning", "Bluelow", pedited, colorToning.bluelow, pedited->colorToning.bluelow); + assignFromKeyfile(keyFile, "ColorToning", "Satlow", pedited, colorToning.satlow, pedited->colorToning.satlow); + assignFromKeyfile(keyFile, "ColorToning", "Balance", pedited, colorToning.balance, pedited->colorToning.balance); + assignFromKeyfile(keyFile, "ColorToning", "Sathigh", pedited, colorToning.sathigh, pedited->colorToning.sathigh); + assignFromKeyfile(keyFile, "ColorToning", "Redmed", pedited, colorToning.redmed, pedited->colorToning.redmed); + assignFromKeyfile(keyFile, "ColorToning", "Greenmed", pedited, colorToning.greenmed, pedited->colorToning.greenmed); + assignFromKeyfile(keyFile, "ColorToning", "Bluemed", pedited, colorToning.bluemed, pedited->colorToning.bluemed); + assignFromKeyfile(keyFile, "ColorToning", "Redhigh", pedited, colorToning.redhigh, pedited->colorToning.redhigh); + assignFromKeyfile(keyFile, "ColorToning", "Greenhigh", pedited, colorToning.greenhigh, pedited->colorToning.greenhigh); + assignFromKeyfile(keyFile, "ColorToning", "Bluehigh", pedited, colorToning.bluehigh, pedited->colorToning.bluehigh); + } + + if (keyFile.has_group ("RAW")) { + if (keyFile.has_key ("RAW", "DarkFrame")) { + raw.dark_frame = expandRelativePath (fname, "", keyFile.get_string ("RAW", "DarkFrame" )); + + if (pedited) { + pedited->raw.darkFrame = true; + } + } + + assignFromKeyfile(keyFile, "RAW", "DarkFrameAuto", pedited, raw.df_autoselect, pedited->raw.df_autoselect); + + if (keyFile.has_key ("RAW", "FlatFieldFile")) { + raw.ff_file = expandRelativePath (fname, "", keyFile.get_string ("RAW", "FlatFieldFile" )); + + if (pedited) { + pedited->raw.ff_file = true; + } + } + + assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoSelect", pedited, raw.ff_AutoSelect, pedited->raw.ff_AutoSelect); + assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurRadius", pedited, raw.ff_BlurRadius, pedited->raw.ff_BlurRadius); + assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurType", pedited, raw.ff_BlurType, pedited->raw.ff_BlurType); + assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoClipControl", pedited, raw.ff_AutoClipControl, pedited->raw.ff_AutoClipControl); + if (ppVersion < 328) { + // With ppversion < 328 this value was stored as a boolean, which is nonsense. + // To avoid annoying warnings we skip reading and assume 0. + raw.ff_clipControl = 0; + } else { + assignFromKeyfile(keyFile, "RAW", "FlatFieldClipControl", pedited, raw.ff_clipControl, pedited->raw.ff_clipControl); + } + assignFromKeyfile(keyFile, "RAW", "CA", pedited, raw.ca_autocorrect, pedited->raw.ca_autocorrect); + assignFromKeyfile(keyFile, "RAW", "CARed", pedited, raw.cared, pedited->raw.cared); + assignFromKeyfile(keyFile, "RAW", "CABlue", pedited, raw.cablue, pedited->raw.cablue); + // For compatibility to elder pp3 versions + assignFromKeyfile(keyFile, "RAW", "HotDeadPixels", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); + raw.deadPixelFilter = raw.hotPixelFilter; + if (pedited) { + pedited->raw.deadPixelFilter = pedited->raw.hotPixelFilter; + } + assignFromKeyfile(keyFile, "RAW", "HotPixelFilter", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); + assignFromKeyfile(keyFile, "RAW", "DeadPixelFilter", pedited, raw.deadPixelFilter, pedited->raw.deadPixelFilter); + assignFromKeyfile(keyFile, "RAW", "HotDeadPixelThresh", pedited, raw.hotdeadpix_thresh, pedited->raw.hotdeadpix_thresh); + assignFromKeyfile(keyFile, "RAW", "PreExposure", pedited, raw.expos, pedited->raw.exPos); + assignFromKeyfile(keyFile, "RAW", "PrePreserv", pedited, raw.preser, pedited->raw.exPreser); + if (ppVersion < 320) { + assignFromKeyfile(keyFile, "RAW", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); + assignFromKeyfile(keyFile, "RAW", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); + assignFromKeyfile(keyFile, "RAW", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); + assignFromKeyfile(keyFile, "RAW", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); + assignFromKeyfile(keyFile, "RAW", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); + assignFromKeyfile(keyFile, "RAW", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); + assignFromKeyfile(keyFile, "RAW", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); + assignFromKeyfile(keyFile, "RAW", "PreBlackzero", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); + assignFromKeyfile(keyFile, "RAW", "PreBlackone", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); + assignFromKeyfile(keyFile, "RAW", "PreBlacktwo", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); + assignFromKeyfile(keyFile, "RAW", "PreBlackthree", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); + assignFromKeyfile(keyFile, "RAW", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); + } + } + + if (keyFile.has_group ("RAW Bayer")) { + assignFromKeyfile(keyFile, "RAW Bayer", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); + + if (keyFile.has_key ("RAW Bayer", "ImageNum")) { + raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; + + if (pedited) { + pedited->raw.bayersensor.imageNum = true; + } + } + + assignFromKeyfile(keyFile, "RAW Bayer", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack0", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack1", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack2", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack3", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); + assignFromKeyfile(keyFile, "RAW Bayer", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); + assignFromKeyfile(keyFile, "RAW Bayer", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); + assignFromKeyfile(keyFile, "RAW Bayer", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); + assignFromKeyfile(keyFile, "RAW Bayer", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); + assignFromKeyfile(keyFile, "RAW Bayer", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftMotion", pedited, raw.bayersensor.pixelShiftMotion, pedited->raw.bayersensor.pixelShiftMotion); + + if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrection")) { + raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::PSMotionCorrection)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrection"); + + if (pedited) { + pedited->raw.bayersensor.pixelShiftMotionCorrection = true; + } + } + + if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { + raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod"); + + if (pedited) { + pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = true; + } + } + + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorGreen", pedited, raw.bayersensor.pixelShiftStddevFactorGreen, pedited->raw.bayersensor.pixelShiftStddevFactorGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorRed", pedited, raw.bayersensor.pixelShiftStddevFactorRed, pedited->raw.bayersensor.pixelShiftStddevFactorRed); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorBlue", pedited, raw.bayersensor.pixelShiftStddevFactorBlue, pedited->raw.bayersensor.pixelShiftStddevFactorBlue); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftEperIso", pedited, raw.bayersensor.pixelShiftEperIso, pedited->raw.bayersensor.pixelShiftEperIso); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftNreadIso", pedited, raw.bayersensor.pixelShiftNreadIso, pedited->raw.bayersensor.pixelShiftNreadIso); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftPrnu", pedited, raw.bayersensor.pixelShiftPrnu, pedited->raw.bayersensor.pixelShiftPrnu); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSigma", pedited, raw.bayersensor.pixelShiftSigma, pedited->raw.bayersensor.pixelShiftSigma); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSum", pedited, raw.bayersensor.pixelShiftSum, pedited->raw.bayersensor.pixelShiftSum); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftRedBlueWeight", pedited, raw.bayersensor.pixelShiftRedBlueWeight, pedited->raw.bayersensor.pixelShiftRedBlueWeight); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotion", pedited, raw.bayersensor.pixelShiftShowMotion, pedited->raw.bayersensor.pixelShiftShowMotion); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotionMaskOnly", pedited, raw.bayersensor.pixelShiftShowMotionMaskOnly, pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftAutomatic", pedited, raw.bayersensor.pixelShiftAutomatic, pedited->raw.bayersensor.pixelShiftAutomatic); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenHorizontal", pedited, raw.bayersensor.pixelShiftNonGreenHorizontal, pedited->raw.bayersensor.pixelShiftNonGreenHorizontal); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenVertical", pedited, raw.bayersensor.pixelShiftNonGreenVertical, pedited->raw.bayersensor.pixelShiftNonGreenVertical); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftHoleFill", pedited, raw.bayersensor.pixelShiftHoleFill, pedited->raw.bayersensor.pixelShiftHoleFill); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian", pedited, raw.bayersensor.pixelShiftMedian, pedited->raw.bayersensor.pixelShiftMedian); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian3", pedited, raw.bayersensor.pixelShiftMedian3, pedited->raw.bayersensor.pixelShiftMedian3); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftGreen", pedited, raw.bayersensor.pixelShiftGreen, pedited->raw.bayersensor.pixelShiftGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftBlur", pedited, raw.bayersensor.pixelShiftBlur, pedited->raw.bayersensor.pixelShiftBlur); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftSmoothFactor", pedited, raw.bayersensor.pixelShiftSmoothFactor, pedited->raw.bayersensor.pixelShiftSmooth); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftExp0", pedited, raw.bayersensor.pixelShiftExp0, pedited->raw.bayersensor.pixelShiftExp0); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftLmmse", pedited, raw.bayersensor.pixelShiftLmmse, pedited->raw.bayersensor.pixelShiftLmmse); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBright", pedited, raw.bayersensor.pixelShiftEqualBright, pedited->raw.bayersensor.pixelShiftEqualBright); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBrightChannel", pedited, raw.bayersensor.pixelShiftEqualBrightChannel, pedited->raw.bayersensor.pixelShiftEqualBrightChannel); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross", pedited, raw.bayersensor.pixelShiftNonGreenCross, pedited->raw.bayersensor.pixelShiftNonGreenCross); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross2", pedited, raw.bayersensor.pixelShiftNonGreenCross2, pedited->raw.bayersensor.pixelShiftNonGreenCross2); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenAmaze", pedited, raw.bayersensor.pixelShiftNonGreenAmaze, pedited->raw.bayersensor.pixelShiftNonGreenAmaze); + } + + if (keyFile.has_group ("RAW X-Trans")) { + assignFromKeyfile(keyFile, "RAW X-Trans", "Method", pedited, raw.xtranssensor.method, pedited->raw.xtranssensor.method); + assignFromKeyfile(keyFile, "RAW X-Trans", "CcSteps", pedited, raw.xtranssensor.ccSteps, pedited->raw.xtranssensor.ccSteps); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackRed", pedited, raw.xtranssensor.blackred, pedited->raw.xtranssensor.exBlackRed); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackGreen", pedited, raw.xtranssensor.blackgreen, pedited->raw.xtranssensor.exBlackGreen); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackBlue", pedited, raw.xtranssensor.blackblue, pedited->raw.xtranssensor.exBlackBlue); + } + + if (keyFile.has_group ("Exif")) { + std::vector keys = keyFile.get_keys ("Exif"); + + for (const auto& key : keyFile.get_keys("Exif")) { + exif[key] = keyFile.get_string ("Exif", key); + + if (pedited) { + pedited->exif = true; + } + } + } + + /* + * Load iptc change settings + * + * Existing values are preserved, and the stored values + * are added to the list. To reset a field, the user has to + * save the profile with the field leaved empty, but still + * terminated by a semi-column ";" + * + * Please note that the old Keywords and SupplementalCategories + * tag content is fully replaced by the new one, + * i.e. they don't merge + */ + if (keyFile.has_group ("IPTC")) { + for (const auto& key : keyFile.get_keys("IPTC")) { + // does this key already exist? + const IPTCPairs::iterator element = iptc.find(key); + + if (element != iptc.end()) { + // it already exist so we cleanup the values + element->second.clear(); + } + + // TODO: look out if merging Keywords and SupplementalCategories from the procparams chain would be interesting + for (const auto& currLoadedTagValue : keyFile.get_string_list ("IPTC", key)) { + iptc[key].push_back (currLoadedTagValue); + } + + if (pedited) { + pedited->iptc = true; + } + } + } + + return 0; + } catch (const Glib::Error& e) { + printf ("-->%s\n", e.what().c_str()); + setDefaults (); + return 1; + } catch (...) { + printf ("-->unknown exception!\n"); + setDefaults (); + return 1; + } + + return 0; +} + +ProcParams* ProcParams::create() +{ + return new ProcParams(); +} + +void ProcParams::destroy(ProcParams* pp) +{ + delete pp; +} + +bool ProcParams::operator ==(const ProcParams& other) const +{ + return + toneCurve == other.toneCurve + && retinex == other.retinex + && labCurve == other.labCurve + && sharpenEdge == other.sharpenEdge + && sharpenMicro == other.sharpenMicro + && sharpening == other.sharpening + && prsharpening == other.prsharpening + && vibrance == other.vibrance + && wb == other.wb + && colorappearance == other.colorappearance + && impulseDenoise == other.impulseDenoise + && dirpyrDenoise == other.dirpyrDenoise + && epd == other.epd + && fattal == other.fattal + && defringe == other.defringe + && sh == other.sh + && crop == other.crop + && coarse == other.coarse + && rotate == other.rotate + && commonTrans == other.commonTrans + && distortion == other.distortion + && lensProf == other.lensProf + && perspective == other.perspective + && gradient == other.gradient + && pcvignette == other.pcvignette + && cacorrection == other.cacorrection + && vignetting == other.vignetting + && chmixer == other.chmixer + && blackwhite == other.blackwhite + && resize == other.resize + && raw == other.raw + && icm == other.icm + && wavelet == other.wavelet + && dirpyrequalizer == other.dirpyrequalizer + && hsvequalizer == other.hsvequalizer + && filmSimulation == other.filmSimulation + && rgbCurves == other.rgbCurves + && colorToning == other.colorToning + && exif == other.exif + && iptc == other.iptc; +} + +bool ProcParams::operator !=(const ProcParams& other) const +{ + return !(*this == other); +} + +void ProcParams::init() +{ +} + +void ProcParams::cleanup() +{ +} + +int ProcParams::write(const Glib::ustring& fname, const Glib::ustring& content) const +{ + int error = 0; + + if (fname.length()) { + FILE *f; + f = g_fopen (fname.c_str (), "wt"); + + if (f == nullptr) { + error = 1; + } else { + fprintf (f, "%s", content.c_str()); + fclose (f); + } + } + + return error; +} + +PartialProfile::PartialProfile(bool createInstance, bool paramsEditedValue) +{ + if (createInstance) { + pparams = new ProcParams(); + pedited = new ParamsEdited (paramsEditedValue); + } else { + pparams = nullptr; + pedited = nullptr; + } +} + +PartialProfile::PartialProfile(ProcParams* pp, ParamsEdited* pe, bool fullCopy) +{ + if (fullCopy && pp) { + pparams = new ProcParams (*pp); + } else { + pparams = pp; + } + + if (fullCopy && pe) { + pedited = new ParamsEdited (*pe); + } else { + pedited = pe; + } +} + +PartialProfile::PartialProfile(const ProcParams* pp, const ParamsEdited* pe) +{ + if (pp) { + pparams = new ProcParams (*pp); + } else { + pparams = nullptr; + } + + if (pe) { + pedited = new ParamsEdited (*pe); + } else { + pedited = nullptr; + } +} + +void PartialProfile::deleteInstance() +{ + if (pparams) { + delete pparams; + pparams = nullptr; + } + + if (pedited) { + delete pedited; + pedited = nullptr; + } +} + +void PartialProfile::clearGeneral() +{ + if (pedited) { + pedited->general.colorlabel = false; + pedited->general.intrash = false; + pedited->general.rank = false; + } +} + +int PartialProfile::load(const Glib::ustring& fName) +{ + if (!pparams) { + pparams = new ProcParams(); + } + + if (!pedited) { + pedited = new ParamsEdited(); + } + + if (fName == DEFPROFILE_INTERNAL) { + return 0; + } else if (fName == DEFPROFILE_DYNAMIC) { + return -1; // should not happen here + } else { + return pparams->load (fName, pedited); + } +} + +/* + * Set the all values of the General section to false + * in order to preserve them in applyTo + */ +void PartialProfile::set(bool v) +{ + if (pedited) { + pedited->set (v); + } +} + +void PartialProfile::applyTo(ProcParams* destParams) const +{ + if (destParams && pparams && pedited) { + pedited->combine (*destParams, *pparams, true); + } +} + +AutoPartialProfile::AutoPartialProfile() : + PartialProfile(true) +{ +} + +AutoPartialProfile::~AutoPartialProfile() +{ + deleteInstance(); +} + +} + +} diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 00e6f9389..3f187d913 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1239,6 +1239,7 @@ struct RAWParams { double pixelShiftSmoothFactor; bool pixelShiftExp0; bool pixelShiftLmmse; + bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index c95b53c0a..fc1c4b81a 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -516,7 +516,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DARKFRAME, // EvLensCorrLensfunLens ALLNORAW, // EvTMFattalEnabled HDR, // EvTMFattalThreshold - HDR // EvTMFattalAmount + HDR, // EvTMFattalAmount + DEMOSAIC // EvPixelShiftOneGreen }; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index edf903352..5c1343cc3 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -119,7 +119,7 @@ public: /** @return the orientation of the image */ virtual std::string getOrientation (unsigned int frame = 0) const = 0; - /** @return true if the file is a PixelShift shot (Pentax bodies) */ + /** @return true if the file is a PixelShift shot (Pentax and Sony bodies) */ virtual bool getPixelShift (unsigned int frame = 0) const = 0; /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ virtual bool getHDR (unsigned int frame = 0) const = 0; diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 9df7c106d..10ea0a29e 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -225,6 +225,11 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftLmmse->set_tooltip_text (M("TP_RAW_PIXELSHIFTLMMSE_TOOLTIP")); pixelShiftOptions->pack_start(*pixelShiftLmmse); + pixelShiftOneGreen = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTONEGREEN"), multiImage)); + pixelShiftOneGreen->setCheckBoxListener (this); + pixelShiftOneGreen->set_tooltip_text (M("TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP")); + pixelShiftOptions->pack_start(*pixelShiftOneGreen); + #ifdef PIXELSHIFTDEV pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70)); pixelShiftMotion->setAdjusterListener (this); @@ -376,6 +381,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params } pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor); pixelShiftLmmse->setValue (pp->raw.bayersensor.pixelShiftLmmse); + pixelShiftOneGreen->setValue (pp->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setValue (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->set_sensitive (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setValue (pp->raw.bayersensor.pixelShiftEqualBrightChannel); @@ -427,6 +433,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftBlur->setEdited (pedited->raw.bayersensor.pixelShiftBlur); pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited); pixelShiftLmmse->setEdited (pedited->raw.bayersensor.pixelShiftLmmse); + pixelShiftOneGreen->setEdited (pedited->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setEdited (pedited->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setEdited (pedited->raw.bayersensor.pixelShiftEqualBrightChannel); pixelShiftNonGreenCross->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenCross); @@ -531,6 +538,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->getLastActive (); pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue(); pp->raw.bayersensor.pixelShiftLmmse = pixelShiftLmmse->getLastActive (); + pp->raw.bayersensor.pixelShiftOneGreen = pixelShiftOneGreen->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBright = pixelShiftEqualBright->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBrightChannel = pixelShiftEqualBrightChannel->getLastActive (); pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->getLastActive (); @@ -583,6 +591,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent(); pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState(); pedited->raw.bayersensor.pixelShiftLmmse = !pixelShiftLmmse->get_inconsistent(); + pedited->raw.bayersensor.pixelShiftOneGreen = !pixelShiftOneGreen->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBright = !pixelShiftEqualBright->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBrightChannel = !pixelShiftEqualBrightChannel->get_inconsistent(); pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent(); @@ -849,6 +858,10 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) if (listener) { listener->panelChanged (EvPixelShiftLmmse, pixelShiftLmmse->getValueAsStr ()); } + } else if (c == pixelShiftOneGreen) { + if (listener) { + listener->panelChanged (EvPixelShiftOneGreen, pixelShiftOneGreen->getValueAsStr ()); + } } else if (c == pixelShiftEqualBright) { if (!batchMode) { pixelShiftEqualBrightChannel->set_sensitive(newval != CheckValue::off); diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 6d9dd6062..91e07f323 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -49,6 +49,7 @@ protected: CheckBox* pixelShiftBlur; CheckBox* pixelShiftHoleFill; CheckBox* pixelShiftMedian; + CheckBox* pixelShiftOneGreen; CheckBox* pixelShiftLmmse; CheckBox* pixelShiftEqualBright; CheckBox* pixelShiftEqualBrightChannel; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 62643221a..42c21fca4 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -411,6 +411,7 @@ void ParamsEdited::set (bool v) raw.bayersensor.pixelShiftSmooth = v; raw.bayersensor.pixelShiftExp0 = v; raw.bayersensor.pixelShiftLmmse = v; + raw.bayersensor.pixelShiftOneGreen = v; raw.bayersensor.pixelShiftEqualBright = v; raw.bayersensor.pixelShiftEqualBrightChannel = v; raw.bayersensor.pixelShiftNonGreenCross = v; @@ -953,6 +954,7 @@ void ParamsEdited::initFrom (const std::vector raw.bayersensor.pixelShiftSmooth = raw.bayersensor.pixelShiftSmooth && p.raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor; raw.bayersensor.pixelShiftExp0 = raw.bayersensor.pixelShiftExp0 && p.raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0; raw.bayersensor.pixelShiftLmmse = raw.bayersensor.pixelShiftLmmse && p.raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse; + raw.bayersensor.pixelShiftOneGreen = raw.bayersensor.pixelShiftOneGreen && p.raw.bayersensor.pixelShiftOneGreen == other.raw.bayersensor.pixelShiftOneGreen; raw.bayersensor.pixelShiftEqualBright = raw.bayersensor.pixelShiftEqualBright && p.raw.bayersensor.pixelShiftEqualBright == other.raw.bayersensor.pixelShiftEqualBright; raw.bayersensor.pixelShiftEqualBrightChannel = raw.bayersensor.pixelShiftEqualBrightChannel && p.raw.bayersensor.pixelShiftEqualBrightChannel == other.raw.bayersensor.pixelShiftEqualBrightChannel; raw.bayersensor.pixelShiftNonGreenCross = raw.bayersensor.pixelShiftNonGreenCross && p.raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross; @@ -2523,6 +2525,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftLmmse = mods.raw.bayersensor.pixelShiftLmmse; } + if (raw.bayersensor.pixelShiftOneGreen) { + toEdit.raw.bayersensor.pixelShiftOneGreen = mods.raw.bayersensor.pixelShiftOneGreen; + } + if (raw.bayersensor.pixelShiftEqualBright) { toEdit.raw.bayersensor.pixelShiftEqualBright = mods.raw.bayersensor.pixelShiftEqualBright; } @@ -3051,7 +3057,7 @@ bool RAWParamsEdited::BayerSensor::isUnchanged() const return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq && pixelShiftMotion && pixelShiftMotionCorrection && pixelShiftMotionCorrectionMethod && pixelShiftStddevFactorGreen && pixelShiftStddevFactorRed && pixelShiftStddevFactorBlue && pixelShiftEperIso && pixelShiftNreadIso && pixelShiftPrnu && pixelShiftSigma && pixelShiftSum && pixelShiftRedBlueWeight && pixelShiftShowMotion && pixelShiftShowMotionMaskOnly - && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse && pixelShiftEqualBright && pixelShiftEqualBrightChannel + && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse && pixelShiftOneGreen && pixelShiftEqualBright && pixelShiftEqualBrightChannel && linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index a571f5484..210760680 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -734,6 +734,7 @@ public: bool pixelShiftSmooth; bool pixelShiftExp0; bool pixelShiftLmmse; + bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; From 2a3f864a8c77836229f7e4a5db4437917eccb6cf Mon Sep 17 00:00:00 2001 From: Hombre Date: Sat, 16 Dec 2017 01:29:36 +0100 Subject: [PATCH 025/200] Fix issue #4216: Partial profile always saves color management > output profile intent --- rtengine/procparams.cc | 2 +- rtgui/partialpastedlg.cc | 226 +++++++++++++-------------------------- 2 files changed, 75 insertions(+), 153 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 82e47769f..fe3ed9e7b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3101,7 +3101,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->icm.working, "Color Management", "WorkingProfile", icm.working, keyFile); saveToKeyfile(!pedited || pedited->icm.output, "Color Management", "OutputProfile", icm.output, keyFile); saveToKeyfile( - !pedited || icm.outputIntent, + !pedited || pedited->icm.outputIntent, "Color Management", "OutputProfileIntent", { diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 6683bc57b..4b5c7a857 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -379,14 +379,14 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren void PartialPasteDlg::everythingToggled () { - basicConn.block (true); - detailConn.block (true); - colorConn.block (true); - lensConn.block (true); - compositionConn.block (true); - metaConn.block (true); - rawConn.block (true); - wavConn.block (true); + ConnectionBlocker basicBlocker(basicConn); + ConnectionBlocker detailBlocker(detailConn); + ConnectionBlocker colorBlocker(colorConn); + ConnectionBlocker lensBlocker(lensConn); + ConnectionBlocker compositionBlocker(compositionConn); + ConnectionBlocker metaBlocker(metaConn); + ConnectionBlocker rawBlocker(rawConn); + ConnectionBlocker wavBlocker(wavConn); everything->set_inconsistent (false); @@ -409,44 +409,35 @@ void PartialPasteDlg::everythingToggled () PartialPasteDlg::metaToggled (); PartialPasteDlg::rawToggled (); PartialPasteDlg::wavToggled (); - - basicConn.block (false); - detailConn.block (false); - colorConn.block (false); - lensConn.block (false); - compositionConn.block (false); - metaConn.block (false); - rawConn.block (false); - wavConn.block (false); } void PartialPasteDlg::rawToggled () { - raw_methodConn.block (true); - raw_imagenumConn.block (true); - raw_ccStepsConn.block (true); - raw_dcb_iterationsConn.block (true); - raw_dcb_enhanceConn.block (true); - //raw_all_enhanceConn.block (true); - raw_lmmse_iterationsConn.block (true); - raw_pixelshiftConn.block (true); - raw_exposConn.block (true); - raw_preserConn.block (true); - raw_blackConn.block (true); - raw_ca_autocorrectConn.block (true); - raw_caredblueConn.block (true); - raw_hotpix_filtConn.block (true); - raw_deadpix_filtConn.block (true); - raw_linenoiseConn.block (true); - raw_greenthreshConn.block (true); - df_fileConn.block (true); - df_AutoSelectConn.block (true); - ff_fileConn.block (true); - ff_AutoSelectConn.block (true); - ff_BlurRadiusConn.block (true); - ff_BlurTypeConn.block (true); - ff_ClipControlConn.block (true); + ConnectionBlocker raw_methodBlocker(raw_methodConn); + ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn); + ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn); + ConnectionBlocker raw_dcb_iterationsBlocker(raw_dcb_iterationsConn); + ConnectionBlocker raw_dcb_enhanceBlocker(raw_dcb_enhanceConn); + //ConnectionBlocker raw_all_enhanceConnBlocker(raw_all_enhanceConnConn); + ConnectionBlocker raw_lmmse_iterationsBlocker(raw_lmmse_iterationsConn); + ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); + ConnectionBlocker raw_exposBlocker(raw_exposConn); + ConnectionBlocker raw_preserBlocker(raw_preserConn); + ConnectionBlocker raw_blackBlocker(raw_blackConn); + ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); + ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); + ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn); + ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn); + ConnectionBlocker raw_linenoiseBlocker(raw_linenoiseConn); + ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn); + ConnectionBlocker df_fileBlocker(df_fileConn); + ConnectionBlocker df_AutoSelectBlocker(df_AutoSelectConn); + ConnectionBlocker ff_fileBlocker(ff_fileConn); + ConnectionBlocker ff_AutoSelectBlocker(ff_AutoSelectConn); + ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn); + ConnectionBlocker ff_BlurTypeBlocker(ff_BlurTypeConn); + ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn); raw->set_inconsistent (false); @@ -474,45 +465,21 @@ void PartialPasteDlg::rawToggled () ff_BlurRadius->set_active (raw->get_active ()); ff_BlurType->set_active (raw->get_active ()); ff_ClipControl->set_active (raw->get_active ()); - - raw_methodConn.block (false); - raw_imagenumConn.block (false); - raw_ccStepsConn.block (false); - raw_dcb_iterationsConn.block (false); - raw_dcb_enhanceConn.block (false); - //raw_all_enhanceConn.block (false); - raw_pixelshiftConn.block (false); - raw_lmmse_iterationsConn.block (false); - raw_exposConn.block (false); - raw_preserConn.block (false); - raw_blackConn.block (false); - raw_ca_autocorrectConn.block (false); - raw_caredblueConn.block (false); - raw_hotpix_filtConn.block (false); - raw_deadpix_filtConn.block (false); - raw_linenoiseConn.block (false); - raw_greenthreshConn.block (false); - df_fileConn.block (false); - df_AutoSelectConn.block (false); - ff_fileConn.block (false); - ff_AutoSelectConn.block (false); - ff_BlurRadiusConn.block (false); - ff_BlurTypeConn.block (false); - ff_ClipControlConn.block (false); } void PartialPasteDlg::basicToggled () { - wbConn.block (true); - exposureConn.block (true); - shConn.block (true); - epdConn.block(true); - pcvignetteConn.block (true); - gradientConn.block (true); - labcurveConn.block (true); - colorappearanceConn.block (true); - retinexConn.block (true); + ConnectionBlocker wbBlocker(wbConn); + ConnectionBlocker exposureBlocker(exposureConn); + ConnectionBlocker shBlocker(shConn); + ConnectionBlocker epdBlocker(epdConn); + ConnectionBlocker fattalBlocker(fattalConn); + ConnectionBlocker pcvignetteBlocker(pcvignetteConn); + ConnectionBlocker gradientBlocker(gradientConn); + ConnectionBlocker retinexBlocker(retinexConn); + ConnectionBlocker labcurveBlocker(labcurveConn); + ConnectionBlocker colorappearanceBlocker(colorappearanceConn); basic->set_inconsistent (false); @@ -526,29 +493,18 @@ void PartialPasteDlg::basicToggled () retinex->set_active (basic->get_active ()); labcurve->set_active (basic->get_active ()); colorappearance->set_active (basic->get_active ()); - - wbConn.block (false); - exposureConn.block (false); - shConn.block (false); - epdConn.block (false); - pcvignetteConn.block (false); - gradientConn.block (false); - retinexConn.block (false); - - labcurveConn.block (false); - colorappearanceConn.block (false); } void PartialPasteDlg::detailToggled () { - sharpenConn.block (true); - gradsharpenConn.block(true); - microcontrastConn.block(true); - impdenConn.block (true); - dirpyrdenConn.block (true); - defringeConn.block (true); - dirpyreqConn.block (true); + ConnectionBlocker sharpenBlocker(sharpenConn); + ConnectionBlocker gradsharpenBlocker(gradsharpenConn); + ConnectionBlocker microcontrastBlocker(microcontrastConn); + ConnectionBlocker impdenBlocker(impdenConn); + ConnectionBlocker dirpyrdenBlocker(dirpyrdenConn); + ConnectionBlocker defringeBlocker(defringeConn); + ConnectionBlocker dirpyreqBlocker(dirpyreqConn); detail->set_inconsistent (false); @@ -559,41 +515,32 @@ void PartialPasteDlg::detailToggled () dirpyrden->set_active (detail->get_active ()); defringe->set_active (detail->get_active ()); dirpyreq->set_active (detail->get_active ()); - - sharpenConn.block (false); - gradsharpenConn.block(false); - microcontrastConn.block(false); - impdenConn.block (false); - dirpyrdenConn.block (false); - defringeConn.block (false); - dirpyreqConn.block (false); } void PartialPasteDlg::wavToggled () { - waveletConn.block (true); + ConnectionBlocker waveletBlocker(waveletConn); wav->set_inconsistent (false); wavelet->set_active (wav->get_active ()); - - waveletConn.block (false); } void PartialPasteDlg::colorToggled () { - icmConn.block (true); - //gamcsconn.block (true); - vibranceConn.block (true); - chmixerConn.block (true); - chmixerbwConn.block (true); - hsveqConn.block (true); - filmSimulationConn.block (true); - rgbcurvesConn.block (true); - colortoningConn.block (true); + ConnectionBlocker icmBlocker(icmConn); + ConnectionBlocker vibranceBlocker(vibranceConn); + ConnectionBlocker chmixerBlocker(chmixerConn); + ConnectionBlocker chmixerbwBlocker(chmixerbwConn); + ConnectionBlocker hsveqBlocker(hsveqConn); + ConnectionBlocker filmSimulationBlocker(filmSimulationConn); + //ConnectionBlocker gamcsconnBlocker(gamcsconnConn); + ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn); + ConnectionBlocker colortoningBlocker(colortoningConn); color->set_inconsistent (false); + icm->set_active (color->get_active ()); //gam->set_active (color->get_active ()); vibrance->set_active (color->get_active ()); @@ -603,25 +550,15 @@ void PartialPasteDlg::colorToggled () filmSimulation->set_active (color->get_active ()); rgbcurves->set_active (color->get_active ()); colortoning->set_active(color->get_active ()); - - icmConn.block (false); - //gamcsconn.block (false); - vibranceConn.block (false); - chmixerbwConn.block (false); - chmixerConn.block (false); - hsveqConn.block (false); - filmSimulationConn.block (false); - rgbcurvesConn.block (false); - colortoningConn.block (false); } void PartialPasteDlg::lensToggled () { - distortionConn.block (true); - cacorrConn.block (true); - vignettingConn.block (true); - lcpConn.block (true); + ConnectionBlocker distortionBlocker(distortionConn); + ConnectionBlocker cacorrBlocker(cacorrConn); + ConnectionBlocker vignettingBlocker(vignettingConn); + ConnectionBlocker lcpBlocker(lcpConn); lens->set_inconsistent (false); @@ -629,23 +566,18 @@ void PartialPasteDlg::lensToggled () cacorr->set_active (lens->get_active ()); vignetting->set_active (lens->get_active ()); lcp->set_active (lens->get_active ()); - - distortionConn.block (false); - cacorrConn.block (false); - vignettingConn.block (false); - lcpConn.block (false); } void PartialPasteDlg::compositionToggled () { - coarserotConn.block (true); - finerotConn.block (true); - cropConn.block (true); - resizeConn.block (true); - prsharpeningConn.block (true); - perspectiveConn.block (true); - commonTransConn.block (true); + ConnectionBlocker coarserotBlocker(coarserotConn); + ConnectionBlocker finerotBlocker(finerotConn); + ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker resizeBlocker(resizeConn); + ConnectionBlocker prsharpeningBlocker(prsharpeningConn); + ConnectionBlocker perspectiveBlocker(perspectiveConn); + ConnectionBlocker commonTransBlocker(commonTransConn); composition->set_inconsistent (false); @@ -656,28 +588,18 @@ void PartialPasteDlg::compositionToggled () prsharpening->set_active (composition->get_active ()); perspective->set_active (composition->get_active ()); commonTrans->set_active (composition->get_active ()); - - coarserotConn.block (false); - finerotConn.block (false); - cropConn.block (false); - resizeConn.block (false); - prsharpeningConn.block (false); - perspectiveConn.block (false); - commonTransConn.block (false); } void PartialPasteDlg::metaToggled () { - exifchConn.block (true); - iptcConn.block (true); + ConnectionBlocker exifchBlocker(exifchConn); + ConnectionBlocker iptcBlocker(iptcConn); + meta->set_inconsistent (false); exifch->set_active (meta->get_active ()); iptc->set_active (meta->get_active ()); - - exifchConn.block (false); - iptcConn.block (false); } From e1bf4b075f16b740001a2aa352e02dcb46f8f88f Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 16 Dec 2017 18:36:28 +0100 Subject: [PATCH 026/200] added on/off switch for L*a*b* adjustments --- rtengine/improcfun.cc | 4 ++++ rtengine/procevents.h | 1 + rtengine/procparams.cc | 14 +++++++++++++- rtengine/procparams.h | 1 + rtengine/refreshmap.cc | 3 ++- rtgui/labcurve.cc | 38 ++++++++++++++++++++++++++++---------- rtgui/labcurve.h | 5 +---- rtgui/paramsedited.cc | 6 ++++++ rtgui/paramsedited.h | 3 +-- 9 files changed, 57 insertions(+), 18 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7552cf523..5223a7f85 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -5586,6 +5586,10 @@ 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 &histLCurve) { + if (!params->labCurve.enabled) { + return; + } + int W = lold->W; int H = lold->H; // lhskcurve.dump("lh_curve"); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index bde32f92f..f4dfd7dfb 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -519,6 +519,7 @@ enum ProcEvent { EvTMFattalAmount = 489, EvWBEnabled = 490, EvRGBEnabled = 491, + EvLEnabled = 492, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 82e47769f..ebe9c0427 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -497,6 +497,7 @@ void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT, Re } LCurveParams::LCurveParams() : + enabled(false), lcurve{ DCT_Linear }, @@ -536,7 +537,8 @@ LCurveParams::LCurveParams() : bool LCurveParams::operator ==(const LCurveParams& other) const { return - lcurve == other.lcurve + enabled == other.enabled + && lcurve == other.lcurve && acurve == other.acurve && bcurve == other.bcurve && cccurve == other.cccurve @@ -2820,6 +2822,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->blackwhite.afterCurve, "Black & White", "AfterCurve", blackwhite.afterCurve, keyFile); // Luma curve + saveToKeyfile(!pedited || pedited->labCurve.enabled, "Luminance Curve", "Enabled", labCurve.enabled, keyFile); saveToKeyfile(!pedited || pedited->labCurve.brightness, "Luminance Curve", "Brightness", labCurve.brightness, keyFile); saveToKeyfile(!pedited || pedited->labCurve.contrast, "Luminance Curve", "Contrast", labCurve.contrast, keyFile); saveToKeyfile(!pedited || pedited->labCurve.chromaticity, "Luminance Curve", "Chromaticity", labCurve.chromaticity, keyFile); @@ -3588,6 +3591,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (keyFile.has_group ("Luminance Curve")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "Luminance Curve", "Enabled", pedited, labCurve.enabled, pedited->labCurve.enabled); + } else { + labCurve.enabled = true; + if (pedited) { + pedited->labCurve.enabled = true; + } + } + assignFromKeyfile(keyFile, "Luminance Curve", "Brightness", pedited, labCurve.brightness, pedited->labCurve.brightness); assignFromKeyfile(keyFile, "Luminance Curve", "Contrast", pedited, labCurve.contrast, pedited->labCurve.contrast); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f7e23771a..39d84ac12 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -341,6 +341,7 @@ struct RetinexParams */ struct LCurveParams { + bool enabled; std::vector lcurve; std::vector acurve; std::vector bcurve; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 86b602562..6105bb508 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -518,6 +518,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalThreshold HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled - RGBCURVE // EvRGBEnabled + RGBCURVE, // EvRGBEnabled + LUMINANCECURVE // EvLEnabled }; diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index c39dc99fc..8b2b2a217 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -24,7 +24,7 @@ using namespace rtengine; using namespace rtengine::procparams; -LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL")) +LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), false, true) { std::vector milestones; @@ -244,6 +244,8 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hhshape->setUnChanged (!pedited->labCurve.hhcurve); lcshape->setUnChanged (!pedited->labCurve.lccurve); clshape->setUnChanged (!pedited->labCurve.clcurve); + + set_inconsistent(multiImage && !pedited->labCurve.enabled); } brightness->setValue (pp->labCurve.brightness); @@ -277,6 +279,8 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) lcshape->setCurve (pp->labCurve.lccurve); clshape->setCurve (pp->labCurve.clcurve); + setEnabled(pp->labCurve.enabled); + queue_draw(); enableListener (); @@ -338,7 +342,8 @@ void LCurve::setEditProvider (EditDataProvider *provider) void LCurve::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->labCurve.enabled = getEnabled(); + pp->labCurve.brightness = brightness->getValue (); pp->labCurve.contrast = (int)contrast->getValue (); pp->labCurve.chromaticity = (int)chromaticity->getValue (); @@ -380,7 +385,7 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->labCurve.lccurve = !lcshape->isUnChanged (); pedited->labCurve.clcurve = !clshape->isUnChanged (); - + pedited->labCurve.enabled = !get_inconsistent(); } } @@ -424,7 +429,7 @@ void LCurve::avoidcolorshift_toggled () lastACVal = avoidcolorshift->get_active (); } - if (listener) { + if (listener && getEnabled()) { if (avoidcolorshift->get_active ()) { listener->panelChanged (EvLAvoidColorShift, M("GENERAL_ENABLED")); } else { @@ -451,7 +456,7 @@ void LCurve::lcredsk_toggled () lcshape->refresh(); } - if (listener) { + if (listener && getEnabled()) { if (lcredsk->get_active ()) { listener->panelChanged (EvLLCredsk, M("GENERAL_ENABLED")); } else { @@ -471,7 +476,7 @@ void LCurve::lcredsk_toggled () void LCurve::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == lshape) { listener->panelChanged (EvLLCurve, M("HISTORY_CUSTOMCURVE")); } @@ -526,15 +531,15 @@ void LCurve::adjusterChanged (Adjuster* a, double newval) } if (a == brightness) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLBrightness, costr); } } else if (a == contrast) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLContrast, costr); } } else if (a == rstprotection) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLRSTProtection, costr); } } else if (a == chromaticity) { @@ -550,7 +555,7 @@ void LCurve::adjusterChanged (Adjuster* a, double newval) lcredsk->set_sensitive( int(newval) > -100 ); } - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLSaturation, costr); } } @@ -668,3 +673,16 @@ void LCurve::trimValues (rtengine::procparams::ProcParams* pp) contrast->trimValue(pp->labCurve.contrast); chromaticity->trimValue(pp->labCurve.chromaticity); } + +void LCurve::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvLEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvLEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvLEnabled, M("GENERAL_DISABLED")); + } + } +} diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index 403b49f9e..e0b912559 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -82,10 +82,7 @@ public: virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); -private: - - - + void enabledChanged(); }; #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 57fd7646f..391438cd6 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -82,6 +82,7 @@ void ParamsEdited::set (bool v) retinex.radius = v; retinex.retinex = v; + labCurve.enabled = v; labCurve.lcurve = v; labCurve.acurve = v; labCurve.bcurve = v; @@ -626,6 +627,7 @@ void ParamsEdited::initFrom (const std::vector retinex.radius = retinex.radius && p.retinex.radius == other.retinex.radius; retinex.enabled = retinex.enabled && p.retinex.enabled == other.retinex.enabled; + labCurve.enabled = labCurve.enabled && p.labCurve.enabled == other.labCurve.enabled; labCurve.lcurve = labCurve.lcurve && p.labCurve.lcurve == other.labCurve.lcurve; labCurve.acurve = labCurve.acurve && p.labCurve.acurve == other.labCurve.acurve; labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve; @@ -1304,6 +1306,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten } + if (labCurve.enabled) { + toEdit.labCurve.enabled = mods.labCurve.enabled; + } + if (labCurve.lcurve) { toEdit.labCurve.lcurve = mods.labCurve.lcurve; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 62fd8c9f4..fcb3a0b49 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -100,6 +100,7 @@ public: class LCurveParamsEdited { public: + bool enabled; bool brightness; bool contrast; bool chromaticity; @@ -115,8 +116,6 @@ public: bool hhcurve; bool lccurve; bool clcurve; - bool enabled; - bool method; }; class RGBCurvesParamsEdited From ec24784d10ca870a46e45919c9764f6af51f5ef2 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 8 Dec 2017 23:24:42 +0100 Subject: [PATCH 027/200] Tool panel vertical scrollbar bug in Linux #3413 When the vertical scrollbar is set to hidden, one cannot scroll the toolbox vertically using the mouse scrollwheel in Linux. This patch works around the problem by forcing the scrollbar to always be visible in Linux. --- rtgui/options.cc | 6 +++++- rtgui/preferences.cc | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index d1b91c3ac..69e5c4bc9 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1366,10 +1366,14 @@ void Options::readFromFile (Glib::ustring fname) FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } +#ifdef __linux__ + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + hideTPVScrollbar = false; +#else if (keyFile.has_key ("GUI", "HideTPVScrollbar")) { hideTPVScrollbar = keyFile.get_boolean ("GUI", "HideTPVScrollbar"); } - +#endif if (keyFile.has_key ("GUI", "UseIconNoText")) { UseIconNoText = keyFile.get_boolean ("GUI", "UseIconNoText"); } diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 7e6018ff0..ac3f4991c 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1003,6 +1003,11 @@ Gtk::Widget* Preferences::getGeneralPanel () setExpandAlignProperties (hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); ckbHideTPVScrollbar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_VSCROLLBAR")) ); setExpandAlignProperties (ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); +#ifdef __linux__ + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + ckbHideTPVScrollbar->set_active(false); + ckbHideTPVScrollbar->set_sensitive(false); +#endif ckbUseIconNoText = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_USEICONORTEXT")) ); setExpandAlignProperties (ckbUseIconNoText, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); workflowGrid->attach_next_to (*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); From 8e151e97c82826bf51dd84d4e23ac66b2a21f0be Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 17 Dec 2017 03:52:07 +0100 Subject: [PATCH 028/200] Linux GTK+ >=3.19 only. Force the toolbox vertical scrollbar to be visible only if using Linux and GTK+ >=3.19. #3413 --- rtgui/options.cc | 2 +- rtgui/preferences.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 69e5c4bc9..031678ddd 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -1366,7 +1366,7 @@ void Options::readFromFile (Glib::ustring fname) FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } -#ifdef __linux__ +#if defined(__linux__) && ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION > 18) || GTK_MAJOR_VERSION > 3) // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 hideTPVScrollbar = false; #else diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index ac3f4991c..cfa10265b 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -1003,7 +1003,7 @@ Gtk::Widget* Preferences::getGeneralPanel () setExpandAlignProperties (hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); ckbHideTPVScrollbar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_VSCROLLBAR")) ); setExpandAlignProperties (ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); -#ifdef __linux__ +#if defined(__linux__) && ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION > 18) || GTK_MAJOR_VERSION > 3) // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 ckbHideTPVScrollbar->set_active(false); ckbHideTPVScrollbar->set_sensitive(false); From 6b6a1eccbd65069fe55f7054334b56ba70d6a3f8 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 17 Dec 2017 17:11:39 +0100 Subject: [PATCH 029/200] added missing HISTORY_MSG_493 to the default languages file --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index 0e532f149..fda54dd4d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -724,6 +724,7 @@ HISTORY_MSG_489;HDR TM - Threshold HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves +HISTORY_MSG_493;L*a*b* Adjustments HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot From e4e2b57564f4dfe5a38e685875cf1ae7c9801e65 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 17 Dec 2017 18:42:41 +0100 Subject: [PATCH 030/200] Update Deutsch locale HISTORY_MSG_493 L*a*b* Adjustments --- rtdata/languages/Deutsch | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index f011096b8..06996fdf8 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -768,6 +768,7 @@ HISTORY_MSG_487;(Objektivkorrektur)\nProfil - Objektiv HISTORY_MSG_488;(HDR-Dynamikkompression) HISTORY_MSG_489;(HDR-Dynamikkompression)\nSchwelle HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität +HISTORY_MSG_493;(L*a*b*) HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss From 39d514e58225f73349de4eea7195f262d91aa0d2 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 18 Dec 2017 11:35:12 +0100 Subject: [PATCH 031/200] deleted wrongly-committed backup file --- rtengine/procparams.cc.save-failed | 4857 ---------------------------- 1 file changed, 4857 deletions(-) delete mode 100644 rtengine/procparams.cc.save-failed diff --git a/rtengine/procparams.cc.save-failed b/rtengine/procparams.cc.save-failed deleted file mode 100644 index 0137ee7b6..000000000 --- a/rtengine/procparams.cc.save-failed +++ /dev/null @@ -1,4857 +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 . - */ - -#include - -#include - -#include - -#include "curves.h" -#include "procparams.h" - -#include "../rtgui/multilangmgr.h" -#include "../rtgui/options.h" -#include "../rtgui/paramsedited.h" -#include "../rtgui/ppversion.h" -#include "../rtgui/version.h" - -using namespace std; -extern Options options; - -namespace -{ - -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; - } - - if (prefix != "") { - if (embedded_fname.length() < prefix.length() || embedded_fname.substr (0, prefix.length()) != prefix) { - return embedded_fname; - } - - embedded_fname = embedded_fname.substr (prefix.length()); - } - - if (Glib::path_is_absolute (embedded_fname)) { - return prefix + embedded_fname; - } - - Glib::ustring absPath = prefix + Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S + embedded_fname; - return absPath; -} - -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; - } - - Glib::ustring prefix = ""; - - if (embedded_fname.length() > 5 && embedded_fname.substr (0, 5) == "file:") { - embedded_fname = embedded_fname.substr (5); - prefix = "file:"; - } - - if (!Glib::path_is_absolute (embedded_fname)) { - return prefix + embedded_fname; - } - - Glib::ustring dir1 = Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S; - Glib::ustring dir2 = Glib::path_get_dirname (embedded_fname) + G_DIR_SEPARATOR_S; - - if (dir2.substr (0, dir1.length()) != dir1) { - // it's in a different directory, ie not inside - return prefix + embedded_fname; - } - - return prefix + embedded_fname.substr (dir1.length()); -} - -void avoidEmptyCurve (std::vector &curve) -{ - if (curve.empty()) { - curve.push_back (FCT_Linear); - } -} - -void getFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - int& value -) -{ - value = keyfile.get_integer(group_name, key); -} - -void getFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - double& value -) -{ - value = keyfile.get_double(group_name, key); -} - -void getFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - bool& value -) -{ - value = keyfile.get_boolean(group_name, key); -} - -void getFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - Glib::ustring& value -) -{ - value = keyfile.get_string(group_name, key); -} - -void getFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - std::vector& value -) -{ - value = keyfile.get_double_list(group_name, key); - avoidEmptyCurve(value); -} - -template -bool assignFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - bool has_params_edited, - T& value, - bool& params_edited_value -) -{ - if (keyfile.has_key(group_name, key)) { - getFromKeyfile(keyfile, group_name, key, value); - - if (has_params_edited) { - params_edited_value = true; - } - - return true; - } - return false; -} - -template::value>::type> -bool assignFromKeyfile( - const Glib::KeyFile& keyfile, - const Glib::ustring& group_name, - const Glib::ustring& key, - bool has_params_edited, - const std::map& mapping, - T& value, - bool& params_edited_value -) -{ - if (keyfile.has_key(group_name, key)) { - Glib::ustring v; - getFromKeyfile(keyfile, group_name, key, v); - - const typename std::map::const_iterator m = mapping.find(v); - - if (m != mapping.end()) { - value = m->second; - } else { - return false; - } - - if (has_params_edited) { - params_edited_value = true; - } - - return true; - } - return false; -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - int value, - Glib::KeyFile& keyfile -) -{ - keyfile.set_integer(group_name, key, value); -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - double value, - Glib::KeyFile& keyfile -) -{ - keyfile.set_double(group_name, key, value); -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - bool value, - Glib::KeyFile& keyfile -) -{ - keyfile.set_boolean(group_name, key, value); -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - const Glib::ustring& value, - Glib::KeyFile& keyfile -) -{ - keyfile.set_string(group_name, key, value); -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - const std::vector& value, - Glib::KeyFile& keyfile -) -{ - const Glib::ArrayHandle list = value; - keyfile.set_integer_list(group_name, key, list); -} - -void putToKeyfile( - const Glib::ustring& group_name, - const Glib::ustring& key, - const std::vector& value, - Glib::KeyFile& keyfile -) -{ - const Glib::ArrayHandle list = value; - keyfile.set_double_list(group_name, key, list); -} - -template -bool saveToKeyfile( - bool save, - const Glib::ustring& group_name, - const Glib::ustring& key, - const T& value, - Glib::KeyFile& keyfile -) -{ - if (save) { - putToKeyfile(group_name, key, value, keyfile); - return true; - } - return false; -} - -template::value>::type> -bool saveToKeyfile( - bool save, - const Glib::ustring& group_name, - const Glib::ustring& key, - const std::map& mapping, - const T& value, - Glib::KeyFile& keyfile -) -{ - if (save) { - const typename std::map::const_iterator m = mapping.find(value); - - if (m != mapping.end()) { - keyfile.set_string(group_name, key, m->second); - return true; - } - } - return false; -} - -} - -namespace rtengine -{ - -namespace procparams -{ - -ToneCurveParams::ToneCurveParams() : - autoexp(false), - clip(0.02), - hrenabled(false), - method("Blend"), - expcomp(0), - curve{ - DCT_Linear - }, - curve2{ - DCT_Linear - }, - curveMode(ToneCurveParams::TcMode::STD), - curveMode2(ToneCurveParams::TcMode::STD), - brightness(0), - black(0), - contrast(0), - saturation(0), - shcompr(50), - hlcompr(0), - hlcomprthresh(33) -{ -} - -bool ToneCurveParams::operator ==(const ToneCurveParams& other) const -{ - return - autoexp == other.autoexp - && clip == other.clip - && hrenabled == other.hrenabled - && method == other.method - && expcomp == other.expcomp - && curve == other.curve - && curve2 == other.curve2 - && curveMode == other.curveMode - && curveMode2 == other.curveMode2 - && brightness == other.brightness - && black == other.black - && contrast == other.contrast - && saturation == other.saturation - && shcompr == other.shcompr - && hlcompr == other.hlcompr - && hlcomprthresh == other.hlcomprthresh; -} - -bool ToneCurveParams::operator !=(const ToneCurveParams& other) const -{ - return !(*this == other); -} - -bool ToneCurveParams::HLReconstructionNecessary(const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw) -{ - if (options.rtSettings.verbose) { - printf("histRedRaw[ 0]=%07d, histGreenRaw[ 0]=%07d, histBlueRaw[ 0]=%07d\nhistRedRaw[255]=%07d, histGreenRaw[255]=%07d, histBlueRaw[255]=%07d\n", - histRedRaw[0], histGreenRaw[0], histBlueRaw[0], histRedRaw[255], histGreenRaw[255], histBlueRaw[255]); - } - - return - histRedRaw[255] > 50 - || histGreenRaw[255] > 50 - || histBlueRaw[255] > 50 - || histRedRaw[0] > 50 - || histGreenRaw[0] > 50 - || histBlueRaw[0] > 50; -} - -RetinexParams::RetinexParams() : - enabled(false), - cdcurve{ - DCT_Linear - }, - cdHcurve{ - DCT_Linear - }, - lhcurve{ - DCT_Linear - }, - transmissionCurve{ - FCT_MinMaxCPoints, - 0.00, - 0.50, - 0.35, - 0.35, - 0.60, - 0.75, - 0.35, - 0.35, - 1.00, - 0.50, - 0.35, - 0.35 - }, - gaintransmissionCurve{ - FCT_MinMaxCPoints, - 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 - }, - mapcurve{ - DCT_Linear - }, - str(20), - scal(3), - iter(1), - grad(1), - grads(1), - gam(1.30), - slope(3.), - neigh(80), - offs(0), - highlights(0), - htonalwidth(80), - shadows(0), - stonalwidth(80), - radius(40), - retinexMethod("high"), - retinexcolorspace("Lab"), - gammaretinex("none"), - mapMethod("none"), - viewMethod("none"), - vart(200), - limd(8), - highl(4), - skal(3), - medianmap(false) -{ -} - -bool RetinexParams::operator ==(const RetinexParams& other) const -{ - return - enabled == other.enabled - && cdcurve == other.cdcurve - && cdHcurve == other.cdHcurve - && lhcurve == other.lhcurve - && transmissionCurve == other.transmissionCurve - && gaintransmissionCurve == other.gaintransmissionCurve - && mapcurve == other.mapcurve - && str == other.str - && scal == other.scal - && iter == other.iter - && grad == other.grad - && grads == other.grads - && gam == other.gam - && slope == other.slope - && neigh == other.neigh - && offs == other.offs - && highlights == other.highlights - && htonalwidth == other.htonalwidth - && shadows == other.shadows - && stonalwidth == other.stonalwidth - && radius == other.radius - && retinexMethod == other.retinexMethod - && retinexcolorspace == other.retinexcolorspace - && gammaretinex == other.gammaretinex - && mapMethod == other.mapMethod - && viewMethod == other.viewMethod - && vart == other.vart - && limd == other.limd - && highl == other.highl - && skal == other.skal - && medianmap == other.medianmap; -} - -bool RetinexParams::operator !=(const RetinexParams& other) const -{ - return !(*this == other); -} - -void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const -{ - transmissionCurveLUT.Set(this->transmissionCurve); - gaintransmissionCurveLUT.Set(this->gaintransmissionCurve); - -} - -LCurveParams::LCurveParams() : - lcurve{ - DCT_Linear - }, - acurve{ - DCT_Linear - }, - bcurve{ - DCT_Linear - }, - cccurve{ - DCT_Linear - }, - chcurve{ - FCT_Linear - }, - lhcurve{ - FCT_Linear - }, - hhcurve{ - FCT_Linear - }, - lccurve{ - DCT_Linear - }, - clcurve{ - DCT_Linear - }, - brightness(0), - contrast(0), - chromaticity(0), - avoidcolorshift(false), - rstprotection(0), - lcredsk(true) -{ -} - -bool LCurveParams::operator ==(const LCurveParams& other) const -{ - return - lcurve == other.lcurve - && acurve == other.acurve - && bcurve == other.bcurve - && cccurve == other.cccurve - && chcurve == other.chcurve - && lhcurve == other.lhcurve - && hhcurve == other.hhcurve - && lccurve == other.lccurve - && clcurve == other.clcurve - && brightness == other.brightness - && contrast == other.contrast - && chromaticity == other.chromaticity - && avoidcolorshift == other.avoidcolorshift - && rstprotection == other.rstprotection - && lcredsk == other.lcredsk; -} - -bool LCurveParams::operator !=(const LCurveParams& other) const -{ - return !(*this == other); -} - -RGBCurvesParams::RGBCurvesParams() : - lumamode(false), - rcurve{ - DCT_Linear - }, - gcurve{ - DCT_Linear - }, - bcurve{ - DCT_Linear - } -{ -} - -bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const -{ - return - lumamode == other.lumamode - && rcurve == other.rcurve - && gcurve == other.gcurve - && bcurve == other.bcurve; -} - -bool RGBCurvesParams::operator !=(const RGBCurvesParams& other) const -{ - return !(*this == other); -} - -ColorToningParams::ColorToningParams() : - enabled(false), - autosat(true), - opacityCurve{ - FCT_MinMaxCPoints, - 0.00, - 0.3, - 0.35, - 0.00, - 0.25, - 0.8, - 0.35, - 0.35, - 0.70, - 0.8, - 0.35, - 0.35, - 1.00, - 0.3, - 0.00, - 0.00 - }, - colorCurve{ - FCT_MinMaxCPoints, - 0.050, - 0.62, - 0.25, - 0.25, - 0.585, - 0.11, - 0.25, - 0.25 - }, - satProtectionThreshold(30), - saturatedOpacity(80), - strength(50), - balance(0), - hlColSat(60, 80, false), - shadowsColSat (80, 208, false), - clcurve{ - DCT_NURBS, - 0.00, - 0.00, - 0.35, - 0.65, - 1.00, - 1.00 - }, - cl2curve{ - DCT_NURBS, - 0.00, - 0.00, - 0.35, - 0.65, - 1.00, - 1.00 - }, - method("Lab"), - twocolor("Std"), - redlow(0.0), - greenlow(0.0), - bluelow(0.0), - redmed(0.0), - greenmed(0.0), - bluemed(0.0), - redhigh(0.0), - greenhigh(0.0), - bluehigh(0.0), - satlow(0.0), - sathigh(0.0), - lumamode(true) -{ -} - -bool ColorToningParams::operator ==(const ColorToningParams& other) const -{ - return - enabled == other.enabled - && autosat == other.autosat - && opacityCurve == other.opacityCurve - && colorCurve == other.colorCurve - && satProtectionThreshold == other.satProtectionThreshold - && saturatedOpacity == other.saturatedOpacity - && strength == other.strength - && balance == other.balance - && hlColSat == other.hlColSat - && shadowsColSat == other.shadowsColSat - && clcurve == other.clcurve - && cl2curve == other.cl2curve - && method == other.method - && twocolor == other.twocolor - && redlow == other.redlow - && greenlow == other.greenlow - && bluelow == other.bluelow - && redmed == other.redmed - && greenmed == other.greenmed - && bluemed == other.bluemed - && redhigh == other.redhigh - && greenhigh == other.greenhigh - && bluehigh == other.bluehigh - && satlow == other.satlow - && sathigh == other.sathigh - && lumamode == other.lumamode; -} - -bool ColorToningParams::operator !=(const ColorToningParams& other) const -{ - return !(*this == other); -} - -void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vector& opacityCurve) const -{ - // check if non null first - if (!redlow && !greenlow && !bluelow && !redmed && !greenmed && !bluemed && !redhigh && !greenhigh && !bluehigh) { - colorCurve.resize (1); - colorCurve.at (0) = FCT_Linear; - opacityCurve.resize (1); - opacityCurve.at (0) = FCT_Linear; - return; - } - - float low[3]; // RGB color for shadows - float med[3]; // RGB color for mid-tones - float high[3]; // RGB color for highlights - float lowSat = 0.f; - float medSat = 0.f; - float highSat = 0.f; - float minTmp, maxTmp; - -// Fill the shadow mixer values of the Color TOning tool - low[0] = float (redlow ) / 100.f; // [-1. ; +1.] - low[1] = float (greenlow) / 100.f; // [-1. ; +1.] - low[2] = float (bluelow ) / 100.f; // [-1. ; +1.] - minTmp = min (low[0], low[1], low[2]); - maxTmp = max (low[0], low[1], low[2]); - - if (maxTmp - minTmp > 0.005f) { - float v[3]; - lowSat = (maxTmp - minTmp) / 2.f; - - if (low[0] == minTmp) { - v[0] = 0.f; - } else if (low[1] == minTmp) { - v[1] = 0.f; - } else if (low[2] == minTmp) { - v[2] = 0.f; - } - - if (low[0] == maxTmp) { - v[0] = 1.f; - } else if (low[1] == maxTmp) { - v[1] = 1.f; - } else if (low[2] == maxTmp) { - v[2] = 1.f; - } - - if (low[0] != minTmp && low[0] != maxTmp) { - v[0] = (low[0] - minTmp) / (maxTmp - minTmp); - } else if (low[1] != minTmp && low[1] != maxTmp) { - v[1] = (low[1] - minTmp) / (maxTmp - minTmp); - } else if (low[2] != minTmp && low[2] != maxTmp) { - v[2] = (low[2] - minTmp) / (maxTmp - minTmp); - } - - low[0] = v[0]; - low[1] = v[1]; - low[2] = v[2]; - } else { - low[0] = low[1] = low[2] = 1.f; - } - -// Fill the mid-tones mixer values of the Color TOning tool - med[0] = float (redmed ) / 100.f; // [-1. ; +1.] - med[1] = float (greenmed) / 100.f; // [-1. ; +1.] - med[2] = float (bluemed ) / 100.f; // [-1. ; +1.] - minTmp = min (med[0], med[1], med[2]); - maxTmp = max (med[0], med[1], med[2]); - - if (maxTmp - minTmp > 0.005f) { - float v[3]; - medSat = (maxTmp - minTmp) / 2.f; - - if (med[0] == minTmp) { - v[0] = 0.f; - } else if (med[1] == minTmp) { - v[1] = 0.f; - } else if (med[2] == minTmp) { - v[2] = 0.f; - } - - if (med[0] == maxTmp) { - v[0] = 1.f; - } else if (med[1] == maxTmp) { - v[1] = 1.f; - } else if (med[2] == maxTmp) { - v[2] = 1.f; - } - - if (med[0] != minTmp && med[0] != maxTmp) { - v[0] = (med[0] - minTmp) / (maxTmp - minTmp); - } else if (med[1] != minTmp && med[1] != maxTmp) { - v[1] = (med[1] - minTmp) / (maxTmp - minTmp); - } else if (med[2] != minTmp && med[2] != maxTmp) { - v[2] = (med[2] - minTmp) / (maxTmp - minTmp); - } - - med[0] = v[0]; - med[1] = v[1]; - med[2] = v[2]; - } else { - med[0] = med[1] = med[2] = 1.f; - } - - // Fill the highlight mixer values of the Color TOning tool - high[0] = float (redhigh ) / 100.f; // [-1. ; +1.] - high[1] = float (greenhigh) / 100.f; // [-1. ; +1.] - high[2] = float (bluehigh ) / 100.f; // [-1. ; +1.] - minTmp = min (high[0], high[1], high[2]); - maxTmp = max (high[0], high[1], high[2]); - - if (maxTmp - minTmp > 0.005f) { - float v[3]; - highSat = (maxTmp - minTmp) / 2.f; - - if (high[0] == minTmp) { - v[0] = 0.f; - } else if (high[1] == minTmp) { - v[1] = 0.f; - } else if (high[2] == minTmp) { - v[2] = 0.f; - } - - if (high[0] == maxTmp) { - v[0] = 1.f; - } else if (high[1] == maxTmp) { - v[1] = 1.f; - } else if (high[2] == maxTmp) { - v[2] = 1.f; - } - - if (high[0] != minTmp && high[0] != maxTmp) { - v[0] = (high[0] - minTmp) / (maxTmp - minTmp); - } else if (high[1] != minTmp && high[1] != maxTmp) { - v[1] = (high[1] - minTmp) / (maxTmp - minTmp); - } else if (high[2] != minTmp && high[2] != maxTmp) { - v[2] = (high[2] - minTmp) / (maxTmp - minTmp); - } - - high[0] = v[0]; - high[1] = v[1]; - high[2] = v[2]; - } else { - high[0] = high[1] = high[2] = 1.f; - } - - const double xPosLow = 0.1; - const double xPosMed = 0.4; - const double xPosHigh = 0.7; - - colorCurve.resize ( medSat != 0.f ? 13 : 9 ); - colorCurve.at (0) = FCT_MinMaxCPoints; - opacityCurve.resize (13); - opacityCurve.at (0) = FCT_MinMaxCPoints; - - float h, s, l; - int idx = 1; - - if (lowSat == 0.f) { - if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); - } else { // highSat can't be null if the 2 other ones are! - Color::rgb2hsl (high[0], high[1], high[2], h, s, l); - } - } else { - Color::rgb2hsl (low[0], low[1], low[2], h, s, l); - } - - colorCurve.at (idx++) = xPosLow; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx++) = 0.35; - - if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); - colorCurve.at (idx++) = xPosMed; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx++) = 0.35; - } - - if (highSat == 0.f) { - if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); - } else { // lowSat can't be null if the 2 other ones are! - Color::rgb2hsl (low[0], low[1], low[2], h, s, l); - } - } else { - Color::rgb2hsl (high[0], high[1], high[2], h, s, l); - } - - colorCurve.at (idx++) = xPosHigh; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx) = 0.35; - - opacityCurve.at (1) = xPosLow; - opacityCurve.at (2) = double (lowSat); - opacityCurve.at (3) = 0.35; - opacityCurve.at (4) = 0.35; - opacityCurve.at (5) = xPosMed; - opacityCurve.at (6) = double (medSat); - opacityCurve.at (7) = 0.35; - opacityCurve.at (8) = 0.35; - opacityCurve.at (9) = xPosHigh; - opacityCurve.at (10) = double (highSat); - opacityCurve.at (11) = 0.35; - opacityCurve.at (12) = 0.35; -} - -void ColorToningParams::slidersToCurve(std::vector& colorCurve, std::vector& opacityCurve) const -{ - if (hlColSat.getBottom() == 0 && shadowsColSat.getBottom() == 0) { // if both opacity are null, set both curves to Linear - colorCurve.resize (1); - colorCurve.at (0) = FCT_Linear; - opacityCurve.resize (1); - opacityCurve.at (0) = FCT_Linear; - return; - } - - colorCurve.resize (9); - colorCurve.at (0) = FCT_MinMaxCPoints; - colorCurve.at (1) = 0.26 + 0.12 * double (balance) / 100.; - colorCurve.at (2) = double (shadowsColSat.getTop()) / 360.; - colorCurve.at (3) = 0.35; - colorCurve.at (4) = 0.35; - colorCurve.at (5) = 0.64 + 0.12 * double (balance) / 100.; - colorCurve.at (6) = double (hlColSat.getTop()) / 360.; - colorCurve.at (7) = 0.35; - colorCurve.at (8) = 0.35; - - opacityCurve.resize (9); - opacityCurve.at (0) = FCT_MinMaxCPoints; - opacityCurve.at (1) = colorCurve.at (1); - opacityCurve.at (2) = double (shadowsColSat.getBottom()) / 100.; - opacityCurve.at (3) = 0.35; - opacityCurve.at (4) = 0.35; - opacityCurve.at (5) = colorCurve.at (5); - opacityCurve.at (6) = double (hlColSat.getBottom()) / 100.; - opacityCurve.at (7) = 0.35; - opacityCurve.at (8) = 0.35; -} - -void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurve& opacityCurveLUT, const double xyz_rgb[3][3], bool& opautili) const -{ - float satur = 0.8f; - float lumin = 0.5f; //middle of luminance for optimization of gamut - no real importance...as we work in XYZ and gamut control - - // Transform slider values to control points - std::vector cCurve, oCurve; - - if (method == "RGBSliders" || method == "Splitlr") { - slidersToCurve (cCurve, oCurve); - } else if (method == "Splitco") { - mixerToCurve (cCurve, oCurve); - } else { - cCurve = this->colorCurve; - oCurve = this->opacityCurve; - } - - if (method == "Lab") { - if (twocolor == "Separ") { - satur = 0.9f; - } - - if (twocolor == "All" || twocolor == "Two") { - satur = 0.9f; - } - - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); - opacityCurveLUT.Set (oCurve, opautili); - } else if (method == "Splitlr" || method == "Splitco") { - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); - opacityCurveLUT.Set (oCurve, opautili); - } else if (method.substr (0, 3) == "RGB") { - colorCurveLUT.SetRGB (cCurve); - opacityCurveLUT.Set (oCurve, opautili); - } -} - -SharpeningParams::SharpeningParams() : - enabled(false), - radius(0.5), - amount(200), - threshold(20, 80, 2000, 1200, false), - edgesonly(false), - edges_radius(1.9), - edges_tolerance(1800), - halocontrol(false), - halocontrol_amount(85), - method("usm"), - deconvamount(75), - deconvradius(0.75), - deconviter(30), - deconvdamping(20) -{ -} - -bool SharpeningParams::operator ==(const SharpeningParams& other) const -{ - return - enabled == other.enabled - && radius == other.radius - && amount == other.amount - && threshold == other.threshold - && edgesonly == other.edgesonly - && edges_radius == other.edges_radius - && edges_tolerance == other.edges_tolerance - && halocontrol == other.halocontrol - && halocontrol_amount == other.halocontrol_amount - && method == other.method - && deconvamount == other.deconvamount - && deconvradius == other.deconvradius - && deconviter == other.deconviter - && deconvdamping == other.deconvdamping; -} - -bool SharpeningParams::operator !=(const SharpeningParams& other) const -{ - return !(*this == other); -} - -SharpenEdgeParams::SharpenEdgeParams() : - enabled(false), - passes(2), - amount(50.0), - threechannels(false) -{ -} - -bool SharpenEdgeParams::operator ==(const SharpenEdgeParams& other) const -{ - return - enabled == other.enabled - && passes == other.passes - && amount == other.amount - && threechannels == other.threechannels; -} - -bool SharpenEdgeParams::operator !=(const SharpenEdgeParams& other) const -{ - return !(*this == other); -} - -SharpenMicroParams::SharpenMicroParams() : - enabled(false), - matrix(false), - amount(20.0), - uniformity(50.0) -{ -} - -bool SharpenMicroParams::operator ==(const SharpenMicroParams& other) const -{ - return - enabled == other.enabled - && matrix == other.matrix - && amount == other.amount - && uniformity == other.uniformity; -} - -bool SharpenMicroParams::operator !=(const SharpenMicroParams& other) const -{ - return !(*this == other); -} - -VibranceParams::VibranceParams() : - enabled(false), - pastels(0), - saturated(0), - psthreshold(0, 75, false), - protectskins(false), - avoidcolorshift(true), - pastsattog(true), - skintonescurve{ - DCT_Linear - } -{ -} - -bool VibranceParams::operator ==(const VibranceParams& other) const -{ - return - enabled == other.enabled - && pastels == other.pastels - && saturated == other.saturated - && psthreshold == other.psthreshold - && protectskins == other.protectskins - && avoidcolorshift == other.avoidcolorshift - && pastsattog == other.pastsattog - && skintonescurve == other.skintonescurve; -} - -bool VibranceParams::operator !=(const VibranceParams& other) const -{ - return !(*this == other); -} - -WBParams::WBParams() : - method("Camera"), - temperature(6504), - green(1.0), - equal(1.0), - tempBias(0.0) -{ -} - -bool WBParams::operator ==(const WBParams& other) const -{ - return - method == other.method - && temperature == other.temperature - && green == other.green - && equal == other.equal - && tempBias == other.tempBias; -} - -bool WBParams::operator !=(const WBParams& other) const -{ - return !(*this == other); -} - -const std::vector& WBParams::getWbEntries() -{ - static const std::vector wb_entries = { - {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, - {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, - {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, - {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, - {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, - {"Water 1", WBEntry::Type::WATER, M("TP_WBALANCE_WATER1"), 35000, 0.3f, 1.1f, 0.f}, - {"Water 2", WBEntry::Type::WATER, M("TP_WBALANCE_WATER2"), 48000, 0.63f, 1.38f, 0.f}, - {"Tungsten", WBEntry::Type::TUNGSTEN, M("TP_WBALANCE_TUNGSTEN"), 2856, 1.f, 1.f, 0.f}, - {"Fluo F1", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO1"), 6430, 1.f, 1.f, 0.f}, - {"Fluo F2", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO2"), 4230, 1.f, 1.f, 0.f}, - {"Fluo F3", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO3"), 3450, 1.f, 1.f, 0.f}, - {"Fluo F4", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO4"), 2940, 1.f, 1.f, 0.f}, - {"Fluo F5", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO5"), 6350, 1.f, 1.f, 0.f}, - {"Fluo F6", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO6"), 4150, 1.f, 1.f, 0.f}, - {"Fluo F7", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO7"), 6500, 1.f, 1.f, 0.f}, - {"Fluo F8", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO8"), 5020, 1.f, 1.f, 0.f}, - {"Fluo F9", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO9"), 4330, 1.f, 1.f, 0.f}, - {"Fluo F10", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO10"), 5300, 1.f, 1.f, 0.f}, - {"Fluo F11", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO11"), 4000, 1.f, 1.f, 0.f}, - {"Fluo F12", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO12"), 3000, 1.f, 1.f, 0.f}, - {"HMI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_HMI"), 4800, 1.f, 1.f, 0.f}, - {"GTI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_GTI"), 5000, 1.f, 1.f, 0.f}, - {"JudgeIII Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_JUDGEIII"), 5100, 1.f, 1.f, 0.f}, - {"Solux Lamp 3500K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX35"), 3480, 1.f, 1.f, 0.f}, - {"Solux Lamp 4100K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX41"), 3930, 1.f, 1.f, 0.f}, - {"Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47"), 4700, 1.f, 1.f, 0.f}, - {"NG Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47_NG"), 4480, 1.f, 1.f, 0.f}, - {"LED LSI Lumelex 2040", WBEntry::Type::LED, M("TP_WBALANCE_LED_LSI"), 2970, 1.f, 1.f, 0.f}, - {"LED CRS SP12 WWMR16", WBEntry::Type::LED, M("TP_WBALANCE_LED_CRS"), 3050, 1.f, 1.f, 0.f}, - {"Flash 5500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH55"), 5500, 1.f, 1.f, 0.f}, - {"Flash 6000K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH60"), 6000, 1.f, 1.f, 0.f}, - {"Flash 6500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH65"), 6500, 1.f, 1.f, 0.f}, - // Should remain the last one - {"Custom", WBEntry::Type::CUSTOM, M ("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} - }; - - return wb_entries; -} - -ColorAppearanceParams::ColorAppearanceParams() : - enabled(false), - degree(90), - autodegree(true), - degreeout(90), - autodegreeout(true), - curve{ - DCT_Linear - }, - curve2{ - DCT_Linear - }, - curve3{ - DCT_Linear - }, - curveMode(TcMode::LIGHT), - curveMode2(TcMode::LIGHT), - curveMode3(CtcMode::CHROMA), - surround("Average"), - surrsrc("Average"), - adapscen(2000.0), - autoadapscen(true), - ybscen(18), - autoybscen(true), - adaplum(16), - badpixsl(0), - wbmodel("RawT"), - algo("No"), - contrast(0.0), - qcontrast(0.0), - jlight(0.0), - qbright(0.0), - chroma(0.0), - schroma(0.0), - mchroma(0.0), - colorh(0.0), - rstprotection(0.0), - surrsource(false), - gamut(true), - datacie(false), - tonecie(false), - tempout(5000), - ybout(18), - greenout(1.0), - tempsc(5000), - greensc(1.0) -{ -} - -bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) const -{ - return - enabled == other.enabled - && degree == other.degree - && autodegree == other.autodegree - && degreeout == other.degreeout - && autodegreeout == other.autodegreeout - && curve == other.curve - && curve2 == other.curve2 - && curve3 == other.curve3 - && curveMode == other.curveMode - && curveMode2 == other.curveMode2 - && curveMode3 == other.curveMode3 - && surround == other.surround - && surrsrc == other.surrsrc - && adapscen == other.adapscen - && autoadapscen == other.autoadapscen - && ybscen == other.ybscen - && autoybscen == other.autoybscen - && adaplum == other.adaplum - && badpixsl == other.badpixsl - && wbmodel == other.wbmodel - && algo == other.algo - && contrast == other.contrast - && qcontrast == other.qcontrast - && jlight == other.jlight - && qbright == other.qbright - && chroma == other.chroma - && schroma == other.schroma - && mchroma == other.mchroma - && colorh == other.colorh - && rstprotection == other.rstprotection - && surrsource == other.surrsource - && gamut == other.gamut - && datacie == other.datacie - && tonecie == other.tonecie - && tempout == other.tempout - && ybout == other.ybout - && greenout == other.greenout - && tempsc == other.tempsc - && greensc == other.greensc; -} - -bool ColorAppearanceParams::operator !=(const ColorAppearanceParams& other) const -{ - return !(*this == other); -} - -DefringeParams::DefringeParams() : - enabled(false), - radius(2.0), - threshold(13), - huecurve{ - FCT_MinMaxCPoints, - 0.166666667, - 0., - 0.35, - 0.35, - 0.347, - 0., - 0.35, - 0.35, - 0.513667426, - 0, - 0.35, - 0.35, - 0.668944571, - 0., - 0.35, - 0.35, - 0.8287775246, - 0.97835991, - 0.35, - 0.35, - 0.9908883827, - 0., - 0.35, - 0.35 - } -{ -} - -bool DefringeParams::operator ==(const DefringeParams& other) const -{ - return - enabled == other.enabled - && radius == other.radius - && threshold == other.threshold - && huecurve == other.huecurve; -} - -bool DefringeParams::operator !=(const DefringeParams& other) const -{ - return !(*this == other); -} - -ImpulseDenoiseParams::ImpulseDenoiseParams() : - enabled(false), - thresh(50) -{ -} - -bool ImpulseDenoiseParams::operator ==(const ImpulseDenoiseParams& other) const -{ - return - enabled == other.enabled - && thresh == other.thresh; -} - -bool ImpulseDenoiseParams::operator !=(const ImpulseDenoiseParams& other) const -{ - return !(*this == other); -} - -DirPyrDenoiseParams::DirPyrDenoiseParams() : - lcurve{ - FCT_MinMaxCPoints, - 0.05, - 0.15, - 0.35, - 0.35, - 0.55, - 0.04, - 0.35, - 0.35 - }, - cccurve{ - FCT_MinMaxCPoints, - 0.05, - 0.50, - 0.35, - 0.35, - 0.35, - 0.05, - 0.35, - 0.35 - }, - enabled(false), - enhance(false), - median(false), - perform(false), - luma(0), - Ldetail(0), - chroma(15), - redchro(0), - bluechro(0), - gamma(1.7), - dmethod("Lab"), - Lmethod("SLI"), - Cmethod("MAN"), - C2method("AUTO"), - smethod("shal"), - medmethod("soft"), - methodmed("none"), - rgbmethod("soft"), - passes(1) -{ -} - -bool DirPyrDenoiseParams::operator ==(const DirPyrDenoiseParams& other) const -{ - return - lcurve == other.lcurve - && cccurve == other.cccurve - && enabled == other.enabled - && enhance == other.enhance - && median == other.median - && perform == other.perform - && luma == other.luma - && Ldetail == other.Ldetail - && chroma == other.chroma - && redchro == other.redchro - && bluechro == other.bluechro - && gamma == other.gamma - && dmethod == other.dmethod - && Lmethod == other.Lmethod - && Cmethod == other.Cmethod - && C2method == other.C2method - && smethod == other.smethod - && medmethod == other.medmethod - && methodmed == other.methodmed - && rgbmethod == other.rgbmethod - && passes == other.passes; -} - -bool DirPyrDenoiseParams::operator !=(const DirPyrDenoiseParams& other) const -{ - return !(*this == other); -} - -void DirPyrDenoiseParams::getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const -{ - lCurve.Set(this->lcurve); - cCurve.Set(this->cccurve); -} - -EPDParams::EPDParams() : - enabled(false), - strength(0.5), - gamma(1.0), - edgeStopping(1.4), - scale(1.0), - reweightingIterates(0) -{ -} - -bool EPDParams::operator ==(const EPDParams& other) const -{ - return - enabled == other.enabled - && strength == other.strength - && gamma == other.gamma - && edgeStopping == other.edgeStopping - && scale == other.scale - && reweightingIterates == other.reweightingIterates; -} - -bool EPDParams::operator !=(const EPDParams& other) const -{ - return !(*this == other); -} - -FattalToneMappingParams::FattalToneMappingParams() : - enabled(false), - threshold(0), - amount(1) -{ -} - -bool FattalToneMappingParams::operator ==(const FattalToneMappingParams& other) const -{ - return - enabled == other.enabled - && threshold == other.threshold - && amount == other.amount; -} - -bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) const -{ - return !(*this == other); -} - -SHParams::SHParams() : - enabled(false), - hq(false), - highlights(0), - htonalwidth(80), - shadows(0), - stonalwidth(80), - localcontrast(0), - radius(40) -{ -} - -bool SHParams::operator ==(const SHParams& other) const -{ - return - enabled == other.enabled - && hq == other.hq - && highlights == other.highlights - && htonalwidth == other.htonalwidth - && shadows == other.shadows - && stonalwidth == other.stonalwidth - && localcontrast == other.localcontrast - && radius == other.radius; -} - -bool SHParams::operator !=(const SHParams& other) const -{ - return !(*this == other); -} - -CropParams::CropParams() : - enabled(false), - x(-1), - y(-1), - w(15000), - h(15000), - fixratio(true), - ratio("3:2"), - orientation("As Image"), - guide("Frame") -{ -} - -bool CropParams::operator ==(const CropParams& other) const -{ - return - enabled == other.enabled - && x == other.x - && y == other.y - && w == other.w - && h == other.h - && fixratio == other.fixratio - && ratio == other.ratio - && orientation == other.orientation - && guide == other.guide; -} - -bool CropParams::operator !=(const CropParams& other) const -{ - return !(*this == other); -} - -void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, int& x1, int& x2, int& y1, int& y2) const -{ - x1 = 0, x2 = resizedWidth, y1 = 0, y2 = resizedHeight; - - if (enabled) { - x1 = min(resizedWidth - 1, max (0, x / scale)); - y1 = min(resizedHeight - 1, max (0, y / scale)); - x2 = min(resizedWidth, max (0, (x + w) / scale)); - y2 = min(resizedHeight, max (0, (y + h) / scale)); - } -} - -CoarseTransformParams::CoarseTransformParams() : - rotate(0), - hflip(false), - vflip(false) -{ -} - -bool CoarseTransformParams::operator ==(const CoarseTransformParams& other) const -{ - return - rotate == other.rotate - && hflip == other.hflip - && vflip == other.vflip; -} - -bool CoarseTransformParams::operator !=(const CoarseTransformParams& other) const -{ - return !(*this == other); -} - -CommonTransformParams::CommonTransformParams() : - autofill(true) -{ -} - -bool CommonTransformParams::operator ==(const CommonTransformParams& other) const -{ - return autofill == other.autofill; -} - -bool CommonTransformParams::operator !=(const CommonTransformParams& other) const -{ - return !(*this == other); -} - -RotateParams::RotateParams() : - degree(0.0) -{ -} - -bool RotateParams::operator ==(const RotateParams& other) const -{ - return degree == other.degree; -} - -bool RotateParams::operator !=(const RotateParams& other) const -{ - return !(*this == other); -} - -DistortionParams::DistortionParams() : - amount(0.0) -{ -} - -bool DistortionParams::operator ==(const DistortionParams& other) const -{ - return amount == other.amount; -} - -bool DistortionParams::operator !=(const DistortionParams& other) const -{ - return !(*this == other); -} - -LensProfParams::LensProfParams() : - lcMode(LcMode::NONE), - useDist(true), - useVign(true), - useCA(false) -{ -} - -bool LensProfParams::operator ==(const LensProfParams& other) const -{ - return - lcMode == other.lcMode - && lcpFile == other.lcpFile - && useCA == other.useCA - && lfCameraMake == other.lfCameraMake - && lfCameraModel == other.lfCameraModel - && lfLens == other.lfLens; -} - -bool LensProfParams::operator !=(const LensProfParams& other) const -{ - return !(*this == other); -} - -bool LensProfParams::useLensfun() const -{ - return lcMode == LcMode::LENSFUNAUTOMATCH || lcMode == LcMode::LENSFUNMANUAL; -} - -bool LensProfParams::lfAutoMatch() const -{ - return lcMode == LcMode::LENSFUNAUTOMATCH; -} - -bool LensProfParams::useLcp() const -{ - return lcMode == LcMode::LCP && lcpFile.length() > 0; -} - -bool LensProfParams::lfManual() const -{ - return lcMode == LcMode::LENSFUNMANUAL; -} - -const std::vector& LensProfParams::getMethodStrings() const -{ - static const std::vector method_strings = { - "none", - "lfauto", - "lfmanual", - "lcp" - }; - return method_strings; -} - -Glib::ustring LensProfParams::getMethodString(LcMode mode) const -{ - return getMethodStrings()[toUnderlying(mode)]; -} - -LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode) const -{ - for (std::vector::size_type i = 0; i < getMethodStrings().size(); ++i) { - if (getMethodStrings()[i] == mode) { - return static_cast(i); - } - } - return LcMode::NONE; -} - -PerspectiveParams::PerspectiveParams() : - horizontal(0.0), - vertical(0.0) -{ -} - -bool PerspectiveParams::operator ==(const PerspectiveParams& other) const -{ - return - horizontal == other.horizontal - && vertical == other.vertical; -} - -bool PerspectiveParams::operator !=(const PerspectiveParams& other) const -{ - return !(*this == other); -} - -GradientParams::GradientParams() : - enabled(false), - degree(0.0), - feather(25), - strength(0.60), - centerX(0), - centerY(0) -{ -} - -bool GradientParams::operator ==(const GradientParams& other) const -{ - return - enabled == other.enabled - && degree == other.degree - && feather == other.feather - && strength == other.strength - && centerX == other.centerX - && centerY == other.centerY; -} - -bool GradientParams::operator !=(const GradientParams& other) const -{ - return !(*this == other); -} - -PCVignetteParams::PCVignetteParams() : - enabled(false), - strength(0.60), - feather(50), - roundness(50) -{ -} - -bool PCVignetteParams::operator ==(const PCVignetteParams& other) const -{ - return - enabled == other.enabled - && strength == other.strength - && feather == other.feather - && roundness == other.roundness; -} - -bool PCVignetteParams::operator !=(const PCVignetteParams& other) const -{ - return !(*this == other); -} - -VignettingParams::VignettingParams() : - amount(0), - radius(50), - strength(1), - centerX(0), - centerY(0) -{ -} - -bool VignettingParams::operator ==(const VignettingParams& other) const -{ - return - amount == other.amount - && radius == other.radius - && strength == other.strength - && centerX == other.centerX - && centerY == other.centerY; -} - -bool VignettingParams::operator !=(const VignettingParams& other) const -{ - return !(*this == other); -} - -ChannelMixerParams::ChannelMixerParams() : - red{ - 100, - 0, - 0 - }, - green{ - 0, - 100, - 0 - }, - blue{ - 0, - 0, - 100 - } -{ -} - -bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const -{ - for (unsigned int i = 0; i < 3; ++i) { - if ( - red[i] != other.red[i] - || green[i] != other.green[i] - || blue[i] != other.blue[i] - ) { - return false; - } - } - return true; -} - -bool ChannelMixerParams::operator !=(const ChannelMixerParams& other) const -{ - return !(*this == other); -} - -BlackWhiteParams::BlackWhiteParams() : - beforeCurve{ - DCT_Linear - }, - beforeCurveMode(BlackWhiteParams::TcMode::STD_BW), - afterCurve{ - DCT_Linear - }, - afterCurveMode(BlackWhiteParams::TcMode::STD_BW), - algo("SP"), - luminanceCurve{ - FCT_Linear - }, - autoc(false), - enabledcc(true), - enabled(false), - filter("None"), - setting("NormalContrast"), - method("Desaturation"), - mixerRed(33), - mixerOrange(33), - mixerYellow(33), - mixerGreen(33), - mixerCyan(33), - mixerBlue(33), - mixerMagenta(33), - mixerPurple(33), - gammaRed(0), - gammaGreen(0), - gammaBlue(0) -{ -} - -bool BlackWhiteParams::operator ==(const BlackWhiteParams& other) const -{ - return - beforeCurve == other.beforeCurve - && beforeCurveMode == other.beforeCurveMode - && afterCurve == other.afterCurve - && afterCurveMode == other.afterCurveMode - && algo == other.algo - && luminanceCurve == other.luminanceCurve - && autoc == other.autoc - && enabledcc == other.enabledcc - && enabled == other.enabled - && filter == other.filter - && setting == other.setting - && method == other.method - && mixerRed == other.mixerRed - && mixerOrange == other.mixerOrange - && mixerYellow == other.mixerYellow - && mixerGreen == other.mixerGreen - && mixerCyan == other.mixerCyan - && mixerBlue == other.mixerBlue - && mixerMagenta == other.mixerMagenta - && mixerPurple == other.mixerPurple - && gammaRed == other.gammaRed - && gammaGreen == other.gammaGreen - && gammaBlue == other.gammaBlue; -} - -bool BlackWhiteParams::operator !=(const BlackWhiteParams& other) const -{ - return !(*this == other); -} - -CACorrParams::CACorrParams() : - red(0.0), - blue(0.0) -{ -} - -bool CACorrParams::operator ==(const CACorrParams& other) const -{ - return - red == other.red - && blue == other.blue; -} - -bool CACorrParams::operator !=(const CACorrParams& other) const -{ - return !(*this == other); -} - -ResizeParams::ResizeParams() : - enabled(false), - scale(1.0), - appliesTo("Cropped area"), - method("Lanczos"), - dataspec(3), - width(900), - height(900) -{ -} - -bool ResizeParams::operator ==(const ResizeParams& other) const -{ - return - enabled == other.enabled - && scale == other.scale - && appliesTo == other.appliesTo - && method == other.method - && dataspec == other.dataspec - && width == other.width - && height == other.height; -} - -bool ResizeParams::operator !=(const ResizeParams& other) const -{ - return !(*this == other); -} - -const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring ("No ICM: sRGB output"); - -ColorManagementParams::ColorManagementParams() : - input("(cameraICC)"), - toneCurve(false), - applyLookTable(false), - applyBaselineExposureOffset(true), - applyHueSatMap(true), - dcpIlluminant(0), - working("ProPhoto"), - output("RT_sRGB"), - outputIntent(RI_RELATIVE), - outputBPC(true), - gamma("default"), - gampos(2.22), - slpos(4.5), - freegamma(false) -{ -} - -bool ColorManagementParams::operator ==(const ColorManagementParams& other) const -{ - return - input == other.input - && toneCurve == other.toneCurve - && applyLookTable == other.applyLookTable - && applyBaselineExposureOffset == other.applyBaselineExposureOffset - && applyHueSatMap == other.applyHueSatMap - && dcpIlluminant == other.dcpIlluminant - && working == other.working - && output == other.output - && outputIntent == other.outputIntent - && outputBPC == other.outputBPC - && gamma == other.gamma - && gampos == other.gampos - && slpos == other.slpos - && freegamma == other.freegamma; -} - -bool ColorManagementParams::operator !=(const ColorManagementParams& other) const -{ - return !(*this == other); -} - -WaveletParams::WaveletParams() : - ccwcurve{ - static_cast(FCT_MinMaxCPoints), - 0.0, - 0.25, - 0.35, - 0.35, - 0.50, - 0.75, - 0.35, - 0.35, - 0.90, - 0.0, - 0.35, - 0.35 - }, - opacityCurveRG{ - static_cast(FCT_MinMaxCPoints), - 0.0, - 0.50, - 0.35, - 0.35, - 1.00, - 0.50, - 0.35, - 0.35 - }, - opacityCurveBY{ - static_cast(FCT_MinMaxCPoints), - 0.0, - 0.50, - 0.35, - 0.35, - 1.00, - 0.50, - 0.35, - 0.35 - }, - opacityCurveW{ - static_cast(FCT_MinMaxCPoints), - 0.00, - 0.35, - 0.35, - 0.00, - 0.35, - 0.75, - 0.35, - 0.35, - 0.60, - 0.75, - 0.35, - 0.35, - 1.00, - 0.35, - 0.00, - 0.00 - }, - opacityCurveWL{ - static_cast(FCT_MinMaxCPoints), - 0.0, - 0.50, - 0.35, - 0.35, - 1.00, - 0.50, - 0.35, - 0.35 - }, - hhcurve{ - FCT_Linear - }, - Chcurve{ - FCT_Linear - }, - wavclCurve { - DCT_Linear - }, - enabled(false), - median(false), - medianlev(false), - linkedg(true), - cbenab(false), - greenlow(0), - bluelow(0), - greenmed(0), - bluemed(0), - greenhigh(0), - bluehigh(0), - lipst(false), - avoid(false), - tmr(false), - strength(100), - balance(0), - iter(0), - expcontrast(false), - expchroma(false), - c{}, - ch{}, - expedge(false), - expresid(false), - expfinal(false), - exptoning(false), - expnoise(false), - Lmethod("4_"), - CLmethod("all"), - Backmethod("grey"), - Tilesmethod("full"), - daubcoeffmethod("4_"), - CHmethod("without"), - Medgreinf("less"), - CHSLmethod("SL"), - EDmethod("CU"), - NPmethod("none"), - BAmethod("none"), - TMmethod("cont"), - Dirmethod("all"), - HSmethod("with"), - rescon(0), - resconH(0), - reschro(0), - tmrs(0), - gamma(1), - sup(0), - sky(0.0), - thres(7), - chroma(5), - chro(0), - threshold(5), - threshold2(4), - edgedetect(90), - edgedetectthr(20), - edgedetectthr2(0), - edgesensi(60), - edgeampli(10), - contrast(0), - edgrad(15), - edgval(0), - edgthresh(10), - thr(35), - thrH(65), - skinprotect(0.0), - hueskin(-5, 25, 170, 120, false), - hueskin2(-260, -250, -130, -140, false), - hllev(50, 75, 100, 98, false), - bllev(0, 2, 50, 25, false), - pastlev(0, 2, 30, 20, false), - satlev(30, 45, 130, 100, false), - edgcont(0, 10, 75, 40, false), - level0noise(0, 0, false), - level1noise(0, 0, false), - level2noise(0, 0, false), - level3noise(0, 0, false) -{ -} - -bool WaveletParams::operator ==(const WaveletParams& other) const -{ - return - ccwcurve == other.ccwcurve - && opacityCurveRG == other.opacityCurveRG - && opacityCurveBY == other.opacityCurveBY - && opacityCurveW == other.opacityCurveW - && opacityCurveWL == other.opacityCurveWL - && hhcurve == other.hhcurve - && Chcurve == other.Chcurve - && wavclCurve == other.wavclCurve - && enabled == other.enabled - && median == other.median - && medianlev == other.medianlev - && linkedg == other.linkedg - && cbenab == other.cbenab - && greenlow == other.greenlow - && bluelow == other.bluelow - && greenmed == other.greenmed - && bluemed == other.bluemed - && greenhigh == other.greenhigh - && bluehigh == other.bluehigh - && lipst == other.lipst - && avoid == other.avoid - && tmr == other.tmr - && strength == other.strength - && balance == other.balance - && iter == other.iter - && expcontrast == other.expcontrast - && expchroma == other.expchroma - && [this, &other]() -> bool - { - for (unsigned int i = 0; i < 9; ++i) { - if (c[i] != other.c[i] || ch[i] != other.ch[i]) { - return false; - } - } - return true; - }() - && expedge == other.expedge - && expresid == other.expresid - && expfinal == other.expfinal - && exptoning == other.exptoning - && expnoise == other.expnoise - && Lmethod == other.Lmethod - && CLmethod == other.CLmethod - && Backmethod == other.Backmethod - && Tilesmethod == other.Tilesmethod - && daubcoeffmethod == other.daubcoeffmethod - && CHmethod == other.CHmethod - && Medgreinf == other.Medgreinf - && CHSLmethod == other.CHSLmethod - && EDmethod == other.EDmethod - && NPmethod == other.NPmethod - && BAmethod == other.BAmethod - && TMmethod == other.TMmethod - && Dirmethod == other.Dirmethod - && HSmethod == other.HSmethod - && rescon == other.rescon - && resconH == other.resconH - && reschro == other.reschro - && tmrs == other.tmrs - && gamma == other.gamma - && sup == other.sup - && sky == other.sky - && thres == other.thres - && chroma == other.chroma - && chro == other.chro - && threshold == other.threshold - && threshold2 == other.threshold2 - && edgedetect == other.edgedetect - && edgedetectthr == other.edgedetectthr - && edgedetectthr2 == other.edgedetectthr2 - && edgesensi == other.edgesensi - && edgeampli == other.edgeampli - && contrast == other.contrast - && edgrad == other.edgrad - && edgval == other.edgval - && edgthresh == other.edgthresh - && thr == other.thr - && thrH == other.thrH - && skinprotect == other.skinprotect - && hueskin == other.hueskin - && hueskin2 == other.hueskin2 - && hllev == other.hllev - && bllev == other.bllev - && pastlev == other.pastlev - && satlev == other.satlev - && edgcont == other.edgcont - && level0noise == other.level0noise - && level1noise == other.level1noise - && level2noise == other.level2noise - && level3noise == other.level3noise; -} - -bool WaveletParams::operator !=(const WaveletParams& other) const -{ - return !(*this == other); -} - -void WaveletParams::getCurves( - WavCurve& cCurve, - WavOpacityCurveRG& opacityCurveLUTRG, - WavOpacityCurveBY& opacityCurveLUTBY, - WavOpacityCurveW& opacityCurveLUTW, - WavOpacityCurveWL& opacityCurveLUTWL -) const -{ - cCurve.Set (this->ccwcurve); - opacityCurveLUTRG.Set (this->opacityCurveRG); - opacityCurveLUTBY.Set (this->opacityCurveBY); - opacityCurveLUTW.Set (this->opacityCurveW); - opacityCurveLUTWL.Set (this->opacityCurveWL); - -} - -DirPyrEqualizerParams::DirPyrEqualizerParams() : - enabled(false), - gamutlab(false), - mult{ - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0 - }, - threshold(0.2), - skinprotect(0.0), - hueskin (-5, 25, 170, 120, false), - cbdlMethod("bef") -{ -} - -bool DirPyrEqualizerParams::operator ==(const DirPyrEqualizerParams& other) const -{ - return - enabled == other.enabled - && gamutlab == other.gamutlab - && [this, &other]() -> bool - { - for (unsigned int i = 0; i < 6; ++i) { - if (mult[i] != other.mult[i]) { - return false; - } - } - return true; - }() - && threshold == other.threshold - && skinprotect == other.skinprotect - && hueskin == other.hueskin - && cbdlMethod == other.cbdlMethod; -} - -bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) const -{ - return !(*this == other); -} - -HSVEqualizerParams::HSVEqualizerParams() : - hcurve{ - FCT_Linear - }, - scurve{ - FCT_Linear - }, - vcurve{ - FCT_Linear - } -{ -} - -bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const -{ - return - hcurve == other.hcurve - && scurve == other.scurve - && vcurve == other.vcurve; -} - -bool HSVEqualizerParams::operator !=(const HSVEqualizerParams& other) const -{ - return !(*this == other); -} - -FilmSimulationParams::FilmSimulationParams() : - enabled(false), - strength(100) -{ -} - -bool FilmSimulationParams::operator ==(const FilmSimulationParams& other) const -{ - return - enabled == other.enabled - && clutFilename == other.clutFilename - && strength == other.strength; -} - -bool FilmSimulationParams::operator !=(const FilmSimulationParams& other) const -{ - return !(*this == other); -} - -RAWParams::BayerSensor::BayerSensor() : - method(getMethodString(Method::AMAZE)), - imageNum(0), - ccSteps(0), - black0(0.0), - black1(0.0), - black2(0.0), - black3(0.0), - twogreen(true), - linenoise(0), - greenthresh(0), - dcb_iterations(2), - lmmse_iterations(2), - pixelShiftMotion(0), - pixelShiftMotionCorrection(PSMotionCorrection::GRID_3X3_NEW), - pixelShiftMotionCorrectionMethod(PSMotionCorrectionMethod::AUTO), - pixelShiftStddevFactorGreen(5.0), - pixelShiftStddevFactorRed(5.0), - pixelShiftStddevFactorBlue(5.0), - pixelShiftEperIso(0.0), - pixelShiftNreadIso(0.0), - pixelShiftPrnu(1.0), - pixelShiftSigma(1.0), - pixelShiftSum(3.0), - pixelShiftRedBlueWeight(0.7), - pixelShiftShowMotion(false), - pixelShiftShowMotionMaskOnly(false), - pixelShiftAutomatic(true), - pixelShiftNonGreenHorizontal(false), - pixelShiftNonGreenVertical(false), - pixelShiftHoleFill(true), - pixelShiftMedian(false), - pixelShiftMedian3(false), - pixelShiftGreen(true), - pixelShiftBlur(true), - pixelShiftSmoothFactor(0.7), - pixelShiftExp0(false), - pixelShiftLmmse(false), - pixelShiftOneGreen(false), - pixelShiftEqualBright(false), - pixelShiftEqualBrightChannel(false), - pixelShiftNonGreenCross(true), - pixelShiftNonGreenCross2(false), - pixelShiftNonGreenAmaze(false), - dcb_enhance(true) -{ -} - -bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const -{ - return - method == other.method - && imageNum == other.imageNum - && ccSteps == other.ccSteps - && black0 == other.black0 - && black1 == other.black1 - && black2 == other.black2 - && black3 == other.black3 - && twogreen == other.twogreen - && linenoise == other.linenoise - && greenthresh == other.greenthresh - && dcb_iterations == other.dcb_iterations - && lmmse_iterations == other.lmmse_iterations - && pixelShiftMotion == other.pixelShiftMotion - && pixelShiftMotionCorrection == other.pixelShiftMotionCorrection - && pixelShiftMotionCorrectionMethod == other.pixelShiftMotionCorrectionMethod - && pixelShiftStddevFactorGreen == other.pixelShiftStddevFactorGreen - && pixelShiftStddevFactorRed == other.pixelShiftStddevFactorRed - && pixelShiftStddevFactorBlue == other.pixelShiftStddevFactorBlue - && pixelShiftEperIso == other.pixelShiftEperIso - && pixelShiftNreadIso == other.pixelShiftNreadIso - && pixelShiftPrnu == other.pixelShiftPrnu - && pixelShiftSigma == other.pixelShiftSigma - && pixelShiftSum == other.pixelShiftSum - && pixelShiftRedBlueWeight == other.pixelShiftRedBlueWeight - && pixelShiftShowMotion == other.pixelShiftShowMotion - && pixelShiftShowMotionMaskOnly == other.pixelShiftShowMotionMaskOnly - && pixelShiftAutomatic == other.pixelShiftAutomatic - && pixelShiftNonGreenHorizontal == other.pixelShiftNonGreenHorizontal - && pixelShiftNonGreenVertical == other.pixelShiftNonGreenVertical - && pixelShiftHoleFill == other.pixelShiftHoleFill - && pixelShiftMedian == other.pixelShiftMedian - && pixelShiftMedian3 == other.pixelShiftMedian3 - && pixelShiftGreen == other.pixelShiftGreen - && pixelShiftBlur == other.pixelShiftBlur - && pixelShiftSmoothFactor == other.pixelShiftSmoothFactor - && pixelShiftExp0 == other.pixelShiftExp0 - && pixelShiftLmmse == other.pixelShiftLmmse - && pixelShiftOneGreen == other.pixelShiftOneGreen - && pixelShiftEqualBright == other.pixelShiftEqualBright - && pixelShiftEqualBrightChannel == other.pixelShiftEqualBrightChannel - && pixelShiftNonGreenCross == other.pixelShiftNonGreenCross - && pixelShiftNonGreenCross2 == other.pixelShiftNonGreenCross2 - && pixelShiftNonGreenAmaze == other.pixelShiftNonGreenAmaze - && dcb_enhance == other.dcb_enhance; -} - -bool RAWParams::BayerSensor::operator !=(const BayerSensor& other) const -{ - return !(*this == other); -} - -void RAWParams::BayerSensor::setPixelShiftDefaults() -{ - pixelShiftMotion = 0; - pixelShiftMotionCorrection = RAWParams::BayerSensor::PSMotionCorrection::GRID_3X3_NEW; - pixelShiftMotionCorrectionMethod = RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO; - pixelShiftStddevFactorGreen = 5.0; - pixelShiftStddevFactorRed = 5.0; - pixelShiftStddevFactorBlue = 5.0; - pixelShiftEperIso = 0.0; - pixelShiftNreadIso = 0.0; - pixelShiftPrnu = 1.0; - pixelShiftSigma = 1.0; - pixelShiftSum = 3.0; - pixelShiftRedBlueWeight = 0.7; - pixelShiftAutomatic = true; - pixelShiftNonGreenHorizontal = false; - pixelShiftNonGreenVertical = false; - pixelShiftHoleFill = true; - pixelShiftMedian = false; - pixelShiftMedian3 = false; - pixelShiftGreen = true; - pixelShiftBlur = true; - pixelShiftSmoothFactor = 0.7; - pixelShiftExp0 = false; - pixelShiftLmmse = false; - pixelShiftOneGreen = false; - pixelShiftEqualBright = false; - pixelShiftEqualBrightChannel = false; - pixelShiftNonGreenCross = true; - pixelShiftNonGreenCross2 = false; - pixelShiftNonGreenAmaze = false; -} - -const std::vector& RAWParams::BayerSensor::getMethodStrings() -{ - static const std::vector method_strings { - "amaze", - "igv", - "lmmse", - "eahd", - "hphd", - "vng4", - "dcb", - "ahd", - "rcd", - "fast", - "mono", - "none", - "pixelshift" - }; - return method_strings; -} - -Glib::ustring RAWParams::BayerSensor::getMethodString(Method method) -{ - return getMethodStrings()[toUnderlying(method)]; -} - -RAWParams::XTransSensor::XTransSensor() : - method(getMethodString(Method::THREE_PASS)), - ccSteps(0), - blackred(0.0), - blackgreen(0.0), - blackblue(0.0) -{ -} - -bool RAWParams::XTransSensor::operator ==(const XTransSensor& other) const -{ - return - method == other.method - && ccSteps == other.ccSteps - && blackred == other.blackred - && blackgreen == other.blackgreen - && blackblue == other.blackblue; -} - -bool RAWParams::XTransSensor::operator !=(const XTransSensor& other) const -{ - return !(*this == other); -} - -const std::vector& RAWParams::XTransSensor::getMethodStrings() -{ - static const std::vector method_strings { - "3-pass (best)", - "1-pass (medium)", - "fast", - "mono", - "none" - }; - return method_strings; -} - -Glib::ustring RAWParams::XTransSensor::getMethodString(Method method) -{ - return getMethodStrings()[toUnderlying(method)]; -} - -RAWParams::RAWParams() : - df_autoselect(false), - ff_AutoSelect(false), - ff_BlurRadius(32), - ff_BlurType(getFlatFieldBlurTypeString(FlatFieldBlurType::AREA)), - ff_AutoClipControl(false), - ff_clipControl(0), - ca_autocorrect(false), - cared(0.0), - cablue(0.0), - expos(1.0), - preser(0.0), - hotPixelFilter(false), - deadPixelFilter(false), - hotdeadpix_thresh(100) -{ -} - -bool RAWParams::operator ==(const RAWParams& other) const -{ - return - bayersensor == other.bayersensor - && xtranssensor == other.xtranssensor - && dark_frame == other.dark_frame - && df_autoselect == other.df_autoselect - && ff_file == other.ff_file - && ff_AutoSelect == other.ff_AutoSelect - && ff_BlurRadius == other.ff_BlurRadius - && ff_BlurType == other.ff_BlurType - && ff_AutoClipControl == other.ff_AutoClipControl - && ff_clipControl == other.ff_clipControl - && ca_autocorrect == other.ca_autocorrect - && cared == other.cared - && cablue == other.cablue - && expos == other.expos - && preser == other.preser - && hotPixelFilter == other.hotPixelFilter - && deadPixelFilter == other.deadPixelFilter - && hotdeadpix_thresh == other.hotdeadpix_thresh; -} - -bool RAWParams::operator !=(const RAWParams& other) const -{ - return !(*this == other); -} - -const std::vector& RAWParams::getFlatFieldBlurTypeStrings() -{ - static const std::vector blur_type_strings { - "Area Flatfield", - "Vertical Flatfield", - "Horizontal Flatfield", - "V+H Flatfield" - }; - return blur_type_strings; -} - -Glib::ustring RAWParams::getFlatFieldBlurTypeString(FlatFieldBlurType type) -{ - return getFlatFieldBlurTypeStrings()[toUnderlying(type)]; -} - -ProcParams::ProcParams () -{ - setDefaults (); -} - -void ProcParams::setDefaults () -{ - toneCurve = ToneCurveParams(); - - labCurve = LCurveParams(); - - rgbCurves = RGBCurvesParams(); - - colorToning = ColorToningParams(); - - sharpenEdge = SharpenEdgeParams(); - - sharpenMicro = SharpenMicroParams(); - - sharpening = SharpeningParams(); - - prsharpening = SharpeningParams(); - prsharpening.method = "rld"; - prsharpening.deconvamount = 100; - prsharpening.deconvradius = 0.45; - prsharpening.deconviter = 100; - prsharpening.deconvdamping = 0; - - vibrance = VibranceParams(); - - wb = WBParams(); - - colorappearance = ColorAppearanceParams(); - - defringe = DefringeParams(); - - impulseDenoise = ImpulseDenoiseParams(); - - dirpyrDenoise = DirPyrDenoiseParams(); - - epd = EPDParams(); - - fattal = FattalToneMappingParams(); - - sh = SHParams(); - - crop = CropParams(); - - coarse = CoarseTransformParams(); - - commonTrans = CommonTransformParams(); - - rotate = RotateParams(); - - distortion = DistortionParams(); - - lensProf = LensProfParams(); - - perspective = PerspectiveParams(); - - gradient = GradientParams(); - - pcvignette = PCVignetteParams(); - - vignetting = VignettingParams(); - - chmixer = ChannelMixerParams(); - - blackwhite = BlackWhiteParams(); - - cacorrection = CACorrParams(); - - resize = ResizeParams(); - - icm = ColorManagementParams(); - - wavelet = WaveletParams(); - - dirpyrequalizer = DirPyrEqualizerParams(); - - hsvequalizer = HSVEqualizerParams(); - - filmSimulation = FilmSimulationParams(); - - raw = RAWParams(); - - exif.clear (); - iptc.clear (); - - rank = 0; - colorlabel = 0; - inTrash = false; - - ppVersion = PPVERSION; -} - -int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bool fnameAbsolute, ParamsEdited* pedited) -{ - if (fname.empty () && fname2.empty ()) { - return 0; - } - - Glib::ustring sPParams; - - try { - Glib::KeyFile keyFile; - -// Version - keyFile.set_string ("Version", "AppVersion", RTVERSION); - keyFile.set_integer ("Version", "Version", PPVERSION); - - saveToKeyfile(!pedited || pedited->general.rank, "General", "Rank", rank, keyFile); - saveToKeyfile(!pedited || pedited->general.colorlabel, "General", "ColorLabel", colorlabel, keyFile); - saveToKeyfile(!pedited || pedited->general.intrash, "General", "InTrash", inTrash, keyFile); - -// Tone curve - saveToKeyfile(!pedited || pedited->toneCurve.autoexp, "Exposure", "Auto", toneCurve.autoexp, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.clip, "Exposure", "Clip", toneCurve.clip, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.expcomp, "Exposure", "Compensation", toneCurve.expcomp, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.brightness, "Exposure", "Brightness", toneCurve.brightness, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.contrast, "Exposure", "Contrast", toneCurve.contrast, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.saturation, "Exposure", "Saturation", toneCurve.saturation, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.black, "Exposure", "Black", toneCurve.black, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.hlcompr, "Exposure", "HighlightCompr", toneCurve.hlcompr, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.hlcomprthresh, "Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.shcompr, "Exposure", "ShadowCompr", toneCurve.shcompr, keyFile); - -// Highlight recovery - saveToKeyfile(!pedited || pedited->toneCurve.hrenabled, "HLRecovery", "Enabled", toneCurve.hrenabled, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.method, "HLRecovery", "Method", toneCurve.method, keyFile); - - const std::map tc_mapping = { - {ToneCurveParams::TcMode::STD, "Standard"}, - {ToneCurveParams::TcMode::FILMLIKE, "FilmLike"}, - {ToneCurveParams::TcMode::SATANDVALBLENDING, "SatAndValueBlending"}, - {ToneCurveParams::TcMode::WEIGHTEDSTD,"WeightedStd"}, - {ToneCurveParams::TcMode::LUMINANCE, "Luminance"}, - {ToneCurveParams::TcMode::PERCEPTUAL, "Perceptual"} - }; - - saveToKeyfile(!pedited || pedited->toneCurve.curveMode, "Exposure", "CurveMode", tc_mapping, toneCurve.curveMode, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.curveMode2, "Exposure", "CurveMode2", tc_mapping, toneCurve.curveMode2, keyFile); - - saveToKeyfile(!pedited || pedited->toneCurve.curve, "Exposure", "Curve", toneCurve.curve, keyFile); - saveToKeyfile(!pedited || pedited->toneCurve.curve2, "Exposure", "Curve2", toneCurve.curve2, keyFile); - -// Retinex - saveToKeyfile(!pedited || pedited->retinex.enabled, "Retinex", "Enabled", retinex.enabled, keyFile); - saveToKeyfile(!pedited || pedited->retinex.str, "Retinex", "Str", retinex.str, keyFile); - saveToKeyfile(!pedited || pedited->retinex.scal, "Retinex", "Scal", retinex.scal, keyFile); - saveToKeyfile(!pedited || pedited->retinex.iter, "Retinex", "Iter", retinex.iter, keyFile); - saveToKeyfile(!pedited || pedited->retinex.grad, "Retinex", "Grad", retinex.grad, keyFile); - saveToKeyfile(!pedited || pedited->retinex.grads, "Retinex", "Grads", retinex.grads, keyFile); - saveToKeyfile(!pedited || pedited->retinex.gam, "Retinex", "Gam", retinex.gam, keyFile); - saveToKeyfile(!pedited || pedited->retinex.slope, "Retinex", "Slope", retinex.slope, keyFile); - saveToKeyfile(!pedited || pedited->retinex.medianmap, "Retinex", "Median", retinex.medianmap, keyFile); - - saveToKeyfile(!pedited || pedited->retinex.neigh, "Retinex", "Neigh", retinex.neigh, keyFile); - saveToKeyfile(!pedited || pedited->retinex.offs, "Retinex", "Offs", retinex.offs, keyFile); - saveToKeyfile(!pedited || pedited->retinex.vart, "Retinex", "Vart", retinex.vart, keyFile); - saveToKeyfile(!pedited || pedited->retinex.limd, "Retinex", "Limd", retinex.limd, keyFile); - saveToKeyfile(!pedited || pedited->retinex.highl, "Retinex", "highl", retinex.highl, keyFile); - saveToKeyfile(!pedited || pedited->retinex.skal, "Retinex", "skal", retinex.skal, keyFile); - saveToKeyfile(!pedited || pedited->retinex.retinexMethod, "Retinex", "RetinexMethod", retinex.retinexMethod, keyFile); - saveToKeyfile(!pedited || pedited->retinex.mapMethod, "Retinex", "mapMethod", retinex.mapMethod, keyFile); - saveToKeyfile(!pedited || pedited->retinex.viewMethod, "Retinex", "viewMethod", retinex.viewMethod, keyFile); - saveToKeyfile(!pedited || pedited->retinex.retinexcolorspace, "Retinex", "Retinexcolorspace", retinex.retinexcolorspace, keyFile); - saveToKeyfile(!pedited || pedited->retinex.gammaretinex, "Retinex", "Gammaretinex", retinex.gammaretinex, keyFile); - saveToKeyfile(!pedited || pedited->retinex.cdcurve, "Retinex", "CDCurve", retinex.cdcurve, keyFile); - saveToKeyfile(!pedited || pedited->retinex.mapcurve, "Retinex", "MAPCurve", retinex.mapcurve, keyFile); - saveToKeyfile(!pedited || pedited->retinex.cdHcurve, "Retinex", "CDHCurve", retinex.cdHcurve, keyFile); - saveToKeyfile(!pedited || pedited->retinex.lhcurve, "Retinex", "LHCurve", retinex.lhcurve, keyFile); - saveToKeyfile(!pedited || pedited->retinex.highlights, "Retinex", "Highlights", retinex.highlights, keyFile); - saveToKeyfile(!pedited || pedited->retinex.htonalwidth, "Retinex", "HighlightTonalWidth", retinex.htonalwidth, keyFile); - saveToKeyfile(!pedited || pedited->retinex.shadows, "Retinex", "Shadows", retinex.shadows, keyFile); - saveToKeyfile(!pedited || pedited->retinex.stonalwidth, "Retinex", "ShadowTonalWidth", retinex.stonalwidth, keyFile); - saveToKeyfile(!pedited || pedited->retinex.radius, "Retinex", "Radius", retinex.radius, keyFile); - saveToKeyfile(!pedited || pedited->retinex.transmissionCurve, "Retinex", "TransmissionCurve", retinex.transmissionCurve, keyFile); - saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); - -// 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); - } - -// Black & White - saveToKeyfile(!pedited || pedited->blackwhite.enabled, "Black & White", "Enabled", blackwhite.enabled, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.method, "Black & White", "Method", blackwhite.method, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.autoc, "Black & White", "Auto", blackwhite.autoc, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.enabledcc, "Black & White", "ComplementaryColors", blackwhite.enabledcc, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.setting, "Black & White", "Setting", blackwhite.setting, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.filter, "Black & White", "Filter", blackwhite.filter, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerRed, "Black & White", "MixerRed", blackwhite.mixerRed, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerOrange, "Black & White", "MixerOrange", blackwhite.mixerOrange, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerYellow, "Black & White", "MixerYellow", blackwhite.mixerYellow, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerGreen, "Black & White", "MixerGreen", blackwhite.mixerGreen, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerCyan, "Black & White", "MixerCyan", blackwhite.mixerCyan, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerBlue, "Black & White", "MixerBlue", blackwhite.mixerBlue, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerMagenta, "Black & White", "MixerMagenta", blackwhite.mixerMagenta, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.mixerPurple, "Black & White", "MixerPurple", blackwhite.mixerPurple, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.gammaRed, "Black & White", "GammaRed", blackwhite.gammaRed, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.gammaGreen, "Black & White", "GammaGreen", blackwhite.gammaGreen, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.gammaBlue, "Black & White", "GammaBlue", blackwhite.gammaBlue, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.algo, "Black & White", "Algorithm", blackwhite.algo, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.luminanceCurve, "Black & White", "LuminanceCurve", blackwhite.luminanceCurve, keyFile); - saveToKeyfile( - !pedited || pedited->blackwhite.beforeCurveMode, - "Black & White", - "BeforeCurveMode", - { - {BlackWhiteParams::TcMode::STD_BW, "Standard"}, - {BlackWhiteParams::TcMode::FILMLIKE_BW, "FilmLike"}, - {BlackWhiteParams::TcMode::SATANDVALBLENDING_BW, "SatAndValueBlending"}, - {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} - - }, - blackwhite.beforeCurveMode, - keyFile - ); - saveToKeyfile( - !pedited || pedited->blackwhite.afterCurveMode, - "Black & White", - "AfterCurveMode", - { - {BlackWhiteParams::TcMode::STD_BW, "Standard"}, - {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} - - }, - blackwhite.afterCurveMode, - keyFile - ); - saveToKeyfile(!pedited || pedited->blackwhite.beforeCurve, "Black & White", "BeforeCurve", blackwhite.beforeCurve, keyFile); - saveToKeyfile(!pedited || pedited->blackwhite.afterCurve, "Black & White", "AfterCurve", blackwhite.afterCurve, keyFile); - -// Luma curve - saveToKeyfile(!pedited || pedited->labCurve.brightness, "Luminance Curve", "Brightness", labCurve.brightness, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.contrast, "Luminance Curve", "Contrast", labCurve.contrast, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.chromaticity, "Luminance Curve", "Chromaticity", labCurve.chromaticity, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.avoidcolorshift, "Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.rstprotection, "Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.lcredsk, "Luminance Curve", "LCredsk", labCurve.lcredsk, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.lcurve, "Luminance Curve", "LCurve", labCurve.lcurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.acurve, "Luminance Curve", "aCurve", labCurve.acurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.bcurve, "Luminance Curve", "bCurve", labCurve.bcurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.cccurve, "Luminance Curve", "ccCurve", labCurve.cccurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.chcurve, "Luminance Curve", "chCurve", labCurve.chcurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.lhcurve, "Luminance Curve", "lhCurve", labCurve.lhcurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.hhcurve, "Luminance Curve", "hhCurve", labCurve.hhcurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.lccurve, "Luminance Curve", "LcCurve", labCurve.lccurve, keyFile); - saveToKeyfile(!pedited || pedited->labCurve.clcurve, "Luminance Curve", "ClCurve", labCurve.clcurve, keyFile); - -// Sharpening - saveToKeyfile(!pedited || pedited->sharpening.enabled, "Sharpening", "Enabled", sharpening.enabled, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.method, "Sharpening", "Method", sharpening.method, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.radius, "Sharpening", "Radius", sharpening.radius, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.amount, "Sharpening", "Amount", sharpening.amount, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.threshold, "Sharpening", "Threshold", sharpening.threshold.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->sharpening.edgesonly, "Sharpening", "OnlyEdges", sharpening.edgesonly, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.edges_radius, "Sharpening", "EdgedetectionRadius", sharpening.edges_radius, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.edges_tolerance, "Sharpening", "EdgeTolerance", sharpening.edges_tolerance, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.halocontrol, "Sharpening", "HalocontrolEnabled", sharpening.halocontrol, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.halocontrol_amount, "Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.deconvradius, "Sharpening", "DeconvRadius", sharpening.deconvradius, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.deconvamount, "Sharpening", "DeconvAmount", sharpening.deconvamount, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.deconvdamping, "Sharpening", "DeconvDamping", sharpening.deconvdamping, keyFile); - saveToKeyfile(!pedited || pedited->sharpening.deconviter, "Sharpening", "DeconvIterations", sharpening.deconviter, keyFile); - -// Vibrance - saveToKeyfile(!pedited || pedited->vibrance.enabled, "Vibrance", "Enabled", vibrance.enabled, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.pastels, "Vibrance", "Pastels", vibrance.pastels, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.saturated, "Vibrance", "Saturated", vibrance.saturated, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.psthreshold, "Vibrance", "PSThreshold", vibrance.psthreshold.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->vibrance.protectskins, "Vibrance", "ProtectSkins", vibrance.protectskins, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.avoidcolorshift, "Vibrance", "AvoidColorShift", vibrance.avoidcolorshift, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.pastsattog, "Vibrance", "PastSatTog", vibrance.pastsattog, keyFile); - saveToKeyfile(!pedited || pedited->vibrance.skintonescurve, "Vibrance", "SkinTonesCurve", vibrance.skintonescurve, keyFile); - -// Edge sharpening - saveToKeyfile(!pedited || pedited->sharpenEdge.enabled, "SharpenEdge", "Enabled", sharpenEdge.enabled, keyFile); - saveToKeyfile(!pedited || pedited->sharpenEdge.passes, "SharpenEdge", "Passes", sharpenEdge.passes, keyFile); - saveToKeyfile(!pedited || pedited->sharpenEdge.amount, "SharpenEdge", "Strength", sharpenEdge.amount, keyFile); - saveToKeyfile(!pedited || pedited->sharpenEdge.threechannels, "SharpenEdge", "ThreeChannels", sharpenEdge.threechannels, keyFile); - -// Micro-contrast sharpening - saveToKeyfile(!pedited || pedited->sharpenMicro.enabled, "SharpenMicro", "Enabled", sharpenMicro.enabled, keyFile); - saveToKeyfile(!pedited || pedited->sharpenMicro.matrix, "SharpenMicro", "Matrix", sharpenMicro.matrix, keyFile); - saveToKeyfile(!pedited || pedited->sharpenMicro.amount, "SharpenMicro", "Strength", sharpenMicro.amount, keyFile); - saveToKeyfile(!pedited || pedited->sharpenMicro.uniformity, "SharpenMicro", "Uniformity", sharpenMicro.uniformity, keyFile); - -// WB - saveToKeyfile(!pedited || pedited->wb.method, "White Balance", "Setting", wb.method, keyFile); - saveToKeyfile(!pedited || pedited->wb.temperature, "White Balance", "Temperature", wb.temperature, keyFile); - saveToKeyfile(!pedited || pedited->wb.green, "White Balance", "Green", wb.green, keyFile); - saveToKeyfile(!pedited || pedited->wb.equal, "White Balance", "Equal", wb.equal, keyFile); - saveToKeyfile(!pedited || pedited->wb.tempBias, "White Balance", "TemperatureBias", wb.tempBias, keyFile); - -// Colorappearance - saveToKeyfile(!pedited || pedited->colorappearance.enabled, "Color appearance", "Enabled", colorappearance.enabled, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.degree, "Color appearance", "Degree", colorappearance.degree, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.autodegree, "Color appearance", "AutoDegree", colorappearance.autodegree, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.degreeout, "Color appearance", "Degreeout", colorappearance.degreeout, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.autodegreeout, "Color appearance", "AutoDegreeout", colorappearance.autodegreeout, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.surround, "Color appearance", "Surround", colorappearance.surround, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.surrsrc, "Color appearance", "Surrsrc", colorappearance.surrsrc, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.wbmodel, "Color appearance", "Model", colorappearance.wbmodel, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.algo, "Color appearance", "Algorithm", colorappearance.algo, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.jlight, "Color appearance", "J-Light", colorappearance.jlight, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.qbright, "Color appearance", "Q-Bright", colorappearance.qbright, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.chroma, "Color appearance", "C-Chroma", colorappearance.chroma, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.schroma, "Color appearance", "S-Chroma", colorappearance.schroma, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.mchroma, "Color appearance", "M-Chroma", colorappearance.mchroma, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.contrast, "Color appearance", "J-Contrast", colorappearance.contrast, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.qcontrast, "Color appearance", "Q-Contrast", colorappearance.qcontrast, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.colorh, "Color appearance", "H-Hue", colorappearance.colorh, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.rstprotection, "Color appearance", "RSTProtection", colorappearance.rstprotection, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.adapscen, "Color appearance", "AdaptScene", colorappearance.adapscen, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.autoadapscen, "Color appearance", "AutoAdapscen", colorappearance.autoadapscen, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.ybscen, "Color appearance", "YbScene", colorappearance.ybscen, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.autoybscen, "Color appearance", "Autoybscen", colorappearance.autoybscen, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.surrsource, "Color appearance", "SurrSource", colorappearance.surrsource, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.gamut, "Color appearance", "Gamut", colorappearance.gamut, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.tempout, "Color appearance", "Tempout", colorappearance.tempout, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.greenout, "Color appearance", "Greenout", colorappearance.greenout, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.tempsc, "Color appearance", "Tempsc", colorappearance.tempsc, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.greensc, "Color appearance", "Greensc", colorappearance.greensc, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.ybout, "Color appearance", "Ybout", colorappearance.ybout, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.datacie, "Color appearance", "Datacie", colorappearance.datacie, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.tonecie, "Color appearance", "Tonecie", colorappearance.tonecie, keyFile); - - const std::map ca_mapping = { - {ColorAppearanceParams::TcMode::LIGHT, "Lightness"}, - {ColorAppearanceParams::TcMode::BRIGHT, "Brightness"} - }; - - saveToKeyfile(!pedited || pedited->colorappearance.curveMode, "Color appearance", "CurveMode", ca_mapping, colorappearance.curveMode, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.curveMode2, "Color appearance", "CurveMode2", ca_mapping, colorappearance.curveMode2, keyFile); - saveToKeyfile( - !pedited || pedited->colorappearance.curveMode3, - "Color appearance", - "CurveMode3", - { - {ColorAppearanceParams::CtcMode::CHROMA, "Chroma"}, - {ColorAppearanceParams::CtcMode::SATUR, "Saturation"}, - {ColorAppearanceParams::CtcMode::COLORF, "Colorfullness"} - - }, - colorappearance.curveMode3, - keyFile - ); - saveToKeyfile(!pedited || pedited->colorappearance.curve, "Color appearance", "Curve", colorappearance.curve, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.curve2, "Color appearance", "Curve2", colorappearance.curve2, keyFile); - saveToKeyfile(!pedited || pedited->colorappearance.curve3, "Color appearance", "Curve3", colorappearance.curve3, keyFile); - -// Impulse denoise - saveToKeyfile(!pedited || pedited->impulseDenoise.enabled, "Impulse Denoising", "Enabled", impulseDenoise.enabled, keyFile); - saveToKeyfile(!pedited || pedited->impulseDenoise.thresh, "Impulse Denoising", "Threshold", impulseDenoise.thresh, keyFile); - -// Defringe - saveToKeyfile(!pedited || pedited->defringe.enabled, "Defringing", "Enabled", defringe.enabled, keyFile); - saveToKeyfile(!pedited || pedited->defringe.radius, "Defringing", "Radius", defringe.radius, keyFile); - saveToKeyfile(!pedited || pedited->defringe.threshold, "Defringing", "Threshold", defringe.threshold, keyFile); - saveToKeyfile(!pedited || pedited->defringe.huecurve, "Defringing", "HueCurve", defringe.huecurve, keyFile); - -// Directional pyramid denoising - saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.median, "Directional Pyramid Denoising", "Median", dirpyrDenoise.median, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.luma, "Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.Ldetail, "Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.chroma, "Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.dmethod, "Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.Lmethod, "Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod, keyFile); - if (dirpyrDenoise.Cmethod == "PRE") { - dirpyrDenoise.Cmethod = "MAN"; // Never save 'auto chroma preview mode' to pp3 - } - saveToKeyfile(!pedited || pedited->dirpyrDenoise.Cmethod, "Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod, keyFile); - if (dirpyrDenoise.C2method == "PREV") { - dirpyrDenoise.C2method = "MANU"; - } - saveToKeyfile(!pedited || pedited->dirpyrDenoise.C2method, "Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.smethod, "Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.medmethod, "Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.rgbmethod, "Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.methodmed, "Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.redchro, "Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.bluechro, "Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.gamma, "Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.passes, "Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.lcurve, "Directional Pyramid Denoising", "LCurve", dirpyrDenoise.lcurve, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrDenoise.cccurve, "Directional Pyramid Denoising", "CCCurve", dirpyrDenoise.cccurve, keyFile); - -// EPD - saveToKeyfile(!pedited || pedited->epd.enabled, "EPD", "Enabled", epd.enabled, keyFile); - saveToKeyfile(!pedited || pedited->epd.strength, "EPD", "Strength", epd.strength, keyFile); - saveToKeyfile(!pedited || pedited->epd.gamma, "EPD", "Gamma", epd.gamma, keyFile); - saveToKeyfile(!pedited || pedited->epd.edgeStopping, "EPD", "EdgeStopping", epd.edgeStopping, keyFile); - saveToKeyfile(!pedited || pedited->epd.scale, "EPD", "Scale", epd.scale, keyFile); - saveToKeyfile(!pedited || pedited->epd.reweightingIterates, "EPD", "ReweightingIterates", epd.reweightingIterates, keyFile); - -// Fattal - saveToKeyfile(!pedited || pedited->fattal.enabled, "FattalToneMapping", "Enabled", fattal.enabled, keyFile); - saveToKeyfile(!pedited || pedited->fattal.threshold, "FattalToneMapping", "Threshold", fattal.threshold, keyFile); - saveToKeyfile(!pedited || pedited->fattal.amount, "FattalToneMapping", "Amount", fattal.amount, keyFile); - -// Shadows & highlights - saveToKeyfile(!pedited || pedited->sh.enabled, "Shadows & Highlights", "Enabled", sh.enabled, keyFile); - saveToKeyfile(!pedited || pedited->sh.hq, "Shadows & Highlights", "HighQuality", sh.hq, keyFile); - saveToKeyfile(!pedited || pedited->sh.highlights, "Shadows & Highlights", "Highlights", sh.highlights, keyFile); - saveToKeyfile(!pedited || pedited->sh.htonalwidth, "Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth, keyFile); - saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile); - saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile); - saveToKeyfile(!pedited || pedited->sh.localcontrast, "Shadows & Highlights", "LocalContrast", sh.localcontrast, keyFile); - saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile); - -// Crop - saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile); - saveToKeyfile(!pedited || pedited->crop.x, "Crop", "X", crop.x, keyFile); - saveToKeyfile(!pedited || pedited->crop.y, "Crop", "Y", crop.y, keyFile); - saveToKeyfile(!pedited || pedited->crop.w, "Crop", "W", crop.w, keyFile); - saveToKeyfile(!pedited || pedited->crop.h, "Crop", "H", crop.h, keyFile); - saveToKeyfile(!pedited || pedited->crop.fixratio, "Crop", "FixedRatio", crop.fixratio, keyFile); - saveToKeyfile(!pedited || pedited->crop.ratio, "Crop", "Ratio", crop.ratio, keyFile); - saveToKeyfile(!pedited || pedited->crop.orientation, "Crop", "Orientation", crop.orientation, keyFile); - saveToKeyfile(!pedited || pedited->crop.guide, "Crop", "Guide", crop.guide, keyFile); - -// Coarse transformation - saveToKeyfile(!pedited || pedited->coarse.rotate, "Coarse Transformation", "Rotate", coarse.rotate, keyFile); - saveToKeyfile(!pedited || pedited->coarse.hflip, "Coarse Transformation", "HorizontalFlip", coarse.hflip, keyFile); - saveToKeyfile(!pedited || pedited->coarse.vflip, "Coarse Transformation", "VerticalFlip", coarse.vflip, keyFile); - -// Common properties for transformations - saveToKeyfile(!pedited || pedited->commonTrans.autofill, "Common Properties for Transformations", "AutoFill", commonTrans.autofill, keyFile); - -// Rotation - saveToKeyfile(!pedited || pedited->rotate.degree, "Rotation", "Degree", rotate.degree, keyFile); - -// Distortion - saveToKeyfile(!pedited || pedited->distortion.amount, "Distortion", "Amount", distortion.amount, keyFile); - -// Lens profile - saveToKeyfile(!pedited || pedited->lensProf.lcMode, "LensProfile", "LcMode", lensProf.getMethodString (lensProf.lcMode), keyFile); - saveToKeyfile(!pedited || pedited->lensProf.lcpFile, "LensProfile", "LCPFile", relativePathIfInside (fname, fnameAbsolute, lensProf.lcpFile), keyFile); - saveToKeyfile(!pedited || pedited->lensProf.useDist, "LensProfile", "UseDistortion", lensProf.useDist, keyFile); - saveToKeyfile(!pedited || pedited->lensProf.useVign, "LensProfile", "UseVignette", lensProf.useVign, keyFile); - saveToKeyfile(!pedited || pedited->lensProf.useCA, "LensProfile", "UseCA", lensProf.useCA, keyFile); - saveToKeyfile(!pedited || pedited->lensProf.lfCameraMake, "LensProfile", "LFCameraMake", lensProf.lfCameraMake, keyFile); - saveToKeyfile(!pedited || pedited->lensProf.lfCameraModel, "LensProfile", "LFCameraModel", lensProf.lfCameraModel, keyFile); - saveToKeyfile(!pedited || pedited->lensProf.lfLens, "LensProfile", "LFLens", lensProf.lfLens, keyFile); - -// Perspective correction - saveToKeyfile(!pedited || pedited->perspective.horizontal, "Perspective", "Horizontal", perspective.horizontal, keyFile); - saveToKeyfile(!pedited || pedited->perspective.vertical, "Perspective", "Vertical", perspective.vertical, keyFile); - -// Gradient - saveToKeyfile(!pedited || pedited->gradient.enabled, "Gradient", "Enabled", gradient.enabled, keyFile); - saveToKeyfile(!pedited || pedited->gradient.degree, "Gradient", "Degree", gradient.degree, keyFile); - saveToKeyfile(!pedited || pedited->gradient.feather, "Gradient", "Feather", gradient.feather, keyFile); - saveToKeyfile(!pedited || pedited->gradient.strength, "Gradient", "Strength", gradient.strength, keyFile); - saveToKeyfile(!pedited || pedited->gradient.centerX, "Gradient", "CenterX", gradient.centerX, keyFile); - saveToKeyfile(!pedited || pedited->gradient.centerY, "Gradient", "CenterY", gradient.centerY, keyFile); - -// Post-crop vignette - saveToKeyfile(!pedited || pedited->pcvignette.enabled, "PCVignette", "Enabled", pcvignette.enabled, keyFile); - saveToKeyfile(!pedited || pedited->pcvignette.strength, "PCVignette", "Strength", pcvignette.strength, keyFile); - saveToKeyfile(!pedited || pedited->pcvignette.feather, "PCVignette", "Feather", pcvignette.feather, keyFile); - saveToKeyfile(!pedited || pedited->pcvignette.roundness, "PCVignette", "Roundness", pcvignette.roundness, keyFile); - -// C/A correction - saveToKeyfile(!pedited || pedited->cacorrection.red, "CACorrection", "Red", cacorrection.red, keyFile); - saveToKeyfile(!pedited || pedited->cacorrection.blue, "CACorrection", "Blue", cacorrection.blue, keyFile); - -// Vignetting correction - saveToKeyfile(!pedited || pedited->vignetting.amount, "Vignetting Correction", "Amount", vignetting.amount, keyFile); - saveToKeyfile(!pedited || pedited->vignetting.radius, "Vignetting Correction", "Radius", vignetting.radius, keyFile); - saveToKeyfile(!pedited || pedited->vignetting.strength, "Vignetting Correction", "Strength", vignetting.strength, keyFile); - saveToKeyfile(!pedited || pedited->vignetting.centerX, "Vignetting Correction", "CenterX", vignetting.centerX, keyFile); - saveToKeyfile(!pedited || pedited->vignetting.centerY, "Vignetting Correction", "CenterY", vignetting.centerY, keyFile); - -// Resize - saveToKeyfile(!pedited || pedited->resize.enabled, "Resize", "Enabled", resize.enabled, keyFile); - saveToKeyfile(!pedited || pedited->resize.scale, "Resize", "Scale", resize.scale, keyFile); - saveToKeyfile(!pedited || pedited->resize.appliesTo, "Resize", "AppliesTo", resize.appliesTo, keyFile); - saveToKeyfile(!pedited || pedited->resize.method, "Resize", "Method", resize.method, keyFile); - saveToKeyfile(!pedited || pedited->resize.dataspec, "Resize", "DataSpecified", resize.dataspec, keyFile); - saveToKeyfile(!pedited || pedited->resize.width, "Resize", "Width", resize.width, keyFile); - saveToKeyfile(!pedited || pedited->resize.height, "Resize", "Height", resize.height, keyFile); - -// Post resize sharpening - saveToKeyfile(!pedited || pedited->prsharpening.enabled, "PostResizeSharpening", "Enabled", prsharpening.enabled, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.method, "PostResizeSharpening", "Method", prsharpening.method, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.radius, "PostResizeSharpening", "Radius", prsharpening.radius, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.amount, "PostResizeSharpening", "Amount", prsharpening.amount, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.threshold, "PostResizeSharpening", "Threshold", prsharpening.threshold.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.edgesonly, "PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.edges_radius, "PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.edges_tolerance, "PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.halocontrol, "PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.halocontrol_amount, "PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.deconvradius, "PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.deconvamount, "PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.deconvdamping, "PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping, keyFile); - saveToKeyfile(!pedited || pedited->prsharpening.deconviter, "PostResizeSharpening", "DeconvIterations", prsharpening.deconviter, keyFile); - -// Color management - saveToKeyfile(!pedited || pedited->icm.input, "Color Management", "InputProfile", relativePathIfInside (fname, fnameAbsolute, icm.input), keyFile); - saveToKeyfile(!pedited || pedited->icm.toneCurve, "Color Management", "ToneCurve", icm.toneCurve, keyFile); - saveToKeyfile(!pedited || pedited->icm.applyLookTable, "Color Management", "ApplyLookTable", icm.applyLookTable, keyFile); - saveToKeyfile(!pedited || pedited->icm.applyBaselineExposureOffset, "Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset, keyFile); - saveToKeyfile(!pedited || pedited->icm.applyHueSatMap, "Color Management", "ApplyHueSatMap", icm.applyHueSatMap, keyFile); - saveToKeyfile(!pedited || pedited->icm.dcpIlluminant, "Color Management", "DCPIlluminant", icm.dcpIlluminant, keyFile); - saveToKeyfile(!pedited || pedited->icm.working, "Color Management", "WorkingProfile", icm.working, keyFile); - saveToKeyfile(!pedited || pedited->icm.output, "Color Management", "OutputProfile", icm.output, keyFile); - saveToKeyfile( - !pedited || icm.outputIntent, - "Color Management", - "OutputProfileIntent", - { - {RI_PERCEPTUAL, "Perceptual"}, - {RI_RELATIVE, "Relative"}, - {RI_SATURATION, "Saturation"}, - {RI_ABSOLUTE, "Absolute"} - - }, - icm.outputIntent, - keyFile - ); - saveToKeyfile(!pedited || pedited->icm.outputBPC, "Color Management", "OutputBPC", icm.outputBPC, keyFile); - saveToKeyfile(!pedited || pedited->icm.gamma, "Color Management", "Gammafree", icm.gamma, keyFile); - saveToKeyfile(!pedited || pedited->icm.freegamma, "Color Management", "Freegamma", icm.freegamma, keyFile); - saveToKeyfile(!pedited || pedited->icm.gampos, "Color Management", "GammaValue", icm.gampos, keyFile); - saveToKeyfile(!pedited || pedited->icm.slpos, "Color Management", "GammaSlope", icm.slpos, keyFile); - -// Wavelet - saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.daubcoeffmethod, "Wavelet", "DaubMethod", wavelet.daubcoeffmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.CLmethod, "Wavelet", "ChoiceLevMethod", wavelet.CLmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Backmethod, "Wavelet", "BackMethod", wavelet.Backmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Lmethod, "Wavelet", "LevMethod", wavelet.Lmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Dirmethod, "Wavelet", "DirMethod", wavelet.Dirmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.greenhigh, "Wavelet", "CBgreenhigh", wavelet.greenhigh, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.greenmed, "Wavelet", "CBgreenmed", wavelet.greenmed, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.greenlow, "Wavelet", "CBgreenlow", wavelet.greenlow, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); - - for (int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Contrast" << (i + 1); - - saveToKeyfile(!pedited || pedited->wavelet.c[i], "Wavelet", ss.str(), wavelet.c[i], keyFile); - } - - for (int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Chroma" << (i + 1); - - saveToKeyfile(!pedited || pedited->wavelet.ch[i], "Wavelet", ss.str(), wavelet.ch[i], keyFile); - } - - saveToKeyfile(!pedited || pedited->wavelet.sup, "Wavelet", "ContExtra", wavelet.sup, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.HSmethod, "Wavelet", "HSMethod", wavelet.HSmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.hllev, "Wavelet", "HLRange", wavelet.hllev.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.bllev, "Wavelet", "SHRange", wavelet.bllev.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgcont, "Wavelet", "Edgcont", wavelet.edgcont.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.level0noise, "Wavelet", "Level0noise", wavelet.level0noise.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.level1noise, "Wavelet", "Level1noise", wavelet.level1noise.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.level2noise, "Wavelet", "Level2noise", wavelet.level2noise.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.level3noise, "Wavelet", "Level3noise", wavelet.level3noise.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.threshold, "Wavelet", "ThresholdHighlight", wavelet.threshold, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.threshold2, "Wavelet", "ThresholdShadow", wavelet.threshold2, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgedetect, "Wavelet", "Edgedetect", wavelet.edgedetect, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr, "Wavelet", "Edgedetectthr", wavelet.edgedetectthr, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr2, "Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgesensi, "Wavelet", "Edgesensi", wavelet.edgesensi, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgeampli, "Wavelet", "Edgeampli", wavelet.edgeampli, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.chroma, "Wavelet", "ThresholdChroma", wavelet.chroma, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.CHmethod, "Wavelet", "CHromaMethod", wavelet.CHmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Medgreinf, "Wavelet", "Medgreinf", wavelet.Medgreinf, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.CHSLmethod, "Wavelet", "CHSLromaMethod", wavelet.CHSLmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.EDmethod, "Wavelet", "EDMethod", wavelet.EDmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.NPmethod, "Wavelet", "NPMethod", wavelet.NPmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.BAmethod, "Wavelet", "BAMethod", wavelet.BAmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.hhcurve, "Wavelet", "HHcurve", wavelet.hhcurve, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.Chcurve, "Wavelet", "CHcurve", wavelet.Chcurve, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.wavclCurve, "Wavelet", "WavclCurve", wavelet.wavclCurve, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.median, "Wavelet", "Median", wavelet.median, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.medianlev, "Wavelet", "Medianlev", wavelet.medianlev, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.linkedg, "Wavelet", "Linkedg", wavelet.linkedg, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.gamma, "Wavelet", "Residualgamma", wavelet.gamma, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.sky, "Wavelet", "HueRangeResidual", wavelet.sky, keyFile); - saveToKeyfile(!pedited || pedited->wavelet.hueskin2, "Wavelet", "HueRange", wavelet.hueskin2.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->wavelet.contrast, "Wavelet", "Contrast", wavelet.contrast, keyFile); - -// Directional pyramid equalizer - saveToKeyfile(!pedited || pedited->dirpyrequalizer.enabled, "Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrequalizer.gamutlab, "Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrequalizer.cbdlMethod, "Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod, keyFile); - - for (int i = 0; i < 6; i++) { - std::stringstream ss; - ss << "Mult" << i; - - saveToKeyfile(!pedited || pedited->dirpyrequalizer.mult[i], "Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i], keyFile); - } - - saveToKeyfile(!pedited || pedited->dirpyrequalizer.threshold, "Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrequalizer.skinprotect, "Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect, keyFile); - saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile); - -// HSV Equalizer - saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile); - saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); - saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); - -// Film simulation - saveToKeyfile(!pedited || pedited->filmSimulation.enabled, "Film Simulation", "Enabled", filmSimulation.enabled, keyFile); - saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile); - saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile); - - saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile); - saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile); - saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile); - saveToKeyfile(!pedited || pedited->rgbCurves.bcurve, "RGB Curves", "bCurve", rgbCurves.bcurve, keyFile); - -// Color toning - saveToKeyfile(!pedited || pedited->colorToning.enabled, "ColorToning", "Enabled", colorToning.enabled, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.method, "ColorToning", "Method", colorToning.method, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.lumamode, "ColorToning", "Lumamode", colorToning.lumamode, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.twocolor, "ColorToning", "Twocolor", colorToning.twocolor, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.redlow, "ColorToning", "Redlow", colorToning.redlow, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.greenlow, "ColorToning", "Greenlow", colorToning.greenlow, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.bluelow, "ColorToning", "Bluelow", colorToning.bluelow, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.satlow, "ColorToning", "Satlow", colorToning.satlow, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.balance, "ColorToning", "Balance", colorToning.balance, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.sathigh, "ColorToning", "Sathigh", colorToning.sathigh, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.redmed, "ColorToning", "Redmed", colorToning.redmed, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.greenmed, "ColorToning", "Greenmed", colorToning.greenmed, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.bluemed, "ColorToning", "Bluemed", colorToning.bluemed, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.redhigh, "ColorToning", "Redhigh", colorToning.redhigh, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.greenhigh, "ColorToning", "Greenhigh", colorToning.greenhigh, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.bluehigh, "ColorToning", "Bluehigh", colorToning.bluehigh, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.autosat, "ColorToning", "Autosat", colorToning.autosat, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.opacityCurve, "ColorToning", "OpacityCurve", colorToning.opacityCurve, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.colorCurve, "ColorToning", "ColorCurve", colorToning.colorCurve, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.satprotectionthreshold, "ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.saturatedopacity, "ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.strength, "ColorToning", "Strength", colorToning.strength, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.hlColSat, "ColorToning", "HighlightsColorSaturation", colorToning.hlColSat.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->colorToning.shadowsColSat, "ColorToning", "ShadowsColorSaturation", colorToning.shadowsColSat.toVector(), keyFile); - saveToKeyfile(!pedited || pedited->colorToning.clcurve, "ColorToning", "ClCurve", colorToning.clcurve, keyFile); - saveToKeyfile(!pedited || pedited->colorToning.cl2curve, "ColorToning", "Cl2Curve", colorToning.cl2curve, keyFile); - -// Raw - saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame), keyFile); - saveToKeyfile(!pedited || pedited->raw.df_autoselect, "RAW", "DarkFrameAuto", raw.df_autoselect, keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_file, "RAW", "FlatFieldFile", relativePathIfInside (fname, fnameAbsolute, raw.ff_file), keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_AutoSelect, "RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect, keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_BlurRadius, "RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius, keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_BlurType, "RAW", "FlatFieldBlurType", raw.ff_BlurType, keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_AutoClipControl, "RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl, keyFile); - saveToKeyfile(!pedited || pedited->raw.ff_clipControl, "RAW", "FlatFieldClipControl", raw.ff_clipControl, keyFile); - saveToKeyfile(!pedited || pedited->raw.ca_autocorrect, "RAW", "CA", raw.ca_autocorrect, keyFile); - saveToKeyfile(!pedited || pedited->raw.cared, "RAW", "CARed", raw.cared, keyFile); - saveToKeyfile(!pedited || pedited->raw.cablue, "RAW", "CABlue", raw.cablue, keyFile); - saveToKeyfile(!pedited || pedited->raw.hotPixelFilter, "RAW", "HotPixelFilter", raw.hotPixelFilter, keyFile); - saveToKeyfile(!pedited || pedited->raw.deadPixelFilter, "RAW", "DeadPixelFilter", raw.deadPixelFilter, keyFile); - saveToKeyfile(!pedited || pedited->raw.hotdeadpix_thresh, "RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.method, "RAW Bayer", "Method", raw.bayersensor.method, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.imageNum, "RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.ccSteps, "RAW Bayer", "CcSteps", raw.bayersensor.ccSteps, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack0, "RAW Bayer", "PreBlack0", raw.bayersensor.black0, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack1, "RAW Bayer", "PreBlack1", raw.bayersensor.black1, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack2, "RAW Bayer", "PreBlack2", raw.bayersensor.black2, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack3, "RAW Bayer", "PreBlack3", raw.bayersensor.black3, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.exTwoGreen, "RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.linenoise, "RAW Bayer", "LineDenoise", raw.bayersensor.linenoise, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.greenEq, "RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbIterations, "RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbEnhance, "RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.lmmseIterations, "RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotion, "RAW Bayer", "PixelShiftMotion", raw.bayersensor.pixelShiftMotion, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrection, "RAW Bayer", "PixelShiftMotionCorrection", toUnderlying(raw.bayersensor.pixelShiftMotionCorrection), keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod, "RAW Bayer", "PixelShiftMotionCorrectionMethod", toUnderlying(raw.bayersensor.pixelShiftMotionCorrectionMethod), keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorGreen, "RAW Bayer", "pixelShiftStddevFactorGreen", raw.bayersensor.pixelShiftStddevFactorGreen, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorRed, "RAW Bayer", "pixelShiftStddevFactorRed", raw.bayersensor.pixelShiftStddevFactorRed, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorBlue, "RAW Bayer", "pixelShiftStddevFactorBlue", raw.bayersensor.pixelShiftStddevFactorBlue, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEperIso, "RAW Bayer", "PixelShiftEperIso", raw.bayersensor.pixelShiftEperIso, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNreadIso, "RAW Bayer", "PixelShiftNreadIso", raw.bayersensor.pixelShiftNreadIso, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftPrnu, "RAW Bayer", "PixelShiftPrnu", raw.bayersensor.pixelShiftPrnu, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSigma, "RAW Bayer", "PixelShiftSigma", raw.bayersensor.pixelShiftSigma, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSum, "RAW Bayer", "PixelShiftSum", raw.bayersensor.pixelShiftSum, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftRedBlueWeight, "RAW Bayer", "PixelShiftRedBlueWeight", raw.bayersensor.pixelShiftRedBlueWeight, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotion, "RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelShiftShowMotion, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly, "RAW Bayer", "PixelShiftShowMotionMaskOnly", raw.bayersensor.pixelShiftShowMotionMaskOnly, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftAutomatic, "RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenHorizontal, "RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenVertical, "RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftHoleFill, "RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian, "RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian3, "RAW Bayer", "pixelShiftMedian3", raw.bayersensor.pixelShiftMedian3, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftGreen, "RAW Bayer", "pixelShiftGreen", raw.bayersensor.pixelShiftGreen, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftBlur, "RAW Bayer", "pixelShiftBlur", raw.bayersensor.pixelShiftBlur, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSmooth, "RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftExp0, "RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftLmmse, "RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBright, "RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel, "RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross, "RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross2, "RAW Bayer", "pixelShiftNonGreenCross2", raw.bayersensor.pixelShiftNonGreenCross2, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenAmaze, "RAW Bayer", "pixelShiftNonGreenAmaze", raw.bayersensor.pixelShiftNonGreenAmaze, keyFile); - saveToKeyfile(!pedited || pedited->raw.xtranssensor.method, "RAW X-Trans", "Method", raw.xtranssensor.method, keyFile); - saveToKeyfile(!pedited || pedited->raw.xtranssensor.ccSteps, "RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps, keyFile); - saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackRed, "RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred, keyFile); - saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackGreen, "RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen, keyFile); - saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackBlue, "RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue, keyFile); - -// Raw exposition - saveToKeyfile(!pedited || pedited->raw.exPos, "RAW", "PreExposure", raw.expos, keyFile); - saveToKeyfile(!pedited || pedited->raw.exPreser, "RAW", "PrePreserv", raw.preser, keyFile); - -// 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); - } - } - -// 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&) {} - - if (sPParams.empty ()) { - return 1; - } - - int error1, error2; - error1 = write (fname, sPParams); - - if (!fname2.empty ()) { - - error2 = write (fname2, sPParams); - // If at least one file has been saved, it's a success - return error1 & error2; - } else { - return error1; - } -} - -int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) -{ - setlocale (LC_NUMERIC, "C"); // to set decimal point to "." - - if (fname.empty()) { - return 1; - } - - Glib::KeyFile keyFile; - - try { - if (pedited) { - pedited->set (false); - } - - if (!Glib::file_test(fname, Glib::FILE_TEST_EXISTS) || - !keyFile.load_from_file(fname)) { - return 1; - } - - ppVersion = PPVERSION; - appVersion = RTVERSION; - - if (keyFile.has_group ("Version")) { - if (keyFile.has_key ("Version", "AppVersion")) { - appVersion = keyFile.get_string ("Version", "AppVersion"); - } - - if (keyFile.has_key ("Version", "Version")) { - ppVersion = keyFile.get_integer ("Version", "Version"); - } - } - - if (keyFile.has_group ("General")) { - assignFromKeyfile(keyFile, "General", "Rank", pedited, rank, pedited->general.rank); - assignFromKeyfile(keyFile, "General", "ColorLabel", pedited, colorlabel, pedited->general.colorlabel); - assignFromKeyfile(keyFile, "General", "InTrash", pedited, inTrash, pedited->general.intrash); - } - - if (keyFile.has_group ("Exposure")) { - if (ppVersion < PPVERSION_AEXP) { - toneCurve.autoexp = false; // prevent execution of autoexp when opening file created with earlier verions of autoexp algorithm - } else { - assignFromKeyfile(keyFile, "Exposure", "Auto", pedited, toneCurve.autoexp, pedited->toneCurve.autoexp); - } - assignFromKeyfile(keyFile, "Exposure", "Clip", pedited, toneCurve.clip, pedited->toneCurve.clip); - assignFromKeyfile(keyFile, "Exposure", "Compensation", pedited, toneCurve.expcomp, pedited->toneCurve.expcomp); - assignFromKeyfile(keyFile, "Exposure", "Brightness", pedited, toneCurve.brightness, pedited->toneCurve.brightness); - assignFromKeyfile(keyFile, "Exposure", "Contrast", pedited, toneCurve.contrast, pedited->toneCurve.contrast); - assignFromKeyfile(keyFile, "Exposure", "Saturation", pedited, toneCurve.saturation, pedited->toneCurve.saturation); - assignFromKeyfile(keyFile, "Exposure", "Black", pedited, toneCurve.black, pedited->toneCurve.black); - assignFromKeyfile(keyFile, "Exposure", "HighlightCompr", pedited, toneCurve.hlcompr, pedited->toneCurve.hlcompr); - assignFromKeyfile(keyFile, "Exposure", "HighlightComprThreshold", pedited, toneCurve.hlcomprthresh, pedited->toneCurve.hlcomprthresh); - assignFromKeyfile(keyFile, "Exposure", "ShadowCompr", pedited, toneCurve.shcompr, pedited->toneCurve.shcompr); - if (toneCurve.shcompr > 100) { - toneCurve.shcompr = 100; // older pp3 files can have values above 100. - } - - const std::map tc_mapping = { - {"Standard", ToneCurveParams::TcMode::STD}, - {"FilmLike", ToneCurveParams::TcMode::FILMLIKE}, - {"SatAndValueBlending", ToneCurveParams::TcMode::SATANDVALBLENDING}, - {"WeightedStd", ToneCurveParams::TcMode::WEIGHTEDSTD}, - {"Luminance", ToneCurveParams::TcMode::LUMINANCE}, - {"Perceptual", ToneCurveParams::TcMode::PERCEPTUAL} - }; - - assignFromKeyfile(keyFile, "Exposure", "CurveMode", pedited, tc_mapping, toneCurve.curveMode, pedited->toneCurve.curveMode); - assignFromKeyfile(keyFile, "Exposure", "CurveMode2", pedited, tc_mapping, toneCurve.curveMode2, pedited->toneCurve.curveMode2); - - if (ppVersion > 200) { - assignFromKeyfile(keyFile, "Exposure", "Curve", pedited, toneCurve.curve, pedited->toneCurve.curve); - assignFromKeyfile(keyFile, "Exposure", "Curve2", pedited, toneCurve.curve2, pedited->toneCurve.curve2); - } - } - - if (keyFile.has_group ("HLRecovery")) { - assignFromKeyfile(keyFile, "HLRecovery", "Enabled", pedited, toneCurve.hrenabled, pedited->toneCurve.hrenabled); - assignFromKeyfile(keyFile, "HLRecovery", "Method", pedited, toneCurve.method, pedited->toneCurve.method); - } - - if (keyFile.has_group ("Channel Mixer")) { - if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { - const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); - const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); - const std::vector bmix = keyFile.get_integer_list ("Channel Mixer", "Blue"); - - if (rmix.size() == 3 && gmix.size() == 3 && bmix.size() == 3) { - memcpy (chmixer.red, rmix.data(), 3 * sizeof (int)); - memcpy (chmixer.green, gmix.data(), 3 * sizeof (int)); - memcpy (chmixer.blue, bmix.data(), 3 * sizeof (int)); - } - - if (pedited) { - pedited->chmixer.red[0] = pedited->chmixer.red[1] = pedited->chmixer.red[2] = true; - pedited->chmixer.green[0] = pedited->chmixer.green[1] = pedited->chmixer.green[2] = true; - pedited->chmixer.blue[0] = pedited->chmixer.blue[1] = pedited->chmixer.blue[2] = true; - } - } - } - - if (keyFile.has_group ("Black & White")) { - assignFromKeyfile(keyFile, "Black & White", "Enabled", pedited, blackwhite.enabled, pedited->blackwhite.enabled); - assignFromKeyfile(keyFile, "Black & White", "Method", pedited, blackwhite.method, pedited->blackwhite.method); - assignFromKeyfile(keyFile, "Black & White", "Auto", pedited, blackwhite.autoc, pedited->blackwhite.autoc); - assignFromKeyfile(keyFile, "Black & White", "ComplementaryColors", pedited, blackwhite.enabledcc, pedited->blackwhite.enabledcc); - assignFromKeyfile(keyFile, "Black & White", "MixerRed", pedited, blackwhite.mixerRed, pedited->blackwhite.mixerRed); - assignFromKeyfile(keyFile, "Black & White", "MixerOrange", pedited, blackwhite.mixerOrange, pedited->blackwhite.mixerOrange); - assignFromKeyfile(keyFile, "Black & White", "MixerYellow", pedited, blackwhite.mixerYellow, pedited->blackwhite.mixerYellow); - assignFromKeyfile(keyFile, "Black & White", "MixerGreen", pedited, blackwhite.mixerGreen, pedited->blackwhite.mixerGreen); - assignFromKeyfile(keyFile, "Black & White", "MixerCyan", pedited, blackwhite.mixerCyan, pedited->blackwhite.mixerCyan); - assignFromKeyfile(keyFile, "Black & White", "MixerBlue", pedited, blackwhite.mixerBlue, pedited->blackwhite.mixerBlue); - assignFromKeyfile(keyFile, "Black & White", "MixerMagenta", pedited, blackwhite.mixerMagenta, pedited->blackwhite.mixerMagenta); - assignFromKeyfile(keyFile, "Black & White", "MixerPurple", pedited, blackwhite.mixerPurple, pedited->blackwhite.mixerPurple); - assignFromKeyfile(keyFile, "Black & White", "GammaRed", pedited, blackwhite.gammaRed, pedited->blackwhite.gammaRed); - assignFromKeyfile(keyFile, "Black & White", "GammaGreen", pedited, blackwhite.gammaGreen, pedited->blackwhite.gammaGreen); - assignFromKeyfile(keyFile, "Black & White", "GammaBlue", pedited, blackwhite.gammaBlue, pedited->blackwhite.gammaBlue); - assignFromKeyfile(keyFile, "Black & White", "Filter", pedited, blackwhite.filter, pedited->blackwhite.filter); - assignFromKeyfile(keyFile, "Black & White", "Setting", pedited, blackwhite.setting, pedited->blackwhite.setting); - assignFromKeyfile(keyFile, "Black & White", "LuminanceCurve", pedited, blackwhite.luminanceCurve, pedited->blackwhite.luminanceCurve); - - assignFromKeyfile(keyFile, "Black & White", "BeforeCurve", pedited, blackwhite.beforeCurve, pedited->blackwhite.beforeCurve); - - assignFromKeyfile(keyFile, "Black & White", "Algorithm", pedited, blackwhite.algo, pedited->blackwhite.algo); - assignFromKeyfile( - keyFile, - "Black & White", - "BeforeCurveMode", - pedited, - { - {"Standard", BlackWhiteParams::TcMode::STD_BW}, - {"FilmLike", BlackWhiteParams::TcMode::FILMLIKE_BW}, - {"SatAndValueBlending", BlackWhiteParams::TcMode::SATANDVALBLENDING_BW}, - {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} - }, - blackwhite.beforeCurveMode, - pedited->blackwhite.beforeCurveMode - ); - - assignFromKeyfile(keyFile, "Black & White", "AfterCurve", pedited, blackwhite.afterCurve, pedited->blackwhite.afterCurve); - assignFromKeyfile( - keyFile, - "Black & White", - "AfterCurveMode", - pedited, - { - {"Standard", BlackWhiteParams::TcMode::STD_BW}, - {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} - }, - blackwhite.afterCurveMode, - pedited->blackwhite.afterCurveMode - ); - } - - if (keyFile.has_group ("Retinex")) { - assignFromKeyfile(keyFile, "Retinex", "Median", pedited, retinex.medianmap, pedited->retinex.medianmap); - assignFromKeyfile(keyFile, "Retinex", "RetinexMethod", pedited, retinex.retinexMethod, pedited->retinex.retinexMethod); - assignFromKeyfile(keyFile, "Retinex", "mapMethod", pedited, retinex.mapMethod, pedited->retinex.mapMethod); - assignFromKeyfile(keyFile, "Retinex", "viewMethod", pedited, retinex.viewMethod, pedited->retinex.viewMethod); - - assignFromKeyfile(keyFile, "Retinex", "Retinexcolorspace", pedited, retinex.retinexcolorspace, pedited->retinex.retinexcolorspace); - assignFromKeyfile(keyFile, "Retinex", "Gammaretinex", pedited, retinex.gammaretinex, pedited->retinex.gammaretinex); - assignFromKeyfile(keyFile, "Retinex", "Enabled", pedited, retinex.enabled, pedited->retinex.enabled); - assignFromKeyfile(keyFile, "Retinex", "Neigh", pedited, retinex.neigh, pedited->retinex.neigh); - assignFromKeyfile(keyFile, "Retinex", "Str", pedited, retinex.str, pedited->retinex.str); - assignFromKeyfile(keyFile, "Retinex", "Scal", pedited, retinex.scal, pedited->retinex.scal); - assignFromKeyfile(keyFile, "Retinex", "Iter", pedited, retinex.iter, pedited->retinex.iter); - assignFromKeyfile(keyFile, "Retinex", "Grad", pedited, retinex.grad, pedited->retinex.grad); - assignFromKeyfile(keyFile, "Retinex", "Grads", pedited, retinex.grads, pedited->retinex.grads); - assignFromKeyfile(keyFile, "Retinex", "Gam", pedited, retinex.gam, pedited->retinex.gam); - assignFromKeyfile(keyFile, "Retinex", "Slope", pedited, retinex.slope, pedited->retinex.slope); - assignFromKeyfile(keyFile, "Retinex", "Offs", pedited, retinex.offs, pedited->retinex.offs); - assignFromKeyfile(keyFile, "Retinex", "Vart", pedited, retinex.vart, pedited->retinex.vart); - assignFromKeyfile(keyFile, "Retinex", "Limd", pedited, retinex.limd, pedited->retinex.limd); - assignFromKeyfile(keyFile, "Retinex", "highl", pedited, retinex.highl, pedited->retinex.highl); - assignFromKeyfile(keyFile, "Retinex", "skal", pedited, retinex.skal, pedited->retinex.skal); - assignFromKeyfile(keyFile, "Retinex", "CDCurve", pedited, retinex.cdcurve, pedited->retinex.cdcurve); - - assignFromKeyfile(keyFile, "Retinex", "MAPCurve", pedited, retinex.mapcurve, pedited->retinex.mapcurve); - - assignFromKeyfile(keyFile, "Retinex", "CDHCurve", pedited, retinex.cdHcurve, pedited->retinex.cdHcurve); - - assignFromKeyfile(keyFile, "Retinex", "LHCurve", pedited, retinex.lhcurve, pedited->retinex.lhcurve); - - assignFromKeyfile(keyFile, "Retinex", "Highlights", pedited, retinex.highlights, pedited->retinex.highlights); - assignFromKeyfile(keyFile, "Retinex", "HighlightTonalWidth", pedited, retinex.htonalwidth, pedited->retinex.htonalwidth); - assignFromKeyfile(keyFile, "Retinex", "Shadows", pedited, retinex.shadows, pedited->retinex.shadows); - assignFromKeyfile(keyFile, "Retinex", "ShadowTonalWidth", pedited, retinex.stonalwidth, pedited->retinex.stonalwidth); - - assignFromKeyfile(keyFile, "Retinex", "Radius", pedited, retinex.radius, pedited->retinex.radius); - - assignFromKeyfile(keyFile, "Retinex", "TransmissionCurve", pedited, retinex.transmissionCurve, pedited->retinex.transmissionCurve); - - assignFromKeyfile(keyFile, "Retinex", "GainTransmissionCurve", pedited, retinex.gaintransmissionCurve, pedited->retinex.gaintransmissionCurve); - } - - if (keyFile.has_group ("Luminance Curve")) { - assignFromKeyfile(keyFile, "Luminance Curve", "Brightness", pedited, labCurve.brightness, pedited->labCurve.brightness); - assignFromKeyfile(keyFile, "Luminance Curve", "Contrast", pedited, labCurve.contrast, pedited->labCurve.contrast); - - if (ppVersion < 303) { - // transform Saturation into Chromaticity - // if Saturation == 0, should we set BWToning on? - assignFromKeyfile(keyFile, "Luminance Curve", "Saturation", pedited, labCurve.chromaticity, pedited->labCurve.chromaticity); - // transform AvoidColorClipping into AvoidColorShift - assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorClipping", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); - } else { - 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; - } - } - - assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorShift", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); - assignFromKeyfile(keyFile, "Luminance Curve", "RedAndSkinTonesProtection", pedited, labCurve.rstprotection, pedited->labCurve.rstprotection); - } - - assignFromKeyfile(keyFile, "Luminance Curve", "LCredsk", pedited, labCurve.lcredsk, pedited->labCurve.lcredsk); - - if (ppVersion < 314) { - // Backward compatibility: If BWtoning is true, Chromaticity has to be set to -100, which will produce the same effect - // and will enable the b&w toning mode ('a' & 'b' curves) - if (keyFile.has_key ("Luminance Curve", "BWtoning")) { - if ( keyFile.get_boolean ("Luminance Curve", "BWtoning")) { - labCurve.chromaticity = -100; - - if (pedited) { - pedited->labCurve.chromaticity = true; - } - } - } - } - - assignFromKeyfile(keyFile, "Luminance Curve", "LCurve", pedited, labCurve.lcurve, pedited->labCurve.lcurve); - assignFromKeyfile(keyFile, "Luminance Curve", "aCurve", pedited, labCurve.acurve, pedited->labCurve.acurve); - assignFromKeyfile(keyFile, "Luminance Curve", "bCurve", pedited, labCurve.bcurve, pedited->labCurve.bcurve); - assignFromKeyfile(keyFile, "Luminance Curve", "ccCurve", pedited, labCurve.cccurve, pedited->labCurve.cccurve); - assignFromKeyfile(keyFile, "Luminance Curve", "chCurve", pedited, labCurve.chcurve, pedited->labCurve.chcurve); - assignFromKeyfile(keyFile, "Luminance Curve", "lhCurve", pedited, labCurve.lhcurve, pedited->labCurve.lhcurve); - assignFromKeyfile(keyFile, "Luminance Curve", "hhCurve", pedited, labCurve.hhcurve, pedited->labCurve.hhcurve); - assignFromKeyfile(keyFile, "Luminance Curve", "LcCurve", pedited, labCurve.lccurve, pedited->labCurve.lccurve); - assignFromKeyfile(keyFile, "Luminance Curve", "ClCurve", pedited, labCurve.clcurve, pedited->labCurve.clcurve); - } - - if (keyFile.has_group ("Sharpening")) { - assignFromKeyfile(keyFile, "Sharpening", "Enabled", pedited, sharpening.enabled, pedited->sharpening.enabled); - assignFromKeyfile(keyFile, "Sharpening", "Radius", pedited, sharpening.radius, pedited->sharpening.radius); - assignFromKeyfile(keyFile, "Sharpening", "Amount", pedited, sharpening.amount, pedited->sharpening.amount); - - if (keyFile.has_key ("Sharpening", "Threshold")) { - if (ppVersion < 302) { - int thresh = min (keyFile.get_integer ("Sharpening", "Threshold"), 2000); - sharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization - } else { - const std::vector thresh = keyFile.get_integer_list ("Sharpening", "Threshold"); - - if (thresh.size() >= 4) { - sharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); - } - } - - if (pedited) { - pedited->sharpening.threshold = true; - } - } - - assignFromKeyfile(keyFile, "Sharpening", "OnlyEdges", pedited, sharpening.edgesonly, pedited->sharpening.edgesonly); - assignFromKeyfile(keyFile, "Sharpening", "EdgedetectionRadius", pedited, sharpening.edges_radius, pedited->sharpening.edges_radius); - assignFromKeyfile(keyFile, "Sharpening", "EdgeTolerance", pedited, sharpening.edges_tolerance, pedited->sharpening.edges_tolerance); - assignFromKeyfile(keyFile, "Sharpening", "HalocontrolEnabled", pedited, sharpening.halocontrol, pedited->sharpening.halocontrol); - assignFromKeyfile(keyFile, "Sharpening", "HalocontrolAmount", pedited, sharpening.halocontrol_amount, pedited->sharpening.halocontrol_amount); - assignFromKeyfile(keyFile, "Sharpening", "Method", pedited, sharpening.method, pedited->sharpening.method); - assignFromKeyfile(keyFile, "Sharpening", "DeconvRadius", pedited, sharpening.deconvradius, pedited->sharpening.deconvradius); - assignFromKeyfile(keyFile, "Sharpening", "DeconvAmount", pedited, sharpening.deconvamount, pedited->sharpening.deconvamount); - assignFromKeyfile(keyFile, "Sharpening", "DeconvDamping", pedited, sharpening.deconvdamping, pedited->sharpening.deconvdamping); - assignFromKeyfile(keyFile, "Sharpening", "DeconvIterations", pedited, sharpening.deconviter, pedited->sharpening.deconviter); - } - - if (keyFile.has_group ("SharpenEdge")) { - assignFromKeyfile(keyFile, "SharpenEdge", "Enabled", pedited, sharpenEdge.enabled, pedited->sharpenEdge.enabled); - assignFromKeyfile(keyFile, "SharpenEdge", "Passes", pedited, sharpenEdge.passes, pedited->sharpenEdge.passes); - assignFromKeyfile(keyFile, "SharpenEdge", "Strength", pedited, sharpenEdge.amount, pedited->sharpenEdge.amount); - assignFromKeyfile(keyFile, "SharpenEdge", "ThreeChannels", pedited, sharpenEdge.threechannels, pedited->sharpenEdge.threechannels); - } - - if (keyFile.has_group ("SharpenMicro")) { - assignFromKeyfile(keyFile, "SharpenMicro", "Enabled", pedited, sharpenMicro.enabled, pedited->sharpenMicro.enabled); - assignFromKeyfile(keyFile, "SharpenMicro", "Matrix", pedited, sharpenMicro.matrix, pedited->sharpenMicro.matrix); - assignFromKeyfile(keyFile, "SharpenMicro", "Strength", pedited, sharpenMicro.amount, pedited->sharpenMicro.amount); - assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, sharpenMicro.uniformity, pedited->sharpenMicro.uniformity); - } - - if (keyFile.has_group ("Vibrance")) { - assignFromKeyfile(keyFile, "Vibrance", "Enabled", pedited, vibrance.enabled, pedited->vibrance.enabled); - assignFromKeyfile(keyFile, "Vibrance", "Pastels", pedited, vibrance.pastels, pedited->vibrance.pastels); - assignFromKeyfile(keyFile, "Vibrance", "Saturated", pedited, vibrance.saturated, pedited->vibrance.saturated); - - if (keyFile.has_key ("Vibrance", "PSThreshold")) { - if (ppVersion < 302) { - int thresh = keyFile.get_integer ("Vibrance", "PSThreshold"); - vibrance.psthreshold.setValues (thresh, thresh); - } else { - const std::vector thresh = keyFile.get_integer_list ("Vibrance", "PSThreshold"); - - if (thresh.size() >= 2 ) { - vibrance.psthreshold.setValues (thresh[0], thresh[1]); - } - } - - if (pedited) { - pedited->vibrance.psthreshold = true; - } - } - - assignFromKeyfile(keyFile, "Vibrance", "ProtectSkins", pedited, vibrance.protectskins, pedited->vibrance.protectskins); - assignFromKeyfile(keyFile, "Vibrance", "AvoidColorShift", pedited, vibrance.avoidcolorshift, pedited->vibrance.avoidcolorshift); - assignFromKeyfile(keyFile, "Vibrance", "PastSatTog", pedited, vibrance.pastsattog, pedited->vibrance.pastsattog); - assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); - } - - if (keyFile.has_group ("White Balance")) { - assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); - assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); - assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); - assignFromKeyfile(keyFile, "White Balance", "Equal", pedited, wb.equal, pedited->wb.equal); - assignFromKeyfile(keyFile, "White Balance", "TemperatureBias", pedited, wb.tempBias, pedited->wb.tempBias); - } - - if (keyFile.has_group ("Defringing")) { - assignFromKeyfile(keyFile, "Defringing", "Enabled", pedited, defringe.enabled, pedited->defringe.enabled); - assignFromKeyfile(keyFile, "Defringing", "Radius", pedited, defringe.radius, pedited->defringe.radius); - - if (keyFile.has_key ("Defringing", "Threshold")) { - defringe.threshold = (float)keyFile.get_integer ("Defringing", "Threshold"); - - if (pedited) { - pedited->defringe.threshold = true; - } - } - - if (ppVersion < 310) { - defringe.threshold = sqrt (defringe.threshold * 33.f / 5.f); - } - - assignFromKeyfile(keyFile, "Defringing", "HueCurve", pedited, defringe.huecurve, pedited->defringe.huecurve); - } - - if (keyFile.has_group ("Color appearance")) { - assignFromKeyfile(keyFile, "Color appearance", "Enabled", pedited, colorappearance.enabled, pedited->colorappearance.enabled); - assignFromKeyfile(keyFile, "Color appearance", "Degree", pedited, colorappearance.degree, pedited->colorappearance.degree); - assignFromKeyfile(keyFile, "Color appearance", "AutoDegree", pedited, colorappearance.autodegree, pedited->colorappearance.autodegree); - assignFromKeyfile(keyFile, "Color appearance", "Degreeout", pedited, colorappearance.degreeout, pedited->colorappearance.degreeout); - - assignFromKeyfile(keyFile, "Color appearance", "AutoDegreeout", pedited, colorappearance.autodegreeout, pedited->colorappearance.autodegreeout); - - assignFromKeyfile(keyFile, "Color appearance", "Surround", pedited, colorappearance.surround, pedited->colorappearance.surround); - assignFromKeyfile(keyFile, "Color appearance", "Surrsrc", pedited, colorappearance.surrsrc, pedited->colorappearance.surrsrc); - assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); - assignFromKeyfile(keyFile, "Color appearance", "Badpixsl", pedited, colorappearance.badpixsl, pedited->colorappearance.badpixsl); - assignFromKeyfile(keyFile, "Color appearance", "Model", pedited, colorappearance.wbmodel, pedited->colorappearance.wbmodel); - assignFromKeyfile(keyFile, "Color appearance", "Algorithm", pedited, colorappearance.algo, pedited->colorappearance.algo); - assignFromKeyfile(keyFile, "Color appearance", "J-Light", pedited, colorappearance.jlight, pedited->colorappearance.jlight); - assignFromKeyfile(keyFile, "Color appearance", "Q-Bright", pedited, colorappearance.qbright, pedited->colorappearance.qbright); - assignFromKeyfile(keyFile, "Color appearance", "C-Chroma", pedited, colorappearance.chroma, pedited->colorappearance.chroma); - assignFromKeyfile(keyFile, "Color appearance", "S-Chroma", pedited, colorappearance.schroma, pedited->colorappearance.schroma); - assignFromKeyfile(keyFile, "Color appearance", "M-Chroma", pedited, colorappearance.mchroma, pedited->colorappearance.mchroma); - assignFromKeyfile(keyFile, "Color appearance", "RSTProtection", pedited, colorappearance.rstprotection, pedited->colorappearance.rstprotection); - assignFromKeyfile(keyFile, "Color appearance", "J-Contrast", pedited, colorappearance.contrast, pedited->colorappearance.contrast); - assignFromKeyfile(keyFile, "Color appearance", "Q-Contrast", pedited, colorappearance.qcontrast, pedited->colorappearance.qcontrast); - assignFromKeyfile(keyFile, "Color appearance", "H-Hue", pedited, colorappearance.colorh, pedited->colorappearance.colorh); - assignFromKeyfile(keyFile, "Color appearance", "AdaptScene", pedited, colorappearance.adapscen, pedited->colorappearance.adapscen); - assignFromKeyfile(keyFile, "Color appearance", "AutoAdapscen", pedited, colorappearance.autoadapscen, pedited->colorappearance.autoadapscen); - assignFromKeyfile(keyFile, "Color appearance", "YbScene", pedited, colorappearance.ybscen, pedited->colorappearance.ybscen); - assignFromKeyfile(keyFile, "Color appearance", "Autoybscen", pedited, colorappearance.autoybscen, pedited->colorappearance.autoybscen); - assignFromKeyfile(keyFile, "Color appearance", "SurrSource", pedited, colorappearance.surrsource, pedited->colorappearance.surrsource); - assignFromKeyfile(keyFile, "Color appearance", "Gamut", pedited, colorappearance.gamut, pedited->colorappearance.gamut); - assignFromKeyfile(keyFile, "Color appearance", "Tempout", pedited, colorappearance.tempout, pedited->colorappearance.tempout); - assignFromKeyfile(keyFile, "Color appearance", "Greenout", pedited, colorappearance.greenout, pedited->colorappearance.greenout); - assignFromKeyfile(keyFile, "Color appearance", "Tempsc", pedited, colorappearance.tempsc, pedited->colorappearance.tempsc); - assignFromKeyfile(keyFile, "Color appearance", "Greensc", pedited, colorappearance.greensc, pedited->colorappearance.greensc); - assignFromKeyfile(keyFile, "Color appearance", "Ybout", pedited, colorappearance.ybout, pedited->colorappearance.ybout); - assignFromKeyfile(keyFile, "Color appearance", "Datacie", pedited, colorappearance.datacie, pedited->colorappearance.datacie); - assignFromKeyfile(keyFile, "Color appearance", "Tonecie", pedited, colorappearance.tonecie, pedited->colorappearance.tonecie); - - const std::map tc_mapping = { - {"Lightness", ColorAppearanceParams::TcMode::LIGHT}, - {"Brightness", ColorAppearanceParams::TcMode::BRIGHT} - }; - assignFromKeyfile(keyFile, "Color appearance", "CurveMode", pedited, tc_mapping, colorappearance.curveMode, pedited->colorappearance.curveMode); - assignFromKeyfile(keyFile, "Color appearance", "CurveMode2", pedited, tc_mapping, colorappearance.curveMode2, pedited->colorappearance.curveMode2); - - assignFromKeyfile( - keyFile, - "Color appearance", - "CurveMode3", - pedited, - { - {"Chroma", ColorAppearanceParams::CtcMode::CHROMA}, - {"Saturation", ColorAppearanceParams::CtcMode::SATUR}, - {"Colorfullness", ColorAppearanceParams::CtcMode::COLORF} - }, - colorappearance.curveMode3, - pedited->colorappearance.curveMode3 - ); - - if (ppVersion > 200) { - assignFromKeyfile(keyFile, "Color appearance", "Curve", pedited, colorappearance.curve, pedited->colorappearance.curve); - assignFromKeyfile(keyFile, "Color appearance", "Curve2", pedited, colorappearance.curve2, pedited->colorappearance.curve2); - assignFromKeyfile(keyFile, "Color appearance", "Curve3", pedited, colorappearance.curve3, pedited->colorappearance.curve3); - } - - } - - if (keyFile.has_group ("Impulse Denoising")) { - assignFromKeyfile(keyFile, "Impulse Denoising", "Enabled", pedited, impulseDenoise.enabled, pedited->impulseDenoise.enabled); - assignFromKeyfile(keyFile, "Impulse Denoising", "Threshold", pedited, impulseDenoise.thresh, pedited->impulseDenoise.thresh); - } - - if (keyFile.has_group ("Directional Pyramid Denoising")) {//TODO: No longer an accurate description for FT denoise - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enabled", pedited, dirpyrDenoise.enabled, pedited->dirpyrDenoise.enabled); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enhance", pedited, dirpyrDenoise.enhance, pedited->dirpyrDenoise.enhance); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Median", pedited, dirpyrDenoise.median, pedited->dirpyrDenoise.median); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Luma", pedited, dirpyrDenoise.luma, pedited->dirpyrDenoise.luma); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Ldetail", pedited, dirpyrDenoise.Ldetail, pedited->dirpyrDenoise.Ldetail); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Chroma", pedited, dirpyrDenoise.chroma, pedited->dirpyrDenoise.chroma); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Method", pedited, dirpyrDenoise.dmethod, pedited->dirpyrDenoise.dmethod); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LMethod", pedited, dirpyrDenoise.Lmethod, pedited->dirpyrDenoise.Lmethod); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CMethod", pedited, dirpyrDenoise.Cmethod, pedited->dirpyrDenoise.Cmethod); - - if (dirpyrDenoise.Cmethod == "PRE") { - dirpyrDenoise.Cmethod = "MAN"; // Never load 'auto chroma preview mode' from pp3 - } - - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "C2Method", pedited, dirpyrDenoise.C2method, pedited->dirpyrDenoise.C2method); - if (dirpyrDenoise.C2method == "PREV") { - dirpyrDenoise.C2method = "MANU"; - } - - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "SMethod", pedited, dirpyrDenoise.smethod, pedited->dirpyrDenoise.smethod); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MedMethod", pedited, dirpyrDenoise.medmethod, pedited->dirpyrDenoise.medmethod); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MethodMed", pedited, dirpyrDenoise.methodmed, pedited->dirpyrDenoise.methodmed); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "RGBMethod", pedited, dirpyrDenoise.rgbmethod, pedited->dirpyrDenoise.rgbmethod); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LCurve", pedited, dirpyrDenoise.lcurve, pedited->dirpyrDenoise.lcurve); - - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CCCurve", pedited, dirpyrDenoise.cccurve, pedited->dirpyrDenoise.cccurve); - - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Redchro", pedited, dirpyrDenoise.redchro, pedited->dirpyrDenoise.redchro); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Bluechro", pedited, dirpyrDenoise.bluechro, pedited->dirpyrDenoise.bluechro); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Gamma", pedited, dirpyrDenoise.gamma, pedited->dirpyrDenoise.gamma); - assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Passes", pedited, dirpyrDenoise.passes, pedited->dirpyrDenoise.passes); - } - - if (keyFile.has_group ("EPD")) { - assignFromKeyfile(keyFile, "EPD", "Enabled", pedited, epd.enabled, pedited->epd.enabled); - assignFromKeyfile(keyFile, "EPD", "Strength", pedited, epd.strength, pedited->epd.strength); - assignFromKeyfile(keyFile, "EPD", "Gamma", pedited, epd.gamma, pedited->epd.gamma); - assignFromKeyfile(keyFile, "EPD", "EdgeStopping", pedited, epd.edgeStopping, pedited->epd.edgeStopping); - assignFromKeyfile(keyFile, "EPD", "Scale", pedited, epd.scale, pedited->epd.scale); - assignFromKeyfile(keyFile, "EPD", "ReweightingIterates", pedited, epd.reweightingIterates, pedited->epd.reweightingIterates); - } - - if (keyFile.has_group ("FattalToneMapping")) { - assignFromKeyfile(keyFile, "FattalToneMapping", "Enabled", pedited, fattal.enabled, pedited->fattal.enabled); - assignFromKeyfile(keyFile, "FattalToneMapping", "Threshold", pedited, fattal.threshold, pedited->fattal.threshold); - assignFromKeyfile(keyFile, "FattalToneMapping", "Amount", pedited, fattal.amount, pedited->fattal.amount); - } - - if (keyFile.has_group ("Shadows & Highlights")) { - assignFromKeyfile(keyFile, "Shadows & Highlights", "Enabled", pedited, sh.enabled, pedited->sh.enabled); - assignFromKeyfile(keyFile, "Shadows & Highlights", "HighQuality", pedited, sh.hq, pedited->sh.hq); - assignFromKeyfile(keyFile, "Shadows & Highlights", "Highlights", pedited, sh.highlights, pedited->sh.highlights); - assignFromKeyfile(keyFile, "Shadows & Highlights", "HighlightTonalWidth", pedited, sh.htonalwidth, pedited->sh.htonalwidth); - assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows); - assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth); - assignFromKeyfile(keyFile, "Shadows & Highlights", "LocalContrast", pedited, sh.localcontrast, pedited->sh.localcontrast); - assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius); - } - - if (keyFile.has_group ("Crop")) { - assignFromKeyfile(keyFile, "Crop", "Enabled", pedited, crop.enabled, pedited->crop.enabled); - assignFromKeyfile(keyFile, "Crop", "X", pedited, crop.x, pedited->crop.x); - assignFromKeyfile(keyFile, "Crop", "Y", pedited, crop.y, pedited->crop.y); - - if (keyFile.has_key ("Crop", "W")) { - crop.w = std::max (keyFile.get_integer ("Crop", "W"), 1); - - if (pedited) { - pedited->crop.w = true; - } - } - - if (keyFile.has_key ("Crop", "H")) { - crop.h = std::max (keyFile.get_integer ("Crop", "H"), 1); - - if (pedited) { - pedited->crop.h = true; - } - } - - assignFromKeyfile(keyFile, "Crop", "FixedRatio", pedited, crop.fixratio, pedited->crop.fixratio); - - if (assignFromKeyfile(keyFile, "Crop", "Ratio", pedited, crop.ratio, pedited->crop.ratio)) { - //backwards compatibility for crop.ratio - if (crop.ratio == "DIN") { - crop.ratio = "1.414 - DIN EN ISO 216"; - } - - if (crop.ratio == "8.5:11") { - crop.ratio = "8.5:11 - US Letter"; - } - - if (crop.ratio == "11:17") { - crop.ratio = "11:17 - Tabloid"; - } - } - assignFromKeyfile(keyFile, "Crop", "Orientation", pedited, crop.orientation, pedited->crop.orientation); - assignFromKeyfile(keyFile, "Crop", "Guide", pedited, crop.guide, pedited->crop.guide); - } - - if (keyFile.has_group ("Coarse Transformation")) { - assignFromKeyfile(keyFile, "Coarse Transformation", "Rotate", pedited, coarse.rotate, pedited->coarse.rotate); - assignFromKeyfile(keyFile, "Coarse Transformation", "HorizontalFlip", pedited, coarse.hflip, pedited->coarse.hflip); - assignFromKeyfile(keyFile, "Coarse Transformation", "VerticalFlip", pedited, coarse.vflip, pedited->coarse.vflip); - } - - if (keyFile.has_group ("Rotation")) { - assignFromKeyfile(keyFile, "Rotation", "Degree", pedited, rotate.degree, pedited->rotate.degree); - } - - if (keyFile.has_group ("Common Properties for Transformations")) { - assignFromKeyfile(keyFile, "Common Properties for Transformations", "AutoFill", pedited, commonTrans.autofill, pedited->commonTrans.autofill); - } - - if (keyFile.has_group ("Distortion")) { - assignFromKeyfile(keyFile, "Distortion", "Amount", pedited, distortion.amount, pedited->distortion.amount); - } - - if (keyFile.has_group ("LensProfile")) { - if (keyFile.has_key ("LensProfile", "LcMode")) { - lensProf.lcMode = lensProf.getMethodNumber (keyFile.get_string ("LensProfile", "LcMode")); - - if (pedited) { - pedited->lensProf.lcMode = true; - } - } - - if (keyFile.has_key ("LensProfile", "LCPFile")) { - lensProf.lcpFile = expandRelativePath (fname, "", keyFile.get_string ("LensProfile", "LCPFile")); - - if (pedited) { - pedited->lensProf.lcpFile = true; - } - - if (ppVersion < 327 && !lensProf.lcpFile.empty()) { - lensProf.lcMode = LensProfParams::LcMode::LCP; - } - } - - assignFromKeyfile(keyFile, "LensProfile", "UseDistortion", pedited, lensProf.useDist, pedited->lensProf.useDist); - assignFromKeyfile(keyFile, "LensProfile", "UseVignette", pedited, lensProf.useVign, pedited->lensProf.useVign); - assignFromKeyfile(keyFile, "LensProfile", "UseCA", pedited, lensProf.useCA, pedited->lensProf.useCA); - - if (keyFile.has_key("LensProfile", "LFCameraMake")) { - lensProf.lfCameraMake = keyFile.get_string("LensProfile", "LFCameraMake"); - if (pedited) { - pedited->lensProf.lfCameraMake = true; - } - } - - if (keyFile.has_key("LensProfile", "LFCameraModel")) { - lensProf.lfCameraModel = keyFile.get_string("LensProfile", "LFCameraModel"); - if (pedited) { - pedited->lensProf.lfCameraModel = true; - } - } - - if (keyFile.has_key("LensProfile", "LFLens")) { - lensProf.lfLens = keyFile.get_string("LensProfile", "LFLens"); - if (pedited) { - pedited->lensProf.lfLens = true; - } - } - } - - if (keyFile.has_group ("Perspective")) { - assignFromKeyfile(keyFile, "Perspective", "Horizontal", pedited, perspective.horizontal, pedited->perspective.horizontal); - assignFromKeyfile(keyFile, "Perspective", "Vertical", pedited, perspective.vertical, pedited->perspective.vertical); - } - - if (keyFile.has_group ("Gradient")) { - assignFromKeyfile(keyFile, "Gradient", "Enabled", pedited, gradient.enabled, pedited->gradient.enabled); - assignFromKeyfile(keyFile, "Gradient", "Degree", pedited, gradient.degree, pedited->gradient.degree); - assignFromKeyfile(keyFile, "Gradient", "Feather", pedited, gradient.feather, pedited->gradient.feather); - assignFromKeyfile(keyFile, "Gradient", "Strength", pedited, gradient.strength, pedited->gradient.strength); - assignFromKeyfile(keyFile, "Gradient", "CenterX", pedited, gradient.centerX, pedited->gradient.centerX); - assignFromKeyfile(keyFile, "Gradient", "CenterY", pedited, gradient.centerY, pedited->gradient.centerY); - } - - if (keyFile.has_group ("PCVignette")) { - assignFromKeyfile(keyFile, "PCVignette", "Enabled", pedited, pcvignette.enabled, pedited->pcvignette.enabled); - assignFromKeyfile(keyFile, "PCVignette", "Strength", pedited, pcvignette.strength, pedited->pcvignette.strength); - assignFromKeyfile(keyFile, "PCVignette", "Feather", pedited, pcvignette.feather, pedited->pcvignette.feather); - assignFromKeyfile(keyFile, "PCVignette", "Roundness", pedited, pcvignette.roundness, pedited->pcvignette.roundness); - } - - if (keyFile.has_group ("CACorrection")) { - assignFromKeyfile(keyFile, "CACorrection", "Red", pedited, cacorrection.red, pedited->cacorrection.red); - assignFromKeyfile(keyFile, "CACorrection", "Blue", pedited, cacorrection.blue, pedited->cacorrection.blue); - } - - if (keyFile.has_group ("Vignetting Correction")) { - assignFromKeyfile(keyFile, "Vignetting Correction", "Amount", pedited, vignetting.amount, pedited->vignetting.amount); - assignFromKeyfile(keyFile, "Vignetting Correction", "Radius", pedited, vignetting.radius, pedited->vignetting.radius); - assignFromKeyfile(keyFile, "Vignetting Correction", "Strength", pedited, vignetting.strength, pedited->vignetting.strength); - assignFromKeyfile(keyFile, "Vignetting Correction", "CenterX", pedited, vignetting.centerX, pedited->vignetting.centerX); - assignFromKeyfile(keyFile, "Vignetting Correction", "CenterY", pedited, vignetting.centerY, pedited->vignetting.centerY); - } - - if (keyFile.has_group ("Resize")) { - assignFromKeyfile(keyFile, "Resize", "Enabled", pedited, resize.enabled, pedited->resize.enabled); - assignFromKeyfile(keyFile, "Resize", "Scale", pedited, resize.scale, pedited->resize.scale); - assignFromKeyfile(keyFile, "Resize", "AppliesTo", pedited, resize.appliesTo, pedited->resize.appliesTo); - assignFromKeyfile(keyFile, "Resize", "Method", pedited, resize.method, pedited->resize.method); - assignFromKeyfile(keyFile, "Resize", "DataSpecified", pedited, resize.dataspec, pedited->resize.dataspec); - assignFromKeyfile(keyFile, "Resize", "Width", pedited, resize.width, pedited->resize.width); - assignFromKeyfile(keyFile, "Resize", "Height", pedited, resize.height, pedited->resize.height); - } - - if (keyFile.has_group ("PostResizeSharpening")) { - assignFromKeyfile(keyFile, "PostResizeSharpening", "Enabled", pedited, prsharpening.enabled, pedited->prsharpening.enabled); - assignFromKeyfile(keyFile, "PostResizeSharpening", "Radius", pedited, prsharpening.radius, pedited->prsharpening.radius); - assignFromKeyfile(keyFile, "PostResizeSharpening", "Amount", pedited, prsharpening.amount, pedited->prsharpening.amount); - - if (keyFile.has_key ("PostResizeSharpening", "Threshold")) { - if (ppVersion < 302) { - int thresh = min (keyFile.get_integer ("PostResizeSharpening", "Threshold"), 2000); - prsharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization - } else { - const std::vector thresh = keyFile.get_integer_list ("PostResizeSharpening", "Threshold"); - - if (thresh.size() >= 4) { - prsharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); - } - } - - if (pedited) { - pedited->prsharpening.threshold = true; - } - } - - assignFromKeyfile(keyFile, "PostResizeSharpening", "OnlyEdges", pedited, prsharpening.edgesonly, pedited->prsharpening.edgesonly); - assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgedetectionRadius", pedited, prsharpening.edges_radius, pedited->prsharpening.edges_radius); - assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgeTolerance", pedited, prsharpening.edges_tolerance, pedited->prsharpening.edges_tolerance); - assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolEnabled", pedited, prsharpening.halocontrol, pedited->prsharpening.halocontrol); - assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolAmount", pedited, prsharpening.halocontrol_amount, pedited->prsharpening.halocontrol_amount); - assignFromKeyfile(keyFile, "PostResizeSharpening", "Method", pedited, prsharpening.method, pedited->prsharpening.method); - assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvRadius", pedited, prsharpening.deconvradius, pedited->prsharpening.deconvradius); - assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvAmount", pedited, prsharpening.deconvamount, pedited->prsharpening.deconvamount); - assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvDamping", pedited, prsharpening.deconvdamping, pedited->prsharpening.deconvdamping); - assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvIterations", pedited, prsharpening.deconviter, pedited->prsharpening.deconviter); - } - - if (keyFile.has_group ("Color Management")) { - if (keyFile.has_key ("Color Management", "InputProfile")) { - icm.input = expandRelativePath (fname, "file:", keyFile.get_string ("Color Management", "InputProfile")); - - if (pedited) { - pedited->icm.input = true; - } - } - - assignFromKeyfile(keyFile, "Color Management", "ToneCurve", pedited, icm.toneCurve, pedited->icm.toneCurve); - assignFromKeyfile(keyFile, "Color Management", "ApplyLookTable", pedited, icm.applyLookTable, pedited->icm.applyLookTable); - assignFromKeyfile(keyFile, "Color Management", "ApplyBaselineExposureOffset", pedited, icm.applyBaselineExposureOffset, pedited->icm.applyBaselineExposureOffset); - assignFromKeyfile(keyFile, "Color Management", "ApplyHueSatMap", pedited, icm.applyHueSatMap, pedited->icm.applyHueSatMap); - assignFromKeyfile(keyFile, "Color Management", "DCPIlluminant", pedited, icm.dcpIlluminant, pedited->icm.dcpIlluminant); - assignFromKeyfile(keyFile, "Color Management", "WorkingProfile", pedited, icm.working, pedited->icm.working); - assignFromKeyfile(keyFile, "Color Management", "OutputProfile", pedited, icm.output, pedited->icm.output); - - if (keyFile.has_key ("Color Management", "OutputProfileIntent")) { - Glib::ustring intent = keyFile.get_string ("Color Management", "OutputProfileIntent"); - - if (intent == "Perceptual") { - icm.outputIntent = RI_PERCEPTUAL; - } else if (intent == "Relative") { - icm.outputIntent = RI_RELATIVE; - } else if (intent == "Saturation") { - icm.outputIntent = RI_SATURATION; - } else if (intent == "Absolute") { - icm.outputIntent = RI_ABSOLUTE; - } - - if (pedited) { - pedited->icm.outputIntent = true; - } - } - - assignFromKeyfile(keyFile, "Color Management", "OutputBPC", pedited, icm.outputBPC, pedited->icm.outputBPC); - assignFromKeyfile(keyFile, "Color Management", "Gammafree", pedited, icm.gamma, pedited->icm.gamma); - assignFromKeyfile(keyFile, "Color Management", "Freegamma", pedited, icm.freegamma, pedited->icm.freegamma); - assignFromKeyfile(keyFile, "Color Management", "GammaValue", pedited, icm.gampos, pedited->icm.gampos); - assignFromKeyfile(keyFile, "Color Management", "GammaSlope", pedited, icm.slpos, pedited->icm.slpos); - } - - if (keyFile.has_group ("Wavelet")) { - assignFromKeyfile(keyFile, "Wavelet", "Enabled", pedited, wavelet.enabled, pedited->wavelet.enabled); - assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); - assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); - assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); - assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); - assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); - assignFromKeyfile(keyFile, "Wavelet", "Linkedg", pedited, wavelet.linkedg, pedited->wavelet.linkedg); - assignFromKeyfile(keyFile, "Wavelet", "CBenab", pedited, wavelet.cbenab, pedited->wavelet.cbenab); - assignFromKeyfile(keyFile, "Wavelet", "CBgreenhigh", pedited, wavelet.greenhigh, pedited->wavelet.greenhigh); - assignFromKeyfile(keyFile, "Wavelet", "CBgreenmed", pedited, wavelet.greenmed, pedited->wavelet.greenmed); - assignFromKeyfile(keyFile, "Wavelet", "CBgreenlow", pedited, wavelet.greenlow, pedited->wavelet.greenlow); - assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); - assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); - assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); - assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); - assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); - assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); - assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, wavelet.Lmethod, pedited->wavelet.Lmethod); - assignFromKeyfile(keyFile, "Wavelet", "ChoiceLevMethod", pedited, wavelet.CLmethod, pedited->wavelet.CLmethod); - assignFromKeyfile(keyFile, "Wavelet", "BackMethod", pedited, wavelet.Backmethod, pedited->wavelet.Backmethod); - assignFromKeyfile(keyFile, "Wavelet", "TilesMethod", pedited, wavelet.Tilesmethod, pedited->wavelet.Tilesmethod); - assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); - assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); - assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); - assignFromKeyfile(keyFile, "Wavelet", "CHSLromaMethod", pedited, wavelet.CHSLmethod, pedited->wavelet.CHSLmethod); - assignFromKeyfile(keyFile, "Wavelet", "EDMethod", pedited, wavelet.EDmethod, pedited->wavelet.EDmethod); - assignFromKeyfile(keyFile, "Wavelet", "NPMethod", pedited, wavelet.NPmethod, pedited->wavelet.NPmethod); - assignFromKeyfile(keyFile, "Wavelet", "BAMethod", pedited, wavelet.BAmethod, pedited->wavelet.BAmethod); - assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); - assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); - assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); - assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); - assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); - assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); - assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); - assignFromKeyfile(keyFile, "Wavelet", "Residualgamma", pedited, wavelet.gamma, pedited->wavelet.gamma); - assignFromKeyfile(keyFile, "Wavelet", "ContExtra", pedited, wavelet.sup, pedited->wavelet.sup); - assignFromKeyfile(keyFile, "Wavelet", "HueRangeResidual", pedited, wavelet.sky, pedited->wavelet.sky); - assignFromKeyfile(keyFile, "Wavelet", "MaxLev", pedited, wavelet.thres, pedited->wavelet.thres); - assignFromKeyfile(keyFile, "Wavelet", "ThresholdHighlight", pedited, wavelet.threshold, pedited->wavelet.threshold); - assignFromKeyfile(keyFile, "Wavelet", "ThresholdShadow", pedited, wavelet.threshold2, pedited->wavelet.threshold2); - assignFromKeyfile(keyFile, "Wavelet", "Edgedetect", pedited, wavelet.edgedetect, pedited->wavelet.edgedetect); - assignFromKeyfile(keyFile, "Wavelet", "Edgedetectthr", pedited, wavelet.edgedetectthr, pedited->wavelet.edgedetectthr); - assignFromKeyfile(keyFile, "Wavelet", "EdgedetectthrHi", pedited, wavelet.edgedetectthr2, pedited->wavelet.edgedetectthr2); - assignFromKeyfile(keyFile, "Wavelet", "Edgesensi", pedited, wavelet.edgesensi, pedited->wavelet.edgesensi); - assignFromKeyfile(keyFile, "Wavelet", "Edgeampli", pedited, wavelet.edgeampli, pedited->wavelet.edgeampli); - assignFromKeyfile(keyFile, "Wavelet", "ThresholdChroma", pedited, wavelet.chroma, pedited->wavelet.chroma); - assignFromKeyfile(keyFile, "Wavelet", "ChromaLink", pedited, wavelet.chro, pedited->wavelet.chro); - assignFromKeyfile(keyFile, "Wavelet", "Contrast", pedited, wavelet.contrast, pedited->wavelet.contrast); - assignFromKeyfile(keyFile, "Wavelet", "Edgrad", pedited, wavelet.edgrad, pedited->wavelet.edgrad); - assignFromKeyfile(keyFile, "Wavelet", "Edgval", pedited, wavelet.edgval, pedited->wavelet.edgval); - assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); - assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); - assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); - assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); - assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); - assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); - assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); - assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); - assignFromKeyfile(keyFile, "Wavelet", "HHcurve", pedited, wavelet.hhcurve, pedited->wavelet.hhcurve); - assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); - assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); - - if (keyFile.has_key ("Wavelet", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Hueskin"); - - if (thresh.size() >= 4) { - wavelet.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hueskin = true; - } - } - - if (keyFile.has_key ("Wavelet", "HueRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HueRange"); - - if (thresh.size() >= 4) { - wavelet.hueskin2.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hueskin2 = true; - } - } - - if (keyFile.has_key ("Wavelet", "HLRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HLRange"); - - if (thresh.size() >= 4) { - wavelet.hllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hllev = true; - } - } - - if (keyFile.has_key ("Wavelet", "SHRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "SHRange"); - - if (thresh.size() >= 4) { - wavelet.bllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.bllev = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgcont")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Edgcont"); - - if (thresh.size() >= 4) { - wavelet.edgcont.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.edgcont = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level0noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level0noise"); - - if (thresh.size() >= 2) { - wavelet.level0noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level0noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level1noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level1noise"); - - if (thresh.size() >= 2) { - wavelet.level1noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level1noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level2noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level2noise"); - - if (thresh.size() >= 2) { - wavelet.level2noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level2noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level3noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); - - if (thresh.size() >= 2) { - wavelet.level3noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level3noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Pastlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); - - if (thresh.size() >= 4) { - wavelet.pastlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.pastlev = true; - } - } - - if (keyFile.has_key ("Wavelet", "Satlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Satlev"); - - if (thresh.size() >= 4) { - wavelet.satlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.satlev = true; - } - } - - assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); - assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); - assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); - - for (int i = 0; i < 9; ++i) { - std::stringstream ss; - ss << "Contrast" << (i + 1); - - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.c[i] = keyFile.get_integer ("Wavelet", ss.str()); - - if (pedited) { - pedited->wavelet.c[i] = true; - } - } - } - - for (int i = 0; i < 9; ++i) { - std::stringstream ss; - ss << "Chroma" << (i + 1); - - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); - - if (pedited) { - pedited->wavelet.ch[i] = true; - } - } - } - assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); - assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); - assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); - assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); - assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); - } - - if (keyFile.has_group ("Directional Pyramid Equalizer")) { - assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Enabled", pedited, dirpyrequalizer.enabled, pedited->dirpyrequalizer.enabled); - assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Gamutlab", pedited, dirpyrequalizer.gamutlab, pedited->dirpyrequalizer.gamutlab); - assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "cbdlMethod", pedited, dirpyrequalizer.cbdlMethod, pedited->dirpyrequalizer.cbdlMethod); - - if (keyFile.has_key ("Directional Pyramid Equalizer", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Directional Pyramid Equalizer", "Hueskin"); - - if (thresh.size() >= 4) { - dirpyrequalizer.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->dirpyrequalizer.hueskin = true; - } - } - - if (ppVersion < 316) { - for (int i = 0; i < 5; i ++) { - std::stringstream ss; - ss << "Mult" << i; - - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { - if (i == 4) { - dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); - - if (pedited) { - pedited->dirpyrequalizer.threshold = true; - } - } else { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); - - if (pedited) { - pedited->dirpyrequalizer.mult[i] = true; - } - } - } - } - - dirpyrequalizer.mult[4] = 1.0; - } else { - // 5 level wavelet + dedicated threshold parameter - for (int i = 0; i < 6; i ++) { - std::stringstream ss; - ss << "Mult" << i; - - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); - - if (pedited) { - pedited->dirpyrequalizer.mult[i] = true; - } - } - } - - assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Threshold", pedited, dirpyrequalizer.threshold, pedited->dirpyrequalizer.threshold); - assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Skinprotect", pedited, dirpyrequalizer.skinprotect, pedited->dirpyrequalizer.skinprotect); - } - } - - if (keyFile.has_group ("Film Simulation")) { - assignFromKeyfile(keyFile, "Film Simulation", "Enabled", pedited, filmSimulation.enabled, pedited->filmSimulation.enabled); - assignFromKeyfile(keyFile, "Film Simulation", "ClutFilename", pedited, filmSimulation.clutFilename, pedited->filmSimulation.clutFilename); - if (keyFile.has_key ("Film Simulation", "Strength")) { - if (ppVersion < 321) { - filmSimulation.strength = keyFile.get_double ("Film Simulation", "Strength") * 100 + 0.1; - } else { - filmSimulation.strength = keyFile.get_integer ("Film Simulation", "Strength"); - } - - if (pedited) { - pedited->filmSimulation.strength = true; - } - } - } - - if (keyFile.has_group ("HSV Equalizer")) { - if (ppVersion >= 300) { - assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve); - assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve); - assignFromKeyfile(keyFile, "HSV Equalizer", "VCurve", pedited, hsvequalizer.vcurve, pedited->hsvequalizer.vcurve); - } - } - - if (keyFile.has_group ("RGB Curves")) { - assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode); - assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve); - assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve); - assignFromKeyfile(keyFile, "RGB Curves", "bCurve", pedited, rgbCurves.bcurve, pedited->rgbCurves.bcurve); - } - - if (keyFile.has_group ("ColorToning")) { - assignFromKeyfile(keyFile, "ColorToning", "Enabled", pedited, colorToning.enabled, pedited->colorToning.enabled); - assignFromKeyfile(keyFile, "ColorToning", "Method", pedited, colorToning.method, pedited->colorToning.method); - assignFromKeyfile(keyFile, "ColorToning", "Lumamode", pedited, colorToning.lumamode, pedited->colorToning.lumamode); - assignFromKeyfile(keyFile, "ColorToning", "Twocolor", pedited, colorToning.twocolor, pedited->colorToning.twocolor); - assignFromKeyfile(keyFile, "ColorToning", "OpacityCurve", pedited, colorToning.opacityCurve, pedited->colorToning.opacityCurve); - assignFromKeyfile(keyFile, "ColorToning", "ColorCurve", pedited, colorToning.colorCurve, pedited->colorToning.colorCurve); - assignFromKeyfile(keyFile, "ColorToning", "Autosat", pedited, colorToning.autosat, pedited->colorToning.autosat); - assignFromKeyfile(keyFile, "ColorToning", "SatProtectionThreshold", pedited, colorToning.satProtectionThreshold, pedited->colorToning.satprotectionthreshold); - assignFromKeyfile(keyFile, "ColorToning", "SaturatedOpacity", pedited, colorToning.saturatedOpacity, pedited->colorToning.saturatedopacity); - assignFromKeyfile(keyFile, "ColorToning", "Strength", pedited, colorToning.strength, pedited->colorToning.strength); - - if (keyFile.has_key ("ColorToning", "HighlightsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "HighlightsColorSaturation"); - - if (thresh.size() >= 2) { - colorToning.hlColSat.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->colorToning.hlColSat = true; - } - } - - if (keyFile.has_key ("ColorToning", "ShadowsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "ShadowsColorSaturation"); - - if (thresh.size() >= 2) { - colorToning.shadowsColSat.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->colorToning.shadowsColSat = true; - } - } - - assignFromKeyfile(keyFile, "ColorToning", "ClCurve", pedited, colorToning.clcurve, pedited->colorToning.clcurve); - assignFromKeyfile(keyFile, "ColorToning", "Cl2Curve", pedited, colorToning.cl2curve, pedited->colorToning.cl2curve); - assignFromKeyfile(keyFile, "ColorToning", "Redlow", pedited, colorToning.redlow, pedited->colorToning.redlow); - assignFromKeyfile(keyFile, "ColorToning", "Greenlow", pedited, colorToning.greenlow, pedited->colorToning.greenlow); - assignFromKeyfile(keyFile, "ColorToning", "Bluelow", pedited, colorToning.bluelow, pedited->colorToning.bluelow); - assignFromKeyfile(keyFile, "ColorToning", "Satlow", pedited, colorToning.satlow, pedited->colorToning.satlow); - assignFromKeyfile(keyFile, "ColorToning", "Balance", pedited, colorToning.balance, pedited->colorToning.balance); - assignFromKeyfile(keyFile, "ColorToning", "Sathigh", pedited, colorToning.sathigh, pedited->colorToning.sathigh); - assignFromKeyfile(keyFile, "ColorToning", "Redmed", pedited, colorToning.redmed, pedited->colorToning.redmed); - assignFromKeyfile(keyFile, "ColorToning", "Greenmed", pedited, colorToning.greenmed, pedited->colorToning.greenmed); - assignFromKeyfile(keyFile, "ColorToning", "Bluemed", pedited, colorToning.bluemed, pedited->colorToning.bluemed); - assignFromKeyfile(keyFile, "ColorToning", "Redhigh", pedited, colorToning.redhigh, pedited->colorToning.redhigh); - assignFromKeyfile(keyFile, "ColorToning", "Greenhigh", pedited, colorToning.greenhigh, pedited->colorToning.greenhigh); - assignFromKeyfile(keyFile, "ColorToning", "Bluehigh", pedited, colorToning.bluehigh, pedited->colorToning.bluehigh); - } - - if (keyFile.has_group ("RAW")) { - if (keyFile.has_key ("RAW", "DarkFrame")) { - raw.dark_frame = expandRelativePath (fname, "", keyFile.get_string ("RAW", "DarkFrame" )); - - if (pedited) { - pedited->raw.darkFrame = true; - } - } - - assignFromKeyfile(keyFile, "RAW", "DarkFrameAuto", pedited, raw.df_autoselect, pedited->raw.df_autoselect); - - if (keyFile.has_key ("RAW", "FlatFieldFile")) { - raw.ff_file = expandRelativePath (fname, "", keyFile.get_string ("RAW", "FlatFieldFile" )); - - if (pedited) { - pedited->raw.ff_file = true; - } - } - - assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoSelect", pedited, raw.ff_AutoSelect, pedited->raw.ff_AutoSelect); - assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurRadius", pedited, raw.ff_BlurRadius, pedited->raw.ff_BlurRadius); - assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurType", pedited, raw.ff_BlurType, pedited->raw.ff_BlurType); - assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoClipControl", pedited, raw.ff_AutoClipControl, pedited->raw.ff_AutoClipControl); - if (ppVersion < 328) { - // With ppversion < 328 this value was stored as a boolean, which is nonsense. - // To avoid annoying warnings we skip reading and assume 0. - raw.ff_clipControl = 0; - } else { - assignFromKeyfile(keyFile, "RAW", "FlatFieldClipControl", pedited, raw.ff_clipControl, pedited->raw.ff_clipControl); - } - assignFromKeyfile(keyFile, "RAW", "CA", pedited, raw.ca_autocorrect, pedited->raw.ca_autocorrect); - assignFromKeyfile(keyFile, "RAW", "CARed", pedited, raw.cared, pedited->raw.cared); - assignFromKeyfile(keyFile, "RAW", "CABlue", pedited, raw.cablue, pedited->raw.cablue); - // For compatibility to elder pp3 versions - assignFromKeyfile(keyFile, "RAW", "HotDeadPixels", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); - raw.deadPixelFilter = raw.hotPixelFilter; - if (pedited) { - pedited->raw.deadPixelFilter = pedited->raw.hotPixelFilter; - } - assignFromKeyfile(keyFile, "RAW", "HotPixelFilter", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); - assignFromKeyfile(keyFile, "RAW", "DeadPixelFilter", pedited, raw.deadPixelFilter, pedited->raw.deadPixelFilter); - assignFromKeyfile(keyFile, "RAW", "HotDeadPixelThresh", pedited, raw.hotdeadpix_thresh, pedited->raw.hotdeadpix_thresh); - assignFromKeyfile(keyFile, "RAW", "PreExposure", pedited, raw.expos, pedited->raw.exPos); - assignFromKeyfile(keyFile, "RAW", "PrePreserv", pedited, raw.preser, pedited->raw.exPreser); - if (ppVersion < 320) { - assignFromKeyfile(keyFile, "RAW", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); - assignFromKeyfile(keyFile, "RAW", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); - assignFromKeyfile(keyFile, "RAW", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); - assignFromKeyfile(keyFile, "RAW", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); - assignFromKeyfile(keyFile, "RAW", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); - assignFromKeyfile(keyFile, "RAW", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); - assignFromKeyfile(keyFile, "RAW", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); - assignFromKeyfile(keyFile, "RAW", "PreBlackzero", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); - assignFromKeyfile(keyFile, "RAW", "PreBlackone", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); - assignFromKeyfile(keyFile, "RAW", "PreBlacktwo", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); - assignFromKeyfile(keyFile, "RAW", "PreBlackthree", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); - assignFromKeyfile(keyFile, "RAW", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); - } - } - - if (keyFile.has_group ("RAW Bayer")) { - assignFromKeyfile(keyFile, "RAW Bayer", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); - - if (keyFile.has_key ("RAW Bayer", "ImageNum")) { - raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; - - if (pedited) { - pedited->raw.bayersensor.imageNum = true; - } - } - - assignFromKeyfile(keyFile, "RAW Bayer", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); - assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack0", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); - assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack1", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); - assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack2", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); - assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack3", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); - assignFromKeyfile(keyFile, "RAW Bayer", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); - assignFromKeyfile(keyFile, "RAW Bayer", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); - assignFromKeyfile(keyFile, "RAW Bayer", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); - assignFromKeyfile(keyFile, "RAW Bayer", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); - assignFromKeyfile(keyFile, "RAW Bayer", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); - assignFromKeyfile(keyFile, "RAW Bayer", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftMotion", pedited, raw.bayersensor.pixelShiftMotion, pedited->raw.bayersensor.pixelShiftMotion); - - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrection")) { - raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::PSMotionCorrection)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrection"); - - if (pedited) { - pedited->raw.bayersensor.pixelShiftMotionCorrection = true; - } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { - raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod"); - - if (pedited) { - pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = true; - } - } - - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorGreen", pedited, raw.bayersensor.pixelShiftStddevFactorGreen, pedited->raw.bayersensor.pixelShiftStddevFactorGreen); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorRed", pedited, raw.bayersensor.pixelShiftStddevFactorRed, pedited->raw.bayersensor.pixelShiftStddevFactorRed); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorBlue", pedited, raw.bayersensor.pixelShiftStddevFactorBlue, pedited->raw.bayersensor.pixelShiftStddevFactorBlue); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftEperIso", pedited, raw.bayersensor.pixelShiftEperIso, pedited->raw.bayersensor.pixelShiftEperIso); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftNreadIso", pedited, raw.bayersensor.pixelShiftNreadIso, pedited->raw.bayersensor.pixelShiftNreadIso); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftPrnu", pedited, raw.bayersensor.pixelShiftPrnu, pedited->raw.bayersensor.pixelShiftPrnu); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSigma", pedited, raw.bayersensor.pixelShiftSigma, pedited->raw.bayersensor.pixelShiftSigma); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSum", pedited, raw.bayersensor.pixelShiftSum, pedited->raw.bayersensor.pixelShiftSum); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftRedBlueWeight", pedited, raw.bayersensor.pixelShiftRedBlueWeight, pedited->raw.bayersensor.pixelShiftRedBlueWeight); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotion", pedited, raw.bayersensor.pixelShiftShowMotion, pedited->raw.bayersensor.pixelShiftShowMotion); - assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotionMaskOnly", pedited, raw.bayersensor.pixelShiftShowMotionMaskOnly, pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftAutomatic", pedited, raw.bayersensor.pixelShiftAutomatic, pedited->raw.bayersensor.pixelShiftAutomatic); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenHorizontal", pedited, raw.bayersensor.pixelShiftNonGreenHorizontal, pedited->raw.bayersensor.pixelShiftNonGreenHorizontal); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenVertical", pedited, raw.bayersensor.pixelShiftNonGreenVertical, pedited->raw.bayersensor.pixelShiftNonGreenVertical); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftHoleFill", pedited, raw.bayersensor.pixelShiftHoleFill, pedited->raw.bayersensor.pixelShiftHoleFill); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian", pedited, raw.bayersensor.pixelShiftMedian, pedited->raw.bayersensor.pixelShiftMedian); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian3", pedited, raw.bayersensor.pixelShiftMedian3, pedited->raw.bayersensor.pixelShiftMedian3); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftGreen", pedited, raw.bayersensor.pixelShiftGreen, pedited->raw.bayersensor.pixelShiftGreen); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftBlur", pedited, raw.bayersensor.pixelShiftBlur, pedited->raw.bayersensor.pixelShiftBlur); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftSmoothFactor", pedited, raw.bayersensor.pixelShiftSmoothFactor, pedited->raw.bayersensor.pixelShiftSmooth); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftExp0", pedited, raw.bayersensor.pixelShiftExp0, pedited->raw.bayersensor.pixelShiftExp0); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftLmmse", pedited, raw.bayersensor.pixelShiftLmmse, pedited->raw.bayersensor.pixelShiftLmmse); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBright", pedited, raw.bayersensor.pixelShiftEqualBright, pedited->raw.bayersensor.pixelShiftEqualBright); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBrightChannel", pedited, raw.bayersensor.pixelShiftEqualBrightChannel, pedited->raw.bayersensor.pixelShiftEqualBrightChannel); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross", pedited, raw.bayersensor.pixelShiftNonGreenCross, pedited->raw.bayersensor.pixelShiftNonGreenCross); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross2", pedited, raw.bayersensor.pixelShiftNonGreenCross2, pedited->raw.bayersensor.pixelShiftNonGreenCross2); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenAmaze", pedited, raw.bayersensor.pixelShiftNonGreenAmaze, pedited->raw.bayersensor.pixelShiftNonGreenAmaze); - } - - if (keyFile.has_group ("RAW X-Trans")) { - assignFromKeyfile(keyFile, "RAW X-Trans", "Method", pedited, raw.xtranssensor.method, pedited->raw.xtranssensor.method); - assignFromKeyfile(keyFile, "RAW X-Trans", "CcSteps", pedited, raw.xtranssensor.ccSteps, pedited->raw.xtranssensor.ccSteps); - assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackRed", pedited, raw.xtranssensor.blackred, pedited->raw.xtranssensor.exBlackRed); - assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackGreen", pedited, raw.xtranssensor.blackgreen, pedited->raw.xtranssensor.exBlackGreen); - assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackBlue", pedited, raw.xtranssensor.blackblue, pedited->raw.xtranssensor.exBlackBlue); - } - - if (keyFile.has_group ("Exif")) { - std::vector keys = keyFile.get_keys ("Exif"); - - for (const auto& key : keyFile.get_keys("Exif")) { - exif[key] = keyFile.get_string ("Exif", key); - - if (pedited) { - pedited->exif = true; - } - } - } - - /* - * Load iptc change settings - * - * Existing values are preserved, and the stored values - * are added to the list. To reset a field, the user has to - * save the profile with the field leaved empty, but still - * terminated by a semi-column ";" - * - * Please note that the old Keywords and SupplementalCategories - * tag content is fully replaced by the new one, - * i.e. they don't merge - */ - if (keyFile.has_group ("IPTC")) { - for (const auto& key : keyFile.get_keys("IPTC")) { - // does this key already exist? - const IPTCPairs::iterator element = iptc.find(key); - - if (element != iptc.end()) { - // it already exist so we cleanup the values - element->second.clear(); - } - - // TODO: look out if merging Keywords and SupplementalCategories from the procparams chain would be interesting - for (const auto& currLoadedTagValue : keyFile.get_string_list ("IPTC", key)) { - iptc[key].push_back (currLoadedTagValue); - } - - if (pedited) { - pedited->iptc = true; - } - } - } - - return 0; - } catch (const Glib::Error& e) { - printf ("-->%s\n", e.what().c_str()); - setDefaults (); - return 1; - } catch (...) { - printf ("-->unknown exception!\n"); - setDefaults (); - return 1; - } - - return 0; -} - -ProcParams* ProcParams::create() -{ - return new ProcParams(); -} - -void ProcParams::destroy(ProcParams* pp) -{ - delete pp; -} - -bool ProcParams::operator ==(const ProcParams& other) const -{ - return - toneCurve == other.toneCurve - && retinex == other.retinex - && labCurve == other.labCurve - && sharpenEdge == other.sharpenEdge - && sharpenMicro == other.sharpenMicro - && sharpening == other.sharpening - && prsharpening == other.prsharpening - && vibrance == other.vibrance - && wb == other.wb - && colorappearance == other.colorappearance - && impulseDenoise == other.impulseDenoise - && dirpyrDenoise == other.dirpyrDenoise - && epd == other.epd - && fattal == other.fattal - && defringe == other.defringe - && sh == other.sh - && crop == other.crop - && coarse == other.coarse - && rotate == other.rotate - && commonTrans == other.commonTrans - && distortion == other.distortion - && lensProf == other.lensProf - && perspective == other.perspective - && gradient == other.gradient - && pcvignette == other.pcvignette - && cacorrection == other.cacorrection - && vignetting == other.vignetting - && chmixer == other.chmixer - && blackwhite == other.blackwhite - && resize == other.resize - && raw == other.raw - && icm == other.icm - && wavelet == other.wavelet - && dirpyrequalizer == other.dirpyrequalizer - && hsvequalizer == other.hsvequalizer - && filmSimulation == other.filmSimulation - && rgbCurves == other.rgbCurves - && colorToning == other.colorToning - && exif == other.exif - && iptc == other.iptc; -} - -bool ProcParams::operator !=(const ProcParams& other) const -{ - return !(*this == other); -} - -void ProcParams::init() -{ -} - -void ProcParams::cleanup() -{ -} - -int ProcParams::write(const Glib::ustring& fname, const Glib::ustring& content) const -{ - int error = 0; - - if (fname.length()) { - FILE *f; - f = g_fopen (fname.c_str (), "wt"); - - if (f == nullptr) { - error = 1; - } else { - fprintf (f, "%s", content.c_str()); - fclose (f); - } - } - - return error; -} - -PartialProfile::PartialProfile(bool createInstance, bool paramsEditedValue) -{ - if (createInstance) { - pparams = new ProcParams(); - pedited = new ParamsEdited (paramsEditedValue); - } else { - pparams = nullptr; - pedited = nullptr; - } -} - -PartialProfile::PartialProfile(ProcParams* pp, ParamsEdited* pe, bool fullCopy) -{ - if (fullCopy && pp) { - pparams = new ProcParams (*pp); - } else { - pparams = pp; - } - - if (fullCopy && pe) { - pedited = new ParamsEdited (*pe); - } else { - pedited = pe; - } -} - -PartialProfile::PartialProfile(const ProcParams* pp, const ParamsEdited* pe) -{ - if (pp) { - pparams = new ProcParams (*pp); - } else { - pparams = nullptr; - } - - if (pe) { - pedited = new ParamsEdited (*pe); - } else { - pedited = nullptr; - } -} - -void PartialProfile::deleteInstance() -{ - if (pparams) { - delete pparams; - pparams = nullptr; - } - - if (pedited) { - delete pedited; - pedited = nullptr; - } -} - -void PartialProfile::clearGeneral() -{ - if (pedited) { - pedited->general.colorlabel = false; - pedited->general.intrash = false; - pedited->general.rank = false; - } -} - -int PartialProfile::load(const Glib::ustring& fName) -{ - if (!pparams) { - pparams = new ProcParams(); - } - - if (!pedited) { - pedited = new ParamsEdited(); - } - - if (fName == DEFPROFILE_INTERNAL) { - return 0; - } else if (fName == DEFPROFILE_DYNAMIC) { - return -1; // should not happen here - } else { - return pparams->load (fName, pedited); - } -} - -/* - * Set the all values of the General section to false - * in order to preserve them in applyTo - */ -void PartialProfile::set(bool v) -{ - if (pedited) { - pedited->set (v); - } -} - -void PartialProfile::applyTo(ProcParams* destParams) const -{ - if (destParams && pparams && pedited) { - pedited->combine (*destParams, *pparams, true); - } -} - -AutoPartialProfile::AutoPartialProfile() : - PartialProfile(true) -{ -} - -AutoPartialProfile::~AutoPartialProfile() -{ - deleteInstance(); -} - -} - -} From b8777b3d8753de4dd3d50cba6a1700986e157b7e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 01:03:52 +0100 Subject: [PATCH 032/200] added simple local contrast tool Borrowed from G'MIC --- rtdata/languages/default | 10 +++ rtengine/CMakeLists.txt | 1 + rtengine/improcfun.cc | 8 ++ rtengine/improcfun.h | 2 + rtengine/iplocalcontrast.cc | 67 +++++++++++++++ rtengine/procevents.h | 5 ++ rtengine/procparams.cc | 47 +++++++++++ rtengine/procparams.h | 19 +++++ rtengine/refreshmap.cc | 7 +- rtgui/CMakeLists.txt | 1 + rtgui/localcontrast.cc | 157 ++++++++++++++++++++++++++++++++++++ rtgui/localcontrast.h | 47 +++++++++++ rtgui/paramsedited.cc | 28 +++++++ rtgui/paramsedited.h | 12 +++ rtgui/toolpanelcoord.cc | 2 + rtgui/toolpanelcoord.h | 2 + 16 files changed, 414 insertions(+), 1 deletion(-) create mode 100644 rtengine/iplocalcontrast.cc create mode 100644 rtgui/localcontrast.cc create mode 100644 rtgui/localcontrast.h diff --git a/rtdata/languages/default b/rtdata/languages/default index fda54dd4d..c25bf79ff 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -725,6 +725,11 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_494;Local Contrast +HISTORY_MSG_495;Local Contrast - Radius +HISTORY_MSG_496;Local Contrast - Amount +HISTORY_MSG_497;Local Contrast - Darkness +HISTORY_MSG_498;Local Contrast - Lightness HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1679,6 +1684,11 @@ TP_LENSPROFILE_LABEL;Profiled Lens Correction TP_LENSPROFILE_USECA;Chromatic aberration correction TP_LENSPROFILE_USEDIST;Distortion correction TP_LENSPROFILE_USEVIGN;Vignetting correction +TP_LOCALCONTRAST_LABEL;Local Contrast +TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALCONTRAST_AMOUNT;Amount +TP_LOCALCONTRAST_DARKNESS;Darkness level +TP_LOCALCONTRAST_LIGHTNESS;Lightness level 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 diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 70416af62..3e5eb15e4 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -115,6 +115,7 @@ set(RTENGINESOURCEFILES utils.cc rtlensfun.cc tmo_fattal02.cc + iplocalcontrast.cc ) if(LENSFUN_HAS_LOAD_DIRECTORY) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 5223a7f85..2c92e1321 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3427,6 +3427,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer int tW; int tH; + // zero out the buffers + memset(buffer, 0, 3 * sizeof (float) * TS * TS + 20 * 64 + 63); + // Allocating buffer for the PipetteBuffer float *editIFloatTmpR = nullptr, *editIFloatTmpG = nullptr, *editIFloatTmpB = nullptr, *editWhateverTmp = nullptr; @@ -4965,6 +4968,11 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (vCurveEnabled) { delete vCurve; } + + if (params->localContrast.enabled) { + // Alberto's local contrast + localContrast(lab); + } } /** diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 08c3fa4cc..b7e7a7545 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -345,6 +345,8 @@ public: void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom); void ToneMapFattal02(Imagefloat *rgb); + //void localContrast(float *r, float *g, float *b, int width, int height); + void localContrast(LabImage *lab); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc new file mode 100644 index 000000000..10b5cd2b9 --- /dev/null +++ b/rtengine/iplocalcontrast.cc @@ -0,0 +1,67 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Ported from G'MIC by Alberto Griggio + * + * 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 . + */ + +#ifdef _OPENMP +#include +#endif + +#include "improcfun.h" +#include "settings.h" +#include "gauss.h" +#include "boxblur.h" +#include "array2D.h" + +namespace rtengine { + +void ImProcFunctions::localContrast(LabImage *lab) +{ + if (!params->localContrast.enabled) { + return; + } + + const int width = lab->W; + const int height = lab->H; + const float a = -params->localContrast.amount; + const float half = 0.5f; + const float dark = params->localContrast.darkness; + const float light = params->localContrast.lightness; + array2D buf(width, height); + const float sigma = params->localContrast.radius / scale; + + gaussianBlur(lab->L, buf, width, height, sigma); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + buf[y][x] -= lab->L[y][x]; + buf[y][x] *= a; + + if (dark != 1 || light != 1) { + buf[y][x] = max(buf[y][x], half) * light + min(buf[y][x], half) * dark; + } + + lab->L[y][x] += buf[y][x]; + } + } +} + +} // namespace rtengine diff --git a/rtengine/procevents.h b/rtengine/procevents.h index f4dfd7dfb..faffbe780 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -520,6 +520,11 @@ enum ProcEvent { EvWBEnabled = 490, EvRGBEnabled = 491, EvLEnabled = 492, + EvLocalContrastEnabled = 493, + EvLocalContrastRadius = 494, + EvLocalContrastAmount = 495, + EvLocalContrastDarkness = 496, + EvLocalContrastLightness = 497, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index ccdafec5c..d04003af1 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -590,6 +590,34 @@ bool RGBCurvesParams::operator !=(const RGBCurvesParams& other) const return !(*this == other); } + +LocalContrastParams::LocalContrastParams(): + enabled(false), + radius(80), + amount(0.2), + darkness(1.0), + lightness(1.0) +{ +} + + +bool LocalContrastParams::operator==(const LocalContrastParams &other) const +{ + return + enabled == other.enabled + && radius == other.radius + && amount == other.amount + && darkness == other.darkness + && lightness == other.lightness; +} + + +bool LocalContrastParams::operator!=(const LocalContrastParams &other) const +{ + return !(*this == other); +} + + ColorToningParams::ColorToningParams() : enabled(false), autosat(true), @@ -2588,6 +2616,8 @@ void ProcParams::setDefaults () rgbCurves = RGBCurvesParams(); + localContrast = LocalContrastParams(); + colorToning = ColorToningParams(); sharpenEdge = SharpenEdgeParams(); @@ -2755,6 +2785,14 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->retinex.transmissionCurve, "Retinex", "TransmissionCurve", retinex.transmissionCurve, keyFile); saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); +// Local contrast + saveToKeyfile(!pedited || pedited->localContrast.enabled, "Local Contrast", "Enabled", localContrast.enabled, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.radius, "Local Contrast", "Radius", localContrast.radius, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.amount, "Local Contrast", "Amount", localContrast.amount, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.darkness, "Local Contrast", "Darkness", localContrast.darkness, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.lightness, "Local Contrast", "Lightness", localContrast.lightness, keyFile); + + // Channel mixer saveToKeyfile(!pedited || pedited->chmixer.enabled, "Channel Mixer", "Enabled", chmixer.enabled, keyFile); if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { @@ -3590,6 +3628,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Retinex", "GainTransmissionCurve", pedited, retinex.gaintransmissionCurve, pedited->retinex.gaintransmissionCurve); } + if (keyFile.has_group("Local Contrast")) { + assignFromKeyfile(keyFile, "Local Contrast", "Enabled", pedited, localContrast.enabled, pedited->localContrast.enabled); + assignFromKeyfile(keyFile, "Local Contrast", "Radius", pedited, localContrast.radius, pedited->localContrast.radius); + assignFromKeyfile(keyFile, "Local Contrast", "Amount", pedited, localContrast.amount, pedited->localContrast.amount); + assignFromKeyfile(keyFile, "Local Contrast", "Darkness", pedited, localContrast.darkness, pedited->localContrast.darkness); + assignFromKeyfile(keyFile, "Local Contrast", "Lightness", pedited, localContrast.lightness, pedited->localContrast.lightness); + } + if (keyFile.has_group ("Luminance Curve")) { if (ppVersion >= 329) { assignFromKeyfile(keyFile, "Luminance Curve", "Enabled", pedited, labCurve.enabled, pedited->labCurve.enabled); @@ -4716,6 +4762,7 @@ bool ProcParams::operator ==(const ProcParams& other) const return toneCurve == other.toneCurve && retinex == other.retinex + && localContrast == other.localContrast && labCurve == other.labCurve && sharpenEdge == other.sharpenEdge && sharpenMicro == other.sharpenMicro diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 39d84ac12..bbe73f1bc 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -364,6 +364,24 @@ struct LCurveParams bool operator !=(const LCurveParams& other) const; }; + +/** + * Parameters for local contrast + */ +struct LocalContrastParams { + bool enabled; + int radius; + double amount; + double darkness; + double lightness; + + LocalContrastParams(); + + bool operator==(const LocalContrastParams &other) const; + bool operator!=(const LocalContrastParams &other) const; +}; + + /** * Parameters of the RGB curves */ @@ -1340,6 +1358,7 @@ public: ToneCurveParams toneCurve; ///< Tone curve parameters LCurveParams labCurve; ///< CIELAB luminance curve parameters RetinexParams retinex; ///< Retinex parameters + LocalContrastParams localContrast; ////< Local contrast parameters RGBCurvesParams rgbCurves; ///< RGB curves parameters ColorToningParams colorToning; ///< Color Toning parameters SharpeningParams sharpening; ///< Sharpening parameters diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 6105bb508..96575b464 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -519,6 +519,11 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled RGBCURVE, // EvRGBEnabled - LUMINANCECURVE // EvLEnabled + LUMINANCECURVE, // EvLEnabled + RGBCURVE, // EvLocalContastEnabled + RGBCURVE, // EvLocalContrastRadius + RGBCURVE, // EvLocalContrastAmount + RGBCURVE, // EvLocalContrastDarkness + RGBCURVE // EvLocalContrastLightness }; diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 36c7a4034..e42666625 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -148,6 +148,7 @@ set(NONCLISOURCEFILES xtransrawexposure.cc zoompanel.cc fattaltonemap.cc + localcontrast.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc new file mode 100644 index 000000000..3c2d47786 --- /dev/null +++ b/rtgui/localcontrast.cc @@ -0,0 +1,157 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ +#include "localcontrast.h" +#include +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_LOCALCONTRAST_LABEL"), false, true) +{ + radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 8.)); + amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); + darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 4., 0.1, 1.)); + lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 4., 0.1, 1.)); + + radius->setAdjusterListener(this); + amount->setAdjusterListener(this); + darkness->setAdjusterListener(this); + lightness->setAdjusterListener(this); + + radius->show(); + amount->show(); + darkness->show(); + lightness->show(); + + pack_start(*radius); + pack_start(*amount); + pack_start(*darkness); + pack_start(*lightness); +} + + +void LocalContrast::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + radius->setEditedState(pedited->localContrast.radius ? Edited : UnEdited); + amount->setEditedState(pedited->localContrast.amount ? Edited : UnEdited); + darkness->setEditedState(pedited->localContrast.darkness ? Edited : UnEdited); + lightness->setEditedState(pedited->localContrast.lightness ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->localContrast.enabled); + } + + setEnabled(pp->localContrast.enabled); + radius->setValue(pp->localContrast.radius); + amount->setValue(pp->localContrast.amount); + darkness->setValue(pp->localContrast.darkness); + lightness->setValue(pp->localContrast.lightness); + + enableListener(); +} + + +void LocalContrast::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->localContrast.radius = radius->getValue(); + pp->localContrast.amount = amount->getValue(); + pp->localContrast.darkness = darkness->getValue(); + pp->localContrast.lightness = lightness->getValue(); + pp->localContrast.enabled = getEnabled(); + + if (pedited) { + pedited->localContrast.radius = radius->getEditedState(); + pedited->localContrast.amount = amount->getEditedState(); + pedited->localContrast.darkness = darkness->getEditedState(); + pedited->localContrast.lightness = lightness->getEditedState(); + pedited->localContrast.enabled = !get_inconsistent(); + } +} + +void LocalContrast::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + radius->setDefault(defParams->localContrast.radius); + amount->setDefault(defParams->localContrast.amount); + darkness->setDefault(defParams->localContrast.darkness); + lightness->setDefault(defParams->localContrast.lightness); + + if (pedited) { + radius->setDefaultEditedState(pedited->localContrast.radius ? Edited : UnEdited); + amount->setDefaultEditedState(pedited->localContrast.amount ? Edited : UnEdited); + darkness->setDefaultEditedState(pedited->localContrast.darkness ? Edited : UnEdited); + lightness->setDefaultEditedState(pedited->localContrast.lightness ? Edited : UnEdited); + } else { + radius->setDefaultEditedState(Irrelevant); + amount->setDefaultEditedState(Irrelevant); + darkness->setDefaultEditedState(Irrelevant); + lightness->setDefaultEditedState(Irrelevant); + } +} + + +void LocalContrast::adjusterChanged(Adjuster* a, double newval) +{ + if (listener && getEnabled()) { + if (a == radius) { + listener->panelChanged(EvLocalContrastRadius, a->getTextValue()); + } else if (a == amount) { + listener->panelChanged(EvLocalContrastAmount, a->getTextValue()); + } else if (a == darkness) { + listener->panelChanged(EvLocalContrastDarkness, a->getTextValue()); + } else if (a == lightness) { + listener->panelChanged(EvLocalContrastLightness, a->getTextValue()); + } + } +} + + +void LocalContrast::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void LocalContrast::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + radius->showEditedCB(); + amount->showEditedCB(); + darkness->showEditedCB(); + lightness->showEditedCB(); +} + + +// void LocalContrast::setAdjusterBehavior (bool alphaAdd, bool betaAdd) +// { +// threshold->setAddMode(alphaAdd); +// amount->setAddMode(betaAdd); +// } + diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h new file mode 100644 index 000000000..858d860a3 --- /dev/null +++ b/rtgui/localcontrast.h @@ -0,0 +1,47 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 "adjuster.h" +#include "toolpanel.h" + +class LocalContrast: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +protected: + Adjuster *radius; + Adjuster *amount; + Adjuster *darkness; + Adjuster *lightness; + +public: + + LocalContrast(); + + void read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr); + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr); + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr); + void setBatchMode(bool batchMode); + + void adjusterChanged(Adjuster *a, double newval); + void enabledChanged(); + // void setAdjusterBehavior(bool alphaAdd, bool betaAdd); +}; + diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 391438cd6..eabf4c63d 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -98,6 +98,11 @@ void ParamsEdited::set (bool v) labCurve.avoidcolorshift = v; labCurve.rstprotection = v; labCurve.lcredsk = v; + localContrast.enabled = v; + localContrast.radius = v; + localContrast.amount = v; + localContrast.darkness = v; + localContrast.lightness = v; rgbCurves.enabled = v; rgbCurves.lumamode = v; rgbCurves.rcurve = v; @@ -643,6 +648,13 @@ void ParamsEdited::initFrom (const std::vector labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift; labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection; labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk; + + localContrast.enabled = localContrast.enabled && p.localContrast.enabled == other.localContrast.enabled; + localContrast.radius = localContrast.radius && p.localContrast.radius == other.localContrast.radius; + localContrast.amount = localContrast.amount && p.localContrast.amount == other.localContrast.amount; + localContrast.darkness = localContrast.darkness && p.localContrast.darkness == other.localContrast.darkness; + localContrast.lightness = localContrast.lightness && p.localContrast.lightness == other.localContrast.lightness; + rgbCurves.enabled = rgbCurves.enabled && p.rgbCurves.enabled == other.rgbCurves.enabled; rgbCurves.lumamode = rgbCurves.lumamode && p.rgbCurves.lumamode == other.rgbCurves.lumamode; rgbCurves.rcurve = rgbCurves.rcurve && p.rgbCurves.rcurve == other.rgbCurves.rcurve; @@ -1370,6 +1382,22 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.labCurve.lcredsk = mods.labCurve.lcredsk; } + if (localContrast.enabled) { + toEdit.localContrast.enabled = mods.localContrast.enabled; + } + if (localContrast.radius) { + toEdit.localContrast.radius = mods.localContrast.radius; + } + if (localContrast.amount) { + toEdit.localContrast.amount = mods.localContrast.amount; + } + if (localContrast.darkness) { + toEdit.localContrast.darkness = mods.localContrast.darkness; + } + if (localContrast.lightness) { + toEdit.localContrast.lightness = mods.localContrast.lightness; + } + if (rgbCurves.enabled) { toEdit.rgbCurves.enabled = mods.rgbCurves.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index fcb3a0b49..b8d1e480b 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -118,6 +118,17 @@ public: bool clcurve; }; + +class LocalContrastParamsEdited { +public: + bool enabled; + bool radius; + bool amount; + bool darkness; + bool lightness; +}; + + class RGBCurvesParamsEdited { @@ -793,6 +804,7 @@ public: GeneralParamsEdited general; ToneCurveParamsEdited toneCurve; LCurveParamsEdited labCurve; + LocalContrastParamsEdited localContrast; RGBCurvesParamsEdited rgbCurves; ColorToningEdited colorToning; RetinexParamsEdited retinex; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 9153c6fb4..1b77379bb 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -41,6 +41,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan coarse = Gtk::manage (new CoarsePanel ()); toneCurve = Gtk::manage (new ToneCurve ()); shadowshighlights = Gtk::manage (new ShadowsHighlights ()); + localContrast = Gtk::manage(new LocalContrast()); impulsedenoise = Gtk::manage (new ImpulseDenoise ()); defringe = Gtk::manage (new Defringe ()); dirpyrdenoise = Gtk::manage (new DirPyrDenoise ()); @@ -106,6 +107,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (colorPanel, vibrance); addPanel (colorPanel, chmixer); addPanel (colorPanel, blackwhite); + addPanel (exposurePanel, localContrast); addPanel (exposurePanel, shadowshighlights); addPanel (detailsPanel, sharpening); addPanel (detailsPanel, sharpenEdge); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 3da061b99..7c4b94ed9 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -79,6 +79,7 @@ #include "filmsimulation.h" #include "prsharpening.h" #include "fattaltonemap.h" +#include "localcontrast.h" #include "guiutils.h" class ImageEditorCoordinator; @@ -120,6 +121,7 @@ protected: Crop* crop; ToneCurve* toneCurve; ShadowsHighlights* shadowshighlights; + LocalContrast *localContrast; Defringe* defringe; ImpulseDenoise* impulsedenoise; DirPyrDenoise* dirpyrdenoise; From a2bd8acac9042a6a62dbb6859d6554d61b688cec Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 09:43:44 +0100 Subject: [PATCH 033/200] local contrast speedups by heckflosse --- rtengine/iplocalcontrast.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 10b5cd2b9..faee1e00a 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -27,11 +27,14 @@ #include "gauss.h" #include "boxblur.h" #include "array2D.h" +#define BENCHMARK +#include "StopWatch.h" namespace rtengine { void ImProcFunctions::localContrast(LabImage *lab) { + BENCHFUN if (!params->localContrast.enabled) { return; } @@ -45,21 +48,23 @@ void ImProcFunctions::localContrast(LabImage *lab) array2D buf(width, height); const float sigma = params->localContrast.radius / scale; +#ifdef _OPENMP + #pragma omp parallel +#endif gaussianBlur(lab->L, buf, width, height, sigma); #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for #endif for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { - buf[y][x] -= lab->L[y][x]; - buf[y][x] *= a; + float bufval = (buf[y][x] - lab->L[y][x]) * a; if (dark != 1 || light != 1) { - buf[y][x] = max(buf[y][x], half) * light + min(buf[y][x], half) * dark; + bufval = max(bufval, half) * light + min(bufval, half) * dark; } - lab->L[y][x] += buf[y][x]; + lab->L[y][x] += bufval; } } } From c166e0a7ed647b1d18a41f3cfb87a152d7ac36b1 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 13:46:19 +0100 Subject: [PATCH 034/200] added a more flexible way of managing ProcEvents modifying the global ProcEvent enum and refreshmap array is not needed anymore. You can now register new events dynamically, using a ProcEventMapper instance. See rtgui/localcontrast.cc for an example. Hopefully this solves the problem of recurring merge conflicts when different devs add different proc events --- rtdata/languages/default | 10 +++--- rtengine/improccoordinator.cc | 3 +- rtengine/procevents.h | 28 ++++++++++++---- rtengine/refreshmap.cc | 49 +++++++++++++++++++++++---- rtengine/refreshmap.h | 22 ++++++++++++ rtgui/CMakeLists.txt | 1 + rtgui/eventmapper.cc | 63 +++++++++++++++++++++++++++++++++++ rtgui/eventmapper.h | 37 ++++++++++++++++++++ rtgui/history.cc | 3 +- rtgui/localcontrast.cc | 8 +++++ rtgui/localcontrast.h | 8 ++++- rtgui/toolpanelcoord.cc | 6 ++-- 12 files changed, 215 insertions(+), 23 deletions(-) create mode 100644 rtgui/eventmapper.cc create mode 100644 rtgui/eventmapper.h diff --git a/rtdata/languages/default b/rtdata/languages/default index c25bf79ff..e9386e350 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -725,11 +725,11 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments -HISTORY_MSG_494;Local Contrast -HISTORY_MSG_495;Local Contrast - Radius -HISTORY_MSG_496;Local Contrast - Amount -HISTORY_MSG_497;Local Contrast - Darkness -HISTORY_MSG_498;Local Contrast - Lightness +HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 9c80eed9e..6403612d6 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1378,7 +1378,8 @@ ProcParams* ImProcCoordinator::beginUpdateParams () void ImProcCoordinator::endUpdateParams (ProcEvent change) { - endUpdateParams ( refreshmap[ (int)change] ); + int action = RefreshMapper::getInstance()->getAction(change); + endUpdateParams(action); } void ImProcCoordinator::endUpdateParams (int changeFlags) diff --git a/rtengine/procevents.h b/rtengine/procevents.h index faffbe780..5658a346b 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -26,7 +26,7 @@ namespace rtengine // Aligned so the first entry starts on line 30 -enum ProcEvent { +enum ProcEventCode { EvPhotoLoaded = 0, EvProfileLoaded = 1, EvProfileChanged = 2, @@ -520,15 +520,31 @@ enum ProcEvent { EvWBEnabled = 490, EvRGBEnabled = 491, EvLEnabled = 492, - EvLocalContrastEnabled = 493, - EvLocalContrastRadius = 494, - EvLocalContrastAmount = 495, - EvLocalContrastDarkness = 496, - EvLocalContrastLightness = 497, NUMOFEVENTS }; + + +class ProcEvent { +public: + ProcEvent(): code_(0) {} + ProcEvent(ProcEventCode code): code_(code) {} + explicit ProcEvent(int code): code_(code) {} + operator int() { return code_; } + +private: + int code_; +}; + + +inline bool operator==(ProcEvent a, ProcEvent b) { return int(a) == int(b); } +inline bool operator==(ProcEvent a, ProcEventCode b) { return int(a) == int(b); } +inline bool operator==(ProcEventCode a, ProcEvent b) { return int(a) == int(b); } +inline bool operator!=(ProcEvent a, ProcEvent b) { return int(a) != int(b); } +inline bool operator!=(ProcEvent a, ProcEventCode b) { return int(a) != int(b); } +inline bool operator!=(ProcEventCode a, ProcEvent b) { return int(a) != int(b); } + } #endif diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 96575b464..93fe01f0b 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -519,11 +519,48 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled RGBCURVE, // EvRGBEnabled - LUMINANCECURVE, // EvLEnabled - RGBCURVE, // EvLocalContastEnabled - RGBCURVE, // EvLocalContrastRadius - RGBCURVE, // EvLocalContrastAmount - RGBCURVE, // EvLocalContrastDarkness - RGBCURVE // EvLocalContrastLightness + LUMINANCECURVE // EvLEnabled }; + +namespace rtengine { + +RefreshMapper::RefreshMapper(): + next_event_(rtengine::NUMOFEVENTS) +{ + for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) { + actions_[event] = refreshmap[event]; + } +} + + +ProcEvent RefreshMapper::newEvent() +{ + return ProcEvent(++next_event_); +} + + +void RefreshMapper::mapEvent(ProcEvent event, int action) +{ + actions_[event] = action; +} + + +int RefreshMapper::getAction(ProcEvent event) const +{ + auto it = actions_.find(event); + if (it == actions_.end()) { + return 0; + } else { + return it->second; + } +} + + +RefreshMapper *RefreshMapper::getInstance() +{ + static RefreshMapper instance; + return &instance; +} + +} // namespace rtengine diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index cea6b3c8e..09059470b 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -19,6 +19,9 @@ #ifndef __REFRESHMAP__ #define __REFRESHMAP__ +#include +#include "procevents.h" + // Use M_VOID if you wish to update the proc params without updating the preview at all ! #define M_VOID (1<<17) // Use M_MINUPDATE if you wish to update the preview without modifying the image (think about it like a "refreshPreview") @@ -74,4 +77,23 @@ #define OUTPUTPROFILE M_MONITOR extern int refreshmap[]; + +namespace rtengine { + +class RefreshMapper { +public: + static RefreshMapper *getInstance(); + ProcEvent newEvent(); + void mapEvent(ProcEvent event, int action); + int getAction(ProcEvent event) const; + +private: + RefreshMapper(); + + int next_event_; + std::unordered_map actions_; +}; + +} // namespace rtengine + #endif diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index e42666625..222ee2550 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -149,6 +149,7 @@ set(NONCLISOURCEFILES zoompanel.cc fattaltonemap.cc localcontrast.cc + eventmapper.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/rtgui/eventmapper.cc b/rtgui/eventmapper.cc new file mode 100644 index 000000000..de5258413 --- /dev/null +++ b/rtgui/eventmapper.cc @@ -0,0 +1,63 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +#include "eventmapper.h" + + +ProcEventMapper::ProcEventMapper() +{ + for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) { + history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); + } +} + + +ProcEventMapper *ProcEventMapper::getInstance() +{ + static ProcEventMapper instance; + return &instance; +} + + +rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg) +{ + rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent(); + rtengine::RefreshMapper::getInstance()->mapEvent(event, action); + + if (history_msg.empty()) { + history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); + } else { + history_msgs_[event] = history_msg; + } + + return event; +} + + +const std::string &ProcEventMapper::getHistoryMsg(rtengine::ProcEvent event) const +{ + static std::string empty; + auto it = history_msgs_.find(event); + if (it == history_msgs_.end()) { + return empty; + } else { + return it->second; + } +} diff --git a/rtgui/eventmapper.h b/rtgui/eventmapper.h new file mode 100644 index 000000000..87ccc1d9b --- /dev/null +++ b/rtgui/eventmapper.h @@ -0,0 +1,37 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 "../rtengine/refreshmap.h" + + +class ProcEventMapper { +public: + static ProcEventMapper *getInstance(); + rtengine::ProcEvent newEvent(int action, const std::string &history_msg=""); + const std::string &getHistoryMsg(rtengine::ProcEvent event) const; + +private: + ProcEventMapper(); + + std::unordered_map history_msgs_; +}; diff --git a/rtgui/history.cc b/rtgui/history.cc index d62fcdb30..6b07ee7b2 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -20,6 +20,7 @@ #include "multilangmgr.h" #include "rtimage.h" #include "guiutils.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; @@ -231,7 +232,7 @@ void History::procParamsChanged (ProcParams* params, ProcEvent ev, Glib::ustring } // construct formatted list content - Glib::ustring text = M("HISTORY_MSG_" + std::to_string(ev + 1)); + Glib::ustring text = M(ProcEventMapper::getInstance()->getHistoryMsg(ev)); Glib::RefPtr selection = hTreeView->get_selection(); Gtk::TreeModel::iterator iter = selection->get_selected(); diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index 3c2d47786..8e1b5660e 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -18,6 +18,7 @@ * along with RawTherapee. If not, see . */ #include "localcontrast.h" +#include "eventmapper.h" #include #include @@ -26,6 +27,13 @@ using namespace rtengine::procparams; LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_LOCALCONTRAST_LABEL"), false, true) { + auto m = ProcEventMapper::getInstance(); + EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); + EvLocalContrastRadius = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); + EvLocalContrastAmount = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); + EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); + EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); + radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 8.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 4., 0.1, 1.)); diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index 858d860a3..d3a4e54d5 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -25,12 +25,18 @@ class LocalContrast: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel { -protected: +private: Adjuster *radius; Adjuster *amount; Adjuster *darkness; Adjuster *lightness; + rtengine::ProcEvent EvLocalContrastEnabled; + rtengine::ProcEvent EvLocalContrastRadius; + rtengine::ProcEvent EvLocalContrastAmount; + rtengine::ProcEvent EvLocalContrastDarkness; + rtengine::ProcEvent EvLocalContrastLightness; + public: LocalContrast(); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 1b77379bb..318ebf55b 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -315,7 +315,7 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib:: return; } - int changeFlags = refreshmap[ (int)event]; + int changeFlags = rtengine::RefreshMapper::getInstance()->getAction(event); ProcParams* params = ipc->beginUpdateParams (); @@ -327,7 +327,7 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib:: if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { if (fabs (params->rotate.degree) > 0.001) { params->rotate.degree *= -1; - changeFlags |= refreshmap[ (int)rtengine::EvROTDegree]; + changeFlags |= rtengine::RefreshMapper::getInstance()->getAction(rtengine::EvROTDegree); rotate->read (params); } } @@ -446,7 +446,7 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi // start the IPC processing if (filterRawRefresh) { - ipc->endUpdateParams ( refreshmap[ (int)event] & ALLNORAW ); + ipc->endUpdateParams ( rtengine::RefreshMapper::getInstance()->getAction(event) & ALLNORAW ); } else { ipc->endUpdateParams (event); } From c47fa5482716a8d4cbbf145a0065f6685ed37648 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 13:49:41 +0100 Subject: [PATCH 035/200] local contrast: tweaked the ranges for the darkness and lightness adjusters --- rtgui/localcontrast.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index 8e1b5660e..e372e6d98 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -36,8 +36,8 @@ LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_L radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 8.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); - darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 4., 0.1, 1.)); - lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 4., 0.1, 1.)); + darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 3., 0.01, 1.)); + lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 3., 0.01, 1.)); radius->setAdjusterListener(this); amount->setAdjusterListener(this); From b65f529d5f906d37f7b7dee4d2a41892d1d64608 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 13:57:09 +0100 Subject: [PATCH 036/200] add attribution for the original local contrast code in G'MIC --- rtengine/iplocalcontrast.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index faee1e00a..b68f376ec 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -4,6 +4,10 @@ * * Ported from G'MIC by Alberto Griggio * + * The original implementation in G'MIC was authored by Arto Huotari, and was + * released under the CeCILL free software license (see + * http://www.cecill.info/licences/Licence_CeCILL_V2-en.html) + * * 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 From bd2568c6d8839312d2169e20916b26bbee5c28a3 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 14:09:15 +0100 Subject: [PATCH 037/200] fixed default value for local contrast radius in the GUI --- rtgui/localcontrast.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index e372e6d98..1b89093b9 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -34,7 +34,7 @@ LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_L EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); - radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 8.)); + radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 80.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 3., 0.01, 1.)); lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 3., 0.01, 1.)); From 235a4bb451ae9309594e59b6d62bb8acd6081ad2 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 19 Dec 2017 22:24:58 +0100 Subject: [PATCH 038/200] simplified the local contrast code and implemented the "proper" highlights and shadows scaling --- rtengine/iplocalcontrast.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index b68f376ec..0445746a4 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -45,8 +45,7 @@ void ImProcFunctions::localContrast(LabImage *lab) const int width = lab->W; const int height = lab->H; - const float a = -params->localContrast.amount; - const float half = 0.5f; + const float a = params->localContrast.amount; const float dark = params->localContrast.darkness; const float light = params->localContrast.lightness; array2D buf(width, height); @@ -62,10 +61,10 @@ void ImProcFunctions::localContrast(LabImage *lab) #endif for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { - float bufval = (buf[y][x] - lab->L[y][x]) * a; + float bufval = (lab->L[y][x] - buf[y][x]) * a; if (dark != 1 || light != 1) { - bufval = max(bufval, half) * light + min(bufval, half) * dark; + bufval *= (bufval > 0.f) ? light : dark; } lab->L[y][x] += bufval; From 5ea5cfd943d2f77f91f3b7f47e377074e57be629 Mon Sep 17 00:00:00 2001 From: Hombre Date: Tue, 19 Dec 2017 22:28:52 +0100 Subject: [PATCH 039/200] Fixing #4233 : "Segfault opening PREDICTOR_FLOATINGPOINT image" Now compressed file use Deflate compression for all bit depth, and PREDICTOR_HORIZONTAL for 8/16 bit integer images, and PREDICTOR_FLOATINGPOINT for 32 bits float images. --- rtengine/imageio.cc | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e7a45ecf6..ba52c4672 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1373,16 +1373,37 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); if (!uncompressed) { - TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_NONE); + TIFFSetField (out, TIFFTAG_PREDICTOR, bps == 32 ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); } if (profileData) { TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); } +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; +#else + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; +#endif + for (int row = 0; row < height; row++) { getScanline (row, linebuffer, bps); + if (needsReverse) { + if (bps == 16) { + for (int i = 0; i < lineWidth; i += 2) { + char c = linebuffer[i]; + linebuffer[i] = linebuffer[i + 1]; + linebuffer[i + 1] = c; + } + } else { + for (int i = 0; i < lineWidth; i += 4) { + std::swap(linebuffer[i], linebuffer[i+3]); + std::swap(linebuffer[i+1], linebuffer[i+2]); + } + } + } + if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { TIFFClose (out); delete [] linebuffer; From 8cd11d5b63b5cef54b4eac828a7ff99f6cf62c9b Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 20 Dec 2017 09:39:16 +0100 Subject: [PATCH 040/200] Add missing Fattal batch labels The Preferences > Batch Processing panel used the old TP_TM_FATTAL_ALPHA and TP_TM_FATTAL_BETA labels, now it uses the new TP_TM_FATTAL_THRESHOLD and TP_TM_FATTAL_AMOUNT ones, respectively. Fixes #4229 --- rtgui/preferences.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index cfa10265b..e66edce29 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -197,8 +197,8 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_TM_FATTAL_LABEL")); - appendBehavList (mi, M ("TP_TM_FATTAL_ALPHA"), ADDSET_FATTAL_ALPHA, false); - appendBehavList (mi, M ("TP_TM_FATTAL_BETA"), ADDSET_FATTAL_BETA, false); + appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_ALPHA, false); + appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_BETA, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_RETINEX_LABEL")); From ba74c5c0e45482d35aec83f9b27ae1b72a1472cc Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 20 Dec 2017 09:44:45 +0100 Subject: [PATCH 041/200] generateTranslationDiffs --- rtdata/languages/Catala | 1 + rtdata/languages/Chinese (Simplified) | 1 + rtdata/languages/Chinese (Traditional) | 1 + rtdata/languages/Czech | 7 +++++++ rtdata/languages/Dansk | 1 + rtdata/languages/Deutsch | 10 +++------- rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/Espanol | 1 + rtdata/languages/Euskara | 1 + rtdata/languages/Francais | 1 + rtdata/languages/Greek | 1 + rtdata/languages/Hebrew | 1 + rtdata/languages/Italiano | 1 + rtdata/languages/Japanese | 1 + rtdata/languages/Latvian | 1 + rtdata/languages/Magyar | 1 + rtdata/languages/Nederlands | 1 + rtdata/languages/Norsk BM | 1 + rtdata/languages/Polish | 1 + rtdata/languages/Polish (Latin Characters) | 1 + rtdata/languages/Portugues (Brasil) | 1 + rtdata/languages/Russian | 1 + rtdata/languages/Serbian (Cyrilic Characters) | 1 + rtdata/languages/Serbian (Latin Characters) | 1 + rtdata/languages/Slovak | 1 + rtdata/languages/Suomi | 1 + rtdata/languages/Swedish | 1 + rtdata/languages/Turkish | 1 + 29 files changed, 37 insertions(+), 7 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 756df1be3..ae89b7ad2 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1321,6 +1321,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index fccf5f847..fe59eb47c 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1429,6 +1429,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 09439c2e4..d349a7b5f 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -981,6 +981,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 67c2cf0e3..fcf7120fa 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -39,6 +39,7 @@ #38 2017-04-26 updated by mkyral #39 2017-07-21 updated by mkyral #40 2017-12-13 updated by mkyral + ABOUT_TAB_BUILD;Verze ABOUT_TAB_CREDITS;Zásluhy ABOUT_TAB_LICENSE;Licence @@ -2213,3 +2214,9 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit obrazovce\nZkratka: Alt-ff ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: + ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - + +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_493;L*a*b* Adjustments diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 079d4d6d8..f4056c7c0 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 06996fdf8..f0bc6e208 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -768,6 +768,8 @@ HISTORY_MSG_487;(Objektivkorrektur)\nProfil - Objektiv HISTORY_MSG_488;(HDR-Dynamikkompression) HISTORY_MSG_489;(HDR-Dynamikkompression)\nSchwelle HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität +HISTORY_MSG_491;(Weißabgleich) +HISTORY_MSG_492;(RGB-Kurven) HISTORY_MSG_493;(L*a*b*) HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s @@ -1836,6 +1838,7 @@ TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Weicher Übergang zwischen Bereichen mit und ohn TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Sensor mit Bayer-Matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Mit “3-Pass“ erzielt man die besten Ergebnisse\n(empfohlen bei Bildern mit niedrigen ISO-Werten).\n\nBei hohen ISO-Werten unterscheidet sich “1-Pass“\nkaum gegenüber “3-Pass“, ist aber deutlich schneller. TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix @@ -2222,10 +2225,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_491;(Weißabgleich) -HISTORY_MSG_492;(RGB-Kurven) -TP_RAW_RCD;RCD diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index ac956b114..cc712c985 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -807,6 +807,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index f251950ee..be0978784 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -725,6 +725,7 @@ !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index f27d211db..e0e3aa04c 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1713,6 +1713,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 57cdc631a..2bfe69e27 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 293ddd6be..0f8168645 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2180,4 +2180,5 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !TP_RAW_RCD;RCD diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 57cd9d0b3..25b28c449 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -976,6 +976,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index ed89ba392..71e9d7cf1 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index f532f3270..e17ded5f7 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1587,6 +1587,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 33b81ce8f..71a94eef0 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1964,6 +1964,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index cbfa1d6ae..8e8228fe2 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index da38b0c4c..b90aa9808 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1250,6 +1250,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 6aaa8ce28..7f60d7b92 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2158,6 +2158,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 6a483966c..96fe6e432 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -976,6 +976,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 7af8c1404..c71334d72 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1670,6 +1670,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 4064a96a2..130353c45 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1670,6 +1670,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 894e5405e..ea4428d07 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 150ca91e3..438e9fdcd 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1530,6 +1530,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index bdc693b54..c44c74985 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1563,6 +1563,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 58bcc871d..56205ec68 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1563,6 +1563,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index c42c22637..04f7a7f6b 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1039,6 +1039,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 1f14fad7c..9c04cd129 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -978,6 +978,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 989207c05..543e3cb8e 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1957,6 +1957,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index ac3fa70a0..791055d29 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -977,6 +977,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_490;HDR TM - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. From 0aff2f7c6c8b1b7ddd39193c534ca43f88427c94 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 20 Dec 2017 16:56:05 +0100 Subject: [PATCH 042/200] added partial paste and add/set preferences for local contrast --- rtgui/addsetids.h | 4 ++++ rtgui/batchtoolpanelcoord.cc | 4 ++++ rtgui/localcontrast.cc | 12 +++++++----- rtgui/localcontrast.h | 2 +- rtgui/partialpastedlg.cc | 9 +++++++++ rtgui/partialpastedlg.h | 3 ++- rtgui/preferences.cc | 8 ++++++++ 7 files changed, 35 insertions(+), 7 deletions(-) diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 07cf47d18..509b00610 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -129,6 +129,10 @@ enum { ADDSET_EPD_REWEIGHTINGITERATES, ADDSET_FATTAL_ALPHA, ADDSET_FATTAL_BETA, + ADDSET_LOCALCONTRAST_RADIUS, + ADDSET_LOCALCONTRAST_AMOUNT, + ADDSET_LOCALCONTRAST_DARKNESS, + ADDSET_LOCALCONTRAST_LIGHTNESS, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index a854db612..c2422a566 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -193,6 +193,7 @@ void BatchToolPanelCoordinator::initSession () prsharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); epd->setAdjusterBehavior (options.baBehav[ADDSET_EPD_STRENGTH], options.baBehav[ADDSET_EPD_GAMMA], options.baBehav[ADDSET_EPD_EDGESTOPPING], options.baBehav[ADDSET_EPD_SCALE], options.baBehav[ADDSET_EPD_REWEIGHTINGITERATES]); fattal->setAdjusterBehavior (options.baBehav[ADDSET_FATTAL_ALPHA], options.baBehav[ADDSET_FATTAL_BETA]); + localContrast->setAdjusterBehavior(options.baBehav[ADDSET_LOCALCONTRAST_RADIUS], options.baBehav[ADDSET_LOCALCONTRAST_AMOUNT], options.baBehav[ADDSET_LOCALCONTRAST_DARKNESS], options.baBehav[ADDSET_LOCALCONTRAST_LIGHTNESS]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT], options.baBehav[ADDSET_SHARPENEDGE_PASS]); sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT], options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); @@ -351,6 +352,9 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_RAWFFCLIPCONTROL]) { pparams.raw.ff_clipControl = 0; } if (options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]) { pparams.raw.bayersensor.greenthresh = 0; } if (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE]) { pparams.raw.bayersensor.linenoise = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_AMOUNT]) { pparams.localContrast.amount = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_DARKNESS]) { pparams.localContrast.darkness = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_LIGHTNESS]) { pparams.localContrast.lightness = 0; } // *INDENT-ON* } diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index 1b89093b9..93612444e 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -157,9 +157,11 @@ void LocalContrast::setBatchMode(bool batchMode) } -// void LocalContrast::setAdjusterBehavior (bool alphaAdd, bool betaAdd) -// { -// threshold->setAddMode(alphaAdd); -// amount->setAddMode(betaAdd); -// } +void LocalContrast::setAdjusterBehavior(bool radiusAdd, bool amountAdd, bool darknessAdd, bool lightnessAdd) +{ + radius->setAddMode(radiusAdd); + amount->setAddMode(amountAdd); + darkness->setAddMode(darknessAdd); + lightness->setAddMode(lightnessAdd); +} diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index d3a4e54d5..4f6f872af 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -48,6 +48,6 @@ public: void adjusterChanged(Adjuster *a, double newval); void enabledChanged(); - // void setAdjusterBehavior(bool alphaAdd, bool betaAdd); + void setAdjusterBehavior(bool radiusAdd, bool amountAdd, bool darknessAdd, bool lightnessAdd); }; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 4b5c7a857..898b6dad5 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -49,6 +49,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // options in basic: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); + localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); @@ -142,6 +143,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[0]->pack_start (*hseps[0], Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*wb, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); + vboxes[0]->pack_start (*localcontrast, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2); @@ -298,6 +300,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); + localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); fattalConn = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); @@ -472,6 +475,7 @@ void PartialPasteDlg::basicToggled () ConnectionBlocker wbBlocker(wbConn); ConnectionBlocker exposureBlocker(exposureConn); + ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker shBlocker(shConn); ConnectionBlocker epdBlocker(epdConn); ConnectionBlocker fattalBlocker(fattalConn); @@ -485,6 +489,7 @@ void PartialPasteDlg::basicToggled () wb->set_active (basic->get_active ()); exposure->set_active (basic->get_active ()); + localcontrast->set_active(basic->get_active()); sh->set_active (basic->get_active ()); epd->set_active (basic->get_active ()); fattal->set_active (basic->get_active ()); @@ -629,6 +634,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.toneCurve = falsePE.toneCurve; } + if (!localcontrast->get_active()) { + filterPE.localContrast = falsePE.localContrast; + } + if (!sh->get_active ()) { filterPE.sh = falsePE.sh; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index baef6b9aa..d1ae056c3 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -44,6 +44,7 @@ public: // options in basic: Gtk::CheckButton* wb; Gtk::CheckButton* exposure; + Gtk::CheckButton* localcontrast; Gtk::CheckButton* sh; Gtk::CheckButton* epd; Gtk::CheckButton* fattal; @@ -124,7 +125,7 @@ public: sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, wavConn; - sigc::connection wbConn, exposureConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; + sigc::connection wbConn, exposureConn, localcontrastConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn; sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn; sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 7e6018ff0..09547a503 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -187,6 +187,14 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false); appendBehavList (mi, M ("TP_EXPOSURE_SATURATION"), ADDSET_TC_SATURATION, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_LOCALCONTRAST_LABEL")); + appendBehavList(mi, M("TP_LOCALCONTRAST_RADIUS"), ADDSET_LOCALCONTRAST_RADIUS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_AMOUNT"), ADDSET_LOCALCONTRAST_AMOUNT, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_DARKNESS"), ADDSET_LOCALCONTRAST_DARKNESS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_LIGHTNESS"), ADDSET_LOCALCONTRAST_LIGHTNESS, false); + + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_EPD_LABEL")); appendBehavList (mi, M ("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); From 8e9304fa73c58e18f8f7f9a2486178711a5cfff8 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 20 Dec 2017 16:57:40 +0100 Subject: [PATCH 043/200] added translation for PARTIALPASTE_LOCALCONTRAST --- rtdata/languages/default | 1 + 1 file changed, 1 insertion(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index e9386e350..f8e888fab 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -907,6 +907,7 @@ PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;L*a*b* adjustments PARTIALPASTE_LENSGROUP;Lens Related Settings PARTIALPASTE_LENSPROFILE;Profiled lens correction +PARTIALPASTE_LOCALCONTRAST;Local contrast PARTIALPASTE_METAGROUP;Metadata PARTIALPASTE_PCVIGNETTE;Vignette filter PARTIALPASTE_PERSPECTIVE;Perspective From 8d3bb7d5802ba4e24afb89dd4cf13ff8aafef392 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 20 Dec 2017 18:16:42 +0100 Subject: [PATCH 044/200] Temporary remove pixel shift one green from gui --- rtgui/bayerprocess.cc | 24 ++++++++++++------------ rtgui/bayerprocess.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 10ea0a29e..b294c9fee 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -225,10 +225,10 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftLmmse->set_tooltip_text (M("TP_RAW_PIXELSHIFTLMMSE_TOOLTIP")); pixelShiftOptions->pack_start(*pixelShiftLmmse); - pixelShiftOneGreen = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTONEGREEN"), multiImage)); - pixelShiftOneGreen->setCheckBoxListener (this); - pixelShiftOneGreen->set_tooltip_text (M("TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP")); - pixelShiftOptions->pack_start(*pixelShiftOneGreen); +// pixelShiftOneGreen = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTONEGREEN"), multiImage)); +// pixelShiftOneGreen->setCheckBoxListener (this); +// pixelShiftOneGreen->set_tooltip_text (M("TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP")); +// pixelShiftOptions->pack_start(*pixelShiftOneGreen); #ifdef PIXELSHIFTDEV pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70)); @@ -381,7 +381,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params } pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor); pixelShiftLmmse->setValue (pp->raw.bayersensor.pixelShiftLmmse); - pixelShiftOneGreen->setValue (pp->raw.bayersensor.pixelShiftOneGreen); +// pixelShiftOneGreen->setValue (pp->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setValue (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->set_sensitive (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setValue (pp->raw.bayersensor.pixelShiftEqualBrightChannel); @@ -433,7 +433,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftBlur->setEdited (pedited->raw.bayersensor.pixelShiftBlur); pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited); pixelShiftLmmse->setEdited (pedited->raw.bayersensor.pixelShiftLmmse); - pixelShiftOneGreen->setEdited (pedited->raw.bayersensor.pixelShiftOneGreen); +// pixelShiftOneGreen->setEdited (pedited->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setEdited (pedited->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setEdited (pedited->raw.bayersensor.pixelShiftEqualBrightChannel); pixelShiftNonGreenCross->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenCross); @@ -538,7 +538,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->getLastActive (); pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue(); pp->raw.bayersensor.pixelShiftLmmse = pixelShiftLmmse->getLastActive (); - pp->raw.bayersensor.pixelShiftOneGreen = pixelShiftOneGreen->getLastActive (); +// pp->raw.bayersensor.pixelShiftOneGreen = pixelShiftOneGreen->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBright = pixelShiftEqualBright->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBrightChannel = pixelShiftEqualBrightChannel->getLastActive (); pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->getLastActive (); @@ -591,7 +591,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent(); pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState(); pedited->raw.bayersensor.pixelShiftLmmse = !pixelShiftLmmse->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftOneGreen = !pixelShiftOneGreen->get_inconsistent(); +// pedited->raw.bayersensor.pixelShiftOneGreen = !pixelShiftOneGreen->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBright = !pixelShiftEqualBright->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBrightChannel = !pixelShiftEqualBrightChannel->get_inconsistent(); pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent(); @@ -858,10 +858,10 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) if (listener) { listener->panelChanged (EvPixelShiftLmmse, pixelShiftLmmse->getValueAsStr ()); } - } else if (c == pixelShiftOneGreen) { - if (listener) { - listener->panelChanged (EvPixelShiftOneGreen, pixelShiftOneGreen->getValueAsStr ()); - } +// } else if (c == pixelShiftOneGreen) { +// if (listener) { +// listener->panelChanged (EvPixelShiftOneGreen, pixelShiftOneGreen->getValueAsStr ()); +// } } else if (c == pixelShiftEqualBright) { if (!batchMode) { pixelShiftEqualBrightChannel->set_sensitive(newval != CheckValue::off); diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 91e07f323..e1a620474 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -49,7 +49,7 @@ protected: CheckBox* pixelShiftBlur; CheckBox* pixelShiftHoleFill; CheckBox* pixelShiftMedian; - CheckBox* pixelShiftOneGreen; +// CheckBox* pixelShiftOneGreen; CheckBox* pixelShiftLmmse; CheckBox* pixelShiftEqualBright; CheckBox* pixelShiftEqualBrightChannel; From 8b8345d65bb85ed30e8ec8760ec95ffbdd1fb41c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 20 Dec 2017 18:26:14 +0100 Subject: [PATCH 045/200] Removed PS one green history message from default language file --- rtdata/languages/default | 1 - 1 file changed, 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 832c9e264..739fb6d71 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -725,7 +725,6 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments -HISTORY_MSG_494;PS - Use single green HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot From 3a2943434502dc5de1e4f63d518989e581bc7ce2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 20 Dec 2017 18:32:44 +0100 Subject: [PATCH 046/200] Add sony arq file extension --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index bbc1de057..4ff90246d 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 25696cb85..9130ef9ad 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 3f309fd16..33ab499be 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f From c84aebb427cc78cdf4911ccefef640bb6b98f587 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 20 Dec 2017 22:19:36 +0100 Subject: [PATCH 047/200] localcontrast: removed timing code, don't multithread when multiThread is set to false --- rtengine/iplocalcontrast.cc | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 0445746a4..24739fb6b 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -27,18 +27,13 @@ #endif #include "improcfun.h" -#include "settings.h" #include "gauss.h" -#include "boxblur.h" #include "array2D.h" -#define BENCHMARK -#include "StopWatch.h" namespace rtengine { void ImProcFunctions::localContrast(LabImage *lab) { - BENCHFUN if (!params->localContrast.enabled) { return; } @@ -52,12 +47,12 @@ void ImProcFunctions::localContrast(LabImage *lab) const float sigma = params->localContrast.radius / scale; #ifdef _OPENMP - #pragma omp parallel + #pragma omp parallel if(multiThread) #endif gaussianBlur(lab->L, buf, width, height, sigma); #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel for if(multiThread) #endif for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { From 38a35830773aa839c47fc9d21038c676ba232d14 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 20 Dec 2017 22:57:57 +0100 Subject: [PATCH 048/200] StagedImageProcessor add explicit overload void endUpdateParams(ProcEventCode) to do proper function overload resolution Fixes #4239 --- rtengine/rtengine.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index edf903352..d8e527157 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -413,6 +413,7 @@ public: * The image update starts immediately in the background. If it is ready, the result is passed to a PreviewImageListener * and to a DetailedCropListener (if enabled). */ virtual void endUpdateParams (ProcEvent change) = 0; + void endUpdateParams(ProcEventCode change) { endUpdateParams(ProcEvent(change)); } virtual void endUpdateParams (int changeFlags) = 0; // Starts a minimal update virtual void startProcessing (int changeCode) = 0; From 1c1bb8fafc8bf5cdead3f1625c8721c757a3bd30 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 20 Dec 2017 22:59:52 +0100 Subject: [PATCH 049/200] use 20 as lower bound for radius in local contrast --- rtgui/localcontrast.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index 93612444e..727479c34 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -34,7 +34,7 @@ LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_L EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); - radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 3., 200., 1., 80.)); + radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 20., 200., 1., 80.)); amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 3., 0.01, 1.)); lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 3., 0.01, 1.)); From 777891bb463a72b5c117648af08a72b226742bd4 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Thu, 21 Dec 2017 10:31:54 +0100 Subject: [PATCH 050/200] Update Deutsch locale (Local Contrast) --- rtdata/languages/Deutsch | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index f0bc6e208..514e759ab 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -47,6 +47,7 @@ #46 18.10.2017 Erweiterung (TooWaBoo) RT 5.3 #47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 #48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 +#49 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -2225,3 +2226,18 @@ 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_LOCALCONTRAST_ENABLED;(Lokaler Kontrast) +HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius +HISTORY_MSG_LOCALCONTRAST_AMOUNT;(Lokaler Kontrast)\nIntensität +HISTORY_MSG_LOCALCONTRAST_DARKNESS;(Lokaler Kontrast)\nDunkle Bereiche +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche +PARTIALPASTE_LOCALCONTRAST;Lokaler Kontrast +TP_LOCALCONTRAST_LABEL;Lokaler Kontrast +TP_LOCALCONTRAST_RADIUS;Radius +TP_LOCALCONTRAST_AMOUNT;Intensität +TP_LOCALCONTRAST_DARKNESS;Dunkle Bereiche +TP_LOCALCONTRAST_LIGHTNESS;Helle Bereiche From 3762a8332fde2a89c12eaa98c419dccdcdceed0d Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 21 Dec 2017 13:31:46 +0100 Subject: [PATCH 051/200] generateTranslationDiffs --- rtdata/languages/Catala | 17 +++++++++++-- rtdata/languages/Chinese (Simplified) | 17 +++++++++++-- rtdata/languages/Chinese (Traditional) | 17 +++++++++++-- rtdata/languages/Czech | 13 ++++++++++ rtdata/languages/Dansk | 17 +++++++++++-- rtdata/languages/Deutsch | 24 ++++++++++--------- rtdata/languages/English (UK) | 17 +++++++++++-- rtdata/languages/English (US) | 17 +++++++++++-- rtdata/languages/Espanol | 15 +++++++++++- rtdata/languages/Euskara | 17 +++++++++++-- rtdata/languages/Francais | 13 ++++++++++ rtdata/languages/Greek | 17 +++++++++++-- rtdata/languages/Hebrew | 17 +++++++++++-- rtdata/languages/Italiano | 15 +++++++++++- rtdata/languages/Japanese | 15 +++++++++++- rtdata/languages/Latvian | 17 +++++++++++-- rtdata/languages/Magyar | 17 +++++++++++-- rtdata/languages/Nederlands | 15 +++++++++++- rtdata/languages/Norsk BM | 17 +++++++++++-- rtdata/languages/Polish | 15 +++++++++++- rtdata/languages/Polish (Latin Characters) | 15 +++++++++++- rtdata/languages/Portugues (Brasil) | 17 +++++++++++-- rtdata/languages/Russian | 15 +++++++++++- rtdata/languages/Serbian (Cyrilic Characters) | 15 +++++++++++- rtdata/languages/Serbian (Latin Characters) | 15 +++++++++++- rtdata/languages/Slovak | 17 +++++++++++-- rtdata/languages/Suomi | 17 +++++++++++-- rtdata/languages/Swedish | 15 +++++++++++- rtdata/languages/Turkish | 17 +++++++++++-- rtdata/languages/default | 10 ++++---- 30 files changed, 424 insertions(+), 58 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index ae89b7ad2..7cda54ed5 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -1322,6 +1322,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1383,6 +1388,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1826,6 +1832,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1858,7 +1869,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_DCB;DCB !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1866,7 +1877,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !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. @@ -1905,6 +1916,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index fe59eb47c..de1114832 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1430,6 +1430,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1479,6 +1484,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !MONITOR_PROFILE_SYSTEM;System default !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_LOCALCONTRAST;Local contrast !PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1791,6 +1797,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1827,7 +1838,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_DMETHOD;Method !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1836,7 +1847,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1876,6 +1887,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index d349a7b5f..49f17182b 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -982,6 +982,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1097,6 +1102,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1733,6 +1739,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1783,7 +1794,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_DMETHOD;Method !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1792,7 +1803,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1832,6 +1843,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index fcf7120fa..d881bfb1b 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -2220,3 +2220,16 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !!!!!!!!!!!!!!!!!!!!!!!!! !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index f4056c7c0..d99c199bf 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 514e759ab..7b5921af3 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -772,6 +772,11 @@ HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität HISTORY_MSG_491;(Weißabgleich) HISTORY_MSG_492;(RGB-Kurven) HISTORY_MSG_493;(L*a*b*) +HISTORY_MSG_LOCALCONTRAST_AMOUNT;(Lokaler Kontrast)\nIntensität +HISTORY_MSG_LOCALCONTRAST_DARKNESS;(Lokaler Kontrast)\nDunkle Bereiche +HISTORY_MSG_LOCALCONTRAST_ENABLED;(Lokaler Kontrast) +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche +HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -949,6 +954,7 @@ PARTIALPASTE_IPTCINFO;IPTC-Informationen PARTIALPASTE_LABCURVE;L*a*b* - Einstellungen PARTIALPASTE_LENSGROUP;Objektivkorrekturen PARTIALPASTE_LENSPROFILE;Objektivkorrekturprofil +PARTIALPASTE_LOCALCONTRAST;Lokaler Kontrast PARTIALPASTE_METAGROUP;Metadaten PARTIALPASTE_PCVIGNETTE;Vignettierungsfilter PARTIALPASTE_PERSPECTIVE;Perspektive @@ -1727,6 +1733,11 @@ TP_LENSPROFILE_LABEL;Objektivkorrekturprofil TP_LENSPROFILE_USECA;CA korrigieren TP_LENSPROFILE_USEDIST;Verzeichnung korrigieren TP_LENSPROFILE_USEVIGN;Vignettierung korrigieren +TP_LOCALCONTRAST_AMOUNT;Intensität +TP_LOCALCONTRAST_DARKNESS;Dunkle Bereiche +TP_LOCALCONTRAST_LABEL;Lokaler Kontrast +TP_LOCALCONTRAST_LIGHTNESS;Helle Bereiche +TP_LOCALCONTRAST_RADIUS;Radius TP_NEUTRAL;Zurücksetzen TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen TP_PCVIGNETTE_FEATHER;Bereich @@ -2230,14 +2241,5 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -HISTORY_MSG_LOCALCONTRAST_ENABLED;(Lokaler Kontrast) -HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius -HISTORY_MSG_LOCALCONTRAST_AMOUNT;(Lokaler Kontrast)\nIntensität -HISTORY_MSG_LOCALCONTRAST_DARKNESS;(Lokaler Kontrast)\nDunkle Bereiche -HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche -PARTIALPASTE_LOCALCONTRAST;Lokaler Kontrast -TP_LOCALCONTRAST_LABEL;Lokaler Kontrast -TP_LOCALCONTRAST_RADIUS;Radius -TP_LOCALCONTRAST_AMOUNT;Intensität -TP_LOCALCONTRAST_DARKNESS;Dunkle Bereiche -TP_LOCALCONTRAST_LIGHTNESS;Helle Bereiche +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index cc712c985..be202ff6f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -808,6 +808,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -977,6 +982,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective @@ -1693,6 +1699,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1741,7 +1752,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_DMETHOD;Method !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1749,7 +1760,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1789,6 +1800,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index be0978784..2df260dc4 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -726,6 +726,11 @@ !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -903,6 +908,7 @@ !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective @@ -1680,6 +1686,11 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1730,7 +1741,7 @@ !TP_RAW_DMETHOD;Method !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1739,7 +1750,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1779,6 +1790,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index e0e3aa04c..9fd8eb807 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -1714,6 +1714,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1760,6 +1765,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !NAVIGATOR_V;V: !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_GRADIENT;Graduated filter +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image @@ -1927,6 +1933,11 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !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_LABCURVE_CURVEEDITOR_CC;CC +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1943,7 +1954,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1980,6 +1991,8 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 2bfe69e27..88ee5cdac 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 0f8168645..ed1e376b3 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -2181,4 +2181,17 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_RCD;RCD diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 25b28c449..10e4048c9 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -977,6 +977,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1094,6 +1099,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1730,6 +1736,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1779,7 +1790,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1787,7 +1798,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1827,6 +1838,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 71e9d7cf1..2bb49fc11 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index e17ded5f7..964d891c1 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -1588,6 +1588,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1628,6 +1633,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -1853,6 +1859,11 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. @@ -1881,7 +1892,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1918,6 +1929,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 71a94eef0..4ad937da8 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -1965,6 +1965,11 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1998,6 +2003,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image @@ -2065,6 +2071,11 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_ICM_BPC;Black Point Compensation !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_RAWCACORR_CASTR;Strength !TP_RAW_1PASSMEDIUM;1-Pass (Medium) @@ -2077,7 +2088,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -2114,6 +2125,8 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 8e8228fe2..7a4a265fd 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index b90aa9808..f06a57067 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1251,6 +1251,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1319,6 +1324,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1819,6 +1825,11 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1851,7 +1862,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_DCB;DCB !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1859,7 +1870,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !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. @@ -1898,6 +1909,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 7f60d7b92..4679183a4 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -2159,12 +2159,18 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_D50_OLD;5000K @@ -2191,9 +2197,16 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) !TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_RCD;RCD !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 96fe6e432..30dc287cc 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -977,6 +977,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1094,6 +1099,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1730,6 +1736,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1779,7 +1790,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1787,7 +1798,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1827,6 +1838,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index c71334d72..1ff05df61 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1671,6 +1671,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1708,6 +1713,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_EQUALIZER;Wavelet levels +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image @@ -1874,6 +1880,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1890,7 +1901,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1927,6 +1938,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 130353c45..1f461f887 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -1671,6 +1671,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1708,6 +1713,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !PARTIALPASTE_EQUALIZER;Wavelet levels +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image @@ -1874,6 +1880,11 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1890,7 +1901,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1927,6 +1938,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index ea4428d07..6453da0fe 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 438e9fdcd..4cf168bbd 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -1531,6 +1531,11 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1582,6 +1587,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening @@ -1855,6 +1861,11 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. @@ -1883,7 +1894,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1920,6 +1931,8 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index c44c74985..bd65f2a9f 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -1564,6 +1564,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1613,6 +1618,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1855,6 +1861,11 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1882,7 +1893,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1919,6 +1930,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 56205ec68..bc12eb72d 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -1564,6 +1564,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1613,6 +1618,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_METAGROUP;Metadata !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1855,6 +1861,11 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_ICM_SAVEREFERENCE;Save Reference Image !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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1882,7 +1893,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1919,6 +1930,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 04f7a7f6b..f680a30f1 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -1040,6 +1040,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1148,6 +1153,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PARTIALPASTE_HSVEQUALIZER;HSV equalizer !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1750,6 +1756,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1791,7 +1802,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_DCB;DCB !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1799,7 +1810,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1839,6 +1850,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 9c04cd129..98cc1abdd 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -979,6 +979,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1096,6 +1101,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1731,6 +1737,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1780,7 +1791,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1788,7 +1799,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1828,6 +1839,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 543e3cb8e..d37357514 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -1958,6 +1958,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1991,6 +1996,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift @@ -2058,6 +2064,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !TP_RAW_1PASSMEDIUM;1-Pass (Medium) !TP_RAW_3PASSBEST;3-Pass (Best) !TP_RAW_AHD;AHD @@ -2068,7 +2079,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -2105,6 +2116,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 791055d29..ec2016ed6 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -978,6 +978,11 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1095,6 +1100,7 @@ TP_WBALANCE_TEMPERATURE;Isı !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1730,6 +1736,11 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius !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 @@ -1779,7 +1790,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_DCBITERATIONS;Number of DCB iterations !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.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!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.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1787,7 +1798,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1827,6 +1838,8 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask diff --git a/rtdata/languages/default b/rtdata/languages/default index cd7f1634e..f4361fc5d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -725,11 +725,11 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments -HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast -HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1685,11 +1685,11 @@ TP_LENSPROFILE_LABEL;Profiled Lens Correction TP_LENSPROFILE_USECA;Chromatic aberration correction TP_LENSPROFILE_USEDIST;Distortion correction TP_LENSPROFILE_USEVIGN;Vignetting correction -TP_LOCALCONTRAST_LABEL;Local Contrast -TP_LOCALCONTRAST_RADIUS;Radius TP_LOCALCONTRAST_AMOUNT;Amount TP_LOCALCONTRAST_DARKNESS;Darkness level +TP_LOCALCONTRAST_LABEL;Local Contrast TP_LOCALCONTRAST_LIGHTNESS;Lightness level +TP_LOCALCONTRAST_RADIUS;Radius 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 @@ -1771,7 +1771,6 @@ TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median @@ -1791,6 +1790,7 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical TP_RAW_PIXELSHIFTNREADISO;nRead TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask From 48ecbd169df070b12cca24e8523b357c0f45adc2 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 21 Dec 2017 14:35:53 +0100 Subject: [PATCH 052/200] properly adjust local contrast radius when using the fast export pipeline --- rtengine/simpleprocess.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 5bcaca925..c6d10f996 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1421,8 +1421,7 @@ private: if (params.prsharpening.enabled) { params.sharpening = params.prsharpening; } else { - adjust_radius (defaultparams.sharpening.radius, scale_factor, - params.sharpening.radius); + params.sharpening.radius *= scale_factor; } params.impulseDenoise.thresh *= scale_factor; @@ -1475,7 +1474,8 @@ private: adjust_radius (defaultparams.defringe.radius, scale_factor, params.defringe.radius); - adjust_radius (defaultparams.sh.radius, scale_factor, params.sh.radius); + params.sh.radius *= scale_factor; + params.localContrast.radius *= scale_factor; if (params.raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::THREE_PASS)) { params.raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::ONE_PASS); From 156cb762ec08bb2af8840d7034bd541bc8a32526 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 22 Dec 2017 23:59:44 +0100 Subject: [PATCH 053/200] removed local contrast inside the S/H tool (remapped to the new local contrast tool) See #4247 --- rtengine/improcfun.cc | 17 ++++------------- rtengine/procparams.cc | 19 +++++++++++++++---- rtengine/procparams.h | 1 - rtgui/addsetids.h | 2 +- rtgui/batchtoolpanelcoord.cc | 5 ++--- rtgui/paramsedited.cc | 6 ------ rtgui/paramsedited.h | 1 - rtgui/preferences.cc | 1 - rtgui/shadowshighlights.cc | 18 +----------------- rtgui/shadowshighlights.h | 3 +-- 10 files changed, 24 insertions(+), 49 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2c92e1321..1d38f6be1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3107,8 +3107,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } 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::getInstance()->workingSpaceMatrix (params->icm.working); TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); @@ -3497,7 +3495,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (processSH || processLCE) { + if (processSH) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -3516,16 +3514,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (processLCE) { - double sub = lceamount * (mapval - factor * (r * lumimul[0] + g * lumimul[1] + b * lumimul[2])); - rtemp[ti * TS + tj] = factor * r - sub; - gtemp[ti * TS + tj] = factor * g - sub; - btemp[ti * TS + tj] = factor * b - sub; - } else { - rtemp[ti * TS + tj] = factor * r; - gtemp[ti * TS + tj] = factor * g; - btemp[ti * TS + tj] = factor * b; - } + rtemp[ti * TS + tj] = factor * r; + gtemp[ti * TS + tj] = factor * g; + btemp[ti * TS + tj] = factor * b; } } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 4c8aa349e..5e8fa63cf 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1492,7 +1492,6 @@ SHParams::SHParams() : htonalwidth(80), shadows(0), stonalwidth(80), - localcontrast(0), radius(40) { } @@ -1506,7 +1505,6 @@ bool SHParams::operator ==(const SHParams& other) const && htonalwidth == other.htonalwidth && shadows == other.shadows && stonalwidth == other.stonalwidth - && localcontrast == other.localcontrast && radius == other.radius; } @@ -3043,7 +3041,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->sh.htonalwidth, "Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth, keyFile); saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile); saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile); - saveToKeyfile(!pedited || pedited->sh.localcontrast, "Shadows & Highlights", "LocalContrast", sh.localcontrast, keyFile); saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile); // Crop @@ -3934,8 +3931,22 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Shadows & Highlights", "HighlightTonalWidth", pedited, sh.htonalwidth, pedited->sh.htonalwidth); assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows); assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth); - assignFromKeyfile(keyFile, "Shadows & Highlights", "LocalContrast", pedited, sh.localcontrast, pedited->sh.localcontrast); assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius); + if (keyFile.has_key("Shadows & Highlights", "LocalContrast") && ppVersion < 329) { + int lc = keyFile.get_integer("Shadows & Highlights", "LocalContrast"); + localContrast.amount = float(lc) / (sh.hq ? 500.0 : 30.); + if (pedited) { + pedited->localContrast.amount = true; + } + localContrast.enabled = sh.enabled; + if (pedited) { + pedited->localContrast.enabled = true; + } + localContrast.radius = sh.radius; + if (pedited) { + pedited->localContrast.radius = true; + } + } } if (keyFile.has_group ("Crop")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index a2514ef1b..cd47f31a2 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -738,7 +738,6 @@ struct SHParams { int htonalwidth; int shadows; int stonalwidth; - int localcontrast; int radius; SHParams(); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 509b00610..f94075ce4 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -11,7 +11,7 @@ enum { ADDSET_TC_CONTRAST, ADDSET_SH_HIGHLIGHTS, ADDSET_SH_SHADOWS, - ADDSET_SH_LOCALCONTRAST, + ADDSET_SH_LOCALCONTRAST, // not used anymore ADDSET_LC_BRIGHTNESS, ADDSET_LC_CONTRAST, ADDSET_SHARP_AMOUNT, diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index c2422a566..413a9ce86 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -160,7 +160,7 @@ void BatchToolPanelCoordinator::initSession () filmSimulation->setAdjusterBehavior(false); retinex->setAdjusterBehavior (false, false, false, false, false, false, false); - shadowshighlights->setAdjusterBehavior (false, false, false); + shadowshighlights->setAdjusterBehavior (false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); dirpyrdenoise->setAdjusterBehavior (false, false, false, false, false, false, false); @@ -205,7 +205,7 @@ void BatchToolPanelCoordinator::initSession () chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]); - shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS], options.baBehav[ADDSET_SH_LOCALCONTRAST]); + shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]); dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]); wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA], options.baBehav[ADDSET_DIRPYRDN_LUMDET], options.baBehav[ADDSET_DIRPYRDN_CHROMA], options.baBehav[ADDSET_DIRPYRDN_CHROMARED], options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]); @@ -227,7 +227,6 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_TC_SATURATION]) { pparams.toneCurve.saturation = 0;} if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; } if (options.baBehav[ADDSET_SH_SHADOWS]) { pparams.sh.shadows = 0; } - if (options.baBehav[ADDSET_SH_LOCALCONTRAST]) { pparams.sh.localcontrast = 0; } if (options.baBehav[ADDSET_LC_BRIGHTNESS]) { pparams.labCurve.brightness = 0; } if (options.baBehav[ADDSET_LC_CONTRAST]) { pparams.labCurve.contrast = 0; } if (options.baBehav[ADDSET_LC_CHROMATICITY]) { pparams.labCurve.chromaticity = 0; } diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 954a42954..977d7ff3a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -281,7 +281,6 @@ void ParamsEdited::set (bool v) sh.htonalwidth = v; sh.shadows = v; sh.stonalwidth = v; - sh.localcontrast = v; sh.radius = v; crop.enabled = v; crop.x = v; @@ -838,7 +837,6 @@ void ParamsEdited::initFrom (const std::vector sh.htonalwidth = sh.htonalwidth && p.sh.htonalwidth == other.sh.htonalwidth; sh.shadows = sh.shadows && p.sh.shadows == other.sh.shadows; sh.stonalwidth = sh.stonalwidth && p.sh.stonalwidth == other.sh.stonalwidth; - sh.localcontrast = sh.localcontrast && p.sh.localcontrast == other.sh.localcontrast; sh.radius = sh.radius && p.sh.radius == other.sh.radius; crop.enabled = crop.enabled && p.crop.enabled == other.crop.enabled; crop.x = crop.x && p.crop.x == other.crop.x; @@ -2065,10 +2063,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.sh.stonalwidth = mods.sh.stonalwidth; } - if (sh.localcontrast) { - toEdit.sh.localcontrast = dontforceSet && options.baBehav[ADDSET_SH_LOCALCONTRAST] ? toEdit.sh.localcontrast + mods.sh.localcontrast : mods.sh.localcontrast; - } - if (sh.radius) { toEdit.sh.radius = mods.sh.radius; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2dcbedaf8..9c4e97a64 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -395,7 +395,6 @@ public: bool htonalwidth; bool shadows; bool stonalwidth; - bool localcontrast; bool radius; }; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index e0a5747d9..0f082c70c 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -223,7 +223,6 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi->set_value (behavColumns.label, M ("TP_SHADOWSHLIGHTS_LABEL")); appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); - appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_LOCALCONTR"), ADDSET_SH_LOCALCONTRAST, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_LABCURVE_LABEL")); diff --git a/rtgui/shadowshighlights.cc b/rtgui/shadowshighlights.cc index 39dcf6429..15cdfc428 100644 --- a/rtgui/shadowshighlights.cc +++ b/rtgui/shadowshighlights.cc @@ -44,9 +44,6 @@ ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighli pack_start (*Gtk::manage (new Gtk::HSeparator())); - lcontrast = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_LOCALCONTR"), 0, 100, 1, 0)); - pack_start (*lcontrast); - pack_start (*Gtk::manage (new Gtk::HSeparator())); radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 5, 100, 1, 30)); @@ -57,7 +54,6 @@ ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighli h_tonalwidth->setAdjusterListener (this); shadows->setAdjusterListener (this); s_tonalwidth->setAdjusterListener (this); - lcontrast->setAdjusterListener (this); show_all_children (); } @@ -69,7 +65,6 @@ void ShadowsHighlights::read (const ProcParams* pp, const ParamsEdited* pedited) if (pedited) { radius->setEditedState (pedited->sh.radius ? Edited : UnEdited); - lcontrast->setEditedState (pedited->sh.localcontrast ? Edited : UnEdited); highlights->setEditedState (pedited->sh.highlights ? Edited : UnEdited); h_tonalwidth->setEditedState (pedited->sh.htonalwidth ? Edited : UnEdited); shadows->setEditedState (pedited->sh.shadows ? Edited : UnEdited); @@ -87,7 +82,6 @@ void ShadowsHighlights::read (const ProcParams* pp, const ParamsEdited* pedited) lastHQ = pp->sh.hq; radius->setValue (pp->sh.radius); - lcontrast->setValue (pp->sh.localcontrast); highlights->setValue (pp->sh.highlights); h_tonalwidth->setValue (pp->sh.htonalwidth); shadows->setValue (pp->sh.shadows); @@ -100,7 +94,6 @@ void ShadowsHighlights::write (ProcParams* pp, ParamsEdited* pedited) { pp->sh.radius = (int)radius->getValue (); - pp->sh.localcontrast = (int)lcontrast->getValue (); pp->sh.highlights = (int)highlights->getValue (); pp->sh.htonalwidth = (int)h_tonalwidth->getValue (); pp->sh.shadows = (int)shadows->getValue (); @@ -110,7 +103,6 @@ void ShadowsHighlights::write (ProcParams* pp, ParamsEdited* pedited) if (pedited) { pedited->sh.radius = radius->getEditedState (); - pedited->sh.localcontrast = lcontrast->getEditedState (); pedited->sh.highlights = highlights->getEditedState (); pedited->sh.htonalwidth = h_tonalwidth->getEditedState (); pedited->sh.shadows = shadows->getEditedState (); @@ -124,7 +116,6 @@ void ShadowsHighlights::setDefaults (const ProcParams* defParams, const ParamsEd { radius->setDefault (defParams->sh.radius); - lcontrast->setDefault (defParams->sh.localcontrast); highlights->setDefault (defParams->sh.highlights); h_tonalwidth->setDefault (defParams->sh.htonalwidth); shadows->setDefault (defParams->sh.shadows); @@ -132,14 +123,12 @@ void ShadowsHighlights::setDefaults (const ProcParams* defParams, const ParamsEd if (pedited) { radius->setDefaultEditedState (pedited->sh.radius ? Edited : UnEdited); - lcontrast->setDefaultEditedState (pedited->sh.localcontrast ? Edited : UnEdited); highlights->setDefaultEditedState (pedited->sh.highlights ? Edited : UnEdited); h_tonalwidth->setDefaultEditedState (pedited->sh.htonalwidth ? Edited : UnEdited); shadows->setDefaultEditedState (pedited->sh.shadows ? Edited : UnEdited); s_tonalwidth->setDefaultEditedState (pedited->sh.stonalwidth ? Edited : UnEdited); } else { radius->setDefaultEditedState (Irrelevant); - lcontrast->setDefaultEditedState (Irrelevant); highlights->setDefaultEditedState (Irrelevant); h_tonalwidth->setDefaultEditedState (Irrelevant); shadows->setDefaultEditedState (Irrelevant); @@ -164,8 +153,6 @@ void ShadowsHighlights::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvSHSHTonalW, costr); } else if (a == radius) { listener->panelChanged (EvSHRadius, costr); - } else if (a == lcontrast) { - listener->panelChanged (EvSHLContrast, costr); } } } @@ -214,19 +201,17 @@ void ShadowsHighlights::setBatchMode (bool batchMode) ToolPanel::setBatchMode (batchMode); radius->showEditedCB (); - lcontrast->showEditedCB (); highlights->showEditedCB (); h_tonalwidth->showEditedCB (); shadows->showEditedCB (); s_tonalwidth->showEditedCB (); } -void ShadowsHighlights::setAdjusterBehavior (bool hadd, bool sadd, bool lcadd) +void ShadowsHighlights::setAdjusterBehavior (bool hadd, bool sadd) { highlights->setAddMode(hadd); shadows->setAddMode(sadd); - lcontrast->setAddMode(lcadd); } void ShadowsHighlights::trimValues (rtengine::procparams::ProcParams* pp) @@ -234,5 +219,4 @@ void ShadowsHighlights::trimValues (rtengine::procparams::ProcParams* pp) highlights->trimValue(pp->sh.highlights); shadows->trimValue(pp->sh.shadows); - lcontrast->trimValue(pp->sh.localcontrast); } diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index 167b1ecf1..de3f893d5 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -31,7 +31,6 @@ protected: Adjuster* h_tonalwidth; Adjuster* shadows; Adjuster* s_tonalwidth; - Adjuster* lcontrast; Adjuster* radius; Gtk::CheckButton* hq; bool lastHQ; @@ -50,7 +49,7 @@ public: void enabledChanged (); void hqChanged (); - void setAdjusterBehavior (bool hadd, bool sadd, bool lcadd); + void setAdjusterBehavior (bool hadd, bool sadd); void trimValues (rtengine::procparams::ProcParams* pp); }; From f4699115c606f9f828d61c8453dfb34ed78d3bf0 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sat, 23 Dec 2017 06:14:01 +0100 Subject: [PATCH 054/200] Removed double separator --- rtgui/shadowshighlights.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/rtgui/shadowshighlights.cc b/rtgui/shadowshighlights.cc index 15cdfc428..8c701dae6 100644 --- a/rtgui/shadowshighlights.cc +++ b/rtgui/shadowshighlights.cc @@ -44,8 +44,6 @@ ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighli pack_start (*Gtk::manage (new Gtk::HSeparator())); - pack_start (*Gtk::manage (new Gtk::HSeparator())); - radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 5, 100, 1, 30)); pack_start (*radius); From 1079f863b6fb4971243a39fb1e77eee0e48da869 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 24 Dec 2017 15:25:42 +0100 Subject: [PATCH 055/200] correctly perform noise reduction when HDR tone mapping settings change Fixes #4246 --- rtengine/refreshmap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index 09059470b..bfb99942a 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -56,7 +56,7 @@ #define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define HDR (M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define AUTOEXP (M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) From 11ad1dace8458a4373f74f3e37d98f2b8e56e255 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 25 Dec 2017 01:32:29 +0100 Subject: [PATCH 056/200] cmake switch -WITH_BENCHMARK enables BENCHFUN macro for rtengine --- CMakeLists.txt | 1 + rtengine/CMakeLists.txt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3e2f2c4b..fa153855b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ endif() option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) +option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 3e5eb15e4..0ed91f23f 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -122,6 +122,9 @@ if(LENSFUN_HAS_LOAD_DIRECTORY) set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY) endif() +if(WITH_BENCHMARK) + add_definitions(-DBENCHMARK) +endif() if(NOT WITH_SYSTEM_KLT) set(RTENGINESOURCEFILES ${RTENGINESOURCEFILES} From 3ccfb9b2031111ee72666b81c3579069c17e0949 Mon Sep 17 00:00:00 2001 From: gatoatigrado Date: Mon, 25 Dec 2017 00:41:43 -0500 Subject: [PATCH 057/200] Use AlignedBuffer helper class in rgbProc, use SSE in standard tone curve application. --- rtengine/alignedbuffer.h | 4 +++ rtengine/curves.h | 53 ++++++++++++++++++++++++++++++++++++++++ rtengine/improcfun.cc | 30 ++++++++++------------- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index dd9d7b278..560f0884f 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -21,6 +21,10 @@ #include #include +inline size_t padToAlignment(size_t size, size_t align = 16) { + return align * ((size + align - 1) / align); +} + // Aligned buffer that should be faster template class AlignedBuffer { diff --git a/rtengine/curves.h b/rtengine/curves.h index c616c94da..e443d430c 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -800,6 +800,13 @@ class StandardToneCurve : public ToneCurve { public: void Apply(float& r, float& g, float& b) const; + + // Applies the tone curve to `r`, `g`, `b` arrays, starting at `r[start]` + // and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE + // and requires that `r`, `g`, and `b` pointers have the same alignment. + void BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const; }; class AdobeToneCurve : public ToneCurve @@ -874,6 +881,52 @@ inline void StandardToneCurve::Apply (float& r, float& g, float& b) const g = lutToneCurve[g]; b = lutToneCurve[b]; } +inline void StandardToneCurve::BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const { + assert (lutToneCurve); + + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + i++; + } + +#if defined( __SSE2__ ) && defined( __x86_64__ ) + for (; i + 3 < end; i += 4) { + __m128i r_val = _mm_cvtps_epi32(LVF(r[i])); + __m128i g_val = _mm_cvtps_epi32(LVF(g[i])); + __m128i b_val = _mm_cvtps_epi32(LVF(b[i])); + STVF(r[i], lutToneCurve[r_val]); + STVF(g[i], lutToneCurve[g_val]); + STVF(b[i], lutToneCurve[b_val]); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + } +#endif +} // Tone curve according to Adobe's reference implementation // values in 0xffff space diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 1d38f6be1..082799e62 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -23,6 +23,7 @@ #include #endif +#include "alignedbuffer.h" #include "rtengine.h" #include "improcfun.h" #include "curves.h" @@ -3409,31 +3410,28 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #pragma omp parallel if (multiThread) #endif { - char *buffer; + size_t perChannelSizeBytes = padToAlignment(sizeof (float) * TS * TS + 4 * 64); + AlignedBuffer buffer(3 * perChannelSizeBytes); char *editIFloatBuffer = nullptr; char *editWhateverBuffer = nullptr; - buffer = (char *) malloc (3 * sizeof (float) * TS * TS + 20 * 64 + 63); - char *data; - data = (char*) ( ( uintptr_t (buffer) + uintptr_t (63)) / 64 * 64); - - float *rtemp = (float (*))data; - float *gtemp = (float (*)) ((char*)rtemp + sizeof (float) * TS * TS + 4 * 64); - float *btemp = (float (*)) ((char*)gtemp + sizeof (float) * TS * TS + 8 * 64); + float *rtemp = buffer.data; + float *gtemp = &rtemp[perChannelSizeBytes / sizeof(float)]; + float *btemp = >emp[perChannelSizeBytes / sizeof(float)]; int istart; int jstart; int tW; int tH; // zero out the buffers - memset(buffer, 0, 3 * sizeof (float) * TS * TS + 20 * 64 + 63); + memset(rtemp, 0, 3 * perChannelSizeBytes); // Allocating buffer for the PipetteBuffer float *editIFloatTmpR = nullptr, *editIFloatTmpG = nullptr, *editIFloatTmpB = nullptr, *editWhateverTmp = nullptr; if (editImgFloat) { editIFloatBuffer = (char *) malloc (3 * sizeof (float) * TS * TS + 20 * 64 + 63); - data = (char*) ( ( uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); + char *data = (char*) ( ( uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); editIFloatTmpR = (float (*))data; editIFloatTmpG = (float (*)) ((char*)editIFloatTmpR + sizeof (float) * TS * TS + 4 * 64); @@ -3442,7 +3440,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (editWhatever) { editWhateverBuffer = (char *) malloc (sizeof (float) * TS * TS + 20 * 64 + 63); - data = (char*) ( ( uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); + char *data = (char*) ( ( uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); editWhateverTmp = (float (*))data; } @@ -3618,10 +3616,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasToneCurve1) { if (curveMode == ToneCurveParams::TcMode::STD) { // Standard for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } + const StandardToneCurve& userToneCurve = static_cast (customToneCurve1); + userToneCurve.BatchApply ( + 0, tW - jstart, + &rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS]); } } else if (curveMode == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -4529,8 +4527,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - free (buffer); - if (editIFloatBuffer) { free (editIFloatBuffer); } From ebc92e1c350b028ae16a113051b8c3e46d4da0f1 Mon Sep 17 00:00:00 2001 From: gatoatigrado Date: Mon, 25 Dec 2017 14:55:14 -0500 Subject: [PATCH 058/200] New SSE interpolating routine for LUT. --- rtengine/LUT.h | 94 +++++++++++++++++------------------------------ rtengine/curves.h | 7 ++-- 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 2701c4ffc..4f245634e 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -95,6 +95,8 @@ protected: // list of variables ordered to improve cache speed unsigned int maxs; float maxsf; + // possibly-more-correct value for sse routine (see unit test for details) + float maxIndexFloat; T * data; unsigned int clip; unsigned int size; @@ -129,6 +131,7 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; + maxIndexFloat = ((float)upperBound) - 1e-5; #if defined( __SSE2__ ) && defined( __x86_64__ ) maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); @@ -158,6 +161,7 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; + maxIndexFloat = ((float)upperBound) - 1e-5; #if defined( __SSE2__ ) && defined( __x86_64__ ) maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); @@ -228,6 +232,7 @@ public: this->upperBound = rhs.upperBound; this->maxs = this->size - 2; this->maxsf = (float)this->maxs; + this->maxIndexFloat = ((float)this->upperBound) - 1e-5; #if defined( __SSE2__ ) && defined( __x86_64__ ) this->maxsv = F2V( this->size - 2); this->sizeiv = _mm_set1_epi32( (int)(this->size - 1) ); @@ -293,72 +298,37 @@ public: } #if defined( __SSE2__ ) && defined( __x86_64__ ) -/* - vfloat operator[](vfloat indexv ) const + vfloat operator[](vfloat indexv) const { -// printf("don't use this operator. It's not ready for production"); - return _mm_setzero_ps(); + static_assert(std::is_same::value, "This method only works for float LUTs"); - // convert floats to ints - vint idxv = _mm_cvttps_epi32( indexv ); - vfloat tempv, resultv, p1v, p2v; - vmask maxmask = vmaskf_gt(indexv, maxsv); - idxv = _mm_castps_si128(vself(maxmask, maxsv, _mm_castsi128_ps(idxv))); - vmask minmask = vmaskf_lt(indexv, _mm_setzero_ps()); - idxv = _mm_castps_si128(vself(minmask, _mm_setzero_ps(), _mm_castsi128_ps(idxv))); - // access the LUT 4 times and shuffle the values into p1v and p2v + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = _mm_max_ps( + _mm_setzero_ps(), + _mm_min_ps(_mm_set1_ps(maxIndexFloat), indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); - int idx; + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } - // get 4th value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(3, 3, 3, 3))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(0, 0, 0, 0)); - p2v = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - // now p1v is 3 3 3 3 - // p2v is 3 3 3 3 + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); - // get 3rd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(2, 2, 2, 2))); - tempv = LVFU(data[idx]); - p1v = _mm_move_ss( p1v, tempv); - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p1v is 3 3 3 2 - // p2v is 3 3 3 2 - - // get 2nd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(1, 1, 1, 1))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps( p1v, p1v, _MM_SHUFFLE(1, 0, 1, 0)); - p2v = _mm_shuffle_ps( p2v, p2v, _MM_SHUFFLE(1, 0, 1, 0)); - // now p1v is 3 2 3 2 - // now p2v is 3 2 3 2 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 3 1 - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p1v is 3 2 3 1 - - // get 1st value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(0, 0, 0, 0))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps( p1v, p1v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p1v is 3 2 1 1 - p2v = _mm_shuffle_ps( p2v, p2v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p2v is 3 2 1 1 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 1 0 - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p2v is 3 2 1 0 - - vfloat diffv = indexv - _mm_cvtepi32_ps ( idxv ); - diffv = vself(vorm(maxmask, minmask), _mm_setzero_ps(), diffv); - resultv = p1v + p2v * diffv; - return resultv ; + vfloat diff = clampedIndexes - _mm_cvtepi32_ps(indexes); + return (_mm_set1_ps(1.0f) - diff) * lower + (diff * upper); } -*/ #ifdef __SSE4_1__ template::value>::type> vfloat operator[](vint idxv ) const @@ -456,6 +426,8 @@ public: } idx = 0; + // Note: Maybe this should be 'idx > maxsf'? See unit test where a LUT with + // values [10, 11, 12, 13] gets looked up at 2.5 and returns 12.5. } else if (index > maxsf) { if (clip & LUT_CLIP_ABOVE) { return data[upperBound]; @@ -543,6 +515,7 @@ public: maxs = 0; maxsf = 0.f; clip = 0; + maxIndexFloat = ((float)upperBound) - 1e-5; } // create an identity LUT (LUT(x) = x) or a scaled identity LUT (LUT(x) = x / divisor) @@ -652,6 +625,7 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; + maxIndexFloat = ((float)upperBound) - 1e-5; #if defined( __SSE2__ ) && defined( __x86_64__ ) maxsv = F2V( size - 2); sizeiv = _mm_set1_epi32( (int)(size - 1) ); diff --git a/rtengine/curves.h b/rtengine/curves.h index e443d430c..15ab96624 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -881,6 +881,7 @@ inline void StandardToneCurve::Apply (float& r, float& g, float& b) const g = lutToneCurve[g]; b = lutToneCurve[b]; } + inline void StandardToneCurve::BatchApply( const size_t start, const size_t end, float *r, float *g, float *b) const { @@ -911,9 +912,9 @@ inline void StandardToneCurve::BatchApply( #if defined( __SSE2__ ) && defined( __x86_64__ ) for (; i + 3 < end; i += 4) { - __m128i r_val = _mm_cvtps_epi32(LVF(r[i])); - __m128i g_val = _mm_cvtps_epi32(LVF(g[i])); - __m128i b_val = _mm_cvtps_epi32(LVF(b[i])); + __m128 r_val = LVF(r[i]); + __m128 g_val = LVF(g[i]); + __m128 b_val = LVF(b[i]); STVF(r[i], lutToneCurve[r_val]); STVF(g[i], lutToneCurve[g_val]); STVF(b[i], lutToneCurve[b_val]); From 8f7cd6bf8f04e79eac74035e3bc567bc30058250 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 25 Dec 2017 22:49:53 +0100 Subject: [PATCH 059/200] Removed unmaintained buildRT Bash script --- tools/buildRT | 450 -------------------------------------------------- 1 file changed, 450 deletions(-) delete mode 100755 tools/buildRT diff --git a/tools/buildRT b/tools/buildRT deleted file mode 100755 index 71370e8df..000000000 --- a/tools/buildRT +++ /dev/null @@ -1,450 +0,0 @@ -#!/usr/bin/env bash -# Written by DrSlony -# buildRT version 4.4, 2016-03-03 -# Please report bugs or enhancements to https://github.com/Beep6581/RawTherapee/issues -# www.rawtherapee.com -# www.londonlight.org - -head -n 4 $0 | tail -n 2 | sed $'1s/.\+/\E[1m&\E[0m/' -echo - -if [[ $UID -eq 0 ]]; then - printf "%s\n" "Do not run this script as root!" "Aborting" - exit 1 -fi - -alert () { - case "$alert_type" in - notify-send) notify-send "RawTherapee" "$1" ;; - kdialog) kdialog --title "RawTherapee" --passivepopup "$(printf "%b\n" "$1")" ;; - zenity) zenity --notification --text="$(printf "%b\n" "$1")" ;; - xmessage) xmessage -nearmouse "$(printf "%b\n" "$1")" ;; - none) printf "%b\n" "" "Compilation complete:" "$1" ;; -esac -} - -#--- Set some variables -unset choiceNumber choiceNumbers buildType buildTypes list branch branches repo -version="4.3" -movetoPatched="" -repo="${HOME}/rawtherapee" -procTarget=2 - -while getopts "bc:fnp:s:t:uvh?-" opt; do - case "${opt}" in - b) patched="yes" - movetoPatched="_patched" - printf "%s\n" "Buildonly flag detected, will not git pull or checkout" ;; - c) dCacheNameSuffix="$OPTARG" - dCacheNameSuffix=${dCacheNameSuffix//[^\.\-_a-zA-Z0-9]/}; - forceCmake="yes" - printf "%s\n" "Cache and config name suffix: $dCacheNameSuffix" ;; - f) forceCmake="yes" - printf "%s\n" "Will forcefully re-run CMake" ;; - n) noomp="-DOPTION_OMP=OFF" - forceCmake="yes" - printf "%s\n" "OpenMP disabled" ;; - p) procTarget="$OPTARG" - if [[ $procTarget -lt 1 || $procTarget -gt 9 ]]; then - printf "%s\n" "Invalid processor target value." "Use a value from 1 to 9, e.g." "./buildRT -p 1" "See ProcessorTargets.cmake" "Aborting" - exit 1 - forceCmake="yes" - fi ;; - s) movetoPatched="_${OPTARG//[^\.\-_a-zA-Z0-9]/}" - printf "%s\n" "Suffix of destination build dir: ${movetoPatched}" ;; - t) titleSuffix="${OPTARG//[^\.\-\:\ \+_a-zA-Z0-9]/}" - forceCmake="yes" - printf "%s\n" "Titlebar version suffix: ${titleSuffix}" ;; - u) gcVer="$(curl "https://raw.githubusercontent.com/Beep6581/RawTherapee/master/tools/buildRT" 2>/dev/null | grep "^#.*[vV]ersion.*")" || { echo "\"curl\" program not found, please install it first."; exit 1; } - gcVer="${gcVer##*[[:alpha:]] }" - gcVer="${gcVer%%,*}" - latestVer="$(printf "%s\n" "$version" "$gcVer" | sort -rV | head -n 1)" - if [[ $version = $latestVer ]]; then - printf "%s\n" "You are using the latest version of buildRT, $version" - exit 0 - else - printf "%s\n" "You are using version $version but version $gcVer is available on GitHub." "You can download the GitHub version from this URL:" " https://raw.githubusercontent.com/Beep6581/RawTherapee/master/tools/buildRT" "Replace it with this script, and remember to run \"chmod +x buildRT\"" - exit 0 - fi ;; - v) verbose=yes - printf "%s\n" "Verbose mode, I will spam your screen with warnings" ;; - h|\?|-) printf "%s\n" "Usage:" "" " $0 [-b] [-c ] [-f] [-n] [-p <1-9>] [-s ] [-t \"\"] [-v]" "" - printf "%s\n" \ - " -b" \ - "Build-only mode. buildRT uses \"git checkout master\" to update your source code repository to the newest revision, however doing so might destroy any uncommitted or unpushed changes you made or any patches you applied. With the -b flag the script will not update the source code, so that you can easily compile RawTherapee with whatever patches you manually applied. buildRT should automatically detect if you modified the source code, but you can use this flag to force build-only mode." "Generally when compiling patched RT versions you want to keep the cache and config folders separate, so consider using \"-b -c _testing\"" "" \ - " -c " \ - "Specify a suffix to the cache and config directory names. Only alphanumerics, periods, dashes and underscores are valid. The default value is \"4\", which will result in your build of RawTherapee storing the cache in \"${HOME}/.cache/RawTherapee4\" and config in \"${HOME}/.config/RawTherapee4\". For example, use \"-c _testing\" if you want to test older or patched versions of RawTherapee without potentially damaging your \"real\" cache and config files." "" \ - " -f" \ - "Force CMake to re-run." "" \ - " -n" \ - "Disable OpenMP." "" \ - " -p <1-9>" \ - "Set which processor target to use. Takes a single digit from 1 to 9. The default is 2. See ProcessorTargets.cmake" "" \ - " -s " \ - "Suffix of destination build directory, so that if you have applied a patch, say \"dustremoval-1.patch\", and want to have RawTherapee compiled to a folder whose name ends with \"_dustremoval1\", you would set \"-s dustremoval1\" (the underscore is automated)." "" \ - " -t \"\"" \ - "Suffix displayed next to the RawTherapee version in the window titlebar. It is recommended that you include the commit of the newest public commit (the one you would see if you cloned the repository anew) so it is clear which commit you applied the patches to. E.g.:" "-t \": ee72ddbcfd4e + dustremoval-1.patch + mustafa ibrahim\"" "" \ - " -u" \ - "Check for an update of buildRT on GitHub." "" \ - " -v" \ - "Make compilation verbose, so you see all compiler warnings." | fold -s - exit 0 ;; -esac -done -shift $((OPTIND-1)) -[ "$1" = "--" ] && shift - -printf "%s\n" "Repository: ${repo}" -printf "%s\n" "Processor target: ${procTarget}" - -if [[ -z $verbose ]]; then - Wcflags="-Wno-unused-result -Wno-aggressive-loop-optimizations" -fi - -cpuCount="$(grep -c 'processor' /proc/cpuinfo)" -# We can assume that if grep returns more than 32 lines (CPUs), or nothing at all, something's wrong -if (( cpuCount < 1 || cpuCount > 32 )); then - cpuCount="1" -fi -printf "%s\n" "CPU count: ${cpuCount}" - -# Zenity --notification is broken in <=3.8.0, removed Zenity support for now. -# elif hash zenity 2>/dev/null; then alert_type="zenity" -if hash notify-send 2>/dev/null; then alert_type="notify-send" -elif hash kdialog 2>/dev/null; then alert_type="kdialog" -elif hash xmessage 2>/dev/null; then alert_type="xmessage" -else alert_type="none" -fi - -# list from http://linuxmafia.com/faq/Admin/release-files.html -distributions=( -"Annvix /etc/annvix-release" -"Arch /etc/arch-release" -"Arklinux /etc/arklinux-release" -"Aurox /etc/aurox-release" -"BlackCat /etc/blackcat-release" -"Cobalt /etc/cobalt-release" -"Conectiva /etc/conectiva-release" -"Debian /etc/debian_version" -"Fedora /etc/fedora-release" -"Gentoo /etc/gentoo-release" -"Immunix /etc/immunix-release" -"Knoppix knoppix_version" -"Linux-From-Scratch /etc/lfs-release" -"Linux-PPC /etc/linuxppc-release" -"Mandrake /etc/mandrake-release" -"Mandriva_Mandrake /etc/mandriva-release /etc/mandrake-release /etc/mandrakelinux-release" -"Mint /etc/linuxmint/info" -"MkLinux /etc/mklinux-release" -"Novell /etc/nld-release" -"PLD /etc/pld-release" -"RedHat /etc/redhat-release" -"CentOS /etc/centos-release" -"Slackware /etc/slackware-version" -"SME /etc/e-smith-release" -"Solaris /etc/release" -"SunJDS /etc/sun-release" -"SUSE /etc/SuSE-release" -"TinySofa /etc/tinysofa-release" -"TurboLinux /etc/turbolinux-release" -"Ubuntu /etc/lsb-release" -"UltraPenguin /etc/ultrapenguin-release" -"United /etc/UnitedLinux-release" -"VA-Linux /etc/va-release" -"YellowDog /etc/yellowdog-release" -) -for element in "${distributions[@]}"; do - read distro loc1 loc2 loc3 <<< "$element" - for loc in $loc1 $loc2 $loc3 - do - # distribution=${distro} because if none of the elements match, distro will =YellowDog (last item in the list) - # add "break 2;" to the end if we really want to, but Ubuntu gets detected as Debian first, then as Ubuntu, - # so we might want to not break the loop. - [[ -e "$loc" ]] && distribution=${distro} - [[ "$distribution" = Gentoo ]] && break 2 - done -done -if [[ -z ${distribution} ]]; then - printf "%s\n" "" "Could not automatically detect your distribution. Please enter your distribution's name below followed immediately by the version, without any spaces or punctuation marks, and hit enter to confirm, e.g. \"Ubuntu1310\", \"Mint15\" or \"OpenSUSE123\"" | fold -s - read distribution - #sanitize - distribution=${distribution//[^a-zA-Z0-9]/} -fi -printf "%s\n" "Distribution: ${distribution}"; - -bits="$(uname -m)" || { printf "%s\n" "Is your system a 32-bit or 64-bit one?" "Enter 32 or 64 and hit enter: "; read bits; bits=${bits//[^0-9]/}; } -if [[ $bits = *64* ]]; then - bits=64 -else - bits=32 -fi -printf "%s\n" "System: ${bits}-bit" "" - -#--- Check script dependencies -hash git 2>/dev/null || { echo >&2 "Git not found, install Git first and then re-run this script."; exit 1; } - -#--- Clone and/or pull -if [[ ! -d "${repo}" ]]; then - printf "%s\n" "${repo} not found, cloning from GitHub..." - git clone https://github.com/Beep6581/RawTherapee.git "${repo}" - cd "${repo}" || exit 1 - verLatesttag="$(git describe --tags --abbrev=0)" - verLatesttagdistance="$(git describe --tags | sed -e 's/.*-\([0-9]\+\)-.*/\1/')" - currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')" - rev="$(git rev-list --all --count)" - node="$(git rev-parse --short HEAD)" - printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n" - alert "Repository cloned succesfully. What would you like to do next?" - printf "%b" "Repository cloned succesfully.\n" "Press 'q' to quit or any other key to continue... " - read -r -n 1 - echo - [[ $REPLY = q || $REPLY = Q ]] && { printf "%s\n" "Quitting." ""; exit 0; } -fi -cd "${repo}" || exit 1 - -#--- Update or decide what to do if user edited the source code (e.g. by applying a patch) -if [[ -z $patched ]]; then - uncommitted="$(git status -s | sed "s/^/\t/")" - unpushed="$(git log origin..HEAD | sed "s/^/\t/" || echo "Could not check for unpushed changes (check your internet connection), but continuing anyway.")" -fi -if [[ -z $uncommitted && -z $unpushed && -z $patched ]]; then - git pull || echo "Could not \"git pull\" (check your internet connection), but continuing anyway." - git checkout master - echo -elif [[ -z $patched ]]; then - printf "%s\n" "" "Warning! There are uncommitted or unpushed changes in the repository!" "Uncommitted:" "$uncommitted" "Unpushed:" "$unpushed" "" "This means that you edited the source code (e.g. applied a patch). If the script proceeds to update the repository, those changes you made to the source code might be lost. Your choices are to force the update and possibly lose the changes, not to update and to compile RT as-is, or to abort the script." | fold -s - read -r -p "[f]orce update, [c]ompile as-is, or [a]bort? " fca - case $fca in - f|F) git pull || echo "Could not \"git pull\" (check your internet connection), but continuing anyway." - git checkout master - echo ;; - c|C) printf "%s\n" "Retaining edited source code and compiling RT as-is." "" - patched="yes" - if [[ -z $movetoPatched ]]; then - movetoPatched="_patched" - fi ;; - *) printf "%s\n" "User aborted" "" - exit 0 ;; - esac -else - printf "%s\n" "Retaining edited source code and compiling RT as-is." "" - if [[ -z $movetoPatched ]]; then - movetoPatched="_patched" - fi -fi - -cd "${repo}" || exit 1 -verLatesttag="$(git describe --tags --abbrev=0)" -verLatesttagdistance="$(git describe --tags | sed -e 's/.*-\([0-9]\+\)-.*/\1/')" -currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')" -rev="$(git rev-list --all --count)" -node="$(git rev-parse --short HEAD)" -printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n" - -#--- Print the menu -branches=() -if [[ -z $patched ]]; then - while read -r branch; do - branches+=("$branch") - done < <(git branch -a | grep origin | sed -e 's/.*\///'| sort -uf) -else - branches="$(git branch | grep "*" | sed -e 's/.* \+//')" -fi - -# Make the menu list -list=("0" "[abort]" "[exit]") -num="1" -buildTypes=("release" "debug") -for branch in "${branches[@]}"; do - for buildType in "${buildTypes[@]}"; do - list+=("$num" "${branch}" "${buildType}") - ((num++)) - done -done - -printf "%s\n" "---------------------------------------------" -printf "%s\t%s\t%s\n" "#" "Branch" "Build Type" "${list[@]}" | column -t -s $'\t' -c 3 | sed $'1s/.\+/\E[1m&\E[0m/' -printf "%s\n" "---------------------------------------------" "" "Enter your choices, each number separated by a single space, e.g. 3 4" "If you don't know which option to choose, then choose the \"default\" branch, \"release\" build type." "" | fold -s - -# make sure choices are valid -checkChoices () { - choiceNumbers="${choiceNumbers//[^0-9 ]/}" - # all choiceNumbers must exist in listNums, else ask again - for choiceNumber in "${choiceNumbers[@]}"; do - if [[ "${choiceNumber}" = 0 ]]; then - exit 0; - fi - found=0 - # for each num in list[@] - for (( o=3 ; o<${#list[@]} ; ((o+=3)) )); do - if [[ "${list[$o]}" = ${choiceNumber} ]]; then - found=1; - fi - done - # if one of the numbers the user typed arent in the list, break the loop and ask for input again - if [[ $found = 0 ]]; then - [[ -n ${choiceNumbers[@]} ]] && printf '%s\n' "Invalid choices, try again." - return 1; - fi - done -} - -# keep repeating read until choices are valid -until checkChoices; do - read -r -p "Your choices: " -a choiceNumbers -done -printf "%s\n" "" "---------------------------------------------" "" - -#--- Compile the chosen builds -for choiceNumber in "${choiceNumbers[@]}"; do - if [[ $choiceNumber = 0 ]]; then - printf "%s\n" "User exited." - exit 0; - fi - # ${array[@]:offset:length} - # choiceNumber*3 to get the human menu choice to match the correct array index, and then +1 so we offset to branch and buildType, not #. - IFS=$'\t' read -r branch buildType < <(printf "%s\t%s\n" "${list[@]:$(($((choiceNumber*3))+1)):2}") - # extra safety check - if [[ -z "$branch" ]] || [[ -z "$buildType" ]]; then - print '%s\n' "Something went wrong with the selection, \"branch\" or \"buildType\" empty." "Aborting" - exit 1 - fi - # This seems useless "$branch != default" - # if [[ -z $patched && $branch != default ]]; then - if [[ -z $patched ]]; then - printf "%s\n" "Updating to branch $branch" - git checkout "$branch" || exit 1 - fi - echo - printf "%-15b %b\n" "\E[1mWill compile\E[0m:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" "" - - [[ -d "${HOME}/rt_${branch}_${buildType}${movetoPatched}" ]] && { - printf "%s\n" "Found old build directory ${HOME}/rt_${branch}_${buildType}${movetoPatched}" "To proceed you must either delete it, or choose a suffix for the destination folder for this build." - read -r -p "[d]elete old build, [r]ename this build destination folder, or [a]bort " - echo - case $REPLY in - d|D) rm -rf "${HOME}/rt_${branch}_${buildType}${movetoPatched}" || exit 1 ;; - r|R) printf "%s\n" "The build will be saved to \"${HOME}/rt_${branch}_${buildType}_X\" where \"X\" will be replaced with whatever suffix you choose next. Only alphanumerics, dashes, underscores and periods are valid." | fold -s - read -r -p "Suffix: " - movetoPatched="_${REPLY//[^\.\-_a-zA-Z0-9]/}" - printf "%s\n" "Build will be compiled to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\"" ;; - a|A) printf "%s\n" "Cannot proceed if old build directory exists." "Remove it or rename it, then re-run this script." "Aborting" - exit 0 ;; - *) printf "%s\n" "Unknown response \"$REPLY\"" - exit 1 ;; - esac - } - - cd "${repo}" || exit 1 - - [[ -z $dCacheNameSuffix ]] && dCacheNameSuffix="${verLatesttag%%.*}" - - # need to rerun cmake if buildtype changed - if [[ -e build/CMakeCache.txt ]]; then - previousBuildType="$(grep 'CMAKE_BUILD_TYPE:STRING=' build/CMakeCache.txt)" - previousBuildType="${previousBuildType##*=}" - fi - if [[ ! -e build/CMakeCache.txt || $previousBuildType != "$buildType" ]]; then - forceCmake="yes" - fi - - if [[ ! -d "${repo}/build" || $forceCmake = yes ]]; then - # Clean up leftovers from previous successful or failed builds - [[ -d "${repo}/${buildType}" ]] && { printf "%s\n" "Found old build directory \"${repo}/$buildType\". Removing it."; rm -rf "${repo}/${buildType}"; } - [[ -d "${repo}/rawtherapee" ]] && { printf "%s\n" "Found old build directory \"${repo}/rawtherapee\". Removing it."; rm -rf "${repo}/rawtherapee"; } - [[ -d "${repo}/build" ]] && { printf "%s\n" "Found old build directory \"${repo}/build\". Removing it."; rm -rf "${repo}/build"; } - printf "%s\n" "" "Cleaning out old CMake files" - make clean || { printf "%s\n" "Error while running \"make clean\", aborting." "Easiest solution: delete ${repo} and re-run buildRT."; exit 1; } - ./clean.sh || { printf "%s\n" "Error while running \"./clean.sh\", aborting." "Easiest solution: delete ${repo} and re-run buildRT."; exit 1; } - mkdir "${repo}/build" || exit 1 - - # As of changeset 1930:067e362c6f28 on Mon Jun 25 2012, revision number 1930, RT supports and encourages out-of-source builds. - if (( rev < 1930 )); then - cmake \ - -DCMAKE_BUILD_TYPE="$buildType" \ - -DPROC_TARGET_NUMBER="$procTarget" \ - -DCMAKE_C_FLAGS="-pipe" \ - -DCMAKE_CXX_FLAGS="$CMAKE_C_FLAGS $Wcflags" \ - "$noomp" \ - -DCMAKE_INSTALL_PREFIX="build" \ - -DBUILD_BUNDLE="ON" \ - -DBINDIR="." \ - -DDATADIR="." \ - -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" \ - || { echo "Error during cmake, exiting."; exit 1; } - else - cd "${repo}/build" - cmake \ - -DCMAKE_BUILD_TYPE="$buildType" \ - -DPROC_TARGET_NUMBER="$procTarget" \ - -DCMAKE_C_FLAGS="-pipe" \ - -DCMAKE_CXX_FLAGS="$CMAKE_C_FLAGS $Wcflags" \ - "$noomp" \ - -DCMAKE_INSTALL_PREFIX="build" \ - -DBUILD_BUNDLE="ON" \ - -DBINDIR="." \ - -DDATADIR="." \ - -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" \ - -DVERSION_SUFFIX="$titleSuffix" \ - ../ \ - || { echo "Error during cmake, exiting."; exit 1; } - fi - fi - echo - - if (( rev >= 1930 )); then - cd "${repo}/build" || exit 1 - fi - - printf "%s\n" "" "Starting compilation:" - time { make -j${cpuCount} install; } || { printf "%s\n" "" "Error during make, exiting."; exit 1; } - printf "%-15b %b\n" "" "" "RawTherapee compiled:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" "\tCache:" "${HOME}/.cache/RawTherapee${dCacheNameSuffix}" "\tConfig:" "${HOME}/.config/RawTherapee${dCacheNameSuffix}" "" "" - - # RT used to build into various places over the years. - # We want to end up with the build in a folder called "/build/rawtherapee" regardless of which old version you compile, and then to zip it, so we move dirs around: - if (( rev < 1930 )); then - if [[ -d "${repo}/${buildType}" ]]; then - printf "%s\n" "Moving \"${repo}/${buildType}\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/${buildType}" "${repo}/build/rawtherapee" - elif [[ -d "${repo}/rawtherapee" ]]; then - printf "%s\n" "Moving \"${repo}/rawtherapee\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/rawtherapee" "${repo}/build/rawtherapee" - elif [[ ! -d "${repo}/build" ]]; then - { printf "%s\n" "Could not find the \"build\" directory containing the compiled RawTherapee in ${repo}" "Please notify DrSlony in the forum:" "http://rawtherapee.com/forum/viewtopic.php?f=10&t=3001#p22213" "" "Exiting"; exit 1; } - fi - elif [[ -d "${repo}/build/${buildType}" ]]; then - printf "%s\n" "Moving \"${repo}/build/${buildType}\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/build/${buildType}" "${repo}/build/rawtherapee" - fi - - echo - cd "${repo}/build" - # ${repo}/build/AboutThisBuild.txt doesn't exist with older versions - # Put "AboutThisBuild.txt" alongside the "rawtherapee" dir for the zip so that the website can extract the needed info when uploading the build (no other reason) - if [[ ! -e AboutThisBuild.txt ]]; then - cp "rawtherapee/AboutThisBuild.txt" AboutThisBuild.txt || { printf "%s\n" "Could not copy ${repo}/build/rawtherapee/AboutThisBuild.txt to ${repo}/build/AboutThisBuild.txt, exiting."; exit 1; } - fi - - cat AboutThisBuild.txt || { printf "%s\n" "${repo}/build/AboutThisBuild.txt not found, exiting."; exit 1; } - - if [[ -z $patched ]]; then - printf "%s\n" "Zipping the compiled RawTherapee dir \"${repo}/build/rawtherapee\" and putting it in \"/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip\"" - [[ -e "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" ]] && { rm "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" || exit 1; } - zip -Xrq "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" AboutThisBuild.txt rawtherapee - fi - - # Now that the zip is ready, the build can be moved to ~/rt__<_patched> - printf "%s\n" "" "Moving \"${repo}/build/rawtherapee\" to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\"" - mv "${repo}/build/rawtherapee" "${HOME}/rt_${branch}_${buildType}${movetoPatched}" || { printf "%s\n" "" "Could not move \"${repo}/build/rawtherapee\" to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\", exiting."; exit 1; } - - printf "%-15b %b\n" "" "" "Build ready:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" - printf "%b\n" "" "\E[1mTo run RawTherapee\E[0m, fire up a terminal and type:" "~/rt_${branch}_${buildType}${movetoPatched}/rawtherapee" "" "------------------------------------------" - alert "RawTherapee-${verLatesttag}.${verLatesttagdistance} ready.\nChoice number ${choiceNumber}, branch: ${branch}, type: ${buildType}, target: ${procTarget}" -done - -# builds=( /tmp/RawTherapee* ); for f in ${builds[@]}; do echo ${f#/tmp/}; done -if [[ -z $patched ]]; then - printf "%s\n" "RawTherapee zipped builds ready in /tmp" - ls -lh /tmp/RawTherapee* -fi -printf "%s\n" "" "Finished building all chosen versions of RawTherapee" From 81d9db35aa682d415aa3d1258f1f422ff08199e7 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 25 Dec 2017 22:50:22 +0100 Subject: [PATCH 060/200] Added new tools/build-rawtherapee Bash script --- tools/build-rawtherapee | 132 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100755 tools/build-rawtherapee diff --git a/tools/build-rawtherapee b/tools/build-rawtherapee new file mode 100755 index 000000000..8c86ed54d --- /dev/null +++ b/tools/build-rawtherapee @@ -0,0 +1,132 @@ +#!/usr/bin/env bash +# By Morgan Hardwood +# Version 2017-12-25 +# This script gets the latest source code for the given program and compiles it. + +# The name of the program, used for the folder names: +prog="rawtherapee" + +# The name of the compiled executable: +exe="${prog}" + +# The name of the sub-folder, if any, relative to the folder into which the +# compiled executable is placed. +# e.g. If the executable ends up in: +# ~/programs/someProgram/foo/bar/someExecutable +# then set it to: +# exeRelativePath="foo/bar" +# or if the executable ends up in +# ~/programs/someProgram/someExecutable +# then leave it empty: +# exeRelativePath="" +exeRelativePath="" + +# The path to the repository: +repo="git@github.com:Beep6581/RawTherapee.git" + +# No touching below this line, with the exception of the "Compile" section +# ----------------------------------------------------------------------------- + +buildOnly="false" +buildType="release" + +# Removes the trailing forward-slash if one is present +exeRelativePath="${exeRelativePath/%\/}" +# Append forward-slash to exeRelativePath only if it is not empty. +exePath="${exeRelativePath:+${exeRelativePath}/}${exe}" + +printf '%s\n' "" "Program name: ${prog}" "Build type: ${buildType}" "Build without updating: ${buildOnly}" "" + +# Command-line arguments +OPTIND=1 +while getopts "bdh?-" opt; do + case "${opt}" in + b) buildOnly="true" + ;; + d) buildType="debug" + ;; + h|\?|-) printf '%s\n' "This script gets the latest source code for ${prog} and compiles it." \ + "" \ + " -b" \ + " Optional. If specified, the script only compiles the source, it does not try to update the source. If not specified, the source will be updated first." \ + " -d" \ + " Optional. Compile a \"debug\" build. If not specified, a \"release\" build will be made." \ + "" + exit 0 + ;; + esac +done +shift $((OPTIND-1)) +[ "$1" = "--" ] && shift + +# Clone if needed +cloned="false" +updates="false" +if [[ ! -d "$HOME/programs/code-${prog}" ]]; then + mkdir -p "$HOME/programs" || exit 1 + git clone "$repo" "$HOME/programs/code-${prog}" || exit 1 + pushd "$HOME/programs/code-${prog}" || exit 1 + cloned="true" +else + pushd "$HOME/programs/code-${prog}" || exit 1 + git fetch + if [[ $(git rev-parse HEAD) != $(git rev-parse '@{u}') ]]; then + updates="true" + fi +fi + +# Pull updates if necessary +if [[ "$updates" = "true" && "$buildOnly" = "false" ]]; then + git pull || exit 1 +fi + +existsExe="false" +if [[ -e "$HOME/programs/${prog}/${exePath}" ]]; then + existsExe="true" +fi + +# Quit if no updates and build-only flag not set +if [[ "$cloned" = "false" && "$buildOnly" = "false" && "$updates" = "false" && "$existsExe" = "true" ]]; then + printf '%s\n' "No updates, nothing to do." + exit 0 +fi + +# Determine CPU count +cpuCount="fail" +if command -v nproc >/dev/null 2>&1; then + cpuCount="$(nproc --all)" +fi +if [[ ! ( $cpuCount -ge 1 && $cpuCount -le 64 ) ]]; then + cpuCount=1 +fi + +# Prepare folders +rm -rf "$HOME/programs/${prog}" "$HOME/programs/code-${prog}/build" +mkdir -p "$HOME/programs/${prog}" "$HOME/programs/code-${prog}/build" || exit 1 +cd "$HOME/programs/code-${prog}/build" || exit 1 + +# ----------------------------------------------------------------------------- +# Compile + +# See: +# http://rawpedia.rawtherapee.com/Linux#Compile_RawTherapee + +cmake \ + -DCMAKE_BUILD_TYPE="$buildType" \ + -DCACHE_NAME_SUFFIX="5-dev" \ + -DPROC_TARGET_NUMBER="2" \ + -DBUILD_BUNDLE="ON" \ + -DBUNDLE_BASE_INSTALL_DIR="$HOME/programs/${prog}" \ + -DOPTION_OMP="ON" \ + -DWITH_LTO="OFF" \ + -DWITH_PROF="OFF" \ + -DWITH_SAN="OFF" \ + -DWITH_SYSTEM_KLT="OFF" \ + "$HOME/programs/code-${prog}" || exit 1 + +make --jobs="$cpuCount" install || exit 1 + +# Finished +printf '%s\n' "" "To run ${prog} type:" "~/programs/${prog}/${exePath}" "" + +popd 1>/dev/null From 88ebaf618a223f3bb5ccddf15bbb252a26851046 Mon Sep 17 00:00:00 2001 From: gatoatigrado Date: Mon, 25 Dec 2017 18:13:05 -0500 Subject: [PATCH 061/200] Code review changes --- rtengine/LUT.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 4f245634e..9a700bc17 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -95,7 +95,8 @@ protected: // list of variables ordered to improve cache speed unsigned int maxs; float maxsf; - // possibly-more-correct value for sse routine (see unit test for details) + // For the SSE routine operator[](vfloat), we just clip float lookup values + // to just below the max value. float maxIndexFloat; T * data; unsigned int clip; @@ -125,7 +126,10 @@ public: #endif dirty = true; clip = flags; - data = new T[s]; + // Add a few extra elements so [](vfloat) won't access out-of-bounds memory. + // The routine would still produce the right answer, but might cause issues + // with address/heap checking programs. + data = new T[s + 3]; owner = 1; size = s; upperBound = size - 1; @@ -155,7 +159,8 @@ public: dirty = true; // Assumption! clip = flags; - data = new T[s]; + // See comment in constructor. + data = new T[s + 3]; owner = 1; size = s; upperBound = size - 1; @@ -222,7 +227,8 @@ public: } if (this->data == nullptr) { - this->data = new T[rhs.size]; + // See comment in constructor. + this->data = new T[rhs.size + 3]; } this->clip = rhs.clip; @@ -327,7 +333,7 @@ public: vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); vfloat diff = clampedIndexes - _mm_cvtepi32_ps(indexes); - return (_mm_set1_ps(1.0f) - diff) * lower + (diff * upper); + return vintpf(diff, upper, lower); } #ifdef __SSE4_1__ template::value>::type> @@ -426,9 +432,7 @@ public: } idx = 0; - // Note: Maybe this should be 'idx > maxsf'? See unit test where a LUT with - // values [10, 11, 12, 13] gets looked up at 2.5 and returns 12.5. - } else if (index > maxsf) { + } else if (idx > maxs) { if (clip & LUT_CLIP_ABOVE) { return data[upperBound]; } From 59e31ed36f179dbb3faff72181e920d892c8f513 Mon Sep 17 00:00:00 2001 From: gatoatigrado Date: Mon, 25 Dec 2017 22:46:05 -0500 Subject: [PATCH 062/200] Code review changes --- rtengine/LUT.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 9a700bc17..b58144a6f 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -310,9 +310,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = _mm_max_ps( - _mm_setzero_ps(), - _mm_min_ps(_mm_set1_ps(maxIndexFloat), indexv)); + vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxIndexFloat), indexv)); vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); From 6dab5742dd6541b5def11589e826c598791e2d14 Mon Sep 17 00:00:00 2001 From: gatoatigrado Date: Mon, 25 Dec 2017 22:50:40 -0500 Subject: [PATCH 063/200] Add comment and assertions --- rtengine/LUT.h | 7 +++++++ rtengine/curves.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index b58144a6f..29147df8b 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -200,6 +200,10 @@ public: clip = flags; } + int getClip() const { + return clip; + } + /** @brief Get the number of element in the LUT (i.e. dimension of the array) * For a LUT(500), it will return 500 * @return number of element in the array @@ -304,6 +308,9 @@ public: } #if defined( __SSE2__ ) && defined( __x86_64__ ) + + // NOTE: This version requires LUTs which clip at upper and lower bounds + // (which is the default). vfloat operator[](vfloat indexv) const { static_assert(std::is_same::value, "This method only works for float LUTs"); diff --git a/rtengine/curves.h b/rtengine/curves.h index 15ab96624..e8b65c33d 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -886,6 +886,8 @@ inline void StandardToneCurve::BatchApply( const size_t start, const size_t end, float *r, float *g, float *b) const { assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); // All pointers must have the same alignment for SSE usage. In the loop body below, // we will only check `r`, assuming that the same result would hold for `g` and `b`. From a31f52213db23fcfde648a3b82dfa176a14c8405 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 26 Dec 2017 12:25:10 +0100 Subject: [PATCH 064/200] Fix warning (Wsign-compare) --- rtengine/LUT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 29147df8b..6a617f40b 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -93,7 +93,7 @@ class LUT : { protected: // list of variables ordered to improve cache speed - unsigned int maxs; + int maxs; float maxsf; // For the SSE routine operator[](vfloat), we just clip float lookup values // to just below the max value. From 524b0056dcead2b69d2861cdf8e9e0ef8c5f362f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 27 Dec 2017 00:01:09 +0100 Subject: [PATCH 065/200] Speedup for rgbPrco() --- rtengine/LUT.h | 31 ++++++++++++++++++++++ rtengine/improcfun.cc | 60 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 6a617f40b..48c85726d 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -340,6 +340,37 @@ public: vfloat diff = clampedIndexes - _mm_cvtepi32_ps(indexes); return vintpf(diff, upper, lower); } + + // NOTE: This version requires LUTs which do not clip at upper and lower bounds + vfloat operator()(vfloat indexv) const + { + static_assert(std::is_same::value, "This method only works for float LUTs"); + + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxsf), indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); + + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } + + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + + vfloat diff = indexv - _mm_cvtepi32_ps(indexes); + return vintpf(diff, upper, lower); + } #ifdef __SSE4_1__ template::value>::type> vfloat operator[](vint idxv ) const diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 082799e62..8300a24e7 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3540,7 +3540,27 @@ 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++) { + vfloat cr = F2V(0.299f); + vfloat cg = F2V(0.587f); + vfloat cb = F2V(0.114f); + int j = jstart; + int tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + + vfloat rv = LVF(rtemp[ti * TS + tj]); + vfloat gv = LVF(gtemp[ti * TS + tj]); + vfloat bv = LVF(btemp[ti * TS + tj]); + + //shadow tone curve + vfloat Yv = cr * rv + cg * gv + cb * bv; + vfloat tonefactorv = shtonecurve(Yv); + STVF(rtemp[ti * TS + tj], rv * tonefactorv); + STVF(gtemp[ti * TS + tj], gv * tonefactorv); + STVF(btemp[ti * TS + tj], bv * tonefactorv); + } +#endif + for (; j < tW; j++, tj++) { float r = rtemp[ti * TS + tj]; float g = gtemp[ti * TS + tj]; @@ -3588,19 +3608,35 @@ 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++) { + if (histToneCurveThr) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { - //brightness/contrast - rtemp[ti * TS + tj] = tonecurve[ rtemp[ti * TS + tj] ]; - gtemp[ti * TS + tj] = tonecurve[ gtemp[ti * TS + tj] ]; - btemp[ti * TS + tj] = tonecurve[ btemp[ti * TS + tj] ]; + //brightness/contrast + rtemp[ti * TS + tj] = tonecurve[ rtemp[ti * TS + tj] ]; + gtemp[ti * TS + tj] = tonecurve[ gtemp[ti * TS + tj] ]; + btemp[ti * TS + tj] = tonecurve[ btemp[ti * TS + tj] ]; - if (histToneCurveThr) { int y = CLIP (lumimulf[0] * Color::gamma2curve[rtemp[ti * TS + tj]] + lumimulf[1] * Color::gamma2curve[gtemp[ti * TS + tj]] + lumimulf[2] * Color::gamma2curve[btemp[ti * TS + tj]]); histToneCurveThr[y >> histToneCurveCompression]++; } } + } else { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; + for (; j < tW - 3; j+=4, tj+=4) { + //brightness/contrast + STVF(rtemp[ti * TS + tj], tonecurve(LVF(rtemp[ti * TS + tj]))); + STVF(gtemp[ti * TS + tj], tonecurve(LVF(gtemp[ti * TS + tj]))); + STVF(btemp[ti * TS + tj], tonecurve(LVF(btemp[ti * TS + tj]))); + } + for (; j < tW; j++, tj++) { + //brightness/contrast + rtemp[ti * TS + tj] = tonecurve[rtemp[ti * TS + tj]]; + gtemp[ti * TS + tj] = tonecurve[gtemp[ti * TS + tj]]; + btemp[ti * TS + tj] = tonecurve[btemp[ti * TS + tj]]; + } + } } if (editID == EUID_ToneCurve1) { // filling the pipette buffer @@ -3687,10 +3723,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasToneCurve2) { if (curveMode2 == ToneCurveParams::TcMode::STD) { // Standard for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } + const StandardToneCurve& userToneCurve = static_cast (customToneCurve2); + userToneCurve.BatchApply ( + 0, tW - jstart, + &rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS]); } } else if (curveMode2 == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like for (int i = istart, ti = 0; i < tH; i++, ti++) { From 0e9aab579ef7bbfc684a87ecfc858c9e461bc119 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 27 Dec 2017 22:55:00 +0100 Subject: [PATCH 066/200] Extract embedded ICC profile from PNG images Fixes #4260 --- rtengine/imageio.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ff9c9b559..2078cc623 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -308,6 +308,11 @@ int ImageIO::loadPNG (Glib::ustring fname) return IMIO_HEADERERROR; } + // silence the warning about "invalid" sRGB profiles -- see #4260 +#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) + png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); +#endif + png_infop info = png_create_info_struct (png); png_infop end_info = png_create_info_struct (png); @@ -356,6 +361,22 @@ int ImageIO::loadPNG (Glib::ustring fname) png_set_strip_alpha(png); } + // reading the embedded ICC profile if any + if (png_get_valid(png, info, PNG_INFO_iCCP)) { + png_charp name; + int compression_type; +#if PNG_LIBPNG_VER_MAJOR > 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR > 4) + png_bytep profdata; +#else + png_charp profdata; +#endif + png_uint_32 proflen; + png_get_iCCP(png, info, &name, &compression_type, &profdata, &proflen); + embProfile = cmsOpenProfileFromMem(profdata, proflen); + loadedProfileData = new char[proflen]; + memcpy(loadedProfileData, profdata, proflen); + } + //setting gamma double gamma; From 527f41c2541414cf443bd3460065111224769356 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 28 Dec 2017 22:25:04 +0100 Subject: [PATCH 067/200] embed the output profile when writing PNG files Fixes #4262 --- rtengine/imageio.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 2078cc623..ac2c359ca 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -365,10 +365,10 @@ int ImageIO::loadPNG (Glib::ustring fname) if (png_get_valid(png, info, PNG_INFO_iCCP)) { png_charp name; int compression_type; -#if PNG_LIBPNG_VER_MAJOR > 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR > 4) - png_bytep profdata; -#else +#if PNG_LIBPNG_VER < 10500 png_charp profdata; +#else + png_bytep profdata; #endif png_uint_32 proflen; png_get_iCCP(png, info, &name, &compression_type, &profdata, &proflen); @@ -950,6 +950,11 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) return IMIO_HEADERERROR; } + // silence the warning about "invalid" sRGB profiles -- see #4260 +#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) + png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); +#endif + png_infop info = png_create_info_struct(png); if (!info) { @@ -980,6 +985,15 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) png_set_IHDR(png, info, width, height, bps, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); + if (profileData) { +#if PNG_LIBPNG_VER < 10500 + png_charp profdata = reinterpret_cast(profileData); +#else + png_bytep profdata = reinterpret_cast(profileData); +#endif + png_set_iCCP(png, info, const_cast("icc"), 0, profdata, profileLength); + } + int rowlen = width * 3 * bps / 8; unsigned char *row = new unsigned char [rowlen]; From 7dea8a3ea85f5e526e17566a53a250148cf45ba6 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 28 Dec 2017 22:26:22 +0100 Subject: [PATCH 068/200] added support for writing metadata in PNG files Fixes #3352 --- rtengine/imageio.cc | 94 +++++++++++++++++++++++++++++++++++++++++++++ rtexif/rtexif.cc | 77 +++++++++++++++++++++++++++++++++++++ rtexif/rtexif.h | 1 + 3 files changed, 172 insertions(+) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ac2c359ca..a8fe9d0da 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -926,6 +926,77 @@ int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool s return IMIO_SUCCESS; } + +namespace { + +// Taken from Darktable -- src/imageio/format/png.c +// +/* Write EXIF data to PNG file. + * Code copied from DigiKam's libs/dimg/loaders/pngloader.cpp. + * The EXIF embedding is defined by ImageMagicK. + * It is documented in the ExifTool page: + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PNG.html + * + * ..and in turn copied from ufraw. thanks to udi and colleagues + * for making useful code much more readable and discoverable ;) + */ + +void PNGwriteRawProfile(png_struct *ping, png_info *ping_info, const char *profile_type, guint8 *profile_data, png_uint_32 length) +{ + png_textp text; + long i; + guint8 *sp; + png_charp dp; + png_uint_32 allocated_length, description_length; + + const guint8 hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + text = static_cast(png_malloc(ping, sizeof(png_text))); + description_length = strlen(profile_type); + allocated_length = length * 2 + (length >> 5) + 20 + description_length; + + text[0].text = static_cast(png_malloc(ping, allocated_length)); + text[0].key = static_cast(png_malloc(ping, 80)); + text[0].key[0] = '\0'; + + g_strlcat(text[0].key, "Raw profile type ", 80); + g_strlcat(text[0].key, profile_type, 80); + + sp = profile_data; + dp = text[0].text; + *dp++ = '\n'; + + g_strlcpy(dp, profile_type, allocated_length); + + dp += description_length; + *dp++ = '\n'; + *dp = '\0'; + + g_snprintf(dp, allocated_length - strlen(text[0].text), "%8lu ", static_cast(length)); + + dp += 8; + + for(i = 0; i < long(length); i++) + { + if(i % 36 == 0) *dp++ = '\n'; + + *(dp++) = hex[((*sp >> 4) & 0x0f)]; + *(dp++) = hex[((*sp++) & 0x0f)]; + } + + *dp++ = '\n'; + *dp = '\0'; + text[0].text_length = (dp - text[0].text); + text[0].compression = -1; + + if(text[0].text_length <= allocated_length) png_set_text(ping, ping_info, text, 1); + + png_free(ping, text[0].text); + png_free(ping, text[0].key); + png_free(ping, text); +} + +} // namespace + int ImageIO::savePNG (Glib::ustring fname, volatile int bps) { if (getWidth() < 1 || getHeight() < 1) { @@ -994,6 +1065,29 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) png_set_iCCP(png, info, const_cast("icc"), 0, profdata, profileLength); } + { + // buffer for the exif and iptc + 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 = nullptr; + } + + int size = rtexif::ExifManager::createPNGMarker(exifRoot, exifChange, width, height, bps, (char*)iptcdata, iptclen, buffer, bufferSize); + + if (iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + } + if (buffer && size) { + PNGwriteRawProfile(png, info, "exif", buffer, size); + delete[] buffer; + } + } + int rowlen = width * 3 * bps / 8; unsigned char *row = new unsigned char [rowlen]; diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index a5d10f762..affd530b5 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -3312,6 +3312,83 @@ int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::pro return endOffs; } + +int ExifManager::createPNGMarker(const TagDirectory* root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize) +{ +// write tiff header + int offs = 0; + ByteOrder order = HOSTORDER; + + if (root) { + order = root->getOrder (); + } + + TagDirectory* cl; + + if (root) { + cl = (const_cast (root))->clone (nullptr); + // 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 (nullptr, ifdAttribs, HOSTORDER); + } + + if (iptcdata) { + Tag* iptc = new Tag (cl, lookupAttrib (ifdAttribs, "IPTCData")); + iptc->initLongArray (iptcdata, iptclen); + cl->replaceTag (iptc); + } + +// apply list of changes + for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); ++i) { + cl->applyChange (i->first, i->second); + } + + // append default properties + const std::vector defTags = getDefaultTIFFTags (cl); + + defTags[0]->setInt (W, 0, LONG); + defTags[1]->setInt (H, 0, LONG); + defTags[8]->initInt (0, SHORT, 3); + + for (int i = 0; i < 3; i++) { + defTags[8]->setInt (bps, i * 2, SHORT); + } + + for (int i = defTags.size() - 1; i >= 0; i--) { + Tag* defTag = defTags[i]; + cl->replaceTag (defTag->clone (cl)); + delete defTag; + } + + 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); + + int endOffs = cl->write (8, buffer); + +// cl->printAll(); + delete cl; + + return endOffs; +} + + //----------------------------------------------------------------------------- // global functions to read byteorder dependent data //----------------------------------------------------------------------------- diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 125d38c94..937945aac 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -361,6 +361,7 @@ public: 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, unsigned &bufferSize); + static int createPNGMarker(const TagDirectory *root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char *iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); }; class Interpreter From 5ecb05ba23180ac4b492914415ad96d654b77c03 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 29 Dec 2017 17:08:15 +0100 Subject: [PATCH 069/200] "Custom command line" label. Changed "Other command line" to "Custom command line". --- rtdata/languages/Catala | 1 - rtdata/languages/Chinese (Simplified) | 1 - rtdata/languages/Chinese (Traditional) | 1 - rtdata/languages/Czech | 1 - rtdata/languages/Dansk | 1 - rtdata/languages/Deutsch | 1 - rtdata/languages/English (UK) | 1 - rtdata/languages/English (US) | 1 - rtdata/languages/Espanol | 1 - rtdata/languages/Euskara | 1 - rtdata/languages/Francais | 1 - rtdata/languages/Greek | 1 - rtdata/languages/Hebrew | 1 - rtdata/languages/Italiano | 1 - rtdata/languages/Japanese | 1 - rtdata/languages/Latvian | 1 - rtdata/languages/Magyar | 1 - rtdata/languages/Nederlands | 1 - rtdata/languages/Norsk BM | 1 - rtdata/languages/Polish | 1 - rtdata/languages/Polish (Latin Characters) | 1 - rtdata/languages/Portugues (Brasil) | 1 - rtdata/languages/Russian | 1 - rtdata/languages/Serbian (Cyrilic Characters) | 1 - rtdata/languages/Serbian (Latin Characters) | 1 - rtdata/languages/Slovak | 1 - rtdata/languages/Suomi | 1 - rtdata/languages/Swedish | 1 - rtdata/languages/Turkish | 1 - rtdata/languages/default | 2 +- 30 files changed, 1 insertion(+), 30 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 7cda54ed5..7768e4037 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -523,7 +523,6 @@ PREFERENCES_DIRLAST;Últim directori usat PREFERENCES_DIROTHER;Un altre PREFERENCES_DIRSELECTDLG;Selecc. directori d'inici... PREFERENCES_DIRSOFTWARE;Instal·lació al directori -PREFERENCES_EDITORCMDLINE;Una altra línia de comandament PREFERENCES_EDITORLAYOUT;Sortida d'editor PREFERENCES_EXTERNALEDITOR;Editor extern PREFERENCES_FBROWSEROPTS;Opcions de navegador i minifotos diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index de1114832..611ead7f8 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -550,7 +550,6 @@ PREFERENCES_DIRLAST;上次访问路径 PREFERENCES_DIROTHER;其他 PREFERENCES_DIRSELECTDLG;启动时选择图片路径... PREFERENCES_DIRSOFTWARE;软件安装路径 -PREFERENCES_EDITORCMDLINE;其他命令行 PREFERENCES_EDITORLAYOUT;编辑器布局 PREFERENCES_EXPAUT;进阶 PREFERENCES_EXTERNALEDITOR;外部编辑器 diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 49f17182b..f539c8dff 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -258,7 +258,6 @@ PREFERENCES_DIRLAST;上次訪問路徑 PREFERENCES_DIROTHER;其他 PREFERENCES_DIRSELECTDLG;啟動時選擇圖片路徑... PREFERENCES_DIRSOFTWARE;軟體安裝路徑 -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;檔流覽選項 PREFERENCES_FILEFORMAT;檔格式 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index d881bfb1b..b248ddb21 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1036,7 +1036,6 @@ PREFERENCES_DIRLAST;Poslední navštívená složka PREFERENCES_DIROTHER;Jiná PREFERENCES_DIRSELECTDLG;Zvolte složku s obrázky při spuštění... PREFERENCES_DIRSOFTWARE;Instalační složka -PREFERENCES_EDITORCMDLINE;Jiný příkaz PREFERENCES_EDITORLAYOUT;Rozvržení editoru PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externí editor diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index d99c199bf..50c6496a6 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Sidst anvendte mappe PREFERENCES_DIROTHER;Andet PREFERENCES_DIRSELECTDLG;Vælg startmappe... PREFERENCES_DIRSOFTWARE;Installationsmappe -PREFERENCES_EDITORCMDLINE;Anden kommandostreng PREFERENCES_EXTERNALEDITOR;Eksternt redigeringsprogram PREFERENCES_FBROWSEROPTS;Indstllinger til filbrowser PREFERENCES_FILEFORMAT;Filformat diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 7b5921af3..d6d729093 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -1052,7 +1052,6 @@ PREFERENCES_DIRLAST;Zuletzt geöffnetes Verzeichnis PREFERENCES_DIROTHER;Anderes PREFERENCES_DIRSELECTDLG;Wähle das Bild-Verzeichnis beim Programmstart... PREFERENCES_DIRSOFTWARE;Installationsverzeichnis -PREFERENCES_EDITORCMDLINE;Befehlszeile PREFERENCES_EDITORLAYOUT;Editor-Layout PREFERENCES_EXPAUT;Experte PREFERENCES_EXTERNALEDITOR;Externer Editor diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index be202ff6f..abae3e387 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -1076,7 +1076,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_EDITORCMDLINE;Other command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 2df260dc4..bc6c596c4 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -1006,7 +1006,6 @@ !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_EDITORCMDLINE;Other command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 9fd8eb807..2cc758f06 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -770,7 +770,6 @@ PREFERENCES_DIRLAST;Última carpeta visitada PREFERENCES_DIROTHER;Otro PREFERENCES_DIRSELECTDLG;Seleccionar carpeta de imágenes en el arranque... PREFERENCES_DIRSOFTWARE;Carpeta de instalación -PREFERENCES_EDITORCMDLINE;Otra línea de comando PREFERENCES_EDITORLAYOUT;Disposición del editor PREFERENCES_EXTERNALEDITOR;Editor externo PREFERENCES_FBROWSEROPTS;Opciones del explorador de archivos/Miniaturas diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 88ee5cdac..712bde72f 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Azkena ikusitako karpeta PREFERENCES_DIROTHER;Besterik PREFERENCES_DIRSELECTDLG;Abioko irudien karpeta hautatu... PREFERENCES_DIRSOFTWARE;Inatalazio karpeta -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Arakatzailearen aukerak PREFERENCES_FILEFORMAT;Artxiboen formatua diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index ed1e376b3..1bc815fbf 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -994,7 +994,6 @@ PREFERENCES_DIRLAST;Dernier dossier visité PREFERENCES_DIROTHER;Autre PREFERENCES_DIRSELECTDLG;Choix du dossier Image au lancement... PREFERENCES_DIRSOFTWARE;Dossier d'installation -PREFERENCES_EDITORCMDLINE;Autre ligne de commande PREFERENCES_EDITORLAYOUT;Disposition de l'éditeur PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Éditeur externe diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 10e4048c9..cc22986c2 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Τελευταία τοποθεσία που χρησιμο PREFERENCES_DIROTHER;Άλλο PREFERENCES_DIRSELECTDLG;Επιλέξτε τοποθεσία εικόνων κατά την έναρξη... PREFERENCES_DIRSOFTWARE;Τοποθεσία εγκατάστασης -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Επιλογές περιήγησης αρχείων PREFERENCES_FILEFORMAT;Είδος αρχείου diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 2bb49fc11..bc5c94899 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;תיקיה האחרונה שביקרתי בה PREFERENCES_DIROTHER;אחר PREFERENCES_DIRSELECTDLG;בחר תיקיית צילומים לאתחול PREFERENCES_DIRSOFTWARE;תיקיית התקנה -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;ברירות דפדפן PREFERENCES_FILEFORMAT;תצורת קובץ diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 964d891c1..3b577f9a8 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -672,7 +672,6 @@ PREFERENCES_DIRLAST;Ultima cartella visitata PREFERENCES_DIROTHER;Altra PREFERENCES_DIRSELECTDLG;Seleziona la cartella delle immagini all'avvio... PREFERENCES_DIRSOFTWARE;Cartella d'installazione -PREFERENCES_EDITORCMDLINE;Altra linea di comando PREFERENCES_EDITORLAYOUT;Disposizione PREFERENCES_EXTERNALEDITOR;Programma di ritocco esterni PREFERENCES_FBROWSEROPTS;Opzioni del Navigatore e delle miniature diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 4ad937da8..4b60f4985 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -894,7 +894,6 @@ PREFERENCES_DIRLAST;最近参照したディレクトリ PREFERENCES_DIROTHER;他 PREFERENCES_DIRSELECTDLG;起動時の画像ディレクトリ選択... PREFERENCES_DIRSOFTWARE;インストール・ディレクトリ -PREFERENCES_EDITORCMDLINE;その他・コマンド入力 PREFERENCES_EDITORLAYOUT;編集 レイアウト PREFERENCES_EXPAUT;高度 PREFERENCES_EXTERNALEDITOR;外部エディタ diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 7a4a265fd..e77e90377 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Pēdējā lietotā mape PREFERENCES_DIROTHER;Cita PREFERENCES_DIRSELECTDLG;Izvēlies attēlu mapi sākumam... PREFERENCES_DIRSOFTWARE;Uzstādīšanas mape -PREFERENCES_EDITORCMDLINE;Cita komandrinda PREFERENCES_EXTERNALEDITOR;Ārējais redaktors PREFERENCES_FBROWSEROPTS;Failu pārlūka iespējas PREFERENCES_FILEFORMAT;Faila formāts diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index f06a57067..82060a2ca 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -504,7 +504,6 @@ PREFERENCES_DIRLAST;Utoljára látogatott könyvtár PREFERENCES_DIROTHER;Más PREFERENCES_DIRSELECTDLG;Képek könyvtára induláskor... PREFERENCES_DIRSOFTWARE;Telepítés helye -PREFERENCES_EDITORCMDLINE;Egyéb parancssor PREFERENCES_EDITORLAYOUT;Szerkesztési mód PREFERENCES_EXTERNALEDITOR;Külső képszerkesztő program PREFERENCES_FBROWSEROPTS;Állományböngésző beállításai diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 4679183a4..cb7c85eb6 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -979,7 +979,6 @@ PREFERENCES_DIRLAST;Laatst bezochte map PREFERENCES_DIROTHER;Anders PREFERENCES_DIRSELECTDLG;Selecteer standaardmap bij opstarten... PREFERENCES_DIRSOFTWARE;Installatiemap -PREFERENCES_EDITORCMDLINE;Andere editor, geef pad PREFERENCES_EDITORLAYOUT;Bewerkingsvenster PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externe editor diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 30dc287cc..2106de2da 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Sidste besøkte mappe PREFERENCES_DIROTHER;Annen PREFERENCES_DIRSELECTDLG;Velg bildemappe ved oppstart... PREFERENCES_DIRSOFTWARE;Installasjons-mappe -PREFERENCES_EDITORCMDLINE;Annen kommandolinje PREFERENCES_EXTERNALEDITOR;Ekstern editor PREFERENCES_FBROWSEROPTS;Filfremviser-innstillinger PREFERENCES_FILEFORMAT;Filformat diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 1ff05df61..e6aa12154 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -725,7 +725,6 @@ PREFERENCES_DIRLAST;Ostatnio odwiedzony katalog PREFERENCES_DIROTHER;Inny PREFERENCES_DIRSELECTDLG;Wybierz katalog z obrazami po uruchomieniu... PREFERENCES_DIRSOFTWARE;Katalog instalacyjny -PREFERENCES_EDITORCMDLINE;Inna linia poleceń PREFERENCES_EDITORLAYOUT;Układ edytora PREFERENCES_EXTERNALEDITOR;Zewnętrzny edytor PREFERENCES_FBROWSEROPTS;Opcje przeglądarki plików diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 1f461f887..89d222f1e 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -725,7 +725,6 @@ PREFERENCES_DIRLAST;Ostatnio odwiedzony katalog PREFERENCES_DIROTHER;Inny PREFERENCES_DIRSELECTDLG;Wybierz katalog z obrazami po uruchomieniu... PREFERENCES_DIRSOFTWARE;Katalog instalacyjny -PREFERENCES_EDITORCMDLINE;Inna linia polecen PREFERENCES_EDITORLAYOUT;Uklad edytora PREFERENCES_EXTERNALEDITOR;Zewnetrzny edytor PREFERENCES_FBROWSEROPTS;Opcje przegladarki plikow diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 6453da0fe..488cff769 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Último directory visitado PREFERENCES_DIROTHER;Outro PREFERENCES_DIRSELECTDLG;selecionar diretório de imagem na inicialização... PREFERENCES_DIRSOFTWARE;Diretório de instalação -PREFERENCES_EDITORCMDLINE;Outra Linha de Comando PREFERENCES_EXTERNALEDITOR;Editor externo PREFERENCES_FBROWSEROPTS;Opções do navegador de arquivos PREFERENCES_FILEFORMAT;Formato de arquivo diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 4cf168bbd..9b6f8e4d8 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -656,7 +656,6 @@ PREFERENCES_DIRLAST;Последний каталог PREFERENCES_DIROTHER;Другой PREFERENCES_DIRSELECTDLG;Каталог, открываемый при запуске программы PREFERENCES_DIRSOFTWARE;Каталог установки -PREFERENCES_EDITORCMDLINE;Другой (путь к исполняемому файлу) PREFERENCES_EDITORLAYOUT;Тип редактора PREFERENCES_EXTERNALEDITOR;Внешний редактор PREFERENCES_FBROWSEROPTS;Настройки diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index bd65f2a9f..a0745b12d 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -642,7 +642,6 @@ PREFERENCES_DIRLAST;Последњи директоријум PREFERENCES_DIROTHER;Неки други PREFERENCES_DIRSELECTDLG;Бира одређени директоријум са сликама... PREFERENCES_DIRSOFTWARE;Директоријум са инсталацијом -PREFERENCES_EDITORCMDLINE;Произвољна наредба PREFERENCES_EDITORLAYOUT;Размештај програма PREFERENCES_EXTERNALEDITOR;Спољни уређивач PREFERENCES_FBROWSEROPTS;Опције разгледача датотеке diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index bc12eb72d..00d47c71e 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -642,7 +642,6 @@ PREFERENCES_DIRLAST;Poslednji direktorijum PREFERENCES_DIROTHER;Neki drugi PREFERENCES_DIRSELECTDLG;Bira određeni direktorijum sa slikama... PREFERENCES_DIRSOFTWARE;Direktorijum sa instalacijom -PREFERENCES_EDITORCMDLINE;Proizvoljna naredba PREFERENCES_EDITORLAYOUT;Razmeštaj programa PREFERENCES_EXTERNALEDITOR;Spoljni uređivač PREFERENCES_FBROWSEROPTS;Opcije razgledača datoteke diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index f680a30f1..0d388659c 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -293,7 +293,6 @@ PREFERENCES_DIRLAST;Posledný navštívený adresár PREFERENCES_DIROTHER;Iný PREFERENCES_DIRSELECTDLG;Vybrať adresár s obrázkami pri spustení... PREFERENCES_DIRSOFTWARE;Inštalačný adresár -PREFERENCES_EDITORCMDLINE;Iný príkazový riadok PREFERENCES_EDITORLAYOUT;Rozloženie editora PREFERENCES_EXTERNALEDITOR;Externý editor PREFERENCES_FBROWSEROPTS;Voľby prehliadača súborov diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 98cc1abdd..5a96989f8 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Viimeksi käytetty hakemisto PREFERENCES_DIROTHER;Muu PREFERENCES_DIRSELECTDLG;Valitse kuvahakemisto käynnistettäessä... PREFERENCES_DIRSOFTWARE;Asennushakemisto -PREFERENCES_EDITORCMDLINE;Muu komentorivi PREFERENCES_EXTERNALEDITOR;Ulkoinen ohjelma PREFERENCES_FBROWSEROPTS;Näytettävät tiedot PREFERENCES_FILEFORMAT;Tallennuksen asetukset diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index d37357514..a09aff7c4 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -883,7 +883,6 @@ PREFERENCES_DIRLAST;Senaste besökta katalog PREFERENCES_DIROTHER;Annan PREFERENCES_DIRSELECTDLG;Välj bildkatalog vid uppstart... PREFERENCES_DIRSOFTWARE;Installationskatalog -PREFERENCES_EDITORCMDLINE;Annan kommandorad PREFERENCES_EDITORLAYOUT;Layout för redigeringsvyn PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externt bildredigeringsprogram diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index ec2016ed6..8f307e05c 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -249,7 +249,6 @@ PREFERENCES_DIRLAST;Son gidilen dizin PREFERENCES_DIROTHER;Diğer PREFERENCES_DIRSELECTDLG;Başlangıç görüntü dizinini seç... PREFERENCES_DIRSOFTWARE;Kurulum dizini -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Dosya gezgini seçenekleri PREFERENCES_FILEFORMAT;Dosya biçimi diff --git a/rtdata/languages/default b/rtdata/languages/default index f4361fc5d..b4156e0d4 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1005,7 +1005,7 @@ PREFERENCES_DIRLAST;Last visited directory PREFERENCES_DIROTHER;Other PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... PREFERENCES_DIRSOFTWARE;Installation directory -PREFERENCES_EDITORCMDLINE;Other command line +PREFERENCES_EDITORCMDLINE;Custom command line PREFERENCES_EDITORLAYOUT;Editor Layout PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;External Editor From b589254d2142de3bb0e43be26b542fa670c4aa9b Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 29 Dec 2017 23:03:44 +0100 Subject: [PATCH 070/200] Moved "Copy metadata unchanged" to PP3, and added "strip metadata" mode Fixes #3647 --- rtdata/languages/default | 5 ++ rtengine/procparams.cc | 30 ++++++++++ rtengine/procparams.h | 20 +++++++ rtengine/rtengine.h | 7 +-- rtengine/simpleprocess.cc | 26 ++++---- rtgui/CMakeLists.txt | 1 + rtgui/batchqueue.cc | 2 +- rtgui/editorpanel.cc | 6 +- rtgui/main-cli.cc | 2 +- rtgui/metadatapanel.cc | 121 ++++++++++++++++++++++++++++++++++++++ rtgui/metadatapanel.h | 48 +++++++++++++++ rtgui/options.cc | 6 -- rtgui/options.h | 1 - rtgui/paramsedited.cc | 5 ++ rtgui/paramsedited.h | 8 +++ rtgui/preferences.cc | 12 ---- rtgui/preferences.h | 1 - rtgui/toolpanelcoord.cc | 35 +++-------- rtgui/toolpanelcoord.h | 7 +-- 19 files changed, 270 insertions(+), 73 deletions(-) create mode 100644 rtgui/metadatapanel.cc create mode 100644 rtgui/metadatapanel.h diff --git a/rtdata/languages/default b/rtdata/languages/default index f4361fc5d..1f7f43e07 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -730,6 +730,7 @@ HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata copy mode HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1690,6 +1691,10 @@ TP_LOCALCONTRAST_DARKNESS;Darkness level TP_LOCALCONTRAST_LABEL;Local Contrast TP_LOCALCONTRAST_LIGHTNESS;Lightness level TP_LOCALCONTRAST_RADIUS;Radius +TP_METADATA_MODE;Metadata copy mode +TP_METADATA_TUNNEL;Copy unchanged +TP_METADATA_EDIT;Apply modifications +TP_METADATA_STRIP;Strip all metadata 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 diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 5e8fa63cf..97b54e37f 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2604,6 +2604,23 @@ Glib::ustring RAWParams::getFlatFieldBlurTypeString(FlatFieldBlurType type) return getFlatFieldBlurTypeStrings()[toUnderlying(type)]; } + +MetaDataParams::MetaDataParams(): + mode(MetaDataParams::TUNNEL) +{ +} + +bool MetaDataParams::operator==(const MetaDataParams &other) const +{ + return mode == other.mode; +} + +bool MetaDataParams::operator!=(const MetaDataParams &other) const +{ + return !(*this == other); +} + + ProcParams::ProcParams () { setDefaults (); @@ -2692,6 +2709,7 @@ void ProcParams::setDefaults () raw = RAWParams(); + metadata = MetaDataParams(); exif.clear (); iptc.clear (); @@ -3389,6 +3407,9 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->raw.exPos, "RAW", "PreExposure", raw.expos, keyFile); saveToKeyfile(!pedited || pedited->raw.exPreser, "RAW", "PrePreserv", raw.preser, keyFile); +// MetaData + saveToKeyfile(!pedited || pedited->metadata.mode, "MetaData", "Mode", metadata.mode, keyFile); + // EXIF change list if (!pedited || pedited->exif) { for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); ++i) { @@ -4704,6 +4725,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackBlue", pedited, raw.xtranssensor.blackblue, pedited->raw.xtranssensor.exBlackBlue); } + if (keyFile.has_group("MetaData")) { + int mode = int(MetaDataParams::TUNNEL); + assignFromKeyfile(keyFile, "MetaData", "Mode", pedited, mode, pedited->metadata.mode); + if (mode >= int(MetaDataParams::TUNNEL) && mode <= int(MetaDataParams::STRIP)) { + metadata.mode = static_cast(mode); + } + } + if (keyFile.has_group ("Exif")) { std::vector keys = keyFile.get_keys ("Exif"); @@ -4815,6 +4844,7 @@ bool ProcParams::operator ==(const ProcParams& other) const && filmSimulation == other.filmSimulation && rgbCurves == other.rgbCurves && colorToning == other.colorToning + && metadata == other.metadata && exif == other.exif && iptc == other.iptc; } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index cd47f31a2..58cc2cdfc 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1024,6 +1024,25 @@ struct ColorManagementParams { bool operator !=(const ColorManagementParams& other) const; }; + +/** + * Parameters for metadata handling + */ +struct MetaDataParams { + enum Mode { + TUNNEL, + EDIT, + STRIP + }; + Mode mode; + + MetaDataParams(); + + bool operator ==(const MetaDataParams &other) const; + bool operator !=(const MetaDataParams &other) const; +}; + + /** * Typedef for representing a key/value for the exif metadata information */ @@ -1400,6 +1419,7 @@ public: Glib::ustring appVersion; ///< Version of the application that generated the parameters int ppVersion; ///< Version of the PP file from which the parameters have been read + MetaDataParams metadata; ///< Metadata parameters ExifPairs exif; ///< List of modifications appplied on the exif tags of the input image IPTCPairs iptc; ///< The IPTC tags and values to be saved to the output image diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index f7bdc36cb..8e24b7bb9 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -533,9 +533,8 @@ public: * @param job the ProcessingJob to cancel. * @param errorCode is the error code if an error occured (e.g. the input image could not be loaded etc.) * @param pl is an optional ProgressListener if you want to keep track of the progress - * @param tunnelMetaData tunnels IPTC and XMP to output without change * @return the resulting image, with the output profile applied, exif and iptc data set. You have to save it or you can access the pixel data directly. */ -IImage16* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool tunnelMetaData = false, bool flush = false); +IImage16* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool flush = false); /** This class is used to control the batch processing. The class implementing this interface will be called when the full processing of an * image is ready and the next job to process is needed. */ @@ -555,8 +554,8 @@ public: * The ProcessingJob passed becomes invalid, you can not use it any more. * @param job the ProcessingJob to cancel. * @param bpl is the BatchProcessingListener that is called when the image is ready or the next job is needed. It also acts as a ProgressListener. - * @param tunnelMetaData tunnels IPTC and XMP to output without change */ -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData); + **/ +void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl); extern MyMutex* lcmsMutex; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index c6d10f996..9f79153f7 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -50,11 +50,10 @@ class ImageProcessor { public: ImageProcessor (ProcessingJob* pjob, int& errorCode, - ProgressListener* pl, bool tunnelMetaData, bool flush): + ProgressListener* pl, bool flush): job (static_cast (pjob)), errorCode (errorCode), pl (pl), - tunnelMetaData (tunnelMetaData), flush (flush), // internal state ipf_p (nullptr), @@ -1289,13 +1288,19 @@ private: readyImg = tempImage; } - if (tunnelMetaData) { + switch (params.metadata.mode) { + case MetaDataParams::TUNNEL: // Sending back the whole first root, which won't necessarily be the selected frame number // and may contain subframe depending on initial raw's hierarchy readyImg->setMetadata (ii->getMetaData()->getRootExifData ()); - } else { + break; + case MetaDataParams::EDIT: // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy readyImg->setMetadata (ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); + break; + default: // case MetaDataParams::STRIP + // nothing to do + break; } @@ -1490,7 +1495,6 @@ private: ProcessingJobImpl* job; int& errorCode; ProgressListener* pl; - bool tunnelMetaData; bool flush; // internal state @@ -1564,20 +1568,20 @@ private: } // namespace -IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool tunnelMetaData, bool flush) +IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) { - ImageProcessor proc (pjob, errorCode, pl, tunnelMetaData, flush); + ImageProcessor proc (pjob, errorCode, pl, flush); return proc(); } -void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData) +void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl) { ProcessingJob* currentJob = job; while (currentJob) { int errorCode; - IImage16* img = processImage (currentJob, errorCode, bpl, tunnelMetaData, true); + IImage16* img = processImage (currentJob, errorCode, bpl, true); if (errorCode) { bpl->error (M ("MAIN_MSG_CANNOTLOAD")); @@ -1593,11 +1597,11 @@ void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl, bo } } -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData) +void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl) { if (bpl) { - Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl, tunnelMetaData), 0, true, true, Glib::THREAD_PRIORITY_LOW); + Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); } } diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 222ee2550..f5a20b88a 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -150,6 +150,7 @@ set(NONCLISOURCEFILES fattaltonemap.cc localcontrast.cc eventmapper.cc + metadatapanel.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 43ee5d79d..6b04ed0ae 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -572,7 +572,7 @@ void BatchQueue::startProcessing () next->removeButtonSet (); // start batch processing - rtengine::startBatchProcessing (next->job, this, options.tunnelMetaData); + rtengine::startBatchProcessing (next->job, this); queue_draw (); } } diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index e86b7d9ab..643803075 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1938,7 +1938,7 @@ void EditorPanel::saveAsPressed () rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); ProgressConnector *ld = new ProgressConnector(); - ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), + ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_saveImage ), ld, fnameOut, sf, pparams)); saveimgas->set_sensitive (false); sendtogimp->set_sensitive (false); @@ -1982,7 +1982,7 @@ void EditorPanel::sendToGimpPressed () ipc->getParams (&pparams); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); ProgressConnector *ld = new ProgressConnector(); - ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), + ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_sendToGimp ), ld, openThm->getFileName() )); saveimgas->set_sensitive (false); sendtogimp->set_sensitive (false); @@ -1996,7 +1996,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm rtengine::ProcessingJob *job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); // save immediately - rtengine::IImage16 *img = rtengine::processImage (job, err, nullptr, options.tunnelMetaData, false); + rtengine::IImage16 *img = rtengine::processImage (job, err, nullptr, false); int err = 0; diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 1d1917e8c..870f90940 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -822,7 +822,7 @@ int processLineParams ( int argc, char **argv ) } // Process image - rtengine::IImage16* resultImage = rtengine::processImage (job, errorCode, nullptr, options.tunnelMetaData); + rtengine::IImage16* resultImage = rtengine::processImage (job, errorCode, nullptr); if ( !resultImage ) { errors++; diff --git a/rtgui/metadatapanel.cc b/rtgui/metadatapanel.cc new file mode 100644 index 000000000..8d5ae158a --- /dev/null +++ b/rtgui/metadatapanel.cc @@ -0,0 +1,121 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +#include "metadatapanel.h" +#include "eventmapper.h" +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace rtengine::procparams; + + +MetaDataPanel::MetaDataPanel() +{ + EvMetaDataMode = ProcEventMapper::getInstance()->newEvent(M_VOID, "HISTORY_MSG_METADATA_MODE"); + + Gtk::HBox *box = Gtk::manage(new Gtk::HBox()); + box->pack_start(*Gtk::manage(new Gtk::Label(M("TP_METADATA_MODE") + ": ")), Gtk::PACK_SHRINK, 4); + metadataMode = Gtk::manage(new MyComboBoxText()); + metadataMode->append(M("TP_METADATA_TUNNEL")); + metadataMode->append(M("TP_METADATA_EDIT")); + metadataMode->append(M("TP_METADATA_STRIP")); + metadataMode->set_active(0); + box->pack_end(*metadataMode, Gtk::PACK_EXPAND_WIDGET, 4); + pack_start(*box, Gtk::PACK_SHRINK, 4); + + metadataMode->signal_changed().connect(sigc::mem_fun(*this, &MetaDataPanel::metaDataModeChanged)); + + tagsNotebook = Gtk::manage(new Gtk::Notebook()); + exifpanel = Gtk::manage(new ExifPanel()); + iptcpanel = Gtk::manage(new IPTCPanel()); + tagsNotebook->set_name("MetaPanelNotebook"); + tagsNotebook->append_page(*exifpanel, M("MAIN_TAB_EXIF")); + tagsNotebook->append_page(*iptcpanel, M("MAIN_TAB_IPTC")); + + pack_end(*tagsNotebook); +} + + +void MetaDataPanel::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + metadataMode->append(M("GENERAL_UNCHANGED")); + tagsNotebook->remove_page(-1); + tagsNotebook->remove_page(-1); +} + + +void MetaDataPanel::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener(); + metadataMode->set_active(int(pp->metadata.mode)); + if (pedited) { + if (!pedited->metadata.mode) { + metadataMode->set_active(3); + } + } + + exifpanel->read(pp, pedited); + iptcpanel->read(pp, pedited); + + enableListener(); +} + + +void MetaDataPanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + pp->metadata.mode = static_cast(max(metadataMode->get_active_row_number(), 2)); + if (pedited) { + pedited->metadata.mode = metadataMode->get_active_row_number() != 3; + } + + exifpanel->write(pp, pedited); + iptcpanel->write(pp, pedited); +} + + +void MetaDataPanel::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + exifpanel->setDefaults(defParams, pedited); + iptcpanel->setDefaults(defParams, pedited); +} + + +void MetaDataPanel::setImageData(const rtengine::FramesMetaData* id) +{ + exifpanel->setImageData(id); + iptcpanel->setImageData(id); +} + + +void MetaDataPanel::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + exifpanel->setListener(tpl); + iptcpanel->setListener(tpl); +} + + +void MetaDataPanel::metaDataModeChanged() +{ + if (listener) { + listener->panelChanged(EvMetaDataMode, M("HISTORY_CHANGED")); + } +} diff --git a/rtgui/metadatapanel.h b/rtgui/metadatapanel.h new file mode 100644 index 000000000..d0a649a86 --- /dev/null +++ b/rtgui/metadatapanel.h @@ -0,0 +1,48 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 "toolpanel.h" +#include "exifpanel.h" +#include "iptcpanel.h" + +class MetaDataPanel: public Gtk::VBox, public ToolPanel { +private: + rtengine::ProcEvent EvMetaDataMode; + MyComboBoxText *metadataMode; + Gtk::Notebook *tagsNotebook; + ExifPanel *exifpanel; + IPTCPanel *iptcpanel; + + void metaDataModeChanged(); + +public: + MetaDataPanel(); + + void setBatchMode(bool batchMode); + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + + void setImageData(const rtengine::FramesMetaData* id); + void setListener(ToolPanelListener *tpl); +}; + diff --git a/rtgui/options.cc b/rtgui/options.cc index 031678ddd..127ea990f 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -426,7 +426,6 @@ void Options::setDefaults () tabbedUI = false; mainNBVertical = true; multiDisplayMode = 0; - tunnelMetaData = true; histogramPosition = 1; histogramBar = true; histogramFullMode = false; @@ -868,10 +867,6 @@ void Options::readFromFile (Glib::ustring fname) if (keyFile.has_key ("Output", "OverwriteOutputFile")) { overwriteOutputFile = keyFile.get_boolean ("Output", "OverwriteOutputFile"); } - - if (keyFile.has_key ("Output", "TunnelMetaData")) { - tunnelMetaData = keyFile.get_boolean ("Output", "TunnelMetaData"); - } } if (keyFile.has_group ("Profiles")) { @@ -1942,7 +1937,6 @@ void Options::saveToFile (Glib::ustring fname) 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 ("Profiles", "Directory", profilePath); keyFile.set_boolean ("Profiles", "UseBundledProfiles", useBundledProfiles); diff --git a/rtgui/options.h b/rtgui/options.h index 947d3b615..feeca7983 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -249,7 +249,6 @@ public: double sndLngEditProcDoneSecs; // Minimum processing time seconds till the sound is played bool sndEnable; - bool tunnelMetaData; // Pass through IPTC and XMP unchanged int histogramPosition; // 0=disabled, 1=left pane, 2=right pane //int histogramWorking; // 0=disabled, 1=left pane, 2=right pane bool histogramBar; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 977d7ff3a..fc302299c 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -563,6 +563,7 @@ void ParamsEdited::set (bool v) filmSimulation.enabled = v; filmSimulation.clutFilename = v; filmSimulation.strength = v; + metadata.mode = v; exif = v; iptc = v; @@ -1112,6 +1113,7 @@ void ParamsEdited::initFrom (const std::vector filmSimulation.enabled = filmSimulation.enabled && p.filmSimulation.enabled == other.filmSimulation.enabled; filmSimulation.clutFilename = filmSimulation.clutFilename && p.filmSimulation.clutFilename == other.filmSimulation.clutFilename; filmSimulation.strength = filmSimulation.strength && p.filmSimulation.strength == other.filmSimulation.strength; + metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? // exif = exif && p.exif==other.exif @@ -3090,6 +3092,9 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.filmSimulation.strength = dontforceSet && options.baBehav[ADDSET_FILMSIMULATION_STRENGTH] ? toEdit.filmSimulation.strength + mods.filmSimulation.strength : mods.filmSimulation.strength; } + if (metadata.mode) { + toEdit.metadata.mode = mods.metadata.mode; + } // Exif changes are added to the existing ones if (exif) diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 9c4e97a64..5a835bf05 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -797,6 +797,13 @@ public: bool isUnchanged() const; }; + +class MetaDataParamsEdited { +public: + bool mode; +}; + + class ParamsEdited { @@ -845,6 +852,7 @@ public: WaveletParamsEdited wavelet; HSVEqualizerParamsEdited hsvequalizer; FilmSimulationParamsEdited filmSimulation; + MetaDataParamsEdited metadata; bool exif; bool iptc; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 0f082c70c..b53e884f5 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -582,14 +582,6 @@ Gtk::Widget* Preferences::getProcParamsPanel () cdf->add(*dirgrid); mvbpp->pack_start (*cdf, Gtk::PACK_SHRINK, 4 ); - // Metadata - Gtk::Frame* fmd = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_METADATA"))); - Gtk::VBox* vbmd = Gtk::manage (new Gtk::VBox ()); - ckbTunnelMetaData = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_TUNNELMETADATA"))); - vbmd->pack_start (*ckbTunnelMetaData, Gtk::PACK_SHRINK, 4); - fmd->add (*vbmd); - mvbpp->pack_start (*fmd, Gtk::PACK_SHRINK, 4); - return mvbpp; } @@ -1810,8 +1802,6 @@ void Preferences::storePreferences () moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number (); moptions.useBundledProfiles = useBundledProfiles->get_active (); - moptions.tunnelMetaData = ckbTunnelMetaData->get_active (); - moptions.rtSettings.darkFramesPath = darkFrameDir->get_filename(); moptions.rtSettings.flatFieldsPath = flatFieldDir->get_filename(); @@ -2039,8 +2029,6 @@ void Preferences::fillPreferences () loadParamsPreference->set_active (moptions.paramsLoadLocation); useBundledProfiles->set_active (moptions.useBundledProfiles); - ckbTunnelMetaData->set_active (moptions.tunnelMetaData); - if (!moptions.tabbedUI) { editorLayout->set_active (moptions.mainNBVertical ? 1 : 0); } else { diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 70cef4bee..7ce592457 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -188,7 +188,6 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::Entry* txtSndLngEditProcDone; Gtk::SpinButton* spbSndLngEditProcDoneSecs; - Gtk::CheckButton* ckbTunnelMetaData; Gtk::CheckButton* ckbInternalThumbIfUntouched; Gtk::Entry* txtCustProfBuilderPath; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 318ebf55b..7726f9a5e 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -71,10 +71,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan prsharpening = Gtk::manage (new PrSharpening()); crop = Gtk::manage (new Crop ()); icm = Gtk::manage (new ICMPanel ()); - if(!batch) { - exifpanel = Gtk::manage (new ExifPanel ()); - iptcpanel = Gtk::manage (new IPTCPanel ()); - } + metadata = Gtk::manage(new MetaDataPanel()); wavelet = Gtk::manage (new Wavelet ()); dirpyrequalizer = Gtk::manage (new DirPyrEqualizer ()); hsvequalizer = Gtk::manage (new HSVEqualizer ()); @@ -153,17 +150,8 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (rawPanel, flatfield); toolPanels.push_back (coarse); + toolPanels.push_back(metadata); - if(!batch) { - toolPanels.push_back (exifpanel); - toolPanels.push_back (iptcpanel); - metadataPanel = Gtk::manage (new Gtk::Notebook ()); - metadataPanel->set_name ("MetaPanelNotebook"); - metadataPanel->append_page (*exifpanel, M ("MAIN_TAB_EXIF")); - metadataPanel->append_page (*iptcpanel, M ("MAIN_TAB_IPTC")); - } else { - metadataPanel = nullptr; - } toolPanelNotebook = new Gtk::Notebook (); toolPanelNotebook->set_name ("ToolPanelNotebook"); @@ -219,11 +207,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan toiW = Gtk::manage (new TextOrIcon ("wavelet.png", M ("MAIN_TAB_WAVELET"), M ("MAIN_TAB_WAVELET_TOOLTIP"), type)); toiT = Gtk::manage (new TextOrIcon ("transform.png", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"), type)); toiR = Gtk::manage (new TextOrIcon ("raw.png", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"), type)); - if(!batch) { - toiM = Gtk::manage (new TextOrIcon ("meta.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"), type)); - } else { - toiM = nullptr; - } + toiM = Gtk::manage (new TextOrIcon ("meta.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"), type)); toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); @@ -231,9 +215,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan toolPanelNotebook->append_page (*waveletPanelSW, *toiW); toolPanelNotebook->append_page (*transformPanelSW, *toiT); toolPanelNotebook->append_page (*rawPanelSW, *toiR); - if(!batch) { - toolPanelNotebook->append_page (*metadataPanel, *toiM); - } + toolPanelNotebook->append_page (*metadata, *toiM); toolPanelNotebook->set_current_page (0); @@ -483,8 +465,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool if (ipc) { const rtengine::FramesMetaData* pMetaData = ipc->getInitialImage()->getMetaData(); - exifpanel->setImageData (pMetaData); - iptcpanel->setImageData (pMetaData); + metadata->setImageData(pMetaData); ipc->setAutoExpListener (toneCurve); ipc->setAutoCamListener (colorappearance); @@ -824,10 +805,8 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) return true; case GDK_KEY_m: - if (metadataPanel) { - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadataPanel)); - return true; - } + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadata)); + return true; } } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 7c4b94ed9..11f6dfc0a 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -38,8 +38,7 @@ #include "epd.h" #include "sharpening.h" #include "labcurve.h" -#include "exifpanel.h" -#include "iptcpanel.h" +#include "metadatapanel.h" #include "crop.h" #include "icmpanel.h" #include "resize.h" @@ -149,6 +148,7 @@ protected: BayerRAWExposure* bayerrawexposure; XTransRAWExposure* xtransrawexposure; FattalToneMapping *fattal; + MetaDataPanel* metadata; std::vector paramcListeners; @@ -161,9 +161,6 @@ protected: ToolVBox* transformPanel; ToolVBox* rawPanel; ToolVBox* waveletPanel; - Gtk::Notebook* metadataPanel; - ExifPanel* exifpanel; - IPTCPanel* iptcpanel; ToolBar* toolBar; TextOrIcon* toiE; From d7f96c298eccd90208da221e4febea726ccdb5b0 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 30 Dec 2017 00:00:12 +0100 Subject: [PATCH 071/200] metadata panel: do not use Gtk::manage for exifpanel and iptcpanel (Fixes segfault due to removing the notebook pages in batch mode) --- rtgui/metadatapanel.cc | 11 +++++++++-- rtgui/metadatapanel.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/rtgui/metadatapanel.cc b/rtgui/metadatapanel.cc index 8d5ae158a..c59889234 100644 --- a/rtgui/metadatapanel.cc +++ b/rtgui/metadatapanel.cc @@ -43,8 +43,8 @@ MetaDataPanel::MetaDataPanel() metadataMode->signal_changed().connect(sigc::mem_fun(*this, &MetaDataPanel::metaDataModeChanged)); tagsNotebook = Gtk::manage(new Gtk::Notebook()); - exifpanel = Gtk::manage(new ExifPanel()); - iptcpanel = Gtk::manage(new IPTCPanel()); + exifpanel = new ExifPanel(); + iptcpanel = new IPTCPanel(); tagsNotebook->set_name("MetaPanelNotebook"); tagsNotebook->append_page(*exifpanel, M("MAIN_TAB_EXIF")); tagsNotebook->append_page(*iptcpanel, M("MAIN_TAB_IPTC")); @@ -53,6 +53,13 @@ MetaDataPanel::MetaDataPanel() } +MetaDataPanel::~MetaDataPanel() +{ + delete iptcpanel; + delete exifpanel; +} + + void MetaDataPanel::setBatchMode(bool batchMode) { ToolPanel::setBatchMode(batchMode); diff --git a/rtgui/metadatapanel.h b/rtgui/metadatapanel.h index d0a649a86..a2c1f43ac 100644 --- a/rtgui/metadatapanel.h +++ b/rtgui/metadatapanel.h @@ -36,6 +36,7 @@ private: public: MetaDataPanel(); + ~MetaDataPanel(); void setBatchMode(bool batchMode); void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); From eede7e406f60dd4854a533920baef5d15b15f816 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 31 Dec 2017 00:28:16 +0100 Subject: [PATCH 072/200] correctly set MetaDataParams::mode --- rtgui/metadatapanel.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtgui/metadatapanel.cc b/rtgui/metadatapanel.cc index c59889234..ee97a7dfe 100644 --- a/rtgui/metadatapanel.cc +++ b/rtgui/metadatapanel.cc @@ -88,7 +88,8 @@ void MetaDataPanel::read(const rtengine::procparams::ProcParams* pp, const Param void MetaDataPanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { - pp->metadata.mode = static_cast(max(metadataMode->get_active_row_number(), 2)); + pp->metadata.mode = static_cast(min(metadataMode->get_active_row_number(), 2)); + if (pedited) { pedited->metadata.mode = metadataMode->get_active_row_number() != 3; } From 32d0a934f4de721031b7a1a9c56655e696d3e646 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 31 Dec 2017 00:48:33 +0100 Subject: [PATCH 073/200] Fix #4265: "Segfault saving image with edited metadata" --- rtexif/rtexif.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index affd530b5..b6b5b55fe 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1938,17 +1938,15 @@ void Tag::initUserComment (const Glib::ustring &text) count = 8 + strlen (text.c_str()); valuesize = count; value = new unsigned char[valuesize]; - strcpy ((char*)value, "ASCII"); - value[5] = value[6] = value[7] = 0; - strcpy ((char*)value + 8, text.c_str()); + memcpy((char*)value, "ASCII\0\0\0", 8); + memcpy((char*)value + 8, text.c_str(), valuesize - 8); } else { wchar_t *commentStr = (wchar_t*)g_utf8_to_utf16 (text.c_str(), -1, NULL, NULL, NULL); count = 8 + wcslen(commentStr)*2; valuesize = count; value = (unsigned char*)new char[valuesize]; - strcpy ((char*)value, "UNICODE"); - value[7] = 0; - wcscpy(((wchar_t*)value) + 4, commentStr); + memcpy((char*)value, "UNICODE\0", 8); + memcpy((char*)value + 8, (char*)commentStr, valuesize - 8); g_free(commentStr); } } From 3dcce23c24d093f7c9719addd99c7b9d5589a827 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 31 Dec 2017 14:36:59 +0100 Subject: [PATCH 074/200] rgbproc() speedups --- rtengine/LUT.h | 32 +++ rtengine/color.cc | 65 +++++ rtengine/color.h | 2 +- rtengine/improcfun.cc | 544 ++++++++++++++++++++---------------------- 4 files changed, 358 insertions(+), 285 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 48c85726d..0fd906dc0 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -309,6 +309,38 @@ public: #if defined( __SSE2__ ) && defined( __x86_64__ ) + + // NOTE: This function requires LUTs which clips only at lower bound + vfloat cb(vfloat indexv) const + { + static_assert(std::is_same::value, "This method only works for float LUTs"); + + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxIndexFloat), indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); + + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } + + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + + vfloat diff = vmaxf(ZEROV, indexv) - _mm_cvtepi32_ps(indexes); + return vintpf(diff, upper, lower); + } + // NOTE: This version requires LUTs which clip at upper and lower bounds // (which is the default). vfloat operator[](vfloat indexv) const diff --git a/rtengine/color.cc b/rtengine/color.cc index 7964cc472..4b51314cc 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1783,6 +1783,71 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat & } #endif // __SSE2__ +void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width) +{ + +#ifdef __SSE2__ + // prepare matrix to save some divisions (reduces the number of divisions by width/2 - 6) + float wpn[3][3]; + for(int i = 0; i < 3; ++i) { + wpn[0][i] = wp[0][i] / Color::D50x; + wpn[1][i] = wp[1][i]; + wpn[2][i] = wp[2][i] / Color::D50z; + } + + vfloat maxvalfv = F2V(MAXVALF); + vfloat c116v = F2V(116.f); + vfloat c5242d88v = F2V(5242.88f); + vfloat c500v = F2V(500.f); + vfloat c200v = F2V(200.f); +#endif + int i = 0; +#ifdef __SSE2__ + for(;i < width - 3; i+=4) { + const vfloat rv = LVFU(R[i]); + const vfloat gv = LVFU(G[i]); + const vfloat bv = LVFU(B[i]); + const vfloat xv = F2V(wpn[0][0]) * rv + F2V(wpn[0][1]) * gv + F2V(wpn[0][2]) * bv; + const vfloat yv = F2V(wpn[1][0]) * rv + F2V(wpn[1][1]) * gv + F2V(wpn[1][2]) * bv; + const vfloat zv = F2V(wpn[2][0]) * rv + F2V(wpn[2][1]) * gv + F2V(wpn[2][2]) * bv; + + vmask maxMask = vmaskf_gt(vmaxf(xv, vmaxf(yv, zv)), maxvalfv); + if (_mm_movemask_ps((vfloat)maxMask)) { + // take slower code path for all 4 pixels if one of the values is > MAXVALF. Still faster than non SSE2 version + for(int k = 0; k < 4; ++k) { + float x = xv[k]; + float y = yv[k]; + float z = zv[k]; + float fx = (x <= 65535.f ? cachef[x] : (327.68f * xcbrtf(x / MAXVALF))); + float fy = (y <= 65535.f ? cachef[y] : (327.68f * xcbrtf(y / MAXVALF))); + float fz = (z <= 65535.f ? cachef[z] : (327.68f * xcbrtf(z / MAXVALF))); + + L[i + k] = (116.f * fy - 5242.88f); //5242.88=16.0*327.68; + a[i + k] = (500.f * (fx - fy) ); + b[i + k] = (200.f * (fy - fz) ); + } + } else { + const vfloat fx = cachef[xv]; + const vfloat fy = cachef[yv]; + const vfloat fz = cachef[zv]; + + STVFU(L[i], c116v * fy - c5242d88v); //5242.88=16.0*327.68; + STVFU(a[i], c500v * (fx - fy)); + STVFU(b[i], c200v * (fy - fz)); + } + } +#endif + for(;i < width; ++i) { + const float rv = R[i]; + const float gv = G[i]; + const float bv = B[i]; + float x = wp[0][0] * rv + wp[0][1] * gv + wp[0][2] * bv; + float y = wp[1][0] * rv + wp[1][1] * gv + wp[1][2] * bv; + float z = wp[2][0] * rv + wp[2][1] * gv + wp[2][2] * bv; + XYZ2Lab(x, y, z, L[i], a[i], b[i]); + } +} + void Color::XYZ2Lab(float X, float Y, float Z, float &L, float &a, float &b) { diff --git a/rtengine/color.h b/rtengine/color.h index 59e189810..049defb70 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -475,7 +475,7 @@ public: * @param b channel [-42000 ; +42000] ; can be more than 42000 (return value) */ static void XYZ2Lab(float x, float y, float z, float &L, float &a, float &b); - + static void RGB2Lab(float *X, float *Y, float *Z, float *L, float *a, float *b, const float wp[3][3], int width); /** * @brief Convert Lab in Yuv diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 8300a24e7..bfe4ee021 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -48,6 +48,227 @@ #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) +namespace { + +using namespace rtengine; +// begin of helper function for rgbProc() +void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + +#ifdef __SSE2__ + vfloat cr = F2V(0.299f); + vfloat cg = F2V(0.587f); + vfloat cb = F2V(0.114f); +#endif + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vfloat bv = LVF(btemp[ti * tileSize + tj]); + + //shadow tone curve + vfloat Yv = cr * rv + cg * gv + cb * bv; + vfloat tonefactorv = shtonecurve(Yv); + STVF(rtemp[ti * tileSize + tj], rv * tonefactorv); + STVF(gtemp[ti * tileSize + tj], gv * tonefactorv); + STVF(btemp[ti * tileSize + tj], bv * tonefactorv); + } +#endif + for (; j < tW; j++, tj++) { + + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; + + //shadow tone curve + float Y = (0.299f * r + 0.587f * g + 0.114f * b); + float tonefactor = shtonecurve[Y]; + rtemp[ti * tileSize + tj] = rtemp[ti * tileSize + tj] * tonefactor; + gtemp[ti * tileSize + tj] = gtemp[ti * tileSize + tj] * tonefactor; + btemp[ti * tileSize + tj] = btemp[ti * tileSize + tj] * tonefactor; + } + } +} + +void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, float exp_scale, float comp, float hlrange) { + +#ifdef __SSE2__ + vfloat threev = F2V(3.f); + vfloat maxvalfv = F2V(MAXVALF); +#endif + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vfloat bv = LVF(btemp[ti * tileSize + tj]); + + //TODO: proper treatment of out-of-gamut colors + //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; + vmask maxMask = vmaskf_ge(vmaxf(rv, vmaxf(gv, bv)), maxvalfv); + if(_mm_movemask_ps((vfloat)maxMask)) { + for (int k = 0; k < 4; ++k) { + float r = rtemp[ti * tileSize + tj + k]; + float g = gtemp[ti * tileSize + tj + k]; + float b = btemp[ti * tileSize + tj + k]; + float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + + (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; + + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + rtemp[ti * tileSize + tj + k] = r * tonefactor; + gtemp[ti * tileSize + tj + k] = g * tonefactor; + btemp[ti * tileSize + tj + k] = b * tonefactor; + } + } else { + vfloat tonefactorv = (hltonecurve.cb(rv) + hltonecurve.cb(gv) + hltonecurve.cb(bv)) / threev; + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + STVF(rtemp[ti * tileSize + tj], rv * tonefactorv); + STVF(gtemp[ti * tileSize + tj], gv * tonefactorv); + STVF(btemp[ti * tileSize + tj], bv * tonefactorv); + } + } +#endif + for (; j < tW; j++, tj++) { + + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; + + //TODO: proper treatment of out-of-gamut colors + //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; + float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + + (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; + + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + rtemp[ti * tileSize + tj] = r * tonefactor; + gtemp[ti * tileSize + tj] = g * tonefactor; + btemp[ti * tileSize + tj] = b * tonefactor; + } + } +} + +void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + // this is a hack to avoid the blue=>black bug (Issue 2141) + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vmask zeromask = vorm(vmaskf_eq(rv, ZEROV), vmaskf_eq(gv, ZEROV)); + if(_mm_movemask_ps((vfloat)zeromask)) { + for (int k = 0; k < 4; ++k) { + float r = rtemp[ti * tileSize + tj + k]; + float g = gtemp[ti * tileSize + tj + k]; + if (r == 0.0f || g == 0.0f) { + float b = btemp[ti * tileSize + tj + k]; + float h, s, v; + Color::rgb2hsv (r, g, b, h, s, v); + s *= 0.99f; + Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj + k], gtemp[ti * tileSize + tj + k], btemp[ti * tileSize + tj + k]); + } + } + } + } +#endif + for (; j < tW; j++, tj++) { + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + + if (r == 0.0f || g == 0.0f) { + float b = btemp[ti * tileSize + tj]; + float h, s, v; + Color::rgb2hsv (r, g, b, h, s, v); + s *= 0.99f; + Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } +} + +void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode curveMode, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, PerceptualToneCurveState ptcApplyState) { + + if (curveMode == ToneCurveParams::TcMode::STD) { // Standard + for (int i = istart, ti = 0; i < tH; i++, ti++) { + const StandardToneCurve& userToneCurve = static_cast (customToneCurve); + userToneCurve.BatchApply ( + 0, tW - jstart, + &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); + } + } else if (curveMode == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + const AdobeToneCurve& userToneCurve = static_cast (customToneCurve); + userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve); + rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); + gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); + btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); + userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted + const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve); + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); + gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); + btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); + userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel + const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve); + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); + gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); + btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); + userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant + const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve); + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); + gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); + btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); + userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj], ptcApplyState); + } + } + } +} + +void fillEditFloat(float *editIFloatTmpR, float *editIFloatTmpG, float *editIFloatTmpB, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + editIFloatTmpR[ti * tileSize + tj] = Color::gamma2curve[rtemp[ti * tileSize + tj]] / 65535.f; + editIFloatTmpG[ti * tileSize + tj] = Color::gamma2curve[gtemp[ti * tileSize + tj]] / 65535.f; + editIFloatTmpB[ti * tileSize + tj] = Color::gamma2curve[btemp[ti * tileSize + tj]] / 65535.f; + } + } +} +// end of helper function for rgbProc() + +} + namespace rtengine { @@ -3332,8 +3553,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float chMixBG = float (params->chmixer.blue[1]); float chMixBB = float (params->chmixer.blue[2]); - int shHighlights = params->sh.highlights; - int shShadows = params->sh.shadows; + int shHighlights = params->sh.highlights / 100.f; + int shShadows = params->sh.shadows / 100.f; bool blackwhite = params->blackwhite.enabled; bool complem = params->blackwhite.enabledcc; float bwr = float (params->blackwhite.mixerRed); @@ -3501,15 +3722,13 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float g = gtemp[ti * TS + tj]; float b = btemp[ti * TS + tj]; - 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 (processSH) { - if (mapval > h_th) { - factor = (h_th + (100.0 - shHighlights) * (mapval - h_th) / 100.0) / mapval; - } else if (mapval < s_th) { - factor = (s_th - (100.0 - shShadows) * (s_th - mapval) / 100.0) / mapval; - } + if (mapval > h_th) { + factor = (1.f - shHighlights) + shHighlights * h_th / mapval; + } else if (mapval < s_th) { + factor = (s_th - (1.f - shShadows) * (s_th - mapval)) / mapval; } rtemp[ti * TS + tj] = factor * r; @@ -3519,61 +3738,8 @@ 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 r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - //TODO: proper treatment of out-of-gamut colors - //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; - float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + - (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + - (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; - - // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place - rtemp[ti * TS + tj] = r * tonefactor; - gtemp[ti * TS + tj] = g * tonefactor; - btemp[ti * TS + tj] = b * tonefactor; - } - } - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - vfloat cr = F2V(0.299f); - vfloat cg = F2V(0.587f); - vfloat cb = F2V(0.114f); - int j = jstart; - int tj = 0; -#ifdef __SSE2__ - for (; j < tW - 3; j+=4, tj+=4) { - - vfloat rv = LVF(rtemp[ti * TS + tj]); - vfloat gv = LVF(gtemp[ti * TS + tj]); - vfloat bv = LVF(btemp[ti * TS + tj]); - - //shadow tone curve - vfloat Yv = cr * rv + cg * gv + cb * bv; - vfloat tonefactorv = shtonecurve(Yv); - STVF(rtemp[ti * TS + tj], rv * tonefactorv); - STVF(gtemp[ti * TS + tj], gv * tonefactorv); - STVF(btemp[ti * TS + tj], bv * tonefactorv); - } -#endif - for (; j < tW; j++, tj++) { - - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - //shadow tone curve - float Y = (0.299f * r + 0.587f * g + 0.114f * b); - float tonefactor = shtonecurve[Y]; - rtemp[ti * TS + tj] = rtemp[ti * TS + tj] * tonefactor; - gtemp[ti * TS + tj] = gtemp[ti * TS + tj] * tonefactor; - btemp[ti * TS + tj] = btemp[ti * TS + tj] * tonefactor; - } - } + highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange); + shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); if (dcpProf) { dcpProf->step2ApplyTile (rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); @@ -3581,22 +3747,10 @@ 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 r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - // clip out of gamut colors, without distorting color too bad - if (r < 0) { - r = 0; - } - - if (g < 0) { - g = 0; - } - - if (b < 0) { - b = 0; - } + // clip out of gamut colors, without distorting colour too bad + float r = std::max(rtemp[ti * TS + tj], 0.f); + float g = std::max(gtemp[ti * TS + tj], 0.f); + float b = std::max(btemp[ti * TS + tj], 0.f); if (r > 65535 || g > 65535 || b > 65535) { filmlike_clip (&r, &g, &b); @@ -3624,12 +3778,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } else { for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; +#ifdef __SSE2__ for (; j < tW - 3; j+=4, tj+=4) { //brightness/contrast STVF(rtemp[ti * TS + tj], tonecurve(LVF(rtemp[ti * TS + tj]))); STVF(gtemp[ti * TS + tj], tonecurve(LVF(gtemp[ti * TS + tj]))); STVF(btemp[ti * TS + tj], tonecurve(LVF(btemp[ti * TS + tj]))); } +#endif for (; j < tW; j++, tj++) { //brightness/contrast rtemp[ti * TS + tj] = tonecurve[rtemp[ti * TS + tj]]; @@ -3640,133 +3796,19 @@ 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] = 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; - } - } + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } if (hasToneCurve1) { - if (curveMode == ToneCurveParams::TcMode::STD) { // Standard - for (int i = istart, ti = 0; i < tH; i++, ti++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.BatchApply ( - 0, tW - jstart, - &rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS]); - } - } else if (curveMode == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve1); - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve1); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel - const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve1); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve1); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ptc1ApplyState); - } - } - } + customToneCurve(customToneCurve1, curveMode, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, ptc1ApplyState); } 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] = 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; - } - } + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } if (hasToneCurve2) { - if (curveMode2 == ToneCurveParams::TcMode::STD) { // Standard - for (int i = istart, ti = 0; i < tH; i++, ti++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.BatchApply ( - 0, tW - jstart, - &rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS]); - } - } else if (curveMode2 == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel - const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ptc2ApplyState); - } - } - } + customToneCurve(customToneCurve2, curveMode2, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, ptc2ApplyState); } if (editID == EUID_RGB_R) { @@ -3978,20 +4020,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (isProPhoto) { // this is a hack to avoid the blue=>black bug (Issue 2141) - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - - if (r == 0.0f || g == 0.0f) { - float b = btemp[ti * TS + tj]; - float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - s *= 0.99f; - Color::hsv2rgb (h, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } + proPhotoBlue(rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } if (hasColorToning && !blackwhite) { @@ -4195,13 +4224,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // filling the pipette buffer 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] = 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; - } - } + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } else if (editID == EUID_BlackWhiteLuminance) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -4494,53 +4517,24 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (!blackwhite) { + if (editImgFloat || editWhatever) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + + // filling the pipette buffer by the content of the temp pipette buffers + if (editImgFloat) { + editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; + editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; + editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; + } else if (editWhatever) { + editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; + } + } + } + } // ready, fill lab for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - - // filling the pipette buffer by the content of the temp pipette buffers - if (editImgFloat) { - editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; - editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; - editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; - } else if (editWhatever) { - editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; - } - - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - float x = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; - float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - - float fx, fy, fz; - - 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) ); - 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; - */ - } + Color::RGB2Lab(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], &(lab->L[i][jstart]), &(lab->a[i][jstart]), &(lab->b[i][jstart]), toxyz, tW - jstart); } } else { // black & white // Auto channel mixer needs whole image, so we now copy to tmpImage and close the tiled processing @@ -4952,25 +4946,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #endif for (int i = 0; i < tH; i++) { - for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); - - float x = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; - float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - - float fx, fy, fz; - - 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); - } + Color::RGB2Lab(tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), lab->L[i], lab->a[i], lab->b[i], toxyz, tW); } From 057861b882c0947b92a664db2f16476b7534e2ba Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 31 Dec 2017 16:58:06 +0100 Subject: [PATCH 075/200] Small (~ 4%) speedup for perceptual tone curve --- rtengine/curves.cc | 17 ++++++++--------- rtengine/curves.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index db6c4c5f5..9f6db0a50 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1822,7 +1822,7 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const return maxslope; } -void PerceptualToneCurve::Apply(float &r, float &g, float &b, PerceptualToneCurveState & state) const +void PerceptualToneCurve::Apply(float &r, float &g, float &b, const PerceptualToneCurveState &state) const { float x, y, z; @@ -2012,14 +2012,13 @@ void PerceptualToneCurve::Apply(float &r, float &g, float &b, PerceptualToneCurv // we use the RGB-HSV hue-stable "Adobe" curve as reference. For S-curve contrast it increases // saturation greatly, but desaturates extreme highlights and thus provide a smooth transition to // the white point. However the desaturation effect is quite strong so we make a weighting - float ah, as, av, h, s, v; - Color::rgb2hsv(ar, ag, ab, ah, as, av); - Color::rgb2hsv(r, g, b, h, s, v); + float as = Color::rgb2s(ar, ag, ab); + float s = Color::rgb2s(r, g, b); float sat_scale = as <= 0.f ? 1.f : s / as; // saturation scale compared to Adobe curve float keep = 0.2f; - const float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it - const float hilim = 1.20f; + constexpr float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it + constexpr float hilim = 1.20f; if (sat_scale < lolim) { // saturation is low enough, don't desaturate @@ -2041,9 +2040,9 @@ void PerceptualToneCurve::Apply(float &r, float &g, float &b, PerceptualToneCurv if (keep < 1.f) { // mix in some of the Adobe curve result - r = r * keep + (1.f - keep) * ar; - g = g * keep + (1.f - keep) * ag; - b = b * keep + (1.f - keep) * ab; + r = intp(keep, r, ar); + g = intp(keep, g, ag); + b = intp(keep, b, ab); } } diff --git a/rtengine/curves.h b/rtengine/curves.h index e8b65c33d..ad09da35e 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -868,7 +868,7 @@ private: public: static void init(); void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; - void Apply(float& r, float& g, float& b, PerceptualToneCurveState & state) const; + void Apply(float& r, float& g, float& b, const PerceptualToneCurveState &state) const; }; // Standard tone curve From 431d1342028b7a8bfd11679c5db68dafc3c4ef1d Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 31 Dec 2017 17:42:30 +0100 Subject: [PATCH 076/200] Revision of Noise Reduction labels Revised all Noise Reduction labels, now they are grouped by the sub-tool they correspond to and are easier to translate by those who don't know how to search through the code. Used generic labels where possible (curve, slider). Renamed "Quality" to "Mode", and "Method" to "Color space". Closes #3854 --- rtdata/languages/Catala | 129 +++++++-------- rtdata/languages/Chinese (Simplified) | 129 +++++++-------- rtdata/languages/Chinese (Traditional) | 126 +++++++-------- rtdata/languages/Czech | 129 +++++++-------- rtdata/languages/Dansk | 126 +++++++-------- rtdata/languages/Deutsch | 129 +++++++-------- rtdata/languages/English (UK) | 126 +++++++-------- rtdata/languages/English (US) | 126 +++++++-------- rtdata/languages/Espanol | 129 +++++++-------- rtdata/languages/Euskara | 126 +++++++-------- rtdata/languages/Francais | 129 +++++++-------- rtdata/languages/Greek | 126 +++++++-------- rtdata/languages/Hebrew | 126 +++++++-------- rtdata/languages/Italiano | 129 +++++++-------- rtdata/languages/Japanese | 131 ++++++++-------- rtdata/languages/Latvian | 126 +++++++-------- rtdata/languages/Magyar | 129 +++++++-------- rtdata/languages/Nederlands | 129 +++++++-------- rtdata/languages/Norsk BM | 126 +++++++-------- rtdata/languages/Polish | 129 +++++++-------- rtdata/languages/Polish (Latin Characters) | 129 +++++++-------- rtdata/languages/Portugues (Brasil) | 126 +++++++-------- rtdata/languages/Russian | 129 +++++++-------- rtdata/languages/Serbian (Cyrilic Characters) | 129 +++++++-------- rtdata/languages/Serbian (Latin Characters) | 129 +++++++-------- rtdata/languages/Slovak | 129 +++++++-------- rtdata/languages/Suomi | 126 +++++++-------- rtdata/languages/Swedish | 129 +++++++-------- rtdata/languages/Turkish | 126 +++++++-------- rtdata/languages/default | 124 +++++++-------- rtgui/dirpyrdenoise.cc | 148 ++++++++---------- 31 files changed, 2020 insertions(+), 1959 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 7768e4037..9f9a0bf36 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -356,7 +356,6 @@ HISTORY_MSG_169;Corba 'CH' HISTORY_MSG_170;Vibrància - corba HISTORY_MSG_171;Corba 'LC' HISTORY_MSG_172;Restriccció LC als tons vermell i pell -HISTORY_MSG_173;RS - Detall de la luminància HISTORY_NEWSNAPSHOT;Afegeix HISTORY_SNAPSHOT;Instantània HISTORY_SNAPSHOTS;Instantànies @@ -685,11 +684,11 @@ TP_DARKFRAME_LABEL;Marc fosc TP_DEFRINGE_LABEL;Desserrella TP_DEFRINGE_RADIUS;Radi TP_DEFRINGE_THRESHOLD;Llindar -TP_DIRPYRDENOISE_CHROMA;Crominància -TP_DIRPYRDENOISE_GAMMA;Gama -TP_DIRPYRDENOISE_LABEL;Reducció de soroll (només imatges raw) -TP_DIRPYRDENOISE_LDETAIL;Detall de luminància -TP_DIRPYRDENOISE_LUMA;Luminància +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominància +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detall de luminància +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminància +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Reducció de soroll (només imatges raw) +TP_DIRPYRDENOISE_MAIN_GAMMA;Gama TP_DIRPYREQUALIZER_LABEL;Contrast per grau de detall TP_DIRPYREQUALIZER_LUMACOARSEST;Més bast TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- @@ -1015,9 +1014,11 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -1047,7 +1048,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1099,7 +1100,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1140,7 +1141,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1326,6 +1327,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1435,6 +1437,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 @@ -1716,63 +1719,59 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1836,6 +1835,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 611ead7f8..52b7da85b 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -320,7 +320,6 @@ HISTORY_MSG_158;力度 HISTORY_MSG_159;边缘停止 HISTORY_MSG_160;拉伸 HISTORY_MSG_162;色调映射 -HISTORY_MSG_173;降噪 - 亮度细节 HISTORY_MSG_174;CIECAM02 HISTORY_MSG_183;CAM02 - 对比度 (J) HISTORY_MSG_210;渐变 - 角度 @@ -823,10 +822,10 @@ TP_DARKFRAME_AUTOSELECT;自动选择 TP_DARKFRAME_LABEL;黑框架 TP_DEFRINGE_LABEL;去色彩边缘(紫边) TP_DEFRINGE_RADIUS;半径 -TP_DIRPYRDENOISE_LABEL;降噪 -TP_DIRPYRDENOISE_LDETAIL;明亮度细节 -TP_DIRPYRDENOISE_LUMA;光亮度/发光度 -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;明亮度细节 +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;光亮度/发光度 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;降噪 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB TP_DIRPYREQUALIZER_ALGO;皮肤色彩范围 TP_DIRPYREQUALIZER_ARTIF;减少杂色 TP_DIRPYREQUALIZER_HUESKIN;皮肤色相 @@ -1065,6 +1064,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. @@ -1135,6 +1135,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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 - Detail recovery !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround !HISTORY_MSG_177;CAM02 - Scene luminosity @@ -1162,7 +1163,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1207,7 +1208,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1248,7 +1249,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1434,6 +1435,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1490,6 +1492,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1660,64 +1663,60 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !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. !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. @@ -1801,6 +1800,10 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index f539c8dff..b39738e4d 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -580,6 +580,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. @@ -677,7 +678,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -707,7 +708,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -759,7 +760,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -800,7 +801,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -986,6 +987,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1177,6 +1179,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1526,68 +1529,63 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1743,6 +1741,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index b248ddb21..30f946c1a 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -459,7 +459,6 @@ HISTORY_MSG_169;L*a*b* - CH Křivka HISTORY_MSG_170;Živost - HH křivka HISTORY_MSG_171;L*a*b* - LC křivka HISTORY_MSG_172;L*a*b* - Omezení LC -HISTORY_MSG_173;Redukce šumu - Jas detailu HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 přizpůsobení HISTORY_MSG_176;CAM02 - Okolí pro prohlížení @@ -489,7 +488,6 @@ HISTORY_MSG_199;CAM02 - Výstupní histogramy HISTORY_MSG_200;CAM02 - Mapování tónů HISTORY_MSG_201;Redukce šumu - Barevnost Č a Z HISTORY_MSG_202;Redukce šumu - Barevnost M a Ž -HISTORY_MSG_203;Redukce šumu - Metoda HISTORY_MSG_204;Kroky rozšíření LMMSE HISTORY_MSG_205;CAM02 - Filtr vypálených/špatných pixelů HISTORY_MSG_206;CAT02 - Automatická svítivost scény @@ -541,7 +539,6 @@ HISTORY_MSG_252;KdDÚ - Ochrana tónů pleti HISTORY_MSG_253;KdDÚ - Omezení vzniku artefaktů HISTORY_MSG_254;KdDÚ - Tóny pleti HISTORY_MSG_255;Redukce šumu - Medián -HISTORY_MSG_256;Redukce šumu - Typ mediánu HISTORY_MSG_257;Barevné tónování HISTORY_MSG_258;Barevní tónování - Barevná křivka HISTORY_MSG_259;Barevné tónování - Křivka neprůhlednosti @@ -582,7 +579,6 @@ HISTORY_MSG_293;Simulace filmu HISTORY_MSG_294;Simulace filmu - Síla HISTORY_MSG_295;Simulace filmu - Film HISTORY_MSG_296;Redukce šumu - Křivka jasů -HISTORY_MSG_297;Redukce šumu - Kvalita HISTORY_MSG_298;Filtr mrtvých pixelů HISTORY_MSG_299;Redukce šumu - Křivka barevnosti HISTORY_MSG_300;- @@ -1478,68 +1474,62 @@ TP_DARKFRAME_LABEL;Tmavý snímek TP_DEFRINGE_LABEL;Odstranění lemu TP_DEFRINGE_RADIUS;Poloměr TP_DEFRINGE_THRESHOLD;Práh -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 jemný -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 jemný -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Pouze barevnost -TP_DIRPYRDENOISE_AUT;Automatická celková -TP_DIRPYRDENOISE_AUTO;Automatická celková -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Zkusí odhadnout barevný šum\nPozor, tento výpočet je zprůměrován a zcela subjektivní! -TP_DIRPYRDENOISE_BLUE;Barevnost - Modrá a žlutá -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. -TP_DIRPYRDENOISE_CCCURVE;Křivka barevnosti -TP_DIRPYRDENOISE_CHROMA;Barevnost - Hlavní -TP_DIRPYRDENOISE_CHROMAFR;Barevnost -TP_DIRPYRDENOISE_CTYPE;Metoda -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nVíce zónová automatika\nBez náhledu - funguje pouze při ukládání, přesto je možné pomocí funkce "Náhled" získat alespoň částečnou představu o výsledku, Nastavení jsou aplikována na centrální dlaždici.\nObrázek je rozdělen na dlaždice (V závislosti na velikosti obrázku jich bude 10 až 70) a pro každou dlaždici bude vypočítáno vhodné nastavení redukce barevného šumu.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. -TP_DIRPYRDENOISE_CUR;Křivka -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Barevnost -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Zvýší (násobí) hodnoty všech barevných posuvníků.\nKřivka vám umožní nastavit sílu redukce barevného šumu jako funkci barvy. Například pro zvýšení účinku v oblastech s nízkým nasycení a snížení v oblastech s vysokým nasycením. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje akci 'jasového' odstranění šumu +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Více zónová automatika +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatická celková +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Zkusí odhadnout barevný šum\nPozor, tento výpočet je zprůměrován a zcela subjektivní! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Barevnost - Modrá a žlutá +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Křivka barevnosti +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Barevnost +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Ručně +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Barevnost - Hlavní +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metoda +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nVíce zónová automatika\nBez náhledu - funguje pouze při ukládání, přesto je možné pomocí funkce "Náhled" získat alespoň částečnou představu o výsledku, Nastavení jsou aplikována na centrální dlaždici.\nObrázek je rozdělen na dlaždice (V závislosti na velikosti obrázku jich bude 10 až 70) a pro každou dlaždici bude vypočítáno vhodné nastavení redukce barevného šumu.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Více zónový náhled +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Náhled +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Velikost náhledu=%1, Střed: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Náhled šumu: Průměr=%1 Výšky=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Náhled šumu: Průměr= - Výšky= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Velikost dlaždice=%1, Střed: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Barevnost - Červená a zelená TP_DIRPYRDENOISE_ENH;Vylepšený režim TP_DIRPYRDENOISE_ENH_TOOLTIP;Zvýší kvalitu odstranění šumu, ale zároveň prodlouží dobu zpracování o 20%. -TP_DIRPYRDENOISE_GAMMA;Gama -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gama ovlivňuje sílu redukce šumu v rozsahu tónů. Menší hodnoty ovlivňují stíny, kdežto vysoké hodnoty zesílí efekt v jasných tónech. -TP_DIRPYRDENOISE_LAB;L*a*b* -TP_DIRPYRDENOISE_LABEL;Redukce šumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Křivka jasů -TP_DIRPYRDENOISE_LDETAIL;Jas - Detail -TP_DIRPYRDENOISE_LM;Pouze jas -TP_DIRPYRDENOISE_LPLABM;Vyvážená L* (trochu) + a*b* (normální) -TP_DIRPYRDENOISE_LTYPE;Ovládání jasu -TP_DIRPYRDENOISE_LUMA;Jas -TP_DIRPYRDENOISE_LUMAFR;Jas -TP_DIRPYRDENOISE_MAN;Ručně -TP_DIRPYRDENOISE_MANU;Ručně -TP_DIRPYRDENOISE_MED;Filtr medián -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediánu -TP_DIRPYRDENOISE_MEDTYPE;Typ mediánu -TP_DIRPYRDENOISE_METHOD;Metoda -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 okna. Čím větší velikost okna, tím déle bude zpracování trvat.\n\n3×3 jemný: upraví 5 pixelů v okně 3x3 pixely.\n3×3: upraví 9 pixelů v okně 3x3 pixely.\n5×5 jemný; upraví 13 pixelů v okně 5x5 pixelů.\n5×5: upraví 25 pixelů v okně 5x5 pixelů.\n7×7: upraví 49 pixelů v okně 7x7 pixelů.\n9×9: upraví 81 pixelů v okně 9x9 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šími okny než jedním průběhem s velkým oknem. -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í tří průchodů filtru medián s oknem 3×3 často vede k lepšímu výsledku než jednou aplikovaný filtr medián s oknem 7×7. -TP_DIRPYRDENOISE_PON;Více zónová automatika -TP_DIRPYRDENOISE_PRE;Více zónový náhled -TP_DIRPYRDENOISE_PREV;Náhled -TP_DIRPYRDENOISE_PREVLABEL;Velikost náhledu=%1, Střed: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Barevnost - Červená a zelená -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Běžná -TP_DIRPYRDENOISE_SHALBI;Vysoká +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Ovládání jasu +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Křivka jasů +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Jas - Detail +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Jas +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Jas +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukce šumu +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gama +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gama ovlivňuje sílu redukce šumu v rozsahu tónů. Menší hodnoty ovlivňují stíny, kdežto vysoké hodnoty zesílí efekt v jasných tónech. +TP_DIRPYRDENOISE_MAIN_MODE;Kvalita +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Vysoká +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Běžná +TP_DIRPYRDENOISE_MAIN_MODE_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_MEDIAN_METHOD;Metoda mediánu +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Pouze barevnost +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr medián +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Pouze jas +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Vyvážená L* (trochu) + a*b* (normální) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Počet průchodů mediánu +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Aplikování tří průchodů filtru medián s oknem 3×3 často vede k lepšímu výsledku než jednou aplikovaný filtr medián s oknem 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Typ mediánu +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Aplikuje filtr medián požadované velikosti okna. Čím větší velikost okna, tím déle bude zpracování trvat.\n\n3×3 jemný: upraví 5 pixelů v okně 3x3 pixely.\n3×3: upraví 9 pixelů v okně 3x3 pixely.\n5×5 jemný; upraví 13 pixelů v okně 5x5 pixelů.\n5×5: upraví 25 pixelů v okně 5x5 pixelů.\n7×7: upraví 49 pixelů v okně 7x7 pixelů.\n9×9: upraví 81 pixelů v okně 9x9 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šími okny než jedním průběhem s velkým oknem. TP_DIRPYRDENOISE_SLI;Posuvník -TP_DIRPYRDENOISE_TILELABEL;Velikost dlaždice=%1, Střed: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 jemný +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 jemný +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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ů. TP_DIRPYREQUALIZER_ARTIF;Omezení artefaktů @@ -2218,17 +2208,30 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_SLIDER;Slider +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_493;L*a*b* Adjustments !HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount !HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PREFERENCES_EDITORCMDLINE;Custom command line +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average !TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 50c6496a6..1a61b82f3 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index d6d729093..eb390b5bf 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -468,7 +468,6 @@ HISTORY_MSG_169;(L*a*b*) - CH-Kurve HISTORY_MSG_170;(Dynamik) - HH-Kurve HISTORY_MSG_171;(L*a*b*) - LC-Kurve HISTORY_MSG_172;(L*a*b*) - LC-Kurve\nbeschränken -HISTORY_MSG_173;(Rauschreduzierung)\nLuminanzdetails HISTORY_MSG_174;(CIECAM02) HISTORY_MSG_175;(CIECAM02) - Szene\nCAT02-Adaptation HISTORY_MSG_176;(CIECAM02)\nBetrachtungsbed.\nUmgebung @@ -498,7 +497,6 @@ HISTORY_MSG_199;(CIECAM02) - Ausgabe-\nHistogramm anzeigen HISTORY_MSG_200;(CIECAM02)\nDynamikkompression HISTORY_MSG_201;(Rauschreduzierung)\nDelta-Chrominanz\nRot / Grün HISTORY_MSG_202;(Rauschreduzierung)\nDelta-Chrominanz\nBlau / Gelb -HISTORY_MSG_203;(Rauschreduzierung)\nMethode HISTORY_MSG_204;(Sensor-Matrix)\nFarbinterpolation\nLMMSE-Verbesserung HISTORY_MSG_205;(CIECAM02)\nBetrachtungsbed.\nHot / Bad-Pixelfilter HISTORY_MSG_206;(CIECAM02) - Szene\nAuto-Luminanz @@ -550,7 +548,6 @@ HISTORY_MSG_252;(Detailebenenkontrast)\nHautfarbtöne schützen HISTORY_MSG_253;(Detailebenenkontrast)\nArtefakte reduzieren HISTORY_MSG_254;(Detailebenenkontrast)\nHautfarbton HISTORY_MSG_255;(Rauschreduzierung)\nMedianfilter -HISTORY_MSG_256;(Rauschreduzierung)\nMediantyp HISTORY_MSG_257;(Farbanpassungen) HISTORY_MSG_258;(Farbanpassungen)\nFarbkurve HISTORY_MSG_259;(Farbanpassungen)\nDeckkraftkurve @@ -591,7 +588,6 @@ HISTORY_MSG_293;(Filmsimulation) HISTORY_MSG_294;(Filmsimulation)\nIntensität HISTORY_MSG_295;(Filmsimulation) - Film HISTORY_MSG_296;(Rauschreduzierung)\nLuminanzkurve -HISTORY_MSG_297;(Rauschreduzierung)\nQualität HISTORY_MSG_298;(Vorverarbeitung)\nDead-Pixel-Filter HISTORY_MSG_299;(Rauschreduzierung)\nChrominanzkurve HISTORY_MSG_300;- @@ -1495,68 +1491,62 @@ TP_DARKFRAME_LABEL;Dunkelbild TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwelle -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 -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Bewertung des Farbrauschens.\nDie Bewertung ist ungenau und sehr subjektiv! -TP_DIRPYRDENOISE_BLUE;Delta-Chrominanz Blau / Gelb -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. -TP_DIRPYRDENOISE_CCCURVE;Chrominanzkurve -TP_DIRPYRDENOISE_CHROMA;Chrominanz (Master) -TP_DIRPYRDENOISE_CHROMAFR;Chrominanz -TP_DIRPYRDENOISE_CTYPE;Methode -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nAbhängig von der Bildgröße, wird das Bild in ca. 10 bis 70\nKacheln aufgeteilt. Für jede Kachel wird die Chrominanz-\nRauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. -TP_DIRPYRDENOISE_CUR;Kurve -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Farbe -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Erhöht den Wert aller Chrominanz-Regler und\nregelt die Chrominanz-Rauschreduzierung als\nFunktion der Chromatizität. Die Intensität kann über\nKontrollpunkte für schwach bis intensiv gesättigte\nFarben unterschiedlich eingestellt werden. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduliert die Wirkung der Luminanz-Rauschreduzierung +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto-Multizonen +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisch Global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Bewertung des Farbrauschens.\nDie Bewertung ist ungenau und sehr subjektiv! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Delta-Chrominanz Blau / Gelb +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominanzkurve +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominanz +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Benutzerdefiniert +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominanz (Master) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Methode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nAbhängig von der Bildgröße, wird das Bild in ca. 10 bis 70\nKacheln aufgeteilt. Für jede Kachel wird die Chrominanz-\nRauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Vorschau +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Vorschau +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs\nin 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.\nDie RGB-Werte sind ungenauer, da der RGB-Modus\nLuminanz und Chrominanz nicht komplett trennt. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Vorschaugröße = %1, Zentrum: Px = %2 Py = %2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Rauschen: Mittelwert = %1 Hoch = %2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Rauschen: Mittelwert = --- Hoch = --- +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Kachelgröße = %1 Zentrum: Tx = %2 Ty = %2 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Delta-Chrominanz Rot / Grün TP_DIRPYRDENOISE_ENH;Erweiterter Modus TP_DIRPYRDENOISE_ENH_TOOLTIP;Erhöht die Qualität der Rauschreduzierung auf Kosten einer um 20% erhöhten Verarbeitungszeit. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Mit Gamma kann die Intensität der\nRauschreduzierung über den Farbbereich\nvariiert werden. Bei kleinen Werten sind\nnur dunkle Farbtöne betroffen, bei\ngrößeren Werten wird der Effekt auf\nhellere Töne ausgeweitet. -TP_DIRPYRDENOISE_LAB;L*a*b* -TP_DIRPYRDENOISE_LABEL;Rauschreduzierung -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminanzkurve -TP_DIRPYRDENOISE_LDETAIL;Luminanzdetails -TP_DIRPYRDENOISE_LM;Nur Luminanz -TP_DIRPYRDENOISE_LPLABM;Gewichtet L* (wenig) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Luminanzkontrolle -TP_DIRPYRDENOISE_LUMA;Luminanz -TP_DIRPYRDENOISE_LUMAFR;Luminanz -TP_DIRPYRDENOISE_MAN;Benutzerdefiniert -TP_DIRPYRDENOISE_MANU;Benutzerdefiniert -TP_DIRPYRDENOISE_MED;Medianfilter -TP_DIRPYRDENOISE_MEDMETHOD;Medianmethode -TP_DIRPYRDENOISE_MEDTYPE;Mediantyp -TP_DIRPYRDENOISE_METHOD;Methode -TP_DIRPYRDENOISE_METHOD11;Qualität -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Einstellung der Qualität der Rauschreduzierung.\nDie Einstellung “Hoch“ verbessert die Rausch-\nreduzierung auf Kosten der Verarbeitungszeit. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Für RAW-Bilder kann entweder die RGB-\noder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der\nAuswahl immer die L*a*b*-Methode verwendet. -TP_DIRPYRDENOISE_METM_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. -TP_DIRPYRDENOISE_MET_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe 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\nin 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.\nDie RGB-Werte sind ungenauer, da der RGB-Modus\nLuminanz und Chrominanz nicht komplett trennt. -TP_DIRPYRDENOISE_PASSES;Medianiterationen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. -TP_DIRPYRDENOISE_PON;Auto-Multizonen -TP_DIRPYRDENOISE_PRE;Vorschau -TP_DIRPYRDENOISE_PREV;Vorschau -TP_DIRPYRDENOISE_PREVLABEL;Vorschaugröße = %1, Zentrum: Px = %2 Py = %2 -TP_DIRPYRDENOISE_RED;Delta-Chrominanz Rot / Grün -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Hoch +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanzkontrolle +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminanzdetails +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminanz +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanz +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Methode +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Rauschreduzierung +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Für RAW-Bilder kann entweder die RGB-\noder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der\nAuswahl immer die L*a*b*-Methode verwendet. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Mit Gamma kann die Intensität der\nRauschreduzierung über den Farbbereich\nvariiert werden. Bei kleinen Werten sind\nnur dunkle Farbtöne betroffen, bei\ngrößeren Werten wird der Effekt auf\nhellere Töne ausgeweitet. +TP_DIRPYRDENOISE_MAIN_MODE;Qualität +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoch +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Einstellung der Qualität der Rauschreduzierung.\nDie Einstellung “Hoch“ verbessert die Rausch-\nreduzierung auf Kosten der Verarbeitungszeit. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Medianmethode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Nur Farbe +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Medianfilter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Nur Luminanz +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewichtet L* (wenig) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Medianiterationen +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Mediantyp +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe 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_SLI;Regler -TP_DIRPYRDENOISE_TILELABEL;Kachelgröße = %1 Zentrum: Tx = %2 Ty = %2 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 weich +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 weich +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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. TP_DIRPYREQUALIZER_ARTIF;Artefakte reduzieren @@ -2240,5 +2230,18 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_SLIDER;Slider +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!PREFERENCES_EDITORCMDLINE;Custom command line +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average !TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index abae3e387..acd3a09e2 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -13,6 +13,7 @@ HISTORY_MSG_155;Vib - Avoid colour shift HISTORY_MSG_191;CAM02 - Colourfulness (M) HISTORY_MSG_197;CAM02 - Colour curve HISTORY_MSG_198;CAM02 - Colour curve +HISTORY_MSG_203;NR - Colour space HISTORY_MSG_221;B&W - Colour filter HISTORY_MSG_240;GF - Centre HISTORY_MSG_245;VC - Centre @@ -70,9 +71,10 @@ TP_COLORTONING_SPLITCOCO;Colour Balance Shadows/Midtones/Highlights TP_COLORTONING_SPLITLR;Saturation 2 colours TP_COLORTONING_TWO2;Special chroma '2 colours' 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 colours:\nMore predictable. -TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_PREVLABEL;Preview size=%1, Centre: Px=%2 Py=%3 -TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Centre: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Colour space TP_DIRPYREQUALIZER_ALGO;Skin Colour Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimizing the action on other colours\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image. @@ -335,6 +337,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -515,7 +518,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -542,7 +545,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -591,7 +593,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_259;CT - Opacity curve !HISTORY_MSG_260;CT - a*[b*] opacity !HISTORY_MSG_261;CT - Method @@ -630,7 +632,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -813,6 +815,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1076,6 +1079,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor @@ -1481,65 +1485,59 @@ 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_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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. @@ -1703,6 +1701,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index bc6c596c4..0dfbba9e4 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -235,6 +235,7 @@ !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -422,7 +423,7 @@ !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -452,7 +453,7 @@ !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -504,7 +505,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -545,7 +546,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -731,6 +732,7 @@ !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -1006,6 +1008,7 @@ !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor @@ -1448,68 +1451,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1690,6 +1688,10 @@ !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 2cc758f06..c739ce2f6 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -442,7 +442,6 @@ HISTORY_MSG_169;Curva 'CM' HISTORY_MSG_170;Vib - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Restringe 'LC' -HISTORY_MSG_173;RR - Detalle en luminancia HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptación CAT02 HISTORY_MSG_176;CAM02 - Entorno de visualización @@ -472,7 +471,6 @@ HISTORY_MSG_199;CAM02 - Histogramas de salida HISTORY_MSG_200;CAMO2 - Mapeo tonal HISTORY_MSG_201;RR - Crominancia Ro,Ve HISTORY_MSG_202;RR - Crominancia Az,Am -HISTORY_MSG_203;RR - Método HISTORY_MSG_204;Pasos de mejora LMMSE HISTORY_MSG_205;CAM02 - Píxel caliente/muerto HISTORY_MSG_206;CAT02 - Luz de escena auto. @@ -524,7 +522,6 @@ HISTORY_MSG_252;CbDL - Tono de piel HISTORY_MSG_253;CbDL - Reducir elementos extraños HISTORY_MSG_254;CbDL - Matiz de piel HISTORY_MSG_255;RR - Filtro Median -HISTORY_MSG_256;RR - Tipo Median HISTORY_MSG_257;Tonificación de Color HISTORY_MSG_258;TC - Color HISTORY_MSG_259;TC - Opacidad @@ -565,7 +562,6 @@ HISTORY_MSG_293;Simulación de Fílmico HISTORY_MSG_294;Simulación de Fílmico - Intensidad HISTORY_MSG_295;Simulación de Fílmico - Filme HISTORY_MSG_296;RR - Modular luminancia -HISTORY_MSG_297;RR - Calidad HISTORY_MSG_298;Filtro Pixel Muerto HISTORY_NEWSNAPSHOT;Agregar HISTORY_NEWSNAPSHOT_TOOLTIP;Atajo: Alt-s @@ -1126,33 +1122,32 @@ TP_DARKFRAME_LABEL;Toma Negra TP_DEFRINGE_LABEL;Quitar borde púrpura TP_DEFRINGE_RADIUS;Radio TP_DEFRINGE_THRESHOLD;Umbral -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' +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominancia: Azul-Amarillo +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominancia: Maestra +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominancia: Rojo-Verde TP_DIRPYRDENOISE_ENH;Modo mejorado TP_DIRPYRDENOISE_ENH_TOOLTIP;Incrementa la calidad de la Reducción de Ruido a costa de un incremento de 20% en el tiempo de procesamiento -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma hace variar la fuerza de reducción del ruido a lo largo del rango tonal.\n\n Valores pequeños dirigen la reducción hacia las sombras, mientras que valores grandes extienden el efecto hasta los tonos brillantes -TP_DIRPYRDENOISE_LABEL;Reducción de ruido -TP_DIRPYRDENOISE_LABM;Lab -TP_DIRPYRDENOISE_LCURVE;Curva de Luminancia -TP_DIRPYRDENOISE_LDETAIL;Detalle en luminancia -TP_DIRPYRDENOISE_LM;Sólo luminancia -TP_DIRPYRDENOISE_LUMA;Luminancia -TP_DIRPYRDENOISE_MED;Median -TP_DIRPYRDENOISE_MEDMETHOD;Método Median -TP_DIRPYRDENOISE_MEDTYPE;Tipo Median -TP_DIRPYRDENOISE_METHOD;Método -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_PASSES;Iteracciones Median -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_LUMINANCE_CURVE;Curva de Luminancia +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detalle en luminancia +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Método +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Reducción de ruido +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma hace variar la fuerza de reducción del ruido a lo largo del rango tonal.\n\n Valores pequeños dirigen la reducción hacia las sombras, mientras que valores grandes extienden el efecto hasta los tonos brillantes +TP_DIRPYRDENOISE_MAIN_MODE;Calidad +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Alto +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Estándar +TP_DIRPYRDENOISE_MAIN_MODE_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_MEDIAN_METHOD;Método Median +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;Lab +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Sólo luminancia +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_PASSES;Iteracciones Median +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo Median 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 @@ -1532,8 +1527,13 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1718,6 +1718,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1792,6 +1793,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1879,41 +1881,38 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EPD_GAMMA;Gamma @@ -1937,6 +1936,10 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 712bde72f..d97b1865b 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 1bc815fbf..7d0ce60b8 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -419,7 +419,6 @@ HISTORY_MSG_169;Courbe 'CT' HISTORY_MSG_170;Vib. - Courbe HISTORY_MSG_171;Courbe 'LC' HISTORY_MSG_172;Lab - Restreindre 'LC' -HISTORY_MSG_173;Réd. Bruit - Détail Luminance HISTORY_MSG_174;Modèle d'Apparence de la Couleur 2002 HISTORY_MSG_175;CAM02 - Adaptation CAT02 HISTORY_MSG_176;CAM02 - Environ. de visionnage @@ -449,7 +448,6 @@ HISTORY_MSG_199;CAM02 - Histogrammes de sortie HISTORY_MSG_200;CAM02 - Compression tonale HISTORY_MSG_201;Réd. de bruit - Chrom. R,V HISTORY_MSG_202;Réd. de bruit - Chrom. B,J -HISTORY_MSG_203;Réd. de bruit - Méthode HISTORY_MSG_204;Niveau d'amélioration LMMSE HISTORY_MSG_205;CAM02 Pixels chauds/morts HISTORY_MSG_206;CAT02 - Luminosité de la scène auto @@ -501,7 +499,6 @@ HISTORY_MSG_252;CpND - Tons chair HISTORY_MSG_253;CpND - Réduction des artéfactes HISTORY_MSG_254;CpND - Teinte chair HISTORY_MSG_255;Réd. de bruit - Filtre médian -HISTORY_MSG_256;Réd. de bruit - Type de médiane HISTORY_MSG_257;Virage Partiel HISTORY_MSG_258;Virage Partiel - Couleur HISTORY_MSG_259;Virage Partiel - Opacité @@ -542,7 +539,6 @@ HISTORY_MSG_293;Simulation de Film HISTORY_MSG_294;Simulation de Film - Force HISTORY_MSG_295;Simulation de Film - Film HISTORY_MSG_296;Réd. de bruit - Courbe de luminance -HISTORY_MSG_297;Réd. de bruit - Qualité HISTORY_MSG_298;Filtre de pixel mort HISTORY_MSG_299;Réd. de bruit - Courbe de chrominance HISTORY_MSG_300;- @@ -1437,69 +1433,63 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 doux -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 doux -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Chroma uniquement -TP_DIRPYRDENOISE_AUT;Global automatique -TP_DIRPYRDENOISE_AUTO;Global automatique -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! -TP_DIRPYRDENOISE_BLUE;Chrominance - Bleu-Jaune -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAperçu\nAgit sur l'image entière.\nLa partie visible de l'image dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. -TP_DIRPYRDENOISE_CCCURVE;Courbe de chrominance -TP_DIRPYRDENOISE_CHROMA;Chrominance - Maître -TP_DIRPYRDENOISE_CHROMAFR;Chrominance -TP_DIRPYRDENOISE_CTYPE;Méthode -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAutomatique multi-zones\nPas d'aperçu - ne fonctionne que lors de l'enregistrement, mais utiliser la méthode "Aperçu" en faisant correspondre la taille et le centre de la tuile à la taille et au centre de l'aperçu, vous permet d'avoir une idée des résultats attendus.\nL'image est divisé en tuiles (entre 10 et 70 en fonction de la taille de l'image) et chaque tuile reçoit son propre réglage de réduction de bruit de chrominance.\n\nAperçu\nAgit sur l'image entière.\nLa partie de l'image visible dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. -TP_DIRPYRDENOISE_CUR;Courbe -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Augmente (multiplie) la valeur de tousles curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones peu saturées et pour la réduire dans ceux celles très saturées. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Module l'action du débruitage de 'Luminance' +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multi-zones auto +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Bleu-Jaune +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Courbe de chrominance +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuel +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Maître +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Méthode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAperçu\nAgit sur l'image entière.\nLa partie visible de l'image dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAutomatique multi-zones\nPas d'aperçu - ne fonctionne que lors de l'enregistrement, mais utiliser la méthode "Aperçu" en faisant correspondre la taille et le centre de la tuile à la taille et au centre de l'aperçu, vous permet d'avoir une idée des résultats attendus.\nL'image est divisé en tuiles (entre 10 et 70 en fonction de la taille de l'image) et chaque tuile reçoit son propre réglage de réduction de bruit de chrominance.\n\nAperçu\nAgit sur l'image entière.\nLa partie de l'image visible dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Aperçu multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Aperçu +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Taille de l'aperçu=%1, Centre: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Bruit de l'aperçu: Moyen=%1 Haut=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Bruit de l'aperçu: Moyen= - Haut= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Taille des tuiles =%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Rouge-Vert TP_DIRPYRDENOISE_ENH;Mode amélioré TP_DIRPYRDENOISE_ENH_TOOLTIP;Augmente la qualité du débruitage, mais augmente le temps de traitement d'environ 20% -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma fait varier la quantité de réduction de bruit sur l'échelle des tons. Les plus petites valeurs cibleront les ombres, les plus hautes valeurs cibleront les tons les plus clairs. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Réduction du bruit -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Courbe de luminance -TP_DIRPYRDENOISE_LDETAIL;Niveau de détails de Luminance -TP_DIRPYRDENOISE_LM;Luminance seulement -TP_DIRPYRDENOISE_LPLABM;L* pondéré (faiblement) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Contrôle de luminance -TP_DIRPYRDENOISE_LUMA;Luminance -TP_DIRPYRDENOISE_LUMAFR;Luminance -TP_DIRPYRDENOISE_MAN;Manuel -TP_DIRPYRDENOISE_MANU;Manuel -TP_DIRPYRDENOISE_MED;Filtre Médian -TP_DIRPYRDENOISE_MEDMETHOD;Méthode -TP_DIRPYRDENOISE_MEDTYPE;Type de médiane -TP_DIRPYRDENOISE_METHOD;Méthode -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 de "fenêtre" désirée. Plus cette taille est grande, plus cela prendra de temps.\n\n3×3 doux: traite 5 pixels dans une fenêtre de 3×3 pixels.\n3×3: traite 9 pixels dans une fenêtre de 3×3 pixels.\n5×5 doux: traite 13 pixels dans une fenêtre de 5×5 pixels.\n5×5: traite 25 pixels dans une fenêtre de 5×5 pixels.\n7×7: traite 49 pixels dans une fenêtre de 7×7 pixels.\n9×9: traite 81 pixels dans une fenêtre 9×9 pixels.\n\nIl est parfois possible d'atteindre une meilleurs qualité en appliquant plusieurs itérations d'une petite fenêtre qu'une seule itération d'une grande. -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_LUMINANCE_CONTROL;Contrôle de luminance +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Courbe de luminance +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Niveau de détails de Luminance +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Méthode +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Réduction du bruit +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RVB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma fait varier la quantité de réduction de bruit sur l'échelle des tons. Les plus petites valeurs cibleront les ombres, les plus hautes valeurs cibleront les tons les plus clairs. +TP_DIRPYRDENOISE_MAIN_MODE;Qualité +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Haut +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MAIN_MODE_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_MEDIAN_METHOD;Méthode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma uniquement +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtre Médian +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance seulement +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RVB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;L* pondéré (faiblement) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Itérations +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Appliquer trois itérations avec une taille de fenêtre de 3×3 aboutit souvent à de meilleurs résultats qu'une seule itération avec une taille de fenêtre de 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Type de médiane +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Applique un filtre médian de la taille de "fenêtre" désirée. Plus cette taille est grande, plus cela prendra de temps.\n\n3×3 doux: traite 5 pixels dans une fenêtre de 3×3 pixels.\n3×3: traite 9 pixels dans une fenêtre de 3×3 pixels.\n5×5 doux: traite 13 pixels dans une fenêtre de 5×5 pixels.\n5×5: traite 25 pixels dans une fenêtre de 5×5 pixels.\n7×7: traite 49 pixels dans une fenêtre de 7×7 pixels.\n9×9: traite 81 pixels dans une fenêtre 9×9 pixels.\n\nIl est parfois possible d'atteindre une meilleurs qualité en appliquant plusieurs itérations d'une petite fenêtre qu'une seule itération d'une grande. TP_DIRPYRDENOISE_PASSE;Itérations -TP_DIRPYRDENOISE_PASSES;Itérations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Appliquer trois itérations avec une taille de fenêtre de 3×3 aboutit souvent à de meilleurs résultats qu'une seule itération avec une taille de fenêtre de 7×7. -TP_DIRPYRDENOISE_PON;Multi-zones auto -TP_DIRPYRDENOISE_PRE;Aperçu multi-zones -TP_DIRPYRDENOISE_PREV;Aperçu -TP_DIRPYRDENOISE_PREVLABEL;Taille de l'aperçu=%1, Centre: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Chrominance - Rouge-Vert -TP_DIRPYRDENOISE_RGB;RVB -TP_DIRPYRDENOISE_RGBM;RVB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Haut TP_DIRPYRDENOISE_SLI;Curseur -TP_DIRPYRDENOISE_TILELABEL;Taille des tuiles =%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 doux +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 doux +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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 TP_DIRPYREQUALIZER_ARTIF;Réduire les artéfacts @@ -2177,6 +2167,11 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!GENERAL_SLIDER;Slider +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments @@ -2185,12 +2180,20 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PREFERENCES_EDITORCMDLINE;Custom command line +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average !TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_RCD;RCD diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index cc22986c2..f285260bf 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -574,6 +574,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -672,7 +673,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -702,7 +703,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -754,7 +755,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -795,7 +796,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -981,6 +982,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1174,6 +1176,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1523,68 +1526,63 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1740,6 +1738,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index bc5c94899..9c18d073a 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 3b577f9a8..b76058f76 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -386,7 +386,6 @@ HISTORY_MSG_169;Curva 'CH' HISTORY_MSG_170;Vividezza - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Limita LC -HISTORY_MSG_173;NR - Dettaglio di Luminanza HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adattamento CAT02 HISTORY_MSG_176;CAM02 - Ambiente di Visualizzazione @@ -416,7 +415,6 @@ HISTORY_MSG_199;CAM02 - Mostra negli istogrammi HISTORY_MSG_200;CAM02 - Tone mapping HISTORY_MSG_201;NR - Crominanza R,G HISTORY_MSG_202;NR - Crominanza B,Y -HISTORY_MSG_203;NR - Metodo HISTORY_MSG_204;Passaggi di miglioramento LMMSE HISTORY_MSG_205;CAM02 - Pixel Surriscaldati/Guasti HISTORY_MSG_206;CAT02 - Lum. automatica della scena @@ -992,20 +990,20 @@ TP_DARKFRAME_LABEL;Dark Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Raggio TP_DEFRINGE_THRESHOLD;Soglia -TP_DIRPYRDENOISE_BLUE;Crominanza - Blu-Giallo -TP_DIRPYRDENOISE_CHROMA;Crominanza (Principale) +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominanza - Blu-Giallo +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominanza (Principale) +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominanza - Rosso-Verde TP_DIRPYRDENOISE_ENH;Modalità Migliorata TP_DIRPYRDENOISE_ENH_TOOLTIP;Aumenta la qualità della riduzione rumore al costo di un incremento del 20% del tempo di elaborazione. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Riduzione Rumore -TP_DIRPYRDENOISE_LDETAIL;Dettaglio di Luminanza -TP_DIRPYRDENOISE_LUMA;Luminanza -TP_DIRPYRDENOISE_METHOD;Metodo -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Per immagini raw può essere usato il metodo RGB o Lab.\n\nPer immagini non raw verrà utilizzato il metodo Lab, indipendentemente dalla selezione. -TP_DIRPYRDENOISE_RED;Crominanza - Rosso-Verde -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Dettaglio di Luminanza +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanza +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metodo +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Riduzione Rumore +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Per immagini raw può essere usato il metodo RGB o Lab.\n\nPer immagini non raw verrà utilizzato il metodo Lab, indipendentemente dalla selezione. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. TP_DIRPYREQUALIZER_ALGO;Algoritmo Pelle TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: più simile ai colori dell'incarnato, minimizzando l'azione di altri colori\nAmpio: evita ulteriori artefatti TP_DIRPYREQUALIZER_HUESKIN;Tonalità della Pelle @@ -1363,9 +1361,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1406,7 +1407,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1592,6 +1593,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1663,6 +1665,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1786,54 +1789,50 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EPD_GAMMA;Gamma @@ -1863,6 +1862,10 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 4b60f4985..838878b00 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -430,7 +430,6 @@ HISTORY_MSG_169;L*a*b* CH カーブ HISTORY_MSG_170;自然な彩度 - カーブ HISTORY_MSG_171;L*a*b* LC カーブ HISTORY_MSG_172;LCの適用をレッドと肌色トーンだけに制限 -HISTORY_MSG_173;輝度ノイズ 細部の復元 HISTORY_MSG_174;CIE色の見えモデル2002 HISTORY_MSG_175;CAM02 - 色順応量 HISTORY_MSG_176;CAM02 - 観視の暗い周囲環境 @@ -460,7 +459,6 @@ HISTORY_MSG_199;CAM02 - カーブでCIECAM02出力のヒストグラムを表示 HISTORY_MSG_200;CAM02 - CIECAM02 Q でトーンマッピング HISTORY_MSG_201;色差 レッド/グリーン HISTORY_MSG_202;色差 ブルー/イエロー -HISTORY_MSG_203;ノイズ低減 - 方式 HISTORY_MSG_204;LMMSE 拡張処理 HISTORY_MSG_205;CAM02 ホット/バッドピクセル HISTORY_MSG_206;CAT02 - 自動で順応 @@ -512,7 +510,6 @@ HISTORY_MSG_252;CbDL 肌色の目標/保護 HISTORY_MSG_253;CbDL アーティファクトを軽減 HISTORY_MSG_254;CbDL 肌色の色相 HISTORY_MSG_255;ノイズ低減 - メディアン -HISTORY_MSG_256;ノイズ低減 - フィルターの種類 HISTORY_MSG_257;カラートーン調整 HISTORY_MSG_258;カラートーン調整 - カラーのカーブ HISTORY_MSG_259;カラートーン調整 - 不透明度のカーブ @@ -553,7 +550,6 @@ HISTORY_MSG_293;フィルムシミュレーション HISTORY_MSG_294;フィルムシミュレーション - 強さ HISTORY_MSG_295;フィルムシミュレーション - フィルム HISTORY_MSG_296;輝度ノイズ低減のカーブ -HISTORY_MSG_297;ノイズ低減 - 質 HISTORY_MSG_298;デッドピクセルフィルター HISTORY_MSG_299;色ノイズ低減のカーブ HISTORY_MSG_300;- @@ -1049,7 +1045,7 @@ PROFILEPANEL_TOOLTIPSAVE;現在のプロファイルを保存\nCtrl-クリック PROGRESSBAR_LOADING;画像読み込み中... PROGRESSBAR_LOADINGTHUMBS;サムネイルの読み込み... PROGRESSBAR_LOADJPEG;JPEGファイル読み込み中... -PROGRESSBAR_LOADPNG;;PNGファイル読み込み中... +PROGRESSBAR_LOADPNG;PNGファイル読み込み中... PROGRESSBAR_LOADTIFF;TIFFファイル読み込み中... PROGRESSBAR_NOIMAGES;画像が見つかりません PROGRESSBAR_PROCESSING;画像処理中... @@ -1293,60 +1289,54 @@ TP_DARKFRAME_LABEL;ダークフレーム TP_DEFRINGE_LABEL;フリンジ低減 TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 -TP_DIRPYRDENOISE_ABM;色ノイズだけ -TP_DIRPYRDENOISE_AUT;自動(分割方式) -TP_DIRPYRDENOISE_AUTO;自動(分割方式) -TP_DIRPYRDENOISE_AUTO_TOOLTIP;色ノイズ低減の効果を確認して下さい\n注意:設定値の計算はあくまで平均的なもので、かなり主観的でです -TP_DIRPYRDENOISE_BLUE;色差 ブルー/イエロー -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います -TP_DIRPYRDENOISE_CCCURVE;色ノイズ低減のカーブ -TP_DIRPYRDENOISE_CHROMA;色(マスター) -TP_DIRPYRDENOISE_CHROMAFR;色ノイズ -TP_DIRPYRDENOISE_CTYPE;色ノイズの調整法 -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(多分割方式)\nプレビュー画像には反映されません-保存画像だけに反映されます。但し、タイルサイズとその中心をプレビューサイズとその中心にマッチさせる〝プレビュー”方式を使えば、効果がどれ位か予測がつきます。\n画像をタイル状に分割し(タイル数は画像サイズ次第で、10~70枚になります)、各タイルにあった色ノイズ低減の設定を自動で行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います -TP_DIRPYRDENOISE_CUR;カーブ -TP_DIRPYRDENOISE_CURVEEDITOR_CC;色度 -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;色度のスライダーの値を全て増やします(乗数)\nこれは色度に応じて色ノイズの低減効果の強弱を調節するカーブです。例えば、色度の低い部分で低減効果を高めるとか、色度の高い部分で低減効果を緩める、という具合です。 -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;‘輝度’の位置でノイズ低減の強さを加減します +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式) +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;自動(分割方式) +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;色ノイズ低減の効果を確認して下さい\n注意:設定値の計算はあくまで平均的なもので、かなり主観的でです +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;色差 ブルー/イエロー +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;色ノイズ低減のカーブ +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色ノイズ +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;手動 +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;色(マスター) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;色ノイズの調整法 +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(多分割方式)\nプレビュー画像には反映されません-保存画像だけに反映されます。但し、タイルサイズとその中心をプレビューサイズとその中心にマッチさせる〝プレビュー”方式を使えば、効果がどれ位か予測がつきます。\n画像をタイル状に分割し(タイル数は画像サイズ次第で、10~70枚になります)、各タイルにあった色ノイズ低減の設定を自動で行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;自動(プレビュー方式) +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;プレビュー方式 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;ウェーブレット変換後、プレビューで見える部分画像で残ったノイズのレベルを表示します\n\n>300以上 非常にノイズが多い\n100~300 ノイズが多い\n50~100 ノイズが少ない\n50以下 ノイズが非常に少ない\n\n算出値はRGBとL*a*b*モードでは異なります。RGBモードは輝度と色を完全に切り離すことが出来ないので、算出値の精度は劣ります。 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;プレビューのサイズ=%1, 中心: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;プレビューのノイズ: 中間色度=%1 高色度=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;プレビューのノイズ: 中間色度= - 高色度= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;色差 レッド/グリーン TP_DIRPYRDENOISE_ENH;強化モード TP_DIRPYRDENOISE_ENH_TOOLTIP;ノイズ低減の効果を髙めますが、代わりに演算時間が約20%増えます。 -TP_DIRPYRDENOISE_GAMMA;ガンマ -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;ガンマは、トーンの範囲全体でノイズ低減の量を変化させます。値が大きいほど明るいトーンに効果を及ぼし、値が小さいほどシャドウをターゲットにします -TP_DIRPYRDENOISE_LAB;L*a*b* -TP_DIRPYRDENOISE_LABEL;ノイズ低減 -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;輝度カーブ -TP_DIRPYRDENOISE_LDETAIL;輝度 細部の復元 -TP_DIRPYRDENOISE_LM;輝度のみ -TP_DIRPYRDENOISE_LPLABM;加重平均 L* (少なめ) + a*b* (普通) -TP_DIRPYRDENOISE_LTYPE;輝度ノイズの調整法 -TP_DIRPYRDENOISE_LUMA;輝度 -TP_DIRPYRDENOISE_LUMAFR;輝度ノイズ -TP_DIRPYRDENOISE_MAN;手動 -TP_DIRPYRDENOISE_MANU;手動 -TP_DIRPYRDENOISE_MED;メディアンフィルター -TP_DIRPYRDENOISE_MEDMETHOD;方式 -TP_DIRPYRDENOISE_MEDTYPE;フィルターの種類 -TP_DIRPYRDENOISE_METHOD;方式 -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_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_PON;自動(多分割方式) -TP_DIRPYRDENOISE_PRE;自動(プレビュー方式) -TP_DIRPYRDENOISE_PREV;プレビュー方式 -TP_DIRPYRDENOISE_PREVLABEL;プレビューのサイズ=%1, 中心: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;色差 レッド/グリーン -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;標準 -TP_DIRPYRDENOISE_SHALBI;高い +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;輝度ノイズの調整法 +TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;輝度 細部の復元 +TP_DIRPYRDENOISE_LUMINANCE_FRAME;輝度ノイズ +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;輝度 +TP_DIRPYRDENOISE_MAIN_COLORSPACE;方式 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;ノイズ低減 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;raw画像は、RGBまたはL*a*b*方式のいずれかを使用することができます。\n\nraw以外の画像は、選択にかかわらずL*a*b*方式が採用されます +TP_DIRPYRDENOISE_MAIN_GAMMA;ガンマ +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;ガンマは、トーンの範囲全体でノイズ低減の量を変化させます。値が大きいほど明るいトーンに効果を及ぼし、値が小さいほどシャドウをターゲットにします +TP_DIRPYRDENOISE_MAIN_MODE;ノイズ低減の質 +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;高い +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;標準 +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;ノイズの状態に応じて低減効果の質を選べます:1-標準 2-高い\n2の方がノイズ低減効果は高くなりますが、その分処理時間が増えます。 +TP_DIRPYRDENOISE_MEDIAN_METHOD;方式 +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;色ノイズだけ +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;メディアンフィルター +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;輝度のみ +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;フィルタリングの方式で、"輝度のみ"と"L*a*b*"を選択した場合、メディアンフィルタリングはノイズ低減行程でウェーブレット変換が行われた直後に適用されます\n"RGB"モードの場合は、ノイズ低減行程の最後で適用されます +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;加重平均 L* (少なめ) + a*b* (普通) +TP_DIRPYRDENOISE_MEDIAN_PASSES;フィルタリングの繰り返し回数 +TP_DIRPYRDENOISE_MEDIAN_TYPE;フィルターの種類 TP_DIRPYRDENOISE_SLI;スライダー -TP_DIRPYRDENOISE_TILELABEL;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3 TP_DIRPYREQUALIZER_ALGO;肌色の範囲 TP_DIRPYREQUALIZER_ALGO_TOOLTIP;ファイン:撮影の肌色に近い部分に働くアルゴリズム、他の色への影響を最小限に抑えます\n広範: アーティファクトの増加を避けるアルゴリズムです TP_DIRPYREQUALIZER_ARTIF;アーティファクトを軽減 @@ -1891,8 +1881,13 @@ 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 +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast @@ -1969,6 +1964,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -2013,6 +2009,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !PREFERENCES_CMMBPC;Black point compensation !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_LANG;Language !PREFERENCES_MONINTENT;Default rendering intent @@ -2057,14 +2054,16 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) !TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance -!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. +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE_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_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !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_BPC;Black Point Compensation @@ -2075,6 +2074,10 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_RAWCACORR_CASTR;Strength !TP_RAW_1PASSMEDIUM;1-Pass (Medium) diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index e77e90377..b76f4353f 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 82060a2ca..b2d93337f 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -650,10 +650,10 @@ TP_DARKFRAME_LABEL;Fekete referenciakép (dark frame) TP_DEFRINGE_LABEL;Színihiba-javítás (defringe) TP_DEFRINGE_RADIUS;Sugár TP_DEFRINGE_THRESHOLD;Küszöb -TP_DIRPYRDENOISE_CHROMA;Színzaj -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_LABEL;Zajcsökkentés -TP_DIRPYRDENOISE_LUMA;Luminancia +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Színzaj +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Zajcsökkentés +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma TP_DIRPYREQUALIZER_LABEL;Kontraszt részletek szerint TP_DIRPYREQUALIZER_LUMACOARSEST;Durva részletek TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontraszt- @@ -935,6 +935,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. @@ -946,7 +947,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -976,7 +977,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1028,7 +1029,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1069,7 +1070,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1255,6 +1256,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1371,6 +1373,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 @@ -1668,64 +1671,60 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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 -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1829,6 +1828,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index cb7c85eb6..282cd318b 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -431,7 +431,6 @@ HISTORY_MSG_169;L*a*b* - CH curve HISTORY_MSG_170;Levendigheid curve HISTORY_MSG_171;L*a*b* - LC curve HISTORY_MSG_172;L*a*b* - Beperk LC -HISTORY_MSG_173;RO - Luminantie Detail HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 toepassing HISTORY_MSG_176;CAM02 - Weergave omgeving @@ -461,7 +460,6 @@ HISTORY_MSG_199;CAM02 - Toont in histogram HISTORY_MSG_200;CAM02 - Tonemapping HISTORY_MSG_201;RO - Chromin. rood-groen HISTORY_MSG_202;RO - Chromin. blauw-geel -HISTORY_MSG_203;RO - Methode HISTORY_MSG_204;LMMSE Verbetering HISTORY_MSG_205;CAM02 hete/dode pixels HISTORY_MSG_206;CAT02 - Opname Lum. Auto @@ -513,7 +511,6 @@ HISTORY_MSG_252;DC - Huidtonen HISTORY_MSG_253;DC - Verminder artefacten HISTORY_MSG_254;DC - Huidtint HISTORY_MSG_255;DC - Algoritme -HISTORY_MSG_256;RO - Mediaan Type HISTORY_MSG_257;Kleurtint HISTORY_MSG_258;KT - Kleur curve HISTORY_MSG_259;KT - Dekking @@ -554,7 +551,6 @@ HISTORY_MSG_293;Film Simuleren HISTORY_MSG_294;Film - Sterkte HISTORY_MSG_295;Film - Film HISTORY_MSG_296;RO - Luminantie curve -HISTORY_MSG_297;RO - Kwaliteit HISTORY_MSG_298;Dode pixels filter HISTORY_MSG_299;RO - Chrominantie curve HISTORY_MSG_300;- @@ -1401,69 +1397,63 @@ TP_DARKFRAME_LABEL;Donkerframe TP_DEFRINGE_LABEL;Verzachten (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Straal TP_DEFRINGE_THRESHOLD;Drempel -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 zacht -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 zacht -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Alleen chroma -TP_DIRPYRDENOISE_AUT;Automatisch algemeen -TP_DIRPYRDENOISE_AUTO;Automatisch algemeen -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Probeert chroma ruis te bepalen\nWees voorzichtig, deze berekening is een gemiddelde en kan subjectief zijn! -TP_DIRPYRDENOISE_BLUE;Chrominantie Blauw & Geel -TP_DIRPYRDENOISE_C2TYPE_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\nVoorbeeld\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_CCCURVE;Chrominantie curve -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 +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zone +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisch algemeen +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Probeert chroma ruis te bepalen\nWees voorzichtig, deze berekening is een gemiddelde en kan subjectief zijn! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominantie Blauw & Geel +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominantie curve +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominantie +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Handmatig +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominantie (master) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Auto methode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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\nVoorbeeld\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_CHROMINANCE_METHOD_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_CHROMINANCE_PMZ;Voorbeeld multi-zone +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Voorbeeld +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Voorbeeld grootte=%1, Centrum: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominantie Rood & Groen 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 -TP_DIRPYRDENOISE_LDETAIL;Luminantie Detail -TP_DIRPYRDENOISE_LM;Alleen Luminantie -TP_DIRPYRDENOISE_LPLABM;Gewogen L* (weinig) + a*b* (normaal) -TP_DIRPYRDENOISE_LTYPE;Type gereedschap -TP_DIRPYRDENOISE_LUMA;Luminantie -TP_DIRPYRDENOISE_LUMAFR;Luminantie -TP_DIRPYRDENOISE_MAN;Handmatig -TP_DIRPYRDENOISE_MANU;Handmatig -TP_DIRPYRDENOISE_MED;Mediaan filter -TP_DIRPYRDENOISE_MEDMETHOD;Methode -TP_DIRPYRDENOISE_MEDTYPE;Type -TP_DIRPYRDENOISE_METHOD;Methode -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;Gebruik een mediaan filter van gewenste venster grootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandeld 5 pixels in een 3×3 pixel venster.\n3×3: behandeld 9 pixels in een 3×3 pixel venster.\n5×5 zacht: behandeld 13 pixels in een 5×5 pixel venster.\n5×5: behandeld 25 pixels in een 5×5 pixel venster.\n7×7: behandeld 49 pixels in een 7×7 pixel venster.\n9×9: behandeld 81 pixels in a 9×9 pixel venster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. -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_LUMINANCE_CONTROL;Type gereedschap +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminantie curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminantie Detail +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminantie +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminantie +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Methode +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Ruisonderdrukking +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Kwaliteit +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoog +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standaard +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd +TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Alleen chroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Mediaan filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Alleen Luminantie +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Gewogen L* (weinig) + a*b* (normaal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Mediaan herhalingen +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Het gebruik van drie mediaan filter herhalingen met een 3×3 venster grootte geeft meestal een beter resultaat dan het gebruik van één mediaan filter herhaling met eeen 7×7 venster grootte. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Gebruik een mediaan filter van gewenste venster grootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandeld 5 pixels in een 3×3 pixel venster.\n3×3: behandeld 9 pixels in een 3×3 pixel venster.\n5×5 zacht: behandeld 13 pixels in een 5×5 pixel venster.\n5×5: behandeld 25 pixels in een 5×5 pixel venster.\n7×7: behandeld 49 pixels in een 7×7 pixel venster.\n9×9: behandeld 81 pixels in a 9×9 pixel venster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. TP_DIRPYRDENOISE_PASSE;Herhalingen -TP_DIRPYRDENOISE_PASSES;Mediaan herhalingen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Het gebruik van drie mediaan filter herhalingen met een 3×3 venster grootte geeft meestal een beter resultaat dan het gebruik van één mediaan filter herhaling met eeen 7×7 venster grootte. -TP_DIRPYRDENOISE_PON;Auto multi-zone -TP_DIRPYRDENOISE_PRE;Voorbeeld multi-zone -TP_DIRPYRDENOISE_PREV;Voorbeeld -TP_DIRPYRDENOISE_PREVLABEL;Voorbeeld grootte=%1, Centrum: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Chrominantie Rood & Groen -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standaard -TP_DIRPYRDENOISE_SHALBI;Hoog TP_DIRPYRDENOISE_SLI;Schuifbalk -TP_DIRPYRDENOISE_TILELABEL;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 zacht +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 zacht +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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 @@ -2137,7 +2127,12 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !DONT_SHOW_AGAIN;Don't show this message again. !EXIFPANEL_SHOWALL;Show all +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_475;PS - Equalize channel !HISTORY_MSG_476;CAM02 - Temp out @@ -2163,6 +2158,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters @@ -2174,6 +2170,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_LANG;Language !PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file @@ -2196,11 +2193,17 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) !TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 2106de2da..30d94cc27 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -574,6 +574,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -672,7 +673,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -702,7 +703,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -754,7 +755,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -795,7 +796,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -981,6 +982,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1174,6 +1176,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1523,68 +1526,63 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1740,6 +1738,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index e6aa12154..780de385a 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -390,7 +390,6 @@ HISTORY_MSG_169;L*a*b* - Krzywa CH HISTORY_MSG_170;Jaskrawość - Krzywa HH HISTORY_MSG_171;L*a*b* - Krzywa LC HISTORY_MSG_172;L*a*b* - Ogranicz LC -HISTORY_MSG_173;RS - Szczegóły luminancji HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptacja CAT02 HISTORY_MSG_176;CAM02 - Otoczenie @@ -420,7 +419,6 @@ HISTORY_MSG_199;CAM02 - Histogramy wyjściowe HISTORY_MSG_200;CAMO2 - Tone mapping HISTORY_MSG_201;RS - Chrominancja - R&G HISTORY_MSG_202;RS - Chrominancja - B&Y -HISTORY_MSG_203;RS - Metoda HISTORY_MSG_204;Kroki poprawy LMMSE HISTORY_MSG_205;CAM02 - Gorące/uszkodzone px HISTORY_MSG_206;CAT02 - Auto luminancja sceny @@ -472,7 +470,6 @@ HISTORY_MSG_252;KwgPS - Odcienie skóry HISTORY_MSG_253;KwgPS - Redukcja błędów HISTORY_MSG_254;KwgPS - Odcienie skóry HISTORY_MSG_255;RS - Filtr mediana -HISTORY_MSG_256;RS - Wielkość okna mediana HISTORY_MSG_257;Koloryzacja HISTORY_MSG_258;Koloryzacja - Kolor HISTORY_MSG_259;Koloryzacja - Przezroczystość @@ -513,7 +510,6 @@ HISTORY_MSG_293;Symulacja Kliszy HISTORY_MSG_294;Symulacja Kliszy - Siła HISTORY_MSG_295;Symulacja Kliszy - Klisza HISTORY_MSG_296;RS - Modulacja luminancji -HISTORY_MSG_297;RS - Jakość HISTORY_MSG_298;Filtrowanie martwych pikseli HISTORY_NEWSNAPSHOT;Nowa migawka HISTORY_NEWSNAPSHOT_TOOLTIP;Skrót: Alt-s @@ -1081,33 +1077,32 @@ TP_DARKFRAME_LABEL;Czarna klatka TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promień TP_DEFRINGE_THRESHOLD;Próg -TP_DIRPYRDENOISE_BLUE;Chrominancja - Błękit-żółć -TP_DIRPYRDENOISE_CHROMA;Chrominancja - Główna -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje działanie usuwania szumów luminancji +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominancja - Błękit-żółć +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominancja - Główna +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominancja - Czerwień-zieleń TP_DIRPYRDENOISE_ENH;Tryb ulepszony TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakość usuwania szumów kosztem około 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma skupia siłę redukcji szumów na danym predziale zakresu tonalnego. Mniejsze wartości gamma powodują skupienie na ciemniejszych barwach, natomiast większe wartości rozciągną zakres działania również na barwy jasne. -TP_DIRPYRDENOISE_LABEL;Redukcja szumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Krzywa luminancji -TP_DIRPYRDENOISE_LDETAIL;Szczegółowość luminancji -TP_DIRPYRDENOISE_LM;Tylko luminancja -TP_DIRPYRDENOISE_LUMA;Luminacja -TP_DIRPYRDENOISE_MED;Filtr Mediana -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana -TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana -TP_DIRPYRDENOISE_METHOD;Metoda -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_PASSES;Liczba powtórzeń mediana -TP_DIRPYRDENOISE_RED;Chrominancja - Czerwień-zieleń -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standardowa -TP_DIRPYRDENOISE_SHALBI;Wysoka +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krzywa luminancji +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Szczegółowość luminancji +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminacja +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcja szumu +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma skupia siłę redukcji szumów na danym predziale zakresu tonalnego. Mniejsze wartości gamma powodują skupienie na ciemniejszych barwach, natomiast większe wartości rozciągną zakres działania również na barwy jasne. +TP_DIRPYRDENOISE_MAIN_MODE;Jakość +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Wysoka +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standardowa +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr Mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Tylko luminancja +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_PASSES;Liczba powtórzeń mediana +TP_DIRPYRDENOISE_MEDIAN_TYPE;Rodzaj mediana TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skóry TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcień skóry @@ -1489,8 +1484,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1675,6 +1675,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1740,6 +1741,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1827,41 +1829,38 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EPD_GAMMA;Gamma @@ -1884,6 +1883,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 89d222f1e..4a5c675d5 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -390,7 +390,6 @@ HISTORY_MSG_169;L*a*b* - Krzywa CH HISTORY_MSG_170;Jaskrawosc - Krzywa HH HISTORY_MSG_171;L*a*b* - Krzywa LC HISTORY_MSG_172;L*a*b* - Ogranicz LC -HISTORY_MSG_173;RS - Szczegoly luminancji HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptacja CAT02 HISTORY_MSG_176;CAM02 - Otoczenie @@ -420,7 +419,6 @@ HISTORY_MSG_199;CAM02 - Histogramy wyjsciowe HISTORY_MSG_200;CAMO2 - Tone mapping HISTORY_MSG_201;RS - Chrominancja - R&G HISTORY_MSG_202;RS - Chrominancja - B&Y -HISTORY_MSG_203;RS - Metoda HISTORY_MSG_204;Kroki poprawy LMMSE HISTORY_MSG_205;CAM02 - Gorace/uszkodzone px HISTORY_MSG_206;CAT02 - Auto luminancja sceny @@ -472,7 +470,6 @@ HISTORY_MSG_252;KwgPS - Odcienie skory HISTORY_MSG_253;KwgPS - Redukcja bledow HISTORY_MSG_254;KwgPS - Odcienie skory HISTORY_MSG_255;RS - Filtr mediana -HISTORY_MSG_256;RS - Wielkosc okna mediana HISTORY_MSG_257;Koloryzacja HISTORY_MSG_258;Koloryzacja - Kolor HISTORY_MSG_259;Koloryzacja - Przezroczystosc @@ -513,7 +510,6 @@ HISTORY_MSG_293;Symulacja Kliszy HISTORY_MSG_294;Symulacja Kliszy - Sila HISTORY_MSG_295;Symulacja Kliszy - Klisza HISTORY_MSG_296;RS - Modulacja luminancji -HISTORY_MSG_297;RS - Jakosc HISTORY_MSG_298;Filtrowanie martwych pikseli HISTORY_NEWSNAPSHOT;Nowa migawka HISTORY_NEWSNAPSHOT_TOOLTIP;Skrot: Alt-s @@ -1081,33 +1077,32 @@ TP_DARKFRAME_LABEL;Czarna klatka TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promien TP_DEFRINGE_THRESHOLD;Prog -TP_DIRPYRDENOISE_BLUE;Chrominancja - Blekit-zolc -TP_DIRPYRDENOISE_CHROMA;Chrominancja - Glowna -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje dzialanie usuwania szumow luminancji +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominancja - Blekit-zolc +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominancja - Glowna +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominancja - Czerwien-zielen TP_DIRPYRDENOISE_ENH;Tryb ulepszony TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakosc usuwania szumow kosztem okolo 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma skupia sile redukcji szumow na danym predziale zakresu tonalnego. Mniejsze wartosci gamma powoduja skupienie na ciemniejszych barwach, natomiast wieksze wartosci rozciagna zakres dzialania rowniez na barwy jasne. -TP_DIRPYRDENOISE_LABEL;Redukcja szumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Krzywa luminancji -TP_DIRPYRDENOISE_LDETAIL;Szczegolowosc luminancji -TP_DIRPYRDENOISE_LM;Tylko luminancja -TP_DIRPYRDENOISE_LUMA;Luminacja -TP_DIRPYRDENOISE_MED;Filtr Mediana -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana -TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana -TP_DIRPYRDENOISE_METHOD;Metoda -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_PASSES;Liczba powtorzen mediana -TP_DIRPYRDENOISE_RED;Chrominancja - Czerwien-zielen -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standardowa -TP_DIRPYRDENOISE_SHALBI;Wysoka +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krzywa luminancji +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Szczegolowosc luminancji +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminacja +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcja szumu +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma skupia sile redukcji szumow na danym predziale zakresu tonalnego. Mniejsze wartosci gamma powoduja skupienie na ciemniejszych barwach, natomiast wieksze wartosci rozciagna zakres dzialania rowniez na barwy jasne. +TP_DIRPYRDENOISE_MAIN_MODE;Jakosc +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Wysoka +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standardowa +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Jakosc moze zostac dopasowana do wzoru szumow. Ustawienie "wysoka" ulepsza odszumianie okolo 20% wzrostu czasu przetwarzania. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr Mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Tylko luminancja +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_PASSES;Liczba powtorzen mediana +TP_DIRPYRDENOISE_MEDIAN_TYPE;Rodzaj mediana TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skory TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcien skory @@ -1489,8 +1484,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1675,6 +1675,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1740,6 +1741,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1827,41 +1829,38 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_EPD_GAMMA;Gamma @@ -1884,6 +1883,10 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 488cff769..7b11028e9 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;Temperatura !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 9b6f8e4d8..95aa8cdce 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -385,7 +385,6 @@ HISTORY_MSG_169;Кривая 'ЦО' HISTORY_MSG_170;Рез: кривая HISTORY_MSG_171;Кривая 'ЯЦ' HISTORY_MSG_172;LAB: Ограничение 'ЯЦ' -HISTORY_MSG_173;ПШ: Детализация яркости HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02: Адаптация CAT02 HISTORY_MSG_176;CAM02: Условия просмотра @@ -415,7 +414,6 @@ HISTORY_MSG_199;CAM02: Выходная гистограмма HISTORY_MSG_200;CAM02: Тональное отображение HISTORY_MSG_201;ПШ: Цветность К,З HISTORY_MSG_202;ПШ: Цветность С,Ж -HISTORY_MSG_203;ПШ: Метод HISTORY_MSG_204;Шагов улучшения LMMSE HISTORY_MSG_205;CAM02: Горячие/битые пиксели HISTORY_MSG_206;CAT02: Автояркость сцены @@ -936,20 +934,20 @@ TP_DARKFRAME_LABEL;Темновой кадр TP_DEFRINGE_LABEL;Подавление ореолов TP_DEFRINGE_RADIUS;Радиус TP_DEFRINGE_THRESHOLD;Порог -TP_DIRPYRDENOISE_BLUE;Цветность: синий-жёлтый -TP_DIRPYRDENOISE_CHROMA;Цветность +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Цветность: синий-жёлтый +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Цветность +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Цветность: красный-зелёный TP_DIRPYRDENOISE_ENH;Улучшенный режим TP_DIRPYRDENOISE_ENH_TOOLTIP;Улучшает качество шумоподавления путём увеличения времени обработки на 20%. -TP_DIRPYRDENOISE_GAMMA;Гамма -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Значение гаммы изменяет диапазон тонов для подавления шума. Уменьшение значения влияет на тени, увеличение расширит эффект на более светлые тона. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Подавление шума -TP_DIRPYRDENOISE_LDETAIL;Детализация яркости -TP_DIRPYRDENOISE_LUMA;Яркость -TP_DIRPYRDENOISE_METHOD;Метод -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Для raw-изображений можно использовать как режим RGB так и Lab.\n\nДля не-raw будет использован Lab режим вне зависимости от выбора. -TP_DIRPYRDENOISE_RED;Цветность: красный-зелёный -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Детализация яркости +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Яркость +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Метод +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Подавление шума +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Для raw-изображений можно использовать как режим RGB так и Lab.\n\nДля не-raw будет использован Lab режим вне зависимости от выбора. +TP_DIRPYRDENOISE_MAIN_GAMMA;Гамма +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Значение гаммы изменяет диапазон тонов для подавления шума. Уменьшение значения влияет на тени, увеличение расширит эффект на более светлые тона. TP_DIRPYREQUALIZER_LABEL;Контраст по уровню деталей TP_DIRPYREQUALIZER_LUMACOARSEST;Крупные TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Контраст- @@ -1302,13 +1300,16 @@ ZOOMPANEL_ZOOMOUT;Удалить - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1349,7 +1350,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1535,6 +1536,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1617,6 +1619,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1780,54 +1783,50 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1865,6 +1864,10 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index a0745b12d..34fa8ba97 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -367,7 +367,6 @@ 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 - Околина приказа @@ -397,7 +396,6 @@ 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 - Аутоматска луминанса кадра @@ -957,19 +955,19 @@ TP_DARKFRAME_LABEL;Тамни кадар TP_DEFRINGE_LABEL;Уклаљање ореола TP_DEFRINGE_RADIUS;Полупречник TP_DEFRINGE_THRESHOLD;Праг -TP_DIRPYRDENOISE_BLUE;Хроминанса: Плава-Жута -TP_DIRPYRDENOISE_CHROMA;Боја +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Хроминанса: Плава-Жута +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Боја +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Хроминанса - црвена-зелена 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_RED;Хроминанса - црвена-зелена -TP_DIRPYRDENOISE_RGB;РГБ +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Детаљи луминансе +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Луминанса +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Начин +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Дирекционо пирамидно уклањање шума +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;РГБ +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;За рав слике можете користити РГБ или Лаб режиме.\n\nЗа остале слике се користи Лаб, без обзира на избор. +TP_DIRPYRDENOISE_MAIN_GAMMA;Гама +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Гама утиче на јачину уклањања шума преко опсег тонова. Мања вредност ће утицати на сенке, већа ће повећати овај ефекат и на светлије тонове. TP_DIRPYREQUALIZER_LABEL;Детаљни ниво контраста TP_DIRPYREQUALIZER_LUMACOARSEST;грубо TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Контраст- @@ -1336,12 +1334,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1382,7 +1383,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1568,6 +1569,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1649,6 +1651,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1778,55 +1781,51 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1865,6 +1864,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 00d47c71e..2db3daecd 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -367,7 +367,6 @@ 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 @@ -397,7 +396,6 @@ 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 @@ -957,19 +955,19 @@ TP_DARKFRAME_LABEL;Tamni kadar TP_DEFRINGE_LABEL;Uklaljanje oreola TP_DEFRINGE_RADIUS;Poluprečnik TP_DEFRINGE_THRESHOLD;Prag -TP_DIRPYRDENOISE_BLUE;Hrominansa: Plava-Žuta -TP_DIRPYRDENOISE_CHROMA;Boja +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Hrominansa: Plava-Žuta +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Boja +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Hrominansa - crvena-zelena 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_RED;Hrominansa - crvena-zelena -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detalji luminanse +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminansa +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Način +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Direkciono piramidno uklanjanje šuma +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gama +TP_DIRPYRDENOISE_MAIN_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_DIRPYREQUALIZER_LABEL;Detaljni nivo kontrasta TP_DIRPYREQUALIZER_LUMACOARSEST;grubo TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- @@ -1336,12 +1334,15 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1382,7 +1383,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1568,6 +1569,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1649,6 +1651,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip 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. @@ -1778,55 +1781,51 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_ABM;Chroma only -!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_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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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\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 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 -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1865,6 +1864,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index 0d388659c..b87e71c5d 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -398,10 +398,10 @@ TP_CROP_SELECTCROP; Vyberte Orez TP_CROP_W;Š TP_CROP_X;x TP_CROP_Y;y -TP_DIRPYRDENOISE_CHROMA;Farebnosť -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_LABEL;Redukcia šumu pomocou smerovej pyramídy -TP_DIRPYRDENOISE_LUMA;Svietivosť +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Farebnosť +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Svietivosť +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcia šumu pomocou smerovej pyramídy +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma TP_DIRPYREQUALIZER_LABEL;Vyrovnávač smerovej pyramídy TP_DIRPYREQUALIZER_LUMACOARSEST;Najhrubšie TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- @@ -648,6 +648,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. @@ -735,7 +736,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -765,7 +766,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -817,7 +818,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -858,7 +859,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1044,6 +1045,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1225,6 +1227,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) !PREFERENCES_FLATFIELDFOUND;Found @@ -1563,64 +1566,60 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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 -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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 -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1760,6 +1759,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 5a96989f8..2ed64181f 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -576,6 +576,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -674,7 +675,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -704,7 +705,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -756,7 +757,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -797,7 +798,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -983,6 +984,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1176,6 +1178,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1524,68 +1527,63 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1741,6 +1739,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index a09aff7c4..63d8781c8 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -401,7 +401,6 @@ HISTORY_MSG_169;'CH'-kurvan HISTORY_MSG_170;Lyster-kurvan HISTORY_MSG_171;'LC'-kurvan HISTORY_MSG_172;Begränsa LC till röda färger och hudtoner -HISTORY_MSG_173;Brusreducering - Luminansdetalj HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Cat02-anpassning HISTORY_MSG_176;CAM02 - Vyns mörka omgivning @@ -431,7 +430,6 @@ HISTORY_MSG_199;CAM02 - Utmatningshistogram HISTORY_MSG_200;CAM02 - Tonmappning HISTORY_MSG_201;NR - Krominans röd-grön HISTORY_MSG_202;NR - Krominans blå-gul -HISTORY_MSG_203;Brusreducering - metod HISTORY_MSG_204;LMMSE förbättringssteg HISTORY_MSG_205;CAM02 - Heta/dåliga pixlar HISTORY_MSG_206;CAT02 - Anpassa automatiskt till bilden @@ -483,7 +481,6 @@ HISTORY_MSG_252;CbDL Hudtoner HISTORY_MSG_253;CbDL Reducera artefakter HISTORY_MSG_254;CbDL - Nyans på hudtoner HISTORY_MSG_255;CbDL - Algoritm -HISTORY_MSG_256;NR - Median HISTORY_MSG_258;CT - Färgkurva HISTORY_MSG_259;CT - Opacitetskurva HISTORY_MSG_260;CT - a*[b*] opacitet @@ -521,7 +518,6 @@ HISTORY_MSG_293;Filmsimulering HISTORY_MSG_294;Filmsimulering - Styrka HISTORY_MSG_295;Filmsimulering - Film HISTORY_MSG_296;NR - Luminanskurva -HISTORY_MSG_297;NR - Kvalitet HISTORY_MSG_298;Filter för döda pixlar HISTORY_MSG_299;NR - Krominanskurva HISTORY_MSG_300;- @@ -1287,57 +1283,51 @@ TP_DARKFRAME_LABEL;Svartbild TP_DEFRINGE_LABEL;Fyll ut överstrålning TP_DEFRINGE_RADIUS;Radie TP_DEFRINGE_THRESHOLD;Tröskelvärde -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 mjuk -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 mjuk -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Endast chroma -TP_DIRPYRDENOISE_AUT;Automatisk global -TP_DIRPYRDENOISE_AUTO;Automatisk global -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 -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manuell\nVerkar på hela bilden.\nDu kontrollerar brusreduceringen manuellt.\n\nAutomatisk global\nVerkar på hela bilden.\n9 zoner används för att beräkna en global kroma-brusreducering.\n\nFörhandsgranskning\nVerkar på hela bilden.\nDen synliga delen av förhandsgranskningen används för att beräkna en global kroma-brusreducering. -TP_DIRPYRDENOISE_CCCURVE;Krominans-kurva -TP_DIRPYRDENOISE_CHROMA;Kroma -TP_DIRPYRDENOISE_CHROMAFR;Krominans -TP_DIRPYRDENOISE_CTYPE;Metod -TP_DIRPYRDENOISE_CUR;Kurva -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Kroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Öka (multiplicera) värdet av alla krominansreglage.\nDen här kurvan låter dig justera styrkan för den kromatiska brusreduceringen som en funktion av kromaticit, till exempel för att öka mängden i området med låg mättnad och för att minska det i de områden med hög mättnad. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulerar verkan av brusreduceringen för 'Luminans' +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisk global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_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_CHROMINANCE_BLUEYELLOW;Krominans - Blå-Gul +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Krominans-kurva +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Krominans +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuell +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Kroma +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metod +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuell\nVerkar på hela bilden.\nDu kontrollerar brusreduceringen manuellt.\n\nAutomatisk global\nVerkar på hela bilden.\n9 zoner används för att beräkna en global kroma-brusreducering.\n\nFörhandsgranskning\nVerkar på hela bilden.\nDen synliga delen av förhandsgranskningen används för att beräkna en global kroma-brusreducering. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Förhandsgranska multi-zon +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Förhandsgranska +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Förhandsgranska storlek=%1, Centrum: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Förhandsgranska brus: Medel=%1 Hög=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Förhandsgranska brus: Medel= - Hög= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile-storlek=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Krominans - Röd-Grön TP_DIRPYRDENOISE_ENH;Förbättrat läge TP_DIRPYRDENOISE_ENH_TOOLTIP;Ökar kvaliteten på brusreduceringen till priset av 20 % längre beräkningstid -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varierar brusreduceringens styrka över hela skalan av toner. Mindre värden riktar sig mot de mörka partierna i bilden, medan större värden utökar effekten till högdagrarna. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Brusreducering -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminans-kurva -TP_DIRPYRDENOISE_LDETAIL;Luminansdetalj -TP_DIRPYRDENOISE_LM;Endast luminans -TP_DIRPYRDENOISE_LPLABM;Viktad L* (litet) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Luminanskontroll -TP_DIRPYRDENOISE_LUMA;Luminans -TP_DIRPYRDENOISE_LUMAFR;Luminans -TP_DIRPYRDENOISE_MAN;Manuell -TP_DIRPYRDENOISE_MANU;Manuell -TP_DIRPYRDENOISE_METHOD;Metod -TP_DIRPYRDENOISE_METHOD11;Kvalitet -TP_DIRPYRDENOISE_METHOD_TOOLTIP;För råfiler kan antingen RGB- eller Labmetoder användas.\n\nFör icke-råfiler kommer Labmetoden att användas, oavsett vad som är valt. -TP_DIRPYRDENOISE_NOISELABEL;Förhandsgranska brus: Medel=%1 Hög=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Förhandsgranska brus: Medel= - Hög= - -TP_DIRPYRDENOISE_PRE;Förhandsgranska multi-zon -TP_DIRPYRDENOISE_PREV;Förhandsgranska -TP_DIRPYRDENOISE_PREVLABEL;Förhandsgranska storlek=%1, Centrum: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Krominans - Röd-Grön -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Hög +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanskontroll +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminans-kurva +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminansdetalj +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminans +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminans +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metod +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Brusreducering +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;För råfiler kan antingen RGB- eller Labmetoder användas.\n\nFör icke-råfiler kommer Labmetoden att användas, oavsett vad som är valt. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varierar brusreduceringens styrka över hela skalan av toner. Mindre värden riktar sig mot de mörka partierna i bilden, medan större värden utökar effekten till högdagrarna. +TP_DIRPYRDENOISE_MAIN_MODE;Kvalitet +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hög +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Endast chroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Endast luminans +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Viktad L* (litet) + a*b* (normal) TP_DIRPYRDENOISE_SLI;Reglage -TP_DIRPYRDENOISE_TILELABEL;Tile-storlek=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 mjuk +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 mjuk +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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 @@ -1899,10 +1889,15 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_288;Flat Field - Clip control !HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_310;W - Residual - Sky tar/prot !HISTORY_MSG_313;W - Chroma - Sat/past !HISTORY_MSG_316;W - Gamut - Skin tar/prot @@ -1962,6 +1957,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -2004,6 +2000,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_CMMBPC;Black point compensation !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. !PREFERENCES_LANG;Language @@ -2043,17 +2040,19 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_COLORTONING_LABEL;Color Toning !TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. !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_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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\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_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 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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_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. !TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera. !TP_FLATFIELD_CLIPCONTROL;Clip control @@ -2068,6 +2067,10 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_1PASSMEDIUM;1-Pass (Medium) !TP_RAW_3PASSBEST;3-Pass (Best) !TP_RAW_AHD;AHD diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index 8f307e05c..b60b3e38f 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -575,6 +575,7 @@ TP_WBALANCE_TEMPERATURE;Isı !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +674,7 @@ TP_WBALANCE_TEMPERATURE;Isı !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_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +704,7 @@ TP_WBALANCE_TEMPERATURE;Isı !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_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +756,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +797,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -982,6 +983,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast !HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1175,6 +1177,7 @@ TP_WBALANCE_TEMPERATURE;Isı !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_DIRDARKFRAMES;Dark-frames directory !PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) @@ -1523,68 +1526,63 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!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_ABM;Chroma only -!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_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -!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_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !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;Gamma -!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_LABEL;Noise Reduction -!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 -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!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 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 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 -!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 +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1740,6 +1738,10 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_LOCALCONTRAST_LABEL;Local Contrast !TP_LOCALCONTRAST_LIGHTNESS;Lightness level !TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !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 diff --git a/rtdata/languages/default b/rtdata/languages/default index 70bc0008c..92bbaa08f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -234,6 +234,7 @@ GENERAL_OK;OK GENERAL_OPEN;Open GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Save +GENERAL_SLIDER;Slider GENERAL_UNCHANGED;(Unchanged) GENERAL_WARNING;Warning GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -421,7 +422,7 @@ 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_173;NR - Detail recovery HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 adaptation HISTORY_MSG_176;CAM02 - Viewing surround @@ -451,7 +452,7 @@ 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_203;NR - Color space HISTORY_MSG_204;LMMSE enhancement steps HISTORY_MSG_205;CAM02 - Hot/bad pixel filter HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -503,7 +504,7 @@ HISTORY_MSG_252;CbDL - Skin tar/prot HISTORY_MSG_253;CbDL - Reduce artifacts HISTORY_MSG_254;CbDL - Skin hue HISTORY_MSG_255;NR - Median filter -HISTORY_MSG_256;NR - Median type +HISTORY_MSG_256;NR - Median - Type HISTORY_MSG_257;Color Toning HISTORY_MSG_258;CT - Color curve HISTORY_MSG_259;CT - Opacity curve @@ -544,7 +545,7 @@ HISTORY_MSG_293;Film Simulation HISTORY_MSG_294;Film Simulation - Strength HISTORY_MSG_295;Film Simulation - Film HISTORY_MSG_296;NR - Luminance curve -HISTORY_MSG_297;NR - Quality +HISTORY_MSG_297;NR - Mode HISTORY_MSG_298;Dead pixel filter HISTORY_MSG_299;NR - Chrominance curve HISTORY_MSG_300;- @@ -1449,68 +1450,63 @@ TP_DARKFRAME_LABEL;Dark-Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold -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_ABM;Chroma only -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_CHROMA;Chrominance - Master -TP_DIRPYRDENOISE_CHROMAFR;Chrominance -TP_DIRPYRDENOISE_CTYPE;Method -TP_DIRPYRDENOISE_CTYPE_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CUR;Curve -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_CHROMINANCE_AMZ;Auto multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_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_CHROMINANCE_METHOD_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\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\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_CHROMINANCE_PMZ;Preview multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_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_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green 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;Gamma -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_LABEL;Noise Reduction -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 -TP_DIRPYRDENOISE_LUMA;Luminance -TP_DIRPYRDENOISE_LUMAFR;Luminance -TP_DIRPYRDENOISE_MAN;Manual -TP_DIRPYRDENOISE_MANU;Manual -TP_DIRPYRDENOISE_MED;Median Filter -TP_DIRPYRDENOISE_MEDMETHOD;Median method -TP_DIRPYRDENOISE_MEDTYPE;Median type -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 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 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 -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 +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_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_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_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_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_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_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +TP_DIRPYRDENOISE_MEDIAN_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_MEDIAN_TYPE;Median type +TP_DIRPYRDENOISE_MEDIAN_TYPE_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_SLI;Slider -TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1691,10 +1687,10 @@ TP_LOCALCONTRAST_DARKNESS;Darkness level TP_LOCALCONTRAST_LABEL;Local Contrast TP_LOCALCONTRAST_LIGHTNESS;Lightness level TP_LOCALCONTRAST_RADIUS;Radius -TP_METADATA_MODE;Metadata copy mode -TP_METADATA_TUNNEL;Copy unchanged TP_METADATA_EDIT;Apply modifications +TP_METADATA_MODE;Metadata copy mode TP_METADATA_STRIP;Strip all metadata +TP_METADATA_TUNNEL;Copy unchanged 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 diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 2a90f183e..bb367becc 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -38,7 +38,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP std::vector defaultCurve; - Gtk::Frame* lumaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_LUMAFR")) ); + Gtk::Frame* lumaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_LUMINANCE_FRAME")) ); lumaFrame->set_label_align(0.025, 0.5); Gtk::VBox * lumaVBox = Gtk::manage ( new Gtk::VBox()); @@ -47,18 +47,18 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP ctboxL = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LTYPE") + ":")); + Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LUMINANCE_CONTROL") + ":")); ctboxL->pack_start (*labmL, Gtk::PACK_SHRINK, 1); Lmethod = Gtk::manage (new MyComboBoxText ()); - Lmethod->append (M("TP_DIRPYRDENOISE_CUR")); - Lmethod->append (M("TP_DIRPYRDENOISE_SLI")); + Lmethod->append (M("CURVEEDITOR_CURVE")); + Lmethod->append (M("GENERAL_SLIDER")); Lmethod->set_active(0); Lmethodconn = Lmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::LmethodChanged) ); - luma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMA"), 0, 100, 0.01, 0)); - Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LDETAIL"), 0, 100, 0.01, 50)); - NoiscurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_LCURVE")); + luma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING"), 0, 100, 0.01, 0)); + Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_DETAIL"), 0, 100, 0.01, 50)); + NoiscurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_LUMINANCE_CURVE")); //curveEditorG = new CurveEditorGroup (options.lastLabCurvesDir); NoiscurveEditorG->setCurveListener (this); defaultCurve = rtengine::DirPyrDenoiseParams().lcurve; @@ -66,7 +66,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP lshape->setIdentityValue(0.); lshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); - lshape->setTooltip(M("TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP")); //lshape->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); @@ -77,59 +76,55 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP NoiscurveEditorG->curveListComplete(); NoiscurveEditorG->show(); - Gtk::Frame* chromaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_CHROMAFR")) ); + Gtk::Frame* chromaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_CHROMINANCE_FRAME")) ); chromaFrame->set_label_align(0.025, 0.5); Gtk::VBox *chromaVBox = Gtk::manage ( new Gtk::VBox()); chromaVBox->set_spacing(2); ctboxC = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmC = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CTYPE") + ":")); + Gtk::Label* labmC = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC->pack_start (*labmC, Gtk::PACK_SHRINK, 1); - ctboxC->set_tooltip_markup (M("TP_DIRPYRDENOISE_CTYPE_TOOLTIP")); Cmethod = Gtk::manage (new MyComboBoxText ()); - Cmethod->append (M("TP_DIRPYRDENOISE_MAN")); - Cmethod->append (M("TP_DIRPYRDENOISE_AUT")); - Cmethod->append (M("TP_DIRPYRDENOISE_PON")); - Cmethod->append (M("TP_DIRPYRDENOISE_PRE")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_MANUAL")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AMZ")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_PMZ")); Cmethod->set_active(0); Cmethodconn = Cmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::CmethodChanged) ); + Cmethod->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP")); ctboxC2 = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmC2 = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CTYPE") + ":")); + Gtk::Label* labmC2 = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC2->pack_start (*labmC2, Gtk::PACK_SHRINK, 1); - ctboxC2->set_tooltip_markup (M("TP_DIRPYRDENOISE_C2TYPE_TOOLTIP")); + ctboxC2->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP")); C2method = Gtk::manage (new MyComboBoxText ()); - C2method->append (M("TP_DIRPYRDENOISE_MANU")); - C2method->append (M("TP_DIRPYRDENOISE_AUTO")); - C2method->append (M("TP_DIRPYRDENOISE_PREV")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_MANUAL")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW")); C2method->set_active(0); C2methodconn = C2method->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::C2methodChanged) ); NoiseLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); - NoiseLabels->set_tooltip_text(M("TP_DIRPYRDENOISE_NRESID_TOOLTIP")); + NoiseLabels->set_tooltip_text(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP")); TileLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); PrevLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); - chroma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMA"), 0, 100, 0.01, 15)); - redchro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_RED"), -100, 100, 0.1, 0)); - bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_BLUE"), -100, 100, 0.1, 0)); - - gamma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_GAMMA"), 1.0, 3.0, 0.01, 1.7)); - gamma->set_tooltip_text (M("TP_DIRPYRDENOISE_GAMMA_TOOLTIP")); - + chroma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_MASTER"), 0, 100, 0.01, 15)); + redchro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN"), -100, 100, 0.1, 0)); + bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW"), -100, 100, 0.1, 0)); Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); - hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_METHOD") + ": ")), Gtk::PACK_SHRINK, 4); - hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_METHOD_TOOLTIP")); + hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK, 4); + hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP")); dmethod = Gtk::manage (new MyComboBoxText ()); - dmethod->append (M("TP_DIRPYRDENOISE_LAB")); - dmethod->append (M("TP_DIRPYRDENOISE_RGB")); + dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB")); + dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB")); dmethod->set_active(0); hb1->pack_end (*dmethod, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb1, Gtk::PACK_SHRINK, 4); @@ -143,14 +138,14 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP redchro->setAdjusterListener (this); bluechro->setAdjusterListener (this); - CCcurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_CCCURVE")); + CCcurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_CHROMINANCE_CURVE")); CCcurveEditorG->setCurveListener (this); defaultCurve = rtengine::DirPyrDenoiseParams().cccurve; ccshape = static_cast(CCcurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); ccshape->setIdentityValue(0.); ccshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); - ccshape->setTooltip(M("TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP")); + ccshape->setTooltip(M("TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP")); ccshape->setBottomBarColorProvider(this, 2); CCcurveEditorG->curveListComplete(); @@ -158,8 +153,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP //----------------------------------------- - gamma->setAdjusterListener (this); - luma->hide(); Ldetail->show(); @@ -170,7 +163,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP redchro->show(); bluechro->show(); // perform->show(); - gamma->show(); // perform->set_active (true); // ---- Median FIltering ---- @@ -181,73 +173,75 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP Gtk::VBox *medianVBox = Gtk::manage ( new Gtk::VBox()); medianVBox->set_spacing(2); - median = Gtk::manage (new Gtk::CheckButton (M("TP_DIRPYRDENOISE_MED") + ":")); + median = Gtk::manage (new Gtk::CheckButton (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL") + ":")); median->set_active (true); medianFrame->set_label_widget(*median); methodmed = Gtk::manage (new MyComboBoxText ()); - methodmed->append (M("TP_DIRPYRDENOISE_LM")); - methodmed->append (M("TP_DIRPYRDENOISE_ABM")); - methodmed->append (M("TP_DIRPYRDENOISE_LPLABM")); - methodmed->append (M("TP_DIRPYRDENOISE_LABM")); - methodmed->append (M("TP_DIRPYRDENOISE_RGBM")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB")); methodmed->set_active (0); - methodmed->set_tooltip_text (M("TP_DIRPYRDENOISE_METM_TOOLTIP")); + methodmed->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP")); methodmedconn = methodmed->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::methodmedChanged) ); rgbmethod = Gtk::manage (new MyComboBoxText ()); - rgbmethod->append (M("TP_DIRPYRDENOISE_3X3_SOFT")); - rgbmethod->append (M("TP_DIRPYRDENOISE_3X3")); - rgbmethod->append (M("TP_DIRPYRDENOISE_5X5_SOFT")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3SOFT")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5SOFT")); rgbmethod->set_active (0); - rgbmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); + rgbmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP")); rgbmethodconn = rgbmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::rgbmethodChanged) ); medmethod = Gtk::manage (new MyComboBoxText ()); - medmethod->append (M("TP_DIRPYRDENOISE_3X3_SOFT")); - medmethod->append (M("TP_DIRPYRDENOISE_3X3")); - medmethod->append (M("TP_DIRPYRDENOISE_5X5_SOFT")); - medmethod->append (M("TP_DIRPYRDENOISE_5X5")); - medmethod->append (M("TP_DIRPYRDENOISE_7X7")); - medmethod->append (M("TP_DIRPYRDENOISE_9X9")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3SOFT")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5SOFT")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_7X7")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_9X9")); medmethod->set_active (0); - medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); + medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP")); medmethodconn = medmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::medmethodChanged) ); ctboxm = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDMETHOD") + ":")); + Gtk::Label* labmm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_METHOD") + ":")); ctboxm->pack_start (*labmm, Gtk::PACK_SHRINK, 1); ctbox = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDTYPE") + ":")); + Gtk::Label* labm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctbox->pack_start (*labm, Gtk::PACK_SHRINK, 1); ctboxrgb = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labrgb = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDTYPE") + ":")); + Gtk::Label* labrgb = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctboxrgb->pack_start (*labrgb, Gtk::PACK_SHRINK, 1); - - Gtk::HSeparator *hsep4 = Gtk::manage (new Gtk::HSeparator()); - hsep4->show (); - Gtk::HBox* hb11 = Gtk::manage (new Gtk::HBox ()); - hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_METHOD11") + ": ")), Gtk::PACK_SHRINK, 4); - hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_METHOD11_TOOLTIP")); + hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_MODE") + ": ")), Gtk::PACK_SHRINK, 4); + hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP")); smethod = Gtk::manage (new MyComboBoxText ()); - smethod->append (M("TP_DIRPYRDENOISE_SHAL")); -// smethod->append (M("TP_DIRPYRDENOISE_SHBI")); - smethod->append (M("TP_DIRPYRDENOISE_SHALBI")); -// smethod->append (M("TP_DIRPYRDENOISE_SHALAL")); -// smethod->append (M("TP_DIRPYRDENOISE_SHBIBI")); + smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHBI")); + smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHALAL")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHBIBI")); smethod->set_active(1); hb11->pack_start (*smethod, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb11, Gtk::PACK_SHRINK, 4); smethodconn = smethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::smethodChanged) ); - passes = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_PASSES"), 1.0, 3.0, 1., 1.)); - passes->set_tooltip_text (M("TP_DIRPYRDENOISE_PASSES_TOOLTIP")); + gamma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MAIN_GAMMA"), 1.0, 3.0, 0.01, 1.7)); + gamma->set_tooltip_text (M("TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP")); + gamma->setAdjusterListener (this); + gamma->show(); + pack_start (*gamma); + + passes = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MEDIAN_PASSES"), 1.0, 3.0, 1., 1.)); + passes->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP")); passes->setAdjusterListener (this); passes->show(); ctboxL->pack_start (*Lmethod); @@ -278,10 +272,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP chromaFrame->add(*chromaVBox); pack_start (*chromaFrame); - - pack_start (*gamma); - pack_start (*hsep4); - // pack_start( *hb11, Gtk::PACK_SHRINK, 4); // pack_start (*median); @@ -380,7 +370,7 @@ void DirPyrDenoise::updateTileLabel () nY = nexttileY; { TileLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_TILELABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO"), Glib::ustring::format(std::fixed, std::setprecision(0), sT), Glib::ustring::format(std::fixed, std::setprecision(0), nX), Glib::ustring::format(std::fixed, std::setprecision(0), nY)) @@ -398,7 +388,7 @@ void DirPyrDenoise::updatePrevLabel () pY = nextprevY; { PrevLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_PREVLABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO"), Glib::ustring::format(std::fixed, std::setprecision(0), sP), Glib::ustring::format(std::fixed, std::setprecision(0), pX), Glib::ustring::format(std::fixed, std::setprecision(0), pY)) @@ -437,10 +427,10 @@ void DirPyrDenoise::updateNoiseLabel () high = nexthighresid; if(nois == 0.f && high == 0.f) { - NoiseLabels->set_text(M("TP_DIRPYRDENOISE_NOISELABELEMPTY")); + NoiseLabels->set_text(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY")); } else { NoiseLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_NOISELABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO"), Glib::ustring::format(std::fixed, std::setprecision(0), nois), Glib::ustring::format(std::fixed, std::setprecision(0), high)) ); From b61a4cdc26d03e7c75f36d698e30becedf1e1438 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 31 Dec 2017 21:55:35 +0100 Subject: [PATCH 077/200] Fixes a bug in RGB2Lab() I introduced recently --- rtengine/color.cc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 4b51314cc..dbabb217b 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1787,14 +1787,6 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, { #ifdef __SSE2__ - // prepare matrix to save some divisions (reduces the number of divisions by width/2 - 6) - float wpn[3][3]; - for(int i = 0; i < 3; ++i) { - wpn[0][i] = wp[0][i] / Color::D50x; - wpn[1][i] = wp[1][i]; - wpn[2][i] = wp[2][i] / Color::D50z; - } - vfloat maxvalfv = F2V(MAXVALF); vfloat c116v = F2V(116.f); vfloat c5242d88v = F2V(5242.88f); @@ -1807,9 +1799,9 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const vfloat rv = LVFU(R[i]); const vfloat gv = LVFU(G[i]); const vfloat bv = LVFU(B[i]); - const vfloat xv = F2V(wpn[0][0]) * rv + F2V(wpn[0][1]) * gv + F2V(wpn[0][2]) * bv; - const vfloat yv = F2V(wpn[1][0]) * rv + F2V(wpn[1][1]) * gv + F2V(wpn[1][2]) * bv; - const vfloat zv = F2V(wpn[2][0]) * rv + F2V(wpn[2][1]) * gv + F2V(wpn[2][2]) * bv; + const vfloat xv = F2V(wp[0][0]) * rv + F2V(wp[0][1]) * gv + F2V(wp[0][2]) * bv; + const vfloat yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv; + const vfloat zv = F2V(wp[2][0]) * rv + F2V(wp[2][1]) * gv + F2V(wp[2][2]) * bv; vmask maxMask = vmaskf_gt(vmaxf(xv, vmaxf(yv, zv)), maxvalfv); if (_mm_movemask_ps((vfloat)maxMask)) { @@ -1844,7 +1836,15 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, float x = wp[0][0] * rv + wp[0][1] * gv + wp[0][2] * bv; float y = wp[1][0] * rv + wp[1][1] * gv + wp[1][2] * bv; float z = wp[2][0] * rv + wp[2][1] * gv + wp[2][2] * bv; - XYZ2Lab(x, y, z, L[i], a[i], b[i]); + float fx, fy, fz; + + fx = (x <= 65535.0f ? cachef[x] : (327.68f * xcbrtf(x / MAXVALF))); + fy = (y <= 65535.0f ? cachef[y] : (327.68f * xcbrtf(y / MAXVALF))); + fz = (z <= 65535.0f ? cachef[z] : (327.68f * xcbrtf(z / MAXVALF))); + + L[i] = 116.0f * fy - 5242.88f; //5242.88=16.0*327.68; + a[i] = 500.0f * (fx - fy); + b[i] = 200.0f * (fy - fz); } } From 3d40d9cdcebe34cb8f7f8dcb890e1c752ddae25a Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 1 Jan 2018 09:39:38 +0100 Subject: [PATCH 078/200] fixed non-uniform spacing in denoise gui --- rtgui/dirpyrdenoise.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index bb367becc..f79770a62 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -119,15 +119,15 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW"), -100, 100, 0.1, 0)); Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); - hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK, 4); + hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK, 1); hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP")); dmethod = Gtk::manage (new MyComboBoxText ()); dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB")); dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB")); dmethod->set_active(0); - hb1->pack_end (*dmethod, Gtk::PACK_EXPAND_WIDGET, 4); - pack_start( *hb1, Gtk::PACK_SHRINK, 4); + hb1->pack_end (*dmethod, Gtk::PACK_EXPAND_WIDGET, 1); + pack_start(*hb1, Gtk::PACK_SHRINK, 1); dmethodconn = dmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::dmethodChanged) ); @@ -220,7 +220,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP ctboxrgb->pack_start (*labrgb, Gtk::PACK_SHRINK, 1); Gtk::HBox* hb11 = Gtk::manage (new Gtk::HBox ()); - hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_MODE") + ": ")), Gtk::PACK_SHRINK, 4); + hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_MODE") + ": ")), Gtk::PACK_SHRINK, 1); hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP")); smethod = Gtk::manage (new MyComboBoxText ()); @@ -230,15 +230,15 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP // smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHALAL")); // smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHBIBI")); smethod->set_active(1); - hb11->pack_start (*smethod, Gtk::PACK_EXPAND_WIDGET, 4); - pack_start( *hb11, Gtk::PACK_SHRINK, 4); + hb11->pack_start (*smethod, Gtk::PACK_EXPAND_WIDGET, 1); + pack_start( *hb11, Gtk::PACK_SHRINK, 1); smethodconn = smethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::smethodChanged) ); gamma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MAIN_GAMMA"), 1.0, 3.0, 0.01, 1.7)); gamma->set_tooltip_text (M("TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP")); gamma->setAdjusterListener (this); gamma->show(); - pack_start (*gamma); + pack_start (*gamma, Gtk::PACK_EXPAND_WIDGET, 1); passes = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MEDIAN_PASSES"), 1.0, 3.0, 1., 1.)); passes->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP")); From 0b7b1d6ab36b94b6f6adf4b3c4e0212cdecaa15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:13:29 +0100 Subject: [PATCH 079/200] Fix null pointer dereference (as hinted by Coverity) Plus some `const` fixes. --- rtengine/imagedata.cc | 22 +++++++++++++--------- rtexif/rtexif.cc | 6 +++--- rtexif/rtexif.h | 6 +++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index f3516e5a8..640eee96e 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -474,14 +474,14 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* uint16 bitspersample = 0, samplesperpixel = 0, sampleformat = 0, photometric = 0, compression = 0; - rtexif::Tag* bps = frameRootDir->findTag("BitsPerSample"); - rtexif::Tag* spp = frameRootDir->findTag("SamplesPerPixel"); - rtexif::Tag* sf = frameRootDir->findTag("SampleFormat"); - rtexif::Tag* pi = frameRootDir->findTag("PhotometricInterpretation"); - rtexif::Tag* c = frameRootDir->findTag("Compression"); + const rtexif::Tag* const bps = frameRootDir->findTag("BitsPerSample"); + const rtexif::Tag* const spp = frameRootDir->findTag("SamplesPerPixel"); + const rtexif::Tag* const sf = frameRootDir->findTag("SampleFormat"); + const rtexif::Tag* const pi = frameRootDir->findTag("PhotometricInterpretation"); + const rtexif::Tag* const c = frameRootDir->findTag("Compression"); if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) { - rtexif::Tag* hdr = mnote->findTag("HDR"); + const rtexif::Tag* const hdr = mnote->findTag("HDR"); if (hdr) { if (hdr->toInt() > 0 && hdr->toInt(2) > 0) { isHDR = true; @@ -490,7 +490,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* #endif } } else { - rtexif::Tag* dm = mnote->findTag("DriveMode"); + const rtexif::Tag* const dm = mnote->findTag("DriveMode"); if (dm) { char buffer[60]; dm->toString(buffer, 3); @@ -505,7 +505,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (!isHDR) { - rtexif::Tag* q = mnote->findTag("Quality"); + const rtexif::Tag* const q = mnote->findTag("Quality"); if (q && q->toInt() == 7) { isPixelShift = true; #if PRINT_HDR_PS_DETECTION @@ -530,7 +530,11 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* sampleformat = sf->toInt(); } - if ((!bps & !spp) || !pi) { + if ( + !bps + || !spp + || !pi + ) { return; } diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index b6b5b55fe..a90ec18b5 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1572,7 +1572,7 @@ double Tag::toDouble (int ofs) const /** * @brief Create an array of the elements */ -double *Tag::toDoubleArray (int ofs) +double* Tag::toDoubleArray (int ofs) const { double *values = new double[count]; @@ -1583,7 +1583,7 @@ double *Tag::toDoubleArray (int ofs) return values; } -void Tag::toRational (int& num, int& denom, int ofs) +void Tag::toRational (int& num, int& denom, int ofs) const { switch (type) { @@ -1632,7 +1632,7 @@ void Tag::toRational (int& num, int& denom, int ofs) } } -void Tag::toString (char* buffer, int ofs) +void Tag::toString (char* buffer, int ofs) const { if (type == UNDEFINED && !directory) { diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 937945aac..822407389 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -282,9 +282,9 @@ public: int toInt (int ofs = 0, TagType astype = INVALID) const; void fromInt (int v); double toDouble (int ofs = 0) const; - double *toDoubleArray (int ofs = 0); - void toRational (int& num, int& denom, int ofs = 0); - void toString (char* buffer, int ofs = 0); + double* toDoubleArray (int ofs = 0) const; + void toRational (int& num, int& denom, int ofs = 0) const; + void toString (char* buffer, int ofs = 0) const; void fromString (const char* v, int size = -1); void setInt (int v, int ofs = 0, TagType astype = LONG); From b3dd5244ad2a5d1eb2d9b435a7ae8f15add7d7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:30:10 +0100 Subject: [PATCH 080/200] Fix (currently impossible) null pointer dereference (Coverity) Plus some `const` fixes, this time removing constness. --- rtengine/FTblockDN.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 334f97f05..ddd7e4587 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -78,8 +78,10 @@ namespace { template -void do_median_denoise(float **src, float **dst, float upperBound, const int width, const int height, const ImProcFunctions::Median medianType, const int iterations, const int numThreads, float **buffer) +void do_median_denoise(float **src, float **dst, float upperBound, int width, int height, ImProcFunctions::Median medianType, int iterations, int numThreads, float **buffer) { + iterations = max(1, iterations); + typedef ImProcFunctions::Median Median; int border = 1; From ecee587402fa21ef836ba93974d396592bc4b6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:35:41 +0100 Subject: [PATCH 081/200] Fix pass-by-value (Coverity) Plus some `const` adjustments. (Groundhog day?) --- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d8fba268a..3eac99396 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -3884,7 +3884,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, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) +void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const 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 d1496d4fd..a64991604 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -39,7 +39,7 @@ private: static DiagonalCurve *phaseOneIccCurveInv; static LUTf invGrad; // for fast_demosaic static LUTf initInvGrad (); - 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); + static void colorSpaceConversion_ (Imagefloat* im, const 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: @@ -189,7 +189,7 @@ public: 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, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) + static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) { colorSpaceConversion_ (im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); } From 1054083661ac3cf74bff47933dcf59b792d53236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:43:51 +0100 Subject: [PATCH 082/200] Fix pass-by-value (Coverity) --- rtengine/imagesource.h | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index b76a962eb..29a125149 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -71,7 +71,7 @@ public: virtual void demosaic (const RAWParams &raw) {}; virtual void retinex (ColorManagementParams cmp, const 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 (const 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, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; + virtual void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; virtual void HLRecovery_Global (ToneCurveParams hrp) {}; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 3eac99396..d1bc90636 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2091,7 +2091,7 @@ void RawImageSource::demosaic(const RAWParams &raw) //void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) -void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) +void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) { bool useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); conversionBuffer[0] (W - 2 * border, H - 2 * border); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index a64991604..382be0b44 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -121,7 +121,7 @@ public: void demosaic (const RAWParams &raw); void retinex (ColorManagementParams cmp, const 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 (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); - void retinexPrepareBuffers (ColorManagementParams cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); + void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); void flushRGB (); void HLRecovery_Global (ToneCurveParams hrp); From ce2be7ad874cca49d2bca0e4ab8d6b0c7e025b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:48:35 +0100 Subject: [PATCH 083/200] Fix pass-by-value (Coverity) --- rtengine/imagesource.h | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 29a125149..261995f08 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -69,7 +69,7 @@ public: virtual int load (const Glib::ustring &fname) = 0; 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, const 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 retinex (const ColorManagementParams& cmp, const 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 (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index d1bc90636..b948b8bdd 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2360,7 +2360,7 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } -void RawImageSource::retinex(ColorManagementParams cmp, const 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 RawImageSource::retinex(const ColorManagementParams& cmp, const 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(); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 382be0b44..cdd7ca675 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -119,7 +119,7 @@ public: int load (const Glib::ustring &fname); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true); void demosaic (const RAWParams &raw); - void retinex (ColorManagementParams cmp, const 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 retinex (const ColorManagementParams& cmp, const 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 (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); From c760b95844a5d8047ed7d1c9466d736406d69228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:52:11 +0100 Subject: [PATCH 084/200] Remove dead member (Coverity) --- rtgui/filmsimulation.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index c813f9c85..8f627c352 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -17,10 +17,10 @@ public: Glib::ustring getSelectedClut(); void setSelectedClut( Glib::ustring filename ); void setBatchMode(bool yes); - + private: void updateUnchangedEntry(); // in batchMode we need to add an extra entry "(Unchanged)". We do this whenever the widget is mapped (connecting to signal_map()), unless options.multiDisplayMode (see the comment below about cm2 in this case) - + class ClutColumns : public Gtk::TreeModel::ColumnRecord { public: @@ -45,7 +45,6 @@ private: static std::unique_ptr cm; // we use a shared TreeModel for all the combo boxes, to save time (no need to reparse the clut dir multiple times)... static std::unique_ptr cm2; // ... except when options.multiDisplayMode (i.e. editors in their own window), where we need two. This is because we might have two combo boxes displayed at the same time in this case - int count; // the number of clut entries bool batchMode; }; From 820b6c8ae92a12c2134fef67bb9e554735ebbe1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 12:57:19 +0100 Subject: [PATCH 085/200] Remove useless call (Coverity) --- rtengine/imagedata.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 640eee96e..5fb1e98f6 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -838,8 +838,6 @@ rtexif::TagDirectory* FramesData::getBestExifData (ImageSource *imgSource, procp */ } - frames[imgNum]->getExifData (); - td = getFrameExifData (imgNum); rtexif::Tag* makeTag; if (td && (makeTag = td->findTag("Make", true))) { From b73970e94fe7fa55ad91370e24cb3d041e159ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 1 Jan 2018 13:04:01 +0100 Subject: [PATCH 086/200] Fix unintended sign extent (Coverity) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Would hit us at 716Mpx (26755px²). --- rtengine/rawimage.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index de392623d..8d7292113 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -695,7 +695,7 @@ float** RawImage::compress_image(int frameNum, bool freeImage) } else if (colors == 1) { // Monochrome if (!allocation) { - allocation = new float[height * width]; + allocation = new float[static_cast(height) * static_cast(width)]; data = new float*[height]; for (int i = 0; i < height; i++) { @@ -704,7 +704,7 @@ float** RawImage::compress_image(int frameNum, bool freeImage) } } else { if (!allocation) { - allocation = new float[3 * height * width]; + allocation = new float[3UL * static_cast(height) * static_cast(width)]; data = new float*[height]; for (int i = 0; i < height; i++) { From 96863bb95648575f8528dfa75bbf232c9c4deb40 Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 1 Jan 2018 13:51:48 +0100 Subject: [PATCH 087/200] Sets UTF-8 as default charset for IPTC + suppress one of the 2 methods for saving TIFF images. --- rtengine/imageio.cc | 380 ++++++++++++++++++++----------------------- rtexif/rtexif.cc | 126 +------------- rtexif/stdattribs.cc | 2 +- 3 files changed, 182 insertions(+), 326 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ba52c4672..3790f00f6 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -75,15 +75,6 @@ FILE* g_fopen_withBinaryAndLock(const Glib::ustring& fname) return f; } -Glib::ustring to_utf8 (const std::string& str) -{ - try { - return Glib::locale_to_utf8 (str); - } catch (Glib::Error&) { - return Glib::convert_with_fallback (str, "UTF-8", "ISO-8859-1", "?"); - } -} - } Glib::ustring ImageIO::errorMsg[6] = {"Success", "Cannot read file.", "Invalid header.", "Error while reading header.", "File reading error", "Image format not supported."}; @@ -136,13 +127,19 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::pr iptc = iptc_data_new (); + const unsigned char utf8Esc[] = {0x1B, '%', 'G'}; + IptcDataSet * ds = iptc_dataset_new (); + iptc_dataset_set_tag (ds, IPTC_RECORD_OBJECT_ENV, IPTC_TAG_CHARACTER_SET); + iptc_dataset_set_data (ds, utf8Esc, 3, IPTC_DONT_VALIDATE); + iptc_data_add_dataset (iptc, ds); + iptc_dataset_unref (ds); + 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 (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS); - std::string loc = to_utf8(i->second.at(j)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(static_cast(64), loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(j).c_str(), min(static_cast(64), i->second.at(j).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -152,8 +149,7 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::pr for (unsigned int j = 0; j < i->second.size(); j++) { IptcDataSet * ds = iptc_dataset_new (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY); - std::string loc = to_utf8(i->second.at(j)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(static_cast(32), loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(j).c_str(), min(static_cast(32), i->second.at(j).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -165,8 +161,7 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::pr if (i->first == strTags[j].field && !(i->second.empty())) { IptcDataSet * ds = iptc_dataset_new (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag); - std::string loc = to_utf8(i->second.at(0)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(strTags[j].size, loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(0).c_str(), min(strTags[j].size, i->second.at(0).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -1121,13 +1116,13 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) int bytes = 0; if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, size, buffer, 65532)) < 0) { - if (iptcdata) { - iptc_data_free_buf (iptc, iptcdata); - } - error = true; } + if (iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + } + if (!error) { jpeg_write_marker(&cinfo, JPEG_APP0 + 13, buffer, bytes); } @@ -1212,219 +1207,198 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) int lineWidth = width * 3 * bps / 8; unsigned char* linebuffer = new unsigned char[lineWidth]; -// TODO the following needs to be looked into - do we really need two ways to write a Tiff file ? - if (exifRoot && uncompressed) { - FILE *file = g_fopen_withBinaryAndLock (fname); + // 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 + 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 (!file) { - delete [] linebuffer; - return IMIO_CANNOTWRITEFILE; + if (!out) { + delete [] linebuffer; + return IMIO_CANNOTWRITEFILE; + } + + if (pl) { + pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); + pl->setProgress (0.0); + } + + if (exifRoot) { + rtexif::TagDirectory* cl = (const_cast (exifRoot))->clone (nullptr); + + // ------------------ remove some unknown top level tags which produce warnings when opening a tiff (might be useless) ----------------- + + rtexif::Tag *removeTag = cl->getTag (0x9003); + + if (removeTag) { + removeTag->setKeep (false); } - if (pl) { - pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); - pl->setProgress (0.0); + removeTag = cl->getTag (0x9211); + + if (removeTag) { + removeTag->setKeep (false); } - // buffer for the exif and iptc - unsigned int bufferSize; - unsigned char* buffer = nullptr; // buffer will be allocated in createTIFFHeader - unsigned char* iptcdata = nullptr; - unsigned int iptclen = 0; + // ------------------ Apply list of change ----------------- - if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { + for (auto currExifChange : exifChange) { + cl->applyChange (currExifChange.first, currExifChange.second); + } + + rtexif::Tag *tag = cl->getTag (TIFFTAG_EXIFIFD); + + if (tag && tag->isDirectory()) { + rtexif::TagDirectory *exif = tag->getDirectory(); + + if (exif) { + int exif_size = exif->calculateSize(); + unsigned char *buffer = new unsigned char[exif_size + 8]; + // TIFFOpen writes out the header and sets file pointer at position 8 + + exif->write (8, buffer); + + write (fileno, buffer + 8, exif_size); + + delete [] buffer; + // let libtiff know that scanlines or any other following stuff should go + // at a different offset: + TIFFSetWriteOffset (out, exif_size + 8); + TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + } + } + + //TODO Even though we are saving EXIF IFD - MakerNote still comes out screwed. + + if ((tag = cl->getTag (TIFFTAG_MODEL)) != nullptr) { + TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); + } + + if ((tag = cl->getTag (TIFFTAG_MAKE)) != nullptr) { + TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); + } + + if ((tag = cl->getTag (TIFFTAG_DATETIME)) != nullptr) { + TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); + } + + if ((tag = cl->getTag (TIFFTAG_ARTIST)) != nullptr) { + TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); + } + + if ((tag = cl->getTag (TIFFTAG_COPYRIGHT)) != nullptr) { + TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); + } + + delete cl; + } + + unsigned char* iptcdata = nullptr; + unsigned int iptclen = 0; + + if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen)) { + if (iptcdata) { iptc_data_free_buf (iptc, iptcdata); iptcdata = nullptr; } + } - 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); + if (iptcdata) { + rtexif::Tag* iptcTag = new rtexif::Tag (nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); + iptcTag->initLongArray((char*)iptcdata, iptclen); +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; +#else + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::INTEL; +#endif + if (needsReverse) { + unsigned char *ptr = iptcTag->getValue(); + for (int a = 0; a < iptcTag->getCount(); ++a) { + unsigned char cc; + cc = ptr[3]; + ptr[3] = ptr[0]; + ptr[0] = cc; + cc = ptr[2]; + ptr[2] = ptr[1]; + ptr[1] = cc; + ptr += 4; + } } + TIFFSetField (out, TIFFTAG_RICHTIFFIPTC, iptcTag->getCount(), (long*)iptcTag->getValue()); + iptc_data_free_buf (iptc, iptcdata); + } - // The maximum lenght is strangely not the same than for the JPEG file... - // Which maximum length is the good one ? - if (size > 0 && size <= static_cast(bufferSize)) { - fwrite (buffer, size, 1, file); - } + TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " RTVERSION); + TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); + TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); + TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, height); + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); + + if (!uncompressed) { + TIFFSetField (out, TIFFTAG_PREDICTOR, bps == 32 ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); + } + + if (profileData) { + TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); + } #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; #else - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; #endif - for (int i = 0; i < height; i++) { - getScanline (i, linebuffer, bps); + for (int row = 0; row < height; row++) { + getScanline (row, linebuffer, bps); - if (needsReverse) { - if (bps == 16) { - for (int i = 0; i < lineWidth; i += 2) { - char c = linebuffer[i]; - linebuffer[i] = linebuffer[i + 1]; - linebuffer[i + 1] = c; - } - } else { - for (int i = 0; i < lineWidth; i += 4) { - std::swap(linebuffer[i], linebuffer[i+3]); - std::swap(linebuffer[i+1], linebuffer[i+2]); - } + if (needsReverse) { + if (bps == 16) { + for (int i = 0; i < lineWidth; i += 2) { + char c = linebuffer[i]; + linebuffer[i] = linebuffer[i + 1]; + linebuffer[i + 1] = c; + } + } else { + for (int i = 0; i < lineWidth; i += 4) { + std::swap(linebuffer[i], linebuffer[i+3]); + std::swap(linebuffer[i+1], linebuffer[i+2]); } } - - fwrite (linebuffer, lineWidth, 1, file); - - if (pl && !(i % 100)) { - pl->setProgress ((double)(i + 1) / height); - } } - if(buffer) { - delete [] buffer; - } - - if (ferror(file)) { - writeOk = false; - } - - fclose (file); - } else { - // 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 - 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) { + if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { + TIFFClose (out); delete [] linebuffer; return IMIO_CANNOTWRITEFILE; } - if (pl) { - pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); - pl->setProgress (0.0); + if (pl && !(row % 100)) { + pl->setProgress ((double)(row + 1) / height); } - - if (exifRoot) { - rtexif::Tag *tag = exifRoot->getTag (TIFFTAG_EXIFIFD); - - if (tag && tag->isDirectory()) { - rtexif::TagDirectory *exif = tag->getDirectory(); - - if (exif) { - int exif_size = exif->calculateSize(); - unsigned char *buffer = new unsigned char[exif_size + 8]; - // TIFFOpen writes out the header and sets file pointer at position 8 - - exif->write (8, buffer); - - write (fileno, buffer + 8, exif_size); - - delete [] buffer; - // let libtiff know that scanlines or any other following stuff should go - // at a different offset: - TIFFSetWriteOffset (out, exif_size + 8); - TIFFSetField (out, TIFFTAG_EXIFIFD, 8); - } - } - -//TODO Even though we are saving EXIF IFD - MakerNote still comes out screwed. - - if ((tag = exifRoot->getTag (TIFFTAG_MODEL)) != nullptr) { - TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); - } - - if ((tag = exifRoot->getTag (TIFFTAG_MAKE)) != nullptr) { - TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); - } - - if ((tag = exifRoot->getTag (TIFFTAG_DATETIME)) != nullptr) { - TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); - } - - if ((tag = exifRoot->getTag (TIFFTAG_ARTIST)) != nullptr) { - TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); - } - - if ((tag = exifRoot->getTag (TIFFTAG_COPYRIGHT)) != nullptr) { - TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); - } - - } - - TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " RTVERSION); - TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); - TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); - TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, height); - TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); - TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); - TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); - - if (!uncompressed) { - TIFFSetField (out, TIFFTAG_PREDICTOR, bps == 32 ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); - } - - if (profileData) { - TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); - } - -#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; -#else - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; -#endif - - for (int row = 0; row < height; row++) { - getScanline (row, linebuffer, bps); - - if (needsReverse) { - if (bps == 16) { - for (int i = 0; i < lineWidth; i += 2) { - char c = linebuffer[i]; - linebuffer[i] = linebuffer[i + 1]; - linebuffer[i + 1] = c; - } - } else { - for (int i = 0; i < lineWidth; i += 4) { - std::swap(linebuffer[i], linebuffer[i+3]); - std::swap(linebuffer[i+1], linebuffer[i+2]); - } - } - } - - if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { - TIFFClose (out); - delete [] linebuffer; - return IMIO_CANNOTWRITEFILE; - } - - if (pl && !(row % 100)) { - pl->setProgress ((double)(row + 1) / height); - } - } - - if (TIFFFlush(out) != 1) { - writeOk = false; - } - - TIFFClose (out); -#ifdef WIN32 - fclose (file); -#endif } + if (TIFFFlush(out) != 1) { + writeOk = false; + } + + TIFFClose (out); +#ifdef WIN32 + fclose (file); +#endif + delete [] linebuffer; if (pl) { diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 60f8b6619..6179688ae 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -739,11 +739,12 @@ void TagDirectory::applyChange (std::string name, Glib::ustring value) } else { const TagAttrib* attrib = nullptr; - for (int i = 0; attribs[i].ignore != -1; i++) + for (int i = 0; attribs[i].ignore != -1; i++) { if (!strcmp (attribs[i].name, fseg.c_str())) { attrib = &attribs[i]; break; } + } if (attrib) { Tag* nt = new Tag (this, attrib); @@ -1663,15 +1664,11 @@ void Tag::toString (char* buffer, int ofs) return; } - size_t maxcount = 4; - - if (count < 4) { - maxcount = count; - } + size_t maxcount = rtengine::min(count, 10); strcpy (buffer, ""); - for (ssize_t i = 0; i < std::min(maxcount, valuesize - ofs); i++) { + for (ssize_t i = 0; i < rtengine::min(maxcount, valuesize - ofs); i++) { if (i > 0) { strcat (buffer, ", "); } @@ -3199,121 +3196,6 @@ 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, unsigned &bufferSize) -{ - -// write tiff header - int offs = 0; - ByteOrder order = HOSTORDER; - - if (root) { - order = root->getOrder (); - } - - TagDirectory* cl; - - if (root) { - cl = (const_cast (root))->clone (nullptr); - // 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 (nullptr, ifdAttribs, HOSTORDER); - } - -// add tiff strip data - int rps = 8; - int strips = ceil ((double)H / rps); - cl->replaceTag (new Tag (cl, lookupAttrib (ifdAttribs, "RowsPerStrip"), rps, LONG)); - Tag* stripBC = new Tag (cl, lookupAttrib (ifdAttribs, "StripByteCounts")); - stripBC->initInt (0, LONG, strips); - cl->replaceTag (stripBC); - Tag* stripOffs = new Tag (cl, lookupAttrib (ifdAttribs, "StripOffsets")); - stripOffs->initInt (0, LONG, strips); - cl->replaceTag (stripOffs); - Tag *sampleFormat = new Tag (cl, lookupAttrib (ifdAttribs, "SampleFormat"), bps == 32 ? 3 : 1, SHORT); - cl->replaceTag (sampleFormat); - - for (int i = 0; i < strips - 1; i++) { - stripBC->setInt (rps * W * 3 * bps / 8, i * 4); - } - - int remaining = (H - rps * floor ((double)H / rps)) * W * 3 * bps / 8; - - if (remaining) { - stripBC->setInt (remaining, (strips - 1) * 4); - } else { - stripBC->setInt (rps * W * 3 * bps / 8, (strips - 1) * 4); - } - - if (profiledata) { - Tag* icc = new Tag (cl, lookupAttrib (ifdAttribs, "ICCProfile")); - icc->initUndefArray (profiledata, profilelen); - cl->replaceTag (icc); - } - - if (iptcdata) { - Tag* iptc = new Tag (cl, lookupAttrib (ifdAttribs, "IPTCData")); - iptc->initLongArray (iptcdata, iptclen); - cl->replaceTag (iptc); - } - -// apply list of changes - for (rtengine::procparams::ExifPairs::const_iterator i = changeList.begin(); i != changeList.end(); ++i) { - cl->applyChange (i->first, i->second); - } - - // append default properties - const std::vector defTags = getDefaultTIFFTags (cl); - - defTags[0]->setInt (W, 0, LONG); - defTags[1]->setInt (H, 0, LONG); - defTags[8]->initInt (0, SHORT, 3); - - for (int i = 0; i < 3; i++) { - defTags[8]->setInt (bps, i * 2, SHORT); - } - - for (int i = defTags.size() - 1; i >= 0; i--) { - Tag* defTag = defTags[i]; - cl->replaceTag (defTag->clone (cl)); - delete defTag; - } - -// calculate strip offsets - int size = cl->calculateSize (); - int byps = bps / 8; - - for (int i = 0; i < strips; i++) { - stripOffs->setInt (size + 8 + i * rps * W * 3 * byps, i * 4); - } - - 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); - - int endOffs = cl->write (8, buffer); - -// cl->printAll(); - delete cl; - - return endOffs; -} - //----------------------------------------------------------------------------- // global functions to read byteorder dependent data //----------------------------------------------------------------------------- diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index a7e3fe00f..4982b0b81 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -809,10 +809,10 @@ const TagAttrib ifdAttribs[] = { {0, AC_WRITE, 0, nullptr, 0x828e, AUTO, "CFAPattern", &cfaInterpreter}, {0, AC_WRITE, 0, kodakIfdAttribs, 0x8290, AUTO, "KodakIFD", &stdInterpreter}, {0, AC_WRITE, 1, nullptr, 0x8298, AUTO, "Copyright", &stdInterpreter}, + {0, AC_SYSTEM, 0, nullptr, 0x83BB, AUTO, "IPTCData", &stdInterpreter}, {0, AC_DONTWRITE, 0, nullptr, 0x8606, AUTO, "LeafData", &stdInterpreter}, // is actually a subdir, but a proprietary format {0, AC_WRITE, 0, exifAttribs, 0x8769, AUTO, "Exif", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x8773, AUTO, "ICCProfile", &stdInterpreter}, - {0, AC_SYSTEM, 0, nullptr, 0x83BB, AUTO, "IPTCData", &stdInterpreter}, {0, AC_WRITE, 0, gpsAttribs, 0x8825, AUTO, "GPSInfo", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x9003, AUTO, "DateTimeOriginal", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x9004, AUTO, "DateTimeDigitized", &stdInterpreter}, From 9d2ccc19d3eecbbe6a7ee237b222ba6f8a583b8e Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 1 Jan 2018 14:24:47 +0100 Subject: [PATCH 088/200] Better UNICODE support (UCS-2/UTF-8) for Exif.UserComment (#2017) - BOM is now checked and correctly handled - auto-detection of UTF-8 string if no BOM available, otherwise assume it's an UCS-2/UTF-16 string - try to autodetect endianess of UTF-16 string by counting zeros - possibility to enable writing BOM for this field (disabled for now) - for undefined charset (empty identifier), RT now assume that the string is what glib think is the local charset (not tested), and try to convert it to UTF-8 for display/editing JIS is still not handled though. --- rtexif/rtexif.cc | 48 ++++++++++++++----- rtexif/rtexif.h | 2 + rtexif/stdattribs.cc | 110 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 140 insertions(+), 20 deletions(-) diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 6179688ae..3547f6ee3 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -1928,24 +1928,48 @@ void Tag::initInt (int data, TagType t, int cnt) setInt (data, 0, t); } +void Tag::swapByteOrder2(char *buffer, int count) +{ + char* ptr = buffer; + for (int i = 0; i < count; i+=2) { + unsigned char c = ptr[0]; + ptr[0] = ptr[1]; + ptr[1] = c; + ptr += 2; + } +} void Tag::initUserComment (const Glib::ustring &text) { + const bool useBOM = false; // set it to true if you want to output BOM in UCS-2/UTF-8 UserComments ; this could be turned to an options entry type = UNDEFINED; if (text.is_ascii()) { - count = 8 + strlen (text.c_str()); - valuesize = count; + valuesize = count = 8 + strlen (text.c_str()); value = new unsigned char[valuesize]; - strcpy ((char*)value, "ASCII"); - value[5] = value[6] = value[7] = 0; - strcpy ((char*)value + 8, text.c_str()); + memcpy(value, "ASCII\0\0\0", 8); + memcpy(value + 8, text.c_str(), valuesize - 8); } else { - wchar_t *commentStr = (wchar_t*)g_utf8_to_utf16 (text.c_str(), -1, NULL, NULL, NULL); - count = 8 + wcslen(commentStr)*2; - valuesize = count; - value = (unsigned char*)new char[valuesize]; - strcpy ((char*)value, "UNICODE"); - value[7] = 0; - wcscpy(((wchar_t*)value) + 4, commentStr); + wchar_t *commentStr = (wchar_t*)g_utf8_to_utf16 (text.c_str(), -1, nullptr, nullptr, nullptr); + size_t wcStrSize = wcslen(commentStr); + valuesize = count = wcStrSize * 2 + 8 + (useBOM ? 2 : 0); + value = new unsigned char[valuesize]; + memcpy(value, "UNICODE\0", 8); + + if (useBOM) { + if (getOrder() == INTEL) { //Little Endian + value[8] = 0xFF; + value[9] = 0xFE; + } else { + value[8] = 0xFE; + value[9] = 0xFF; + } + } + + // Swapping byte order to match the Exif's byte order + if (getOrder() != HOSTORDER) { + swapByteOrder2((char*)commentStr, wcStrSize * 2); + } + + memcpy(value + 8 + (useBOM ? 2 : 0), (char*)commentStr, wcStrSize * 2); g_free(commentStr); } } diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 125d38c94..452cedba1 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -236,6 +236,8 @@ public: void initLongArray (const char* data, int len); void initRational (int num, int den); + static void swapByteOrder2 (char *buffer, int count); + // get basic tag properties int getID () const { diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index 4982b0b81..ca19b7f1c 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -452,12 +452,109 @@ public: } count = std::min (count, 65535); // limit to 65535 chars to avoid crashes in case of corrupted metadata - char *buffer = new char[count - 7]; + char *buffer = new char[count - 6]; // include 2 ending null chars for UCS-2 string (possibly) + char *value = (char*)t->getValue(); - if (!memcmp ((char*)t->getValue(), "ASCII\0\0\0", 8)) { - strncpy (buffer, (char*)t->getValue() + 8, count - 8); + if (!memcmp(value, "ASCII\0\0\0", 8)) { + memcpy(buffer, value + 8, count - 8); buffer[count - 8] = '\0'; + } else if (!memcmp(value, "UNICODE\0", 8)) { + memcpy(buffer, value + 8, count - 8); + buffer[count - 7] = buffer[count - 8] = '\0'; + Glib::ustring tmp1(buffer); + + + bool hasBOM = false; + enum ByteOrder bo = UNKNOWN; + if (count % 2 || (count >= 11 && (buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF))) { + // odd string length can only be UTF-8, don't change anything + std::string retVal (buffer + 3); + delete [] buffer; + return retVal; + } else if (count >= 10) { + if (buffer[0] == 0xFF && buffer[1] == 0xFE) { + bo = INTEL; // little endian + hasBOM = true; + } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) { + bo = MOTOROLA; // big endian + hasBOM = true; + } + } + if (bo == UNKNOWN) { + // auto-detecting byte order; we still don't know if it's UCS-2 or UTF-8 + int a = 0, b = 0, c = 0, d = 0; + for (int j = 8; j < count; j++) { + char cc = value[j]; + if (!(j%2)) { + // counting zeros for first byte + if (!cc) { + ++a; + } + } else { + // counting zeros for second byte + if (!cc) { + ++b; + } + } + if (!(cc & 0x80) || ((cc & 0xC0) == 0xC0) || ((cc & 0xC0) == 0x80)) { + ++c; + } + if ((cc & 0xC0) == 0x80) { + ++d; + } + } + if (c == (count - 8) && d) { + // this is an UTF-8 string + std::string retVal (buffer); + delete [] buffer; + return retVal; + } + if ((a || b) && a != b) { + bo = a > b ? MOTOROLA : INTEL; + } + } + if (bo == UNKNOWN) { + // assuming platform's byte order +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + bo = INTEL; +#else + bo = MOTOROLA; +#endif + } + + // now swapping if necessary + if (!hasBOM && bo != HOSTORDER) { + if (t->getOrder() != HOSTORDER) { + Tag::swapByteOrder2(buffer, count - 8); + } + } + + glong written; + char* utf8Str = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, &written, nullptr); + delete [] buffer; + buffer = new char[written + 1]; + memcpy(buffer, utf8Str, written); + buffer[written] = 0; + } else if (!memcmp(value, "\0\0\0\0\0\0\0\0", 8)) { + // local charset string, whatever it is + memcpy(buffer, value + 8, count - 8); + buffer[count - 7] = buffer[count - 8] = '\0'; + + gsize written = 0; + char *utf8Str = g_locale_to_utf8(buffer, count - 8, nullptr, &written, nullptr); + if (utf8Str && written) { + delete [] buffer; + size_t length = strlen(utf8Str); + buffer = new char[length + 1]; + strcpy(buffer, utf8Str); + } else { + buffer[0] = 0; + } + if (utf8Str) { + g_free(utf8Str); + } } else { + // JIS: unsupported buffer[0] = 0; } @@ -467,11 +564,8 @@ public: } virtual void fromString (Tag* t, const std::string& value) { - char *buffer = new char[t->getCount()]; - memcpy (buffer, "ASCII\0\0\0", 8); - strcpy (buffer + 8, value.c_str()); - t->fromString (buffer, value.size() + 9); - delete [] buffer; + Glib::ustring tmpStr(value); + t->userCommentFromString (tmpStr); } }; UserCommentInterpreter userCommentInterpreter; From 835204430478cf9102b8f09be0b251f3d1b4d2dd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 1 Jan 2018 15:59:35 +0100 Subject: [PATCH 089/200] Left colour bar for CC and CL curve in lab tools are inverted, fixes #4270 --- rtgui/labcurve.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 8b2b2a217..6cbf11825 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -143,7 +143,7 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), ); ccshape->setBottomBarColorProvider(this, 2); - ccshape->setLeftBarColorProvider(this, 2); + ccshape->setLeftBarColorProvider(this, 7); ccshape->setRangeDefaultMilestones(0.05, 0.2, 0.58); lcshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_LC"))); @@ -162,7 +162,7 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), clshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP")); clshape->setEditID(EUID_Lab_CLCurve, BT_SINGLEPLANE_FLOAT); - clshape->setLeftBarColorProvider(this, 2); + clshape->setLeftBarColorProvider(this, 7); clshape->setRangeDefaultMilestones(0.25, 0.5, 0.75); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); @@ -627,6 +627,12 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType } Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B); + } else if (callerId == 7) { // cc and cl - left bar + + float value = (1.f - 0.7f) * float(valX) + 0.7f; + // whole hue range + // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) + Color::hsv2rgb01(float(valY), 1.f - float(valX), value, R, G, B); } caller->ccRed = double(R); From 5340f2c10336caaa3716ea53634d747217f9fc37 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 1 Jan 2018 21:40:34 +0100 Subject: [PATCH 090/200] Fixed whole hue range curve bar gradient, closes #4271 --- rtgui/labcurve.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 6cbf11825..ae5774960 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -578,7 +578,7 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } else if (callerId == 6) { // cc - left bar float value = (1.f - 0.7f) * float(valX) + 0.7f; @@ -613,7 +613,7 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType } else { // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } } else if (callerId == 4) { // LH - bottom bar Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B); @@ -632,7 +632,7 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY), 1.f - float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY*0.8), 1.f - float(valX), value, R, G, B); } caller->ccRed = double(R); From b624248a13a9bedaee9a1279882d6a782e46839f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 1 Jan 2018 22:02:15 +0100 Subject: [PATCH 091/200] LCurve::colorForValue formatting --- rtgui/labcurve.cc | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index ae5774960..1cde4262d 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -571,43 +571,30 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType } if (callerId == 1) { // ch - main curve - Color::hsv2rgb01(float(valX), float(valY), 0.5f, R, G, B); } else if (callerId == 2) { // cc - bottom bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } else if (callerId == 6) { // cc - left bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; - float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; - - if (hue > 1.0f) { - hue -= 1.0f; - } - - // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(hue, float(valX), value, R, G, B); - - // whole hue range + float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; + if (hue > 1.0f) { + hue -= 1.0f; + } // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - // Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else if (callerId == 3) { // lc - bottom bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; - if (lcredsk->get_active()) { // skin range // -0.1 rad < Hue < 1.6 rad // Y axis / from 0.92 up to 0.14056 float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; - if (hue > 1.0f) { hue -= 1.0f; } - // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else { @@ -619,16 +606,13 @@ void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B); } else if (callerId == 5) { // HH - bottom bar float h = float((valY - 0.5) * 0.3 + valX); - if (h > 1.0f) { h -= 1.0f; } else if (h < 0.0f) { h += 1.0f; } - Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B); } else if (callerId == 7) { // cc and cl - left bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) From e9782e15e2969bb47b820aff090b2e5fc8b17257 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 1 Jan 2018 22:28:56 +0100 Subject: [PATCH 092/200] Fixed accidently broken shadows/highlight tool --- rtengine/improcfun.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index bfe4ee021..6a39befef 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3553,8 +3553,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float chMixBG = float (params->chmixer.blue[1]); float chMixBB = float (params->chmixer.blue[2]); - int shHighlights = params->sh.highlights / 100.f; - int shShadows = params->sh.shadows / 100.f; + int shHighlights = params->sh.highlights; + int shShadows = params->sh.shadows; bool blackwhite = params->blackwhite.enabled; bool complem = params->blackwhite.enabledcc; float bwr = float (params->blackwhite.mixerRed); @@ -3722,13 +3722,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float g = gtemp[ti * TS + tj]; float b = btemp[ti * TS + tj]; + float mapval = 1.f + shmap->map[i][j]; float factor = 1.f; if (mapval > h_th) { - factor = (1.f - shHighlights) + shHighlights * h_th / mapval; + factor = (h_th + (100.0 - shHighlights) * (mapval - h_th) / 100.0) / mapval; } else if (mapval < s_th) { - factor = (s_th - (1.f - shShadows) * (s_th - mapval)) / mapval; + factor = (s_th - (100.0 - shShadows) * (s_th - mapval) / 100.0) / mapval; } rtemp[ti * TS + tj] = factor * r; From 0ac3bafbcad71033a2d503eb78a0955358251329 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 1 Jan 2018 22:48:16 +0100 Subject: [PATCH 093/200] some tweaks to the cropping GUI, inspired by recent comments on pixls.us --- rtgui/cropwindow.cc | 22 ++++++++++++++++++---- rtgui/imagearea.cc | 4 ++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index f4510682e..b8bbfe4fc 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -313,7 +313,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) changeZoom (zoom11index, true, action_x, action_y); fitZoom = false; } else { - zoomFit (); + zoomFitCrop (); } } else { zoom11 (); @@ -612,6 +612,10 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) } needRedraw = true; + + if (fitZoom) { + zoomFitCrop(); + } } else if (state == SCropWinMove) { if (iarea->showColorPickers () && !colorPickers.empty()) { needRedraw = true; @@ -722,6 +726,10 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) cropgl->cropManipReady (); iarea->setToolHand (); needRedraw = true; + + if (fitZoom) { + zoomFitCrop(); + } } if (decorated) { @@ -1356,6 +1364,12 @@ void CropWindow::expose (Cairo::RefPtr cr) drawObservedFrame (cr); } } else { + CropParams cropParams = cropHandler.cropParams; + if (state == SNormal && cropParams.guide != "None") { + cropParams.guide = "Frame"; + } + bool useBgColor = (state == SNormal); + if (cropHandler.cropPixbuf) { imgW = cropHandler.cropPixbuf->get_width (); imgH = cropHandler.cropPixbuf->get_height (); @@ -1772,7 +1786,7 @@ void CropWindow::expose (Cairo::RefPtr cr) if (cropHandler.cropParams.enabled) { int cropX, cropY; cropHandler.getPosition (cropX, cropY); - drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, imgW, imgH, cropX, cropY, zoomSteps[cropZoom].zoom, cropHandler.cropParams, (this == iarea->mainCropWindow), true, cropHandler.isFullDisplay ()); + drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, imgW, imgH, cropX, cropY, zoomSteps[cropZoom].zoom, cropParams, (this == iarea->mainCropWindow), useBgColor, cropHandler.isFullDisplay ()); } if (observedCropWin) { @@ -1853,7 +1867,7 @@ void CropWindow::expose (Cairo::RefPtr cr) cr->fill(); if (cropHandler.cropParams.enabled) { - drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, rough->get_width(), rough->get_height(), cropX, cropY, zoomSteps[cropZoom].zoom, cropHandler.cropParams, (this == iarea->mainCropWindow), true, cropHandler.isFullDisplay ()); + drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, rough->get_width(), rough->get_height(), cropX, cropY, zoomSteps[cropZoom].zoom, cropParams, (this == iarea->mainCropWindow), useBgColor, cropHandler.isFullDisplay ()); } if (observedCropWin) { @@ -2097,7 +2111,7 @@ void CropWindow::zoomFitCrop () centerY = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; setCropAnchorPosition(centerX, centerY); changeZoom (cz, true, centerX, centerY); - fitZoom = false; + fitZoom = true; //false; } else { zoomFit(); } diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index c0d334482..e22da4dfb 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -638,7 +638,7 @@ void ImageArea::initialImageArrived (CropWindow* cw) if (mainCropWindow) { if(firstOpen || options.prevdemo != PD_Sidecar || (!options.rememberZoomAndPan) ) { - mainCropWindow->zoomFit (); + mainCropWindow->zoomFitCrop (); firstOpen = false; mainCropWindow->cropHandler.getFullImageSize(fullImageWidth, fullImageHeight); } else { @@ -646,7 +646,7 @@ void ImageArea::initialImageArrived (CropWindow* cw) mainCropWindow->cropHandler.getFullImageSize(w, h); if(w != fullImageWidth || h != fullImageHeight) { - mainCropWindow->zoomFit (); + mainCropWindow->zoomFitCrop (); } fullImageWidth = w; From 99112832663da19a789d0ff2f189130fb8f6306f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 1 Jan 2018 22:51:25 +0100 Subject: [PATCH 094/200] More full hue range curve bar fixes, #4271 This one fixes the CIECAM02 color curve, and the Color Toning opacity curves. --- rtgui/colorappearance.cc | 2 +- rtgui/colortoning.cc | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index c9fb1baa3..f8dee05df 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1536,7 +1536,7 @@ void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller: float value = (1.f - 0.7f) * float (valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01 (float (valY), float (valX), value, R, G, B); + Color::hsv2rgb01 (float (valY*0.8), float (valX), value, R, G, B); } caller->ccRed = double (R); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index b53f7e5db..180b4235a 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -41,7 +41,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR colorCurveEditorG->setCurveListener (this); colorShape = static_cast(colorCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); - colorShape->setCurveColorProvider(this, 1); + colorShape->setCurveColorProvider(this, 4); std::vector milestones; // whole hue range @@ -951,8 +951,8 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele float R = 0.f, G = 0.f, B = 0.f; - if (callerId == 1) { // ch - main curve - Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); + if (callerId == 1) { // opacity curve left bar(s) + Color::hsv2rgb01(float(valY*0.8), 1.0f, 0.5f, R, G, B); } else if (callerId == 2) { // Slider 1 background if (valY <= 0.5) // the hue range @@ -983,6 +983,8 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele G = (gray * (1.0 - valX)) + G * valX; B = (gray * (1.0 - valX)) + B * valX; } + } else if (callerId == 4) { // color curve vertical and horizontal crosshair + Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); } caller->ccRed = double(R); From e229b9519e515d17bac3b53ebb63aa7ff281bb15 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 1 Jan 2018 23:41:07 +0100 Subject: [PATCH 095/200] made ToolPanel::setListener virtual (needed by MetaDataPanel to work properly) --- rtgui/toolpanel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index d5814c040..d3d7439a9 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -88,7 +88,7 @@ public: { multiImage = m; } - void setListener (ToolPanelListener* tpl) + virtual void setListener (ToolPanelListener* tpl) { listener = tpl; } From 8168611c23c356632f6d2b4dd01a3aec46ee54ea Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 3 Jan 2018 15:44:34 +0100 Subject: [PATCH 096/200] added preferences to control the behaviour of the crop tool --- rtdata/languages/default | 6 ++++++ rtgui/cropwindow.cc | 23 +++++++++++++++++------ rtgui/filebrowserentry.cc | 10 ++++++++++ rtgui/imagearea.cc | 12 ++++++++++-- rtgui/options.cc | 10 ++++++++++ rtgui/options.h | 7 ++++++- rtgui/preferences.cc | 22 ++++++++++++++++++++++ rtgui/preferences.h | 3 +++ rtgui/previewwindow.cc | 13 ++++++++++++- 9 files changed, 96 insertions(+), 10 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 92bbaa08f..25af81141 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -976,6 +976,12 @@ PREFERENCES_CLUTSCACHE;HaldCLUT Cache PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs PREFERENCES_CLUTSDIR;HaldCLUT directory PREFERENCES_CMMBPC;Black point compensation +PREFERENCES_CROP;Crop editing +PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +PREFERENCES_CROP_GUIDES_NONE;None +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons PREFERENCES_CURVEBBOXPOS_ABOVE;Above PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index b8bbfe4fc..001805362 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -312,8 +312,10 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) screenCoordToImage (x, y, action_x, action_y); changeZoom (zoom11index, true, action_x, action_y); fitZoom = false; + } else if (options.cropAutoFit) { + zoomFitCrop(); } else { - zoomFitCrop (); + zoomFit(); } } else { zoom11 (); @@ -613,7 +615,7 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) needRedraw = true; - if (fitZoom) { + if (fitZoom && options.cropAutoFit) { zoomFitCrop(); } } else if (state == SCropWinMove) { @@ -727,7 +729,7 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) iarea->setToolHand (); needRedraw = true; - if (fitZoom) { + if (fitZoom && options.cropAutoFit) { zoomFitCrop(); } } @@ -1365,8 +1367,17 @@ void CropWindow::expose (Cairo::RefPtr cr) } } else { CropParams cropParams = cropHandler.cropParams; - if (state == SNormal && cropParams.guide != "None") { - cropParams.guide = "Frame"; + if (state == SNormal) { + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cropParams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cropParams.guide = "Frame"; + break; + default: + break; + } } bool useBgColor = (state == SNormal); @@ -2111,7 +2122,7 @@ void CropWindow::zoomFitCrop () centerY = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; setCropAnchorPosition(centerX, centerY); changeZoom (cz, true, centerX, centerY); - fitZoom = true; //false; + fitZoom = options.cropAutoFit; } else { zoomFit(); } diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index c3adae3aa..cb3844687 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -168,6 +168,16 @@ void FileBrowserEntry::customBackBufferUpdate (Cairo::RefPtr c) drawCrop (c, prex, prey, prew, preh, 0, 0, scale, cropParams, true, false); } else { rtengine::procparams::CropParams cparams = thumbnail->getProcParams().crop; + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cparams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cparams.guide = "Frame"; + break; + default: + break; + } if (cparams.enabled && !thumbnail->isQuick()) { // Quick thumb have arbitrary sizes, so don't apply the crop drawCrop (c, prex, prey, prew, preh, 0, 0, scale, cparams, true, false); diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index e22da4dfb..0344e04b7 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -638,7 +638,11 @@ void ImageArea::initialImageArrived (CropWindow* cw) if (mainCropWindow) { if(firstOpen || options.prevdemo != PD_Sidecar || (!options.rememberZoomAndPan) ) { - mainCropWindow->zoomFitCrop (); + if (options.cropAutoFit) { + mainCropWindow->zoomFitCrop(); + } else { + mainCropWindow->zoomFit(); + } firstOpen = false; mainCropWindow->cropHandler.getFullImageSize(fullImageWidth, fullImageHeight); } else { @@ -646,7 +650,11 @@ void ImageArea::initialImageArrived (CropWindow* cw) mainCropWindow->cropHandler.getFullImageSize(w, h); if(w != fullImageWidth || h != fullImageHeight) { - mainCropWindow->zoomFitCrop (); + if (options.cropAutoFit) { + mainCropWindow->zoomFitCrop(); + } else { + mainCropWindow->zoomFit(); + } } fullImageWidth = w; diff --git a/rtgui/options.cc b/rtgui/options.cc index 127ea990f..449aa3809 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -614,6 +614,8 @@ void Options::setDefaults () gimpPluginShowInfoDialog = true; maxRecentFolders = 15; rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc + cropGuides = CROP_GUIDE_FULL; + cropAutoFit = false; } Options* Options::copyFrom (Options* other) @@ -1386,6 +1388,12 @@ void Options::readFromFile (Glib::ustring fname) if (keyFile.has_key ("Crop Settings", "PPI")) { cropPPI = keyFile.get_integer ("Crop Settings", "PPI"); } + if (keyFile.has_key("Crop Settings", "GuidesMode")) { + cropGuides = CropGuidesMode(std::max(int(CROP_GUIDE_NONE), std::min(keyFile.get_integer("Crop Settings", "GuidesMode"), int(CROP_GUIDE_FULL)))); + } + if (keyFile.has_key("Crop Settings", "AutoFit")) { + cropAutoFit = keyFile.get_boolean("Crop Settings", "AutoFit"); + } } if (keyFile.has_group ("Color Management")) { @@ -2018,6 +2026,8 @@ void Options::saveToFile (Glib::ustring fname) //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); keyFile.set_integer ("Crop Settings", "PPI", cropPPI); + keyFile.set_integer("Crop Settings", "GuidesMode", cropGuides); + keyFile.set_boolean("Crop Settings", "AutoFit", cropAutoFit); keyFile.set_string ("Color Management", "PrinterProfile", rtSettings.printerProfile); keyFile.set_integer ("Color Management", "PrinterIntent", rtSettings.printerIntent); diff --git a/rtgui/options.h b/rtgui/options.h index feeca7983..31d17ef9b 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -191,7 +191,6 @@ public: int showFilePanelState; // 0: normal, 1: maximized, 2: normal, 3: hidden bool showInfo; bool mainNBVertical; // main notebook vertical tabs? - int cropPPI; bool showClippedHighlights; bool showClippedShadows; int highlightThreshold; @@ -261,6 +260,12 @@ public: bool showFilmStripToolBar; + // cropping options + int cropPPI; + enum CropGuidesMode { CROP_GUIDE_NONE, CROP_GUIDE_FRAME, CROP_GUIDE_FULL }; + CropGuidesMode cropGuides; + bool cropAutoFit; + // Performance options Glib::ustring clutsDir; int rgbDenoiseThreadLimit; // maximum number of threads for the denoising tool ; 0 = use the maximum available diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index b53e884f5..2be5f3664 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -582,6 +582,22 @@ Gtk::Widget* Preferences::getProcParamsPanel () cdf->add(*dirgrid); mvbpp->pack_start (*cdf, Gtk::PACK_SHRINK, 4 ); + // Crop + Gtk::Frame *cropframe = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CROP"))); + Gtk::VBox *cropvb = Gtk::manage(new Gtk::VBox()); + Gtk::HBox *crophb = Gtk::manage(new Gtk::HBox()); + cropGuides = Gtk::manage(new Gtk::ComboBoxText()); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_NONE")); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_FRAME")); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_FULL")); + crophb->pack_start(*Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ")), Gtk::PACK_SHRINK, 4); + crophb->pack_start(*cropGuides); + cropvb->pack_start(*crophb); + cropAutoFit = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CROP_AUTO_FIT"))); + cropvb->pack_start(*cropAutoFit); + cropframe->add(*cropvb); + mvbpp->pack_start(*cropframe, Gtk::PACK_SHRINK, 4); + return mvbpp; } @@ -1840,6 +1856,9 @@ void Preferences::storePreferences () moptions.sndLngEditProcDone = txtSndLngEditProcDone->get_text (); moptions.sndLngEditProcDoneSecs = spbSndLngEditProcDoneSecs->get_value (); #endif + + moptions.cropGuides = Options::CropGuidesMode(cropGuides->get_active_row_number()); + moptions.cropAutoFit = cropAutoFit->get_active(); } void Preferences::fillPreferences () @@ -2070,6 +2089,9 @@ void Preferences::fillPreferences () } } + cropGuides->set_active(moptions.cropGuides); + cropAutoFit->set_active(moptions.cropAutoFit); + addc.block (false); setc.block (false); cpfconn.block (false); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 7ce592457..cb0e6c709 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -204,6 +204,9 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener DynamicProfilePanel *dynProfilePanel; + Gtk::ComboBoxText *cropGuides; + Gtk::CheckButton *cropAutoFit; + Glib::ustring storedValueRaw; Glib::ustring storedValueImg; diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index cd4e0c75c..06ce3ad18 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -86,7 +86,18 @@ void PreviewWindow::updatePreviewImage () cc->fill(); if (previewHandler->getCropParams().enabled) { - drawCrop (cc, imgX, imgY, imgW, imgH, 0, 0, zoom, previewHandler->getCropParams(), true, false); + rtengine::CropParams cparams = previewHandler->getCropParams(); + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cparams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cparams.guide = "Frame"; + break; + default: + break; + } + drawCrop (cc, imgX, imgY, imgW, imgH, 0, 0, zoom, cparams, true, false); } } } From 6591551a7c2b06831c4ba13345550afee2d8aa40 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 3 Jan 2018 16:02:48 +0100 Subject: [PATCH 097/200] added "As Image" crop ratio --- rtengine/procparams.cc | 2 +- rtgui/crop.cc | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 97b54e37f..8fbab7a8d 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1520,7 +1520,7 @@ CropParams::CropParams() : w(15000), h(15000), fixratio(true), - ratio("3:2"), + ratio("As Image"), orientation("As Image"), guide("Frame") { diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 546d910ba..29c64501d 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -57,6 +57,7 @@ int notifyListenerUI (void* data) Crop::Crop(): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true), crop_ratios{ + {M("GENERAL_ASIMAGE"), 0.0}, {"3:2", 3.0 / 2.0}, // L1.5, P0.666... {"4:3", 4.0 / 3.0}, // L1.333..., P0.75 {"16:9", 16.0 / 9.0}, // L1.777..., P0.5625 @@ -292,10 +293,14 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h); } - ratio->set_active_text (pp->crop.ratio); + if (pp->crop.ratio == "As Image") { + ratio->set_active(0); + } else { + ratio->set_active_text (pp->crop.ratio); + } fixr->set_active (pp->crop.fixratio); - const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; if (pp->crop.orientation == "Landscape") { orientation->set_active (flip_orientation ? 1 : 0); @@ -390,7 +395,7 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) pp->crop.ratio = ratio->get_active_text (); // for historical reasons we store orientation different if ratio is written as 2:3 instead of 3:2, but in GUI 'landscape' is always long side horizontal regardless of the ratio is written short or long side first. - const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; if (orientation->get_active_row_number() == 0) { pp->crop.orientation = flip_orientation ? "Portrait" : "Landscape"; @@ -1265,6 +1270,9 @@ double Crop::getRatio () } r = crop_ratios[ratio->get_active_row_number()].value; + if (!r) { + r = maxh <= maxw ? float(maxh)/float(maxw) : float(maxw)/float(maxh); + } if (r < 1.0) { r = 1.0 / r; // convert to long side first (eg 4:5 becomes 5:4) From 72ec02a98db6680d3f9f5b1a5b702bbecacaed2e Mon Sep 17 00:00:00 2001 From: Oleg Koncevoy Date: Wed, 3 Jan 2018 17:12:36 +0200 Subject: [PATCH 098/200] Added restart required label to Preferences, Color management page. Now it is explicitly stated, that it will be possible to select monitor profile only after restarting rawtherapee. Fixes #4198 modified: rtgui/preferences.cc --- rtgui/preferences.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index b53e884f5..8e110e419 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -741,8 +741,12 @@ Gtk::Widget* Preferences::getColorManagementPanel () setExpandAlignProperties (iccdgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); iccdgrid->set_column_spacing (4); + Gtk::Label* monProfileRestartNeeded = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); + setExpandAlignProperties(monProfileRestartNeeded, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + iccdgrid->attach (*pdlabel, 0, 0, 1, 1); iccdgrid->attach (*iccDir, 1, 0, 1, 1); + iccdgrid->attach (*monProfileRestartNeeded, 2, 0, 1, 1); iccDir->signal_selection_changed ().connect (sigc::mem_fun (this, &Preferences::iccDirChanged)); From 23934649eb99641205c759ab06ceb3cfc7b76e4f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 3 Jan 2018 19:29:18 +0100 Subject: [PATCH 099/200] Speedup for weighted tone curve --- rtengine/curves.h | 79 ++++++++++++++++++++++++++++++++++++++++++- rtengine/improcfun.cc | 8 +---- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/rtengine/curves.h b/rtengine/curves.h index e8b65c33d..73cc37ff6 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -828,8 +828,12 @@ class WeightedStdToneCurve : public ToneCurve { private: float Triangle(float refX, float refY, float X2) const; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; +#endif public: void Apply(float& r, float& g, float& b) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const; }; class LuminanceToneCurve : public ToneCurve @@ -1003,6 +1007,17 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const return a1; } +#if defined( __SSE2__ ) && defined( __x86_64__ ) +inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const +{ + vfloat a2 = a1 - a; + vmask cmask = vmaskf_lt(b, a); + vfloat b3 = vself(cmask, b, F2V(65535.f) - b); + vfloat a3 = vself(cmask, a, F2V(65535.f) - a); + return b + a2 * b3 / a3; +} +#endif + // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const @@ -1010,6 +1025,9 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const assert (lutToneCurve); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); float r1 = lutToneCurve[r]; float g1 = Triangle(r, r1, g); float b1 = Triangle(r, r1, b); @@ -1022,11 +1040,70 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const float r3 = Triangle(b, b3, r); float g3 = Triangle(b, b3, g); - r = CLIP( r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); + r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); } +inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { + assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); + + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + Apply(r[i], g[i], b[i]); + i++; + } + +#if defined( __SSE2__ ) && defined( __x86_64__ ) + const vfloat c65535v = F2V(65535.f); + const vfloat zd5v = F2V(0.5f); + const vfloat zd25v = F2V(0.25f); + + for (; i + 3 < end; i += 4) { + vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); + vfloat r1 = lutToneCurve[r_val]; + vfloat g1 = Triangle(r_val, r1, g_val); + vfloat b1 = Triangle(r_val, r1, b_val); + + vfloat g2 = lutToneCurve[g_val]; + vfloat r2 = Triangle(g_val, g2, r_val); + vfloat b2 = Triangle(g_val, g2, b_val); + + vfloat b3 = lutToneCurve[b_val]; + vfloat r3 = Triangle(b_val, b3, r_val); + vfloat g3 = Triangle(b_val, b3, g_val); + + STVF(r[i], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); + STVF(g[i], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); + STVF(b[i], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + Apply(r[i], g[i], b[i]); + } +#endif +} + // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 6a39befef..c639ffbec 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -222,14 +222,8 @@ void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode c } } else if (curveMode == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve); - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); - gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); - btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); - } + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); } } else if (curveMode == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve); From a43886032f1f3c873d4925b9224efcde3c759ee6 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 4 Jan 2018 09:29:53 +0100 Subject: [PATCH 100/200] small tweak to the "zoom to fit crop" functionality --- rtgui/imagearea.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 0344e04b7..4c4f78a38 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -638,7 +638,7 @@ void ImageArea::initialImageArrived (CropWindow* cw) if (mainCropWindow) { if(firstOpen || options.prevdemo != PD_Sidecar || (!options.rememberZoomAndPan) ) { - if (options.cropAutoFit) { + if (options.cropAutoFit || options.bgcolor != 0) { mainCropWindow->zoomFitCrop(); } else { mainCropWindow->zoomFit(); From ea1e001d15bf3eeb14c60098287a1c364ba47c7b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 4 Jan 2018 19:03:02 +0100 Subject: [PATCH 101/200] Speedup for 'Saturation and Value Blending' tonecurve --- rtengine/color.h | 42 ++++++++++++++--- rtengine/curves.h | 102 ++++++++++++++++++++++++++++++++++++------ rtengine/improcfun.cc | 29 ++++-------- 3 files changed, 134 insertions(+), 39 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index 049defb70..f2092f530 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -298,6 +298,36 @@ public: } } + static inline void rgb2hsvtc(float r, float g, float b, float &h, float &s, float &v) + { + const float var_Min = min(r, g, b); + const float var_Max = max(r, g, b); + const float del_Max = var_Max - var_Min; + + v = var_Max / 65535.f; + + if (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 * @param h hue channel [0 ; 1] @@ -312,14 +342,14 @@ public: 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 + const int sector = h; // sector 0 to 5, floor() is very slow, and h is always > 0 + const 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; + const float vs = v * s; + const float p = v - vs; + const float q = v - f * vs; + const float t = p + v - q; switch (sector) { case 1: diff --git a/rtengine/curves.h b/rtengine/curves.h index e8b65c33d..f537bf6c5 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -828,8 +828,12 @@ class WeightedStdToneCurve : public ToneCurve { private: float Triangle(float refX, float refY, float X2) const; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; +#endif public: void Apply(float& r, float& g, float& b) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const; }; class LuminanceToneCurve : public ToneCurve @@ -1003,6 +1007,17 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const return a1; } +#if defined( __SSE2__ ) && defined( __x86_64__ ) +inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const +{ + vfloat a2 = a1 - a; + vmask cmask = vmaskf_lt(b, a); + vfloat b3 = vself(cmask, b, F2V(65535.f) - b); + vfloat a3 = vself(cmask, a, F2V(65535.f) - a); + return b + a2 * b3 / a3; +} +#endif + // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const @@ -1010,6 +1025,9 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const assert (lutToneCurve); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); float r1 = lutToneCurve[r]; float g1 = Triangle(r, r1, g); float b1 = Triangle(r, r1, b); @@ -1022,11 +1040,70 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const float r3 = Triangle(b, b3, r); float g3 = Triangle(b, b3, g); - r = CLIP( r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); + r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); } +inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { + assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); + + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + Apply(r[i], g[i], b[i]); + i++; + } + +#if defined( __SSE2__ ) && defined( __x86_64__ ) + const vfloat c65535v = F2V(65535.f); + const vfloat zd5v = F2V(0.5f); + const vfloat zd25v = F2V(0.25f); + + for (; i + 3 < end; i += 4) { + vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); + vfloat r1 = lutToneCurve[r_val]; + vfloat g1 = Triangle(r_val, r1, g_val); + vfloat b1 = Triangle(r_val, r1, b_val); + + vfloat g2 = lutToneCurve[g_val]; + vfloat r2 = Triangle(g_val, g2, r_val); + vfloat b2 = Triangle(g_val, g2, b_val); + + vfloat b3 = lutToneCurve[b_val]; + vfloat r3 = Triangle(b_val, b3, r_val); + vfloat g3 = Triangle(b_val, b3, g_val); + + STVF(r[i], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); + STVF(g[i], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); + STVF(b[i], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + Apply(r[i], g[i], b[i]); + } +#endif +} + // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const @@ -1034,29 +1111,28 @@ inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) c assert (lutToneCurve); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + + const float lum = (r + g + b) / 3.f; + const float newLum = lutToneCurve[lum]; + float h, s, v; - float lum = (r + g + b) / 3.f; - //float lum = Color::rgbLuminance(r, g, b); - float newLum = lutToneCurve[lum]; - - if (newLum == lum) { - return; - } - - Color::rgb2hsv(r, g, b, h, s, v); + Color::rgb2hsvtc(r, g, b, h, s, v); float dV; if (newLum > lum) { // Linearly targeting Value = 1 and Saturation = 0 - float coef = (newLum - lum) / (65535.f - lum); + const float coef = (newLum - lum) / (65535.f - lum); dV = (1.f - v) * coef; s *= 1.f - coef; } else { // Linearly targeting Value = 0 - float coef = (newLum - lum) / lum ; + const float coef = (newLum - lum) / lum ; dV = v * coef; } - Color::hsv2rgb(h, s, v + dV, r, g, b); + Color::hsv2rgbdcp(h, s, v + dV, r, g, b); } } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 6a39befef..34c43be0e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -197,39 +197,28 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode curveMode, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, PerceptualToneCurveState ptcApplyState) { if (curveMode == ToneCurveParams::TcMode::STD) { // Standard + const StandardToneCurve& userToneCurve = static_cast (customToneCurve); for (int i = istart, ti = 0; i < tH; i++, ti++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve); - userToneCurve.BatchApply ( - 0, tW - jstart, - &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); } } else if (curveMode == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like + const AdobeToneCurve& userToneCurve = static_cast (customToneCurve); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); } } } else if (curveMode == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels + const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve); - rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); - gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); - btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); } } } else if (curveMode == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve); - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); - gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); - btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); - } + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); } } else if (curveMode == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve); @@ -239,7 +228,7 @@ void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode c rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); } } } else if (curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant @@ -250,7 +239,7 @@ void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode c rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply (rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj], ptcApplyState); + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj], ptcApplyState); } } } From 0f25bfe87b2b20d65348605c020bde469565da96 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 4 Jan 2018 23:15:53 +0100 Subject: [PATCH 102/200] Don't check the impossible cases in rgb2hsvtc() --- rtengine/color.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/rtengine/color.h b/rtengine/color.h index f2092f530..2b6d40174 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -313,18 +313,12 @@ public: s = del_Max / var_Max; if (r == var_Max) { - h = (g - b) / del_Max; + h = (g < b ? 6.f : 0.f) + (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; - } } } From 0fcc1987a5bbc301bca50485e08206adf2eff1a4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 5 Jan 2018 16:42:22 +0100 Subject: [PATCH 103/200] Speedup for perceptual tone curve #4269 --- rtengine/ciecam02.cc | 72 ++++--- rtengine/curves.cc | 443 ++++++++++++++++++++++-------------------- rtengine/curves.h | 2 +- rtengine/improcfun.cc | 8 +- rtengine/rt_math.h | 2 + 5 files changed, 282 insertions(+), 245 deletions(-) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 77c57048a..560d5721a 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -608,31 +608,31 @@ void Ciecam02::calculate_ab ( double &aa, double &bb, double h, double e, double } void Ciecam02::calculate_abfloat ( float &aa, float &bb, float h, float e, float t, float nbb, float a ) { - float2 sincosval = xsincosf ((h * rtengine::RT_PI) / 180.0f); + float2 sincosval = xsincosf(h * rtengine::RT_PI_F_180); float sinh = sincosval.x; float cosh = sincosval.y; float x = (a / nbb) + 0.305f; - float p3 = 1.05f; - bool swapValues = fabs ( sinh ) > fabs ( cosh ); + constexpr float p3 = 1.05f; + const bool swapValues = fabs(sinh) > fabs(cosh); if (swapValues) { - std::swap (sinh, cosh); + std::swap(sinh, cosh); } float c1 = 1.f; float c2 = sinh / cosh; if (swapValues) { - std::swap (c1, c2); + std::swap(c1, c2); } - float div = ((e / (t * cosh)) - (-0.31362f - (p3 * 0.15681f)) * c1 - ((0.01924f - (p3 * 4.49038f)) * (c2))); + float div = ((e / (t * cosh)) - (-0.31362f - (p3 * 0.15681f)) * c1 - ((0.01924f - (p3 * 4.49038f)) * c2)); // for large values of t the above calculation can change its sign which results in a hue shift of 180 degree // so we have to check the sign to avoid this shift. // Additionally it seems useful to limit the minimum value of div // I limited it, but I'm sure the actual limit is not the best one - if (signf (div) != signf (cosh) || fabsf (div) <= fabsf (cosh) * 2.f) { + if (signf(div) != signf(cosh) || fabsf(div) <= fabsf(cosh) * 2.f) { div = cosh * 2.f; } @@ -640,7 +640,7 @@ void Ciecam02::calculate_abfloat ( float &aa, float &bb, float h, float e, float bb = (aa * sinh) / cosh; if (swapValues) { - std::swap (aa, bb); + std::swap(aa, bb); } } #ifdef __SSE2__ @@ -1007,9 +1007,18 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f bp = MAXR (bp, 0.0f); } - rpa = nonlinear_adaptationfloat ( rp, fl ); - gpa = nonlinear_adaptationfloat ( gp, fl ); - bpa = nonlinear_adaptationfloat ( bp, fl ); +#ifdef __SSE2__ + vfloat pv = _mm_setr_ps(rp, gp, bp, 1.f); + vfloat fv = F2V(fl); + vfloat outv = nonlinear_adaptationfloat(pv, fv); + rpa = outv[0]; + gpa = outv[1]; + bpa = outv[2]; +#else + rpa = nonlinear_adaptationfloat(rp, fl); + gpa = nonlinear_adaptationfloat(gp, fl); + bpa = nonlinear_adaptationfloat(bp, fl); +#endif ca = rpa - ((12.0f * gpa) - bpa) / 11.0f; cb = (0.11111111f) * (rpa + gpa - (2.0f * bpa)); @@ -1084,26 +1093,43 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl float a, ca, cb; float e, t; gamu = 1; - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, gamu ); - e = ((961.53846f) * nc * ncb) * (xcosf ( ((h * rtengine::RT_PI) / 180.0f) + 2.0f ) + 3.8f); - a = pow_F ( J / 100.0f, 1.0f / (c * cz) ) * aw; - t = pow_F ( 10.f * C / (sqrtf ( J ) * pow1), 1.1111111f ); + xyz_to_cat02float(rw, gw, bw, xw, yw, zw, gamu); + e = ((961.53846f) * nc * ncb) * (xcosf(h * rtengine::RT_PI_F_180 + 2.0f) + 3.8f); - calculate_abfloat ( ca, cb, h, e, t, nbb, a ); - Aab_to_rgbfloat ( rpa, gpa, bpa, a, ca, cb, nbb ); +#ifdef __SSE2__ + vfloat powinv1 = _mm_setr_ps(J / 100.0f, 10.f * C / (sqrtf(J) * pow1), 1.f, 1.f); + vfloat powinv2 = _mm_setr_ps(1.0f / (c * cz), 1.1111111f, 1.f, 1.f); + vfloat powoutv = pow_F(powinv1, powinv2); + a = powoutv[0] * aw; + t = powoutv[1]; +#else + a = pow_F(J / 100.0f, 1.0f / (c * cz)) * aw; + t = pow_F(10.f * C / (sqrtf(J) * pow1), 1.1111111f); +#endif - rp = inverse_nonlinear_adaptationfloat ( rpa, fl ); - gp = inverse_nonlinear_adaptationfloat ( gpa, fl ); - bp = inverse_nonlinear_adaptationfloat ( bpa, fl ); + calculate_abfloat(ca, cb, h, e, t, nbb, a); + Aab_to_rgbfloat(rpa, gpa, bpa, a, ca, cb, nbb); - hpe_to_xyzfloat ( x, y, z, rp, gp, bp ); - xyz_to_cat02float ( rc, gc, bc, x, y, z, gamu ); +#ifdef __SSE2__ + vfloat pav = _mm_setr_ps(rpa, gpa, bpa, 1.f); + vfloat fv = F2V(fl); + vfloat outv = inverse_nonlinear_adaptationfloat(pav, fv); + rp = outv[0]; + gp = outv[1]; + bp = outv[2]; +#else + rp = inverse_nonlinear_adaptationfloat(rpa, fl); + gp = inverse_nonlinear_adaptationfloat(gpa, fl); + bp = inverse_nonlinear_adaptationfloat(bpa, fl); +#endif + hpe_to_xyzfloat(x, y, z, rp, gp, bp); + xyz_to_cat02float(rc, gc, bc, x, y, z, gamu); r = rc / (((yw * d) / rw) + (1.0f - d)); g = gc / (((yw * d) / gw) + (1.0f - d)); b = bc / (((yw * d) / bw) + (1.0f - d)); - cat02_to_xyzfloat ( x, y, z, r, g, b, gamu ); + cat02_to_xyzfloat(x, y, z, r, g, b, gamu); } #ifdef __SSE2__ diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 9f6db0a50..8d52782a2 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -1822,64 +1822,242 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const return maxslope; } -void PerceptualToneCurve::Apply(float &r, float &g, float &b, const PerceptualToneCurveState &state) const +void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float *rc, float *gc, float *bc, const PerceptualToneCurveState &state) const { - float x, y, z; - - if (!state.isProphoto) { - // convert to prophoto space to make sure the same result is had regardless of working color space - float newr = state.Working2Prophoto[0][0] * r + state.Working2Prophoto[0][1] * g + state.Working2Prophoto[0][2] * b; - float newg = state.Working2Prophoto[1][0] * r + state.Working2Prophoto[1][1] * g + state.Working2Prophoto[1][2] * b; - float newb = state.Working2Prophoto[2][0] * r + state.Working2Prophoto[2][1] * g + state.Working2Prophoto[2][2] * b; - r = newr; - g = newg; - b = newb; - } - const AdobeToneCurve& adobeTC = static_cast((const ToneCurve&) * this); - float ar = r; - float ag = g; - float ab = b; - adobeTC.Apply(ar, ag, ab); - if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) { - // clip fast path, will also avoid strange colors of clipped highlights - r = g = b = 65535.f; - return; - } + for (size_t i = start; i < end; ++i) { + float r = CLIP(rc[i]); + float g = CLIP(gc[i]); + float b = CLIP(bc[i]); - if (ar <= 0.f && ag <= 0.f && ab <= 0.f) { - r = g = b = 0; - return; - } + if (!state.isProphoto) { + // convert to prophoto space to make sure the same result is had regardless of working color space + float newr = state.Working2Prophoto[0][0] * r + state.Working2Prophoto[0][1] * g + state.Working2Prophoto[0][2] * b; + float newg = state.Working2Prophoto[1][0] * r + state.Working2Prophoto[1][1] * g + state.Working2Prophoto[1][2] * b; + float newb = state.Working2Prophoto[2][0] * r + state.Working2Prophoto[2][1] * g + state.Working2Prophoto[2][2] * b; + r = newr; + g = newg; + b = newb; + } - // ProPhoto constants for luminance, that is xyz_prophoto[1][] - const float Yr = 0.2880402f; - const float Yg = 0.7118741f; - const float Yb = 0.0000857f; + float ar = r; + float ag = g; + float ab = b; + adobeTC.Apply(ar, ag, ab); - // we use the Adobe (RGB-HSV hue-stabilized) curve to decide luminance, which generally leads to a less contrasty result - // compared to a pure luminance curve. We do this to be more compatible with the most popular curves. - float oldLuminance = r * Yr + g * Yg + b * Yb; - float newLuminance = ar * Yr + ag * Yg + ab * Yb; - float Lcoef = newLuminance / oldLuminance; - r = LIM(r * Lcoef, 0.f, 65535.f); - g = LIM(g * Lcoef, 0.f, 65535.f); - b = LIM(b * Lcoef, 0.f, 65535.f); + if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) { + // clip fast path, will also avoid strange colours of clipped highlights + rc[i] = gc[i] = bc[i] = 65535.f; + continue; + } - // move to JCh so we can modulate chroma based on the global contrast-related chroma scaling factor - Color::Prophotoxyz(r, g, b, x, y, z); + if (ar <= 0.f && ag <= 0.f && ab <= 0.f) { + rc[i] = gc[i] = bc[i] = 0; + continue; + } - float J, C, h; - Ciecam02::xyz2jch_ciecam02float( J, C, h, - aw, fl, - x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, - xw, yw, zw, - c, nc, pow1, nbb, ncb, cz, d); + // ProPhoto constants for luminance, that is xyz_prophoto[1][] + constexpr float Yr = 0.2880402f; + constexpr float Yg = 0.7118741f; + constexpr float Yb = 0.0000857f; + + // we use the Adobe (RGB-HSV hue-stabilized) curve to decide luminance, which generally leads to a less contrasty result + // compared to a pure luminance curve. We do this to be more compatible with the most popular curves. + const float oldLuminance = r * Yr + g * Yg + b * Yb; + const float newLuminance = ar * Yr + ag * Yg + ab * Yb; + const float Lcoef = newLuminance / oldLuminance; + r = LIM(r * Lcoef, 0.f, 65535.f); + g = LIM(g * Lcoef, 0.f, 65535.f); + b = LIM(b * Lcoef, 0.f, 65535.f); + + // move to JCh so we can modulate chroma based on the global contrast-related chroma scaling factor + float x, y, z; + Color::Prophotoxyz(r, g, b, x, y, z); + + float J, C, h; + Ciecam02::xyz2jch_ciecam02float( J, C, h, + aw, fl, + x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, + xw, yw, zw, + c, nc, pow1, nbb, ncb, cz, d); - if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { - // this can happen for dark noise colors or colors outside human gamut. Then we just return the curve's result. + if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { + // this can happen for dark noise colours or colours outside human gamut. Then we just return the curve's result. + if (!state.isProphoto) { + float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; + float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; + float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + r = newr; + g = newg; + b = newb; + } + rc[i] = r; + gc[i] = g; + bc[i] = b; + + continue; + } + + float cmul = state.cmul_contrast; // chroma scaling factor + + // depending on color, the chroma scaling factor can be fine-tuned below + + { + // decrease chroma scaling sligthly of extremely saturated colors + float saturated_scale_factor = 0.95f; + constexpr float lolim = 35.f; // lower limit, below this chroma all colors will keep original chroma scaling factor + constexpr float hilim = 60.f; // high limit, above this chroma the chroma scaling factor is multiplied with the saturated scale factor value above + + if (C < lolim) { + // chroma is low enough, don't scale + saturated_scale_factor = 1.f; + } else if (C < hilim) { + // S-curve transition between low and high limit + float x = (C - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } + + saturated_scale_factor = (1.f - x) + saturated_scale_factor * x; + } else { + // do nothing, high saturation color, keep scale factor + } + + cmul *= saturated_scale_factor; + } + + { + // increase chroma scaling slightly of shadows + float nL = Color::gamma2curve[newLuminance]; // apply gamma so we make comparison and transition with a more perceptual lightness scale + float dark_scale_factor = 1.20f; + //float dark_scale_factor = 1.0 + state.debug.p2 / 100.0f; + constexpr float lolim = 0.15f; + constexpr float hilim = 0.50f; + + if (nL < lolim) { + // do nothing, keep scale factor + } else if (nL < hilim) { + // S-curve transition + float x = (nL - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } + + dark_scale_factor = dark_scale_factor * (1.0f - x) + x; + } else { + dark_scale_factor = 1.f; + } + + cmul *= dark_scale_factor; + } + + { + // to avoid strange CIECAM02 chroma errors on close-to-shadow-clipping colors we reduce chroma scaling towards 1.0 for black colors + float dark_scale_factor = 1.f / cmul; + constexpr float lolim = 4.f; + constexpr float hilim = 7.f; + + if (J < lolim) { + // do nothing, keep scale factor + } else if (J < hilim) { + // S-curve transition + float x = (J - lolim) / (hilim - lolim); + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } + + dark_scale_factor = dark_scale_factor * (1.f - x) + x; + } else { + dark_scale_factor = 1.f; + } + + cmul *= dark_scale_factor; + } + + C *= cmul; + + Ciecam02::jch2xyz_ciecam02float( x, y, z, + J, C, h, + xw, yw, zw, + c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw ); + + if (!isfinite(x) || !isfinite(y) || !isfinite(z)) { + // can happen for colours on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result. + if (!state.isProphoto) { + float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; + float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; + float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + r = newr; + g = newg; + b = newb; + } + + rc[i] = r; + gc[i] = g; + bc[i] = b; + + continue; + } + + Color::xyz2Prophoto(x, y, z, r, g, b); + r *= 655.35f; + g *= 655.35f; + b *= 655.35f; + r = LIM(r, 0.f, 65535.f); + g = LIM(g, 0.f, 65535.f); + b = LIM(b, 0.f, 65535.f); + + { + // limit saturation increase in rgb space to avoid severe clipping and flattening in extreme highlights + + // we use the RGB-HSV hue-stable "Adobe" curve as reference. For S-curve contrast it increases + // saturation greatly, but desaturates extreme highlights and thus provide a smooth transition to + // the white point. However the desaturation effect is quite strong so we make a weighting + const float as = Color::rgb2s(ar, ag, ab); + const float s = Color::rgb2s(r, g, b); + + const float sat_scale = as <= 0.f ? 1.f : s / as; // saturation scale compared to Adobe curve + float keep = 0.2f; + constexpr float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it + constexpr float hilim = 1.20f; + + if (sat_scale < lolim) { + // saturation is low enough, don't desaturate + keep = 1.f; + } else if (sat_scale < hilim) { + // S-curve transition + float x = (sat_scale - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } + + keep = (1.f - x) + keep * x; + } else { + // do nothing, very high increase, keep minimum amount + } + + if (keep < 1.f) { + // mix in some of the Adobe curve result + r = intp(keep, r, ar); + g = intp(keep, g, ag); + b = intp(keep, b, ab); + } + } + if (!state.isProphoto) { float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; @@ -1888,174 +2066,11 @@ void PerceptualToneCurve::Apply(float &r, float &g, float &b, const PerceptualTo g = newg; b = newb; } - - return; - } - - float cmul = state.cmul_contrast; // chroma scaling factor - - // depending on color, the chroma scaling factor can be fine-tuned below - - { - // decrease chroma scaling sligthly of extremely saturated colors - float saturated_scale_factor = 0.95f; - const float lolim = 35.f; // lower limit, below this chroma all colors will keep original chroma scaling factor - const float hilim = 60.f; // high limit, above this chroma the chroma scaling factor is multiplied with the saturated scale factor value above - - if (C < lolim) { - // chroma is low enough, don't scale - saturated_scale_factor = 1.f; - } else if (C < hilim) { - // S-curve transition between low and high limit - float x = (C - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim - - if (x < 0.5f) { - x = 2.f * SQR(x); - } else { - x = 1.f - 2.f * SQR(1 - x); - } - - saturated_scale_factor = (1.f - x) + saturated_scale_factor * x; - } else { - // do nothing, high saturation color, keep scale factor - } - - cmul *= saturated_scale_factor; - } - - { - // increase chroma scaling slightly of shadows - float nL = Color::gamma2curve[newLuminance]; // apply gamma so we make comparison and transition with a more perceptual lightness scale - float dark_scale_factor = 1.20f; - //float dark_scale_factor = 1.0 + state.debug.p2 / 100.0f; - const float lolim = 0.15f; - const float hilim = 0.50f; - - if (nL < lolim) { - // do nothing, keep scale factor - } else if (nL < hilim) { - // S-curve transition - float x = (nL - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim - - if (x < 0.5f) { - x = 2.f * SQR(x); - } else { - x = 1.f - 2.f * SQR(1 - x); - } - - dark_scale_factor = dark_scale_factor * (1.0f - x) + x; - } else { - dark_scale_factor = 1.f; - } - - cmul *= dark_scale_factor; - } - - { - // to avoid strange CIECAM02 chroma errors on close-to-shadow-clipping colors we reduce chroma scaling towards 1.0 for black colors - float dark_scale_factor = 1.f / cmul; - const float lolim = 4.f; - const float hilim = 7.f; - - if (J < lolim) { - // do nothing, keep scale factor - } else if (J < hilim) { - // S-curve transition - float x = (J - lolim) / (hilim - lolim); - - if (x < 0.5f) { - x = 2.f * SQR(x); - } else { - x = 1.f - 2.f * SQR(1 - x); - } - - dark_scale_factor = dark_scale_factor * (1.f - x) + x; - } else { - dark_scale_factor = 1.f; - } - - cmul *= dark_scale_factor; - } - - C *= cmul; - - Ciecam02::jch2xyz_ciecam02float( x, y, z, - J, C, h, - xw, yw, zw, - c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw ); - - if (!isfinite(x) || !isfinite(y) || !isfinite(z)) { - // can happen for colors on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result. - if (!state.isProphoto) { - float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; - float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; - float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; - r = newr; - g = newg; - b = newb; - } - - return; - } - - Color::xyz2Prophoto(x, y, z, r, g, b); - r *= 655.35f; - g *= 655.35f; - b *= 655.35f; - r = LIM(r, 0.f, 65535.f); - g = LIM(g, 0.f, 65535.f); - b = LIM(b, 0.f, 65535.f); - - { - // limit saturation increase in rgb space to avoid severe clipping and flattening in extreme highlights - - // we use the RGB-HSV hue-stable "Adobe" curve as reference. For S-curve contrast it increases - // saturation greatly, but desaturates extreme highlights and thus provide a smooth transition to - // the white point. However the desaturation effect is quite strong so we make a weighting - float as = Color::rgb2s(ar, ag, ab); - float s = Color::rgb2s(r, g, b); - - float sat_scale = as <= 0.f ? 1.f : s / as; // saturation scale compared to Adobe curve - float keep = 0.2f; - constexpr float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it - constexpr float hilim = 1.20f; - - if (sat_scale < lolim) { - // saturation is low enough, don't desaturate - keep = 1.f; - } else if (sat_scale < hilim) { - // S-curve transition - float x = (sat_scale - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim - - if (x < 0.5f) { - x = 2.f * SQR(x); - } else { - x = 1.f - 2.f * SQR(1 - x); - } - - keep = (1.f - x) + keep * x; - } else { - // do nothing, very high increase, keep minimum amount - } - - if (keep < 1.f) { - // mix in some of the Adobe curve result - r = intp(keep, r, ar); - g = intp(keep, g, ag); - b = intp(keep, b, ab); - } - } - - if (!state.isProphoto) { - float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; - float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; - float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; - r = newr; - g = newg; - b = newb; + rc[i] = r; + gc[i] = g; + bc[i] = b; } } - float PerceptualToneCurve::cf_range[2]; float PerceptualToneCurve::cf[1000]; float PerceptualToneCurve::f, PerceptualToneCurve::c, PerceptualToneCurve::nc, PerceptualToneCurve::yb, PerceptualToneCurve::la, PerceptualToneCurve::xw, PerceptualToneCurve::yw, PerceptualToneCurve::zw, PerceptualToneCurve::gamut; diff --git a/rtengine/curves.h b/rtengine/curves.h index d21dc2017..f9c991e8e 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -872,7 +872,7 @@ private: public: static void init(); void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; - void Apply(float& r, float& g, float& b, const PerceptualToneCurveState &state) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b, const PerceptualToneCurveState &state) const; }; // Standard tone curve diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 34c43be0e..7e8e153b1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -233,14 +233,8 @@ void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode c } } else if (curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve); - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); - gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); - btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); - userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj], ptcApplyState); - } + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize], ptcApplyState); } } } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 17a292618..4bdfe6f06 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -14,6 +14,7 @@ constexpr double MAXVALD = static_cast(MAXVAL); // double version of MAX constexpr double RT_PI = 3.14159265358979323846; // pi constexpr double RT_PI_2 = 1.57079632679489661923; // pi/2 +constexpr double RT_PI_180 = 0.017453292519943295769; // pi/180 constexpr double RT_1_PI = 0.31830988618379067154; // 1/pi constexpr double RT_2_PI = 0.63661977236758134308; // 2/pi constexpr double RT_SQRT1_2 = 0.70710678118654752440; // 1/sqrt(2) @@ -23,6 +24,7 @@ constexpr double RT_NAN = std::numeric_limits::quiet_NaN(); constexpr float RT_PI_F = RT_PI; constexpr float RT_PI_F_2 = RT_PI_2; +constexpr float RT_PI_F_180 = RT_PI_180; constexpr float RT_INFINITY_F = std::numeric_limits::infinity(); constexpr float RT_NAN_F = std::numeric_limits::quiet_NaN(); From 888de585d4e8481cce9894b70a30981ce91a07aa Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 5 Jan 2018 22:44:07 +0100 Subject: [PATCH 104/200] Queue state verbose, fixes #4058 Improvement to the Batch Queue: - Start Queue/Stop Queue checkboxes replaced with one swith. - It is now immediately clear whether the queue is running or not. - The queue is visually stopped once it is empty. - String keys fixed to use BATCHQUEUE_ prefix instead of FILEBROWSER_. --- rtdata/languages/Catala | 13 ++-- rtdata/languages/Chinese (Simplified) | 13 ++-- rtdata/languages/Chinese (Traditional) | 13 ++-- rtdata/languages/Czech | 13 ++-- rtdata/languages/Dansk | 13 ++-- rtdata/languages/Deutsch | 13 ++-- rtdata/languages/English (UK) | 13 ++-- rtdata/languages/English (US) | 13 ++-- rtdata/languages/Espanol | 13 ++-- rtdata/languages/Euskara | 13 ++-- rtdata/languages/Francais | 13 ++-- rtdata/languages/Greek | 13 ++-- rtdata/languages/Hebrew | 13 ++-- rtdata/languages/Italiano | 13 ++-- rtdata/languages/Japanese | 13 ++-- rtdata/languages/Latvian | 13 ++-- rtdata/languages/Magyar | 13 ++-- rtdata/languages/Nederlands | 13 ++-- rtdata/languages/Norsk BM | 13 ++-- rtdata/languages/Polish | 13 ++-- rtdata/languages/Polish (Latin Characters) | 13 ++-- rtdata/languages/Portugues (Brasil) | 13 ++-- rtdata/languages/Russian | 13 ++-- rtdata/languages/Serbian (Cyrilic Characters) | 13 ++-- rtdata/languages/Serbian (Latin Characters) | 13 ++-- rtdata/languages/Slovak | 13 ++-- rtdata/languages/Suomi | 13 ++-- rtdata/languages/Swedish | 13 ++-- rtdata/languages/Turkish | 13 ++-- rtdata/languages/default | 11 +-- rtgui/batchqueuepanel.cc | 74 +++++++++---------- rtgui/batchqueuepanel.h | 10 +-- 32 files changed, 277 insertions(+), 195 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 9f9a0bf36..7fa32fc56 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -7,6 +7,7 @@ ABOUT_TAB_RELEASENOTES;Notes de la versió ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Restaura predeterminats BATCHQUEUE_AUTOSTART;Auto engega +BATCHQUEUE_AUTOSTARTHINT;Inicia processat automàticament en rebre un nou treball BATCH_PROCESSING;Processament per lots CURVEEDITOR_CURVE;Corba CURVEEDITOR_CURVES;Corbes @@ -148,12 +149,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostra imatges no recentment desades.\nDrec FILEBROWSER_SHOWTRASHHINT;Veure què hi ha a la paperera.\nDrecera: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostra imatges sense etiqueta de color.\nDrecera: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostra imatges sense rang.\nDrecera: 0 -FILEBROWSER_STARTPROCESSING;Inicia procés -FILEBROWSER_STARTPROCESSINGHINT;Inicia el processament de les imatges de la cua -FILEBROWSER_STOPPROCESSING;Atura processament -FILEBROWSER_STOPPROCESSINGHINT;Atura processament d'imatges de la cua FILEBROWSER_THUMBSIZE;Tamany minifoto -FILEBROWSER_TOOLTIP_STOPPROCESSING;Inicia processat automàticament en rebre un nou treball FILEBROWSER_ZOOMINHINT;Engrandir minifoto.\nDrecera: + FILEBROWSER_ZOOMOUTHINT;Reduïr minifoto.\nDrecera: - GENERAL_ABOUT;Respecte a @@ -955,6 +951,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !!!!!!!!!!!!!!!!!!!!!!!!! !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1421,6 +1418,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 52b7da85b..b829a3d34 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -168,10 +168,6 @@ FILEBROWSER_SHOWRANK5HINT;显示5星图片 FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷: Alt-7 FILEBROWSER_SHOWTRASHHINT;显示垃圾箱内容 FILEBROWSER_SHOWUNRANKHINT;显示未评星图片 -FILEBROWSER_STARTPROCESSING;开始处理 -FILEBROWSER_STARTPROCESSINGHINT;开始处理或保存队列中的图片 -FILEBROWSER_STOPPROCESSING;停止处理 -FILEBROWSER_STOPPROCESSINGHINT;停止处理图片 FILEBROWSER_THUMBSIZE;缩略图大小 FILEBROWSER_ZOOMINHINT;增大缩略图 FILEBROWSER_ZOOMOUTHINT;减小缩略图 @@ -1030,6 +1026,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1062,7 +1060,6 @@ 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. !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -1490,6 +1487,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !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_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_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index b39738e4d..fde7f4fde 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -3,6 +3,7 @@ ADJUSTER_RESET_TO_DEFAULT;重置預設參數 BATCHQUEUE_AUTOSTART;Auto start +BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives CURVEEDITOR_LINEAR;線性 CURVEEDITOR_LOADDLGLABEL;正載入曲線... CURVEEDITOR_SAVEDLGLABEL;正儲存曲線... @@ -60,12 +61,7 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size GENERAL_ABOUT;關於 @@ -435,6 +431,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -1155,6 +1152,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 30f946c1a..e81f2c046 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -47,6 +47,7 @@ ABOUT_TAB_RELEASENOTES;Poznámky k vydání ABOUT_TAB_SPLASH;Úvodní obrazovka ADJUSTER_RESET_TO_DEFAULT;Vrátit se k původnímu BATCHQUEUE_AUTOSTART;Automatický start +BATCHQUEUE_AUTOSTARTHINT;Automatické spuštění zpracování po vložení nové úlohy. BATCHQUEUE_DESTFILENAME;Cesta a název souboru BATCH_PROCESSING;Dávkové zpracování CURVEEDITOR_AXIS_IN;Vstup: @@ -235,12 +236,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Ukázat neuložené obrázky.\nZkratka: FILEBROWSER_SHOWTRASHHINT;Ukázat obsah koše.\nZkratka: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Ukázat obrázky bez barevného štítku.\nZkratka: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Ukázat nehodnocené obrázky.\nZkratka: 0 -FILEBROWSER_STARTPROCESSING;Spustit zpracování -FILEBROWSER_STARTPROCESSINGHINT;Spustit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s -FILEBROWSER_STOPPROCESSING;Zastavit zpracovávaní -FILEBROWSER_STOPPROCESSINGHINT;Zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s FILEBROWSER_THUMBSIZE;Velikost náhledu -FILEBROWSER_TOOLTIP_STOPPROCESSING;Automatické spuštění zpracování po vložení nové úlohy. FILEBROWSER_UNRANK_TOOLTIP;Zrušit hodnocení.\nZkratka: Shift - 0 FILEBROWSER_ZOOMINHINT;Zvětšit velikosti náhledů.\n\nZkratky:\n+ - režim více karet editoru,\nAlt-+ - režim jedné karty editoru. FILEBROWSER_ZOOMOUTHINT;Zmenšit velikosti náhledů.\n\nZkratky:\n- - režim více karet editoru,\nAlt-- - režim jedné karty editoru. @@ -2208,6 +2204,7 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !GENERAL_SLIDER;Slider !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space @@ -2221,6 +2218,12 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_EDITORCMDLINE;Custom command line !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index 1a61b82f3..e5f193f6c 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Vis billeder vurderet med 4 stjerner FILEBROWSER_SHOWRANK5HINT;Vis billeder vurderet med 5 stjerner FILEBROWSER_SHOWTRASHHINT;Vis indhold i papirkurven FILEBROWSER_SHOWUNRANKHINT;Vis billeder uden vurdering -FILEBROWSER_STARTPROCESSING;Begynd bearbejdning -FILEBROWSER_STARTPROCESSINGHINT;Begynd at bearbejde/gemme billeder i køen -FILEBROWSER_STOPPROCESSING;Stop bearbejdning -FILEBROWSER_STOPPROCESSINGHINT;Stop bearbejdningen af billeder FILEBROWSER_THUMBSIZE;Miniaturestr. FILEBROWSER_ZOOMINHINT;Gør miniaturer større FILEBROWSER_ZOOMOUTHINT;Gør miniaturer mindre @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index eb390b5bf..1daaa9119 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -56,6 +56,7 @@ ABOUT_TAB_RELEASENOTES;Versionshinweise ABOUT_TAB_SPLASH;Startbild ADJUSTER_RESET_TO_DEFAULT;Standard wiederherstellen BATCHQUEUE_AUTOSTART;Automatisch starten +BATCHQUEUE_AUTOSTARTHINT;Bei neuem Job die Verarbeitung automatisch starten BATCHQUEUE_DESTFILENAME;Pfad und Dateiname BATCH_PROCESSING;Stapelverarbeitung CURVEEDITOR_AXIS_IN;x: @@ -244,12 +245,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen\nTas FILEBROWSER_SHOWTRASHHINT;Inhalt des Papierkorbs anzeigen\nTaste: Strg + t FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen\nTaste: Alt + 0 FILEBROWSER_SHOWUNRANKHINT;Nur unbewertete Bilder anzeigen\nTaste: 0 -FILEBROWSER_STARTPROCESSING;Verarbeitung starten -FILEBROWSER_STARTPROCESSINGHINT;Verarbeitung und Speicherung der\nBilder starten.\nTaste: Strg + s -FILEBROWSER_STOPPROCESSING;Verarbeitung stoppen -FILEBROWSER_STOPPROCESSINGHINT;Verarbeitung der Bilder abbrechen.\nTaste: Strg + s FILEBROWSER_THUMBSIZE;Miniaturbildgröße -FILEBROWSER_TOOLTIP_STOPPROCESSING;Bei neuem Job die Verarbeitung automatisch starten FILEBROWSER_UNRANK_TOOLTIP;Bewertung entfernen\nTaste: Umschalt + 0 FILEBROWSER_ZOOMINHINT;Miniaturbilder vergrößern\n\nIm Multi-Reitermodus:\nTaste: +\nIm Ein-Reitermodus:\nTaste: Alt + FILEBROWSER_ZOOMOUTHINT;Miniaturbilder verkleinern\n\nIm Multi-Reitermodus:\nTaste: -\nIm Ein-Reitermodus:\nTaste: Alt - @@ -2230,12 +2226,19 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !GENERAL_SLIDER;Slider !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space !HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_297;NR - Mode !HISTORY_MSG_METADATA_MODE;Metadata copy mode +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_EDITORCMDLINE;Custom command line !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index acd3a09e2..7d28deffa 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -117,7 +117,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !ABOUT_TAB_SPLASH;Splash !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -301,12 +303,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -!FILEBROWSER_STARTPROCESSING;Start processing -!FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -!FILEBROWSER_STOPPROCESSING;Stop processing -!FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s !FILEBROWSER_THUMBSIZE;Thumbnail size -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. !FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -1049,6 +1046,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 0dfbba9e4..9173517cf 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -10,7 +10,9 @@ !ABOUT_TAB_SPLASH;Splash !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -198,12 +200,7 @@ !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -!FILEBROWSER_STARTPROCESSING;Start processing -!FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -!FILEBROWSER_STOPPROCESSING;Stop processing -!FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s !FILEBROWSER_THUMBSIZE;Thumbnail size -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. !FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -977,6 +974,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index c739ce2f6..1973c1bcc 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -68,6 +68,7 @@ ABOUT_TAB_RELEASENOTES;Notas de la versión ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Restablece los valores predeterminados BATCHQUEUE_AUTOSTART;Inicio automático +BATCHQUEUE_AUTOSTARTHINT;Iniciar automáticamente el procesamiento en cuanto llega un nuevo trabajo BATCHQUEUE_DESTFILENAME;Ruta y nombre del archivo BATCH_PROCESSING;Proceso por lotes CURVEEDITOR_CURVE;Curva @@ -230,12 +231,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostrar imágenes no guardadas recientement FILEBROWSER_SHOWTRASHHINT;Mostrar el contenido de la papelera.\nAtajo: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostrar imágenes sin etiqueta de color.\nAtajo: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostrar imágenes sin rango.\nAtajo: 0 -FILEBROWSER_STARTPROCESSING;Iniciar procesamiento -FILEBROWSER_STARTPROCESSINGHINT;Iniciar el procesamiento de imágenes en la cola -FILEBROWSER_STOPPROCESSING;Parar procesamiento -FILEBROWSER_STOPPROCESSINGHINT;Parar el procesamiento de imágenes en la cola FILEBROWSER_THUMBSIZE;Tamaño miniatura -FILEBROWSER_TOOLTIP_STOPPROCESSING;Iniciar automáticamente el procesamiento en cuanto llega un nuevo trabajo FILEBROWSER_UNRANK_TOOLTIP;Sin Rango\nAtajoShift - 0 FILEBROWSER_ZOOMINHINT;Agrandar miniatura.\nAtajo: +\n\nAtajo en modo editor simple: Alt-+ FILEBROWSER_ZOOMOUTHINT;Reducir miniatura.\nAtajo: -\n\nAtajo en modo editor simple: Alt-- @@ -1491,6 +1487,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1784,6 +1781,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index d97b1865b..0fd7866a6 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 7d0ce60b8..3def47d59 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -7,6 +7,7 @@ ABOUT_TAB_RELEASENOTES;Notes de version ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Réglages par défaut BATCHQUEUE_AUTOSTART;Démarrage auto +BATCHQUEUE_AUTOSTARTHINT;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche BATCHQUEUE_DESTFILENAME;Chemin et nom de fichier BATCH_PROCESSING;Traitement par lot CURVEEDITOR_AXIS_IN;E: @@ -195,12 +196,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT; Afficher les images non sauvegardées réc FILEBROWSER_SHOWTRASHHINT;Voir le contenu de la corbeille\nRaccourci: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Afficher les images sans label de couleur\nRaccourci: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Voir les images sans étoile\nRaccourci: 0 -FILEBROWSER_STARTPROCESSING;Démarrer le traitement -FILEBROWSER_STARTPROCESSINGHINT;Démarre le traitement/sauvegarde des images dans la file -FILEBROWSER_STOPPROCESSING;Arrêter le traitement -FILEBROWSER_STOPPROCESSINGHINT;Arrête le traitement des images FILEBROWSER_THUMBSIZE;Taille vign. -FILEBROWSER_TOOLTIP_STOPPROCESSING;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche FILEBROWSER_UNRANK_TOOLTIP;Effacer le rang\nRaccourci: Shift-0 FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourci: +\n\nRaccourcis dans le mode Éditeur Unique: Alt-+ FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourci: -\n\nRaccourcis dans le mode Éditeur Unique: Alt-- @@ -2167,6 +2163,7 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !GENERAL_SLIDER;Slider !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space @@ -2182,6 +2179,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius !HISTORY_MSG_METADATA_MODE;Metadata copy mode !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_EDITORCMDLINE;Custom command line !TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index f285260bf..3051bd490 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -425,7 +421,9 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -556,7 +554,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1152,6 +1149,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 9c18d073a..5fe10c54c 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;מידת חום !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index b76058f76..2da39b47b 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -11,6 +11,7 @@ ABOUT_TAB_RELEASENOTES;Note di rilascio ABOUT_TAB_SPLASH;Emblema ADJUSTER_RESET_TO_DEFAULT;Ripristina BATCHQUEUE_AUTOSTART;Autoavvia +BATCHQUEUE_AUTOSTARTHINT;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato BATCHQUEUE_DESTFILENAME;Percorso e nome file BATCH_PROCESSING;Sviluppo in serie CURVEEDITOR_CURVE;Curva @@ -174,12 +175,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostra le immagini non salvate.\nScorciatoi FILEBROWSER_SHOWTRASHHINT;Mostra il contenuto del cestino.\nScorciatoia: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostra le immagini senza etichetta colorata.\nScorciatoia: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostra le immagini non classificate.\nScorciatoia: 0 -FILEBROWSER_STARTPROCESSING;Comincia a sviluppare -FILEBROWSER_STARTPROCESSINGHINT;Inizia a sviluppare le immagini nella Coda. -FILEBROWSER_STOPPROCESSING;Ferma lo sviluppo -FILEBROWSER_STOPPROCESSINGHINT;Ferma lo sviluppo delle immagini nella Coda. FILEBROWSER_THUMBSIZE;Dimensione miniature -FILEBROWSER_TOOLTIP_STOPPROCESSING;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato FILEBROWSER_UNRANK_TOOLTIP;Nessun Punteggio.\nScorciatoia: Shift-0 FILEBROWSER_ZOOMINHINT;Aumenta la dimensione delle miniature.\n\nScorciatoie:\n+ - Modalità a Schede Multiple,\nAlt-+ - Modalità a Schede Singole. FILEBROWSER_ZOOMOUTHINT;Diminuisci la dimensione delle miniature.\n\nScorciatoie:\n- - Modalità a Schede Multiple,\nAlt-- - Modalità a Schede Singole. @@ -1326,6 +1322,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1656,6 +1653,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 838878b00..10979e399 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -40,6 +40,7 @@ ABOUT_TAB_RELEASENOTES;リリースノート ABOUT_TAB_SPLASH;スプラッシュ ADJUSTER_RESET_TO_DEFAULT;デフォルト値に戻す BATCHQUEUE_AUTOSTART;オートスタート +BATCHQUEUE_AUTOSTARTHINT;新しいrawファイルが送られて来たら自動的に現像処理を開始します BATCHQUEUE_DESTFILENAME;パスとファイル名 BATCH_PROCESSING;バッチ処理 CURVEEDITOR_AXIS_IN;I: @@ -210,12 +211,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;最近保存されていない画像を表 FILEBROWSER_SHOWTRASHHINT;ゴミ箱の内容を表示\nショートカット: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;カラー・ラベルのない画像を表示\nショートカット: Alt-0 FILEBROWSER_SHOWUNRANKHINT;ランクなし画像を表示\nショートカット: 0 -FILEBROWSER_STARTPROCESSING;処理開始 -FILEBROWSER_STARTPROCESSINGHINT;キューにある画像の処理を開始\n\nショートカット:Ctrl+s -FILEBROWSER_STOPPROCESSING;処理中止 -FILEBROWSER_STOPPROCESSINGHINT;キューにある画像の処理を中止\n\nショートカット:Ctrl+s FILEBROWSER_THUMBSIZE;サムネイルのサイズ -FILEBROWSER_TOOLTIP_STOPPROCESSING;新しいrawファイルが送られて来たら自動的に現像処理を開始します FILEBROWSER_UNRANK_TOOLTIP;ランクなし\nショートカット: Shift-0 FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル・エディタ・タブのショートカット: Alt-+ FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット: -\n\nシングル・エディタ・タブのショートカット: Alt-- @@ -1861,6 +1857,7 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !DONT_SHOW_AGAIN;Don't show this message again. !DYNPROFILEEDITOR_DELETE;Delete !DYNPROFILEEDITOR_EDIT;Edit @@ -2007,6 +2004,12 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - !PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index b76f4353f..50e1407a9 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Rādīt attēlus ar 4 zvaigznēm FILEBROWSER_SHOWRANK5HINT;Rādīt attēlus ar 5 zvaigznēm FILEBROWSER_SHOWTRASHHINT;Rādīt atkritni FILEBROWSER_SHOWUNRANKHINT;Rādīt nevērtētus attēlus -FILEBROWSER_STARTPROCESSING;Sākt apstrādi -FILEBROWSER_STARTPROCESSINGHINT;Sākt attēlu rindas apstrādi/saglabāšanu -FILEBROWSER_STOPPROCESSING;Apturēt apstrādi -FILEBROWSER_STOPPROCESSINGHINT;Apturēt attēlu apstrādi FILEBROWSER_THUMBSIZE;Sīktēlu izmērs FILEBROWSER_ZOOMINHINT;Palielināt sīktēlus FILEBROWSER_ZOOMOUTHINT;Samazināt sīktēlus @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index b2d93337f..9b4ae8097 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -7,6 +7,7 @@ ABOUT_TAB_RELEASENOTES;Kiadási megjegyzések ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Alaphelyzetbe állítás BATCHQUEUE_AUTOSTART;Auto start +BATCHQUEUE_AUTOSTARTHINT;Új kép érkezése esetén a feldolgozás automatikus indítása. BATCH_PROCESSING;Kötegelt feldolgozás CURVEEDITOR_CURVE;Görbe CURVEEDITOR_CURVES;Görbék @@ -143,12 +144,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Korábban mentett képek megjelenítése.\n FILEBROWSER_SHOWTRASHHINT;A kuka tartalmának mutatása FILEBROWSER_SHOWUNCOLORHINT;Színcímke nélküli képek megjelenítése.\nGyorsbillentyű: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Meg nem jelölt képek mutatása -FILEBROWSER_STARTPROCESSING;Feldolgozás indítása -FILEBROWSER_STARTPROCESSINGHINT;A sorban álló képek feldolgozásának elindítása -FILEBROWSER_STOPPROCESSING;Feldolgozás leállítása -FILEBROWSER_STOPPROCESSINGHINT;A sorban álló képek feldolgozásának leállítása FILEBROWSER_THUMBSIZE;Bélyegméret -FILEBROWSER_TOOLTIP_STOPPROCESSING;Új kép érkezése esetén a feldolgozás automatikus indítása. FILEBROWSER_ZOOMINHINT;Növelés FILEBROWSER_ZOOMOUTHINT;Csökkentés GENERAL_ABOUT;Névjegy @@ -871,6 +867,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !!!!!!!!!!!!!!!!!!!!!!!!! !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1357,6 +1354,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 282cd318b..9cf4cdf5d 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -22,6 +22,7 @@ ABOUT_TAB_RELEASENOTES;Uitgave-opmerkingen ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Terug naar beginwaarde BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Start verwerking automatisch wanneer nieuwe foto arriveert BATCHQUEUE_DESTFILENAME;Pad en bestandsnaam BATCH_PROCESSING;Batch-verwerking CURVEEDITOR_AXIS_IN;I: @@ -208,12 +209,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Toon niet-opgeslagen/verwerkte foto's.\nSne FILEBROWSER_SHOWTRASHHINT;Toon inhoud prullenbak\nSneltoets: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Toon foto's zonder kleurlabel.\nSneltoets: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Toon foto's zonder sterwaardering.\nSneltoets: 0 -FILEBROWSER_STARTPROCESSING;Start verwerking -FILEBROWSER_STARTPROCESSINGHINT;Start verwerking van bestanden in verwerkingsrij -FILEBROWSER_STOPPROCESSING;Stop verwerking -FILEBROWSER_STOPPROCESSINGHINT;Stop verwerking van bestanden in verwerkingsrij FILEBROWSER_THUMBSIZE;Miniaturen -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start verwerking automatisch wanneer nieuwe foto arriveert FILEBROWSER_UNRANK_TOOLTIP;Verwijder sterwaardering\nSneltoets: Shift-0 FILEBROWSER_ZOOMINHINT;Groter FILEBROWSER_ZOOMOUTHINT;Kleiner @@ -2125,6 +2121,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !DONT_SHOW_AGAIN;Don't show this message again. !EXIFPANEL_SHOWALL;Show all !GENERAL_SLIDER;Slider @@ -2168,6 +2165,12 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !PARTIALPASTE_LOCALCONTRAST;Local contrast !PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index 30d94cc27..fdb78ffc0 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Vis bilder rangert med 4 stjerne FILEBROWSER_SHOWRANK5HINT;Vis bilder rangert med 5 stjerne FILEBROWSER_SHOWTRASHHINT;Vis innholdet i søpla FILEBROWSER_SHOWUNRANKHINT;Vis unrangerte bilder -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Begynn prosessering/lagring av bilder i køen -FILEBROWSER_STOPPROCESSING;Stopp prosesseringen -FILEBROWSER_STOPPROCESSINGHINT;Stopp prosesseringen av bilder FILEBROWSER_THUMBSIZE;Thumbnail størrelse FILEBROWSER_ZOOMINHINT;Øk thumbnail størrelse FILEBROWSER_ZOOMOUTHINT;Reduser thumbnail størrelse @@ -425,7 +421,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -556,7 +554,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1152,6 +1149,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 780de385a..eda9251ce 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -15,6 +15,7 @@ ABOUT_TAB_RELEASENOTES;Notatki eksploatacyjne ABOUT_TAB_SPLASH;Ekran powitalny ADJUSTER_RESET_TO_DEFAULT;Przywróć domyślne BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Rozpocznij przetwarzanie automatycznie gdy pojawi się nowe zadanie. BATCHQUEUE_DESTFILENAME;Ścieżka i nazwa pliku BATCH_PROCESSING;Przetwarzanie wsadowe CURVEEDITOR_CURVE;Krzywa @@ -178,12 +179,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Pokazuje niezapisane zdjęcia.\nSkrót: FILEBROWSER_SHOWTRASHHINT;Pokazuje zawartość kosza.\nSkrót: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Pokazuje zdjęcia bez kolorowej etykiety.\nSkrót: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Pokazuje nieocenione zdjęcia.\nSkrót: 0 -FILEBROWSER_STARTPROCESSING;Rozpocznij przetwarzanie -FILEBROWSER_STARTPROCESSINGHINT;Rozpoczyna przetwarzanie/zapisywanie plików z kolejki. -FILEBROWSER_STOPPROCESSING;Zatrzymaj przetwarzanie -FILEBROWSER_STOPPROCESSINGHINT;Zatrzymuje przetwarzanie zdjęć. FILEBROWSER_THUMBSIZE;Rozmiar minaturek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Rozpocznij przetwarzanie automatycznie gdy pojawi się nowe zadanie. FILEBROWSER_UNRANK_TOOLTIP;Usuń ocenę.\nSkrót: Shift-0 FILEBROWSER_ZOOMINHINT;Zwiększa rozmiar miniaturek.\n\nSkróty:\n+ - Tryb wielu zakładek,\nAlt-+ - Tryb pojedyńczej zakładki. FILEBROWSER_ZOOMOUTHINT;Zmniejsza rozmiar miniaturek.\n\nSkróty:\n- - Tryb wielu zakładek,\nAlt-- - Tryb pojedyńczej zakładki. @@ -1449,6 +1445,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1732,6 +1729,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 4a5c675d5..1212ed840 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -15,6 +15,7 @@ ABOUT_TAB_RELEASENOTES;Notatki eksploatacyjne ABOUT_TAB_SPLASH;Ekran powitalny ADJUSTER_RESET_TO_DEFAULT;Przywroc domyslne BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Rozpocznij przetwarzanie automatycznie gdy pojawi sie nowe zadanie. BATCHQUEUE_DESTFILENAME;Sciezka i nazwa pliku BATCH_PROCESSING;Przetwarzanie wsadowe CURVEEDITOR_CURVE;Krzywa @@ -178,12 +179,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Pokazuje niezapisane zdjecia.\nSkrot: Al FILEBROWSER_SHOWTRASHHINT;Pokazuje zawartosc kosza.\nSkrot: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Pokazuje zdjecia bez kolorowej etykiety.\nSkrot: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Pokazuje nieocenione zdjecia.\nSkrot: 0 -FILEBROWSER_STARTPROCESSING;Rozpocznij przetwarzanie -FILEBROWSER_STARTPROCESSINGHINT;Rozpoczyna przetwarzanie/zapisywanie plikow z kolejki. -FILEBROWSER_STOPPROCESSING;Zatrzymaj przetwarzanie -FILEBROWSER_STOPPROCESSINGHINT;Zatrzymuje przetwarzanie zdjec. FILEBROWSER_THUMBSIZE;Rozmiar minaturek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Rozpocznij przetwarzanie automatycznie gdy pojawi sie nowe zadanie. FILEBROWSER_UNRANK_TOOLTIP;Usun ocene.\nSkrot: Shift-0 FILEBROWSER_ZOOMINHINT;Zwieksza rozmiar miniaturek.\n\nSkroty:\n+ - Tryb wielu zakladek,\nAlt-+ - Tryb pojedynczej zakladki. FILEBROWSER_ZOOMOUTHINT;Zmniejsza rozmiar miniaturek.\n\nSkroty:\n- - Tryb wielu zakladek,\nAlt-- - Tryb pojedynczej zakladki. @@ -1449,6 +1445,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1732,6 +1729,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 7b11028e9..42c1436bc 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Exibir imagens classificadas como 4 estrelas FILEBROWSER_SHOWRANK5HINT;Exibir imagens classificadas como 5 estrelas FILEBROWSER_SHOWTRASHHINT;Exibir conteúdo da lixeira FILEBROWSER_SHOWUNRANKHINT;Exibir imagens não classificadas -FILEBROWSER_STARTPROCESSING;Iniciar Processamento -FILEBROWSER_STARTPROCESSINGHINT;Iniciar processamento/salvar imagens da lista -FILEBROWSER_STOPPROCESSING;Parar processamento -FILEBROWSER_STOPPROCESSINGHINT;Para o processamento das imagens FILEBROWSER_THUMBSIZE;Tamanho das Miniaturas FILEBROWSER_ZOOMINHINT;Aumentar Tamanho das Miniaturas FILEBROWSER_ZOOMOUTHINT;Diminuir Tamanho das Miniaturas @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;Temperatura !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;Temperatura !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 95aa8cdce..7737d6578 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -13,6 +13,7 @@ ABOUT_TAB_RELEASENOTES;Примечания к выпуску ABOUT_TAB_SPLASH;Заставка ADJUSTER_RESET_TO_DEFAULT;Сбросить настройки BATCHQUEUE_AUTOSTART;Автостарт +BATCHQUEUE_AUTOSTARTHINT;Автоматически запускать обработку при добавлении файла в очередь BATCHQUEUE_DESTFILENAME;Имя файла и путь к нему BATCH_PROCESSING;Пакетная обработка CURVEEDITOR_CURVE;Кривая @@ -173,12 +174,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Показать изображения, с FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Показать изображения без цветовой метки.\nГорячая клавиша: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Показать изображения без рейтинга\nГорячая клавиша: 0 -FILEBROWSER_STARTPROCESSING;Начать обработку -FILEBROWSER_STARTPROCESSINGHINT;Запуск обработки помещенных в очередь изображений -FILEBROWSER_STOPPROCESSING;Остановить обработку -FILEBROWSER_STOPPROCESSINGHINT;Отмена обработки изображений FILEBROWSER_THUMBSIZE;Размер эскиза -FILEBROWSER_TOOLTIP_STOPPROCESSING;Автоматически запускать обработку при добавлении файла в очередь FILEBROWSER_UNRANK_TOOLTIP;Удалить рейтинг\nГорячая клавиша: Shift-~ FILEBROWSER_ZOOMINHINT;Увеличить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-+ FILEBROWSER_ZOOMOUTHINT;Уменьшить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-- @@ -1262,6 +1258,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1610,6 +1607,12 @@ ZOOMPANEL_ZOOMOUT;Удалить - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 34fa8ba97..e94beb82b 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -7,6 +7,7 @@ ABOUT_TAB_RELEASENOTES;Белешке о издању ABOUT_TAB_SPLASH;Увод ADJUSTER_RESET_TO_DEFAULT;Врати на подразумевано BATCHQUEUE_AUTOSTART;Сам започни +BATCHQUEUE_AUTOSTARTHINT;Покреће обраду фотографија када их закажете BATCHQUEUE_DESTFILENAME;Путања и име датотеке BATCH_PROCESSING;обрада CURVEEDITOR_CURVE;Кривуља @@ -154,12 +155,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Приказује слике које ни FILEBROWSER_SHOWTRASHHINT;Приказује слике у смећу FILEBROWSER_SHOWUNCOLORHINT;Приказује слике које нису означене бојом Alt-0 FILEBROWSER_SHOWUNRANKHINT;Прикажи неоцењене слике -FILEBROWSER_STARTPROCESSING;Започни обраду -FILEBROWSER_STARTPROCESSINGHINT;Почиње обраду и чување заказаних слика -FILEBROWSER_STOPPROCESSING;Заустави обраду -FILEBROWSER_STOPPROCESSINGHINT;Зауставља обраду слика FILEBROWSER_THUMBSIZE;Преглед -FILEBROWSER_TOOLTIP_STOPPROCESSING;Покреће обраду фотографија када их закажете FILEBROWSER_UNRANK_TOOLTIP;Неоцењено.\nПречица: Shift-0 FILEBROWSER_ZOOMINHINT;Увећава преглед FILEBROWSER_ZOOMOUTHINT;Умањује преглед @@ -1283,6 +1279,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1642,6 +1639,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index 2db3daecd..a0597fbb6 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -7,6 +7,7 @@ ABOUT_TAB_RELEASENOTES;Beleške o izdanju ABOUT_TAB_SPLASH;Uvod ADJUSTER_RESET_TO_DEFAULT;Vrati na podrazumevano BATCHQUEUE_AUTOSTART;Sam započni +BATCHQUEUE_AUTOSTARTHINT;Pokreće obradu fotografija kada ih zakažete BATCHQUEUE_DESTFILENAME;Putanja i ime datoteke BATCH_PROCESSING;obrada CURVEEDITOR_CURVE;Krivulja @@ -154,12 +155,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Prikazuje slike koje nisu skoro sačuvane < FILEBROWSER_SHOWTRASHHINT;Prikazuje slike u smeću FILEBROWSER_SHOWUNCOLORHINT;Prikazuje slike koje nisu označene bojom Alt-0 FILEBROWSER_SHOWUNRANKHINT;Prikaži neocenjene slike -FILEBROWSER_STARTPROCESSING;Započni obradu -FILEBROWSER_STARTPROCESSINGHINT;Počinje obradu i čuvanje zakazanih slika -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_ZOOMINHINT;Uvećava pregled FILEBROWSER_ZOOMOUTHINT;Umanjuje pregled @@ -1283,6 +1279,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1642,6 +1639,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index b87e71c5d..ada1225ef 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -4,6 +4,7 @@ ADJUSTER_RESET_TO_DEFAULT;Resetovať na predvolené nastavenia BATCHQUEUE_AUTOSTART;Auto štart +BATCHQUEUE_AUTOSTARTHINT;Začať spracovanie automaticky, keď príde nová úloha BATCH_PROCESSING;Dávkové spracovanie CURVEEDITOR_CUSTOM;Vlastné CURVEEDITOR_DARKS;Tiene @@ -75,12 +76,7 @@ FILEBROWSER_SHOWRANK4HINT;Ukázať obrázky triedy 4 hviezda FILEBROWSER_SHOWRANK5HINT;Ukázať obrázky triedy 5 hviezda FILEBROWSER_SHOWTRASHHINT;Zobraziť obsah koša FILEBROWSER_SHOWUNRANKHINT;Zobraziť obrázky bez triedy -FILEBROWSER_STARTPROCESSING;Začať spracovanie -FILEBROWSER_STARTPROCESSINGHINT;Začať spracovanie/ukladanie obrázkov v rade -FILEBROWSER_STOPPROCESSING;Zastaviť spracovanie -FILEBROWSER_STOPPROCESSINGHINT;Zastaviť spracovanie obrázkov FILEBROWSER_THUMBSIZE;Veľkosť zmenšenín -FILEBROWSER_TOOLTIP_STOPPROCESSING;Začať spracovanie automaticky, keď príde nová úloha FILEBROWSER_ZOOMINHINT;Zväčšiť veľkosť zmenšenín FILEBROWSER_ZOOMOUTHINT;Zmenšiť veľkosť zmenšenín GENERAL_ABOUT;O programe @@ -517,6 +513,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1203,6 +1200,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 2ed64181f..034995605 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Näytä 4 tähden kuvat FILEBROWSER_SHOWRANK5HINT;Näytä 5 tähden kuvat FILEBROWSER_SHOWTRASHHINT;Näytä roskakorin sisältö FILEBROWSER_SHOWUNRANKHINT;Näytä arvostelemattomat kuvat -FILEBROWSER_STARTPROCESSING;Aloita käsittely -FILEBROWSER_STARTPROCESSINGHINT;Aloita jonossa olevien kuvien käsittely -FILEBROWSER_STOPPROCESSING;Lopeta käsittely -FILEBROWSER_STOPPROCESSINGHINT;Lopeta jonossa olevien kuvien käsittely FILEBROWSER_THUMBSIZE;Esikatselun koko FILEBROWSER_ZOOMINHINT;Kasvata esikatselukuvien kokoa FILEBROWSER_ZOOMOUTHINT;Pienennä esikatselukuvien kokoa @@ -427,7 +423,9 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -558,7 +556,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1154,6 +1151,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 63d8781c8..0e45b4441 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -10,6 +10,7 @@ ABOUT_TAB_RELEASENOTES;Versionsnyheter ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Återställ till standard BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Starta behandlingen automatiskt när en ny bild kommer in BATCHQUEUE_DESTFILENAME;Sökväg och filnamn BATCH_PROCESSING;Batchbehandling CURVEEDITOR_AXIS_IN;I: @@ -178,12 +179,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Visa bilder som inte nyligen sparats\nKortk FILEBROWSER_SHOWTRASHHINT;Visa innehållet i papperskorgen FILEBROWSER_SHOWUNCOLORHINT;Visa bilder utan färgetikett\nKortkommando: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Visa icke-betygsatta bilder -FILEBROWSER_STARTPROCESSING;Starta behandlingen -FILEBROWSER_STARTPROCESSINGHINT;Starta behandlingen och spara bilderna i behandlingskön -FILEBROWSER_STOPPROCESSING;Avbryt behandlingen -FILEBROWSER_STOPPROCESSINGHINT;Avbryt behandlingen av bilderna FILEBROWSER_THUMBSIZE;Miniatyrbildens storlek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Starta behandlingen automatiskt när en ny bild kommer in FILEBROWSER_UNRANK_TOOLTIP;Ta bort betyg\nKortkommando: Shift-0 FILEBROWSER_ZOOMINHINT;Förstora miniatyrbilderna.\nKortkommando: +\nKortkommado i enkelbildsläget: Alt-+ FILEBROWSER_ZOOMOUTHINT;Förminska miniatyrbilderna.\nKortkommando: -\nKortkommado i enkelbildsläget: Alt-- @@ -1869,6 +1865,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_LEFT_TAN;LT: !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. @@ -1998,6 +1995,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index b60b3e38f..a0909bcab 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -426,7 +422,9 @@ TP_WBALANCE_TEMPERATURE;Isı !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -557,7 +555,6 @@ TP_WBALANCE_TEMPERATURE;Isı !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -1153,6 +1150,12 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtdata/languages/default b/rtdata/languages/default index 25af81141..7fbe7260a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -9,7 +9,9 @@ ABOUT_TAB_RELEASENOTES;Release Notes ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Reset to default BATCHQUEUE_AUTOSTART;Auto-start +BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. BATCHQUEUE_DESTFILENAME;Path and file name +BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s BATCH_PROCESSING;Batch Processing CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -197,12 +199,7 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -FILEBROWSER_STARTPROCESSING;Start processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s FILEBROWSER_THUMBSIZE;Thumbnail size -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -977,11 +974,11 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs PREFERENCES_CLUTSDIR;HaldCLUT directory PREFERENCES_CMMBPC;Black point compensation PREFERENCES_CROP;Crop editing +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop -PREFERENCES_CROP_GUIDES_NONE;None PREFERENCES_CROP_GUIDES_FRAME;Frame PREFERENCES_CROP_GUIDES_FULL;Original -PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +PREFERENCES_CROP_GUIDES_NONE;None PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons PREFERENCES_CURVEBBOXPOS_ABOVE;Above PREFERENCES_CURVEBBOXPOS_BELOW;Below diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index fcccdf08a..ce54cd966 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -46,29 +46,22 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) batchQueue = Gtk::manage( new BatchQueue(aFileCatalog) ); - // construct batch queue panel with the extra "start" and "stop" button Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); batchQueueButtonBox->set_name("BatchQueueButtons"); - start = Gtk::manage (new Gtk::ToggleButton ()); - stop = Gtk::manage (new Gtk::ToggleButton ()); - autoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); - start->set_tooltip_markup (M("FILEBROWSER_STARTPROCESSINGHINT")); - stop->set_tooltip_markup (M("FILEBROWSER_STOPPROCESSINGHINT")); - autoStart->set_tooltip_text (M("FILEBROWSER_TOOLTIP_STOPPROCESSING")); - start->set_active (false); - stop->set_active (true); - autoStart->set_active (options.procQueueEnabled); + qLbl = Gtk::manage (new Gtk::Label(M("MAIN_FRAME_BATCHQUEUE"))); - start->set_image (*Gtk::manage (new RTImage ("gtk-media-play.png"))); - start->get_style_context()->add_class("BIG"); - startConnection = start->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::startBatchProc)); - stop->set_image (*Gtk::manage (new RTImage ("gtk-media-stop.png"))); - stop->get_style_context()->add_class("BIG"); - stopConnection = stop->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::stopBatchProc)); - batchQueueButtonBox->pack_start (*start, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*stop, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*autoStart, Gtk::PACK_SHRINK, 4); + qStartStop = Gtk::manage (new Gtk::Switch()); + qStartStop->set_tooltip_markup (M("BATCHQUEUE_STARTSTOPHINT")); + qStartStopConn = qStartStop->property_active().signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::startOrStopBatchProc)); + + qAutoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); + qAutoStart->set_tooltip_text (M("BATCHQUEUE_AUTOSTARTHINT")); + qAutoStart->set_active (options.procQueueEnabled); + + batchQueueButtonBox->pack_start (*qLbl, Gtk::PACK_SHRINK, 4); + batchQueueButtonBox->pack_start (*qStartStop, Gtk::PACK_SHRINK, 4); + batchQueueButtonBox->pack_start (*qAutoStart, Gtk::PACK_SHRINK, 4); // Output directory selection fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR"))); @@ -216,7 +209,7 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) if(!qsize ) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE")) ); - } else if( start->get_active () ) { + } else if (qStartStop->get_active()) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]")); } else { @@ -236,7 +229,7 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) if (!qsize ) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") )), Gtk::POS_RIGHT, 1, 1); - } else if ( start->get_active () ) { + } else if (!qStartStop->get_active()) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )), Gtk::POS_RIGHT, 1, 1); } else { @@ -271,15 +264,22 @@ void BatchQueuePanel::queueSizeChanged (int qsize, bool queueEmptied, bool queue } } +void BatchQueuePanel::startOrStopBatchProc() +{ + bool state = qStartStop->get_state(); + if (state) { + startBatchProc(); + } else { + stopBatchProc(); + } +} + void BatchQueuePanel::startBatchProc () { - - stopConnection.block (true); - startConnection.block (true); - stop->set_active (false); - start->set_active (true); - stopConnection.block (false); - startConnection.block (false); + // Update switch when queue started programmatically + qStartStopConn.block (true); + qStartStop->set_active(true); + qStartStopConn.block (false); if (batchQueue->hasJobs()) { fdir->set_sensitive (false); @@ -295,13 +295,11 @@ void BatchQueuePanel::startBatchProc () void BatchQueuePanel::stopBatchProc () { + // Update switch when queue started programmatically + qStartStopConn.block (true); + qStartStop->set_active(false); + qStartStopConn.block (false); - stopConnection.block (true); - startConnection.block (true); - stop->set_active (true); - start->set_active (false); - stopConnection.block (false); - startConnection.block (false); updateTab (batchQueue->getEntries().size()); } @@ -310,7 +308,7 @@ void BatchQueuePanel::addBatchQueueJobs ( std::vector &entries batchQueue->addEntries (entries, head); - if (stop->get_active () && autoStart->get_active ()) { + if (!qStartStop->get_active() && qAutoStart->get_active()) { startBatchProc (); } } @@ -318,7 +316,7 @@ void BatchQueuePanel::addBatchQueueJobs ( std::vector &entries bool BatchQueuePanel::canStartNext () { - if (start->get_active ()) { + if (qStartStop->get_active()) { return true; } else { fdir->set_sensitive (true); @@ -332,7 +330,7 @@ void BatchQueuePanel::saveOptions () options.savePathTemplate = outdirTemplate->get_text(); options.saveUsePathTemplate = useTemplate->get_active(); - options.procQueueEnabled = autoStart->get_active (); + options.procQueueEnabled = qAutoStart->get_active(); } void BatchQueuePanel::pathFolderButtonPressed () @@ -375,7 +373,7 @@ bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) if (ctrl) { switch(event->keyval) { case GDK_KEY_s: - if (start->get_active()) { + if (qStartStop->get_active()) { stopBatchProc(); } else { startBatchProc(); diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index a4d6ed244..4d60b91ed 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -32,13 +32,12 @@ class BatchQueuePanel : public Gtk::VBox, public FormatChangeListener { + Gtk::Label* qLbl; Gtk::Button* zoomInButton; Gtk::Button* zoomOutButton; - Gtk::ToggleButton* start; - Gtk::ToggleButton* stop; - Gtk::CheckButton* autoStart; - sigc::connection startConnection; - sigc::connection stopConnection; + Gtk::Switch* qStartStop; + sigc::connection qStartStopConn; + Gtk::CheckButton* qAutoStart; Gtk::Entry* outdirTemplate; MyFileChooserButton* outdirFolder; @@ -69,6 +68,7 @@ public: void startBatchProc (); void stopBatchProc (); + void startOrStopBatchProc(); void saveOptions (); void pathFolderChanged (); From 5cb6a0ebaff06891ff59f2b50b2aac846c6164a5 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 5 Jan 2018 23:35:39 +0100 Subject: [PATCH 105/200] Use a Gtk::Frame instead of a Gtk::Label for the queue title --- rtgui/batchqueuepanel.cc | 7 +++---- rtgui/batchqueuepanel.h | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index ce54cd966..ae95b008f 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -49,8 +49,6 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); batchQueueButtonBox->set_name("BatchQueueButtons"); - qLbl = Gtk::manage (new Gtk::Label(M("MAIN_FRAME_BATCHQUEUE"))); - qStartStop = Gtk::manage (new Gtk::Switch()); qStartStop->set_tooltip_markup (M("BATCHQUEUE_STARTSTOPHINT")); qStartStopConn = qStartStop->property_active().signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::startOrStopBatchProc)); @@ -59,9 +57,10 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) qAutoStart->set_tooltip_text (M("BATCHQUEUE_AUTOSTARTHINT")); qAutoStart->set_active (options.procQueueEnabled); - batchQueueButtonBox->pack_start (*qLbl, Gtk::PACK_SHRINK, 4); batchQueueButtonBox->pack_start (*qStartStop, Gtk::PACK_SHRINK, 4); batchQueueButtonBox->pack_start (*qAutoStart, Gtk::PACK_SHRINK, 4); + Gtk::Frame *bbox = Gtk::manage(new Gtk::Frame(M("MAIN_FRAME_BATCHQUEUE"))); + bbox->add(*batchQueueButtonBox); // Output directory selection fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR"))); @@ -134,7 +133,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) pack_start (*topBox, Gtk::PACK_SHRINK); topBox->set_name("BatchQueueButtonsMainContainer"); - topBox->pack_start (*batchQueueButtonBox, Gtk::PACK_SHRINK, 4); + topBox->pack_start (*bbox, Gtk::PACK_SHRINK, 4); topBox->pack_start (*fdir, Gtk::PACK_EXPAND_WIDGET, 4); topBox->pack_start (*fformat, Gtk::PACK_EXPAND_WIDGET, 4); diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 4d60b91ed..497bc166e 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -32,7 +32,6 @@ class BatchQueuePanel : public Gtk::VBox, public FormatChangeListener { - Gtk::Label* qLbl; Gtk::Button* zoomInButton; Gtk::Button* zoomOutButton; Gtk::Switch* qStartStop; From eb3c7f13ae9b5587f86bc228b01dd868ee10c456 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 5 Jan 2018 23:47:23 +0100 Subject: [PATCH 106/200] make the batch queue start/stop switch insensitive when there are no pending images in the queue --- rtgui/batchqueuepanel.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index ae95b008f..054160d91 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -249,6 +249,12 @@ void BatchQueuePanel::queueSizeChanged (int qsize, bool queueEmptied, bool queue { updateTab ( qsize); + if (qsize == 0 || (qsize == 1 && !fdir->get_sensitive())) { + qStartStop->set_sensitive(false); + } else { + qStartStop->set_sensitive(true); + } + if (queueEmptied || queueError) { stopBatchProc (); fdir->set_sensitive (true); @@ -283,6 +289,9 @@ void BatchQueuePanel::startBatchProc () if (batchQueue->hasJobs()) { fdir->set_sensitive (false); fformat->set_sensitive (false); + if (batchQueue->getEntries().size() == 1) { + qStartStop->set_sensitive(false); + } saveOptions(); batchQueue->startProcessing (); } else { From c05dbf0eb018bbf7632f660665ddb96fc950bf3b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 6 Jan 2018 16:43:28 +0100 Subject: [PATCH 107/200] Segfault when changing to Saturation & Value Blending curve, fixes #4279 --- rtengine/curves.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/curves.h b/rtengine/curves.h index f9c991e8e..6a37b7e46 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -1118,6 +1118,10 @@ inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) c const float lum = (r + g + b) / 3.f; const float newLum = lutToneCurve[lum]; + if (newLum == lum) { + return; + } + float h, s, v; Color::rgb2hsvtc(r, g, b, h, s, v); From 857f39eb881c9358be9a22eec2861e263c781b35 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 6 Jan 2018 18:01:54 +0100 Subject: [PATCH 108/200] swapped shortcuts for "zoom to fit" and "zoom to fit crop" --- rtdata/languages/default | 4 ++-- rtgui/editorpanel.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7fbe7260a..dd0a63fc6 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2190,7 +2190,7 @@ TP_WBALANCE_WATER_HEADER;UnderWater ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 643803075..e9964073a 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -1643,7 +1643,7 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) return true; case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitClicked(); + iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); return true; case GDK_KEY_F5: @@ -1718,7 +1718,7 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) return true; case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); + iareapanel->imageArea->zoomPanel->zoomFitClicked(); return true; } } From 309eef696be1022860cc51e07062915bfa4c1b00 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 6 Jan 2018 18:46:20 +0100 Subject: [PATCH 109/200] Set gtk language based on selected language in RT, fixes #4278, kudos to @agriggio --- rtgui/multilangmgr.cc | 28 +++++++++++++++++++++++++++- rtgui/multilangmgr.h | 2 +- rtgui/options.cc | 2 +- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index 7cc79d19a..b4896d69a 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -94,10 +94,34 @@ struct LocaleToLang : private std::map, return "default"; } + + std::string getLocale(const Glib::ustring &language) const + { + for (auto &p : *this) { + if (p.second == language) { + std::string ret = p.first.first; + if (!p.first.second.empty()) { + ret += "_" + p.first.second; + } + return ret; + } + } + return "C"; + } }; const LocaleToLang localeToLang; +void setGtkLanguage(const Glib::ustring &language) +{ + auto l = localeToLang.getLocale(language); +#ifdef WIN32 + putenv(("LANG=" + l).c_str()); +#else + setenv("LANG", l.c_str(), true); +#endif +} + } MultiLangMgr langMgr; @@ -106,8 +130,10 @@ MultiLangMgr::MultiLangMgr () { } -void MultiLangMgr::load (const std::vector &fnames) +void MultiLangMgr::load(const Glib::ustring &language, const std::vector &fnames) { + setGtkLanguage(language); + translations.clear(); for (const auto& fname : fnames) { diff --git a/rtgui/multilangmgr.h b/rtgui/multilangmgr.h index d439307e3..649865217 100644 --- a/rtgui/multilangmgr.h +++ b/rtgui/multilangmgr.h @@ -30,7 +30,7 @@ class MultiLangMgr public: MultiLangMgr (); - void load(const std::vector &fnames); + void load(const Glib::ustring &language, const std::vector &fnames); Glib::ustring getStr(const std::string& key) const; static bool isOSLanguageDetectSupported(); static Glib::ustring getOSUserLanguage(); diff --git a/rtgui/options.cc b/rtgui/options.cc index 449aa3809..6e538059f 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2323,7 +2323,7 @@ void Options::load (bool lightweight) } } - langMgr.load ({localeTranslation, languageTranslation, defaultTranslation}); + langMgr.load (options.language, {localeTranslation, languageTranslation, defaultTranslation}); rtengine::init (&options.rtSettings, argv0, rtdir, !lightweight); } From f3c0c2f0893cceaa5f85e2e8a7ddd9e810524022 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 7 Jan 2018 11:59:56 +0100 Subject: [PATCH 110/200] Update TooWaBlue theme to version 2.61 Queue switch --- rtdata/themes/TooWaBlue-GTK3-20_.css | 67 ++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index 1e196bff8..af7fb00af 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2017 TooWaBoo - Version 2.60 + Version 2.61 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -213,10 +213,6 @@ dialog frame > label { padding-left: 0.91667em; } -#BatchQueueButtons { - margin-top: 0.66667em; -} - frame > label { margin: 0; padding: 0.5em 0; @@ -637,6 +633,11 @@ scale:disabled trough { background-image: none; } +#BatchQueueButtonsMainContainer scale:disabled slider, +#BatchQueueButtonsMainContainer scale:disabled trough { + background-color: shade(@bg-light-grey,.85); +} + /*** end ***************************************************************************************/ /*** Progressbar *******************************************************************************/ @@ -1225,6 +1226,51 @@ popover.background modelbutton:hover { } /** end ****************************************************************************************/ +/*** Switch ***********************************************************************************/ +switch { + min-height: 2.16667em; + min-width: 11em; + margin: 0; + padding: 0; + border-radius: 0.2em; + background-image: none; + box-shadow: inset 0.08334em 0.08334em rgba(0, 0, 0, 0.08), 0 0.08334em rgba(242, 242, 242, 0.1); + border: 0.08334em solid @bg-entry-border; + background-color: @bg-scale-entry; + margin-bottom: 0.5em; +} + +switch slider { + border: 0.08334em solid @bg-entry-border; + background-image: linear-gradient(to bottom, shade (@accent-color2,1.15), shade (@accent-color2,.85)); + border: 0.08334em solid @bg-entry-border; + box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.1); + border-radius: 0.2em 0 0 0.2em; +} +switch:checked slider{ + border-radius: 0 0.2em 0.2em 0; +} + +switch:hover slider { + background-image: linear-gradient(to bottom, shade (@accent-color2,1.20), shade (@accent-color2,.90)); +} + +switch:checked { + background-color: rgb(140,0,20); + color: @headline-big; +} + +switch:disabled:not(:checked) { + box-shadow: none; + background-image: none; + background-color: shade (@bg-light-grey, .85); +} +switch:disabled slider { + background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); + background-color: shade (@bg-light-grey, .85); +} +/** end ****************************************************************************************/ + /*** Buttons ***********************************************************************************/ button { min-height: 2.16667em; @@ -1355,6 +1401,7 @@ button.MiddleH { /**/ /* Button base format for Toolbox and dialogs */ +#ToolPanelNotebook > stack > box > box > combobox .combo, dialog button, #MyExpander button, #BatchQueueButtonsMainContainer button { @@ -1371,7 +1418,7 @@ combobox .combo, dialog combobox .combo, #ToolPanelNotebook combobox .combo, #BatchQueueButtonsMainContainer combobox .combo { - padding: 0 0.208334em; + padding: 0 0.26667em; } /**/ @@ -1386,6 +1433,7 @@ dialog combobox .combo, #MyExpander combobox + label */ { margin-left: 0.16667em; } + #MyExpander label + * > button:not(.flat).Left, #MyExpander label + combobox:not(:first-child):not(:only-child), #MyExpander label + button:not(.flat):not(spinbutton) { @@ -1455,13 +1503,6 @@ messagedialog .dialog-action-area button:not(:only-child):nth-child(2) { } /**/ -/* Queue */ -#BatchQueueButtons button { - min-height: 2.16667em; - min-width: 10em; -} -/**/ - /* View & Filechooser Buttons */ dialog .view button, window .view button { From d1d89d7f7203c58af2038ce726eddbbfa27a45c5 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 7 Jan 2018 12:00:58 +0100 Subject: [PATCH 111/200] Update Deutsch local --- rtdata/languages/Deutsch | 57 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 1daaa9119..e6cb9f96d 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -48,6 +48,7 @@ #47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 #48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 #49 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3 +#50 07.01.2018 Crop Settings (TooWaBoo) RT 5.3 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -572,9 +573,9 @@ HISTORY_MSG_281;(Farbanpassungen)\nSättigung schützen\nIntensität HISTORY_MSG_282;(Farbanpassungen)\nSättigung schützen\nSchwelle HISTORY_MSG_283;(Farbanpassungen)\nIntensität HISTORY_MSG_284;(Farbanpassungen)\nSättigung schützen\nAutomatisch -HISTORY_MSG_285;(Rauschreduzierung)\nMedianmethode +HISTORY_MSG_285;(Rauschreduzierung)\nMedianfilter - Methode HISTORY_MSG_286;(Rauschreduzierung)\nMediantyp -HISTORY_MSG_287;(Rauschreduzierung)\nMedianiterationen +HISTORY_MSG_287;(Rauschreduzierung)\nMedianfilter - Iterationen HISTORY_MSG_288;(Weißbild)\nKontrolle zu heller Bereiche HISTORY_MSG_289;(Weißbild)\nAuto-Kontrolle zu\nheller Bereiche HISTORY_MSG_290;(Sensor-Matrix)\nSchwarzpunkt - Rot @@ -1151,7 +1152,7 @@ PREFERENCES_REMEMBERZOOMPAN;Zoom und Bildposition merken PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Öffnen eines neuen Bildes mit den Zoom- und Positionswerten\ndes vorangegangenen Bildes.\n\nFunktioniert nur unter folgenden Bedingungen:\nEin-Reitermodus aktiv\n“Demosaikmethode für 100%-Ansicht“ muss auf “Wie im Bild-\nverarbeitungsprofil vorgegeben“ eingestellt sein. PREFERENCES_RGBDTL_LABEL;Maximale Anzahl Threads für Rauschreduzierung PREFERENCES_RGBDTL_TOOLTIP;Die Rauschreduzierung benötigt mindestens 128MB RAM für ein 10 Megapixel-Bild oder 512MB für ein 40 Megapixel-Bild, und zusätzlich 128MB RAM pro Thread. Je mehr Threads parallel ablaufen, desto schneller ist die Berechnung. Bei Einstellung "0" werden so viele Threads wie möglich benutzt. -PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt sichern +PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt speichern PREFERENCES_SELECTFONT;Schriftart PREFERENCES_SELECTFONT_COLPICKER;Schriftart für die Farbwähler PREFERENCES_SELECTLANG;Sprache @@ -1513,7 +1514,7 @@ TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminanzdetails TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminanz TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanz -TP_DIRPYRDENOISE_MAIN_COLORSPACE;Methode +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Farbraum TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Rauschreduzierung TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB @@ -1524,7 +1525,7 @@ TP_DIRPYRDENOISE_MAIN_MODE;Qualität TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoch TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Einstellung der Qualität der Rauschreduzierung.\nDie Einstellung “Hoch“ verbessert die Rausch-\nreduzierung auf Kosten der Verarbeitungszeit. -TP_DIRPYRDENOISE_MEDIAN_METHOD;Medianmethode +TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Nur Farbe TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Medianfilter @@ -1532,7 +1533,7 @@ TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Nur Luminanz TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewichtet L* (wenig) + a*b* (normal) -TP_DIRPYRDENOISE_MEDIAN_PASSES;Medianiterationen +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iterationen TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. TP_DIRPYRDENOISE_MEDIAN_TYPE;Mediantyp TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe 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. @@ -2226,25 +2227,25 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -!GENERAL_SLIDER;Slider -!HISTORY_MSG_173;NR - Detail recovery -!HISTORY_MSG_203;NR - Color space -!HISTORY_MSG_256;NR - Median - Type -!HISTORY_MSG_297;NR - Mode -!HISTORY_MSG_METADATA_MODE;Metadata copy mode -!PREFERENCES_CROP;Crop editing -!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area -!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop -!PREFERENCES_CROP_GUIDES_FRAME;Frame -!PREFERENCES_CROP_GUIDES_FULL;Original -!PREFERENCES_CROP_GUIDES_NONE;None -!PREFERENCES_EDITORCMDLINE;Custom command line -!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction -!TP_METADATA_EDIT;Apply modifications -!TP_METADATA_MODE;Metadata copy mode -!TP_METADATA_STRIP;Strip all metadata -!TP_METADATA_TUNNEL;Copy unchanged -!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average -!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. +BATCHQUEUE_STARTSTOPHINT;Startet / Stoppt die Verarbeitung\nder Warteschlange.\n\nTaste: Strg + s +GENERAL_SLIDER;Regler +HISTORY_MSG_173;(Rauschreduzierung)\nLuminanzdetails +HISTORY_MSG_203;(Rauschreduzierung)\nFarbraum +HISTORY_MSG_256;(Rauschreduzierung)\nMedianfilter - Mediantyp +HISTORY_MSG_297;(Rauschreduzierung)\nQualität +HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus +PREFERENCES_CROP;Einstelleung des Ausschnittswerkzeuges +PREFERENCES_CROP_AUTO_FIT;Automatischer Zoom des Ausschnitts +PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen wenn Ausschnitt nicht verändert wird +PREFERENCES_CROP_GUIDES_FRAME;Rahmen +PREFERENCES_CROP_GUIDES_FULL;Vorgabe des Ausschnittswerkzeuges +PREFERENCES_CROP_GUIDES_NONE;Keine +PREFERENCES_EDITORCMDLINE;Benutzerdefinierte Befehlszeile +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Erhöht / Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung.\n +TP_DIRPYRDENOISE_LABEL;Rauschreduzierung +TP_METADATA_EDIT;Veränderte Daten +TP_METADATA_MODE;Kopiermodus +TP_METADATA_STRIP;Keine +TP_METADATA_TUNNEL;Unveränderte Daten +TP_RAW_PIXELSHIFTONEGREEN;Benutze ein Grün +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Benutze ein Grün anstelle des\nDurchschnitts beider Grüns für\nBereiche ohne Bewegung. From 4305cb74a75a681856f7dbc2a04c8492696ffab4 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 7 Jan 2018 19:31:27 +0100 Subject: [PATCH 112/200] Update Deutsch --- rtdata/languages/Deutsch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index e6cb9f96d..9e6012d53 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2234,7 +2234,7 @@ HISTORY_MSG_203;(Rauschreduzierung)\nFarbraum HISTORY_MSG_256;(Rauschreduzierung)\nMedianfilter - Mediantyp HISTORY_MSG_297;(Rauschreduzierung)\nQualität HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus -PREFERENCES_CROP;Einstelleung des Ausschnittswerkzeuges +PREFERENCES_CROP;Einstellung des Ausschnittswerkzeuges PREFERENCES_CROP_AUTO_FIT;Automatischer Zoom des Ausschnitts PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen wenn Ausschnitt nicht verändert wird PREFERENCES_CROP_GUIDES_FRAME;Rahmen From 12f1aa853ae4fb3b202f9449552032690877f646 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sun, 7 Jan 2018 19:35:47 +0100 Subject: [PATCH 113/200] Update Deutsch --- rtdata/languages/Deutsch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 9e6012d53..f502e61cc 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2241,7 +2241,7 @@ PREFERENCES_CROP_GUIDES_FRAME;Rahmen PREFERENCES_CROP_GUIDES_FULL;Vorgabe des Ausschnittswerkzeuges PREFERENCES_CROP_GUIDES_NONE;Keine PREFERENCES_EDITORCMDLINE;Benutzerdefinierte Befehlszeile -TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Erhöht / Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung.\n +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Erhöht / Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung. TP_DIRPYRDENOISE_LABEL;Rauschreduzierung TP_METADATA_EDIT;Veränderte Daten TP_METADATA_MODE;Kopiermodus From 393d62bdb69afc16dc9bc9256f018fd60e4acbff Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 7 Jan 2018 22:59:24 +0100 Subject: [PATCH 114/200] =?UTF-8?q?=C3=82Some=20speedups=20for=20scalar=20?= =?UTF-8?q?sleef=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rtengine/curves.h.save-failed | 1142 +++++++++++++++++++++++++++++++++ rtengine/rt_math.h | 2 + rtengine/sleef.c | 13 +- 3 files changed, 1150 insertions(+), 7 deletions(-) create mode 100644 rtengine/curves.h.save-failed diff --git a/rtengine/curves.h.save-failed b/rtengine/curves.h.save-failed new file mode 100644 index 000000000..47ab0fc6f --- /dev/null +++ b/rtengine/curves.h.save-failed @@ -0,0 +1,1142 @@ +/* + * 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 . + */ +#ifndef __CURVES_H__ +#define __CURVES_H__ + +#include +#include +#include +#include "rt_math.h" +#include "../rtgui/mycurve.h" +#include "../rtgui/myflatcurve.h" +#include "../rtgui/mydiagonalcurve.h" +#include "color.h" +#include "procparams.h" +#include "pipettebuffer.h" + +#include "LUT.h" + +#define CURVES_MIN_POLY_POINTS 1000 + +#include "rt_math.h" + +#define CLIPI(a) ((a)>0?((a)<65534?(a):65534):0) + +using namespace std; + +namespace rtengine +{ +class ToneCurve; +class ColorAppearance; + +class CurveFactory +{ + + friend class Curve; + +protected: + + // functions calculating the parameters of the contrast curve based on the desired slope at the center + static double solve_upper (double m, double c, double deriv); + static double solve_lower (double m, double c, double deriv); + static double dupper (const double b, const double m, const double c); + static double dlower (const double b, const double m, const double c); + + // basic convex function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point + static inline double basel (double x, double m1, double m2) + { + if (x == 0.0) { + return 0.0; + } + + double k = sqrt ((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2); + double l = (m1 - m2) / (1.0 - m2) + k; + double lx = xlog(x); + return m2 * x + (1.0 - m2) * (2.0 - xexp(k * lx)) * xexp(l * lx); + } + // basic concave function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point + static inline double baseu (double x, double m1, double m2) + { + return 1.0 - basel(1.0 - x, m1, m2); + } + // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery + static inline double cupper (double x, double m, double hr) + { + if (hr > 1.0) { + return baseu (x, m, 2.0 * (hr - 1.0) / m); + } + + double x1 = (1.0 - hr) / m; + double x2 = x1 + hr; + + if (x >= x2) { + return 1.0; + } + + if (x < x1) { + return x * m; + } + + return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0); + } + // concave curve between (0,0) and (1,1) with slope m at (1,1). sr controls the shadow recovery + static inline double clower (double x, double m, double sr) + { + return 1.0 - cupper(1.0 - x, m, sr); + } + // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery + static inline double cupper2 (double x, double m, double hr) + { + double x1 = (1.0 - hr) / m; + double x2 = x1 + hr; + + if (x >= x2) { + return 1.0; + } + + if (x < x1) { + return x * m; + } + + return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0.3 * hr); + } + static inline double clower2 (double x, double m, double sr) + { + //curve for b<0; starts with positive slope and then rolls over toward straight line to x=y=1 + double x1 = sr / 1.5 + 0.00001; + + if (x > x1 || sr < 0.001) { + return 1 - (1 - x) * m; + } else { + double y1 = 1 - (1 - x1) * m; + return y1 + m * (x - x1) - (1 - m) * SQR(SQR(1 - x / x1)); + } + } + // tone curve base. a: slope (from exp.comp.), b: black point normalized by 65535, + // D: max. x value (can be>1), hr,sr: highlight,shadow recovery + static inline double basecurve (double x, double a, double b, double D, double hr, double sr) + { + 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 + + if (x > m) { + return y + (x - m) * slope; //value on straight line between (m,y) and (1,1) + } else { + return y * clower2(x / m, slope * m / y, 2.0 - sr); + } + } else { + double slope = a / (1.0 - b); + double m = a * D > 1.0 ? b / a + (0.25) / slope : b + (1 - b) / 4; + double y = a * D > 1.0 ? 0.25 : (m - b / a) * slope; + + if (x <= m) { + return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y; + } else if (a * D > 1.0) { + return y + (1.0 - y) * cupper2((x - m) / (D - m), slope * (D - m) / (1.0 - y), hr); + } else { + return y + (x - m) * slope; + } + } + } + static inline double simplebasecurve (double x, double b, double sr) + { + // a = 1, D = 1, hr = 0 (unused for a = D = 1) + 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 + + if (x > m) { + return y + (x - m) * slope; //value on straight line between (m,y) and (1,1) + } else { + return y * clower2(x / m, slope * m / y, 2.0 - sr); + } + } else { + double slope = 1.0 / (1.0 - b); + double m = b + (1 - b) * 0.25; + double y = (m - b) * slope; + + if (x <= m) { + return clower (x / m, slope * m / y, sr) * y; + } else { + return y + (x - m) * slope; + } + } + } + + +public: + const static double sRGBGamma; // standard average gamma + const static double sRGBGammaCurve; // 2.4 in the curve + + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // accurately determine value from integer array with float as index + //linearly interpolate from ends of range if arg is out of bounds + static inline float interp(int *array, float f) + { + int index = CLIPI(floor(f)); + float part = (float)((f) - index) * (float)(array[index + 1] - array[index]); + return (float)array[index] + part; + } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // accurately determine value from float array with float as index + //linearly interpolate from ends of range if arg is out of bounds + static inline float flinterp(float *array, float f) + { + int index = CLIPI(floor(f)); + float part = ((f) - (float)index) * (array[index + 1] - array[index]); + return array[index] + part; + } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + static inline double centercontrast (double x, double b, double m); + + // standard srgb gamma and its inverse + static inline double gamma2 (double x) + { + return x <= 0.00304 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; + } + static inline double igamma2 (double x) + { + return x <= 0.03928 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); + } + static inline float gamma2 (float x) + { + return x <= 0.00304 ? x * 12.92 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; + } + static inline float igamma2 (float x) + { + return x <= 0.03928 ? x / 12.92 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); + } + // gamma function with adjustable parameters + static inline double gamma (double x, double gamma, double start, double slope, double mul, double add) + { + return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add); + } + 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) ); + } + static inline float gamma (float x, float gamma, float start, float slope, float mul, float 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 : xexpf(xlogf((x + add) / mul) * gamma) ); + } +#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) + { + if (comp > 0.0) { + float val = level + (hlrange - 65536.0); + + if(val == 0.0f) { // to avoid division by zero + val = 0.000001f; + } + + float Y = val * exp_scale / hlrange; + Y *= comp; + + if(Y <= -1.0) { // to avoid log(<=0) + Y = -.999999f; + } + + float R = hlrange / (val * comp); + return log1p(Y) * R; + } else { + return exp_scale; + } + } + +public: + static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, + const std::vector& curvePoints, const std::vector& curvePoints2, + 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, + ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, 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); + static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); + + static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip); + + 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, + 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); + + static void curveLightBrightColor ( + 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, + int skip = 1); + static void RGBCurve (const std::vector& curvePoints, LUTf & outCurve, int skip); + +}; + +class Curve +{ + + class HashEntry + { + public: + unsigned short smallerValue; + unsigned short higherValue; + }; +protected: + int N; + int ppn; // targeted polyline point number + double* x; + double* y; + // begin of variables used in Parametric curves only + double mc; + double mfc; + double msc; + double mhc; + // 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] + + double* ypp; + + // Fields for the elementary curve polygonisation + double x1, y1, x2, y2, x3, y3; + bool firstPointIncluded; + double increment; + int nbr_points; + + static inline double p00 (double x, double prot) + { + return CurveFactory::clower (x, 2.0, prot); + } + static inline double p11 (double x, double prot) + { + return CurveFactory::cupper (x, 2.0, prot); + } + static inline double p01 (double x, double prot) + { + 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) * 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) + { + return (1 - sh) * (1 - hl) * p00(x, prot) + sh * hl * p11(x, prot) + (1 - sh) * hl * p01(x, prot) + sh * (1 - hl) * p10(x, prot); + } + + void fillHash(); + void fillDyByDx(); + +public: + Curve (); + virtual ~Curve () {}; + void AddPolygons (); + int getSize () const; // return the number of control points + void getControlPoint(int cpNum, double &x, double &y) const; + virtual double getVal (double t) const = 0; + virtual void getVal (const std::vector& t, std::vector& res) const = 0; + + virtual bool isIdentity () const = 0; +}; + +class DiagonalCurve : public Curve +{ + +protected: + DiagonalCurveType kind; + + void spline_cubic_set (); + void NURBS_set (); + +public: + DiagonalCurve (const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS); + virtual ~DiagonalCurve (); + + double getVal (double t) const; + void getVal (const std::vector& t, std::vector& res) const; + bool isIdentity () const + { + return kind == DCT_Empty; + }; +}; + +class FlatCurve : public Curve +{ + +private: + FlatCurveType kind; + double* leftTangent; + double* rightTangent; + double identityValue; + bool periodic; + + void CtrlPoints_set (); + +public: + + FlatCurve (const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS); + virtual ~FlatCurve (); + + double getVal (double t) const; + void getVal (const std::vector& t, std::vector& res) const; + bool setIdentityValue (double iVal); + bool isIdentity () const + { + return kind == FCT_Empty; + }; +}; + +class RetinextransmissionCurve +{ +private: + LUTf luttransmission; // 0xffff range + void Set(const Curve &pCurve); + +public: + virtual ~RetinextransmissionCurve() {}; + RetinextransmissionCurve(); + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return luttransmission[index]; + } + + operator bool (void) const + { + return luttransmission; + } +}; + +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 +{ +public: + LUTf lutToneCurve; // 0xffff range + + virtual ~ToneCurve() {}; + + void Reset(); + void Set(const Curve &pCurve, float gamma = 0); + operator bool (void) const + { + return lutToneCurve; + } +}; + +class OpacityCurve +{ +public: + LUTf lutOpacityCurve; // 0xffff range + + virtual ~OpacityCurve() {}; + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints, bool &opautili); + + // TODO: transfer this method to the Color class... + float blend (float x, float lower, float upper) const + { + return (upper - lower) * lutOpacityCurve[x * 500.f] + lower; + } + void blend3f (float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const + { + float opacity = lutOpacityCurve[x * 500.f]; + result1 = (upper1 - lower1) * opacity + lower1; + result2 = (upper2 - lower2) * opacity + lower2; + result3 = (upper3 - lower3) * opacity + lower3; + } + + operator bool (void) const + { + return lutOpacityCurve; + } +}; + +class WavCurve +{ +private: + LUTf lutWavCurve; // 0xffff range + void Set(const Curve &pCurve); + +public: + float sum; + + virtual ~WavCurve() {}; + WavCurve(); + void Reset(); + void Set(const std::vector &curvePoints); + float getSum() const + { + return sum; + } + + float operator[](float index) const + { + return lutWavCurve[index]; + } + operator bool (void) const + { + return lutWavCurve; + } +}; + +class WavOpacityCurveRG +{ +private: + LUTf lutOpacityCurveRG; // 0xffff range + void Set(const Curve &pCurve); +public: + virtual ~WavOpacityCurveRG() {}; + WavOpacityCurveRG(); + + void Reset(); + // void Set(const std::vector &curvePoints, bool &opautili); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveRG[index]; + } + + operator bool (void) const + { + return lutOpacityCurveRG; + } +}; +class WavOpacityCurveBY +{ +private: + LUTf lutOpacityCurveBY; // 0xffff range + void Set(const Curve &pCurve); + +public: + virtual ~WavOpacityCurveBY() {}; + WavOpacityCurveBY(); + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveBY[index]; + } + + operator bool (void) const + { + return lutOpacityCurveBY; + } +}; +class WavOpacityCurveW +{ +private: + LUTf lutOpacityCurveW; // 0xffff range + void Set(const Curve &pCurve); + +public: + virtual ~WavOpacityCurveW() {}; + WavOpacityCurveW(); + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveW[index]; + } + + operator bool (void) const + { + return lutOpacityCurveW; + } +}; + +class WavOpacityCurveWL +{ +private: + LUTf lutOpacityCurveWL; // 0xffff range + void Set(const Curve &pCurve); + +public: + virtual ~WavOpacityCurveWL() {}; + WavOpacityCurveWL(); + + void Reset(); + void Set(const Curve *pCurve); + void Set(const std::vector &curvePoints); + float operator[](float index) const + { + return lutOpacityCurveWL[index]; + } + + operator bool (void) const + { + return lutOpacityCurveWL; + } +}; + +class NoiseCurve +{ +private: + LUTf lutNoiseCurve; // 0xffff range + float sum; + void Set(const Curve &pCurve); + +public: + virtual ~NoiseCurve() {}; + NoiseCurve(); + void Reset(); + void Set(const std::vector &curvePoints); + + float getSum() const + { + return sum; + } + float operator[](float index) const + { + return lutNoiseCurve[index]; + } + operator bool (void) const + { + return lutNoiseCurve; + } +}; + +class ColorGradientCurve +{ +public: + LUTf lut1; // [0.;1.] range (float values) + LUTf lut2; // [0.;1.] range (float values) + LUTf lut3; // [0.;1.] range (float values) + double low; + double high; + + virtual ~ColorGradientCurve() {}; + + void Reset(); + void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin); + void SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin); + void SetRGB(const Curve *pCurve); + void SetRGB(const std::vector &curvePoints); + + /** + * @brief Get the value of Red, Green and Blue corresponding to the requested index + * @param index value in the [0 ; 1] range + * @param r corresponding red value [0 ; 65535] (return value) + * @param g corresponding green value [0 ; 65535] (return value) + * @param b corresponding blue value [0 ; 65535] (return value) + */ + void getVal(float index, float &r, float &g, float &b) const; + operator bool (void) const + { + return lut1 && lut2 && lut3; + } +}; + +class ColorAppearance +{ +public: + LUTf lutColCurve; // 0xffff range + + virtual ~ColorAppearance() {}; + + void Reset(); + void Set(const Curve &pCurve); + operator bool (void) const + { + return lutColCurve; + } +}; + +class Lightcurve : public ColorAppearance +{ +public: + void Apply(float& Li) const; +}; + +//lightness curve +inline void Lightcurve::Apply (float& Li) const +{ + + assert (lutColCurve); + + Li = lutColCurve[Li]; +} + +class Brightcurve : public ColorAppearance +{ +public: + void Apply(float& Br) const; +}; + +//brightness curve +inline void Brightcurve::Apply (float& Br) const +{ + + assert (lutColCurve); + + Br = lutColCurve[Br]; +} + +class Chromacurve : public ColorAppearance +{ +public: + void Apply(float& Cr) const; +}; + +//Chroma curve +inline void Chromacurve::Apply (float& Cr) const +{ + + assert (lutColCurve); + + Cr = lutColCurve[Cr]; +} +class Saturcurve : public ColorAppearance +{ +public: + void Apply(float& Sa) const; +}; + +//Saturation curve +inline void Saturcurve::Apply (float& Sa) const +{ + + assert (lutColCurve); + + Sa = lutColCurve[Sa]; +} + +class Colorfcurve : public ColorAppearance +{ +public: + void Apply(float& Cf) const; +}; + +//Colorfullness curve +inline void Colorfcurve::Apply (float& Cf) const +{ + + assert (lutColCurve); + + Cf = lutColCurve[Cf]; +} + + +class StandardToneCurve : public ToneCurve +{ +public: + void Apply(float& r, float& g, float& b) const; + + // Applies the tone curve to `r`, `g`, `b` arrays, starting at `r[start]` + // and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE + // and requires that `r`, `g`, and `b` pointers have the same alignment. + void BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const; +}; + +class AdobeToneCurve : public ToneCurve +{ +private: + void RGBTone(float& r, float& g, float& b) const; // helper for tone curve + +public: + void Apply(float& r, float& g, float& b) const; +}; + +class SatAndValueBlendingToneCurve : public ToneCurve +{ +public: + void Apply(float& r, float& g, float& b) const; +}; + +class WeightedStdToneCurve : public ToneCurve +{ +private: + float Triangle(float refX, float refY, float X2) const; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; +#endif +public: + void Apply(float& r, float& g, float& b) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const; +}; + +class LuminanceToneCurve : public ToneCurve +{ +public: + void Apply(float& r, float& g, float& b) const; +}; + +class PerceptualToneCurveState +{ +public: + float Working2Prophoto[3][3]; + float Prophoto2Working[3][3]; + float cmul_contrast; + bool isProphoto; +}; + +// Tone curve whose purpose is to keep the color appearance constant, that is the curve changes contrast +// but colors appears to have the same hue and saturation as before. As contrast and saturation is tightly +// coupled in human vision saturation is modulated based on the curve's contrast, and that way the appearance +// can be kept perceptually constant (within limits). +class PerceptualToneCurve : public ToneCurve +{ +private: + static float cf_range[2]; + static float cf[1000]; + // for ciecam02 + static float f, c, nc, yb, la, xw, yw, zw, gamut; + static float n, d, nbb, ncb, cz, aw, wh, pfl, fl, pow1; + + static void cubic_spline(const float x[], const float y[], const int len, const float out_x[], float out_y[], const int out_len); + static float find_minimum_interval_halving(float (*func)(float x, void *arg), void *arg, float a, float b, float tol, int nmax); + static float find_tc_slope_fun(float k, void *arg); + static float get_curve_val(float x, float range[2], float lut[], size_t lut_size); + float calculateToneCurveContrastValue() const; +public: + static void init(); + void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b, const PerceptualToneCurveState &state) const; +}; + +// Standard tone curve +inline void StandardToneCurve::Apply (float& r, float& g, float& b) const +{ + + assert (lutToneCurve); + + r = lutToneCurve[r]; + g = lutToneCurve[g]; + b = lutToneCurve[b]; +} + +inline void StandardToneCurve::BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const { + assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); + + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + i++; + } + +#if defined( __SSE2__ ) && defined( __x86_64__ ) + for (; i + 3 < end; i += 4) { + __m128 r_val = LVF(r[i]); + __m128 g_val = LVF(g[i]); + __m128 b_val = LVF(b[i]); + STVF(r[i], lutToneCurve[r_val]); + STVF(g[i], lutToneCurve[g_val]); + STVF(b[i], lutToneCurve[b_val]); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + } +#endif +} + +// Tone curve according to Adobe's reference implementation +// values in 0xffff space +// inlined to make sure there will be no cache flush when used +inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const +{ + + assert (lutToneCurve); + + if (r >= g) { + if (g > b) { + RGBTone (r, g, b); // Case 1: r >= g > b + } else if (b > r) { + RGBTone (b, r, g); // Case 2: b > r >= g + } else if (b > g) { + RGBTone (r, b, g); // Case 3: r >= b > g + } else { // Case 4: r >= g == b + r = lutToneCurve[r]; + g = lutToneCurve[g]; + b = g; + } + } else { + if (r >= b) { + RGBTone (g, r, b); // Case 5: g > r >= b + } else if (b > g) { + RGBTone (b, g, r); // Case 6: b > g > r + } else { + RGBTone (g, b, r); // Case 7: g >= b > r + } + } +} + +inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const +{ + float rold = r, gold = g, bold = b; + + r = lutToneCurve[rold]; + b = lutToneCurve[bold]; + g = b + ((r - b) * (gold - bold) / (rold - bold)); +} + +// Modifying the Luminance channel only +inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const +{ + assert (lutToneCurve); + + float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f; + const float newLuminance = lutToneCurve[currLuminance]; + currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance; + const float coef = newLuminance / currLuminance; + r = LIM(r * coef, 0.f, 65535.f); + g = LIM(g * coef, 0.f, 65535.f); + b = LIM(b * coef, 0.f, 65535.f); +} + +inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const +{ + if (a != b) { + float b1; + float a2 = a1 - a; + + if (b < a) { + b1 = b + a2 * b / a ; + } else { + b1 = b + a2 * (65535.f - b) / (65535.f - a); + } + + return b1; + } + + return a1; +} + +#if defined( __SSE2__ ) && defined( __x86_64__ ) +inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const +{ + vfloat a2 = a1 - a; + vmask cmask = vmaskf_lt(b, a); + vfloat b3 = vself(cmask, b, F2V(65535.f) - b); + vfloat a3 = vself(cmask, a, F2V(65535.f) - a); + return b + a2 * b3 / a3; +} +#endif + +// Tone curve modifying the value channel only, preserving hue and saturation +// values in 0xffff space +inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const +{ + + assert (lutToneCurve); + + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + float r1 = lutToneCurve[r]; + float g1 = Triangle(r, r1, g); + float b1 = Triangle(r, r1, b); + + float g2 = lutToneCurve[g]; + float r2 = Triangle(g, g2, r); + float b2 = Triangle(g, g2, b); + + float b3 = lutToneCurve[b]; + float r3 = Triangle(b, b3, r); + float g3 = Triangle(b, b3, g); + + r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); + g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); + b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); +} + +inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { + assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); + + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#if defined( __SSE2__ ) && defined( __x86_64__ ) + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + Apply(r[i], g[i], b[i]); + i++; + } + +#if defined( __SSE2__ ) && defined( __x86_64__ ) + const vfloat c65535v = F2V(65535.f); + const vfloat zd5v = F2V(0.5f); + const vfloat zd25v = F2V(0.25f); + + for (; i + 3 < end; i += 4) { + vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); + vfloat r1 = lutToneCurve[r_val]; + vfloat g1 = Triangle(r_val, r1, g_val); + vfloat b1 = Triangle(r_val, r1, b_val); + + vfloat g2 = lutToneCurve[g_val]; + vfloat r2 = Triangle(g_val, g2, r_val); + vfloat b2 = Triangle(g_val, g2, b_val); + + vfloat b3 = lutToneCurve[b_val]; + vfloat r3 = Triangle(b_val, b3, r_val); + vfloat g3 = Triangle(b_val, b3, g_val); + + STVF(r[i], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); + STVF(g[i], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); + STVF(b[i], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + Apply(r[i], g[i], b[i]); + } +#endif +} + +// Tone curve modifying the value channel only, preserving hue and saturation +// values in 0xffff space +inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const +{ + + assert (lutToneCurve); + + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + + const float lum = (r + g + b) / 3.f; + const float newLum = lutToneCurve[lum]; + + float h, s, v; + Color::rgb2hsvtc(r, g, b, h, s, v); + + float dV; + if (newLum >= lum) { + // Linearly targeting Value = 1 and Saturation = 0 + const float coef = (newLum - lum) / (65535.f - lum); + dV = (1.f - v) * coef; + s *= 1.f - coef; + } else { + // Linearly targeting Value = 0 + const float coef = (newLum - lum) / lum ; + dV = v * coef; + } + Color::hsv2rgbdcp(h, s, v + dV, r, g, b); +} + +} + +#undef CLIPI + +#endif diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 4bdfe6f06..787e2e63f 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -25,6 +25,8 @@ constexpr double RT_NAN = std::numeric_limits::quiet_NaN(); constexpr float RT_PI_F = RT_PI; constexpr float RT_PI_F_2 = RT_PI_2; constexpr float RT_PI_F_180 = RT_PI_180; +constexpr float RT_1_PI_F = RT_1_PI; +constexpr float RT_2_PI_F = RT_2_PI; constexpr float RT_INFINITY_F = std::numeric_limits::infinity(); constexpr float RT_NAN_F = std::numeric_limits::quiet_NaN(); diff --git a/rtengine/sleef.c b/rtengine/sleef.c index 17dfccc0f..f03c9f1b3 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -923,9 +923,8 @@ __inline float mulsignf(float x, float y) { return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); } -__inline float signf(float d) { return mulsignf(1, d); } +__inline float signf(float d) { return copysign(1, d); } __inline float mlaf(float x, float y, float z) { return x * y + z; } -__inline float xrintf(float x) { return x < 0 ? (int)(x - 0.5f) : (int)(x + 0.5f); } __inline int xisnanf(float x) { return x != x; } __inline int xisinff(float x) { return x == rtengine::RT_INFINITY_F || x == -rtengine::RT_INFINITY_F; } @@ -984,7 +983,7 @@ __inline float xsinf(float d) { int q; float u, s; - q = (int)xrintf(d * (float)rtengine::RT_1_PI); + q = rint(d * rtengine::RT_1_PI_F); d = mlaf(q, -PI4_Af*4, d); d = mlaf(q, -PI4_Bf*4, d); @@ -1009,7 +1008,7 @@ __inline float xcosf(float d) { int q; float u, s; - q = 1 + 2*(int)xrintf(d * (float)rtengine::RT_1_PI - 0.5f); + q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); d = mlaf(q, -PI4_Af*2, d); d = mlaf(q, -PI4_Bf*2, d); @@ -1035,7 +1034,7 @@ __inline float2 xsincosf(float d) { float u, s, t; float2 r; - q = (int)rint(d * ((float)(2 * rtengine::RT_1_PI))); + q = rint(d * rtengine::RT_2_PI_F); s = d; @@ -1076,7 +1075,7 @@ __inline float xtanf(float d) { int q; float u, s, x; - q = (int)xrintf(d * (float)(2 * rtengine::RT_1_PI)); + q = rint(d * (float)(2 * rtengine::RT_1_PI)); x = d; @@ -1202,7 +1201,7 @@ __inline float xlogf(float d) { __inline float xexpf(float d) { if(d<=-104.0f) return 0.0f; - int q = (int)xrintf(d * R_LN2f); + int q = rint(d * R_LN2f); float s, u; s = mlaf(q, -L2Uf, d); From 041990d2167ea7df15e58c0f1106ea4fb04e34f3 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 8 Jan 2018 00:19:36 +0100 Subject: [PATCH 115/200] Added new color toning mode "L*a*b* color correction grid", adapted from DT's color correction module --- rtdata/languages/default | 2 + rtengine/improcfun.cc | 43 +++++- rtengine/improcfun.h | 2 +- rtengine/procparams.cc | 21 ++- rtengine/procparams.h | 7 + rtgui/colortoning.cc | 298 +++++++++++++++++++++++++++++++++++++++ rtgui/colortoning.h | 5 + rtgui/paramsedited.cc | 24 ++++ rtgui/paramsedited.h | 5 + 9 files changed, 403 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index dd0a63fc6..7d95b85d2 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -723,6 +723,7 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_COLORTONING_LABGRID_VALUE;L*a*b* color correction HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1405,6 +1406,7 @@ TP_COLORTONING_HIGHLIGHT;Highlights TP_COLORTONING_HUE;Hue TP_COLORTONING_LAB;L*a*b* blending TP_COLORTONING_LABEL;Color Toning +TP_COLORTONING_LABGRID;L*a*b* color correction grid TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Preserve luminance TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7e8e153b1..42cbb6f20 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3477,7 +3477,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer userToneCurve.initApplyState (ptc2ApplyState, params->icm.working); } - bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve); + bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve) && params->colorToning.method != "LabGrid"; // float satLimit = float(params->colorToning.satProtectionThreshold)/100.f*0.7f+0.3f; // float satLimitOpacity = 1.f-(float(params->colorToning.saturatedOpacity)/100.f); float strProtect = (float (params->colorToning.strength) / 100.f); @@ -4952,6 +4952,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer delete vCurve; } + if (params->colorToning.enabled && params->colorToning.method == "LabGrid") { + colorToningLabGrid(lab); + } + if (params->localContrast.enabled) { // Alberto's local contrast localContrast(lab); @@ -7175,4 +7179,41 @@ SSEFUNCTION void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ +void ImProcFunctions::colorToningLabGrid(LabImage *lab) +{ + const float factor = ColorToningParams::LABGRID_CORR_MAX * 1.6f; + float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor; + float a_base = params->colorToning.labgridALow; + float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor; + float b_base = params->colorToning.labgridBLow; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + lab->a[y][x] += lab->L[y][x] * a_scale + a_base; + lab->b[y][x] += lab->L[y][x] * b_scale + b_base; + } + } +} + } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b7e7a7545..1adc2fc5f 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -345,8 +345,8 @@ public: void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom); void ToneMapFattal02(Imagefloat *rgb); - //void localContrast(float *r, float *g, float *b, int width, int height); void localContrast(LabImage *lab); + void colorToningLabGrid(LabImage *lab); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 8fbab7a8d..336f32379 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -688,7 +688,11 @@ ColorToningParams::ColorToningParams() : bluehigh(0.0), satlow(0.0), sathigh(0.0), - lumamode(true) + lumamode(true), + labgridALow(0.0), + labgridBLow(0.0), + labgridAHigh(0.0), + labgridBHigh(0.0) { } @@ -720,7 +724,11 @@ bool ColorToningParams::operator ==(const ColorToningParams& other) const && bluehigh == other.bluehigh && satlow == other.satlow && sathigh == other.sathigh - && lumamode == other.lumamode; + && lumamode == other.lumamode + && labgridALow == other.labgridALow + && labgridBLow == other.labgridBLow + && labgridAHigh == other.labgridAHigh + && labgridBHigh == other.labgridBHigh; } bool ColorToningParams::operator !=(const ColorToningParams& other) const @@ -3337,6 +3345,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->colorToning.shadowsColSat, "ColorToning", "ShadowsColorSaturation", colorToning.shadowsColSat.toVector(), keyFile); saveToKeyfile(!pedited || pedited->colorToning.clcurve, "ColorToning", "ClCurve", colorToning.clcurve, keyFile); saveToKeyfile(!pedited || pedited->colorToning.cl2curve, "ColorToning", "Cl2Curve", colorToning.cl2curve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridALow, "ColorToning", "LabGridALow", colorToning.labgridALow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridBLow, "ColorToning", "LabGridBLow", colorToning.labgridBLow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridAHigh, "ColorToning", "LabGridAHigh", colorToning.labgridAHigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridBHigh, "ColorToning", "LabGridBHigh", colorToning.labgridBHigh, keyFile); // Raw saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame), keyFile); @@ -4585,6 +4597,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "ColorToning", "Redhigh", pedited, colorToning.redhigh, pedited->colorToning.redhigh); assignFromKeyfile(keyFile, "ColorToning", "Greenhigh", pedited, colorToning.greenhigh, pedited->colorToning.greenhigh); assignFromKeyfile(keyFile, "ColorToning", "Bluehigh", pedited, colorToning.bluehigh, pedited->colorToning.bluehigh); + + assignFromKeyfile(keyFile, "ColorToning", "LabGridALow", pedited, colorToning.labgridALow, pedited->colorToning.labgridALow); + assignFromKeyfile(keyFile, "ColorToning", "LabGridBLow", pedited, colorToning.labgridBLow, pedited->colorToning.labgridBLow); + assignFromKeyfile(keyFile, "ColorToning", "LabGridAHigh", pedited, colorToning.labgridAHigh, pedited->colorToning.labgridAHigh); + assignFromKeyfile(keyFile, "ColorToning", "LabGridBHigh", pedited, colorToning.labgridBHigh, pedited->colorToning.labgridBHigh); } if (keyFile.has_group ("RAW")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 58cc2cdfc..7aed263ea 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -424,6 +424,7 @@ struct ColorToningParams { * Lch : * RGBSliders : * RGBCurves : + * LabGrid : */ Glib::ustring method; @@ -447,6 +448,12 @@ struct ColorToningParams { double sathigh; bool lumamode; + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + static constexpr double LABGRID_CORR_MAX = 8000.f; + ColorToningParams(); bool operator ==(const ColorToningParams& other) const; diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 180b4235a..38e0630d4 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -4,10 +4,258 @@ #include "colortoning.h" #include "mycurve.h" #include "rtimage.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; +namespace { + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ +class LabGrid: public Gtk::DrawingArea { +private: + rtengine::ProcEvent evt_; + enum State { OFF, HIGH, LOW }; + State selected_; + float low_a_; + float high_a_; + float low_b_; + float high_b_; + float saturation_; + ToolPanelListener *listener_; + bool edited_; + static const int inset = 2; + + void notify_listener() + { + if (listener_) { + auto fmt = [](float f) -> Glib::ustring + { + return Glib::ustring::format(std::setw(4), std::fixed, std::setprecision(3), f); + }; + listener_->panelChanged(evt_, Glib::ustring::compose("%1, %2, %3, %4", fmt(low_a_), fmt(low_b_), fmt(high_a_), fmt(high_b_))); + } + } + +public: + LabGrid(rtengine::ProcEvent evt): + Gtk::DrawingArea(), + evt_(evt), selected_(OFF), + low_a_(0.f), high_a_(0.f), low_b_(0.f), high_b_(0.f), + listener_(nullptr), + edited_(false) + { + set_can_focus(true); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); + } + + void get_params(double &la, double &lb, double &ha, double &hb) const + { + la = low_a_; + ha = high_a_; + lb = low_b_; + hb = high_b_; + } + + void set_params(double la, double lb, double ha, double hb) + { + low_a_ = la; + low_b_ = lb; + high_a_ = ha; + high_b_ = hb; + queue_draw(); + } + + void set_edited(bool yes) + { + edited_ = yes; + } + + + bool get_edited() const + { + return edited_; + } + + void set_listener(ToolPanelListener *l) + { + listener_ = l; + } + + bool on_draw(const ::Cairo::RefPtr &crf) + { + int width = get_allocated_width(); + int height = get_allocated_height(); + Cairo::RefPtr cst = + Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); + Cairo::RefPtr cr = Cairo::Context::create(cst); + // clear bg + cr->set_source_rgb(.2, .2, .2); + cr->paint(); + + cr->translate(inset, inset); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + width -= 2 * inset; + height -= 2 * inset; + // flip y: + cr->translate(0, height); + cr->scale(1., -1.); + const int cells = 8; + float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + for (int j = 0; j < cells; j++) { + for(int i = 0; i < cells; i++) { + float R, G, B; + float x, y, z; + int ii = i - cells/2; + int jj = j - cells/2; + float a = step * (ii + 0.5) * 1.5; + float b = step * (jj + 0.5) * 1.5; + Color::Lab2XYZ(25000.f, a, b, x, y, z); + Color::xyz2srgb(x, y, z, R, G, B); + cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); + cr->rectangle(width * i / (float)cells, height * j / (float)cells, + width / (float)cells - 1, + height / (float)cells - 1); + cr->fill(); + } + } + cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); + float loa, hia, lob, hib; + loa = .5f * (width + width * low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hia = .5f * (width + width * high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + lob = .5f * (height + height * low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hib = .5f * (height + height * high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + cr->set_line_width(2.); + cr->set_source_rgb(0.6, 0.6, 0.6); + cr->move_to(loa, lob); + cr->line_to(hia, hib); + cr->stroke(); + + cr->set_source_rgb(0.1, 0.1, 0.1); + if (selected_ == LOW) { + cr->arc(loa, lob, 5, 0, 2. * M_PI); + } else { + cr->arc(loa, lob, 3, 0, 2. * M_PI); + } + cr->fill(); + + cr->set_source_rgb(0.9, 0.9, 0.9); + if (selected_ == HIGH) { + cr->arc(hia, hib, 5, 0, 2. * M_PI); + } else { + cr->arc(hia, hib, 3, 0, 2. * M_PI); + } + cr->fill(); + + crf->set_source(cst, 0, 0); + crf->paint(); + + return true; + } + + bool on_button_release_event(GdkEventButton *event) + { + if (selected_ != OFF) { + edited_ = true; + notify_listener(); + } + return true; + } + + bool on_button_press_event(GdkEventButton *event) + { + if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { + switch (selected_) { + case OFF: + low_a_ = low_b_ = high_a_ = high_b_ = 0.f; + break; + case LOW: + low_a_ = low_b_ = 0.f; + break; + case HIGH: + high_a_ = high_b_ = 0.f; + break; + } + edited_ = true; + notify_listener(); + } + return true; + } + + bool on_motion_notify_event(GdkEventMotion *event) + { + int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; + const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); + const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); + const float ma = (2.0 * mouse_x - width) / (float)width; + const float mb = (2.0 * mouse_y - height) / (float)height; + if (event->state & GDK_BUTTON1_MASK) { + if (selected_ == LOW) { + low_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + low_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } else if (selected_ == HIGH) { + high_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } + } else { + selected_ = OFF; + float la = low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float lb = low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float ha = high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float hb = high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + const float thrs = 0.05f; + const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); + const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); + if (distlo < thrs * thrs && distlo < disthi) { + selected_ = LOW; + } else if (disthi < thrs * thrs && disthi <= distlo) { + selected_ = HIGH; + } + } + if (selected_ != OFF) { + grab_focus(); + } + queue_draw(); + return true; + } + + Gtk::SizeRequestMode get_request_mode_vfunc() const + { + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; + } + + void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const + { + minimum_width = 100; + natural_width = 200; + } + + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const + { + minimum_height = natural_height = width; + } +}; + + +} // namespace + + ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { nextbw = 0; @@ -21,6 +269,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR method->append (M("TP_COLORTONING_RGBCURVES")); method->append (M("TP_COLORTONING_SPLITCOCO")); method->append (M("TP_COLORTONING_SPLITLR")); + method->append(M("TP_COLORTONING_LABGRID")); method->set_active (0); method->set_tooltip_text (M("TP_COLORTONING_METHOD_TOOLTIP")); @@ -312,6 +561,14 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR greenhigh->setAdjusterListener (this); bluehigh->setAdjusterListener (this); + //------------------------------------------------------------------------ + // LAB grid + auto m = ProcEventMapper::getInstance(); + EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); + labgridArea = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); + pack_start(*labgridArea, Gtk::PACK_EXPAND_WIDGET, 4); + //------------------------------------------------------------------------ + show_all(); disableListener(); @@ -329,6 +586,13 @@ ColorToning::~ColorToning() delete cl2CurveEditorG; } + +void ColorToning::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + static_cast(labgridArea)->set_listener(tpl); +} + /* void ColorToning::neutralCurves_pressed () { disableListener(); @@ -400,6 +664,8 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) clshape->setUnChanged (!pedited->colorToning.clcurve); cl2shape->setUnChanged (!pedited->colorToning.cl2curve); lumamode->set_inconsistent (!pedited->colorToning.lumamode); + + static_cast(labgridArea)->set_edited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); } redlow->setValue (pp->colorToning.redlow); @@ -431,6 +697,8 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; + static_cast(labgridArea)->set_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + if (pedited && !pedited->colorToning.method) { method->set_active (5); } else if (pp->colorToning.method == "Lab") { @@ -443,6 +711,8 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) method->set_active (3); } else if (pp->colorToning.method == "Splitlr") { method->set_active (4); + } else if (pp->colorToning.method == "LabGrid") { + method->set_active(5); } methodChanged(); @@ -495,6 +765,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.saturatedOpacity = saturatedOpacity->getIntValue(); pp->colorToning.strength = strength->getIntValue(); + static_cast(labgridArea)->get_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + if (pedited) { pedited->colorToning.redlow = redlow->getEditedState (); pedited->colorToning.greenlow = greenlow->getEditedState (); @@ -519,6 +791,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorToning.hlColSat = hlColSat->getEditedState (); pedited->colorToning.shadowsColSat = shadowsColSat->getEditedState (); + + pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = static_cast(labgridArea)->get_edited(); } if (method->get_active_row_number() == 0) { @@ -531,6 +805,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.method = "Splitco"; } else if (method->get_active_row_number() == 4) { pp->colorToning.method = "Splitlr"; + } else if (method->get_active_row_number() == 5) { + pp->colorToning.method = "LabGrid"; } if (twocolor->get_active_row_number() == 0) { @@ -782,6 +1058,8 @@ void ColorToning::methodChanged () { if (!batchMode) { + labgridArea->hide(); + if (method->get_active_row_number() == 0) { // Lab colorSep->show(); colorCurveEditorG->show(); @@ -929,6 +1207,26 @@ void ColorToning::methodChanged () chanMixerBox->hide(); neutrHBox->hide(); lumamode->show(); + } else if (method->get_active_row_number() == 5) { // Lab Grid + colorSep->hide(); + colorCurveEditorG->hide(); + twocolor->hide(); + opacityCurveEditorG->hide(); + clCurveEditorG->hide(); + cl2CurveEditorG->hide(); + hlColSat->hide(); + shadowsColSat->hide(); + balance->hide(); + p1Frame->hide(); + autosat->hide(); + satProtectionThreshold->hide(); + saturatedOpacity->hide(); + strength->hide(); + chanMixerBox->hide(); + neutrHBox->hide(); + lumamode->hide(); + + labgridArea->show(); } } diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 347cfd126..31c1650cf 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -49,6 +49,8 @@ public: void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void setListener(ToolPanelListener *tpl); + private: //Gtk::HSeparator* satLimiterSep; Gtk::HSeparator* colorSep; @@ -101,6 +103,9 @@ private: bool lastLumamode; sigc::connection lumamodeConn; + rtengine::ProcEvent EvColorToningLabGridValue; + Gtk::DrawingArea *labgridArea; + IdleRegister idle_register; }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fc302299c..5355c88da 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -134,6 +134,10 @@ void ParamsEdited::set (bool v) colorToning.greenhigh = v; colorToning.bluehigh = v; colorToning.lumamode = v; + colorToning.labgridALow = v; + colorToning.labgridBLow = v; + colorToning.labgridAHigh = v; + colorToning.labgridBHigh = v; sharpening.enabled = v; sharpening.radius = v; @@ -687,6 +691,10 @@ void ParamsEdited::initFrom (const std::vector colorToning.greenhigh = colorToning.greenhigh && p.colorToning.greenhigh == other.colorToning.greenhigh; colorToning.bluehigh = colorToning.bluehigh && p.colorToning.bluehigh == other.colorToning.bluehigh; colorToning.lumamode = colorToning.lumamode && p.colorToning.lumamode == other.colorToning.lumamode; + colorToning.labgridALow = colorToning.labgridALow && p.colorToning.labgridALow == other.colorToning.labgridALow; + colorToning.labgridBLow = colorToning.labgridBLow && p.colorToning.labgridBLow == other.colorToning.labgridBLow; + colorToning.labgridAHigh = colorToning.labgridAHigh && p.colorToning.labgridAHigh == other.colorToning.labgridAHigh; + colorToning.labgridBHigh = colorToning.labgridBHigh && p.colorToning.labgridBHigh == other.colorToning.labgridBHigh; sharpenEdge.enabled = sharpenEdge.enabled && p.sharpenEdge.enabled == other.sharpenEdge.enabled; sharpenEdge.passes = sharpenEdge.passes && p.sharpenEdge.passes == other.sharpenEdge.passes; sharpenEdge.amount = sharpenEdge.amount && p.sharpenEdge.amount == other.sharpenEdge.amount; @@ -1532,6 +1540,22 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.colorToning.bluehigh = dontforceSet && options.baBehav[ADDSET_COLORTONING_SPLIT] ? toEdit.colorToning.bluehigh + mods.colorToning.bluehigh : mods.colorToning.bluehigh; } + if (colorToning.labgridALow) { + toEdit.colorToning.labgridALow = mods.colorToning.labgridALow; + } + if (colorToning.labgridALow) { + toEdit.colorToning.labgridALow = mods.colorToning.labgridALow; + } + if (colorToning.labgridBLow) { + toEdit.colorToning.labgridBLow = mods.colorToning.labgridBLow; + } + if (colorToning.labgridAHigh) { + toEdit.colorToning.labgridAHigh = mods.colorToning.labgridAHigh; + } + if (colorToning.labgridBHigh) { + toEdit.colorToning.labgridBHigh = mods.colorToning.labgridBHigh; + } + if (sharpenEdge.enabled) { toEdit.sharpenEdge.enabled = mods.sharpenEdge.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5a835bf05..c49b60eaa 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -170,6 +170,11 @@ public: bool satlow; bool sathigh; bool lumamode; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; + bool labgridSaturation; }; class SharpenEdgeParamsEdited From 1006dd1ebf98a3baaa89f35441da8005398838d1 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 8 Jan 2018 13:19:44 +0100 Subject: [PATCH 116/200] removed accidently committed file --- rtengine/curves.h.save-failed | 1142 --------------------------------- 1 file changed, 1142 deletions(-) delete mode 100644 rtengine/curves.h.save-failed diff --git a/rtengine/curves.h.save-failed b/rtengine/curves.h.save-failed deleted file mode 100644 index 47ab0fc6f..000000000 --- a/rtengine/curves.h.save-failed +++ /dev/null @@ -1,1142 +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 . - */ -#ifndef __CURVES_H__ -#define __CURVES_H__ - -#include -#include -#include -#include "rt_math.h" -#include "../rtgui/mycurve.h" -#include "../rtgui/myflatcurve.h" -#include "../rtgui/mydiagonalcurve.h" -#include "color.h" -#include "procparams.h" -#include "pipettebuffer.h" - -#include "LUT.h" - -#define CURVES_MIN_POLY_POINTS 1000 - -#include "rt_math.h" - -#define CLIPI(a) ((a)>0?((a)<65534?(a):65534):0) - -using namespace std; - -namespace rtengine -{ -class ToneCurve; -class ColorAppearance; - -class CurveFactory -{ - - friend class Curve; - -protected: - - // functions calculating the parameters of the contrast curve based on the desired slope at the center - static double solve_upper (double m, double c, double deriv); - static double solve_lower (double m, double c, double deriv); - static double dupper (const double b, const double m, const double c); - static double dlower (const double b, const double m, const double c); - - // basic convex function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point - static inline double basel (double x, double m1, double m2) - { - if (x == 0.0) { - return 0.0; - } - - double k = sqrt ((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2); - double l = (m1 - m2) / (1.0 - m2) + k; - double lx = xlog(x); - return m2 * x + (1.0 - m2) * (2.0 - xexp(k * lx)) * xexp(l * lx); - } - // basic concave function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point - static inline double baseu (double x, double m1, double m2) - { - return 1.0 - basel(1.0 - x, m1, m2); - } - // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery - static inline double cupper (double x, double m, double hr) - { - if (hr > 1.0) { - return baseu (x, m, 2.0 * (hr - 1.0) / m); - } - - double x1 = (1.0 - hr) / m; - double x2 = x1 + hr; - - if (x >= x2) { - return 1.0; - } - - if (x < x1) { - return x * m; - } - - return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0); - } - // concave curve between (0,0) and (1,1) with slope m at (1,1). sr controls the shadow recovery - static inline double clower (double x, double m, double sr) - { - return 1.0 - cupper(1.0 - x, m, sr); - } - // convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery - static inline double cupper2 (double x, double m, double hr) - { - double x1 = (1.0 - hr) / m; - double x2 = x1 + hr; - - if (x >= x2) { - return 1.0; - } - - if (x < x1) { - return x * m; - } - - return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0.3 * hr); - } - static inline double clower2 (double x, double m, double sr) - { - //curve for b<0; starts with positive slope and then rolls over toward straight line to x=y=1 - double x1 = sr / 1.5 + 0.00001; - - if (x > x1 || sr < 0.001) { - return 1 - (1 - x) * m; - } else { - double y1 = 1 - (1 - x1) * m; - return y1 + m * (x - x1) - (1 - m) * SQR(SQR(1 - x / x1)); - } - } - // tone curve base. a: slope (from exp.comp.), b: black point normalized by 65535, - // D: max. x value (can be>1), hr,sr: highlight,shadow recovery - static inline double basecurve (double x, double a, double b, double D, double hr, double sr) - { - 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 - - if (x > m) { - return y + (x - m) * slope; //value on straight line between (m,y) and (1,1) - } else { - return y * clower2(x / m, slope * m / y, 2.0 - sr); - } - } else { - double slope = a / (1.0 - b); - double m = a * D > 1.0 ? b / a + (0.25) / slope : b + (1 - b) / 4; - double y = a * D > 1.0 ? 0.25 : (m - b / a) * slope; - - if (x <= m) { - return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y; - } else if (a * D > 1.0) { - return y + (1.0 - y) * cupper2((x - m) / (D - m), slope * (D - m) / (1.0 - y), hr); - } else { - return y + (x - m) * slope; - } - } - } - static inline double simplebasecurve (double x, double b, double sr) - { - // a = 1, D = 1, hr = 0 (unused for a = D = 1) - 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 - - if (x > m) { - return y + (x - m) * slope; //value on straight line between (m,y) and (1,1) - } else { - return y * clower2(x / m, slope * m / y, 2.0 - sr); - } - } else { - double slope = 1.0 / (1.0 - b); - double m = b + (1 - b) * 0.25; - double y = (m - b) * slope; - - if (x <= m) { - return clower (x / m, slope * m / y, sr) * y; - } else { - return y + (x - m) * slope; - } - } - } - - -public: - const static double sRGBGamma; // standard average gamma - const static double sRGBGammaCurve; // 2.4 in the curve - - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // accurately determine value from integer array with float as index - //linearly interpolate from ends of range if arg is out of bounds - static inline float interp(int *array, float f) - { - int index = CLIPI(floor(f)); - float part = (float)((f) - index) * (float)(array[index + 1] - array[index]); - return (float)array[index] + part; - } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // accurately determine value from float array with float as index - //linearly interpolate from ends of range if arg is out of bounds - static inline float flinterp(float *array, float f) - { - int index = CLIPI(floor(f)); - float part = ((f) - (float)index) * (array[index + 1] - array[index]); - return array[index] + part; - } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - static inline double centercontrast (double x, double b, double m); - - // standard srgb gamma and its inverse - static inline double gamma2 (double x) - { - return x <= 0.00304 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; - } - static inline double igamma2 (double x) - { - return x <= 0.03928 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); - } - static inline float gamma2 (float x) - { - return x <= 0.00304 ? x * 12.92 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; - } - static inline float igamma2 (float x) - { - return x <= 0.03928 ? x / 12.92 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); - } - // gamma function with adjustable parameters - static inline double gamma (double x, double gamma, double start, double slope, double mul, double add) - { - return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add); - } - 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) ); - } - static inline float gamma (float x, float gamma, float start, float slope, float mul, float 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 : xexpf(xlogf((x + add) / mul) * gamma) ); - } -#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) - { - if (comp > 0.0) { - float val = level + (hlrange - 65536.0); - - if(val == 0.0f) { // to avoid division by zero - val = 0.000001f; - } - - float Y = val * exp_scale / hlrange; - Y *= comp; - - if(Y <= -1.0) { // to avoid log(<=0) - Y = -.999999f; - } - - float R = hlrange / (val * comp); - return log1p(Y) * R; - } else { - return exp_scale; - } - } - -public: - static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, - const std::vector& curvePoints, const std::vector& curvePoints2, - 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, - ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, 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); - static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram); - - static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip); - - 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, - 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); - - static void curveLightBrightColor ( - 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, - int skip = 1); - static void RGBCurve (const std::vector& curvePoints, LUTf & outCurve, int skip); - -}; - -class Curve -{ - - class HashEntry - { - public: - unsigned short smallerValue; - unsigned short higherValue; - }; -protected: - int N; - int ppn; // targeted polyline point number - double* x; - double* y; - // begin of variables used in Parametric curves only - double mc; - double mfc; - double msc; - double mhc; - // 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] - - double* ypp; - - // Fields for the elementary curve polygonisation - double x1, y1, x2, y2, x3, y3; - bool firstPointIncluded; - double increment; - int nbr_points; - - static inline double p00 (double x, double prot) - { - return CurveFactory::clower (x, 2.0, prot); - } - static inline double p11 (double x, double prot) - { - return CurveFactory::cupper (x, 2.0, prot); - } - static inline double p01 (double x, double prot) - { - 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) * 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) - { - return (1 - sh) * (1 - hl) * p00(x, prot) + sh * hl * p11(x, prot) + (1 - sh) * hl * p01(x, prot) + sh * (1 - hl) * p10(x, prot); - } - - void fillHash(); - void fillDyByDx(); - -public: - Curve (); - virtual ~Curve () {}; - void AddPolygons (); - int getSize () const; // return the number of control points - void getControlPoint(int cpNum, double &x, double &y) const; - virtual double getVal (double t) const = 0; - virtual void getVal (const std::vector& t, std::vector& res) const = 0; - - virtual bool isIdentity () const = 0; -}; - -class DiagonalCurve : public Curve -{ - -protected: - DiagonalCurveType kind; - - void spline_cubic_set (); - void NURBS_set (); - -public: - DiagonalCurve (const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS); - virtual ~DiagonalCurve (); - - double getVal (double t) const; - void getVal (const std::vector& t, std::vector& res) const; - bool isIdentity () const - { - return kind == DCT_Empty; - }; -}; - -class FlatCurve : public Curve -{ - -private: - FlatCurveType kind; - double* leftTangent; - double* rightTangent; - double identityValue; - bool periodic; - - void CtrlPoints_set (); - -public: - - FlatCurve (const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS); - virtual ~FlatCurve (); - - double getVal (double t) const; - void getVal (const std::vector& t, std::vector& res) const; - bool setIdentityValue (double iVal); - bool isIdentity () const - { - return kind == FCT_Empty; - }; -}; - -class RetinextransmissionCurve -{ -private: - LUTf luttransmission; // 0xffff range - void Set(const Curve &pCurve); - -public: - virtual ~RetinextransmissionCurve() {}; - RetinextransmissionCurve(); - - void Reset(); - void Set(const Curve *pCurve); - void Set(const std::vector &curvePoints); - float operator[](float index) const - { - return luttransmission[index]; - } - - operator bool (void) const - { - return luttransmission; - } -}; - -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 -{ -public: - LUTf lutToneCurve; // 0xffff range - - virtual ~ToneCurve() {}; - - void Reset(); - void Set(const Curve &pCurve, float gamma = 0); - operator bool (void) const - { - return lutToneCurve; - } -}; - -class OpacityCurve -{ -public: - LUTf lutOpacityCurve; // 0xffff range - - virtual ~OpacityCurve() {}; - - void Reset(); - void Set(const Curve *pCurve); - void Set(const std::vector &curvePoints, bool &opautili); - - // TODO: transfer this method to the Color class... - float blend (float x, float lower, float upper) const - { - return (upper - lower) * lutOpacityCurve[x * 500.f] + lower; - } - void blend3f (float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const - { - float opacity = lutOpacityCurve[x * 500.f]; - result1 = (upper1 - lower1) * opacity + lower1; - result2 = (upper2 - lower2) * opacity + lower2; - result3 = (upper3 - lower3) * opacity + lower3; - } - - operator bool (void) const - { - return lutOpacityCurve; - } -}; - -class WavCurve -{ -private: - LUTf lutWavCurve; // 0xffff range - void Set(const Curve &pCurve); - -public: - float sum; - - virtual ~WavCurve() {}; - WavCurve(); - void Reset(); - void Set(const std::vector &curvePoints); - float getSum() const - { - return sum; - } - - float operator[](float index) const - { - return lutWavCurve[index]; - } - operator bool (void) const - { - return lutWavCurve; - } -}; - -class WavOpacityCurveRG -{ -private: - LUTf lutOpacityCurveRG; // 0xffff range - void Set(const Curve &pCurve); -public: - virtual ~WavOpacityCurveRG() {}; - WavOpacityCurveRG(); - - void Reset(); - // void Set(const std::vector &curvePoints, bool &opautili); - void Set(const std::vector &curvePoints); - float operator[](float index) const - { - return lutOpacityCurveRG[index]; - } - - operator bool (void) const - { - return lutOpacityCurveRG; - } -}; -class WavOpacityCurveBY -{ -private: - LUTf lutOpacityCurveBY; // 0xffff range - void Set(const Curve &pCurve); - -public: - virtual ~WavOpacityCurveBY() {}; - WavOpacityCurveBY(); - - void Reset(); - void Set(const Curve *pCurve); - void Set(const std::vector &curvePoints); - float operator[](float index) const - { - return lutOpacityCurveBY[index]; - } - - operator bool (void) const - { - return lutOpacityCurveBY; - } -}; -class WavOpacityCurveW -{ -private: - LUTf lutOpacityCurveW; // 0xffff range - void Set(const Curve &pCurve); - -public: - virtual ~WavOpacityCurveW() {}; - WavOpacityCurveW(); - - void Reset(); - void Set(const Curve *pCurve); - void Set(const std::vector &curvePoints); - float operator[](float index) const - { - return lutOpacityCurveW[index]; - } - - operator bool (void) const - { - return lutOpacityCurveW; - } -}; - -class WavOpacityCurveWL -{ -private: - LUTf lutOpacityCurveWL; // 0xffff range - void Set(const Curve &pCurve); - -public: - virtual ~WavOpacityCurveWL() {}; - WavOpacityCurveWL(); - - void Reset(); - void Set(const Curve *pCurve); - void Set(const std::vector &curvePoints); - float operator[](float index) const - { - return lutOpacityCurveWL[index]; - } - - operator bool (void) const - { - return lutOpacityCurveWL; - } -}; - -class NoiseCurve -{ -private: - LUTf lutNoiseCurve; // 0xffff range - float sum; - void Set(const Curve &pCurve); - -public: - virtual ~NoiseCurve() {}; - NoiseCurve(); - void Reset(); - void Set(const std::vector &curvePoints); - - float getSum() const - { - return sum; - } - float operator[](float index) const - { - return lutNoiseCurve[index]; - } - operator bool (void) const - { - return lutNoiseCurve; - } -}; - -class ColorGradientCurve -{ -public: - LUTf lut1; // [0.;1.] range (float values) - LUTf lut2; // [0.;1.] range (float values) - LUTf lut3; // [0.;1.] range (float values) - double low; - double high; - - virtual ~ColorGradientCurve() {}; - - void Reset(); - void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin); - void SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin); - void SetRGB(const Curve *pCurve); - void SetRGB(const std::vector &curvePoints); - - /** - * @brief Get the value of Red, Green and Blue corresponding to the requested index - * @param index value in the [0 ; 1] range - * @param r corresponding red value [0 ; 65535] (return value) - * @param g corresponding green value [0 ; 65535] (return value) - * @param b corresponding blue value [0 ; 65535] (return value) - */ - void getVal(float index, float &r, float &g, float &b) const; - operator bool (void) const - { - return lut1 && lut2 && lut3; - } -}; - -class ColorAppearance -{ -public: - LUTf lutColCurve; // 0xffff range - - virtual ~ColorAppearance() {}; - - void Reset(); - void Set(const Curve &pCurve); - operator bool (void) const - { - return lutColCurve; - } -}; - -class Lightcurve : public ColorAppearance -{ -public: - void Apply(float& Li) const; -}; - -//lightness curve -inline void Lightcurve::Apply (float& Li) const -{ - - assert (lutColCurve); - - Li = lutColCurve[Li]; -} - -class Brightcurve : public ColorAppearance -{ -public: - void Apply(float& Br) const; -}; - -//brightness curve -inline void Brightcurve::Apply (float& Br) const -{ - - assert (lutColCurve); - - Br = lutColCurve[Br]; -} - -class Chromacurve : public ColorAppearance -{ -public: - void Apply(float& Cr) const; -}; - -//Chroma curve -inline void Chromacurve::Apply (float& Cr) const -{ - - assert (lutColCurve); - - Cr = lutColCurve[Cr]; -} -class Saturcurve : public ColorAppearance -{ -public: - void Apply(float& Sa) const; -}; - -//Saturation curve -inline void Saturcurve::Apply (float& Sa) const -{ - - assert (lutColCurve); - - Sa = lutColCurve[Sa]; -} - -class Colorfcurve : public ColorAppearance -{ -public: - void Apply(float& Cf) const; -}; - -//Colorfullness curve -inline void Colorfcurve::Apply (float& Cf) const -{ - - assert (lutColCurve); - - Cf = lutColCurve[Cf]; -} - - -class StandardToneCurve : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; - - // Applies the tone curve to `r`, `g`, `b` arrays, starting at `r[start]` - // and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE - // and requires that `r`, `g`, and `b` pointers have the same alignment. - void BatchApply( - const size_t start, const size_t end, - float *r, float *g, float *b) const; -}; - -class AdobeToneCurve : public ToneCurve -{ -private: - void RGBTone(float& r, float& g, float& b) const; // helper for tone curve - -public: - void Apply(float& r, float& g, float& b) const; -}; - -class SatAndValueBlendingToneCurve : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; -}; - -class WeightedStdToneCurve : public ToneCurve -{ -private: - float Triangle(float refX, float refY, float X2) const; -#if defined( __SSE2__ ) && defined( __x86_64__ ) - vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; -#endif -public: - void Apply(float& r, float& g, float& b) const; - void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const; -}; - -class LuminanceToneCurve : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; -}; - -class PerceptualToneCurveState -{ -public: - float Working2Prophoto[3][3]; - float Prophoto2Working[3][3]; - float cmul_contrast; - bool isProphoto; -}; - -// Tone curve whose purpose is to keep the color appearance constant, that is the curve changes contrast -// but colors appears to have the same hue and saturation as before. As contrast and saturation is tightly -// coupled in human vision saturation is modulated based on the curve's contrast, and that way the appearance -// can be kept perceptually constant (within limits). -class PerceptualToneCurve : public ToneCurve -{ -private: - static float cf_range[2]; - static float cf[1000]; - // for ciecam02 - static float f, c, nc, yb, la, xw, yw, zw, gamut; - static float n, d, nbb, ncb, cz, aw, wh, pfl, fl, pow1; - - static void cubic_spline(const float x[], const float y[], const int len, const float out_x[], float out_y[], const int out_len); - static float find_minimum_interval_halving(float (*func)(float x, void *arg), void *arg, float a, float b, float tol, int nmax); - static float find_tc_slope_fun(float k, void *arg); - static float get_curve_val(float x, float range[2], float lut[], size_t lut_size); - float calculateToneCurveContrastValue() const; -public: - static void init(); - void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; - void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b, const PerceptualToneCurveState &state) const; -}; - -// Standard tone curve -inline void StandardToneCurve::Apply (float& r, float& g, float& b) const -{ - - assert (lutToneCurve); - - r = lutToneCurve[r]; - g = lutToneCurve[g]; - b = lutToneCurve[b]; -} - -inline void StandardToneCurve::BatchApply( - const size_t start, const size_t end, - float *r, float *g, float *b) const { - assert (lutToneCurve); - assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); - assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); - - // All pointers must have the same alignment for SSE usage. In the loop body below, - // we will only check `r`, assuming that the same result would hold for `g` and `b`. - assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); - assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); - - size_t i = start; - while (true) { - if (i >= end) { - // If we get to the end before getting to an aligned address, just return. - // (Or, for non-SSE mode, if we get to the end.) - return; -#if defined( __SSE2__ ) && defined( __x86_64__ ) - } else if (reinterpret_cast(&r[i]) % 16 == 0) { - // Otherwise, we get to the first aligned address; go to the SSE part. - break; -#endif - } - r[i] = lutToneCurve[r[i]]; - g[i] = lutToneCurve[g[i]]; - b[i] = lutToneCurve[b[i]]; - i++; - } - -#if defined( __SSE2__ ) && defined( __x86_64__ ) - for (; i + 3 < end; i += 4) { - __m128 r_val = LVF(r[i]); - __m128 g_val = LVF(g[i]); - __m128 b_val = LVF(b[i]); - STVF(r[i], lutToneCurve[r_val]); - STVF(g[i], lutToneCurve[g_val]); - STVF(b[i], lutToneCurve[b_val]); - } - - // Remainder in non-SSE. - for (; i < end; ++i) { - r[i] = lutToneCurve[r[i]]; - g[i] = lutToneCurve[g[i]]; - b[i] = lutToneCurve[b[i]]; - } -#endif -} - -// Tone curve according to Adobe's reference implementation -// values in 0xffff space -// inlined to make sure there will be no cache flush when used -inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const -{ - - assert (lutToneCurve); - - if (r >= g) { - if (g > b) { - RGBTone (r, g, b); // Case 1: r >= g > b - } else if (b > r) { - RGBTone (b, r, g); // Case 2: b > r >= g - } else if (b > g) { - RGBTone (r, b, g); // Case 3: r >= b > g - } else { // Case 4: r >= g == b - r = lutToneCurve[r]; - g = lutToneCurve[g]; - b = g; - } - } else { - if (r >= b) { - RGBTone (g, r, b); // Case 5: g > r >= b - } else if (b > g) { - RGBTone (b, g, r); // Case 6: b > g > r - } else { - RGBTone (g, b, r); // Case 7: g >= b > r - } - } -} - -inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const -{ - float rold = r, gold = g, bold = b; - - r = lutToneCurve[rold]; - b = lutToneCurve[bold]; - g = b + ((r - b) * (gold - bold) / (rold - bold)); -} - -// Modifying the Luminance channel only -inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const -{ - assert (lutToneCurve); - - float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f; - const float newLuminance = lutToneCurve[currLuminance]; - currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance; - const float coef = newLuminance / currLuminance; - r = LIM(r * coef, 0.f, 65535.f); - g = LIM(g * coef, 0.f, 65535.f); - b = LIM(b * coef, 0.f, 65535.f); -} - -inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const -{ - if (a != b) { - float b1; - float a2 = a1 - a; - - if (b < a) { - b1 = b + a2 * b / a ; - } else { - b1 = b + a2 * (65535.f - b) / (65535.f - a); - } - - return b1; - } - - return a1; -} - -#if defined( __SSE2__ ) && defined( __x86_64__ ) -inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const -{ - vfloat a2 = a1 - a; - vmask cmask = vmaskf_lt(b, a); - vfloat b3 = vself(cmask, b, F2V(65535.f) - b); - vfloat a3 = vself(cmask, a, F2V(65535.f) - a); - return b + a2 * b3 / a3; -} -#endif - -// Tone curve modifying the value channel only, preserving hue and saturation -// values in 0xffff space -inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const -{ - - assert (lutToneCurve); - - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); - float r1 = lutToneCurve[r]; - float g1 = Triangle(r, r1, g); - float b1 = Triangle(r, r1, b); - - float g2 = lutToneCurve[g]; - float r2 = Triangle(g, g2, r); - float b2 = Triangle(g, g2, b); - - float b3 = lutToneCurve[b]; - float r3 = Triangle(b, b3, r); - float g3 = Triangle(b, b3, g); - - r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); - g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); - b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); -} - -inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { - assert (lutToneCurve); - assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); - assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); - - // All pointers must have the same alignment for SSE usage. In the loop body below, - // we will only check `r`, assuming that the same result would hold for `g` and `b`. - assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); - assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); - - size_t i = start; - while (true) { - if (i >= end) { - // If we get to the end before getting to an aligned address, just return. - // (Or, for non-SSE mode, if we get to the end.) - return; -#if defined( __SSE2__ ) && defined( __x86_64__ ) - } else if (reinterpret_cast(&r[i]) % 16 == 0) { - // Otherwise, we get to the first aligned address; go to the SSE part. - break; -#endif - } - Apply(r[i], g[i], b[i]); - i++; - } - -#if defined( __SSE2__ ) && defined( __x86_64__ ) - const vfloat c65535v = F2V(65535.f); - const vfloat zd5v = F2V(0.5f); - const vfloat zd25v = F2V(0.25f); - - for (; i + 3 < end; i += 4) { - vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); - vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); - vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); - vfloat r1 = lutToneCurve[r_val]; - vfloat g1 = Triangle(r_val, r1, g_val); - vfloat b1 = Triangle(r_val, r1, b_val); - - vfloat g2 = lutToneCurve[g_val]; - vfloat r2 = Triangle(g_val, g2, r_val); - vfloat b2 = Triangle(g_val, g2, b_val); - - vfloat b3 = lutToneCurve[b_val]; - vfloat r3 = Triangle(b_val, b3, r_val); - vfloat g3 = Triangle(b_val, b3, g_val); - - STVF(r[i], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); - STVF(g[i], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); - STVF(b[i], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); - } - - // Remainder in non-SSE. - for (; i < end; ++i) { - Apply(r[i], g[i], b[i]); - } -#endif -} - -// Tone curve modifying the value channel only, preserving hue and saturation -// values in 0xffff space -inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const -{ - - assert (lutToneCurve); - - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); - - const float lum = (r + g + b) / 3.f; - const float newLum = lutToneCurve[lum]; - - float h, s, v; - Color::rgb2hsvtc(r, g, b, h, s, v); - - float dV; - if (newLum >= lum) { - // Linearly targeting Value = 1 and Saturation = 0 - const float coef = (newLum - lum) / (65535.f - lum); - dV = (1.f - v) * coef; - s *= 1.f - coef; - } else { - // Linearly targeting Value = 0 - const float coef = (newLum - lum) / lum ; - dV = v * coef; - } - Color::hsv2rgbdcp(h, s, v + dV, r, g, b); -} - -} - -#undef CLIPI - -#endif From 7353ff864b4401da944deca93d41a92bc4c0cf40 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 8 Jan 2018 14:34:54 +0100 Subject: [PATCH 117/200] some tweaks to the L*a*b* correction grid module --- rtengine/improcfun.cc | 2 +- rtengine/procparams.cc | 2 ++ rtengine/procparams.h | 2 +- rtgui/colortoning.cc | 10 ++++------ rtgui/paramsedited.h | 1 - 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 42cbb6f20..052f13d08 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -7199,7 +7199,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, */ void ImProcFunctions::colorToningLabGrid(LabImage *lab) { - const float factor = ColorToningParams::LABGRID_CORR_MAX * 1.6f; + const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor; float a_base = params->colorToning.labgridALow; float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 336f32379..4b8ccf71a 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -618,6 +618,8 @@ bool LocalContrastParams::operator!=(const LocalContrastParams &other) const } +const double ColorToningParams::LABGRID_CORR_MAX = 12000.f; + ColorToningParams::ColorToningParams() : enabled(false), autosat(true), diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7aed263ea..7cc80b313 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -452,7 +452,7 @@ struct ColorToningParams { double labgridBLow; double labgridAHigh; double labgridBHigh; - static constexpr double LABGRID_CORR_MAX = 8000.f; + static const double LABGRID_CORR_MAX; ColorToningParams(); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 38e0630d4..9a50c0730 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -119,19 +119,17 @@ public: const int cells = 8; float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); for (int j = 0; j < cells; j++) { - for(int i = 0; i < cells; i++) { + for (int i = 0; i < cells; i++) { float R, G, B; float x, y, z; int ii = i - cells/2; int jj = j - cells/2; - float a = step * (ii + 0.5) * 1.5; - float b = step * (jj + 0.5) * 1.5; + float a = step * (ii + 0.5); + float b = step * (jj + 0.5); Color::Lab2XYZ(25000.f, a, b, x, y, z); Color::xyz2srgb(x, y, z, R, G, B); cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); - cr->rectangle(width * i / (float)cells, height * j / (float)cells, - width / (float)cells - 1, - height / (float)cells - 1); + cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); cr->fill(); } } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index c49b60eaa..6de5d52e4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -174,7 +174,6 @@ public: bool labgridBLow; bool labgridAHigh; bool labgridBHigh; - bool labgridSaturation; }; class SharpenEdgeParamsEdited From 7f89c362d0dc5264df9452ba6ccb12f601ced79e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 8 Jan 2018 14:54:55 +0100 Subject: [PATCH 118/200] HDR tone mapping: normalize luminance relative to the brightest point in the input (Also tweaked the default value for the "amount" slider) Fixes #4255 --- rtengine/procparams.cc | 2 +- rtengine/tmo_fattal02.cc | 13 +++++++++++-- rtgui/fattaltonemap.cc | 5 +---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 8fbab7a8d..a8178dde5 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1468,7 +1468,7 @@ bool EPDParams::operator !=(const EPDParams& other) const FattalToneMappingParams::FattalToneMappingParams() : enabled(false), threshold(0), - amount(1) + amount(30) { } diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 645451905..1e3669882 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1121,13 +1121,20 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float min_luminance = 1.f; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + float max_Y = 0.f; + int max_x = 0, max_y = 0; + #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif - for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels + if (Yr(x, y) > max_Y) { + max_Y = Yr(x, y); + max_x = x; + max_y = y; + } } } @@ -1170,6 +1177,8 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); + + const float scale = std::max(L(max_x * wr + 1, max_y * hr + 1), epsilon) * (65535.f / Yr(max_x, max_y)); #ifdef _OPENMP #pragma omp parallel for if(multiThread) @@ -1181,7 +1190,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) int xx = x * wr + 1; float Y = Yr (x, y); - float l = std::max (L (xx, yy), epsilon) * (65535.f / Y); + float l = std::max (L (xx, yy), epsilon) * (65535.f / Y) / scale; rgb->r (y, x) = std::max (rgb->r (y, x), 0.f) * l; rgb->g (y, x) = std::max (rgb->g (y, x), 0.f) * l; rgb->b (y, x) = std::max (rgb->b (y, x), 0.f) * l; diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 10dba51cf..a6f4c5190 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -26,10 +26,7 @@ using namespace rtengine::procparams; FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_TM_FATTAL_LABEL"), true, true) { - -// setEnabledTooltipMarkup(M("TP_EPD_TOOLTIP")); - - amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 0.0)); + amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 30., 0.0)); threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 100., 1., 0.0)); amount->setAdjusterListener(this); From 6c6786929c4e5f5d6131962a63c1041879d3a60a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 8 Jan 2018 15:21:56 +0100 Subject: [PATCH 119/200] Fixe race in tmo_fattal, #4255 --- rtengine/tmo_fattal02.cc | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 1e3669882..ebb70f25f 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1125,18 +1125,33 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) int max_x = 0, max_y = 0; #ifdef _OPENMP - #pragma omp parallel for if (multiThread) + #pragma omp parallel if (multiThread) +#endif +{ + float max_YThr = 0.f; + int max_xThr = 0, max_yThr = 0; +#ifdef _OPENMP + #pragma omp for #endif for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels - if (Yr(x, y) > max_Y) { - max_Y = Yr(x, y); - max_x = x; - max_y = y; + if (Yr(x, y) > max_YThr) { + max_YThr = Yr(x, y); + max_xThr = x; + max_yThr = y; } } } +#ifdef _OPENMP +#pragma omp critical +#endif + if (max_YThr > max_Y) { + max_Y = max_YThr; + max_x = max_xThr; + max_y = max_yThr; + } +} // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() From 529a7f3003232c216c350a19215a8681d132aafc Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 8 Jan 2018 15:27:41 +0100 Subject: [PATCH 120/200] tmo_fattal02.cc added nowait, #4255 --- rtengine/tmo_fattal02.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index ebb70f25f..efa9c53d7 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1131,7 +1131,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) float max_YThr = 0.f; int max_xThr = 0, max_yThr = 0; #ifdef _OPENMP - #pragma omp for + #pragma omp for nowait #endif for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { From 5104368c4a9af7b2a212d112b9c73f6fa346ca90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 8 Jan 2018 17:51:31 +0100 Subject: [PATCH 121/200] Fix non-SSE2 build (fixes #4284) --- rtengine/improcfun.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 7e8e153b1..61b1809e0 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2170,7 +2170,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f ); float nj, nbbj, ncbj, czj, awj, flj; Ciecam02::initcam2float (gamu, yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); +#ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); +#endif const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f ); const float epsil = 0.0001f; @@ -2735,7 +2737,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, J, C, h, xw2, yw2, zw2, - f2, c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x, y, z; x = xx * 655.35f; y = yy * 655.35f; @@ -2746,10 +2748,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw // gamut control in Lab mode; I must study how to do with cIECAM only if (gamu == 1) { - float HH, Lprov1, Chprov1; + float Lprov1, Chprov1; Lprov1 = Ll / 327.68f; Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; - HH = xatan2f (bb, aa); float2 sincosval; if (Chprov1 == 0.0f) { @@ -3079,7 +3080,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], xw2, yw2, zw2, - f2, c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x = (float)xx * 655.35f; float y = (float)yy * 655.35f; float z = (float)zz * 655.35f; From 31ec1f4082e1962b76328662b638ac5027fa3980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 8 Jan 2018 17:53:52 +0100 Subject: [PATCH 122/200] Upstream OBS compile fix by @mbajor --- rtengine/alignedbuffer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index 560f0884f..27a376c57 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -18,6 +18,8 @@ */ #ifndef _ALIGNEDBUFFER_ #define _ALIGNEDBUFFER_ + +#include #include #include From 3755f5c18e782498e84dc9148defa3236fe0c1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 8 Jan 2018 17:57:21 +0100 Subject: [PATCH 123/200] Fix i586 build by @heckflosse (#4284) --- rtengine/color.cc | 4 ++-- rtengine/improcfun.cc | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index dbabb217b..706d0f36d 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -1786,7 +1786,7 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat & void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width) { -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) vfloat maxvalfv = F2V(MAXVALF); vfloat c116v = F2V(116.f); vfloat c5242d88v = F2V(5242.88f); @@ -1794,7 +1794,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, vfloat c200v = F2V(200.f); #endif int i = 0; -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) for(;i < width - 3; i+=4) { const vfloat rv = LVFU(R[i]); const vfloat gv = LVFU(G[i]); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 61b1809e0..569ba42f1 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -54,7 +54,7 @@ using namespace rtengine; // begin of helper function for rgbProc() void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) vfloat cr = F2V(0.299f); vfloat cg = F2V(0.587f); vfloat cb = F2V(0.114f); @@ -62,7 +62,7 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) for (; j < tW - 3; j+=4, tj+=4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); @@ -95,14 +95,14 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, float exp_scale, float comp, float hlrange) { -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) vfloat threev = F2V(3.f); vfloat maxvalfv = F2V(MAXVALF); #endif for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) for (; j < tW - 3; j+=4, tj+=4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); @@ -159,7 +159,7 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, // this is a hack to avoid the blue=>black bug (Issue 2141) for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) for (; j < tW - 3; j+=4, tj+=4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); vfloat gv = LVF(gtemp[ti * tileSize + tj]); @@ -3763,7 +3763,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } else { for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; -#ifdef __SSE2__ +#if defined( __SSE2__ ) && defined( __x86_64__ ) for (; j < tW - 3; j+=4, tj+=4) { //brightness/contrast STVF(rtemp[ti * TS + tj], tonecurve(LVF(rtemp[ti * TS + tj]))); From e58cecbf0653491edb6f9a5e364c7cb76b6fd2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 8 Jan 2018 18:17:12 +0100 Subject: [PATCH 124/200] Try to fix most warnings in the OBS builds (#4284) --- rtengine/cJSON.c | 57 ++++++++++++++++++++++++++------------------- rtengine/dcraw.cc | 2 +- rtgui/batchqueue.cc | 2 +- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/rtengine/cJSON.c b/rtengine/cJSON.c index 8e9cdcccf..263a45113 100644 --- a/rtengine/cJSON.c +++ b/rtengine/cJSON.c @@ -38,7 +38,8 @@ const char *cJSON_GetErrorPtr(void) {return ep;} static int cJSON_strcasecmp(const char *s1,const char *s2) { - if (!s1) return (s1==s2)?0:1;if (!s2) return 1; + if (!s1) return (s1==s2)?0:1; + if (!s2) return 1; for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0; return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); } @@ -107,7 +108,7 @@ static const char *parse_number(cJSON *item,const char *num) } n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ - + item->valuedouble=n; item->valueint=(int)n; item->type=cJSON_Number; @@ -156,12 +157,12 @@ static const char *parse_string(cJSON *item,const char *str) { const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; if (*str!='\"') {ep=str;return 0;} /* not a string! */ - + while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ - + out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ if (!out) return 0; - + ptr=str+1;ptr2=out; while (*ptr!='\"' && *ptr) { @@ -190,7 +191,7 @@ static const char *parse_string(cJSON *item,const char *str) } len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; - + #if defined( __GNUC__ ) && __GNUC__ >= 7// silence warning #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -224,10 +225,10 @@ static const char *parse_string(cJSON *item,const char *str) static char *print_string_ptr(const char *str) { const char *ptr;char *ptr2,*out;int len=0;unsigned char token; - + if (!str) return cJSON_strdup(""); ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} - + out=(char*)cJSON_malloc(len+3); if (!out) return 0; @@ -360,7 +361,7 @@ static char *print_array(cJSON *item,int depth,int fmt) char *out=0,*ptr,*ret;int len=5; cJSON *child=item->child; int numentries=0,i=0,fail=0; - + /* How many entries in the array? */ while (child) numentries++,child=child->next; /* Explicitly handle numentries==0 */ @@ -383,7 +384,7 @@ static char *print_array(cJSON *item,int depth,int fmt) if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; child=child->next; } - + /* If we didn't fail, try to malloc the output string */ if (!fail) out=(char*)cJSON_malloc(len); /* If that fails, we fail. */ @@ -396,7 +397,7 @@ static char *print_array(cJSON *item,int depth,int fmt) cJSON_free(entries); return 0; } - + /* Compose the output array. */ *out='['; ptr=out+1;*ptr=0; @@ -408,7 +409,7 @@ static char *print_array(cJSON *item,int depth,int fmt) } cJSON_free(entries); *ptr++=']';*ptr++=0; - return out; + return out; } /* Build an object from the text. */ @@ -416,11 +417,11 @@ static const char *parse_object(cJSON *item,const char *value) { cJSON *child; if (*value!='{') {ep=value;return 0;} /* not an object! */ - + item->type=cJSON_Object; value=skip(value+1); if (*value=='}') return value+1; /* empty array. */ - + item->child=child=cJSON_New_Item(); if (!item->child) return 0; value=skip(parse_string(child,skip(value))); @@ -429,7 +430,7 @@ static const char *parse_object(cJSON *item,const char *value) if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; - + while (*value==',') { cJSON *new_item; @@ -442,7 +443,7 @@ static const char *parse_object(cJSON *item,const char *value) value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; } - + if (*value=='}') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } @@ -483,7 +484,7 @@ static char *print_object(cJSON *item,int depth,int fmt) if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; child=child->next; } - + /* Try to allocate the output string */ if (!fail) out=(char*)cJSON_malloc(len); if (!out) fail=1; @@ -495,7 +496,7 @@ static char *print_object(cJSON *item,int depth,int fmt) cJSON_free(names);cJSON_free(entries); return 0; } - + /* Compose the output: */ *out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0; for (i=0;ichild;while (c && which>0) c=c->next,which--;if (!c) return 0; - if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} +cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) { + cJSON *c=array->child; + while (c && which>0) c=c->next,which--; + if (!c) return 0; + if (c->prev) c->prev->next=c->next; + if (c->next) c->next->prev=c->prev; + if (c==array->child) array->child=c->next;c->prev=c->next=0; + return c; +} void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} @@ -602,4 +611,4 @@ void cJSON_Minify(char *json) else *into++=*json++; // All other characters. } *into=0; // and null-terminate. -} \ No newline at end of file +} diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 75891c589..eee4f34c0 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -3851,7 +3851,7 @@ float CLASS foveon_avg (short *pix, int range[2], float cfilt) short * CLASS foveon_make_curve (double max, double mul, double filt) { short *curve; - unsigned i, size; + size_t i, size; double x; if (!filt) filt = 0.8; diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 6b04ed0ae..52d0af4d5 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -373,7 +373,7 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam { timeval tv; gettimeofday(&tv, nullptr); - char mseconds[4]; + char mseconds[11]; sprintf(mseconds, "%d", (int)(tv.tv_usec / 1000)); time_t rawtime; struct tm *timeinfo; From 93ac6e01051cad5c5e927ad63dd2494041d60d0b Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 8 Jan 2018 22:31:48 +0100 Subject: [PATCH 125/200] added reset button for the L*a*b* grid in color toning --- rtgui/colortoning.cc | 33 +++++++++++++++++++++++---------- rtgui/colortoning.h | 1 + 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 9a50c0730..8a0ec75c2 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -37,7 +37,6 @@ private: float high_a_; float low_b_; float high_b_; - float saturation_; ToolPanelListener *listener_; bool edited_; static const int inset = 2; @@ -45,11 +44,7 @@ private: void notify_listener() { if (listener_) { - auto fmt = [](float f) -> Glib::ustring - { - return Glib::ustring::format(std::setw(4), std::fixed, std::setprecision(3), f); - }; - listener_->panelChanged(evt_, Glib::ustring::compose("%1, %2, %3, %4", fmt(low_a_), fmt(low_b_), fmt(high_a_), fmt(high_b_))); + listener_->panelChanged(evt_, Glib::ustring::compose("%1 %2 %3 %4", int(low_a_), int(low_b_), int(high_a_), int(high_b_))); } } @@ -73,13 +68,16 @@ public: hb = high_b_; } - void set_params(double la, double lb, double ha, double hb) + void set_params(double la, double lb, double ha, double hb, bool notify) { low_a_ = la; low_b_ = lb; high_a_ = ha; high_b_ = hb; queue_draw(); + if (notify) { + notify_listener(); + } } void set_edited(bool yes) @@ -191,6 +189,7 @@ public: break; } edited_ = true; + queue_draw(); notify_listener(); } return true; @@ -240,7 +239,7 @@ public: void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const { - minimum_width = 100; + minimum_width = 50; natural_width = 200; } @@ -563,8 +562,20 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR // LAB grid auto m = ProcEventMapper::getInstance(); EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); + Gtk::HBox *labgridBox = Gtk::manage(new Gtk::HBox()); labgridArea = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); - pack_start(*labgridArea, Gtk::PACK_EXPAND_WIDGET, 4); + labgridBox->pack_start(*labgridArea, true, true); + labgridReset = Gtk::manage(new Gtk::Button ()); + labgridReset->add (*Gtk::manage(new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); + setExpandAlignProperties(labgridReset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + labgridReset->set_relief(Gtk::RELIEF_NONE); + labgridReset->set_tooltip_text(M("ADJUSTER_RESET_TO_DEFAULT")); + labgridReset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + labgridReset->set_can_focus(false); + labgridReset->set_size_request(-1, 20); + labgridReset->signal_pressed().connect([=]() { static_cast(labgridArea)->set_params(0.0, 0.0, 0.0, 0.0, true); }); + labgridBox->pack_start(*labgridReset, false, false); + pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ show_all(); @@ -695,7 +706,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; - static_cast(labgridArea)->set_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + static_cast(labgridArea)->set_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); if (pedited && !pedited->colorToning.method) { method->set_active (5); @@ -1056,6 +1067,7 @@ void ColorToning::methodChanged () { if (!batchMode) { + labgridReset->hide(); labgridArea->hide(); if (method->get_active_row_number() == 0) { // Lab @@ -1224,6 +1236,7 @@ void ColorToning::methodChanged () neutrHBox->hide(); lumamode->hide(); + labgridReset->show(); labgridArea->show(); } } diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 31c1650cf..9fd26e34c 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -104,6 +104,7 @@ private: sigc::connection lumamodeConn; rtengine::ProcEvent EvColorToningLabGridValue; + Gtk::Button *labgridReset; Gtk::DrawingArea *labgridArea; IdleRegister idle_register; From bfa3f786bad953f5dfba94ae4ad7e9c6f3b02ca0 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 8 Jan 2018 23:27:22 +0100 Subject: [PATCH 126/200] replace M_PI with rtengine::RT_PI --- rtgui/colortoning.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 8a0ec75c2..24193be97 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -145,17 +145,17 @@ public: cr->set_source_rgb(0.1, 0.1, 0.1); if (selected_ == LOW) { - cr->arc(loa, lob, 5, 0, 2. * M_PI); + cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); } else { - cr->arc(loa, lob, 3, 0, 2. * M_PI); + cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); } cr->fill(); cr->set_source_rgb(0.9, 0.9, 0.9); if (selected_ == HIGH) { - cr->arc(hia, hib, 5, 0, 2. * M_PI); + cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); } else { - cr->arc(hia, hib, 3, 0, 2. * M_PI); + cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); } cr->fill(); From 9ce829e2f6151e4c794a2a4403c734a1aabffea8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 9 Jan 2018 00:43:13 +0100 Subject: [PATCH 127/200] Small speedup for fattal --- rtengine/tmo_fattal02.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index efa9c53d7..7ef490807 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1131,7 +1131,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) float max_YThr = 0.f; int max_xThr = 0, max_yThr = 0; #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for schedule(dynamic,16) nowait #endif for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { @@ -1193,10 +1193,10 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); - const float scale = std::max(L(max_x * wr + 1, max_y * hr + 1), epsilon) * (65535.f / Yr(max_x, max_y)); + const float scale = 65535.f / std::max(L(max_x * wr + 1, max_y * hr + 1), epsilon) * (65535.f / Yr(max_x, max_y)); #ifdef _OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for schedule(dynamic,16) if(multiThread) #endif for (int y = 0; y < h; y++) { int yy = y * hr + 1; @@ -1205,7 +1205,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) int xx = x * wr + 1; float Y = Yr (x, y); - float l = std::max (L (xx, yy), epsilon) * (65535.f / Y) / scale; + float l = std::max (L (xx, yy), epsilon) * (scale / Y); rgb->r (y, x) = std::max (rgb->r (y, x), 0.f) * l; rgb->g (y, x) = std::max (rgb->g (y, x), 0.f) * l; rgb->b (y, x) = std::max (rgb->b (y, x), 0.f) * l; From 9e9d523fa34784cb32ba1c094b8a620d15ade490 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 9 Jan 2018 15:41:39 +0100 Subject: [PATCH 128/200] updated history msg for lab color correction --- rtdata/languages/default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 7d95b85d2..ec93fd41e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -723,7 +723,7 @@ HISTORY_MSG_490;HDR TM - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments -HISTORY_MSG_COLORTONING_LABGRID_VALUE;L*a*b* color correction +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast From 6fb5d5ee33ec9e8f930c092fc14fa77e5fade375 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 9 Jan 2018 16:03:54 +0100 Subject: [PATCH 129/200] Speedup for saturation slider in exposure tool and for HSV equalizer --- rtengine/improcfun.cc | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 569ba42f1..d137453a8 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3929,22 +3929,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } if (sat != 0 || hCurveEnabled || sCurveEnabled || vCurveEnabled) { + const float satby100 = sat / 100.f; for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - - const float satby100 = sat / 100.f; - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - + Color::rgb2hsvtc(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], h, s, v); + h /= 6.f; if (sat > 0) { - s = (1.f - satby100) * s + satby100 * (1.f - SQR (SQR (1.f - min (s, 1.0f)))); - - if (s < 0.f) { - s = 0.f; - } + s = std::max(0.f, intp(satby100, 1.f - SQR(SQR(1.f - std::min(s, 1.0f))), s)); } else { /*if (sat < 0)*/ s *= 1.f + satby100; } @@ -3999,7 +3991,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } - Color::hsv2rgb (h, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + Color::hsv2rgbdcp(h * 6.f, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } From e5efc3a44ca5a33eadc354cb9f988b5136eb02dc Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 9 Jan 2018 18:02:58 +0100 Subject: [PATCH 130/200] do not perform unnecessary color toning computations when the method is "L*a*b* grid" (by heckflosse) --- rtengine/improccoordinator.cc | 2 +- rtengine/rtthumbnail.cc | 2 +- rtengine/simpleprocess.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 97e356f18..f79e173e9 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -509,7 +509,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) int satPR = 30; int indi = 0; - if (params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (oprevi, moyS, eqty);//return image : mean saturation and standard dev of saturation diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index fcc039a81..e84214bd4 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -1159,7 +1159,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT 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 + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index e74c32a35..de0022e92 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -910,7 +910,7 @@ private: 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 + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation From 30e085d378a8abf5b39b5c9f34c3bf2b24ade55c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 9 Jan 2018 19:41:34 +0100 Subject: [PATCH 131/200] colorToningLabGrid() : tiled/per row processing to make better use of cpu cache --- rtengine/improcfun.cc | 17 ++++++++++------- rtengine/improcfun.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 00c349323..7a9ac8b82 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3479,6 +3479,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve) && params->colorToning.method != "LabGrid"; + bool hasColorToningLabGrid = params->colorToning.enabled && params->colorToning.method == "LabGrid"; // float satLimit = float(params->colorToning.satProtectionThreshold)/100.f*0.7f+0.3f; // float satLimitOpacity = 1.f-(float(params->colorToning.saturatedOpacity)/100.f); float strProtect = (float (params->colorToning.strength) / 100.f); @@ -4521,6 +4522,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = istart, ti = 0; i < tH; i++, ti++) { Color::RGB2Lab(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], &(lab->L[i][jstart]), &(lab->a[i][jstart]), &(lab->b[i][jstart]), toxyz, tW - jstart); } + if (hasColorToningLabGrid) { + colorToningLabGrid(lab, jstart, tW, istart, tH, false); + } } else { // black & white // Auto channel mixer needs whole image, so we now copy to tmpImage and close the tiled processing for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -4932,6 +4936,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { Color::RGB2Lab(tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), lab->L[i], lab->a[i], lab->b[i], toxyz, tW); + if (hasColorToningLabGrid) { + colorToningLabGrid(lab, 0, tW, i, i + 1, false); + } } @@ -4953,10 +4960,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer delete vCurve; } - if (params->colorToning.enabled && params->colorToning.method == "LabGrid") { - colorToningLabGrid(lab); - } - if (params->localContrast.enabled) { // Alberto's local contrast localContrast(lab); @@ -7198,7 +7201,7 @@ SSEFUNCTION void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, You should have received a copy of the GNU General Public License along with darktable. If not, see . */ -void ImProcFunctions::colorToningLabGrid(LabImage *lab) +void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) { const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor; @@ -7209,8 +7212,8 @@ void ImProcFunctions::colorToningLabGrid(LabImage *lab) #ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif - for (int y = 0; y < lab->H; ++y) { - for (int x = 0; x < lab->W; ++x) { + for (int y = ystart; y < yend; ++y) { + for (int x = xstart; x < xend; ++x) { lab->a[y][x] += lab->L[y][x] * a_scale + a_base; lab->b[y][x] += lab->L[y][x] * b_scale + b_base; } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index c1b175ab6..83ffc12d6 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -346,7 +346,7 @@ public: void ToneMapFattal02(Imagefloat *rgb); void localContrast(LabImage *lab); - void colorToningLabGrid(LabImage *lab); + void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); Imagefloat* lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); From 5bb14bf410c90542c02a3c41099649321a75db5d Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 9 Jan 2018 23:24:03 +0100 Subject: [PATCH 132/200] small tweak to the denoise params rescaling for the fast pipeline --- rtengine/simpleprocess.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index e74c32a35..e7309702a 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -1436,12 +1436,12 @@ private: } params.wavelet.strength *= scale_factor; - params.dirpyrDenoise.luma *= scale_factor; + params.dirpyrDenoise.luma *= scale_factor * scale_factor; //params.dirpyrDenoise.Ldetail += (100 - params.dirpyrDenoise.Ldetail) * scale_factor; auto &lcurve = params.dirpyrDenoise.lcurve; for (size_t i = 2; i < lcurve.size(); i += 4) { - lcurve[i] *= min (scale_factor * 2, 1.0); + lcurve[i] *= min (scale_factor * scale_factor, 1.0); } noiseLCurve.Set (lcurve); From 6824f613e933fc93d37ab2f9842028db3b7b3c15 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 10 Jan 2018 09:21:54 +0100 Subject: [PATCH 133/200] HDR tone mapping: fixed typo in setting the defaults --- rtgui/fattaltonemap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index a6f4c5190..5e4aa20d9 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -26,7 +26,7 @@ using namespace rtengine::procparams; FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_TM_FATTAL_LABEL"), true, true) { - amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 30., 0.0)); + amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 30.)); threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 100., 1., 0.0)); amount->setAdjusterListener(this); From e29e9ca0d889dffb6bbacf3242a0773fcb6fa0f3 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 10 Jan 2018 17:38:18 +0100 Subject: [PATCH 134/200] Fixed segfault when saving reference image (due to metadata in TIFF not present) Fixes #4289 --- rtengine/imageio.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 88274cdb4..4cd762d0b 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1485,9 +1485,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::MOTOROLA; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; #else - bool needsReverse = (bps == 16 || bps == 32) && exifRoot->getOrder() == rtexif::INTEL; + bool needsReverse = (bps == 16 || bps == 32) && exifRoot && exifRoot->getOrder() == rtexif::INTEL; #endif for (int row = 0; row < height; row++) { From 91e494a7098e760d2422003011e8311d7032bba5 Mon Sep 17 00:00:00 2001 From: Hombre Date: Wed, 10 Jan 2018 18:22:50 +0100 Subject: [PATCH 135/200] Fix issue #4291 : "Bug when edit current image in external editor" Is also add metadata to the "ICC Reference image" (ICM tool). --- rtengine/imageio.cc | 21 --------------------- rtengine/improccoordinator.cc | 2 ++ 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 4cd762d0b..1b6a4ad20 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1484,30 +1484,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); } -#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = (bps == 16 || bps == 32) && exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; -#else - bool needsReverse = (bps == 16 || bps == 32) && exifRoot && exifRoot->getOrder() == rtexif::INTEL; -#endif - for (int row = 0; row < height; row++) { getScanline (row, linebuffer, bps); - if (needsReverse) { - if (bps == 16) { - for (int i = 0; i < lineWidth; i += 2) { - char c = linebuffer[i]; - linebuffer[i] = linebuffer[i + 1]; - linebuffer[i + 1] = c; - } - } else { - for (int i = 0; i < lineWidth; i += 4) { - std::swap(linebuffer[i], linebuffer[i+3]); - std::swap(linebuffer[i+1], linebuffer[i+2]); - } - } - } - if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { TIFFClose (out); delete [] linebuffer; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 97e356f18..34478c983 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -1284,6 +1284,8 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool im = tempImage; } + im->setMetadata (imgsrc->getMetaData()->getRootExifData ()); + im->saveTIFF (fname, 16, true); delete im; From 68ba09fdd8976b68feadfdfa97af5e0f3f9e3107 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 10 Jan 2018 19:29:11 +0100 Subject: [PATCH 136/200] Speedup for Colour Toning Methods 'RGB sliders' and 'RGB curves' --- rtengine/color.cc | 63 +----------------------------- rtengine/color.h | 89 +++++++++++++++++++++++++++++++++++++++---- rtengine/improcfun.cc | 16 +++----- 3 files changed, 89 insertions(+), 79 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 706d0f36d..ee63720aa 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -553,44 +553,6 @@ void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l) } } -void Color::rgb2hslfloat(float r, float g, float b, float &h, float &s, float &l) -{ - - float m = min(r, g, b); - float M = max(r, g, b); - float C = M - m; - - l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f) - - if (fabsf(C) < 0.65535f) { // 0.00001f * 65535.f - h = 0.f; - s = 0.f; - } else { - - if (l <= 0.5f) { - s = (M - m) / (M + m); - } else { - s = (M - m) / (131070.f - M - m); // 131070.f = 2.f * 65535.f - } - - if ( r == M ) { - h = (g - b); - } else if ( g == M ) { - h = (2.f * C) + (b - r); - } else { - h = (4.f * C) + (r - g); - } - - h /= (6.f * C); - - if ( h < 0.f ) { - h += 1.f; - } else if ( h > 1.f ) { - h -= 1.f; - } - } -} - #ifdef __SSE2__ void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l) { @@ -609,9 +571,8 @@ void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat & h /= (F2V(6.f) * C); vfloat onev = F2V(1.f); h = vself(vmaskf_lt(h, ZEROV), h + onev, h); - h = vself(vmaskf_gt(h, onev), h - onev, h); - vmask zeromask = vmaskf_lt(vabsf(C), F2V(0.65535f)); + vmask zeromask = vmaskf_lt(C, F2V(0.65535f)); h = vself(zeromask, ZEROV, h); s = vself(zeromask, ZEROV, s); } @@ -697,28 +658,6 @@ void Color::hsl2rgb (float h, float s, float l, float &r, float &g, float &b) } } -void Color::hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b) -{ - - if (s == 0.f) { - r = g = b = 65535.f * l; // achromatic - } else { - float m2; - - if (l <= 0.5f) { - m2 = l * (1.f + s); - } else { - m2 = l + s - l * s; - } - - float m1 = 2.f * l - m2; - - r = 65535.f * hue2rgbfloat (m1, m2, h * 6.f + 2.f); - g = 65535.f * hue2rgbfloat (m1, m2, h * 6.f); - b = 65535.f * hue2rgbfloat (m1, m2, h * 6.f - 2.f); - } -} - #ifdef __SSE2__ void Color::hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b) { diff --git a/rtengine/color.h b/rtengine/color.h index 2b6d40174..d56b30e52 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -205,7 +205,64 @@ public: * @param l luminance channel [0; 1] (return value) */ static void rgb2hsl (float r, float g, float b, float &h, float &s, float &l); - static void rgb2hslfloat (float r, float g, float b, float &h, float &s, float &l); + + static inline void rgb2slfloat(float r, float g, float b, float &s, float &l) + { + + float m = min(r, g, b); + float M = max(r, g, b); + float C = M - m; + + l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f) + + if (C < 0.65535f) { // 0.00001f * 65535.f + s = 0.f; + } else { + + if (l <= 0.5f) { + s = C / (M + m); + } else { + s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f + } + } + } + + static inline void rgb2hslfloat(float r, float g, float b, float &h, float &s, float &l) + { + + float m = min(r, g, b); + float M = max(r, g, b); + float C = M - m; + + l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f) + + if (C < 0.65535f) { // 0.00001f * 65535.f + h = 0.f; + s = 0.f; + } else { + + if (l <= 0.5f) { + s = C / (M + m); + } else { + s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f + } + + if ( r == M ) { + h = (g - b); + } else if ( g == M ) { + h = (2.f * C) + (b - r); + } else { + h = (4.f * C) + (r - g); + } + + h /= (6.f * C); + + if ( h < 0.f ) { + h += 1.f; + } + } + } + #ifdef __SSE2__ static void rgb2hsl (vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l); #endif @@ -220,7 +277,29 @@ public: * @param b blue channel [0 ; 65535] (return value) */ static void hsl2rgb (float h, float s, float l, float &r, float &g, float &b); - static void hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b); + + static inline void hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b) + { + + if (s == 0.f) { + r = g = b = 65535.f * l; // achromatic + } else { + float m2; + + if (l <= 0.5f) { + m2 = l * (1.f + s); + } else { + m2 = l + s - l * s; + } + + float m1 = 2.f * l - m2; + + r = 65535.f * hue2rgbfloat (m1, m2, h * 6.f + 2.f); + g = 65535.f * hue2rgbfloat (m1, m2, h * 6.f); + b = 65535.f * hue2rgbfloat (m1, m2, h * 6.f - 2.f); + } + } + #ifdef __SSE2__ static void hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b); #endif @@ -254,11 +333,7 @@ public: 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; - } + return del_Max / (var_Max == 0.f ? 1.f : 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 569ba42f1..ceaed824d 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4175,29 +4175,25 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // Luminance = (0.299f*r + 0.587f*g + 0.114f*b) - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); + float s, l; + Color::rgb2slfloat (r, g, b, s, l); - float l_ = Color::gamma_srgb (l * 65535.f) / 65535.f; + float l_ = Color::gammatab_srgb1[l * 65535.f]; // get the opacity and tweak it to preserve saturated colors - float opacity; + float opacity = 0.f; if (ctOpacityCurve) { opacity = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)) * ctOpacityCurve.lutOpacityCurve[l_ * 500.f]; } - if (!ctOpacityCurve) { - opacity = 0.f; - } - float r2, g2, b2; ctColorCurve.getVal (l_, r2, g2, b2); // get the color from the color curve float h2, s2, l2; - Color::rgb2hsl (r2, g2, b2, h2, s2, l2); // transform this new color to hsl + Color::rgb2hslfloat (r2, g2, b2, h2, s2, l2); // transform this new color to hsl - Color::hsl2rgb (h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); + Color::hsl2rgbfloat (h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); rtemp[ti * TS + tj] = r + (r2 - r) * opacity; // merge the color to the old color, depending on the opacity gtemp[ti * TS + tj] = g + (g2 - g) * opacity; From 840d3d1de4f659351f5b8434eda784670bb6fe16 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 11 Jan 2018 09:40:51 +0100 Subject: [PATCH 137/200] made L*a*b* color correction grid respect options.adjusterMinDelay for updating the preview --- rtgui/colortoning.cc | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 24193be97..5034f90cc 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -39,13 +39,15 @@ private: float high_b_; ToolPanelListener *listener_; bool edited_; + sigc::connection delay_conn_; static const int inset = 2; - void notify_listener() + bool notify_listener() { if (listener_) { listener_->panelChanged(evt_, Glib::ustring::compose("%1 %2 %3 %4", int(low_a_), int(low_b_), int(high_a_), int(high_b_))); - } + } + return false; } public: @@ -57,7 +59,7 @@ public: edited_(false) { set_can_focus(true); - add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK); } void get_params(double &la, double &lb, double &ha, double &hb) const @@ -165,15 +167,6 @@ public: return true; } - bool on_button_release_event(GdkEventButton *event) - { - if (selected_ != OFF) { - edited_ = true; - notify_listener(); - } - return true; - } - bool on_button_press_event(GdkEventButton *event) { if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { @@ -197,11 +190,16 @@ public: bool on_motion_notify_event(GdkEventMotion *event) { + if (delay_conn_.connected()) { + delay_conn_.disconnect(); + } + int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); const float ma = (2.0 * mouse_x - width) / (float)width; const float mb = (2.0 * mouse_y - height) / (float)height; + bool refresh = selected_ != OFF; if (event->state & GDK_BUTTON1_MASK) { if (selected_ == LOW) { low_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; @@ -227,8 +225,15 @@ public: } if (selected_ != OFF) { grab_focus(); + if (options.adjusterMinDelay == 0) { + notify_listener(); + } else { + delay_conn_ = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notify_listener), options.adjusterMinDelay); + } + } + if (refresh) { + queue_draw(); } - queue_draw(); return true; } From f0b73149bd5e9f5b8540e5f36556046984f40334 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 11 Jan 2018 13:30:57 +0100 Subject: [PATCH 138/200] Speedup for Colour Toning Methods 'RGB sliders' and 'RGB curves' in 'Black-and-White' mode --- rtengine/improcfun.cc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index ceaed824d..49f85ba9c 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4869,31 +4869,31 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); + float r = tmpImage->r(i, j); + float g = tmpImage->g(i, j); + float b = tmpImage->b(i, j); // Luminance = (0.299f*r + 0.587f*g + 0.114f*b) - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); + float s, l; + Color::rgb2slfloat(r, g, b, s, l); - float l_ = Color::gamma_srgb (l * 65535.f) / 65535.f; + float l_ = Color::gammatab_srgb1[l * 65535.f]; - // get the opacity and tweak it to preserve saturated colors + // get the opacity and tweak it to preserve saturated colours float opacity = ctOpacityCurve.lutOpacityCurve[l_ * 500.f] / 4.f; float r2, g2, b2; - ctColorCurve.getVal (l_, r2, g2, b2); // get the color from the color curve + ctColorCurve.getVal(l_, r2, g2, b2); // get the colour from the colour curve float h2, s2, l2; - Color::rgb2hsl (r2, g2, b2, h2, s2, l2); // transform this new color to hsl + Color::rgb2hslfloat(r2, g2, b2, h2, s2, l2); // transform this new colour to hsl - Color::hsl2rgb (h2, s2, l, r2, g2, b2); + Color::hsl2rgbfloat(h2, s2, l, r2, g2, b2); - tmpImage->r (i, j) = r + (r2 - r) * opacity; - tmpImage->g (i, j) = g + (g2 - g) * opacity; - tmpImage->b (i, j) = b + (b2 - b) * opacity; + tmpImage->r(i, j) = intp(opacity, r2, r); + tmpImage->g(i, j) = intp(opacity, g2, g); + tmpImage->b(i, j) = intp(opacity, b2, b); } } } From a748354b7bc99ee197390c86747d1051e2100c9a Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 11 Jan 2018 15:05:15 +0100 Subject: [PATCH 139/200] Fattal: do not consider clipped values when determining the luminance scaling factor This solves the issue with "color propagation" highlight reconstruction described in #4255 --- rtengine/tmo_fattal02.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 7ef490807..b72f4e4d0 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1119,6 +1119,12 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float epsilon = 1e-4f; const float luminance_noise_floor = 65.535f; const float min_luminance = 1.f; + const auto unclipped = + [=](int y, int x) -> bool + { + const float c = 65500.f; + return rgb->r(y, x) < c && rgb->g(y, x) < c && rgb->b(y, x) < c; + }; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); float max_Y = 0.f; @@ -1136,7 +1142,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels - if (Yr(x, y) > max_YThr) { + if (Yr(x, y) > max_YThr && unclipped(y, x)) { max_YThr = Yr(x, y); max_xThr = x; max_yThr = y; From fa4e07b8bb550155acec143b5e6edf56f8723131 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Thu, 11 Jan 2018 19:17:06 +0100 Subject: [PATCH 140/200] Updated build-rawtherapee to 2018-01-06 --- tools/build-rawtherapee | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/tools/build-rawtherapee b/tools/build-rawtherapee index 8c86ed54d..5c13df061 100755 --- a/tools/build-rawtherapee +++ b/tools/build-rawtherapee @@ -1,6 +1,6 @@ #!/usr/bin/env bash # By Morgan Hardwood -# Version 2017-12-25 +# Version 2018-01-06 # This script gets the latest source code for the given program and compiles it. # The name of the program, used for the folder names: @@ -22,11 +22,14 @@ exe="${prog}" exeRelativePath="" # The path to the repository: -repo="git@github.com:Beep6581/RawTherapee.git" +repo="https://github.com/Beep6581/RawTherapee.git" # No touching below this line, with the exception of the "Compile" section # ----------------------------------------------------------------------------- +# The name of the project's standard branch, typically "master": +master="dev" + buildOnly="false" buildType="release" @@ -35,8 +38,6 @@ exeRelativePath="${exeRelativePath/%\/}" # Append forward-slash to exeRelativePath only if it is not empty. exePath="${exeRelativePath:+${exeRelativePath}/}${exe}" -printf '%s\n' "" "Program name: ${prog}" "Build type: ${buildType}" "Build without updating: ${buildOnly}" "" - # Command-line arguments OPTIND=1 while getopts "bdh?-" opt; do @@ -59,16 +60,18 @@ done shift $((OPTIND-1)) [ "$1" = "--" ] && shift +printf '%s\n' "" "Program name: ${prog}" "Build type: ${buildType}" "Build without updating: ${buildOnly}" "" + # Clone if needed cloned="false" updates="false" if [[ ! -d "$HOME/programs/code-${prog}" ]]; then mkdir -p "$HOME/programs" || exit 1 git clone "$repo" "$HOME/programs/code-${prog}" || exit 1 - pushd "$HOME/programs/code-${prog}" || exit 1 + pushd "$HOME/programs/code-${prog}" 1>/dev/null || exit 1 cloned="true" else - pushd "$HOME/programs/code-${prog}" || exit 1 + pushd "$HOME/programs/code-${prog}" 1>/dev/null || exit 1 git fetch if [[ $(git rev-parse HEAD) != $(git rev-parse '@{u}') ]]; then updates="true" @@ -80,8 +83,20 @@ if [[ "$updates" = "true" && "$buildOnly" = "false" ]]; then git pull || exit 1 fi +# Find out which branch git is on +branch="$(git rev-parse --abbrev-ref HEAD)" + +# Set build and install folder names +if [[ $branch = $master && $buildType = release ]]; then + buildDir="$HOME/programs/code-${prog}/build" + installDir="$HOME/programs/${prog}" +else + buildDir="$HOME/programs/code-${prog}/build-${branch}-${buildType}" + installDir="$HOME/programs/${prog}-${branch}-${buildType}" +fi + existsExe="false" -if [[ -e "$HOME/programs/${prog}/${exePath}" ]]; then +if [[ -e "${installDir}/${exePath}" ]]; then existsExe="true" fi @@ -101,9 +116,9 @@ if [[ ! ( $cpuCount -ge 1 && $cpuCount -le 64 ) ]]; then fi # Prepare folders -rm -rf "$HOME/programs/${prog}" "$HOME/programs/code-${prog}/build" -mkdir -p "$HOME/programs/${prog}" "$HOME/programs/code-${prog}/build" || exit 1 -cd "$HOME/programs/code-${prog}/build" || exit 1 +rm -rf "${installDir}" +mkdir -p "${buildDir}" "${installDir}" || exit 1 +cd "${buildDir}" || exit 1 # ----------------------------------------------------------------------------- # Compile @@ -116,7 +131,7 @@ cmake \ -DCACHE_NAME_SUFFIX="5-dev" \ -DPROC_TARGET_NUMBER="2" \ -DBUILD_BUNDLE="ON" \ - -DBUNDLE_BASE_INSTALL_DIR="$HOME/programs/${prog}" \ + -DBUNDLE_BASE_INSTALL_DIR="${installDir}" \ -DOPTION_OMP="ON" \ -DWITH_LTO="OFF" \ -DWITH_PROF="OFF" \ @@ -127,6 +142,6 @@ cmake \ make --jobs="$cpuCount" install || exit 1 # Finished -printf '%s\n' "" "To run ${prog} type:" "~/programs/${prog}/${exePath}" "" +printf '%s\n' "" "To run ${prog} type:" "${installDir}/${exePath}" "" popd 1>/dev/null From 9f17139bc1da09366f87579ae2305e541874a0ed Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 11 Jan 2018 23:43:27 +0100 Subject: [PATCH 141/200] sort directories before files in the processing profiles menus Fixes #4295 --- rtengine/profilestore.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index 4d06b6f6b..e79c8e322 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -49,6 +49,7 @@ bool ProfileStore::init (bool loadAll) if ((storeState == STORESTATE_NOTINITIALIZED || storeState == STORESTATE_DIRTY) && loadAll) { storeState = STORESTATE_BEINGINITIALIZED; _parseProfiles (); + std::stable_partition(entries.begin(), entries.end(), [](const ProfileStoreEntry *e) { return e->type == PSET_FOLDER; }); storeState = STORESTATE_INITIALIZED; } From d6f1b3e6f6aa6a7057df00f8a65391616aa85255 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 12 Jan 2018 16:12:11 +0100 Subject: [PATCH 142/200] Fix resource leak reported by Coverity (CID 186465) --- rtengine/imageio.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 1b6a4ad20..0e404fa91 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1439,16 +1439,16 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } if (iptcdata) { - rtexif::Tag* iptcTag = new rtexif::Tag (nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); - iptcTag->initLongArray((char*)iptcdata, iptclen); + rtexif::Tag iptcTag(nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); + iptcTag.initLongArray((char*)iptcdata, iptclen); #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; #else bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::INTEL; #endif if (needsReverse) { - unsigned char *ptr = iptcTag->getValue(); - for (int a = 0; a < iptcTag->getCount(); ++a) { + unsigned char *ptr = iptcTag.getValue(); + for (int a = 0; a < iptcTag.getCount(); ++a) { unsigned char cc; cc = ptr[3]; ptr[3] = ptr[0]; @@ -1459,7 +1459,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) ptr += 4; } } - TIFFSetField (out, TIFFTAG_RICHTIFFIPTC, iptcTag->getCount(), (long*)iptcTag->getValue()); + TIFFSetField (out, TIFFTAG_RICHTIFFIPTC, iptcTag.getCount(), (long*)iptcTag.getValue()); iptc_data_free_buf (iptc, iptcdata); } From 187b278bc40e670b34e5b8a6a5a8dc79c50f0aa8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 12 Jan 2018 16:43:35 +0100 Subject: [PATCH 143/200] Speedup for Colour Toning Method 'Saturation 2 colours' --- rtengine/improcfun.cc | 220 ++++++++++++++---------------------------- 1 file changed, 74 insertions(+), 146 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 89eb9cfbf..470164ea5 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -4003,23 +4003,21 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer if (hasColorToning && !blackwhite) { if (params->colorToning.method == "Splitlr") { - float balanS, balanH; - float reducac = 0.4f; + constexpr float reducac = 0.4f; int preser = 0; if (params->colorToning.lumamode) { preser = 1; } - balanS = 1.f + Balan / 100.f; //balan between 0 and 2 - balanH = 1.f - Balan / 100.f; + const float balanS = 1.f + Balan / 100.f; //balan between 0 and 2 + const float balanH = 1.f - Balan / 100.f; float rh, gh, bh; float rl, gl, bl; float xh, yh, zh; float xl, yl, zl; - float iplow, iphigh; - iplow = (float)ctColorCurve.low; - iphigh = (float)ctColorCurve.high; + const float iplow = (float)ctColorCurve.low; + const float iphigh = (float)ctColorCurve.high; //2 colours ctColorCurve.getVal (iphigh, xh, yh, zh); ctColorCurve.getVal (iplow, xl, yl, zl); @@ -4028,20 +4026,18 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::xyz2rgb (xl, yl, zl, rl, gl, bl, wip); //reteave rgb value with s and l =1 retreavergb (rl, gl, bl); + const float krl = rl / (rl + gl + bl); + const float kgl = gl / (rl + gl + bl); + const float kbl = bl / (rl + gl + bl); retreavergb (rh, gh, bh); - //printf("rl=%f gl=%f bl=%f\n",rl,gl,bl); + const float krh = rh / (rh + gh + bh); + const float kgh = gh / (rh + gh + bh); + const float kbh = bh / (rh + gh + bh); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - float ro, go, bo; int mode = 0; - toning2col (r, g, b, ro, go, bo, iplow, iphigh, rl, gl, bl, rh, gh, bh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); - rtemp[ti * TS + tj] = ro; - gtemp[ti * TS + tj] = go; - btemp[ti * TS + tj] = bo; + toning2col(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } } @@ -4746,23 +4742,21 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } else if (params->colorToning.method == "Splitlr") { - float balanS, balanH; - float reducac = 0.4f; + constexpr float reducac = 0.4f; int preser = 0; if (params->colorToning.lumamode) { preser = 1; } - balanS = 1.f + Balan / 100.f; //balan between 0 and 2 - balanH = 1.f - Balan / 100.f; + const float balanS = 1.f + Balan / 100.f; //balan between 0 and 2 + const float balanH = 1.f - Balan / 100.f; float rh, gh, bh; float rl, gl, bl; float xh, yh, zh; float xl, yl, zl; - float iplow, iphigh; - iplow = (float)ctColorCurve.low; - iphigh = (float)ctColorCurve.high; + const float iplow = ctColorCurve.low; + const float iphigh = ctColorCurve.high; //2 colours ctColorCurve.getVal (iphigh, xh, yh, zh); @@ -4773,23 +4767,23 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer //retrieve rgb value with s and l =1 retreavergb (rl, gl, bl); + const float krl = rl / (rl + gl + bl); + const float kgl = gl / (rl + gl + bl); + const float kbl = bl / (rl + gl + bl); + retreavergb (rh, gh, bh); + const float krh = rh / (rh + gh + bh); + const float kgh = gh / (rh + gh + bh); + const float kbh = bh / (rh + gh + bh); + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); - - float ro, go, bo; int mode = 1; - toning2col (r, g, b, ro, go, bo, iplow, iphigh, rl, gl, bl, rh, gh, bh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); - tmpImage->r (i, j) = ro; - tmpImage->g (i, j) = go; - tmpImage->b (i, j) = bo; + toning2col(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } } @@ -5024,11 +5018,8 @@ void ImProcFunctions::secondeg_end (float reducac, float vinf, float &aa, float **/ void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, float &bbm) { - float zrmd = reducac; //linear = 0.5 - float v0m = vend; - float mem = vend / 2.f; //(0. + 0.8)/2.f - aam = (1.f - zrmd * v0m / mem) / (v0m * v0m - mem * v0m); // - bbm = (1.f - aam * v0m * v0m) / v0m; + aam = (2.f - 4.f * reducac) / (vend * vend); + bbm = 1.f / vend - aam * vend; } @@ -5324,79 +5315,57 @@ void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go * @param balanH [0..1] balance for highlights (same slider than for balanS) * @param reducac value of the reduction in the middle of the range for second degree, increase or decrease action **/ -void ImProcFunctions::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 ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float krl, float kgl, float kbl, float krh, float kgh, float kbh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect) { - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); - float v; - Color::rgb2hsv (r, g, b, h, s, v); - float ksat = 1.f; - float ksatlow = 1.f; - /* - if(mode==0) {//color - if(s < s_0) ksat=SQR((1.f/s_0)*s); - if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); - } - */ - float kl = 1.f; - float rlo = 1.f; - float rlh = 2.2f; - rlo *= pow_F (strProtect, 0.4f); //0.5 ==> 0.75 transfered value for more action - rlh *= pow_F (strProtect, 0.4f); + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float v = max(r, g, b) / 65535.f; + + const float rlo = pow_F (strProtect, 0.4f); //0.5 ==> 0.75 transfered value for more action + const float rlh = 2.2f * pow_F (strProtect, 0.4f); + //low tones //second degree float aa, bb, cc; //fixed value of reducac =0.4; secondeg_end (reducac, iplow, aa, bb, cc); - float aab, bbb; + float aab, bbb; secondeg_begin (0.7f, iplow, aab, bbb); - if (v > iplow) { - kl = aa * v * v + bb * v + cc; - } else if (mode == 0) { - kl = aab * v * v + bbb * v; - } - - if (SatLow > 0.f) { - //rl gl bl - float krl = rl / (rl + gl + bl); - float kgl = gl / (rl + gl + bl); - float kbl = bl / (rl + gl + bl); - float RedL, GreenL, BlueL; - - if (g < 20000.f || b < 20000.f || r < 20000.f) { - float kmgb = min (r, g, b); //I have tested ...0.85 compromise... - kl *= pow ((kmgb / 20000.f), 0.85f); + float kl = 1.f; + if (v > iplow) { + kl = aa * v * v + bb * v + cc; + } else if (mode == 0) { + kl = aab * v * v + bbb * v; + } + const float kmgb = min(r, g, b); + if (kmgb < 20000.f) { + //I have tested ...0.85 compromise... + kl *= pow_F ((kmgb / 20000.f), 0.85f); } - RedL = 1.f + (SatLow * krl) * kl * ksat * rlo * balanS; //0.4 + const float factor = 20000.f * SatLow * kl * rlo * balanS; if (krl > 0.f) { - g -= 20000.f * (RedL - 1.f) * ksatlow; - b -= 20000.f * (RedL - 1.f) * ksatlow; + g -= factor * krl; + b -= factor * krl; } g = CLIP (g); b = CLIP (b); - GreenL = 1.f + (SatLow * kgl) * kl * ksat * rlo * balanS; //0.4 - if (kgl > 0.f) { - r -= 20000.f * (GreenL - 1.f) * ksatlow; - b -= 20000.f * (GreenL - 1.f) * ksatlow; + r -= factor * kgl; + b -= factor * kgl; } r = CLIP (r); b = CLIP (b); - BlueL = 1.f + (SatLow * kbl) * kl * ksat * rlo * balanS; //0.4 - if (kbl > 0.f) { - r -= 20000.f * (BlueL - 1.f) * ksatlow; - g -= 20000.f * (BlueL - 1.f) * ksatlow; + r -= factor * kbl; + g -= factor * kbl; } r = CLIP (r); @@ -5404,84 +5373,43 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g } //high tones - float kh = 1.f; float aa0, bb0; //fixed value of reducac ==0.4; secondeg_begin (reducac, iphigh, aa0, bb0); - if (v > iphigh) { - kh = (-1.f / (1.f - iphigh)) * v + (1.f) / (1.f - iphigh); //Low light ==> decrease action after iplow - } else { - kh = aa0 * v * v + bb0 * v; - } - - - if (g > 45535.f || b > 45535.f || r > 45535.f) { - float kmgb = max (r, g, b); - float cora = 1.f / (45535.f - 65535.f); - float corb = 1.f - cora * 45535.f; - float cor = kmgb * cora + corb; - kh *= cor; - /* best algo if necessary with non linear response...little differences and more time! - float aa=1.f /(pow(45535.f,0.65f) - pow(65535.f,0.65f)); - float bb=1.f-aa*pow(45535.f,0.65f); - float cor=aa*pow(kmbg,0.65f)+bb; - kh*=cor;*/ - } - - if (SatHigh > 0.f) { - float RedH, GreenH, BlueH; - float krh = rh / (rh + gh + bh); - float kgh = gh / (rh + gh + bh); - float kbh = bh / (rh + gh + bh); - RedH = 1.f + (SatHigh * krh) * kh * rlh * balanH; //1.2 - - if (krh > 0.f) { - r += 20000.f * (RedH - 1.f); - r = CLIP (r); + float kh = 1.f; + if (v > iphigh) { + kh = (1.f - v) / (1.f - iphigh); //Low light ==> decrease action after iplow + } else { + kh = aa0 * v * v + bb0 * v; } - g = CLIP (g); - b = CLIP (b); - - GreenH = 1.f + (SatHigh * kgh) * kh * rlh * balanH; //1.2 - - if (kgh > 0.f) { - g += 20000.f * (GreenH - 1.f); - g = CLIP (g); + const float kmgb = max(r, g, b); + if (kmgb > 45535.f) { + constexpr float cora = 1.f / (45535.f - 65535.f); + constexpr float corb = 1.f - cora * 45535.f; + kh *= kmgb * cora + corb; } + const float factor = 20000.f * SatHigh * kh * rlh * balanH; + r += factor * (krh > 0.f ? krh : 0.f); + g += factor * (kgh > 0.f ? kgh : 0.f); + b += factor * (kbh > 0.f ? kbh : 0.f); - r = CLIP (r); - b = CLIP (b); - BlueH = 1.f + (SatHigh * kbh) * kh * rlh * balanH; //1.2 - - if (kbh > 0.f) { - b += 20000.f * (BlueH - 1.f); - b = CLIP (b); - } - - r = CLIP (r); - g = CLIP (g); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float lumafter = 0.299f * r + 0.587f * g + 0.114f * b; float preserv = 1.f; - if (preser == 1) { + float lumafter = 0.299f * r + 0.587f * g + 0.114f * b; preserv = lumbefore / lumafter; } - //float preserv=lumbefore/lumafter; - ro = r; - go = g; - bo = b; - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); + ro = CLIP(r * preserv); + go = CLIP(g * preserv); + bo = CLIP(b * preserv); } /** From 3b6cc19ae9a43a66acde5240a01dcd4aaf77b20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 12 Jan 2018 18:20:21 +0100 Subject: [PATCH 144/200] Fix some Coverity warnings --- rtengine/imagesource.h | 2 +- rtengine/ipresize.cc | 2 +- rtengine/rawimagesource.cc | 2 +- rtengine/rawimagesource.h | 2 +- rtengine/simpleprocess.cc | 47 ++++++++++++++++++++++++++++++-------- rtengine/tmo_fattal02.cc | 16 ++++++------- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 261995f08..5a71bb532 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -69,7 +69,7 @@ public: virtual int load (const Glib::ustring &fname) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {}; virtual void demosaic (const RAWParams &raw) {}; - virtual void retinex (const ColorManagementParams& cmp, const 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 retinex (const ColorManagementParams& cmp, const RetinexParams &deh, const ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; virtual void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index 1a48e5c43..c62ff0bc9 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -105,7 +105,7 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca float y0 = (static_cast (i) + 0.5f) * delta - 0.5f; // weights for interpolation in y direction - float w[support]; + float w[support] = {}; // sum of weights used for normalization float ws = 0.0f; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b948b8bdd..a8d94b638 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -2360,7 +2360,7 @@ void RawImageSource::retinexPrepareCurves(const RetinexParams &retinexParams, LU retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } -void RawImageSource::retinex(const ColorManagementParams& cmp, const 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 RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexParams &deh, const 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(); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index cdd7ca675..a374ef06e 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -119,7 +119,7 @@ public: int load (const Glib::ustring &fname); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true); void demosaic (const RAWParams &raw); - void retinex (const ColorManagementParams& cmp, const 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 retinex (const ColorManagementParams& cmp, const RetinexParams &deh, const 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 (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0c6576c48..027600302 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -49,19 +49,48 @@ void adjust_radius (const T &default_param, double scale_factor, T ¶m) class ImageProcessor { public: - ImageProcessor (ProcessingJob* pjob, int& errorCode, - ProgressListener* pl, bool flush): + ImageProcessor( + ProcessingJob* pjob, + int& errorCode, + ProgressListener* pl, + bool flush + ) : job (static_cast (pjob)), errorCode (errorCode), pl (pl), flush (flush), // internal state - ipf_p (nullptr), - ii (nullptr), - imgsrc (nullptr), - fw (-1), - fh (-1), - pp (0, 0, 0, 0, 0) + ii(nullptr), + imgsrc(nullptr), + fw(0), + fh(0), + tr(0), + pp(0, 0, 0, 0, 0), + calclum(nullptr), + autoNR(0.f), + autoNRmax(0.f), + tilesize(0), + overlap(0), + ch_M(nullptr), + max_r(nullptr), + max_b(nullptr), + min_b(nullptr), + min_r(nullptr), + lumL(nullptr), + chromC(nullptr), + ry(nullptr), + sk(nullptr), + pcsk(nullptr), + expcomp(0.0), + bright(0), + contr(0), + black(0), + hlcompr(0), + hlcomprthresh(0), + baseImg(nullptr), + labView(nullptr), + autili(false), + butili(false) { } @@ -814,7 +843,7 @@ private: if (params.fattal.enabled) { ipf.ToneMapFattal02(baseImg); } - + // perform transform (excepted resizing) if (ipf.needsTransform()) { Imagefloat* trImg = nullptr; diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index b72f4e4d0..055868344 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1116,13 +1116,13 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) Array2Df Yr (w, h); - const float epsilon = 1e-4f; - const float luminance_noise_floor = 65.535f; - const float min_luminance = 1.f; + constexpr float epsilon = 1e-4f; + constexpr float luminance_noise_floor = 65.535f; + constexpr float min_luminance = 1.f; const auto unclipped = - [=](int y, int x) -> bool + [rgb](int y, int x) -> bool { - const float c = 65500.f; + constexpr float c = 65500.f; return rgb->r(y, x) < c && rgb->g(y, x) < c && rgb->b(y, x) < c; }; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); @@ -1200,16 +1200,16 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float wr = float(w2) / float(w); const float scale = 65535.f / std::max(L(max_x * wr + 1, max_y * hr + 1), epsilon) * (65535.f / Yr(max_x, max_y)); - + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if(multiThread) #endif for (int y = 0; y < h; y++) { int yy = y * hr + 1; - + for (int x = 0; x < w; x++) { int xx = x * wr + 1; - + float Y = Yr (x, y); float l = std::max (L (xx, yy), epsilon) * (scale / Y); rgb->r (y, x) = std::max (rgb->r (y, x), 0.f) * l; From 0e52db3c7708893022c21a0a7006d70bcb8ef500 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 12 Jan 2018 21:58:10 +0100 Subject: [PATCH 145/200] moved LabGrid class to its own file --- rtgui/CMakeLists.txt | 1 + rtgui/colortoning.cc | 249 +--------------------------------------- rtgui/labgrid.cc | 263 +++++++++++++++++++++++++++++++++++++++++++ rtgui/labgrid.h | 78 +++++++++++++ 4 files changed, 343 insertions(+), 248 deletions(-) create mode 100644 rtgui/labgrid.cc create mode 100644 rtgui/labgrid.h diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index f5a20b88a..540b4d267 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -151,6 +151,7 @@ set(NONCLISOURCEFILES localcontrast.cc eventmapper.cc metadatapanel.cc + labgrid.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 5034f90cc..396b4cb65 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -5,258 +5,11 @@ #include "mycurve.h" #include "rtimage.h" #include "eventmapper.h" +#include "labgrid.h" using namespace rtengine; using namespace rtengine::procparams; -namespace { - -// adapted from the "color correction" module of Darktable. Original copyright follows -/* - copyright (c) 2009--2010 johannes hanika. - - darktable 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. - - darktable 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 darktable. If not, see . -*/ -class LabGrid: public Gtk::DrawingArea { -private: - rtengine::ProcEvent evt_; - enum State { OFF, HIGH, LOW }; - State selected_; - float low_a_; - float high_a_; - float low_b_; - float high_b_; - ToolPanelListener *listener_; - bool edited_; - sigc::connection delay_conn_; - static const int inset = 2; - - bool notify_listener() - { - if (listener_) { - listener_->panelChanged(evt_, Glib::ustring::compose("%1 %2 %3 %4", int(low_a_), int(low_b_), int(high_a_), int(high_b_))); - } - return false; - } - -public: - LabGrid(rtengine::ProcEvent evt): - Gtk::DrawingArea(), - evt_(evt), selected_(OFF), - low_a_(0.f), high_a_(0.f), low_b_(0.f), high_b_(0.f), - listener_(nullptr), - edited_(false) - { - set_can_focus(true); - add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK); - } - - void get_params(double &la, double &lb, double &ha, double &hb) const - { - la = low_a_; - ha = high_a_; - lb = low_b_; - hb = high_b_; - } - - void set_params(double la, double lb, double ha, double hb, bool notify) - { - low_a_ = la; - low_b_ = lb; - high_a_ = ha; - high_b_ = hb; - queue_draw(); - if (notify) { - notify_listener(); - } - } - - void set_edited(bool yes) - { - edited_ = yes; - } - - - bool get_edited() const - { - return edited_; - } - - void set_listener(ToolPanelListener *l) - { - listener_ = l; - } - - bool on_draw(const ::Cairo::RefPtr &crf) - { - int width = get_allocated_width(); - int height = get_allocated_height(); - Cairo::RefPtr cst = - Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); - Cairo::RefPtr cr = Cairo::Context::create(cst); - // clear bg - cr->set_source_rgb(.2, .2, .2); - cr->paint(); - - cr->translate(inset, inset); - cr->set_antialias(Cairo::ANTIALIAS_NONE); - width -= 2 * inset; - height -= 2 * inset; - // flip y: - cr->translate(0, height); - cr->scale(1., -1.); - const int cells = 8; - float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); - for (int j = 0; j < cells; j++) { - for (int i = 0; i < cells; i++) { - float R, G, B; - float x, y, z; - int ii = i - cells/2; - int jj = j - cells/2; - float a = step * (ii + 0.5); - float b = step * (jj + 0.5); - Color::Lab2XYZ(25000.f, a, b, x, y, z); - Color::xyz2srgb(x, y, z, R, G, B); - cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); - cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); - cr->fill(); - } - } - cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); - float loa, hia, lob, hib; - loa = .5f * (width + width * low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hia = .5f * (width + width * high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - lob = .5f * (height + height * low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hib = .5f * (height + height * high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - cr->set_line_width(2.); - cr->set_source_rgb(0.6, 0.6, 0.6); - cr->move_to(loa, lob); - cr->line_to(hia, hib); - cr->stroke(); - - cr->set_source_rgb(0.1, 0.1, 0.1); - if (selected_ == LOW) { - cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); - } - cr->fill(); - - cr->set_source_rgb(0.9, 0.9, 0.9); - if (selected_ == HIGH) { - cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); - } - cr->fill(); - - crf->set_source(cst, 0, 0); - crf->paint(); - - return true; - } - - bool on_button_press_event(GdkEventButton *event) - { - if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { - switch (selected_) { - case OFF: - low_a_ = low_b_ = high_a_ = high_b_ = 0.f; - break; - case LOW: - low_a_ = low_b_ = 0.f; - break; - case HIGH: - high_a_ = high_b_ = 0.f; - break; - } - edited_ = true; - queue_draw(); - notify_listener(); - } - return true; - } - - bool on_motion_notify_event(GdkEventMotion *event) - { - if (delay_conn_.connected()) { - delay_conn_.disconnect(); - } - - int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; - const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); - const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); - const float ma = (2.0 * mouse_x - width) / (float)width; - const float mb = (2.0 * mouse_y - height) / (float)height; - bool refresh = selected_ != OFF; - if (event->state & GDK_BUTTON1_MASK) { - if (selected_ == LOW) { - low_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - low_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; - } else if (selected_ == HIGH) { - high_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - high_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; - } - } else { - selected_ = OFF; - float la = low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float lb = low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float ha = high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float hb = high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - const float thrs = 0.05f; - const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); - const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); - if (distlo < thrs * thrs && distlo < disthi) { - selected_ = LOW; - } else if (disthi < thrs * thrs && disthi <= distlo) { - selected_ = HIGH; - } - } - if (selected_ != OFF) { - grab_focus(); - if (options.adjusterMinDelay == 0) { - notify_listener(); - } else { - delay_conn_ = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notify_listener), options.adjusterMinDelay); - } - } - if (refresh) { - queue_draw(); - } - return true; - } - - Gtk::SizeRequestMode get_request_mode_vfunc() const - { - return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; - } - - void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const - { - minimum_width = 50; - natural_width = 200; - } - - void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const - { - minimum_height = natural_height = width; - } -}; - - -} // namespace - ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc new file mode 100644 index 000000000..7cb752bb6 --- /dev/null +++ b/rtgui/labgrid.cc @@ -0,0 +1,263 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ + +#include "labgrid.h" + +using rtengine::Color; + + +bool LabGrid::notify_listener() +{ + if (listener_) { + listener_->panelChanged(evt_, Glib::ustring::compose("%1 %2 %3 %4", int(low_a_), int(low_b_), int(high_a_), int(high_b_))); + } + return false; +} + + +LabGrid::LabGrid(rtengine::ProcEvent evt): + Gtk::DrawingArea(), + evt_(evt), selected_(OFF), + low_a_(0.f), high_a_(0.f), low_b_(0.f), high_b_(0.f), + listener_(nullptr), + edited_(false) +{ + set_can_focus(true); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK); +} + + +void LabGrid::get_params(double &la, double &lb, double &ha, double &hb) const +{ + la = low_a_; + ha = high_a_; + lb = low_b_; + hb = high_b_; +} + + +void LabGrid::set_params(double la, double lb, double ha, double hb, bool notify) +{ + low_a_ = la; + low_b_ = lb; + high_a_ = ha; + high_b_ = hb; + queue_draw(); + if (notify) { + notify_listener(); + } +} + + +void LabGrid::set_edited(bool yes) +{ + edited_ = yes; +} + + +bool LabGrid::get_edited() const +{ + return edited_; +} + + +void LabGrid::set_listener(ToolPanelListener *l) +{ + listener_ = l; +} + + +bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) +{ + int width = get_allocated_width(); + int height = get_allocated_height(); + Cairo::RefPtr cst = + Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); + Cairo::RefPtr cr = Cairo::Context::create(cst); + // clear bg + cr->set_source_rgb(.2, .2, .2); + cr->paint(); + + cr->translate(inset, inset); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + width -= 2 * inset; + height -= 2 * inset; + // flip y: + cr->translate(0, height); + cr->scale(1., -1.); + const int cells = 8; + float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + for (int j = 0; j < cells; j++) { + for (int i = 0; i < cells; i++) { + float R, G, B; + float x, y, z; + int ii = i - cells/2; + int jj = j - cells/2; + float a = step * (ii + 0.5); + float b = step * (jj + 0.5); + Color::Lab2XYZ(25000.f, a, b, x, y, z); + Color::xyz2srgb(x, y, z, R, G, B); + cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); + cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); + cr->fill(); + } + } + cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); + float loa, hia, lob, hib; + loa = .5f * (width + width * low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hia = .5f * (width + width * high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + lob = .5f * (height + height * low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hib = .5f * (height + height * high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); + cr->set_line_width(2.); + cr->set_source_rgb(0.6, 0.6, 0.6); + cr->move_to(loa, lob); + cr->line_to(hia, hib); + cr->stroke(); + + cr->set_source_rgb(0.1, 0.1, 0.1); + if (selected_ == LOW) { + cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + + cr->set_source_rgb(0.9, 0.9, 0.9); + if (selected_ == HIGH) { + cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + + crf->set_source(cst, 0, 0); + crf->paint(); + + return true; +} + + +bool LabGrid::on_button_press_event(GdkEventButton *event) +{ + if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { + switch (selected_) { + case OFF: + low_a_ = low_b_ = high_a_ = high_b_ = 0.f; + break; + case LOW: + low_a_ = low_b_ = 0.f; + break; + case HIGH: + high_a_ = high_b_ = 0.f; + break; + } + edited_ = true; + queue_draw(); + notify_listener(); + } + return true; +} + + +bool LabGrid::on_motion_notify_event(GdkEventMotion *event) +{ + if (delay_conn_.connected()) { + delay_conn_.disconnect(); + } + + int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; + const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); + const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); + const float ma = (2.0 * mouse_x - width) / (float)width; + const float mb = (2.0 * mouse_y - height) / (float)height; + bool refresh = selected_ != OFF; + if (event->state & GDK_BUTTON1_MASK) { + if (selected_ == LOW) { + low_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + low_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } else if (selected_ == HIGH) { + high_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } + } else { + selected_ = OFF; + float la = low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float lb = low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float ha = high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float hb = high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + const float thrs = 0.05f; + const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); + const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); + if (distlo < thrs * thrs && distlo < disthi) { + selected_ = LOW; + } else if (disthi < thrs * thrs && disthi <= distlo) { + selected_ = HIGH; + } + } + if (selected_ != OFF) { + grab_focus(); + if (options.adjusterMinDelay == 0) { + notify_listener(); + } else { + delay_conn_ = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notify_listener), options.adjusterMinDelay); + } + } + if (refresh) { + queue_draw(); + } + return true; +} + + +Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const +{ + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; +} + + +void LabGrid::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const +{ + minimum_width = 50; + natural_width = 200; +} + + +void LabGrid::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const +{ + minimum_height = natural_height = width; +} diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h new file mode 100644 index 000000000..dcb34bcc3 --- /dev/null +++ b/rtgui/labgrid.h @@ -0,0 +1,78 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ + +#pragma once + +#include +#include "eventmapper.h" +#include "toolpanel.h" + + +class LabGrid: public Gtk::DrawingArea { +private: + rtengine::ProcEvent evt_; + enum State { OFF, HIGH, LOW }; + State selected_; + float low_a_; + float high_a_; + float low_b_; + float high_b_; + ToolPanelListener *listener_; + bool edited_; + sigc::connection delay_conn_; + static const int inset = 2; + + bool notify_listener(); + +public: + LabGrid(rtengine::ProcEvent evt); + + void get_params(double &la, double &lb, double &ha, double &hb) const; + void set_params(double la, double lb, double ha, double hb, bool notify); + void set_edited(bool yes); + bool get_edited() const; + void set_listener(ToolPanelListener *l); + + bool on_draw(const ::Cairo::RefPtr &crf); + bool on_button_press_event(GdkEventButton *event); + bool on_motion_notify_event(GdkEventMotion *event); + Gtk::SizeRequestMode get_request_mode_vfunc() const; + void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; +}; + From 0498048ca05078cfe07636bb636629a80e3890e9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 13 Jan 2018 12:23:46 +0100 Subject: [PATCH 146/200] Speedup for DCPProfile::apply(), closes #4294 --- rtengine/dcp.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index f9cdd1c73..82ea35f0f 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1074,7 +1074,7 @@ void DCPProfile::apply( float s; float v; - if(Color::rgb2hsvdcp(newr, newg, newb, h , s, v)) { + if (LIKELY(Color::rgb2hsvdcp(newr, newg, newb, h , s, v))) { hsdApply(delta_info, delta_base, h, s, v); From 52be618963845007575c4dff5bdb7e814568581c Mon Sep 17 00:00:00 2001 From: Hombre Date: Sat, 13 Jan 2018 20:26:19 +0100 Subject: [PATCH 147/200] Bugfix in LabGrid class + code refactoring - suppressed trailing `_` char for class' parameters - renamed function name (those not related to Gtk) to lowerCamelCase - changed the mecanism of dragging point, to avoid throwing unecessary `panelChange` event - added a `reset` function, with support of `toInitial` to get back the values at load time (CTRL+click on reset button) - `on_draw` optimisation: now LabGrid IS A BackBuffer --- rtdata/languages/Francais | 1 + rtdata/languages/default | 1 + rtgui/blackwhite.cc | 18 +- rtgui/colortoning.cc | 29 ++-- rtgui/colortoning.h | 4 +- rtgui/labgrid.cc | 334 ++++++++++++++++++++++---------------- rtgui/labgrid.h | 48 ++++-- rtgui/paramsedited.cc | 3 - 8 files changed, 257 insertions(+), 181 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 3def47d59..700691c7f 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1381,6 +1381,7 @@ TP_COLORTONING_HIGHLIGHT;Hautes lumières TP_COLORTONING_HUE;Teinte TP_COLORTONING_LAB;Mixage Lab TP_COLORTONING_LABEL;Virage Partiel +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4 TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Préserver la luminance TP_COLORTONING_LUMAMODE_TOOLTIP;Si activé, lorsque vous changez la couleur (rouge, vert, cyan, bleu, etc.), la luminance de chaque pixel est préservé diff --git a/rtdata/languages/default b/rtdata/languages/default index ec93fd41e..38f357d5a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1407,6 +1407,7 @@ TP_COLORTONING_HUE;Hue TP_COLORTONING_LAB;L*a*b* blending TP_COLORTONING_LABEL;Color Toning TP_COLORTONING_LABGRID;L*a*b* color correction grid +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Preserve luminance TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 2b410846f..0788a465d 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -1003,7 +1003,7 @@ void BlackWhite::autoch_toggled () bool wasEnabled = disableListener(); if (mixerRed->getAddMode()) { - mixerRed->resetValue(false); + mixerRed->resetValue(true); } if (mixerGreen->getAddMode()) { @@ -1053,14 +1053,14 @@ void BlackWhite::autoch_toggled () } else { if (autoch->get_active()) { bool wasEnabled = disableListener(); - mixerRed->setValue(33); - mixerGreen->setValue(33); - mixerBlue->setValue(33); - mixerOrange->setValue(33); - mixerYellow->setValue(33); - mixerMagenta->setValue(33); - mixerPurple->setValue(33); - mixerCyan->setValue(33); + mixerRed->resetValue(false); + mixerGreen->resetValue(false); + mixerBlue->resetValue(false); + mixerOrange->resetValue(false); + mixerYellow->resetValue(false); + mixerMagenta->resetValue(false); + mixerPurple->resetValue(false); + mixerCyan->resetValue(false); setting->set_active (11); filter->set_active (0); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 396b4cb65..2ca099769 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -320,9 +320,9 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR // LAB grid auto m = ProcEventMapper::getInstance(); EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); - Gtk::HBox *labgridBox = Gtk::manage(new Gtk::HBox()); - labgridArea = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); - labgridBox->pack_start(*labgridArea, true, true); + labgridBox = Gtk::manage(new Gtk::HBox()); + labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); + labgridBox->pack_start(*labgrid, true, true); labgridReset = Gtk::manage(new Gtk::Button ()); labgridReset->add (*Gtk::manage(new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); setExpandAlignProperties(labgridReset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); @@ -331,11 +331,11 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR labgridReset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); labgridReset->set_can_focus(false); labgridReset->set_size_request(-1, 20); - labgridReset->signal_pressed().connect([=]() { static_cast(labgridArea)->set_params(0.0, 0.0, 0.0, 0.0, true); }); + labgridReset->signal_button_release_event().connect([=](GdkEventButton* release_event) { labgrid->reset(release_event->state & GDK_CONTROL_MASK ? true : false); return false; }); labgridBox->pack_start(*labgridReset, false, false); pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ - + show_all(); disableListener(); @@ -357,7 +357,7 @@ ColorToning::~ColorToning() void ColorToning::setListener(ToolPanelListener *tpl) { ToolPanel::setListener(tpl); - static_cast(labgridArea)->set_listener(tpl); + labgrid->setListener(tpl); } /* @@ -432,7 +432,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) cl2shape->setUnChanged (!pedited->colorToning.cl2curve); lumamode->set_inconsistent (!pedited->colorToning.lumamode); - static_cast(labgridArea)->set_edited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); + labgrid->setEdited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); } redlow->setValue (pp->colorToning.redlow); @@ -464,7 +464,7 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; - static_cast(labgridArea)->set_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); + labgrid->setParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); if (pedited && !pedited->colorToning.method) { method->set_active (5); @@ -532,7 +532,7 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.saturatedOpacity = saturatedOpacity->getIntValue(); pp->colorToning.strength = strength->getIntValue(); - static_cast(labgridArea)->get_params(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); if (pedited) { pedited->colorToning.redlow = redlow->getEditedState (); @@ -559,7 +559,7 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorToning.hlColSat = hlColSat->getEditedState (); pedited->colorToning.shadowsColSat = shadowsColSat->getEditedState (); - pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = static_cast(labgridArea)->get_edited(); + pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = labgrid->getEdited(); } if (method->get_active_row_number() == 0) { @@ -630,6 +630,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* hlColSat->setDefault (defParams->colorToning.hlColSat); shadowsColSat->setDefault (defParams->colorToning.shadowsColSat); strength->setDefault (defParams->colorToning.strength); + labgrid->setDefault(defParams->colorToning.labgridALow, defParams->colorToning.labgridBLow, defParams->colorToning.labgridAHigh, defParams->colorToning.labgridBHigh); if (pedited) { redlow->setDefaultEditedState (pedited->colorToning.redlow ? Edited : UnEdited); @@ -647,6 +648,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* hlColSat->setDefaultEditedState (pedited->colorToning.hlColSat ? Edited : UnEdited); shadowsColSat->setDefaultEditedState (pedited->colorToning.shadowsColSat ? Edited : UnEdited); strength->setDefaultEditedState (pedited->colorToning.strength ? Edited : UnEdited); + labgrid->setEdited((pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh) ? Edited : UnEdited); } else { redlow->setDefaultEditedState (Irrelevant); greenlow->setDefaultEditedState (Irrelevant); @@ -663,6 +665,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* hlColSat->setDefaultEditedState (Irrelevant); shadowsColSat->setDefaultEditedState (Irrelevant); strength->setDefaultEditedState (Irrelevant); + labgrid->setEdited(Edited); } } @@ -825,8 +828,7 @@ void ColorToning::methodChanged () { if (!batchMode) { - labgridReset->hide(); - labgridArea->hide(); + labgridBox->hide(); if (method->get_active_row_number() == 0) { // Lab colorSep->show(); @@ -994,8 +996,7 @@ void ColorToning::methodChanged () neutrHBox->hide(); lumamode->hide(); - labgridReset->show(); - labgridArea->show(); + labgridBox->show(); } } diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 9fd26e34c..588e6ee3b 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -12,6 +12,7 @@ #include "curveeditorgroup.h" #include "thresholdadjuster.h" #include "colorprovider.h" +#include "labgrid.h" class ColorToning final : public ToolParamBlock, @@ -105,7 +106,8 @@ private: rtengine::ProcEvent EvColorToningLabGridValue; Gtk::Button *labgridReset; - Gtk::DrawingArea *labgridArea; + LabGrid *labgrid; + Gtk::HBox *labgridBox; IdleRegister idle_register; }; diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 7cb752bb6..079b3290f 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -41,208 +41,270 @@ using rtengine::Color; -bool LabGrid::notify_listener() +bool LabGrid::notifyListener() { - if (listener_) { - listener_->panelChanged(evt_, Glib::ustring::compose("%1 %2 %3 %4", int(low_a_), int(low_b_), int(high_a_), int(high_b_))); + if (listener) { + listener->panelChanged(evt, Glib::ustring::compose(M("TP_COLORTONING_LABGRID_VALUES"), int(low_a), int(low_b), int(high_a), int(high_b))); } return false; } - + LabGrid::LabGrid(rtengine::ProcEvent evt): Gtk::DrawingArea(), - evt_(evt), selected_(OFF), - low_a_(0.f), high_a_(0.f), low_b_(0.f), high_b_(0.f), - listener_(nullptr), - edited_(false) + evt(evt), litPoint(NONE), + low_a(0.f), high_a(0.f), low_b(0.f), high_b(0.f), + defaultLow_a(0.f), defaultHigh_a(0.f), defaultLow_b(0.f), defaultHigh_b(0.f), + listener(nullptr), + edited(false), + isDragged(false) { set_can_focus(true); - add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); +} + +void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const +{ + la = low_a; + ha = high_a; + lb = low_b; + hb = high_b; } -void LabGrid::get_params(double &la, double &lb, double &ha, double &hb) const +void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) { - la = low_a_; - ha = high_a_; - lb = low_b_; - hb = high_b_; -} - - -void LabGrid::set_params(double la, double lb, double ha, double hb, bool notify) -{ - low_a_ = la; - low_b_ = lb; - high_a_ = ha; - high_b_ = hb; + low_a = la; + low_b = lb; + high_a = ha; + high_b = hb; queue_draw(); if (notify) { - notify_listener(); + notifyListener(); + } +} + +void LabGrid::setDefault (double la, double lb, double ha, double hb) +{ + defaultLow_a = la; + defaultLow_b = lb; + defaultHigh_a = ha; + defaultHigh_b = hb; +} + + +void LabGrid::reset(bool toInitial) +{ + if (toInitial) { + setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, true); + } else { + setParams(0., 0., 0., 0., true); } } -void LabGrid::set_edited(bool yes) +void LabGrid::setEdited(bool yes) { - edited_ = yes; + edited = yes; } -bool LabGrid::get_edited() const +bool LabGrid::getEdited() const { - return edited_; + return edited; } -void LabGrid::set_listener(ToolPanelListener *l) +void LabGrid::setListener(ToolPanelListener *l) { - listener_ = l; + listener = l; +} + + +void LabGrid::on_style_updated () +{ + setDirty(true); + queue_draw (); } bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) { - int width = get_allocated_width(); - int height = get_allocated_height(); - Cairo::RefPtr cst = - Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); - Cairo::RefPtr cr = Cairo::Context::create(cst); - // clear bg - cr->set_source_rgb(.2, .2, .2); - cr->paint(); - - cr->translate(inset, inset); - cr->set_antialias(Cairo::ANTIALIAS_NONE); - width -= 2 * inset; - height -= 2 * inset; - // flip y: - cr->translate(0, height); - cr->scale(1., -1.); - const int cells = 8; - float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); - for (int j = 0; j < cells; j++) { - for (int i = 0; i < cells; i++) { - float R, G, B; - float x, y, z; - int ii = i - cells/2; - int jj = j - cells/2; - float a = step * (ii + 0.5); - float b = step * (jj + 0.5); - Color::Lab2XYZ(25000.f, a, b, x, y, z); - Color::xyz2srgb(x, y, z, R, G, B); - cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); - cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); - cr->fill(); + Gtk::Allocation allocation = get_allocation(); + allocation.set_x(0); + allocation.set_y(0); + + // setDrawRectangle will allocate the backbuffer Surface + if (setDrawRectangle(Cairo::FORMAT_ARGB32, allocation)) { + setDirty(true); + } + + if (!isDirty() || !surfaceCreated()) { + return true; + } + + Glib::RefPtr style = get_style_context(); + Cairo::RefPtr cr = getContext(); + + if (isDirty()) { + int width = allocation.get_width(); + int height = allocation.get_height(); + + cr->set_line_cap(Cairo::LINE_CAP_SQUARE); + + // clear background + cr->set_source_rgba (0., 0., 0., 0.); + cr->set_operator (Cairo::OPERATOR_CLEAR); + cr->paint (); + cr->set_operator (Cairo::OPERATOR_OVER); + style->render_background(cr, 0, 0, width, height); + + // drawing the cells + cr->translate(inset, inset); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + width -= 2 * inset; + height -= 2 * inset; + // flip y: + cr->translate(0, height); + cr->scale(1., -1.); + const int cells = 8; + float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + for (int j = 0; j < cells; j++) { + for (int i = 0; i < cells; i++) { + float R, G, B; + float x, y, z; + int ii = i - cells/2; + int jj = j - cells/2; + float a = step * (ii + 0.5); + float b = step * (jj + 0.5); + Color::Lab2XYZ(25000.f, a, b, x, y, z); + Color::xyz2srgb(x, y, z, R, G, B); + cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); + cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); + cr->fill(); + } } - } - cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); - float loa, hia, lob, hib; - loa = .5f * (width + width * low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hia = .5f * (width + width * high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - lob = .5f * (height + height * low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - hib = .5f * (height + height * high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX); - cr->set_line_width(2.); - cr->set_source_rgb(0.6, 0.6, 0.6); - cr->move_to(loa, lob); - cr->line_to(hia, hib); - cr->stroke(); - cr->set_source_rgb(0.1, 0.1, 0.1); - if (selected_ == LOW) { - cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); - } - cr->fill(); + // drawing the connection line + cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); + float loa, hia, lob, hib; + loa = .5f * (width + width * low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hia = .5f * (width + width * high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); + lob = .5f * (height + height * low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hib = .5f * (height + height * high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); + cr->set_line_width(2.); + cr->set_source_rgb(0.6, 0.6, 0.6); + cr->move_to(loa, lob); + cr->line_to(hia, hib); + cr->stroke(); - cr->set_source_rgb(0.9, 0.9, 0.9); - if (selected_ == HIGH) { - cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); - } else { - cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); - } - cr->fill(); + // drawing points + cr->set_source_rgb(0.1, 0.1, 0.1); + if (litPoint == LOW) { + cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); - crf->set_source(cst, 0, 0); - crf->paint(); - - return true; + cr->set_source_rgb(0.9, 0.9, 0.9); + if (litPoint == HIGH) { + cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + } + + copySurface(crf); + return false; } bool LabGrid::on_button_press_event(GdkEventButton *event) { - if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { - switch (selected_) { - case OFF: - low_a_ = low_b_ = high_a_ = high_b_ = 0.f; - break; - case LOW: - low_a_ = low_b_ = 0.f; - break; - case HIGH: - high_a_ = high_b_ = 0.f; - break; + if (event->button == 1) { + if (event->type == GDK_2BUTTON_PRESS) { + switch (litPoint) { + case NONE: + low_a = low_b = high_a = high_b = 0.f; + break; + case LOW: + low_a = low_b = 0.f; + break; + case HIGH: + high_a = high_b = 0.f; + break; + } + edited = true; + } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { + isDragged = true; } - edited_ = true; - queue_draw(); - notify_listener(); + return false; } return true; } - + + +bool LabGrid::on_button_release_event(GdkEventButton *event) +{ + if (event->button == 1) { + isDragged = false; + return false; + } + return true; +} + bool LabGrid::on_motion_notify_event(GdkEventMotion *event) { - if (delay_conn_.connected()) { - delay_conn_.disconnect(); + if (isDragged && delayconn.connected()) { + delayconn.disconnect(); } - + + State oldLitPoint = litPoint; + int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); const float ma = (2.0 * mouse_x - width) / (float)width; const float mb = (2.0 * mouse_y - height) / (float)height; - bool refresh = selected_ != OFF; - if (event->state & GDK_BUTTON1_MASK) { - if (selected_ == LOW) { - low_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - low_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; - } else if (selected_ == HIGH) { - high_a_ = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - high_b_ = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + if (isDragged) { + if (litPoint == LOW) { + low_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + low_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } else if (litPoint == HIGH) { + high_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; } + grab_focus(); + if (options.adjusterMinDelay == 0) { + notifyListener(); + } else { + delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notifyListener), options.adjusterMinDelay); + } + queue_draw(); } else { - selected_ = OFF; - float la = low_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float lb = low_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float ha = high_a_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; - float hb = high_b_ / rtengine::ColorToningParams::LABGRID_CORR_MAX; + litPoint = NONE; + float la = low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float lb = low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float ha = high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float hb = high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; const float thrs = 0.05f; const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); if (distlo < thrs * thrs && distlo < disthi) { - selected_ = LOW; + litPoint = LOW; } else if (disthi < thrs * thrs && disthi <= distlo) { - selected_ = HIGH; + litPoint = HIGH; } - } - if (selected_ != OFF) { - grab_focus(); - if (options.adjusterMinDelay == 0) { - notify_listener(); - } else { - delay_conn_ = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notify_listener), options.adjusterMinDelay); + if ((oldLitPoint == NONE && litPoint != NONE) || (oldLitPoint != NONE && litPoint == NONE)) { + queue_draw(); } } - if (refresh) { - queue_draw(); - } return true; } - + Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const { @@ -253,7 +315,7 @@ Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const void LabGrid::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const { minimum_width = 50; - natural_width = 200; + natural_width = 150; // same as GRAPH_SIZE from mycurve.h } diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index dcb34bcc3..348ab2398 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -43,33 +43,45 @@ #include "toolpanel.h" -class LabGrid: public Gtk::DrawingArea { +class LabGrid: public Gtk::DrawingArea, public BackBuffer { private: - rtengine::ProcEvent evt_; - enum State { OFF, HIGH, LOW }; - State selected_; - float low_a_; - float high_a_; - float low_b_; - float high_b_; - ToolPanelListener *listener_; - bool edited_; - sigc::connection delay_conn_; + rtengine::ProcEvent evt; + enum State { NONE, HIGH, LOW }; + State litPoint; + float low_a; + float high_a; + float low_b; + float high_b; + + float defaultLow_a; + float defaultHigh_a; + float defaultLow_b; + float defaultHigh_b; + + ToolPanelListener *listener; + bool edited; + bool isDragged; + sigc::connection delayconn; static const int inset = 2; - bool notify_listener(); - + bool notifyListener(); + void getLitPoint(); + public: LabGrid(rtengine::ProcEvent evt); - void get_params(double &la, double &lb, double &ha, double &hb) const; - void set_params(double la, double lb, double ha, double hb, bool notify); - void set_edited(bool yes); - bool get_edited() const; - void set_listener(ToolPanelListener *l); + void getParams(double &la, double &lb, double &ha, double &hb) const; + void setParams(double la, double lb, double ha, double hb, bool notify); + void setDefault (double la, double lb, double ha, double hb); + void setEdited(bool yes); + bool getEdited() const; + void reset(bool toInitial); + void setListener(ToolPanelListener *l); bool on_draw(const ::Cairo::RefPtr &crf); + void on_style_updated (); bool on_button_press_event(GdkEventButton *event); + bool on_button_release_event(GdkEventButton *event); bool on_motion_notify_event(GdkEventMotion *event); Gtk::SizeRequestMode get_request_mode_vfunc() const; void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 5355c88da..b124eddfc 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -1540,9 +1540,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.colorToning.bluehigh = dontforceSet && options.baBehav[ADDSET_COLORTONING_SPLIT] ? toEdit.colorToning.bluehigh + mods.colorToning.bluehigh : mods.colorToning.bluehigh; } - if (colorToning.labgridALow) { - toEdit.colorToning.labgridALow = mods.colorToning.labgridALow; - } if (colorToning.labgridALow) { toEdit.colorToning.labgridALow = mods.colorToning.labgridALow; } From 2523983776085aeae1cbd86619d81134645f2fe8 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 14 Jan 2018 00:34:22 +0100 Subject: [PATCH 148/200] LabGrid was disfunctional in BatchEditing (reported in PR #4301) --- rtgui/labgrid.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 079b3290f..945073221 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -237,6 +237,8 @@ bool LabGrid::on_button_press_event(GdkEventButton *event) break; } edited = true; + notifyListener(); + queue_draw(); } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { isDragged = true; } @@ -277,6 +279,7 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) high_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; high_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; } + edited = true; grab_focus(); if (options.adjusterMinDelay == 0) { notifyListener(); From b762804b809889e8e1fd81a244820d2e3d27cdd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sun, 14 Jan 2018 10:32:48 +0100 Subject: [PATCH 149/200] Fix clang build (fixes #4303) --- rtengine/ipresize.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index c62ff0bc9..ba559b2a0 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -105,7 +105,10 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca float y0 = (static_cast (i) + 0.5f) * delta - 0.5f; // weights for interpolation in y direction - float w[support] = {}; + float w[support]; + for (auto& f : w) { + f = 0.f; + } // sum of weights used for normalization float ws = 0.0f; From cbcb0963394276734023111bc72bf40cd51cd2fd Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 14 Jan 2018 13:41:09 +0100 Subject: [PATCH 150/200] Fixing #4300: "RawTherapee theme bug when editing node in/out values" --- rtgui/coordinateadjuster.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rtgui/coordinateadjuster.cc b/rtgui/coordinateadjuster.cc index c91ced052..209ef0902 100644 --- a/rtgui/coordinateadjuster.cc +++ b/rtgui/coordinateadjuster.cc @@ -135,7 +135,11 @@ void CoordinateAdjuster::createWidgets(const std::vector &axis) box->attach_next_to(*(currAdjuster->spinButton), Gtk::POS_LEFT, 1, 1); box->attach_next_to(*(currAdjuster->label), Gtk::POS_LEFT, 1, 1); - add(*box); + Gtk::FlowBoxChild *fbChild = Gtk::manage(new Gtk::FlowBoxChild()); + fbChild->set_can_focus(false); + fbChild->add(*box); + + add(*fbChild); } } From a618e3dc7b4f5b67d0ee59ae8ba097100a5d0a4c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 14 Jan 2018 16:18:23 +0100 Subject: [PATCH 151/200] Speedup for Colour toning methods 'Colour Balance' and 'Saturation 2 colours' --- rtengine/improcfun.cc | 487 ++++++++++++++++-------------------------- 1 file changed, 190 insertions(+), 297 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 470164ea5..312494fd2 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -3514,15 +3514,15 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } */ - float RedLow = (100.f + float (params->colorToning.redlow)) / 100.f; //printf("Rel=%f\n",RedLow); - float GreenLow = (100.f + float (params->colorToning.greenlow)) / 100.f; //printf("Gre=%f\n",GreenLow); - float BlueLow = (100.f + float (params->colorToning.bluelow)) / 100.f; //printf("Blu=%f\n",BlueLow); - float RedMed = (100.f + float (params->colorToning.redmed)) / 100.f; - float GreenMed = (100.f + float (params->colorToning.greenmed)) / 100.f; - float BlueMed = (100.f + float (params->colorToning.bluemed)) / 100.f; - float RedHigh = (100.f + float (params->colorToning.redhigh)) / 100.f; //printf("RedH=%f\n",RedHigh); - float GreenHigh = (100.f + float (params->colorToning.greenhigh)) / 100.f; - float BlueHigh = (100.f + float (params->colorToning.bluehigh)) / 100.f; + float RedLow = params->colorToning.redlow / 100.f; + float GreenLow = params->colorToning.greenlow / 100.f; + float BlueLow = params->colorToning.bluelow / 100.f; + float RedMed = params->colorToning.redmed / 100.f; + float GreenMed = params->colorToning.greenmed / 100.f; + float BlueMed = params->colorToning.bluemed / 100.f; + float RedHigh = params->colorToning.redhigh / 100.f; + float GreenHigh = params->colorToning.greenhigh / 100.f; + float BlueHigh = params->colorToning.bluehigh / 100.f; float SatLow = float (params->colorToning.shadowsColSat.getBottom()) / 100.f; float SatHigh = float (params->colorToning.hlColSat.getBottom()) / 100.f; @@ -4016,8 +4016,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float rl, gl, bl; float xh, yh, zh; float xl, yl, zl; - const float iplow = (float)ctColorCurve.low; - const float iphigh = (float)ctColorCurve.high; + const float iplow = ctColorCurve.low; + const float iphigh = ctColorCurve.high; //2 colours ctColorCurve.getVal (iphigh, xh, yh, zh); ctColorCurve.getVal (iplow, xl, yl, zl); @@ -4033,70 +4033,42 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float krh = rh / (rh + gh + bh); const float kgh = gh / (rh + gh + bh); const float kbh = bh / (rh + gh + bh); - + strProtect = pow_F(strProtect, 0.4f); + constexpr int mode = 0; for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - int mode = 0; toning2col(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } } - // color toning with colour + // colour toning with colour else if (params->colorToning.method == "Splitco") { - /* - #if 1 - for (int i=istart,ti=0; i crash - gtemp[ti*TS+tj] = CLIP(go); - btemp[ti*TS+tj] = CLIP(bo); - } - } - #else - */ - float reducac = 0.3f; - int preser = 0; - - //bool execbal = params->colorToning.method=="Splitbal"; - if (params->colorToning.lumamode) { - preser = 1; - } - + constexpr float reducac = 0.3f; + constexpr int mode = 0; + strProtect = pow_F(strProtect, 0.4f); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float r = rtemp[ti * TS + tj]; + const float g = gtemp[ti * TS + tj]; + const float b = btemp[ti * TS + tj]; float ro, go, bo; - int mode = 0; - toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; - float preserv = 1.f; + toningsmh(r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - if (preser == 1) { - preserv = lumbefore / lumafter; + if (params->colorToning.lumamode) { + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; + const float preserv = lumbefore / lumafter; + ro *= preserv; + go *= preserv; + bo *= preserv; } - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); - rtemp[ti * TS + tj] = ro; - gtemp[ti * TS + tj] = go; - btemp[ti * TS + tj] = bo; + rtemp[ti * TS + tj] = CLIP(ro); + gtemp[ti * TS + tj] = CLIP(go); + btemp[ti * TS + tj] = CLIP(bo); } } - -//#endif } //colortoning with shift color XYZ or Lch @@ -4676,69 +4648,41 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - //colortoning with black and white + //colour toning with black and white if (hasColorToning) { if (params->colorToning.method == "Splitco") { - /* - #if 1 - for (int i=istart,ti=0; i crash - gtemp[ti*TS+tj] = CLIP(go); - btemp[ti*TS+tj] = CLIP(bo); - } - } - #else - */ - int preser = 0; - - if (params->colorToning.lumamode) { - preser = 1; - } - - float reducac = 0.3f; + constexpr float reducac = 0.5f; + constexpr int mode = 1; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); + const float r = tmpImage->r (i, j); + const float g = tmpImage->g (i, j); + const float b = tmpImage->b (i, j); - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; - if (lumbefore < 65000.f && lumbefore > 500.f) { //reduct artifacts for highlights an extrem shadows + if (lumbefore < 65000.f && lumbefore > 500.f) { //reduce artefacts for highlights and extreme shadows float ro, go, bo; - int mode = 1; - toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; - float preserv = 1.f; + toningsmh(r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - if (preser == 1) { - preserv = lumbefore / lumafter; + if (params->colorToning.lumamode) { + const float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; + const float preserv = lumbefore / lumafter; + ro *= preserv; + go *= preserv; + bo *= preserv; } - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); - tmpImage->r (i, j) = ro; - tmpImage->g (i, j) = go; - tmpImage->b (i, j) = bo; + tmpImage->r(i, j) = CLIP(ro); + tmpImage->g(i, j) = CLIP(go); + tmpImage->b(i, j) = CLIP(bo); } } } - -//#endif } else if (params->colorToning.method == "Splitlr") { @@ -4775,14 +4719,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float krh = rh / (rh + gh + bh); const float kgh = gh / (rh + gh + bh); const float kbh = bh / (rh + gh + bh); - + strProtect = pow_F(strProtect, 0.4f); + constexpr int mode = 1; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - int mode = 1; toning2col(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } @@ -5031,130 +4975,101 @@ void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, flo * @param ro red output values [0..65535] * @param go green output values [0..65535] * @param bo blue output values [0..65535] -* @param RedLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param GreenLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param BlueLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param RedMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param GreenMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param BlueMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param RedHigh [0..1] value after transformations of sliders [-100..100] for highlights -* @param GreenHigh [0..1] value after transformations of sliders [-100..100] for highlights -* @param BlueHigh [0..1] value after transformations of sliders [-100..100] for highlights +* @param RedLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param GreenLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param BlueLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param RedMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param GreenMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param BlueMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param RedHigh [-1..1] value after transformations of sliders [-100..100] for highlights +* @param GreenHigh [-1..1] value after transformations of sliders [-100..100] for highlights +* @param BlueHigh [-1..1] value after transformations of sliders [-100..100] for highlights * @param reducac value of the reduction in the middle of the range for second degree increse or decrease action -* @param mode ? -* @param preser whether to preserve luminance (if 1) or not +* @param mode 0 = colour, 1 = Black and White +* @param strProtect ? **/ -void ImProcFunctions::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, float strProtect) +void ImProcFunctions::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, float strProtect) { - float bmu = mode == 1 ? 0.5f : 0.4f; - float RedL = 1.f + (RedLow - 1.f) * 0.4f; - float GreenL = 1.f + (GreenLow - 1.f) * 0.4f; - float BlueL = 1.f + (BlueLow - 1.f) * bmu; - float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - float ksat = 1.f; - float ksatlow = 1.f; -// float s_0=0.55f; -// float s_1=0.85f; - /* - if(mode==0) {//color - if(s < s_0) ksat=SQR((1.f/s_0)*s); - if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); - } - */ + const float v = max(r, g, b) / 65535.f; float kl = 1.f; - float rlo = 1.f; //0.4 0.5 - float rlm = 1.5f; //1.1 - float rlh = 2.2f; //1.1 - float rlob = bmu; //for BW old mode + float rlo; //0.4 0.5 + float rlm; //1.1 + float rlh; //1.1 + float rlob; //for BW old mode - if (mode == 0) { //color - rlo *= pow_F (strProtect, 0.4f); //0.5 ==> 0.75 - rlh *= pow_F (strProtect, 0.4f); - rlm *= pow_F (strProtect, 0.4f); + if (mode == 0) { //colour + rlo = rlob = strProtect; //0.5 ==> 0.75 + rlh = 2.2f * strProtect; + rlm = 1.5f * strProtect; + constexpr float v0 = 0.15f; + //second degree + + if (v > v0) { + float aa, bb, cc; + secondeg_end (reducac, v0, aa, bb, cc); + kl = aa * v * v + bb * v + cc; //verified ==> exact + } else { + float aab, bbb; + secondeg_begin (0.7f, v0, aab, bbb); + kl = aab * v * v + bbb * v; + } } else { //bw coefficient to preserve same results as before for satlimtopacity = 0.5 (default) rlo = strProtect * 0.8f; //0.4 rlob = strProtect; //0.5 rlm = strProtect * 2.2f; //1.1 rlh = strProtect * 2.4f; //1.2 - } - - if (mode == 0) { - rlob = rlo; - } - - - //fixed value of reducac=0.3 - //secondeg_end (reducac, v0, aa, bb, cc); - if (mode == 1) { - reducac = 0.5f; //black and white mode - if (v > 0.15f) { - kl = (-1.f / 0.85f) * v + (1.f) / 0.85f; //Low light ==> decrease action after v=0.15 - } - } else { //color - float v0 = 0.15f; - //second degree - float aa, bb, cc; - secondeg_end (reducac, v0, aa, bb, cc); - float aab, bbb; - secondeg_begin (0.7f, v0, aab, bbb); - - if (v > v0) { - kl = aa * v * v + bb * v + cc; //verified ==> exact - } else if (mode == 0) { - kl = aab * v * v + bbb * v; //ksatlow=ksat; + kl = (-1.f / 0.85f) * v + 1.f / 0.85f; //Low light ==> decrease action after v=0.15 } } - if (RedLow != 1.f) { - RedL = 1.f + (RedLow - 1.f) * kl * ksat * rlo; //0.4 - - if (RedLow >= 1.f) { - g -= 20000.f * (RedL - 1.f) * ksatlow; - b -= 20000.f * (RedL - 1.f) * ksatlow; + { + const float corr = 20000.f * RedLow * kl * rlo; + if (RedLow > 0.f) { + g -= corr; + b -= corr; } else { - r += 20000.f * (RedL - 1.f) * ksatlow; + r += corr; } - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (GreenLow != 1.f) { - GreenL = 1.f + (GreenLow - 1.f) * kl * ksat * rlo; //0.4 - - if (GreenLow >= 1.f) { - r -= 20000.f * (GreenL - 1.f) * ksatlow; - b -= 20000.f * (GreenL - 1.f) * ksatlow; + { + const float corr = 20000.f * GreenLow * kl * rlo; + if (GreenLow > 0.f) { + r -= corr; + b -= corr; } else { - g += 20000.f * (GreenL - 1.f) * ksatlow; + g += corr; } - r = CLIP (r); - b = CLIP (b); - g = CLIP (g); + r = CLIP(r); + b = CLIP(b); + g = CLIP(g); } - if (BlueLow != 1.f) { - BlueL = 1.f + (BlueLow - 1.f) * kl * ksat * rlob; - if (BlueLow >= 1.f) { - r -= 20000.f * (BlueL - 1.f) * ksatlow; - g -= 20000.f * (BlueL - 1.f) * ksatlow; + { + const float corr = 20000.f * BlueLow * kl * rlob; + + if (BlueLow > 0.f) { + r -= corr; + g -= corr; } else { - b += 20000.f * (BlueL - 1.f) * ksatlow; + b += corr; } - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } // mid tones float km; - float v0m = 0.5f; //max action + constexpr float v0m = 0.5f; //max action if (v < v0m) { float aam, bbm; @@ -5168,134 +5083,112 @@ void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go km = aamm * v * v + bbmm * v + ccmm; //verification good } - float RedM = 1.f + (RedMed - 1.f) * rlm; + { + const float RedM = RedMed * km * rlm; - if (RedMed != 1.f) { - RedM = 1.f + (RedMed - 1.f) * km * rlm; - - if (RedMed >= 1.f) { - r += 20000.f * (RedM - 1.f); - g -= 10000.f * (RedM - 1.f); - b -= 10000.f * (RedM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + if (RedMed > 0.f) { + r += 20000.f * RedM; + g -= 10000.f * RedM; + b -= 10000.f * RedM; } else { - r += 10000.f * (RedM - 1.f); - g -= 20000.f * (RedM - 1.f); - b -= 20000.f * (RedM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r += 10000.f * RedM; + g -= 20000.f * RedM; + b -= 20000.f * RedM; } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float GreenM = 1.f + (GreenMed - 1.f) * rlm; + { + const float GreenM = GreenMed * km * rlm; - if (GreenMed != 1.f) { - GreenM = 1.f + (GreenMed - 1.f) * km * rlm; - - if (GreenMed >= 1.f) { - r -= 10000.f * (GreenM - 1.f); - g += 20000.f * (GreenM - 1.f); - b -= 10000.f * (GreenM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + if (GreenMed > 0.f) { + r -= 10000.f * GreenM; + g += 20000.f * GreenM; + b -= 10000.f * GreenM; } else { - r -= 20000.f * (GreenM - 1.f); - g += 10000.f * (GreenM - 1.f); - b -= 20000.f * (GreenM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r -= 20000.f * GreenM; + g += 10000.f * GreenM; + b -= 20000.f * GreenM; } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float BlueM = 1.f + (BlueMed - 1.f) * rlm; + { + const float BlueM = BlueMed * km * rlm; - if (BlueMed != 1.f) { - BlueM = 1.f + (BlueMed - 1.f) * km * rlm; - - if (BlueMed >= 1.f) { - r -= 10000.f * (BlueM - 1.f); - g -= 10000.f * (BlueM - 1.f); - b += 20000.f * (BlueM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + if (BlueMed > 0.f) { + r -= 10000.f * BlueM; + g -= 10000.f * BlueM; + b += 20000.f * BlueM; } else { - r -= 20000.f * (BlueM - 1.f); - g -= 20000.f * (BlueM - 1.f); - b += 10000.f * (BlueM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r -= 20000.f * BlueM; + g -= 20000.f * BlueM; + b += 10000.f * BlueM; } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } //high tones - float kh; - kh = 1.f; - float v00 = 0.8f; //max action + constexpr float v00 = 0.8f; //max action float aa0, bb0; secondeg_begin (reducac, v00, aa0, bb0); -// float hmu=1.5f; -// if(mode==1) hmu=1.2f;//for BW old mode - if (v > v00) { - kh = (-1.f / (1.f - v00)) * v + (1.f) / (1.f - v00); //High tones + float kh; + if (v > v00) { //max action + kh = (1.f - v) / (1.f - v00); //High tones } else { - kh = aa0 * v * v + bb0 * v; //verification = good + kh = v * (aa0 * v + bb0); //verification = good } - float RedH = 1.f + (RedHigh - 1.f) * rlh; - float GreenH = 1.f + (GreenHigh - 1.f) * rlh; - float BlueH = 1.f + (BlueHigh - 1.f) * rlh; //1.2 + { + const float corr = 20000.f * RedHigh * kh * rlh; //1.2 - if (RedHigh != 1.f) { - RedH = 1.f + (RedHigh - 1.f) * kh * rlh; //1.2 - - if (RedHigh >= 1.f) { - r += 20000.f * (RedH - 1.f); - r = CLIP (r); + if (RedHigh > 0.f) { + r += corr; } else { - g -= 20000.f * (RedH - 1.f); - b -= 20000.f * (RedH - 1.f); + g -= corr; + b -= corr; } - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (GreenHigh != 1.f) { - GreenH = 1.f + (GreenHigh - 1.f) * kh * rlh; //1.2 + { + const float corr = 20000.f * GreenHigh * kh * rlh; //1.2 - if (GreenHigh >= 1.f) { - g += 20000.f * (GreenH - 1.f); - g = CLIP (g); + if (GreenHigh > 0.f) { + g += corr; } else { - r -= 20000.f * (GreenH - 1.f); - b -= 20000.f * (GreenH - 1.f); + r -= corr; + b -= corr; } - r = CLIP (r); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (BlueHigh != 1.f) { - BlueH = 1.f + (BlueHigh - 1.f) * kh * rlh; //1.2 + { + const float corr = 20000.f * BlueHigh * kh * rlh; //1.2 - if (BlueHigh >= 1.f) { - b += 20000.f * (BlueH - 1.f); - b = CLIP (b); + if (BlueHigh > 0.f) { + b += corr; } else { - r -= 20000.f * (BlueH - 1.f); - g -= 20000.f * (BlueH - 1.f); + r -= corr; + g -= corr; } - r = CLIP (r); - g = CLIP (g); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } ro = r; @@ -5320,8 +5213,8 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; const float v = max(r, g, b) / 65535.f; - const float rlo = pow_F (strProtect, 0.4f); //0.5 ==> 0.75 transfered value for more action - const float rlh = 2.2f * pow_F (strProtect, 0.4f); + const float rlo = strProtect; //0.5 ==> 0.75 transfered value for more action + const float rlh = 2.2f * strProtect; //low tones //second degree @@ -5352,24 +5245,24 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g b -= factor * krl; } - g = CLIP (g); - b = CLIP (b); + g = CLIP(g); + b = CLIP(b); if (kgl > 0.f) { r -= factor * kgl; b -= factor * kgl; } - r = CLIP (r); - b = CLIP (b); + r = CLIP(r); + b = CLIP(b); if (kbl > 0.f) { r -= factor * kbl; g -= factor * kbl; } - r = CLIP (r); - g = CLIP (g); + r = CLIP(r); + g = CLIP(g); } //high tones From 3c2e30dbccad414198822006f206cb75e2350137 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 14 Jan 2018 21:36:25 +0100 Subject: [PATCH 152/200] renamed Wavelet tab to Advanced and moved more tools there (see #4298) --- rtdata/languages/default | 6 +++--- rtgui/partialpastedlg.cc | 40 ++++++++++++++++++++-------------------- rtgui/partialpastedlg.h | 6 +++--- rtgui/toolpanelcoord.cc | 26 +++++++++++++------------- rtgui/toolpanelcoord.h | 4 ++-- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ec93fd41e..ccadda440 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -815,6 +815,8 @@ MAIN_MSG_QOVERWRITE;Do you want to overwrite it? MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. 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_ADVANCED;Advanced +MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w MAIN_TAB_COLOR;Color MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c MAIN_TAB_DETAIL;Detail @@ -833,8 +835,6 @@ MAIN_TAB_RAW;Raw MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r MAIN_TAB_TRANSFORM;Transform MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -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 @@ -869,6 +869,7 @@ NAVIGATOR_XY_FULL;Width: %1, Height: %2 NAVIGATOR_XY_NA;x: --, y: -- 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_ADVANCEDGROUP;Advanced Settings PARTIALPASTE_BASICGROUP;Basic Settings PARTIALPASTE_CACORRECTION;Chromatic aberration correction PARTIALPASTE_CHANNELMIXER;Channel mixer @@ -940,7 +941,6 @@ PARTIALPASTE_SHARPENMICRO;Microcontrast PARTIALPASTE_TM_FATTAL;HDR Tone mapping PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Vignetting correction -PARTIALPASTE_WAVELETGROUP;Wavelet Levels PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_ADD;Add PREFERENCES_APPLNEXTSTARTUP;restart required diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 898b6dad5..392da6db3 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -43,8 +43,8 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren meta ->set_name("PartialPasteHeader"); raw = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWGROUP"))); raw ->set_name("PartialPasteHeader"); - wav = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WAVELETGROUP"))); - wav ->set_name("PartialPasteHeader"); + advanced = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP"))); + advanced ->set_name("PartialPasteHeader"); // options in basic: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); @@ -147,11 +147,9 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*pcvignette, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*gradient, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); //DETAIL vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2); @@ -170,7 +168,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[2]->pack_start (*icm, Gtk::PACK_SHRINK, 2); //vboxes[2]->pack_start (*gam, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*vibrance, Gtk::PACK_SHRINK, 2); - vboxes[2]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*hsveq, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*filmSimulation, Gtk::PACK_SHRINK, 2); @@ -197,8 +194,11 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[4]->pack_start (*commonTrans, Gtk::PACK_SHRINK, 2); //WAVELET - vboxes[5]->pack_start (*wav, Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*advanced, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*hseps[5], Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2); //RAW @@ -296,7 +296,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren compositionConn = composition->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::compositionToggled)); metaConn = meta->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::metaToggled)); rawConn = raw->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::rawToggled)); - wavConn = wav->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::wavToggled)); + advancedConn = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled)); wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); @@ -318,7 +318,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); - waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*wav, &Gtk::CheckButton::set_inconsistent), true)); + waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); icmConn = icm->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); //gamcsconn = gam->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); @@ -389,7 +389,7 @@ void PartialPasteDlg::everythingToggled () ConnectionBlocker compositionBlocker(compositionConn); ConnectionBlocker metaBlocker(metaConn); ConnectionBlocker rawBlocker(rawConn); - ConnectionBlocker wavBlocker(wavConn); + ConnectionBlocker advancedBlocker(advancedConn); everything->set_inconsistent (false); @@ -401,7 +401,7 @@ void PartialPasteDlg::everythingToggled () composition->set_active(everything->get_active()); meta->set_active(everything->get_active()); raw->set_active(everything->get_active()); - wav->set_active(everything->get_active()); + advanced->set_active(everything->get_active()); //toggle group children PartialPasteDlg::basicToggled (); @@ -411,7 +411,7 @@ void PartialPasteDlg::everythingToggled () PartialPasteDlg::compositionToggled (); PartialPasteDlg::metaToggled (); PartialPasteDlg::rawToggled (); - PartialPasteDlg::wavToggled (); + PartialPasteDlg::advancedToggled (); } void PartialPasteDlg::rawToggled () @@ -481,9 +481,7 @@ void PartialPasteDlg::basicToggled () ConnectionBlocker fattalBlocker(fattalConn); ConnectionBlocker pcvignetteBlocker(pcvignetteConn); ConnectionBlocker gradientBlocker(gradientConn); - ConnectionBlocker retinexBlocker(retinexConn); ConnectionBlocker labcurveBlocker(labcurveConn); - ConnectionBlocker colorappearanceBlocker(colorappearanceConn); basic->set_inconsistent (false); @@ -495,9 +493,7 @@ void PartialPasteDlg::basicToggled () fattal->set_active (basic->get_active ()); pcvignette->set_active (basic->get_active ()); gradient->set_active (basic->get_active ()); - retinex->set_active (basic->get_active ()); labcurve->set_active (basic->get_active ()); - colorappearance->set_active (basic->get_active ()); } void PartialPasteDlg::detailToggled () @@ -522,13 +518,19 @@ void PartialPasteDlg::detailToggled () dirpyreq->set_active (detail->get_active ()); } -void PartialPasteDlg::wavToggled () +void PartialPasteDlg::advancedToggled () { ConnectionBlocker waveletBlocker(waveletConn); + ConnectionBlocker chmixerBlocker(chmixerConn); + ConnectionBlocker retinexBlocker(retinexConn); + ConnectionBlocker colorappearanceBlocker(colorappearanceConn); - wav->set_inconsistent (false); - wavelet->set_active (wav->get_active ()); + advanced->set_inconsistent (false); + wavelet->set_active (advanced->get_active ()); + chmixer->set_active (color->get_active ()); + retinex->set_active (basic->get_active ()); + colorappearance->set_active (basic->get_active ()); } void PartialPasteDlg::colorToggled () @@ -536,7 +538,6 @@ void PartialPasteDlg::colorToggled () ConnectionBlocker icmBlocker(icmConn); ConnectionBlocker vibranceBlocker(vibranceConn); - ConnectionBlocker chmixerBlocker(chmixerConn); ConnectionBlocker chmixerbwBlocker(chmixerbwConn); ConnectionBlocker hsveqBlocker(hsveqConn); ConnectionBlocker filmSimulationBlocker(filmSimulationConn); @@ -549,7 +550,6 @@ void PartialPasteDlg::colorToggled () icm->set_active (color->get_active ()); //gam->set_active (color->get_active ()); vibrance->set_active (color->get_active ()); - chmixer->set_active (color->get_active ()); blackwhite->set_active (color->get_active ()); hsveq->set_active (color->get_active ()); filmSimulation->set_active (color->get_active ()); diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index d1ae056c3..08e8ed81e 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -39,7 +39,7 @@ public: Gtk::CheckButton* composition; Gtk::CheckButton* meta; Gtk::CheckButton* raw; - Gtk::CheckButton* wav; + Gtk::CheckButton* advanced; // options in basic: Gtk::CheckButton* wb; @@ -123,7 +123,7 @@ public: Gtk::CheckButton* ff_BlurType; Gtk::CheckButton* ff_ClipControl; - sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, wavConn; + sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; sigc::connection wbConn, exposureConn, localcontrastConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn; @@ -147,7 +147,7 @@ public: void compositionToggled (); void metaToggled (); void rawToggled (); - void wavToggled (); + void advancedToggled (); }; #endif diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 7726f9a5e..464aea25b 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -36,7 +36,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan colorPanel = Gtk::manage (new ToolVBox ()); transformPanel = Gtk::manage (new ToolVBox ()); rawPanel = Gtk::manage (new ToolVBox ()); - waveletPanel = Gtk::manage (new ToolVBox ()); + advancedPanel = Gtk::manage (new ToolVBox ()); coarse = Gtk::manage (new CoarsePanel ()); toneCurve = Gtk::manage (new ToneCurve ()); @@ -102,7 +102,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (colorPanel, whitebalance); addPanel (exposurePanel, toneCurve); addPanel (colorPanel, vibrance); - addPanel (colorPanel, chmixer); + addPanel (advancedPanel, chmixer); addPanel (colorPanel, blackwhite); addPanel (exposurePanel, localContrast); addPanel (exposurePanel, shadowshighlights); @@ -115,16 +115,16 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (colorPanel, colortoning); addPanel (exposurePanel, epd); addPanel (exposurePanel, fattal); - addPanel (exposurePanel, retinex); + addPanel (advancedPanel, retinex); addPanel (exposurePanel, pcvignette); addPanel (exposurePanel, gradient); addPanel (exposurePanel, lcurve); - addPanel (exposurePanel, colorappearance); + addPanel (advancedPanel, colorappearance); addPanel (detailsPanel, impulsedenoise); addPanel (detailsPanel, dirpyrdenoise); addPanel (detailsPanel, defringe); addPanel (detailsPanel, dirpyrequalizer); - addPanel (waveletPanel, wavelet); + addPanel (advancedPanel, wavelet); addPanel (transformPanel, crop); addPanel (transformPanel, resize); addPanel (resize->getPackBox(), prsharpening, 2); @@ -161,7 +161,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan colorPanelSW = Gtk::manage (new MyScrolledWindow ()); transformPanelSW = Gtk::manage (new MyScrolledWindow ()); rawPanelSW = Gtk::manage (new MyScrolledWindow ()); - waveletPanelSW = Gtk::manage (new MyScrolledWindow ()); + advancedPanelSW = Gtk::manage (new MyScrolledWindow ()); updateVScrollbars (options.hideTPVScrollbar); // load panel endings @@ -185,9 +185,9 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan colorPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); colorPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); - waveletPanelSW->add (*waveletPanel); - waveletPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - waveletPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); + advancedPanelSW->add (*advancedPanel); + advancedPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + advancedPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); transformPanelSW->add (*transformPanel); transformPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); @@ -204,7 +204,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan toiE = Gtk::manage (new TextOrIcon ("exposure.png", M ("MAIN_TAB_EXPOSURE"), M ("MAIN_TAB_EXPOSURE_TOOLTIP"), type)); toiD = Gtk::manage (new TextOrIcon ("detail.png", M ("MAIN_TAB_DETAIL"), M ("MAIN_TAB_DETAIL_TOOLTIP"), type)); toiC = Gtk::manage (new TextOrIcon ("colour.png", M ("MAIN_TAB_COLOR"), M ("MAIN_TAB_COLOR_TOOLTIP"), type)); - toiW = Gtk::manage (new TextOrIcon ("wavelet.png", M ("MAIN_TAB_WAVELET"), M ("MAIN_TAB_WAVELET_TOOLTIP"), type)); + toiW = Gtk::manage (new TextOrIcon ("wavelet.png", M ("MAIN_TAB_ADVANCED"), M ("MAIN_TAB_ADVANCED_TOOLTIP"), type)); toiT = Gtk::manage (new TextOrIcon ("transform.png", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"), type)); toiR = Gtk::manage (new TextOrIcon ("raw.png", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"), type)); toiM = Gtk::manage (new TextOrIcon ("meta.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"), type)); @@ -212,7 +212,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); toolPanelNotebook->append_page (*colorPanelSW, *toiC); - toolPanelNotebook->append_page (*waveletPanelSW, *toiW); + toolPanelNotebook->append_page (*advancedPanelSW, *toiW); toolPanelNotebook->append_page (*transformPanelSW, *toiT); toolPanelNotebook->append_page (*rawPanelSW, *toiR); toolPanelNotebook->append_page (*metadata, *toiM); @@ -801,7 +801,7 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) return true; case GDK_KEY_w: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*waveletPanelSW)); + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*advancedPanelSW)); return true; case GDK_KEY_m: @@ -822,7 +822,7 @@ void ToolPanelCoordinator::updateVScrollbars (bool hide) colorPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); transformPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); rawPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); - waveletPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); + advancedPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); for (auto currExp : expList) { currExp->updateVScrollbars (hide); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 11f6dfc0a..c6d2e6380 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -160,7 +160,7 @@ protected: ToolVBox* colorPanel; ToolVBox* transformPanel; ToolVBox* rawPanel; - ToolVBox* waveletPanel; + ToolVBox* advancedPanel; ToolBar* toolBar; TextOrIcon* toiE; @@ -179,7 +179,7 @@ protected: Gtk::ScrolledWindow* colorPanelSW; Gtk::ScrolledWindow* transformPanelSW; Gtk::ScrolledWindow* rawPanelSW; - Gtk::ScrolledWindow* waveletPanelSW; + Gtk::ScrolledWindow* advancedPanelSW; std::vector expList; From 24a762c2c23541f581f05e20e0f16b7220d3cddd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 14 Jan 2018 22:34:38 +0100 Subject: [PATCH 153/200] Small improvements for sleef functions --- rtengine/sleef.c | 15 ++++++++++++--- rtengine/sleefsseavx.c | 16 ++-------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/rtengine/sleef.c b/rtengine/sleef.c index f03c9f1b3..901d04f7d 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -12,10 +12,8 @@ #include #include -//#include #include "rt_math.h" -//#include -//#include +#include "opthelper.h" #define PI4_A .7853981554508209228515625 #define PI4_B .794662735614792836713604629039764404296875e-8 @@ -1005,6 +1003,10 @@ __inline float xsinf(float d) { } __inline float xcosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + return xcosf(_mm_set_ss(d))[0]; +#else int q; float u, s; @@ -1027,9 +1029,15 @@ __inline float xcosf(float d) { u = mlaf(s, u * d, d); return u; +#endif } __inline float2 xsincosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + vfloat2 res = xsincosf(_mm_set_ss(d)); + return {res.x[0], res.y[0]}; +#else int q; float u, s, t; float2 r; @@ -1069,6 +1077,7 @@ __inline float2 xsincosf(float d) { if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } return r; +#endif } __inline float xtanf(float d) { diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index e4f587464..dcea09e2b 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -12,10 +12,6 @@ #define SLEEFSSEAVX #include -//#include -//#include -//#include -//#include "sleefsseavx.h" #include "rt_math.h" #ifdef __SSE2__ #include "helpersse2.h" @@ -30,8 +26,6 @@ #define INLINE inline #endif -// - #define PI4_A .7853981554508209228515625 #define PI4_B .794662735614792836713604629039764404296875e-8 #define PI4_C .306161699786838294306516483068750264552437361480769e-16 @@ -41,8 +35,6 @@ #define L2L .28235290563031577122588448175013436025525412068e-12 #define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 -// - #define PI4_Af 0.78515625f #define PI4_Bf 0.00024127960205078125f #define PI4_Cf 6.3329935073852539062e-07f @@ -55,8 +47,6 @@ #define INFINITYf ((float)rtengine::RT_INFINITY) #define NANf ((float)rtengine::RT_NAN) -// - static INLINE vdouble vadd3(vdouble v0, vdouble v1, vdouble v2) { return vadd(vadd(v0, v1), v2); } @@ -1323,10 +1313,8 @@ static INLINE vfloat xexpf(vfloat d) { u = vldexpf(u, q); - u = vself(vmaskf_isminf(d), vcast_vf_f(0.0f), u); -// -104.0 - u = vself(vmaskf_gt(vcast_vf_f(-104), d), vcast_vf_f(0), u); - return u; + // -104.0 + return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), 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 From dbcfc9d91adc16e3f662bbd3af419821316f1f28 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 14 Jan 2018 23:33:20 +0100 Subject: [PATCH 154/200] Really fixing #4300 :-/ "RawTherapee theme bug when editing node in/out values" --- rtdata/themes/RawTherapee-GTK3-20_.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index b0a7ac071..a2fadeca3 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -446,6 +446,11 @@ menuitem { min-height: 10px; } +/* FlowBoxChild */ +flowboxchild:selected { + background-color: inherit; +} + #HistogramPanel { margin: 0; padding: 0; From 3c50e8ff5b3a89855e950f297dee74380ca11068 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 14 Jan 2018 23:47:13 +0100 Subject: [PATCH 155/200] Fattal: remove nondeterminism due to openmp and use a more robust comparison for finding the max luminance Addresses #4306 and at least mitigates it --- rtengine/tmo_fattal02.cc | 42 +++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 055868344..ba59546ce 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -1055,8 +1055,9 @@ inline int find_fast_dim (int dim) { // as per the FFTW docs: // - // FFTW is generally best at handling sizes of the form 2a 3b 5c 7d 11e - // 13f, where e+f is either 0 or 1. + // FFTW is generally best at handling sizes of the form + // 2^a 3^b 5^c 7^d 11^e 13^f, + // where e+f is either 0 or 1. // // Here, we try to round up to the nearest dim that can be expressed in // the above form. This is not exhaustive, but should be ok for pictures @@ -1125,39 +1126,32 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) constexpr float c = 65500.f; return rgb->r(y, x) < c && rgb->g(y, x) < c && rgb->b(y, x) < c; }; + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); float max_Y = 0.f; int max_x = 0, max_y = 0; -#ifdef _OPENMP - #pragma omp parallel if (multiThread) -#endif -{ - float max_YThr = 0.f; - int max_xThr = 0, max_yThr = 0; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait -#endif + const auto biggerY = + [](float cur_Y, float prev_Y) -> bool + { + if (!prev_Y) { + return true; + } + float e = (cur_Y - prev_Y) / max(cur_Y, prev_Y); + return e >= 0.05; + }; + for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels - if (Yr(x, y) > max_YThr && unclipped(y, x)) { - max_YThr = Yr(x, y); - max_xThr = x; - max_yThr = y; + if (biggerY(Yr(x, y), max_Y) && unclipped(y, x)) { + max_Y = Yr(x, y); + max_x = x; + max_y = y; } } } -#ifdef _OPENMP -#pragma omp critical -#endif - if (max_YThr > max_Y) { - max_Y = max_YThr; - max_x = max_xThr; - max_y = max_yThr; - } -} // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() From 656a92cb8e9d65073a6dce0ca9fa67bb03bc4fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 15 Jan 2018 17:54:15 +0100 Subject: [PATCH 156/200] Fix openSUSE build once again (fixes #4307) --- rtgui/colortoning.cc | 8 +++++++- rtgui/colortoning.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 2ca099769..3d3d21d66 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -331,7 +331,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR labgridReset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); labgridReset->set_can_focus(false); labgridReset->set_size_request(-1, 20); - labgridReset->signal_button_release_event().connect([=](GdkEventButton* release_event) { labgrid->reset(release_event->state & GDK_CONTROL_MASK ? true : false); return false; }); + labgridReset->signal_button_release_event().connect(sigc::mem_fun(*this, &ColorToning::resetPressed)); labgridBox->pack_start(*labgridReset, false, false); pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); //------------------------------------------------------------------------ @@ -1165,3 +1165,9 @@ void ColorToning::setBatchMode (bool batchMode) cl2CurveEditorG->setBatchMode (batchMode); } + +bool ColorToning::resetPressed(GdkEventButton* event) +{ + labgrid->reset(event->state & GDK_CONTROL_MASK); + return false; +} diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 588e6ee3b..73ac1dff2 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -53,6 +53,8 @@ public: void setListener(ToolPanelListener *tpl); private: + bool resetPressed(GdkEventButton* event); + //Gtk::HSeparator* satLimiterSep; Gtk::HSeparator* colorSep; CurveEditorGroup* colorCurveEditorG; From db978e360d8ae5cba9031294a5c1f021b654fc5e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 15 Jan 2018 21:53:34 +0100 Subject: [PATCH 157/200] Trying to fix HDR tool (Fattal) produce zoom dependant luminosity #4306 --- rtengine/tmo_fattal02.cc | 51 +++++++--------------------------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index ba59546ce..9f72ba05d 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -648,22 +648,6 @@ void tmo_fattal02 (size_t width, } } } - - // remove percentile of min and max values and renormalize - float cut_min = 0.01f * black_point; - float cut_max = 1.0f - 0.01f * white_point; - assert (cut_min >= 0.0f && (cut_max <= 1.0f) && (cut_min < cut_max)); - findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), cut_min, minLum, cut_max, maxLum, multithread); - float dividor = (maxLum - minLum); - - #pragma omp parallel for if(multithread) - - for (size_t i = 0; i < height; ++i) { - for (size_t j = 0; j < width; ++j) { - L[i][j] = std::max ((L[i][j] - minLum) / dividor, 0.f); - // note, we intentionally do not cut off values > 1.0 - } - } } @@ -1120,39 +1104,20 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) constexpr float epsilon = 1e-4f; constexpr float luminance_noise_floor = 65.535f; constexpr float min_luminance = 1.f; - const auto unclipped = - [rgb](int y, int x) -> bool - { - constexpr float c = 65500.f; - return rgb->r(y, x) < c && rgb->g(y, x) < c && rgb->b(y, x) < c; - }; TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); - float max_Y = 0.f; - int max_x = 0, max_y = 0; - - const auto biggerY = - [](float cur_Y, float prev_Y) -> bool - { - if (!prev_Y) { - return true; - } - float e = (cur_Y - prev_Y) / max(cur_Y, prev_Y); - return e >= 0.05; - }; - +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels - if (biggerY(Yr(x, y), max_Y) && unclipped(y, x)) { - max_Y = Yr(x, y); - max_x = x; - max_y = y; - } } } + float oldMedian; + findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), 0.5f, oldMedian, 0.5f, oldMedian, multiThread); // median filter on the deep shadows, to avoid boosting noise // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() int w2 = find_fast_dim (w) + 1; @@ -1193,7 +1158,9 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float hr = float(h2) / float(h); const float wr = float(w2) / float(w); - const float scale = 65535.f / std::max(L(max_x * wr + 1, max_y * hr + 1), epsilon) * (65535.f / Yr(max_x, max_y)); + float newMedian; + findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), 0.5f, newMedian, 0.5f, newMedian, multiThread); + const float scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if(multiThread) @@ -1204,7 +1171,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) for (int x = 0; x < w; x++) { int xx = x * wr + 1; - float Y = Yr (x, y); + float Y = std::max(Yr (x, y), epsilon); float l = std::max (L (xx, yy), epsilon) * (scale / Y); rgb->r (y, x) = std::max (rgb->r (y, x), 0.f) * l; rgb->g (y, x) = std::max (rgb->g (y, x), 0.f) * l; From de65194b5fd940fbef164757a64412696a60e89f Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 15 Jan 2018 22:25:05 +0100 Subject: [PATCH 158/200] fattal: commented out some unused vars (silence gcc warnings) --- rtengine/tmo_fattal02.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 9f72ba05d..c1cae20f6 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -416,8 +416,8 @@ void tmo_fattal02 (size_t width, // msec_timer stop_watch; // stop_watch.start(); // #endif - static const float black_point = 0.1f; - static const float white_point = 0.5f; + // static const float black_point = 0.1f; + // static const float white_point = 0.5f; static const float gamma = 1.0f; // 0.8f; // static const int detail_level = 3; @@ -452,7 +452,7 @@ void tmo_fattal02 (size_t width, int size = width * height; // find max value, normalize to range 0..100 and take logarithm - float minLum = Y (0, 0); + // float minLum = Y (0, 0); float maxLum = Y (0, 0); #pragma omp parallel for reduction(max:maxLum) if(multithread) From 0a792e2fa1e93486da184738a637d53159ffb70b Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 16 Jan 2018 17:29:17 +0100 Subject: [PATCH 159/200] HDR Tone Mapping sometimes not applied in preview, fixes #4309 --- rtengine/refreshmap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index bfb99942a..88092adfc 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -58,7 +58,7 @@ #define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define AUTOEXP (M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define AUTOEXP (M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) #define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) #define SHARPENING (M_LUMINANCE|M_COLOR) From b32ca3ed2e6ae1d9da1d204a48f38c15aa28e1bf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 16 Jan 2018 18:06:27 +0100 Subject: [PATCH 160/200] Fix old bug. Result is the same as before because FFTW_MEASURE is 0 and FFTW_DESTROY_INPUT is 1 --- rtengine/FTblockDN.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index ddd7e4587..631f45a91 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -763,10 +763,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, 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); + 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); } From c1397446470e2cad95fb1754eca0face28ef5df5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 16 Jan 2018 20:38:29 +0100 Subject: [PATCH 161/200] RT somtimes misinterpretes image orientation of Canon CR2 files, fixes #4293 --- rtengine/dcraw.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index eee4f34c0..4786000bb 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -5497,7 +5497,8 @@ nf: order = 0x4949; for (c=i=2; (ushort) c != 0xbbbb && i < len; i++) c = c << 8 | fgetc(ifp); while ((i+=4) < len-5) - if (get4() == 257 && (i=len) && (c = (get4(),fgetc(ifp))) < 3) + if (get4() == 257 && (i=len) && (c = (get4(),fgetc(ifp))) < 3 && strcmp(make,"Canon")) + // don't use this tag for Canon cameras as it's known to give wrong orientation some times flip = "065"[c]-'0'; } if (tag == 0x10 && type == 4) From f644d41ff22e85773ee6d30ae9469420062bbfcd Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 16 Jan 2018 22:34:29 +0100 Subject: [PATCH 162/200] Remove buggy (unpredictable) automatic setting of HL reconstruction when using Auto levels, fixes #4249 --- rtengine/improccoordinator.cc | 21 +-------------------- rtengine/procparams.cc | 16 ---------------- rtengine/procparams.h | 1 - rtengine/simpleprocess.cc | 10 ---------- 4 files changed, 1 insertion(+), 47 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 765c4b704..87a039a7c 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -199,11 +199,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) imgsrc->preprocess ( rp, params.lensProf, params.coarse ); imgsrc->getRAWHistogram ( histRedRaw, histGreenRaw, histBlueRaw ); - if (highDetailNeeded) { - highDetailPreprocessComputed = true; - } else { - highDetailPreprocessComputed = false; - } + highDetailPreprocessComputed = highDetailNeeded; } /* @@ -269,21 +265,6 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } } - - // Updating toneCurve.hrenabled if necessary - // It has to be done there, because the next 'if' statement will use the value computed here - if (todo & M_AUTOEXP) { - if (params.toneCurve.autoexp) {// this enabled HLRecovery - if (ToneCurveParams::HLReconstructionNecessary (histRedRaw, histGreenRaw, histBlueRaw) && !params.toneCurve.hrenabled) { - // switching params.toneCurve.hrenabled to true -> shouting in listener's ears! - params.toneCurve.hrenabled = true; - - // forcing INIT to be done, to reconstruct HL again - todo |= M_INIT; - } - } - } - if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock (minit); // Also used in crop window diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 80041e706..e1d62bb99 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -357,22 +357,6 @@ bool ToneCurveParams::operator !=(const ToneCurveParams& other) const return !(*this == other); } -bool ToneCurveParams::HLReconstructionNecessary(const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw) -{ - if (options.rtSettings.verbose) { - printf("histRedRaw[ 0]=%07d, histGreenRaw[ 0]=%07d, histBlueRaw[ 0]=%07d\nhistRedRaw[255]=%07d, histGreenRaw[255]=%07d, histBlueRaw[255]=%07d\n", - histRedRaw[0], histGreenRaw[0], histBlueRaw[0], histRedRaw[255], histGreenRaw[255], histBlueRaw[255]); - } - - return - histRedRaw[255] > 50 - || histGreenRaw[255] > 50 - || histBlueRaw[255] > 50 - || histRedRaw[0] > 50 - || histGreenRaw[0] > 50 - || histBlueRaw[0] > 50; -} - RetinexParams::RetinexParams() : enabled(false), cdcurve{ diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7cc80b313..b3f13d00f 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -286,7 +286,6 @@ struct ToneCurveParams { bool operator ==(const ToneCurveParams& other) const; bool operator !=(const ToneCurveParams& other) const; - static bool HLReconstructionNecessary(const LUTu& histRedRaw, const LUTu& histGreenRaw, const LUTu& histBlueRaw); }; /** diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 027600302..ebb591590 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -200,16 +200,6 @@ private: imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); 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); - imgsrc->getRAWHistogram (histRedRaw, histGreenRaw, histBlueRaw); - - if (ToneCurveParams::HLReconstructionNecessary (histRedRaw, histGreenRaw, histBlueRaw) && !params.toneCurve.hrenabled) { - params.toneCurve.hrenabled = true; - // WARNING: Highlight Reconstruction is being forced 'on', should we force a method here too? - } - } - if (pl) { pl->setProgress (0.20); } From bb56d73cc8999fac29e61a2914b3bad1f4b18412 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 01:12:13 +0100 Subject: [PATCH 163/200] started working on proof-of-concept histogram matching --- rtdata/languages/default | 2 + rtengine/CMakeLists.txt | 1 + rtengine/histmatching.cc | 159 ++++++++++++++++++++++++++++++++++ rtengine/iccstore.cc | 1 + rtengine/imagesource.h | 7 ++ rtengine/improccoordinator.cc | 14 +++ rtengine/procparams.cc | 8 +- rtengine/procparams.h | 1 + rtengine/rawimagesource.h | 1 + rtengine/rtengine.h | 2 + rtengine/simpleprocess.cc | 12 ++- rtgui/paramsedited.cc | 6 ++ rtgui/paramsedited.h | 1 + rtgui/tonecurve.cc | 99 +++++++++++++++++++++ rtgui/tonecurve.h | 12 +++ 15 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 rtengine/histmatching.cc diff --git a/rtdata/languages/default b/rtdata/languages/default index 38f357d5a..acf03e48b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -724,6 +724,7 @@ HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast @@ -1552,6 +1553,7 @@ 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_EXPCOMP;Exposure compensation +TP_EXPOSURE_HISTMATCHING;Auto-matched Tone Curve TP_EXPOSURE_LABEL;Exposure TP_EXPOSURE_SATURATION;Saturation TP_EXPOSURE_TCMODE_FILMLIKE;Film-like diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 0ed91f23f..080a76410 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -116,6 +116,7 @@ set(RTENGINESOURCEFILES rtlensfun.cc tmo_fattal02.cc iplocalcontrast.cc + histmatching.cc ) if(LENSFUN_HAS_LOAD_DIRECTORY) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc new file mode 100644 index 000000000..a38ad4687 --- /dev/null +++ b/rtengine/histmatching.cc @@ -0,0 +1,159 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * + * 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 . + */ + +#include "rawimagesource.h" +#include "rtthumbnail.h" +#include "curves.h" +#include "color.h" +#include "rt_math.h" +#include "iccstore.h" +#include "../rtgui/mydiagonalcurve.h" + + +namespace rtengine { + +namespace { + +std::vector getCdf(const IImage8 &img) +{ + std::vector ret(256); + for (int y = 0; y < img.getHeight(); ++y) { + for (int x = 0; x < img.getWidth(); ++x) { + int lum = LIM(0, int(Color::rgbLuminance(float(img.r(y, x)), float(img.g(y, x)), float(img.b(y, x)))), 255); + ++ret[lum]; + } + } + + int sum = 0; + for (size_t i = 0; i < ret.size(); ++i) { + sum += ret[i]; + ret[i] = sum; + } + + return ret; +} + + +int findMatch(int val, const std::vector &cdf, int j) +{ + if (cdf[j] <= val) { + for (; j < cdf.size(); ++j) { + if (cdf[j] == val) { + return j; + } else if (cdf[j] > val) { + return (cdf[j] - val <= val - cdf[j-1] ? j : j-1); + } + } + return 255; + } else { + for (; j >= 0; --j) { + if (cdf[j] == val) { + return j; + } else if (cdf[j] < val) { + return (val - cdf[j] <= cdf[j+1] - val ? j : j+1); + } + } + return 0; + } +} + + +void mappingToCurve(const std::vector &mapping, std::vector &curve) +{ + curve.clear(); + + const int npoints = 20; + int idx = 1; + for (; idx < int(mapping.size()); ++idx) { + if (mapping[idx] >= idx) { + break; + } + } + int step = max(int(mapping.size())/npoints, 1); + + auto coord = [](int v) -> double { return double(v)/255.0; }; + auto doit = + [&](int start, int stop, int step) -> void + { + int prev = start; + for (int i = start; i < stop; ++i) { + int v = mapping[i]; + bool change = i > 0 && v != mapping[i-1]; + int diff = i - prev; + if (change && std::abs(diff - step) <= 1) { + curve.emplace_back(coord(i)); + curve.emplace_back(coord(v)); + prev = i; + } + } + }; + doit(0, idx, idx > step ? step : idx / 2); + doit(idx, int(mapping.size()), step); + if (curve[1] > 0.01) { + curve.insert(curve.begin(), 0.0); + curve.insert(curve.begin(), 0.0); + } + if (curve.back() < 0.99 || (1 - curve[curve.size()-2] > step / 512.0 && curve.back() < coord(mapping.back()))) { + curve.emplace_back(1.0); + curve.emplace_back(coord(mapping.back())); + } + curve.insert(curve.begin(), DCT_Spline); +} + +} // namespace + + +void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) +{ + const int rheight = 200; + RawMetaDataLocation rml; + eSensorType sensor_type; + int w, h; + ProcParams neutral; + std::unique_ptr source; + { + std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); + source.reset(thumb->quickProcessImage(neutral, rheight, TI_Nearest)); + } + std::unique_ptr target; + { + double scale; + std::unique_ptr thumb(Thumbnail::loadFromRaw(getFileName(), rml, sensor_type, w, h, 1, 0.0, false)); + target.reset(thumb->processImage(neutral, sensor_type, rheight, TI_Nearest, getMetaData(), scale)); + } + if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { + Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); + target->resizeImgTo(source->getWidth(), source->getHeight(), TI_Nearest, tmp); + target.reset(tmp); + } + std::vector scdf = getCdf(*source); + std::vector tcdf = getCdf(*target); + + std::vector mapping; + int j = 0; + for (size_t i = 0; i < tcdf.size(); ++i) { + j = findMatch(tcdf[i], scdf, j); + mapping.emplace_back(j); + } + + mappingToCurve(mapping, outCurve); +} + +} // namespace rtengine diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 891fb1600..81d0583ac 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -574,6 +574,7 @@ public: void setDefaultMonitorProfileName(const Glib::ustring &name) { + MyMutex::MyLock lock(mutex); defaultMonitorProfile = name; } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 5a71bb532..675243b65 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -137,6 +137,13 @@ public: histGreenRaw.clear(); histBlueRaw.clear(); // only some sources will supply this } + + // for RAW files, compute a tone curve using histogram matching on the embedded thumbnail + virtual void getAutoMatchedToneCurve(std::vector &outCurve) + { + outCurve = { 0.0 }; + } + double getDirPyrDenoiseExpComp ( ) { return dirpyrdenoiseExpComp; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 765c4b704..c3f00300b 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -464,6 +464,20 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (aeListener) aeListener->autoExpChanged (params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.hrenabled); + } else if (params.toneCurve.histmatching) { + imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); + + params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; + params.toneCurve.curve2 = { 0 }; + params.toneCurve.expcomp = 0.0; + params.toneCurve.brightness = 0; + params.toneCurve.contrast = 0; + params.toneCurve.black = 0; + params.toneCurve.hlcompr = 0; + + if (aeListener) { + aeListener->autoMatchedToneCurveChanged(params.toneCurve.curveMode, params.toneCurve.curve); + } } } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 80041e706..dfce03797 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -327,7 +327,8 @@ ToneCurveParams::ToneCurveParams() : saturation(0), shcompr(50), hlcompr(0), - hlcomprthresh(33) + hlcomprthresh(33), + histmatching(false) { } @@ -349,7 +350,8 @@ bool ToneCurveParams::operator ==(const ToneCurveParams& other) const && saturation == other.saturation && shcompr == other.shcompr && hlcompr == other.hlcompr - && hlcomprthresh == other.hlcomprthresh; + && hlcomprthresh == other.hlcomprthresh + && histmatching == other.histmatching; } bool ToneCurveParams::operator !=(const ToneCurveParams& other) const @@ -2760,6 +2762,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->toneCurve.hlcompr, "Exposure", "HighlightCompr", toneCurve.hlcompr, keyFile); saveToKeyfile(!pedited || pedited->toneCurve.hlcomprthresh, "Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh, keyFile); saveToKeyfile(!pedited || pedited->toneCurve.shcompr, "Exposure", "ShadowCompr", toneCurve.shcompr, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.histmatching, "Exposure", "HistogramMatching", toneCurve.histmatching, keyFile); // Highlight recovery saveToKeyfile(!pedited || pedited->toneCurve.hrenabled, "HLRecovery", "Enabled", toneCurve.hrenabled, keyFile); @@ -3534,6 +3537,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Exposure", "Curve", pedited, toneCurve.curve, pedited->toneCurve.curve); assignFromKeyfile(keyFile, "Exposure", "Curve2", pedited, toneCurve.curve2, pedited->toneCurve.curve2); } + assignFromKeyfile(keyFile, "Exposure", "HistogramMatching", pedited, toneCurve.histmatching, pedited->toneCurve.histmatching); } if (keyFile.has_group ("HLRecovery")) { diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7cc80b313..7cabc3aef 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -280,6 +280,7 @@ struct ToneCurveParams { int shcompr; int hlcompr; // Highlight Recovery's compression int hlcomprthresh; // Highlight Recovery's threshold + bool histmatching; // histogram matching ToneCurveParams(); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index a374ef06e..a199eb13a 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -185,6 +185,7 @@ public: } void getAutoExpHistogram (LUTu & histogram, int& histcompr); void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); + void getAutoMatchedToneCurve(std::vector &outCurve); DCPProfile *getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as); void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 873cfd9bc..eea15c7a3 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -294,6 +294,8 @@ public: * @param hlcomprthresh is the new threshold for hlcompr * @param hlrecons set to true if HighLight Reconstruction is enabled */ virtual void autoExpChanged (double brightness, int bright, int contrast, int black, int hlcompr, int hlcomprthresh, bool hlrecons) {} + + virtual void autoMatchedToneCurveChanged(procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) {} }; class AutoCamListener diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 027600302..01d4922f5 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -749,7 +749,17 @@ private: int aehistcompr; imgsrc->getAutoExpHistogram (aehist, aehistcompr); ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); - } + } else if (params.toneCurve.histmatching) { + imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); + + params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; + params.toneCurve.curve2 = { 0 }; + params.toneCurve.expcomp = 0.0; + params.toneCurve.brightness = 0; + params.toneCurve.contrast = 0; + params.toneCurve.black = 0; + params.toneCurve.hlcompr = 0; + } // at this stage, we can flush the raw data to free up quite an important amount of memory // commented out because it makes the application crash when batch processing... diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index b124eddfc..13afc6faa 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -49,6 +49,7 @@ void ParamsEdited::set (bool v) toneCurve.expcomp = v; toneCurve.hrenabled = v; toneCurve.method = v; + toneCurve.histmatching = v; retinex.cdcurve = v; retinex.mapcurve = v; retinex.cdHcurve = v; @@ -605,6 +606,7 @@ void ParamsEdited::initFrom (const std::vector toneCurve.expcomp = toneCurve.expcomp && p.toneCurve.expcomp == other.toneCurve.expcomp; toneCurve.hrenabled = toneCurve.hrenabled && p.toneCurve.hrenabled == other.toneCurve.hrenabled; toneCurve.method = toneCurve.method && p.toneCurve.method == other.toneCurve.method; + toneCurve.histmatching = toneCurve.histmatching && p.toneCurve.histmatching == other.toneCurve.histmatching; retinex.cdcurve = retinex.cdcurve && p.retinex.cdcurve == other.retinex.cdcurve; retinex.mapcurve = retinex.mapcurve && p.retinex.mapcurve == other.retinex.mapcurve; retinex.cdHcurve = retinex.cdHcurve && p.retinex.cdHcurve == other.retinex.cdHcurve; @@ -1198,6 +1200,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.toneCurve.method = mods.toneCurve.method; } + if (toneCurve.histmatching) { + toEdit.toneCurve.histmatching = mods.toneCurve.histmatching; + } + if (retinex.enabled) { toEdit.retinex.enabled = mods.retinex.enabled; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 6de5d52e4..dfb85d54b 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -53,6 +53,7 @@ public: bool expcomp; bool hrenabled; bool method; + bool histmatching; }; class RetinexParamsEdited diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index a9dd35466..7b07fbb58 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -22,12 +22,15 @@ #include #include "ppversion.h" #include "edit.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LABEL")) { + auto m = ProcEventMapper::getInstance(); + EvHistMatching = m->newEvent(AUTOEXP, "HISTORY_MSG_HISTMATCHING"); CurveListener::setMulti(true); @@ -122,6 +125,10 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA //----------- Curve 1 ------------------------------ pack_start (*Gtk::manage (new Gtk::HSeparator())); + histmatching = Gtk::manage(new Gtk::ToggleButton(M("TP_EXPOSURE_HISTMATCHING"))); + histmatchconn = histmatching->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::histmatchingToggled)); + pack_start(*histmatching, true, true, 2); + toneCurveMode = Gtk::manage (new MyComboBoxText ()); toneCurveMode->append (M("TP_EXPOSURE_TCMODE_STANDARD")); toneCurveMode->append (M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); @@ -226,6 +233,8 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) toneCurveMode->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode)); toneCurveMode2->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode2)); + histmatching->set_active(pp->toneCurve.histmatching); + if (pedited) { expcomp->setEditedState (pedited->toneCurve.expcomp ? Edited : UnEdited); black->setEditedState (pedited->toneCurve.black ? Edited : UnEdited); @@ -248,6 +257,8 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) if (!pedited->toneCurve.curveMode2) { toneCurveMode2->set_active(6); } + + histmatching->set_inconsistent(!pedited->toneCurve.histmatching); } enaconn.block (true); @@ -343,6 +354,8 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::PERCEPTUAL; } + pp->toneCurve.histmatching = histmatching->get_active(); + if (pedited) { pedited->toneCurve.expcomp = expcomp->getEditedState (); pedited->toneCurve.black = black->getEditedState (); @@ -360,6 +373,7 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->toneCurve.curveMode2 = toneCurveMode2->get_active_row_number() != 6; pedited->toneCurve.method = method->get_active_row_number() != 4; pedited->toneCurve.hrenabled = !hrenabled->get_inconsistent(); + pedited->toneCurve.histmatching = !histmatching->get_inconsistent(); } pp->toneCurve.hrenabled = hrenabled->get_active(); @@ -408,6 +422,8 @@ void ToneCurve::hrenabledChanged () autolevels->set_inconsistent (false); } + setHistmatching(false); + if (hrenabled->get_active ()) { listener->panelChanged (EvHREnabled, M("GENERAL_ENABLED")); } else { @@ -419,6 +435,7 @@ void ToneCurve::methodChanged () { if (listener) { + setHistmatching(false); if (hrenabled->get_active ()) { listener->panelChanged (EvHRMethod, method->get_active_text ()); } @@ -471,6 +488,7 @@ void ToneCurve::curveChanged (CurveEditor* ce) { if (listener) { + setHistmatching(false); if (ce == shape) { listener->panelChanged (EvToneCurve1, M("HISTORY_CUSTOMCURVE")); } else if (ce == shape2) { @@ -483,6 +501,7 @@ void ToneCurve::curveMode1Changed () { //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { + setHistmatching(false); Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode1Changed_)); } } @@ -500,6 +519,7 @@ void ToneCurve::curveMode2Changed () { //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { + setHistmatching(false); Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode2Changed_)); } } @@ -544,6 +564,8 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) return; } + setHistmatching(false); + Glib::ustring costr; if (a == expcomp) { @@ -580,6 +602,8 @@ void ToneCurve::neutral_pressed () // This method deselects auto levels and HL reconstruction auto // and sets neutral values to params in exposure panel + setHistmatching(false); + if (batchMode) { autolevels->set_inconsistent (false); autoconn.block (true); @@ -617,6 +641,7 @@ void ToneCurve::neutral_pressed () } void ToneCurve::autolevels_toggled () { + setHistmatching(false); if (batchMode) { if (autolevels->get_inconsistent()) { @@ -727,6 +752,7 @@ void ToneCurve::waitForAutoExp () toneCurveMode2->set_sensitive (false); hrenabled->set_sensitive(false); method->set_sensitive(false); + histmatching->set_sensitive(false); } void ToneCurve::autoExpChanged (double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons) @@ -766,6 +792,7 @@ void ToneCurve::enableAll () toneCurveMode2->set_sensitive (true); hrenabled->set_sensitive(true); method->set_sensitive(true); + histmatching->set_sensitive(true); } bool ToneCurve::autoExpComputed_ () @@ -858,3 +885,75 @@ void ToneCurve::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & his shape->updateBackgroundHistogram (histToneCurve); } + + +void ToneCurve::setHistmatching(bool enabled) +{ + if (histmatching->get_active()) { + histmatchconn.block(true); + histmatching->set_active(enabled); + histmatchconn.block(false); + histmatching->set_inconsistent(false); + } +} + + +void ToneCurve::histmatchingToggled() +{ + if (listener) { + if (histmatching->get_active()) { + listener->panelChanged(EvHistMatching, M("GENERAL_ENABLED")); + waitForAutoExp(); + } else { + listener->panelChanged(EvHistMatching, M("GENERAL_DISABLED")); + } + } +} + + +void ToneCurve::autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) +{ + nextToneCurveMode = curveMode; + nextToneCurve = curve; + + const auto func = [](gpointer data) -> gboolean { + static_cast(data)->histmatchingComputed(); + + return FALSE; + }; + + idle_register.add(func, this); +} + + +bool ToneCurve::histmatchingComputed() +{ + GThreadLock lock; + disableListener(); + enableAll(); + expcomp->setValue(0); + brightness->setValue(0); + contrast->setValue(0); + black->setValue(0); + hlcompr->setValue(0); + + if (!black->getAddMode()) { + shcompr->set_sensitive(!((int)black->getValue() == 0)); + } + + if (autolevels->get_active() ) { + autoconn.block(true); + autolevels->set_active(false); + autoconn.block(false); + autolevels->set_inconsistent(false); + } + + toneCurveMode->set_active(rtengine::toUnderlying(nextToneCurveMode)); + shape->setCurve(nextToneCurve); + shape2->setCurve({ DCT_Linear }); + shape->openIfNonlinear(); + + enableListener(); + + return false; +} diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index 11ec64b96..5aae5f015 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -57,14 +57,18 @@ protected: Adjuster* saturation; MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; + Gtk::ToggleButton *histmatching; bool clipDirty, lastAuto; sigc::connection autoconn, neutralconn, tcmodeconn, tcmode2conn; + sigc::connection histmatchconn; CurveEditorGroup* curveEditorG; CurveEditorGroup* curveEditorG2; DiagonalCurveEditor* shape; DiagonalCurveEditor* shape2; + rtengine::ProcEvent EvHistMatching; + // used temporarily in eventing double nextExpcomp; int nextBrightness; @@ -73,6 +77,10 @@ protected: int nextHlcompr; int nextHlcomprthresh; bool nextHLRecons; + rtengine::procparams::ToneCurveParams::TcMode nextToneCurveMode; + std::vector nextToneCurve; + + void setHistmatching(bool enabled); public: ToneCurve (); @@ -107,6 +115,10 @@ public: bool isCurveExpanded (); void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI); + void histmatchingToggled(); + void autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve); + bool histmatchingComputed(); + void setRaw (bool raw); void hrenabledChanged (); From 52957e9eabc9c56c47e965cdfee0cfd6a4f38a02 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 01:41:28 +0100 Subject: [PATCH 164/200] further experiments with histogram matching --- rtengine/histmatching.cc | 13 ++++++++++--- rtengine/rtthumbnail.cc | 11 ++++++++--- rtengine/rtthumbnail.h | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index a38ad4687..6d8856958 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -79,7 +79,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) { curve.clear(); - const int npoints = 20; + const int npoints = 8; int idx = 1; for (; idx < int(mapping.size()); ++idx) { if (mapping[idx] >= idx) { @@ -133,10 +133,17 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) source.reset(thumb->quickProcessImage(neutral, rheight, TI_Nearest)); } std::unique_ptr target; - { + if (true) { + neutral.icm.working = "RT_sRGB"; + // faster, but has problems likely due to color space transformations that I do not properly understand... double scale; std::unique_ptr thumb(Thumbnail::loadFromRaw(getFileName(), rml, sensor_type, w, h, 1, 0.0, false)); - target.reset(thumb->processImage(neutral, sensor_type, rheight, TI_Nearest, getMetaData(), scale)); + target.reset(thumb->processImage(neutral, sensor_type, rheight, TI_Nearest, getMetaData(), scale, false)); + } else { + ProcessingJob *job = ProcessingJob::create(this, neutral, true); + int err = 0; + std::unique_ptr tmp(processImage(job, err, nullptr, false)); + target.reset(static_cast(tmp.get())->to8()); } if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index e84214bd4..59d19cc15 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -915,7 +915,7 @@ IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int } // Full thumbnail processing, second stage if complete profile exists -IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale) +IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale, bool forMonitor) { unsigned int imgNum = 0; if (isRaw) { @@ -1293,8 +1293,13 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT //ipf.colorCurve (labView, labView); // obtain final image - Image8* readyImg = new Image8 (fw, fh); - ipf.lab2monitorRgb (labView, readyImg); + Image8* readyImg = nullptr; + if (forMonitor) { + readyImg = new Image8 (fw, fh); + ipf.lab2monitorRgb (labView, readyImg); + } else { + readyImg = ipf.lab2rgb(labView, 0, 0, fw, fh, params.icm); + } delete labView; delete baseImg; diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 2ee08de50..902f264fc 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -71,7 +71,7 @@ public: void init (); - IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale); + IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale, bool forMonitor=true); IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp); int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio); void getDimensions (int& w, int& h, double& scaleFac); From 53ec11eea9520f78fb47cb3afdf8413643fce8c4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 17 Jan 2018 20:39:01 +0100 Subject: [PATCH 165/200] Cleanup fftw when closing RT, instead of after each time fftw is used. Speeds up fattal and luminance denoise --- rtengine/FTblockDN.cc | 3 ++- rtengine/init.cc | 8 +++++++- rtengine/tmo_fattal02.cc | 12 ------------ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 631f45a91..aec11e59b 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -41,6 +41,7 @@ #ifdef _OPENMP #include #endif +#include "StopWatch.h" #define TS 64 // Tile size #define offset 25 // shift between tiles @@ -475,6 +476,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 &nresi, float &highresi) { +BENCHFUN //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -1781,7 +1783,6 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef 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); diff --git a/rtengine/init.cc b/rtengine/init.cc index 8d2cf9174..0d4560c6b 100644 --- a/rtengine/init.cc +++ b/rtengine/init.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 "../rtgui/profilestorecombobox.h" #include "rtengine.h" #include "iccstore.h" @@ -108,10 +109,15 @@ int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDi void cleanup () { - ProcParams::cleanup (); Color::cleanup (); RawImageSource::cleanup (); +#ifdef RT_FFTW3F_OMP + fftwf_cleanup_threads(); +#else + fftwf_cleanup(); +#endif + } StagedImageProcessor* StagedImageProcessor::create (InitialImage* initialImage) diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index c1cae20f6..c5e7c407f 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -907,18 +907,6 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* for (int i = 0; i < width * height; i++) { (*U) (i) -= max; } - - // fft parallel threads cleanup, better handled outside this function? -#ifdef RT_FFTW3F_OMP - - if (multithread) { - fftwf_cleanup_threads(); - } - -#endif - - // ph.setValue(90); - //DEBUG_STR << "solve_pde_fft: done" << std::endl; } From bc89e24ab7e1f467448a21c795bc67e6495a0c39 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 21:16:22 +0100 Subject: [PATCH 166/200] working version -- yay! --- rtengine/histmatching.cc | 49 ++++++++++++++++++++++------------- rtengine/improccoordinator.cc | 3 ++- rtengine/simpleprocess.cc | 3 ++- rtgui/tonecurve.cc | 14 +++++++--- rtgui/tonecurve.h | 1 + 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 6d8856958..8b506432d 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -25,6 +25,7 @@ #include "rt_math.h" #include "iccstore.h" #include "../rtgui/mydiagonalcurve.h" +#include "improcfun.h" namespace rtengine { @@ -54,7 +55,7 @@ std::vector getCdf(const IImage8 &img) int findMatch(int val, const std::vector &cdf, int j) { if (cdf[j] <= val) { - for (; j < cdf.size(); ++j) { + for (; j < int(cdf.size()); ++j) { if (cdf[j] == val) { return j; } else if (cdf[j] > val) { @@ -123,27 +124,39 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) { const int rheight = 200; - RawMetaDataLocation rml; - eSensorType sensor_type; - int w, h; ProcParams neutral; + std::unique_ptr target; + { + int tr = TR_NONE; + int fw, fh; + getFullSize(fw, fh, tr); + int skip = fh / rheight; + PreviewProps pp(0, 0, fw, fh, skip); + ColorTemp currWB = getWB(); + std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); + neutral.raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::FAST); + neutral.raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FAST); + getImage(currWB, tr, image.get(), pp, neutral.toneCurve, neutral.raw); + + // this could probably be made faster -- ideally we would need to just + // perform the transformation from camera space to the output space + // (taking gamma into account), but I couldn't find anything + // ready-made, so for now this will do. Remember the famous quote: + // "premature optimization is the root of all evil" :-) + convertColorSpace(image.get(), neutral.icm, currWB); + ImProcFunctions ipf(&neutral); + LabImage tmplab(image->getWidth(), image->getHeight()); + ipf.rgb2lab(*image, tmplab, neutral.icm.working); + image.reset(ipf.lab2rgbOut(&tmplab, 0, 0, tmplab.W, tmplab.H, neutral.icm)); + target.reset(image->to8()); + } std::unique_ptr source; { + RawMetaDataLocation rml; + eSensorType sensor_type; + int w, h; std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); - source.reset(thumb->quickProcessImage(neutral, rheight, TI_Nearest)); - } - std::unique_ptr target; - if (true) { - neutral.icm.working = "RT_sRGB"; - // faster, but has problems likely due to color space transformations that I do not properly understand... - double scale; - std::unique_ptr thumb(Thumbnail::loadFromRaw(getFileName(), rml, sensor_type, w, h, 1, 0.0, false)); - target.reset(thumb->processImage(neutral, sensor_type, rheight, TI_Nearest, getMetaData(), scale, false)); - } else { - ProcessingJob *job = ProcessingJob::create(this, neutral, true); - int err = 0; - std::unique_ptr tmp(processImage(job, err, nullptr, false)); - target.reset(static_cast(tmp.get())->to8()); + source.reset(thumb->quickProcessImage(neutral, target->getHeight(), TI_Nearest)); } if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c3f00300b..b4edab549 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -466,7 +466,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.hrenabled); } else if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - + + params.toneCurve.histmatching = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 01d4922f5..7b636797e 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -751,7 +751,8 @@ private: ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } else if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - + + params.toneCurve.histmatching = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 7b07fbb58..0d753dcbf 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -31,6 +31,7 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA { auto m = ProcEventMapper::getInstance(); EvHistMatching = m->newEvent(AUTOEXP, "HISTORY_MSG_HISTMATCHING"); + EvHistMatchingBatch = m->newEvent(M_VOID, "HISTORY_MSG_HISTMATCHING"); CurveListener::setMulti(true); @@ -901,11 +902,15 @@ void ToneCurve::setHistmatching(bool enabled) void ToneCurve::histmatchingToggled() { if (listener) { - if (histmatching->get_active()) { - listener->panelChanged(EvHistMatching, M("GENERAL_ENABLED")); - waitForAutoExp(); + if (!batchMode) { + if (histmatching->get_active()) { + listener->panelChanged(EvHistMatching, M("GENERAL_ENABLED")); + waitForAutoExp(); + } else { + listener->panelChanged(EvHistMatching, M("GENERAL_DISABLED")); + } } else { - listener->panelChanged(EvHistMatching, M("GENERAL_DISABLED")); + listener->panelChanged(EvHistMatchingBatch, histmatching->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } } @@ -948,6 +953,7 @@ bool ToneCurve::histmatchingComputed() autolevels->set_inconsistent(false); } + histmatching->set_active(false); toneCurveMode->set_active(rtengine::toUnderlying(nextToneCurveMode)); shape->setCurve(nextToneCurve); shape2->setCurve({ DCT_Linear }); diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index 5aae5f015..e85fefa39 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -68,6 +68,7 @@ protected: DiagonalCurveEditor* shape2; rtengine::ProcEvent EvHistMatching; + rtengine::ProcEvent EvHistMatchingBatch; // used temporarily in eventing double nextExpcomp; From 942da71ef099327235236a12a3bde983a67de87c Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 22:02:12 +0100 Subject: [PATCH 167/200] added some verbosity in RawImageSource::getAutoMatchedToneCurve --- rtengine/histmatching.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 8b506432d..4be81ad8a 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -26,10 +26,15 @@ #include "iccstore.h" #include "../rtgui/mydiagonalcurve.h" #include "improcfun.h" +#define BENCHMARK +#include "StopWatch.h" +#include namespace rtengine { +extern const Settings *settings; + namespace { std::vector getCdf(const IImage8 &img) @@ -123,6 +128,12 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) { + BENCHFUN + + if (settings->verbose) { + std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; + } + const int rheight = 200; ProcParams neutral; std::unique_ptr target; @@ -149,6 +160,10 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) ipf.rgb2lab(*image, tmplab, neutral.icm.working); image.reset(ipf.lab2rgbOut(&tmplab, 0, 0, tmplab.W, tmplab.H, neutral.icm)); target.reset(image->to8()); + + if (settings->verbose) { + std::cout << "histogram matching: generated neutral rendering" << std::endl; + } } std::unique_ptr source; { @@ -157,6 +172,10 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) int w, h; std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); source.reset(thumb->quickProcessImage(neutral, target->getHeight(), TI_Nearest)); + + if (settings->verbose) { + std::cout << "histogram matching: extracted embedded thumbnail" << std::endl; + } } if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); @@ -174,6 +193,10 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) } mappingToCurve(mapping, outCurve); + + if (settings->verbose) { + std::cout << "histogram matching: generated curve with " << outCurve.size()/2 << " control points" << std::endl; + } } } // namespace rtengine From 7bcc8ae2369b6b07149a69b001dbc328a7824989 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 22:25:32 +0100 Subject: [PATCH 168/200] removed useless lines --- rtengine/histmatching.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 4be81ad8a..43f73b811 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -145,8 +145,6 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) PreviewProps pp(0, 0, fw, fh, skip); ColorTemp currWB = getWB(); std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); - neutral.raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::FAST); - neutral.raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FAST); getImage(currWB, tr, image.get(), pp, neutral.toneCurve, neutral.raw); // this could probably be made faster -- ideally we would need to just From 931ee9562049496e8fd8b32ca8a573461d3ed033 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 17 Jan 2018 23:09:49 +0100 Subject: [PATCH 169/200] use a relative height (10% of the full height) instead of an absolute one in histogram matching --- rtengine/histmatching.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 43f73b811..2aea9f3c8 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -134,14 +134,13 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; } - const int rheight = 200; ProcParams neutral; std::unique_ptr target; { int tr = TR_NONE; int fw, fh; getFullSize(fw, fh, tr); - int skip = fh / rheight; + int skip = 10; PreviewProps pp(0, 0, fw, fh, skip); ColorTemp currWB = getWB(); std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); From abfeb4ca1d01312ffbaacf141350d0d3e59404e6 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 18 Jan 2018 14:17:51 +0100 Subject: [PATCH 170/200] fixed crashes in histogram matching --- rtengine/histmatching.cc | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 2aea9f3c8..cd7352980 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -96,31 +96,35 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) auto coord = [](int v) -> double { return double(v)/255.0; }; auto doit = - [&](int start, int stop, int step) -> void + [&](int start, int stop, int step, bool addstart) -> void { int prev = start; + if (addstart) { + curve.push_back(coord(start)); + curve.push_back(coord(mapping[start])); + } for (int i = start; i < stop; ++i) { int v = mapping[i]; bool change = i > 0 && v != mapping[i-1]; int diff = i - prev; if (change && std::abs(diff - step) <= 1) { - curve.emplace_back(coord(i)); - curve.emplace_back(coord(v)); + curve.push_back(coord(i)); + curve.push_back(coord(v)); prev = i; } } }; - doit(0, idx, idx > step ? step : idx / 2); - doit(idx, int(mapping.size()), step); - if (curve[1] > 0.01) { - curve.insert(curve.begin(), 0.0); - curve.insert(curve.begin(), 0.0); - } - if (curve.back() < 0.99 || (1 - curve[curve.size()-2] > step / 512.0 && curve.back() < coord(mapping.back()))) { + doit(0, idx, idx > step ? step : idx / 2, true); + doit(idx, int(mapping.size()), step, idx - step > step / 2); + if (curve.size() <= 2 || curve.back() < 0.99 || (1 - curve[curve.size()-2] > step / 512.0 && curve.back() < coord(mapping.back()))) { curve.emplace_back(1.0); curve.emplace_back(coord(mapping.back())); } - curve.insert(curve.begin(), DCT_Spline); + if (curve.size() < 4) { + curve = { DCT_Linear }; // not enough points, fall back to linear + } else { + curve.insert(curve.begin(), DCT_Spline); + } } } // namespace @@ -133,6 +137,8 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (settings->verbose) { std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; } + + outCurve = { DCT_Linear }; ProcParams neutral; std::unique_ptr target; @@ -168,6 +174,12 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) eSensorType sensor_type; int w, h; std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); + if (!thumb) { + if (settings->verbose) { + std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; + } + return; + } source.reset(thumb->quickProcessImage(neutral, target->getHeight(), TI_Nearest)); if (settings->verbose) { @@ -186,7 +198,7 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) int j = 0; for (size_t i = 0; i < tcdf.size(); ++i) { j = findMatch(tcdf[i], scdf, j); - mapping.emplace_back(j); + mapping.push_back(j); } mappingToCurve(mapping, outCurve); From 7b3e9f7b7a0ff7cbc4999fa6c8d0809d0aedbee1 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 18 Jan 2018 17:55:14 +0100 Subject: [PATCH 171/200] fixed bad interaction between auto levels and histogram matching --- rtengine/improccoordinator.cc | 3 ++- rtengine/simpleprocess.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 37241bbe0..75fc81e9f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -445,7 +445,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (aeListener) aeListener->autoExpChanged (params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.hrenabled); - } else if (params.toneCurve.histmatching) { + } + if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); params.toneCurve.histmatching = false; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 2910b6b43..0bd784e45 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -739,7 +739,8 @@ private: int aehistcompr; imgsrc->getAutoExpHistogram (aehist, aehistcompr); ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); - } else if (params.toneCurve.histmatching) { + } + if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); params.toneCurve.histmatching = false; From 8ee87011416526f311c67e1c2f16acba44537339 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 18 Jan 2018 19:49:05 +0100 Subject: [PATCH 172/200] Detail windows broken at higher zoom levels, #4224 --- rtgui/crophandler.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index f6ff83a7d..0abff627b 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -426,11 +426,11 @@ bool CropHandler::getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip) cwh = cropH; // hack: if called before first size allocation the size will be 0 - if (cww < 10) { + if (cww == 0) { cww = 10; } - if (cwh < 32) { + if (cwh == 0) { cwh = 32; } From 8622efce00f6f0be7ba77e0ab605a54f3f03f75d Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 18 Jan 2018 19:53:18 +0100 Subject: [PATCH 173/200] Crash opening dng file from hdrmerge, fixes #4313 --- rtengine/rawimagesource.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index a8d94b638..4c777a30e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -4737,21 +4737,22 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU } // end of critical region } // end of parallel region + constexpr float gammaLimit = 32767.f * 65536.f; // Color::gamma overflows when the LUT is accessed with too large values for(int i = 0; i < 65536; i++) { int idx; - idx = CLIP((int)Color::gamma(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)), gammaLimit))); histRedRaw[idx >> 8] += hist[0][i]; if (ri->get_colors() > 1) { - idx = CLIP((int)Color::gamma(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)), gammaLimit))); histGreenRaw[idx >> 8] += hist[1][i]; if (fourColours) { - idx = CLIP((int)Color::gamma(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)), gammaLimit))); histGreenRaw[idx >> 8] += hist[3][i]; } - idx = CLIP((int)Color::gamma(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)), gammaLimit))); histBlueRaw[idx >> 8] += hist[2][i]; } } From 4feb663f633bb3becc23704c0414aa2bd74c7d01 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 18 Jan 2018 23:36:03 +0100 Subject: [PATCH 174/200] histogram matching: handle the case in which the thumbnail and the raw have different aspect ratios --- rtengine/histmatching.cc | 77 +++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index cd7352980..71bdffc58 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -29,6 +29,7 @@ #define BENCHMARK #include "StopWatch.h" #include +#include namespace rtengine { @@ -139,18 +140,62 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) } outCurve = { DCT_Linear }; - + + int fw, fh; + getFullSize(fw, fh, TR_NONE); + int skip = 10; + + if (settings->verbose) { + std::cout << "histogram matching: full raw image size is " << fw << "x" << fh << std::endl; + } + ProcParams neutral; + + std::unique_ptr source; + { + RawMetaDataLocation rml; + eSensorType sensor_type; + int w, h; + std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); + if (!thumb) { + if (settings->verbose) { + std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; + } + return; + } + source.reset(thumb->quickProcessImage(neutral, fh / skip, TI_Nearest)); + + if (settings->verbose) { + std::cout << "histogram matching: extracted embedded thumbnail" << std::endl; + } + } + std::unique_ptr target; - { - int tr = TR_NONE; - int fw, fh; - getFullSize(fw, fh, tr); - int skip = 10; + { + int tw = source->getWidth(), th = source->getHeight(); + float thumb_ratio = float(std::max(tw, th)) / float(std::min(tw, th)); + float target_ratio = float(std::max(fw, fh)) / float(std::min(fw, fh)); + int cx = 0, cy = 0; + if (std::abs(thumb_ratio - target_ratio) > 0.01) { + if (thumb_ratio > target_ratio) { + // crop the height + int ch = fh - (fw * float(th) / float(tw)); + cy += ch / 2; + fh -= ch; + } else { + // crop the width + int cw = fw - (fh * float(tw) / float(th)); + cx += cw / 2; + fw -= cw; + } + if (settings->verbose) { + std::cout << "histogram matching: cropping target to get an aspect ratio of " << std::fixed << std::setprecision(2) << thumb_ratio << ":1, new full size is " << fw << "x" << fh << std::endl; + } + } PreviewProps pp(0, 0, fw, fh, skip); ColorTemp currWB = getWB(); std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); - getImage(currWB, tr, image.get(), pp, neutral.toneCurve, neutral.raw); + getImage(currWB, TR_NONE, image.get(), pp, neutral.toneCurve, neutral.raw); // this could probably be made faster -- ideally we would need to just // perform the transformation from camera space to the output space @@ -168,24 +213,6 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "histogram matching: generated neutral rendering" << std::endl; } } - std::unique_ptr source; - { - RawMetaDataLocation rml; - eSensorType sensor_type; - int w, h; - std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); - if (!thumb) { - if (settings->verbose) { - std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; - } - return; - } - source.reset(thumb->quickProcessImage(neutral, target->getHeight(), TI_Nearest)); - - if (settings->verbose) { - std::cout << "histogram matching: extracted embedded thumbnail" << std::endl; - } - } if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); target->resizeImgTo(source->getWidth(), source->getHeight(), TI_Nearest, tmp); From 8f7639288598b444f5ec38bf11bf4f8dbb39295c Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 19 Jan 2018 21:43:55 +0100 Subject: [PATCH 175/200] histogram matching: cache the computed tone curve in RawImageSource --- rtengine/histmatching.cc | 11 +++++++++++ rtengine/improccoordinator.cc | 2 +- rtengine/rawimagesource.h | 1 + rtengine/simpleprocess.cc | 2 +- rtgui/tonecurve.cc | 1 - 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 71bdffc58..5b7647f49 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -139,6 +139,14 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; } + if (!histMatchingCache.empty()) { + if (settings->verbose) { + std::cout << "tone curve found in cache" << std::endl; + outCurve = histMatchingCache; + return; + } + } + outCurve = { DCT_Linear }; int fw, fh; @@ -161,6 +169,7 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (settings->verbose) { std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; } + histMatchingCache = outCurve; return; } source.reset(thumb->quickProcessImage(neutral, fh / skip, TI_Nearest)); @@ -233,6 +242,8 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) if (settings->verbose) { std::cout << "histogram matching: generated curve with " << outCurve.size()/2 << " control points" << std::endl; } + + histMatchingCache = outCurve; } } // namespace rtengine diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 75fc81e9f..d390d94ca 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -449,7 +449,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - params.toneCurve.histmatching = false; + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index a199eb13a..59316eccf 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -95,6 +95,7 @@ protected: float psGreenBrightness[4]; float psBlueBrightness[4]; + std::vector histMatchingCache; void hphd_vertical (float** hpmap, int col_from, int col_to); void hphd_horizontal (float** hpmap, int row_from, int row_to); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0bd784e45..0cc223da1 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -743,7 +743,7 @@ private: if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); - params.toneCurve.histmatching = false; + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; params.toneCurve.expcomp = 0.0; diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 0d753dcbf..4a25794ff 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -953,7 +953,6 @@ bool ToneCurve::histmatchingComputed() autolevels->set_inconsistent(false); } - histmatching->set_active(false); toneCurveMode->set_active(rtengine::toUnderlying(nextToneCurveMode)); shape->setCurve(nextToneCurve); shape2->setCurve({ DCT_Linear }); From 1ec4ff64632e612b7424ce5885a7396e42dd54cb Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 20 Jan 2018 18:41:17 +0100 Subject: [PATCH 176/200] bumped pp3 version number as requested by Floessie and Hombre57 --- rtgui/ppversion.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index c6f2598b0..1eb54d68b 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,13 +1,15 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 329 +#define PPVERSION 330 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 330 2018-20-01 + Added 'Auto-matched Tone Curve' button, performing histogram matching 329 2017-12-09 - Added 'Enabled' flag for Channel Mixer, RGB Curves and HSV Equalizer + Added 'Enabled' flag for Channel Mixer, RGB Curves, HSV Equalizer and L*a*b* Adjustments 328 2017-11-22 Fix wrong type of ff_clipControl 327 2017-09-15 From 466efd3993c66912a6bf27e88121b75f3e7268a5 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 21 Jan 2018 19:11:21 +0100 Subject: [PATCH 177/200] Added "Advanced" tab icon. Added equalizer and atom icons, and set the Advanced tab to use the atom icon. #4298 --- rtdata/images/Dark/actions/atom.png | Bin 0 -> 1325 bytes .../images/Dark/actions/equalizer-narrow.png | Bin 0 -> 1038 bytes rtdata/images/Dark/actions/equalizer-wide.png | Bin 0 -> 918 bytes rtdata/images/Light/actions/atom.png | Bin 0 -> 1312 bytes .../images/Light/actions/equalizer-narrow.png | Bin 0 -> 1017 bytes .../images/Light/actions/equalizer-wide.png | Bin 0 -> 927 bytes rtgui/toolpanelcoord.cc | 2 +- tools/source_icons/scalable/atom.file | 1 + tools/source_icons/scalable/atom.svg | 121 +++++++++ .../scalable/equalizer-narrow.file | 1 + .../scalable/equalizer-narrow.svg | 201 ++++++++++++++ .../source_icons/scalable/equalizer-wide.file | 1 + .../source_icons/scalable/equalizer-wide.svg | 256 ++++++++++++++++++ 13 files changed, 582 insertions(+), 1 deletion(-) create mode 100644 rtdata/images/Dark/actions/atom.png create mode 100644 rtdata/images/Dark/actions/equalizer-narrow.png create mode 100644 rtdata/images/Dark/actions/equalizer-wide.png create mode 100644 rtdata/images/Light/actions/atom.png create mode 100644 rtdata/images/Light/actions/equalizer-narrow.png create mode 100644 rtdata/images/Light/actions/equalizer-wide.png create mode 100644 tools/source_icons/scalable/atom.file create mode 100644 tools/source_icons/scalable/atom.svg create mode 100644 tools/source_icons/scalable/equalizer-narrow.file create mode 100644 tools/source_icons/scalable/equalizer-narrow.svg create mode 100644 tools/source_icons/scalable/equalizer-wide.file create mode 100644 tools/source_icons/scalable/equalizer-wide.svg diff --git a/rtdata/images/Dark/actions/atom.png b/rtdata/images/Dark/actions/atom.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7ce3da01bcd1af1fce3eb1f18c90b01697c981 GIT binary patch literal 1325 zcmV+|1=9M7P)(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj8?@2^KR5*?8 zlwXKcRUF5^zjN=5>!!O-`4DDCT0Nvz5-RBij&twaQ8tKzC`qap?O~w;sf|(=ErT*x zh=Q;`50=74e?Zf{bMNd;7I7mMDYl3(12t6IWoK!3c4zNB=iAHNVK;gRp|`$I=bYb< z&pGG&`|$(*S3{C6NQ&?KTP(}k24ES08h~F&e&f3Cu!!)wz(Ei^0^k`D`N0@7qLf-p z@?HQdMC3w}Bp;PZrSActzrTNjZQCmW+(dF(L@u_pw0zsq(edXzFi8o+@KXSn&zw2a z-P6-!(gff4*NDgtrPLadr)=B)SZlqKd@A$TZfzAD2kRONpeI) zK6D)Cs}y?jk-U4+qD4<_ z+O%m}HDWU&LXznoK@hCXWHRpnI8-i|SC>kqC`pnRL?n|W$=hKVu1s_D`TVF->ad6` zoSd9o4FIYUm?3!yz$yT!R4NaN$m=3<#Te7&dEN*BluD&5wOZ{ZlH()~oIZW}))by3 zi2?x2vP=^U07|JLk{f*Azrh%D-Wc;ip-||lR;!~y5bOzp;L9Kg-e_xUvy3tONyc#; zzjFNe@zw@#Gl1Dzt@iW0u4wpl7{F()>mHqB$x#4L%;}_axm<4J#Kgo3W6ZP0m>!Y~ zY}>LO1#oxFi)oS(Z;NW1cTCE;XO5G~alQ+~ zaQ!?m$r}NnwYBwfdgyuHDF8=|F^?Hzo-Py$ueq+fZFY9HS8KgXDfOz>`l4;y&wHLX zGB7Z3KY+ba6ty%xR!Ut0pzHN|2Y_Q~z;)d|-}k3QWLFr5>%%a-3ScdOF_OK-VsRiH zOmQ4TDJ1}w0JsVOw(GhR<#PFR5!q3xRPG@;qP4Cor4|ENL2@Agk7UiVtRpisGjDF+ zzP+a%i>msFbtZUiI@!_CGRPbqb~h*$t-Nd8XpN2Szxl3PUNL6U!Ht$n4`xlATA z9>?)=09^ns7K_FG^T7XBVHn(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj7&`Cr=R5*>b zl}~6KRUF4Z?>BG%gg{ItR2M@)a>%7d+G^>chaOB)5WRR)spmot9(xl#Di#X8l$;7x z=(V|J17@jGR8Rt`7bB4z7Ixi`ZL%}l?9R;ld3hUlvu-K0ozw64oe!V)n>TM5ctw}# z73FgIO<){gX=&+iV~oCt*!I=8MdU2N+S=Mhp!HJ3s(LTWvRQyyt#9p=`N7G6tQ#eeh>t|0ZdFxJbhll=H{l&vTVgW{#jmLUK zk2nm&LcLyJ0Wik=0StYBjai{^}juy}bWa zRIIgI0C5~U5t;Jh*Pb(3wOZ|#UvMv% z%k4Pl3IIV6{FEd~EeL{2kF8d#*SsSh5(A%z$T@($y}gxuKL4)IgDlHl2d?{to&w9N zdKO@JclZ0Tv9T|`cni2WAXe21@FzeNMaN+n{^0XQu~a95^*g{w7O0$ldGCqH6*xK5SAAYo)%{-YoT~sM zSzz_F_$&Ocso88knVg*b(BF#FG>xpa+kPMG*4kf2vApW*KR%p=v^mb`4FCWD07*qo IM6N<$g3Q**wEzGB literal 0 HcmV?d00001 diff --git a/rtdata/images/Dark/actions/equalizer-wide.png b/rtdata/images/Dark/actions/equalizer-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..50cfed8fa8b4fbb59fbb363664d20cc1e0660f0b GIT binary patch literal 918 zcmV;H18Mw;P)(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj7SV=@dR5*>b z)v;?7Q4j|3Z|1$rMFh>ANfWS5qsS2y6$>Q?v9U6h7NUY+r@?=~^acbGB~`$}N>R%T z9I*`;7Su+OAd&+$IZm@jNN(SZ&2E^@7AFaL&AxB<&2MLyw=8f#gR)7Z(HI4AILpqt z?RvfbeXp=L^C!%FA`2me4uEs}hE?@N2;q2^iD+Z5XbvW#8$@)dnqDI zSr(B${fZYB7H$#I5mU1=IXU?*2aCv*s*Y!wnb!b3>to*$k>M;5(K3KMOhio)`DOBY zzmAD$NmY-T{4tx`U9srBkFpR#*zO05NR@~xS!U*=1z1(DtLhnZ_n!c6_vv^{z)&NZRdcB(W{;q|S zB>4g0n~27Ns`3O+|DvH{{?_jsT73}<}6$)m7;V_M^(id zg^rndLqseb13Q{3vH$=8 literal 0 HcmV?d00001 diff --git a/rtdata/images/Light/actions/atom.png b/rtdata/images/Light/actions/atom.png new file mode 100644 index 0000000000000000000000000000000000000000..55feaf8d7659c568fb3412db6b7b78eb2a4995ab GIT binary patch literal 1312 zcmV+*1>gFKP)(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj8;z>k7R5*?8 zluKw_WfaH%=Y03hqz*~j7>I;8CUYN|IIRyt8%h3O)jYx>1Uo>dMEWSY;%cd*==z9n*&9VG=XRy))l;++;!$5TxMF-{yNAejLsR zf8c*MpsjnyafX=r5dd8xQX`^(nZGZUN>>5MZHYb4I||@g5&4aXibT{3;C>Ow0;mwt z2SE`03IM+E9|Vvy#@q>DjhUy3=;ubh>4nQK81oOK*$ zNGUa9+jgFa#)2RiY1a9^-vMCM7<0P2yZf1HwYtU|Z|eX=M4D&ha=HBg-W8Ecj^h-f zDEdw*^&$Y<81t6z`?+Rq5Cn4o-V>2snM|et01N?932RSw!9sg5VX)vgSO` zJLS6WSHADR7RRwlrBdes)S3BgS69~^0HBmQ3?Ql1YLlBY1^{NhY>YYD*4FlT7>1t# zm;itzNj?H_jEEp2ux)#|rKM#sj^i;RdR}Wyg+igdUaub!kt;JZGqr6U2SG5$%-;Zb zqEIN@1pwJ>b}xXZu$>2&mzNKf%jGBx!_`;3lfCudho)o)(eug@uLc!otF>j*gBc z0LR+f+pR{UaX~4S5K#=^Ya)71YkjX$>KuSQ#+b2kxqQv{{R8v!^D|Ac)o3)@nHeHd z-7@dXeSLkc#+VbfZD+zTyZ}IYdwcJ(ZTlpELqv3qh~9~!XfB`64`{8=_4M>SIW;x4 z4gi*jTo)0|%ntz=Z^}!h(&w)0t}*jT&+`t5$W0>JFCz0q^mY&gSFjOG^?Du5Oqon( z4}hBhU{xxWCD(Po0C3#*{rikDMF24owQdB^E&#(sRAc6kwbpNhVHoe2dm8{*U0waN zd9fKnxm@nBQfe4LFA*sbSqJb3fZtQ8R5?kKApj4H$StMRx6J&D)_PGyx zKEG4^ugK@~zSjB(fI$GMEl-tnI(@NNEY9ARxJjW(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj7yGcYrR5*>b zl}~6Kbri=x@6F84E=d#(DiHz_lDR0-swD>x1_TR&7jG)P3psf7CiJLSD0q=xYoQkf zJ$jHurJ$e$S`Xufhy-10Wk4s{oxi{5p}$?+Y!eG@f2Vox_u=!tzhQn1JfJ0$ht<{9 zC!;7@0NC5x+Xd{th&MJiJ_VizP}MVOn&$T+4yO}DE}PjZK$@n-y+~m;@n>fCEI<$h zr|(;0GrOv)-vg|ytc=q%y(_`i)>b$i4z~f?w*6&yclV1KG4Q&XJqM6w*+)QgH{vYI zV&~kpFMkAP#b)-Ei2MmqmZc_1a@qH<4+et|juVeYqefM~^X2tPe=3fmsPCNH0f^(+ zjmP6hy!hdh5*J0GypJ!)`=+X@KSZQIVcWJn z2T<4b;hebF>%9S-@ z?bmhv6F|4yEsCPJ;uGF#nx+tujz7V-s(N#B{i~`v2!deB&LwW!HVJ|t@#3%Ry598t zpGD*$GkXU>L@G1;M?@Y4SYBS%JkO^r@WYJQ%npDIpwsD?nProH7=|~@?2;E>YntY% z(^b8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1055b!SaeirbZlh+Nn>wrb0B7Kav*eQWgsF&cyMKMbRr;hVPYU@ zZXi-&cT{L)a$#^~WeEx?i~s-t7IZ~ebU}4=Xm4@=O>c5%VQwHuVRB@5Z*OE^P<7b= z002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4baZe!FE3+q zWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFElPNFT+$~1poj7VM#b z)lF*?Q4|K?_netAlM1G>b`!`lrJzVCii!)}xp8Gzx)2ovcUt@dc5grsQMwXbxKh*~ zQ0lf|38+xC5=0tM`w?xWOlR&nE}RKxl1iYZv%2q{d!Kpdk`G{?F3JYgYPAvs!NDx6 z>UOKu`np@#&jw)_J_K;o-0J{1y=Rz+o~dfp+}qeKnuAsKs;VA04_X88bk8s|KPRI3 zEGJ3wYtZIet#+N64`tao*IHUydXs~lbCX0gVH&Rhcs#(qDI!NqUI37XRdtq#ei(Rl zP-6h|L^NXZ`)tsKgCLj_k*0aj_8?VN4+AKhTN$mP0KRyhcZZp~XYBia6F?&eGxJ;=#~-syL|f_nf`~k_Dl;#n!&lC^Vm2QH!Oy + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/source_icons/scalable/equalizer-narrow.file b/tools/source_icons/scalable/equalizer-narrow.file new file mode 100644 index 000000000..c922b3554 --- /dev/null +++ b/tools/source_icons/scalable/equalizer-narrow.file @@ -0,0 +1 @@ +equalizer-narrow.png,w22,actions diff --git a/tools/source_icons/scalable/equalizer-narrow.svg b/tools/source_icons/scalable/equalizer-narrow.svg new file mode 100644 index 000000000..b31128b36 --- /dev/null +++ b/tools/source_icons/scalable/equalizer-narrow.svg @@ -0,0 +1,201 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/source_icons/scalable/equalizer-wide.file b/tools/source_icons/scalable/equalizer-wide.file new file mode 100644 index 000000000..22ee0b4b9 --- /dev/null +++ b/tools/source_icons/scalable/equalizer-wide.file @@ -0,0 +1 @@ +equalizer-wide.png,w22,actions diff --git a/tools/source_icons/scalable/equalizer-wide.svg b/tools/source_icons/scalable/equalizer-wide.svg new file mode 100644 index 000000000..dcf184f56 --- /dev/null +++ b/tools/source_icons/scalable/equalizer-wide.svg @@ -0,0 +1,256 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2aea7aa97cb4c1464528687b6b79c463cca18d91 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sat, 20 Jan 2018 18:50:01 +0100 Subject: [PATCH 178/200] moved channel mixer back to the color tab --- rtgui/partialpastedlg.cc | 6 +++--- rtgui/toolpanelcoord.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 392da6db3..9271ccb58 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -168,6 +168,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[2]->pack_start (*icm, Gtk::PACK_SHRINK, 2); //vboxes[2]->pack_start (*gam, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*vibrance, Gtk::PACK_SHRINK, 2); + vboxes[2]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*hsveq, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*filmSimulation, Gtk::PACK_SHRINK, 2); @@ -196,7 +197,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //WAVELET vboxes[5]->pack_start (*advanced, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*hseps[5], Gtk::PACK_SHRINK, 2); - vboxes[5]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2); @@ -522,13 +522,11 @@ void PartialPasteDlg::advancedToggled () { ConnectionBlocker waveletBlocker(waveletConn); - ConnectionBlocker chmixerBlocker(chmixerConn); ConnectionBlocker retinexBlocker(retinexConn); ConnectionBlocker colorappearanceBlocker(colorappearanceConn); advanced->set_inconsistent (false); wavelet->set_active (advanced->get_active ()); - chmixer->set_active (color->get_active ()); retinex->set_active (basic->get_active ()); colorappearance->set_active (basic->get_active ()); } @@ -538,6 +536,7 @@ void PartialPasteDlg::colorToggled () ConnectionBlocker icmBlocker(icmConn); ConnectionBlocker vibranceBlocker(vibranceConn); + ConnectionBlocker chmixerBlocker(chmixerConn); ConnectionBlocker chmixerbwBlocker(chmixerbwConn); ConnectionBlocker hsveqBlocker(hsveqConn); ConnectionBlocker filmSimulationBlocker(filmSimulationConn); @@ -550,6 +549,7 @@ void PartialPasteDlg::colorToggled () icm->set_active (color->get_active ()); //gam->set_active (color->get_active ()); vibrance->set_active (color->get_active ()); + chmixer->set_active (color->get_active ()); blackwhite->set_active (color->get_active ()); hsveq->set_active (color->get_active ()); filmSimulation->set_active (color->get_active ()); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index fcdf9a0e4..e9cb3ea43 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -102,7 +102,7 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan addPanel (colorPanel, whitebalance); addPanel (exposurePanel, toneCurve); addPanel (colorPanel, vibrance); - addPanel (advancedPanel, chmixer); + addPanel (colorPanel, chmixer); addPanel (colorPanel, blackwhite); addPanel (exposurePanel, localContrast); addPanel (exposurePanel, shadowshighlights); From 88123cdd146bc73d314fb0312030af013217996f Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 21 Jan 2018 18:01:07 +0100 Subject: [PATCH 179/200] Set last curve point of auto matched curve always to 1;1 --- rtengine/histmatching.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 5b7647f49..be618d4d7 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -119,7 +119,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) doit(idx, int(mapping.size()), step, idx - step > step / 2); if (curve.size() <= 2 || curve.back() < 0.99 || (1 - curve[curve.size()-2] > step / 512.0 && curve.back() < coord(mapping.back()))) { curve.emplace_back(1.0); - curve.emplace_back(coord(mapping.back())); + curve.emplace_back(1.0); } if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear From 44984a911b397548e5f58927e0ac23cd5924a227 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 21 Jan 2018 18:03:51 +0100 Subject: [PATCH 180/200] Don't set exposure to zero when 'auto levels' is disabled and 'auto matched tone curve' is enabled --- rtengine/improccoordinator.cc | 5 ++++- rtengine/simpleprocess.cc | 6 +++++- rtgui/tonecurve.cc | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d390d94ca..d3a32140a 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -449,10 +449,13 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); + if (params.toneCurve.autoexp) { + params.toneCurve.expcomp = 0.0; + } + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; - params.toneCurve.expcomp = 0.0; params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 0cc223da1..45956f262 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -743,14 +743,18 @@ private: if (params.toneCurve.histmatching) { imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); + if (params.toneCurve.autoexp) { + params.toneCurve.expcomp = 0.0; + } + params.toneCurve.autoexp = false; params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; params.toneCurve.curve2 = { 0 }; - params.toneCurve.expcomp = 0.0; params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; params.toneCurve.hlcompr = 0; + } // at this stage, we can flush the raw data to free up quite an important amount of memory diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 4a25794ff..fd4c0827d 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -936,7 +936,6 @@ bool ToneCurve::histmatchingComputed() GThreadLock lock; disableListener(); enableAll(); - expcomp->setValue(0); brightness->setValue(0); contrast->setValue(0); black->setValue(0); @@ -947,6 +946,7 @@ bool ToneCurve::histmatchingComputed() } if (autolevels->get_active() ) { + expcomp->setValue(0); autoconn.block(true); autolevels->set_active(false); autoconn.block(false); From d44a3b8bb3fba4226fd8581797b4775a1dfefdc8 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 21 Jan 2018 19:00:40 +0100 Subject: [PATCH 181/200] added tooltip to the hisogram matching button --- rtdata/languages/default | 1 + rtgui/tonecurve.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/rtdata/languages/default b/rtdata/languages/default index acf03e48b..503600e28 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1554,6 +1554,7 @@ 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_EXPCOMP;Exposure compensation TP_EXPOSURE_HISTMATCHING;Auto-matched Tone Curve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. TP_EXPOSURE_LABEL;Exposure TP_EXPOSURE_SATURATION;Saturation TP_EXPOSURE_TCMODE_FILMLIKE;Film-like diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index fd4c0827d..ce938178e 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -127,6 +127,7 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA pack_start (*Gtk::manage (new Gtk::HSeparator())); histmatching = Gtk::manage(new Gtk::ToggleButton(M("TP_EXPOSURE_HISTMATCHING"))); + histmatching->set_tooltip_markup(M("TP_EXPOSURE_HISTMATCHING_TOOLTIP")); histmatchconn = histmatching->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::histmatchingToggled)); pack_start(*histmatching, true, true, 2); @@ -448,6 +449,7 @@ void ToneCurve::setRaw (bool raw) disableListener (); method->set_sensitive (raw); hrenabled->set_sensitive (raw); + histmatching->set_sensitive(raw); enableListener (); } From 5ae12d6d7cc5aed4a982eb84ddd6b23c3dc11813 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 21 Jan 2018 19:14:49 +0100 Subject: [PATCH 182/200] Added wildcard to build* folders in .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7141ec92d..21ebf986a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,8 @@ Makefile cmake_install.cmake install_manifest.txt -build -Build +build* +Build* Debug RelWithDebInfo MinSizeRel From b13db578eb2335432c1ef083eb76a55314c4e807 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Sun, 21 Jan 2018 19:21:41 +0100 Subject: [PATCH 183/200] do not reset highlight compression when doing histogram matching --- rtengine/improccoordinator.cc | 1 - rtengine/simpleprocess.cc | 1 - rtgui/tonecurve.cc | 4 +++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index d3a32140a..62891a03f 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -459,7 +459,6 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; - params.toneCurve.hlcompr = 0; if (aeListener) { aeListener->autoMatchedToneCurveChanged(params.toneCurve.curveMode, params.toneCurve.curve); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 45956f262..685e1d53e 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -753,7 +753,6 @@ private: params.toneCurve.brightness = 0; params.toneCurve.contrast = 0; params.toneCurve.black = 0; - params.toneCurve.hlcompr = 0; } diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index ce938178e..07822f857 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -567,7 +567,9 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) return; } - setHistmatching(false); + if (a != expcomp && a != hlcompr && a != hlcomprthresh) { + setHistmatching(false); + } Glib::ustring costr; From dbe3d55e339a4869807e0f1a12d1df323a9a97ec Mon Sep 17 00:00:00 2001 From: Desmis Date: Mon, 22 Jan 2018 10:06:40 +0100 Subject: [PATCH 184/200] Suppress unused wavelet parameters issue4318 --- rtengine/ipwavelet.cc | 2 -- rtengine/settings.h | 2 -- rtgui/options.cc | 14 -------------- 3 files changed, 18 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 189d61ddf..e54a249f6 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1878,8 +1878,6 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * //one can also chnage in calckoe float edd = settings->ed_detec; float eddlow = settings->ed_low; //5 to 40 - // float eddlipinfl=settings->ed_lipinfl; - // float eddlipampl=settings->ed_lipampl; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; float eddlipampl = 1.f + cp.edgampl / 50.f; // float eddlow=5.f + cp.edgampl/2.f;//settings->ed_low;//5 to 40 diff --git a/rtengine/settings.h b/rtengine/settings.h index 225503777..686c2b547 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -90,8 +90,6 @@ public: double ed_detec; double ed_detecStr; double ed_low; - double ed_lipinfl; - double ed_lipampl; Glib::ustring lensfunDbDirectory; ///< The directory containing the lensfun database. If empty, the system defaults will be used (as described in http://lensfun.sourceforge.net/manual/dbsearch.html) diff --git a/rtgui/options.cc b/rtgui/options.cc index 6e538059f..4ef8c4a22 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -567,8 +567,6 @@ void Options::setDefaults () rtSettings.ed_detec = 3; //between 2 and 10 rtSettings.ed_detecStr = 1.3; //not use rtSettings.ed_low = 15.; //between 5 to 40 - rtSettings.ed_lipinfl = 0.8; //between 0.5 to 0.9 - rtSettings.ed_lipampl = 1.1; //between 1 and 2 rtSettings.ciecamfloat = true; @@ -747,15 +745,6 @@ void Options::readFromFile (Glib::ustring fname) rtSettings.ed_low = keyFile.get_double ("General", "EDLow"); } - if (keyFile.has_key ("General", "EDLipinfl")) { - rtSettings.ed_lipinfl = keyFile.get_double ("General", "EDLipinfl"); - } - - if (keyFile.has_key ("General", "EDLipampl")) { - rtSettings.ed_lipampl = keyFile.get_double ("General", "EDLipampl"); - } - - } if (keyFile.has_group ("External Editor")) { @@ -1847,9 +1836,6 @@ void Options::saveToFile (Glib::ustring fname) 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); From 03afede8820c0c12b6784ecaf5b5ac4f2072b145 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 22 Jan 2018 13:38:23 +0100 Subject: [PATCH 185/200] Some tweaks to curve extraction from histogram matching --- rtengine/histmatching.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index be618d4d7..3032b36e0 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -108,7 +108,7 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) int v = mapping[i]; bool change = i > 0 && v != mapping[i-1]; int diff = i - prev; - if (change && std::abs(diff - step) <= 1) { + if ((change && std::abs(diff - step) <= 1) || diff > step * 2) { curve.push_back(coord(i)); curve.push_back(coord(v)); prev = i; @@ -117,10 +117,13 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) }; doit(0, idx, idx > step ? step : idx / 2, true); doit(idx, int(mapping.size()), step, idx - step > step / 2); - if (curve.size() <= 2 || curve.back() < 0.99 || (1 - curve[curve.size()-2] > step / 512.0 && curve.back() < coord(mapping.back()))) { - curve.emplace_back(1.0); - curve.emplace_back(1.0); + if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { + curve.pop_back(); + curve.pop_back(); } + curve.push_back(1.0); + curve.push_back(1.0); + if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear } else { From ac1238e77402842dc10d1de45b923a14bfb74444 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 22 Jan 2018 15:50:17 +0100 Subject: [PATCH 186/200] added hotfix for #3794 -- to be revised after 5.4 is out --- rtengine/rtthumbnail.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 59d19cc15..1a8d18897 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -150,6 +150,11 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, ImageIO* img = imgSrc.getImageIO(); + // agriggio -- hotfix for #3794, to be revised once a proper solution is implemented + if (std::max(img->getWidth(), img->getHeight()) / std::min(img->getWidth(), img->getHeight()) >= 10) { + return nullptr; + } + Thumbnail* tpp = new Thumbnail (); unsigned char* data; From fc77fd6964709be43e54de98ce4999ff35116cc3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 22 Jan 2018 19:04:42 +0100 Subject: [PATCH 187/200] Remove all BENCHMARK defines --- rtengine/demosaic_algos.cc | 1 - rtengine/histmatching.cc | 1 - rtengine/improcfun.cc | 1 - rtengine/rawimagesource.cc | 1 - rtengine/tmo_fattal02.cc | 1 - 5 files changed, 5 deletions(-) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 16c0204dd..68b2ad8bb 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -37,7 +37,6 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" -//#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 3032b36e0..699448bbb 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -26,7 +26,6 @@ #include "iccstore.h" #include "../rtgui/mydiagonalcurve.h" #include "improcfun.h" -#define BENCHMARK #include "StopWatch.h" #include #include diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 312494fd2..d0c78f906 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -40,7 +40,6 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 4c777a30e..ea7b0e559 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -38,7 +38,6 @@ #include #endif #include "opthelper.h" -#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index c5e7c407f..4fb11ff19 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -69,7 +69,6 @@ #include "improcfun.h" #include "settings.h" #include "iccstore.h" -//#define BENCHMARK #include "StopWatch.h" #include "sleef.c" #include "opthelper.h" From d921f0359a9358abadb5ce5891c1fdfb5edd6417 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Mon, 22 Jan 2018 20:34:30 +0100 Subject: [PATCH 188/200] Update TooWaBlue theme v2.62 Changed switch color --- rtdata/themes/TooWaBlue-GTK3-20_.css | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index af7fb00af..a65fb2d3e 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2017 TooWaBoo - Version 2.61 + Version 2.62 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1242,7 +1242,8 @@ switch { switch slider { border: 0.08334em solid @bg-entry-border; - background-image: linear-gradient(to bottom, shade (@accent-color2,1.15), shade (@accent-color2,.85)); + background-color: shade (@bg-light-grey, .85); + background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); border: 0.08334em solid @bg-entry-border; box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.1); border-radius: 0.2em 0 0 0.2em; @@ -1252,12 +1253,13 @@ switch:checked slider{ } switch:hover slider { - background-image: linear-gradient(to bottom, shade (@accent-color2,1.20), shade (@accent-color2,.90)); + background-color: shade (@bg-light-grey, .65); + background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); } switch:checked { - background-color: rgb(140,0,20); - color: @headline-big; + background-color: @accent-color2; + color: @headline-big; } switch:disabled:not(:checked) { @@ -1265,10 +1267,8 @@ switch:disabled:not(:checked) { background-image: none; background-color: shade (@bg-light-grey, .85); } -switch:disabled slider { - background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); - background-color: shade (@bg-light-grey, .85); -} + + /** end ****************************************************************************************/ /*** Buttons ***********************************************************************************/ From 16c8f18976007f73714c419d3a0b27bf225ee025 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 22 Jan 2018 23:00:37 +0100 Subject: [PATCH 189/200] make sure that the idle callback set by CropHandler::setDetailedCrop gets called before redraws Fixes #4224 --- rtgui/crophandler.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index 0abff627b..6228cb1c7 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -411,7 +411,7 @@ void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procp return FALSE; }; - idle_register.add(func, idle_helper); + idle_register.add(func, idle_helper, G_PRIORITY_HIGH_IDLE); } cimg.unlock (); From bc6dad6eb9df4809a4f7d562b612baf0f9c4889a Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 23 Jan 2018 00:16:19 +0100 Subject: [PATCH 190/200] histogram matching: fixed typo in calculating the crop --- rtengine/histmatching.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 699448bbb..4216c4581 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -203,7 +203,7 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "histogram matching: cropping target to get an aspect ratio of " << std::fixed << std::setprecision(2) << thumb_ratio << ":1, new full size is " << fw << "x" << fh << std::endl; } } - PreviewProps pp(0, 0, fw, fh, skip); + PreviewProps pp(cx, cy, fw, fh, skip); ColorTemp currWB = getWB(); std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); getImage(currWB, TR_NONE, image.get(), pp, neutral.toneCurve, neutral.raw); From 09d020cca3020e4051cc2329d60d598af26a9806 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Tue, 23 Jan 2018 01:29:43 +0100 Subject: [PATCH 191/200] Added -DWITH_BENCHFUN to build-rawtherapee --- tools/build-rawtherapee | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/build-rawtherapee b/tools/build-rawtherapee index 5c13df061..3b994b670 100755 --- a/tools/build-rawtherapee +++ b/tools/build-rawtherapee @@ -137,6 +137,7 @@ cmake \ -DWITH_PROF="OFF" \ -DWITH_SAN="OFF" \ -DWITH_SYSTEM_KLT="OFF" \ + -DWITH_BENCHFUN="OFF" \ "$HOME/programs/code-${prog}" || exit 1 make --jobs="$cpuCount" install || exit 1 From e5fe9b47df611e38e0e39c914302431276ce61bf Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 23 Jan 2018 08:58:31 +0100 Subject: [PATCH 192/200] fixed bug in setting the queue running/paused icons for METM layouts Fixes #4323 --- rtgui/batchqueuepanel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index 054160d91..ba07f6f4d 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -228,7 +228,7 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) if (!qsize ) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") )), Gtk::POS_RIGHT, 1, 1); - } else if (!qStartStop->get_active()) { + } else if (qStartStop->get_active()) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )), Gtk::POS_RIGHT, 1, 1); } else { From 9a4359995f9c739486dba59f4afadf65b9a9b0ab Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 23 Jan 2018 10:36:50 +0100 Subject: [PATCH 193/200] Suppress manuel settings fot local contrsat and edge detection in wavelet --- rtengine/ipwavelet.cc | 15 +++++++-------- rtengine/settings.h | 8 -------- rtgui/options.cc | 45 ------------------------------------------- rtgui/wavelet.cc | 2 +- 4 files changed, 8 insertions(+), 62 deletions(-) diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e54a249f6..04db1c314 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -1876,11 +1876,10 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // I adapted the principle but have profoundly changed the algorithm // One can 1) change all parameters and found good parameters; //one can also chnage in calckoe - float edd = settings->ed_detec; - float eddlow = settings->ed_low; //5 to 40 + float edd = 3.f; + float eddlow = 15.f; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; float eddlipampl = 1.f + cp.edgampl / 50.f; - // float eddlow=5.f + cp.edgampl/2.f;//settings->ed_low;//5 to 40 if(cp.detectedge) { //enabled Lipschitz control...more memory..more time... @@ -2579,11 +2578,11 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit scaleskip[sc] = scales[sc] / skip; } - float t_r = settings->top_right; - float t_l = settings->top_left; - float b_r = settings->bot_right; - float edd = settings->ed_detec; - float eddstrength = settings->ed_detecStr; + float t_r = 40.f; + float t_l = 10.f; + float b_r = 75.f; + float edd = 3.f; + float eddstrength = 1.3f; float aedstr = (eddstrength - 1.f) / 90.f; float bedstr = 1.f - 10.f * aedstr; diff --git a/rtengine/settings.h b/rtengine/settings.h index 686c2b547..8f24f18f1 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -83,14 +83,6 @@ public: double artifact_cbdl; double level0_cbdl; double level123_cbdl; - double bot_left; - double top_left; - double top_right; - double bot_right; - double ed_detec; - double ed_detecStr; - double ed_low; - Glib::ustring lensfunDbDirectory; ///< The directory containing the lensfun database. If empty, the system defaults will be used (as described in http://lensfun.sourceforge.net/manual/dbsearch.html) /** Creates a new instance of Settings. diff --git a/rtgui/options.cc b/rtgui/options.cc index 4ef8c4a22..90b7378a6 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -560,14 +560,6 @@ void Options::setDefaults () rtSettings.artifact_cbdl = 4.; rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; - rtSettings.bot_left = 0; - rtSettings.top_left = 10; - rtSettings.top_right = 40; - rtSettings.bot_right = 75; - rtSettings.ed_detec = 3; //between 2 and 10 - rtSettings.ed_detecStr = 1.3; //not use - rtSettings.ed_low = 15.; //between 5 to 40 - rtSettings.ciecamfloat = true; rtSettings.protectred = 60; @@ -716,35 +708,6 @@ void Options::readFromFile (Glib::ustring fname) if ( keyFile.has_key ("General", "Verbose")) { rtSettings.verbose = keyFile.get_boolean ( "General", "Verbose"); } - - if (keyFile.has_key ("General", "BotLeft")) { - rtSettings.bot_left = keyFile.get_double ("General", "BotLeft"); - } - - if (keyFile.has_key ("General", "TopLeft")) { - rtSettings.top_left = keyFile.get_double ("General", "TopLeft"); - } - - if (keyFile.has_key ("General", "TopRight")) { - rtSettings.top_right = keyFile.get_double ("General", "TopRight"); - } - - if (keyFile.has_key ("General", "BotRight")) { - rtSettings.bot_right = keyFile.get_double ("General", "BotRight"); - } - - if (keyFile.has_key ("General", "EDdetec")) { - rtSettings.ed_detec = keyFile.get_double ("General", "EDdetec"); - } - - if (keyFile.has_key ("General", "EDdetecStr")) { - rtSettings.ed_detecStr = keyFile.get_double ("General", "EDdetecStr"); - } - - if (keyFile.has_key ("General", "EDLow")) { - rtSettings.ed_low = keyFile.get_double ("General", "EDLow"); - } - } if (keyFile.has_group ("External Editor")) { @@ -1829,14 +1792,6 @@ void Options::saveToFile (Glib::ustring fname) 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_integer ("External Editor", "EditorKind", editorToSendTo); keyFile.set_string ("External Editor", "GimpDir", gimpDir); keyFile.set_string ("External Editor", "PhotoshopDir", psDir); diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index d3a594848..160abf07e 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -100,7 +100,7 @@ Wavelet::Wavelet() : bllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LOWLIGHT"), 0., 100., 0., 2., 50., 25., 0, false))), pastlev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_PASTEL"), 0., 70., 0., 2., 30., 20., 0, false))), satlev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_SAT"), 0., 130., 30., 45., 130., 100., 0, false))), - edgcont(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_EDGCONT"), 0., 100., options.rtSettings.bot_left, options.rtSettings.top_left, options.rtSettings.bot_right, options.rtSettings.top_right, 0., false))), + edgcont(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_EDGCONT"), 0., 100., 0, 10, 75, 40, 0., false))), level0noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVZERO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level1noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVONE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level2noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTWO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), From 4cd1ad066d6e914aeed1d1cb6b555cbfedaf1704 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Tue, 23 Jan 2018 13:44:58 +0100 Subject: [PATCH 194/200] imagefloat: correctly clip the values when outputting to 8- or 16-bit formats Fixes #4310 --- rtengine/imagefloat.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index bfeb85534..fa45c53ba 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -163,15 +163,15 @@ void Imagefloat::getScanline (int row, unsigned char* buffer, int bps) } else if (bps == 16) { unsigned short *sbuffer = (unsigned short *)buffer; for (int i = 0, ix = 0; i < width; i++) { - sbuffer[ix++] = r(row, i); - sbuffer[ix++] = g(row, i); - sbuffer[ix++] = b(row, i); + sbuffer[ix++] = CLIP(r(row, i)); + sbuffer[ix++] = CLIP(g(row, i)); + sbuffer[ix++] = CLIP(b(row, i)); } } else if (bps == 8) { for (int i = 0, ix = 0; i < width; i++) { - buffer[ix++] = rtengine::uint16ToUint8Rounded(r(row, i)); - buffer[ix++] = rtengine::uint16ToUint8Rounded(g(row, i)); - buffer[ix++] = rtengine::uint16ToUint8Rounded(b(row, i)); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(r(row, i))); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(g(row, i))); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(b(row, i))); } } } From 4046a3c9b99f3bdb768c0315b8b3addc06102427 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 23 Jan 2018 14:46:15 +0100 Subject: [PATCH 195/200] Fixed typo --- tools/build-rawtherapee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-rawtherapee b/tools/build-rawtherapee index 3b994b670..183d0a3d2 100755 --- a/tools/build-rawtherapee +++ b/tools/build-rawtherapee @@ -137,7 +137,7 @@ cmake \ -DWITH_PROF="OFF" \ -DWITH_SAN="OFF" \ -DWITH_SYSTEM_KLT="OFF" \ - -DWITH_BENCHFUN="OFF" \ + -DWITH_BENCHMARK="OFF" \ "$HOME/programs/code-${prog}" || exit 1 make --jobs="$cpuCount" install || exit 1 From f5bd232cd2a1d709a25c3b3feda88ebf86dd6092 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Wed, 24 Jan 2018 14:58:14 +0100 Subject: [PATCH 196/200] Partial Paste dialog cleanup and fix for Advanced Closes #4332 --- rtgui/partialpastedlg.cc | 149 ++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 9271ccb58..49903cf56 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -43,52 +43,51 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren meta ->set_name("PartialPasteHeader"); raw = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWGROUP"))); raw ->set_name("PartialPasteHeader"); - advanced = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP"))); - advanced ->set_name("PartialPasteHeader"); + advanced = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP"))); + advanced ->set_name("PartialPasteHeader"); - // options in basic: + // Basic Settings: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); - retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); pcvignette = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PCVIGNETTE"))); gradient = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_GRADIENT"))); labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE"))); - colorappearance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORAPP"))); - // options in detail: + // Detail Settings: sharpen = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENING"))); sharpenedge = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENEDGE"))); sharpenmicro = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENMICRO"))); impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE"))); - dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); + dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE"))); + dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); - // options in wavelet: - wavelet = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EQUALIZER"))); //TODO - rename to wavelet + // Advanced Settings: + retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); + colorappearance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORAPP"))); + wavelet = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EQUALIZER"))); - // options in color: + // Color-Related Settings icm = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMSETTINGS"))); - //gam = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMGAMMA"))); vibrance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIBRANCE"))); chmixer = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXER"))); blackwhite = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXERBW"))); - dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); hsveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HSVEQUALIZER"))); filmSimulation = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMSIMULATION")) ); rgbcurves = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RGBCURVES"))); colortoning = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORTONING"))); - // options in lens: + // Lens-Related Settings distortion = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DISTORTION"))); cacorr = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CACORRECTION"))); vignetting = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIGNETTING"))); lcp = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LENSPROFILE"))); - // options in composition: + // Composition Settings: coarserot = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COARSETRANS"))); finerot = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ROTATION"))); crop = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CROP"))); @@ -97,36 +96,39 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren perspective = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PERSPECTIVE"))); commonTrans = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COMMONTRANSFORMPARAMS"))); - // options in meta: + // Metadata: exifch = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES"))); iptc = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO"))); - // options in raw: - raw_expos = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR"))); - raw_preser = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_PRESER"))); - raw_black = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_BLACK"))); - raw_ca_autocorrect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO"))); - raw_caredblue = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE"))); - raw_hotpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_HOTPIXFILT"))); - raw_deadpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_DEADPIXFILT"))); - raw_linenoise = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE"))); - raw_greenthresh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL"))); + // Raw Settings: raw_method = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD"))); raw_imagenum = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM"))); raw_pixelshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_PIXELSHIFT"))); raw_ccSteps = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_FALSECOLOR"))); raw_dcb_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBITERATIONS"))); raw_dcb_enhance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBENHANCE"))); - //raw_all_enhance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_ALLENHANCE"))); raw_lmmse_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_LMMSEITERATIONS"))); - + //--- + raw_linenoise = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE"))); + raw_greenthresh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL"))); + raw_hotpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_HOTPIXFILT"))); + raw_deadpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_DEADPIXFILT"))); + //--- + raw_expos = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR"))); + raw_preser = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_PRESER"))); + raw_black = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_BLACK"))); + //--- df_file = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEFILE"))); df_AutoSelect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEAUTOSELECT"))); + //--- ff_file = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDFILE"))); ff_AutoSelect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDAUTOSELECT"))); - ff_BlurRadius = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS"))); ff_BlurType = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURTYPE"))); + ff_BlurRadius = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS"))); ff_ClipControl = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDCLIPCONTROL"))); + //--- + raw_ca_autocorrect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO"))); + raw_caredblue = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE"))); Gtk::VBox* vboxes[8]; Gtk::HSeparator* hseps[8]; @@ -166,7 +168,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*hseps[2], Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*icm, Gtk::PACK_SHRINK, 2); - //vboxes[2]->pack_start (*gam, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*vibrance, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2); @@ -194,7 +195,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[4]->pack_start (*perspective, Gtk::PACK_SHRINK, 2); vboxes[4]->pack_start (*commonTrans, Gtk::PACK_SHRINK, 2); - //WAVELET + //ADVANCED vboxes[5]->pack_start (*advanced, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*hseps[5], Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); @@ -211,7 +212,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[6]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); - //vboxes[6]->pack_start (*raw_all_enhance, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); vboxes[6]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); @@ -259,7 +259,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren Gtk::VBox* vbtop = Gtk::manage (new Gtk::VBox ()); vbtop->pack_start (*everything, Gtk::PACK_SHRINK, 2); - Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2); // TODO replace with get_content_area() with GTK upgrade + Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2); Gtk::HBox* hbmain = Gtk::manage (new Gtk::HBox ()); hbmain->pack_start (*vbCol1); @@ -281,7 +281,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren scrolledwindow->add(*hbmain); - Gtk::Dialog::get_content_area()->pack_start (*scrolledwindow, Gtk::PACK_EXPAND_WIDGET, 2);// TODO replace with get_content_area() with GTK upgrade + Gtk::Dialog::get_content_area()->pack_start (*scrolledwindow, Gtk::PACK_EXPAND_WIDGET, 2); hbmain->show(); scrolledwindow->show (); @@ -296,32 +296,35 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren compositionConn = composition->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::compositionToggled)); metaConn = meta->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::metaToggled)); rawConn = raw->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::rawToggled)); - advancedConn = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled)); + advancedConn = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled)); + // Basic Settings wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); fattalConn = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); - retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); pcvignetteConn = pcvignette->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); gradientConn = gradient->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); - colorappearanceConn = colorappearance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); + // Detail Settings: sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); gradsharpenConn = sharpenedge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); microcontrastConn = sharpenmicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); impdenConn = impden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); dirpyrdenConn = dirpyrden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); - dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + // Advanced Settings: + retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); + colorappearanceConn = colorappearance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); + // Color-related Settings: icmConn = icm->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); - //gamcsconn = gam->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); vibranceConn = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerConn = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerbwConn = blackwhite->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); @@ -330,11 +333,13 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren rgbcurvesConn = rgbcurves->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); colortoningConn = colortoning->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); + // Lens-Related Settings: distortionConn = distortion->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); cacorrConn = cacorr->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); vignettingConn = vignetting->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); lcpConn = lcp->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); + // Composition Settings: coarserotConn = coarserot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); finerotConn = finerot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); cropConn = crop->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); @@ -343,34 +348,39 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren perspectiveConn = perspective->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); commonTransConn = commonTrans->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); + // Metadata: exifchConn = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); iptcConn = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); + // Raw Settings: raw_methodConn = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_imagenumConn = raw_imagenum->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_pixelshiftConn = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_ccStepsConn = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_dcb_iterationsConn = raw_dcb_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_dcb_enhanceConn = raw_dcb_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - //raw_all_enhanceConn = raw_all_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_lmmse_iterationsConn = raw_lmmse_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_pixelshiftConn = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - + //--- + raw_linenoiseConn = raw_linenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_greenthreshConn = raw_greenthresh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_hotpix_filtConn = raw_hotpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_deadpix_filtConn = raw_deadpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- raw_exposConn = raw_expos->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_preserConn = raw_preser->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_blackConn = raw_black->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_ca_autocorrectConn = raw_ca_autocorrect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_caredblueConn = raw_caredblue->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_hotpix_filtConn = raw_hotpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_deadpix_filtConn = raw_deadpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_linenoiseConn = raw_linenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_greenthreshConn = raw_greenthresh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- df_fileConn = df_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); df_AutoSelectConn = df_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- ff_fileConn = ff_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_AutoSelectConn = ff_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurTypeConn = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_ClipControlConn = ff_ClipControl->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- + raw_ca_autocorrectConn = raw_ca_autocorrect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_caredblueConn = raw_caredblue->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); add_button (M("GENERAL_OK"), Gtk::RESPONSE_OK); add_button (M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); @@ -419,55 +429,53 @@ void PartialPasteDlg::rawToggled () ConnectionBlocker raw_methodBlocker(raw_methodConn); ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn); + ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn); ConnectionBlocker raw_dcb_iterationsBlocker(raw_dcb_iterationsConn); ConnectionBlocker raw_dcb_enhanceBlocker(raw_dcb_enhanceConn); - //ConnectionBlocker raw_all_enhanceConnBlocker(raw_all_enhanceConnConn); ConnectionBlocker raw_lmmse_iterationsBlocker(raw_lmmse_iterationsConn); - ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); + ConnectionBlocker raw_linenoiseBlocker(raw_linenoiseConn); + ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn); + ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn); + ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn); ConnectionBlocker raw_exposBlocker(raw_exposConn); ConnectionBlocker raw_preserBlocker(raw_preserConn); ConnectionBlocker raw_blackBlocker(raw_blackConn); - ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); - ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); - ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn); - ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn); - ConnectionBlocker raw_linenoiseBlocker(raw_linenoiseConn); - ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn); ConnectionBlocker df_fileBlocker(df_fileConn); ConnectionBlocker df_AutoSelectBlocker(df_AutoSelectConn); ConnectionBlocker ff_fileBlocker(ff_fileConn); ConnectionBlocker ff_AutoSelectBlocker(ff_AutoSelectConn); - ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn); ConnectionBlocker ff_BlurTypeBlocker(ff_BlurTypeConn); + ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn); ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn); + ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); + ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); raw->set_inconsistent (false); raw_method->set_active (raw->get_active ()); raw_imagenum->set_active (raw->get_active ()); + raw_pixelshift->set_active (raw->get_active ()); raw_ccSteps->set_active (raw->get_active ()); raw_dcb_iterations->set_active (raw->get_active ()); raw_dcb_enhance->set_active (raw->get_active ()); raw_lmmse_iterations->set_active (raw->get_active ()); - raw_pixelshift->set_active (raw->get_active ()); - //raw_all_enhance->set_active (raw->get_active ()); + raw_linenoise->set_active (raw->get_active ()); + raw_greenthresh->set_active (raw->get_active ()); + raw_hotpix_filt->set_active (raw->get_active ()); + raw_deadpix_filt->set_active (raw->get_active ()); raw_expos->set_active (raw->get_active ()); raw_preser->set_active (raw->get_active ()); raw_black->set_active (raw->get_active ()); - raw_ca_autocorrect->set_active (raw->get_active ()); - raw_caredblue->set_active (raw->get_active ()); - raw_hotpix_filt->set_active (raw->get_active ()); - raw_deadpix_filt->set_active (raw->get_active ()); - raw_linenoise->set_active (raw->get_active ()); - raw_greenthresh->set_active (raw->get_active ()); df_file->set_active (raw->get_active ()); df_AutoSelect->set_active (raw->get_active ()); ff_file->set_active (raw->get_active ()); ff_AutoSelect->set_active (raw->get_active ()); - ff_BlurRadius->set_active (raw->get_active ()); ff_BlurType->set_active (raw->get_active ()); + ff_BlurRadius->set_active (raw->get_active ()); ff_ClipControl->set_active (raw->get_active ()); + raw_ca_autocorrect->set_active (raw->get_active ()); + raw_caredblue->set_active (raw->get_active ()); } void PartialPasteDlg::basicToggled () @@ -521,14 +529,15 @@ void PartialPasteDlg::detailToggled () void PartialPasteDlg::advancedToggled () { - ConnectionBlocker waveletBlocker(waveletConn); ConnectionBlocker retinexBlocker(retinexConn); ConnectionBlocker colorappearanceBlocker(colorappearanceConn); + ConnectionBlocker waveletBlocker(waveletConn); advanced->set_inconsistent (false); + + retinex->set_active (advanced->get_active ()); + colorappearance->set_active (advanced->get_active ()); wavelet->set_active (advanced->get_active ()); - retinex->set_active (basic->get_active ()); - colorappearance->set_active (basic->get_active ()); } void PartialPasteDlg::colorToggled () @@ -540,14 +549,12 @@ void PartialPasteDlg::colorToggled () ConnectionBlocker chmixerbwBlocker(chmixerbwConn); ConnectionBlocker hsveqBlocker(hsveqConn); ConnectionBlocker filmSimulationBlocker(filmSimulationConn); - //ConnectionBlocker gamcsconnBlocker(gamcsconnConn); ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn); ConnectionBlocker colortoningBlocker(colortoningConn); color->set_inconsistent (false); icm->set_active (color->get_active ()); - //gam->set_active (color->get_active ()); vibrance->set_active (color->get_active ()); chmixer->set_active (color->get_active ()); blackwhite->set_active (color->get_active ()); From ff20dd1a4d84210d45f01d136730194d69118149 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 24 Jan 2018 20:05:34 +0100 Subject: [PATCH 197/200] Disable LIKELY and UNLIKELY for 32bit builds using gcc >= 7 --- rtengine/opthelper.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rtengine/opthelper.h b/rtengine/opthelper.h index d6af9a745..6b1830aa5 100644 --- a/rtengine/opthelper.h +++ b/rtengine/opthelper.h @@ -55,8 +55,13 @@ #ifdef __GNUC__ #define RESTRICT __restrict__ - #define LIKELY(x) __builtin_expect (!!(x), 1) - #define UNLIKELY(x) __builtin_expect (!!(x), 0) + #if __SIZEOF_POINTER__ == 4 && __GNUC__ >= 7 // there seems to be a bug with __builtin_expect on 32bit systems when using gcc >= 7 + #define LIKELY(x) (x) + #define UNLIKELY(x) (x) + #else + #define LIKELY(x) __builtin_expect (!!(x), 1) + #define UNLIKELY(x) __builtin_expect (!!(x), 0) + #endif #if (!defined(WIN32) || defined( __x86_64__ )) #define ALIGNED64 __attribute__ ((aligned (64))) #define ALIGNED16 __attribute__ ((aligned (16))) From e4555cc51ca6800b33a88566c1b78fa03a6ef668 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 24 Jan 2018 22:09:30 +0100 Subject: [PATCH 198/200] PP3 save: make sure that when nothing is selected, the PP3 is truly empty Fixes #4330 --- rtdata/languages/default | 3 ++- rtengine/procparams.cc | 4 ++-- rtgui/partialpastedlg.cc | 8 ++++++++ rtgui/partialpastedlg.h | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 4ae69440d..a71b6eb5f 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -910,7 +910,8 @@ PARTIALPASTE_LABCURVE;L*a*b* adjustments PARTIALPASTE_LENSGROUP;Lens Related Settings PARTIALPASTE_LENSPROFILE;Profiled lens correction PARTIALPASTE_LOCALCONTRAST;Local contrast -PARTIALPASTE_METAGROUP;Metadata +PARTIALPASTE_METAGROUP;Metadata settings +PARTIALPASTE_METADATA;Metadata mode PARTIALPASTE_PCVIGNETTE;Vignette filter PARTIALPASTE_PERSPECTIVE;Perspective PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 2c9da96f5..61cfe59d3 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3392,7 +3392,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSmooth, "RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftExp0, "RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftLmmse, "RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse, keyFile); - saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); +// saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBright, "RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel, "RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross, "RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross, keyFile); @@ -4716,7 +4716,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftSmoothFactor", pedited, raw.bayersensor.pixelShiftSmoothFactor, pedited->raw.bayersensor.pixelShiftSmooth); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftExp0", pedited, raw.bayersensor.pixelShiftExp0, pedited->raw.bayersensor.pixelShiftExp0); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftLmmse", pedited, raw.bayersensor.pixelShiftLmmse, pedited->raw.bayersensor.pixelShiftLmmse); - assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); +// assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBright", pedited, raw.bayersensor.pixelShiftEqualBright, pedited->raw.bayersensor.pixelShiftEqualBright); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBrightChannel", pedited, raw.bayersensor.pixelShiftEqualBrightChannel, pedited->raw.bayersensor.pixelShiftEqualBrightChannel); assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross", pedited, raw.bayersensor.pixelShiftNonGreenCross, pedited->raw.bayersensor.pixelShiftNonGreenCross); diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 49903cf56..b87694c47 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -97,6 +97,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren commonTrans = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COMMONTRANSFORMPARAMS"))); // Metadata: + metadata = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_METADATA"))); exifch = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES"))); iptc = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO"))); @@ -349,6 +350,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren commonTransConn = commonTrans->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); // Metadata: + metadataConn = metadata->signal_toggled().connect(sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); exifchConn = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); iptcConn = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); @@ -605,11 +607,13 @@ void PartialPasteDlg::compositionToggled () void PartialPasteDlg::metaToggled () { + ConnectionBlocker metadataBlocker(metadataConn); ConnectionBlocker exifchBlocker(exifchConn); ConnectionBlocker iptcBlocker(iptcConn); meta->set_inconsistent (false); + metadata->set_active(meta->get_active()); exifch->set_active (meta->get_active ()); iptc->set_active (meta->get_active ()); } @@ -785,6 +789,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.commonTrans = falsePE.commonTrans; } + if (!metadata->get_active()) { + filterPE.metadata = falsePE.metadata; + } + if (!exifch->get_active ()) { filterPE.exif = falsePE.exif; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index 08e8ed81e..e270a1e6e 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -93,6 +93,7 @@ public: Gtk::CheckButton* commonTrans; // options in meta: + Gtk::CheckButton *metadata; Gtk::CheckButton* exifch; Gtk::CheckButton* iptc; @@ -130,7 +131,7 @@ public: sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn; sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn; - sigc::connection exifchConn, iptcConn, icmConn; + sigc::connection metadataConn, exifchConn, iptcConn, icmConn; sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn; sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; From 258c286c8667ba07a8b9e53b5bc353c36f1b2a0e Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Wed, 24 Jan 2018 22:10:07 +0100 Subject: [PATCH 199/200] improve layout of the partial pp3 paste dialog move metadata group in the middle column --- rtgui/partialpastedlg.cc | 75 ++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index b87694c47..f11a94393 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -203,43 +203,44 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2); - //RAW - vboxes[6]->pack_start (*raw, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_preser, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); - //META - vboxes[7]->pack_start (*meta, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*meta, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start(*metadata, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); + + //RAW + vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*hseps[7], Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_preser, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ()); Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ()); @@ -249,11 +250,11 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vbCol1->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 3; i < 6; i++) { + for (int i = 3; i < 7; i++) { vbCol2->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 6; i < 8; i++) { + for (int i = 7; i < 8; i++) { vbCol3->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } From c0ceeb2c956d44461bf4788fcf3798645dbd7633 Mon Sep 17 00:00:00 2001 From: Hombre Date: Thu, 25 Jan 2018 00:51:46 +0100 Subject: [PATCH 200/200] Updated French strings --- rtdata/languages/Francais | 87 +++++++++++++++++++++------------------ rtdata/languages/default | 2 +- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 700691c7f..9f1d9d2f8 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -9,6 +9,7 @@ ADJUSTER_RESET_TO_DEFAULT;Réglages par défaut BATCHQUEUE_AUTOSTART;Démarrage auto BATCHQUEUE_AUTOSTARTHINT;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche BATCHQUEUE_DESTFILENAME;Chemin et nom de fichier +BATCHQUEUE_STARTSTOPHINT;Démarre ou arrête le traitement des images dans la file.\n\nRaccourci: Ctrl+s BATCH_PROCESSING;Traitement par lot CURVEEDITOR_AXIS_IN;E: CURVEEDITOR_AXIS_LEFT_TAN;TG: @@ -228,6 +229,7 @@ GENERAL_OK;OK GENERAL_OPEN;Ouvrir GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Enregistrer +GENERAL_SLIDER;Curseur GENERAL_UNCHANGED;(Inchangé) GENERAL_WARNING;Attention GIMP_PLUGIN_INFO;Bienvenue dans le plugin RawTherapee de GIMP!\nUne fois l'édition terminée, fermez simplement la fenêtre principale de RawTherapee et l'image sera importée automatiquement dans GIMP. @@ -415,6 +417,7 @@ HISTORY_MSG_169;Courbe 'CT' HISTORY_MSG_170;Vib. - Courbe HISTORY_MSG_171;Courbe 'LC' HISTORY_MSG_172;Lab - Restreindre 'LC' +HISTORY_MSG_173;Réd. de bruit - Récupération des détails HISTORY_MSG_174;Modèle d'Apparence de la Couleur 2002 HISTORY_MSG_175;CAM02 - Adaptation CAT02 HISTORY_MSG_176;CAM02 - Environ. de visionnage @@ -444,6 +447,7 @@ HISTORY_MSG_199;CAM02 - Histogrammes de sortie HISTORY_MSG_200;CAM02 - Compression tonale HISTORY_MSG_201;Réd. de bruit - Chrom. R,V HISTORY_MSG_202;Réd. de bruit - Chrom. B,J +HISTORY_MSG_203;Réd. de bruit - Espace couleur HISTORY_MSG_204;Niveau d'amélioration LMMSE HISTORY_MSG_205;CAM02 Pixels chauds/morts HISTORY_MSG_206;CAT02 - Luminosité de la scène auto @@ -495,6 +499,7 @@ HISTORY_MSG_252;CpND - Tons chair HISTORY_MSG_253;CpND - Réduction des artéfactes HISTORY_MSG_254;CpND - Teinte chair HISTORY_MSG_255;Réd. de bruit - Filtre médian +HISTORY_MSG_256;Réd. de bruit - Médian - Type HISTORY_MSG_257;Virage Partiel HISTORY_MSG_258;Virage Partiel - Couleur HISTORY_MSG_259;Virage Partiel - Opacité @@ -535,6 +540,7 @@ HISTORY_MSG_293;Simulation de Film HISTORY_MSG_294;Simulation de Film - Force HISTORY_MSG_295;Simulation de Film - Film HISTORY_MSG_296;Réd. de bruit - Courbe de luminance +HISTORY_MSG_297;Réd. de bruit - Mode HISTORY_MSG_298;Filtre de pixel mort HISTORY_MSG_299;Réd. de bruit - Courbe de chrominance HISTORY_MSG_300;- @@ -712,6 +718,17 @@ HISTORY_MSG_487;Corr. d'Obj. - Objectif HISTORY_MSG_488;Compression tonale HDR HISTORY_MSG_489;CT HDR - Seuil HISTORY_MSG_490;CT HDR - Quantité +HISTORY_MSG_491;Balances des Blancs +HISTORY_MSG_492;Courbes RVB +HISTORY_MSG_493;Ajustements L*a*b* +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virage Partiel - Correction couleur +HISTORY_MSG_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste Local - Quantité +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Local - Ombres +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste Local +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste Local - H.L. +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste Local - Rayon +HISTORY_MSG_METADATA_MODE;Mode de copie des métadonnées HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s HISTORY_SNAPSHOT;Capture @@ -797,6 +814,8 @@ MAIN_MSG_QOVERWRITE;Voulez-vous l'écraser? MAIN_MSG_SETPATHFIRST;Vous devez d'abord choisir un dossier cible dans Préférences\npour pouvoir utiliser cette fonction! MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n"%1"\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire. +MAIN_TAB_ADVANCED;Avancé +MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-w MAIN_TAB_COLOR;Couleur MAIN_TAB_COLOR_TOOLTIP;Raccourci:Alt-c MAIN_TAB_DETAIL;Détail @@ -851,6 +870,7 @@ NAVIGATOR_XY_FULL;Largeur = %1, Hauteur = %2 NAVIGATOR_XY_NA;x = n/d, y = n/d OPTIONS_DEFIMG_MISSING;Le profil par défaut pour les images standards n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez également le dossier de vos profils, il peut être manquant ou endommagé\n\nLes valeurs internes pas défaut seront utilisées. OPTIONS_DEFRAW_MISSING;Le profil par défaut pour les images Raw n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez également le dossier de vos profils, il peut être manquant ou endommagé\n\nLes valeurs internes pas défaut seront utilisées. +PARTIALPASTE_ADVANCEDGROUP;Réglages Avancés PARTIALPASTE_BASICGROUP;Réglages de base PARTIALPASTE_CACORRECTION;Aberration chromatique PARTIALPASTE_CHANNELMIXER;Mixage des canaux @@ -889,6 +909,8 @@ PARTIALPASTE_IPTCINFO;Infos IPTC PARTIALPASTE_LABCURVE;Courbes Lab PARTIALPASTE_LENSGROUP;Réglages de l'objectif PARTIALPASTE_LENSPROFILE;Profil de correction d'Objectif +PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_METADATA;Mode des Metadonnées PARTIALPASTE_METAGROUP;Réglages des Métadonnées PARTIALPASTE_PCVIGNETTE;Filtre Vignettage PARTIALPASTE_PERSPECTIVE;Perspective @@ -955,6 +977,12 @@ PREFERENCES_CLUTSCACHE;Cache HaldCLUT PREFERENCES_CLUTSCACHE_LABEL;Nombre maximum de chache CLUT PREFERENCES_CLUTSDIR;Dossier HaldCLUT PREFERENCES_CMMBPC;Compensation du point noir +PREFERENCES_CROP;Édition du recadrage +PREFERENCES_CROP_AUTO_FIT;Zommer automatiquement sur la zone recadrée +PREFERENCES_CROP_GUIDES;Guides affichés en dehors de l'édition du recadrage +PREFERENCES_CROP_GUIDES_FRAME;Cadre +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Aucun PREFERENCES_CURVEBBOXPOS;Position des boutons copier/coller des courbes PREFERENCES_CURVEBBOXPOS_ABOVE;Au-dessus PREFERENCES_CURVEBBOXPOS_BELOW;En-dessous @@ -986,6 +1014,7 @@ PREFERENCES_DIRLAST;Dernier dossier visité PREFERENCES_DIROTHER;Autre PREFERENCES_DIRSELECTDLG;Choix du dossier Image au lancement... PREFERENCES_DIRSOFTWARE;Dossier d'installation +PREFERENCES_EDITORCMDLINE;Ligne de commande personnelle PREFERENCES_EDITORLAYOUT;Disposition de l'éditeur PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Éditeur externe @@ -1381,6 +1410,7 @@ TP_COLORTONING_HIGHLIGHT;Hautes lumières TP_COLORTONING_HUE;Teinte TP_COLORTONING_LAB;Mixage Lab TP_COLORTONING_LABEL;Virage Partiel +TP_COLORTONING_LABGRID;Grille de correction L*a*b* TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4 TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Préserver la luminance @@ -1435,6 +1465,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Bleu-Jaune TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Courbe de chrominance +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Augmente (multiplie) la valeur de tous les curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones faiblement saturées et pour la diminuer dans celles très saturées. TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuel TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Maître @@ -1451,6 +1482,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Taille des tuiles =%1, Centre: Tx= TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Rouge-Vert TP_DIRPYRDENOISE_ENH;Mode amélioré TP_DIRPYRDENOISE_ENH_TOOLTIP;Augmente la qualité du débruitage, mais augmente le temps de traitement d'environ 20% +TP_DIRPYRDENOISE_LABEL;Réduction de Bruit TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Contrôle de luminance TP_DIRPYRDENOISE_LUMINANCE_CURVE;Courbe de luminance TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Niveau de détails de Luminance @@ -1526,6 +1558,8 @@ TP_EXPOSURE_CURVEEDITOR1;Courbe Tonale 1 TP_EXPOSURE_CURVEEDITOR2;Courbe Tonale 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Référez-vous à la section suivante du manuel pour en savoir plus sur les manières d'obtenir les meilleurs résultats avec l'option de double courbe:\nThe Toolbox > Exposure Tab > Exposure Panel > Tone Curve TP_EXPOSURE_EXPCOMP;Compensation d'exposition +TP_EXPOSURE_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Ajuste automatiquement les curseurs et courbes (excepté la compensation d'exposition) pour obtenir l'aspect de l'aperçu JPEG inclus. TP_EXPOSURE_LABEL;Exposition TP_EXPOSURE_SATURATION;Saturation TP_EXPOSURE_TCMODE_FILMLIKE;Similaire Film @@ -1662,6 +1696,15 @@ TP_LENSPROFILE_LABEL;Profil de correction d'objectif TP_LENSPROFILE_USECA;Corr. de l'aber. chromatique TP_LENSPROFILE_USEDIST;Corr. de la distortion TP_LENSPROFILE_USEVIGN;Corr. du vignettage +TP_LOCALCONTRAST_AMOUNT;Quantité +TP_LOCALCONTRAST_DARKNESS;Niveau des ombres +TP_LOCALCONTRAST_LABEL;Contraste Local +TP_LOCALCONTRAST_LIGHTNESS;Niveau des hautes-lumières +TP_LOCALCONTRAST_RADIUS;Rayon +TP_METADATA_EDIT;Appliquer les modifications +TP_METADATA_MODE;Mode de copie des métadonnées +TP_METADATA_STRIP;Retirer toutes les métadonnées +TP_METADATA_TUNNEL;Copier à l'identique TP_NEUTRAL;Réinit. TP_NEUTRAL_TIP;Réinitialise les valeurs de l'exposition à des valeurs neutres TP_PCVIGNETTE_FEATHER;Étendue @@ -1761,6 +1804,8 @@ TP_RAW_PIXELSHIFTNONGREENCROSS2;Vérifier vert AMaZE TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Vérifier rouge/bleu horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Vérifier rouge/bleu vertical TP_RAW_PIXELSHIFTNREADISO;Lire +TP_RAW_PIXELSHIFTONEGREEN;Utiliser un seul canal vert +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Utilise un seul canal vert au lieu de faire la moyennes des deux canaux verts pour détecter les régions sans mouvement. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Poid Rouge&Bleu TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement @@ -1774,6 +1819,7 @@ TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Adouci les transitions entre les zones avec mouv TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Facteur DevStd Bleu TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Facteur DevStd Vert TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Facteur DevStd Rouge +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Capteur à matrice de Bayer TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passes donne les meilleurs résultats (recommendé pour les images de faible ISO).\n1-passe est presque indifférentiable de 3-passes pour les images à haut ISO et est plus rapide. TP_RAW_SENSOR_XTRANS_LABEL;Capteur à matrice X-Trans @@ -2160,44 +2206,3 @@ ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: f ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: + ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s -!GENERAL_SLIDER;Slider -!HISTORY_MSG_173;NR - Detail recovery -!HISTORY_MSG_203;NR - Color space -!HISTORY_MSG_256;NR - Median - Type -!HISTORY_MSG_297;NR - Mode -!HISTORY_MSG_491;White Balance -!HISTORY_MSG_492;RGB Curves -!HISTORY_MSG_493;L*a*b* Adjustments -!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount -!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness -!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast -!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness -!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius -!HISTORY_MSG_METADATA_MODE;Metadata copy mode -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!PREFERENCES_CROP;Crop editing -!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area -!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop -!PREFERENCES_CROP_GUIDES_FRAME;Frame -!PREFERENCES_CROP_GUIDES_FULL;Original -!PREFERENCES_CROP_GUIDES_NONE;None -!PREFERENCES_EDITORCMDLINE;Custom command line -!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_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_LABEL;Noise Reduction -!TP_LOCALCONTRAST_AMOUNT;Amount -!TP_LOCALCONTRAST_DARKNESS;Darkness level -!TP_LOCALCONTRAST_LABEL;Local Contrast -!TP_LOCALCONTRAST_LIGHTNESS;Lightness level -!TP_LOCALCONTRAST_RADIUS;Radius -!TP_METADATA_EDIT;Apply modifications -!TP_METADATA_MODE;Metadata copy mode -!TP_METADATA_STRIP;Strip all metadata -!TP_METADATA_TUNNEL;Copy unchanged -!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average -!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. -!TP_RAW_RCD;RCD diff --git a/rtdata/languages/default b/rtdata/languages/default index a71b6eb5f..e263e94f1 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -910,8 +910,8 @@ PARTIALPASTE_LABCURVE;L*a*b* adjustments PARTIALPASTE_LENSGROUP;Lens Related Settings PARTIALPASTE_LENSPROFILE;Profiled lens correction PARTIALPASTE_LOCALCONTRAST;Local contrast -PARTIALPASTE_METAGROUP;Metadata settings PARTIALPASTE_METADATA;Metadata mode +PARTIALPASTE_METAGROUP;Metadata settings PARTIALPASTE_PCVIGNETTE;Vignette filter PARTIALPASTE_PERSPECTIVE;Perspective PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter