From 84ce72841e5a4d3cdf5eef2a711db849c3fc48b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Mar 2019 20:50:43 +0100 Subject: [PATCH 01/48] Decouple `rtengine/` from `rtgui/edit.h` --- rtengine/dcrop.cc | 2 ++ rtengine/improcfun.cc | 33 +++++++++++++++++++-------------- rtengine/pipettebuffer.cc | 2 ++ rtengine/pipettebuffer.h | 15 +++++++++------ rtgui/editid.h | 2 +- rtgui/mydiagonalcurve.cc | 9 +++++++-- rtgui/myflatcurve.cc | 9 +++++++-- 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 0872049d8..c033dba87 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -24,6 +24,8 @@ #include "refreshmap.h" #include "rt_math.h" +#include "../rtgui/edit.h" + namespace { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 4e2523137..91f56c015 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -17,33 +17,38 @@ * along with RawTherapee. If not, see . */ #include + #include #include + #ifdef _OPENMP #include #endif -#include "alignedbuffer.h" -#include "rtengine.h" #include "improcfun.h" + +#include "alignedbuffer.h" +#include "calc_distort.h" +#include "ciecam02.h" +#include "clutstore.h" +#include "color.h" #include "curves.h" -#include "mytime.h" +#include "EdgePreservingDecomposition.h" +#include "iccmatrices.h" #include "iccstore.h" #include "imagesource.h" -#include "rtthumbnail.h" -#include "utils.h" -#include "iccmatrices.h" -#include "color.h" -#include "calc_distort.h" -#include "rt_math.h" -#include "EdgePreservingDecomposition.h" #include "improccoordinator.h" -#include "clutstore.h" -#include "ciecam02.h" -#include "StopWatch.h" +#include "mytime.h" #include "procparams.h" -#include "../rtgui/ppversion.h" +#include "rt_math.h" +#include "rtengine.h" +#include "rtthumbnail.h" +#include "StopWatch.h" +#include "utils.h" + +#include "../rtgui/edit.h" #include "../rtgui/guiutils.h" +#include "../rtgui/ppversion.h" #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) diff --git a/rtengine/pipettebuffer.cc b/rtengine/pipettebuffer.cc index 8981b6480..5f5a5ce71 100644 --- a/rtengine/pipettebuffer.cc +++ b/rtengine/pipettebuffer.cc @@ -19,6 +19,8 @@ #include "pipettebuffer.h" +#include "../rtgui/edit.h" + namespace rtengine { diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h index 139438e1d..25ff55b51 100644 --- a/rtengine/pipettebuffer.h +++ b/rtengine/pipettebuffer.h @@ -16,17 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PIPETTEBUFFER_H_ -#define _PIPETTEBUFFER_H_ +#pragma once -#include "../rtgui/edit.h" #include "array2D.h" -#include "iimage.h" #include "coord.h" +#include "iimage.h" + +class EditDataProvider; +class EditSubscriber; + +enum EditUniqueID : int; namespace rtengine { +class Imagefloat; + /// @brief Structure that contains information about and pointers to the Edit buffer class PipetteBuffer { @@ -92,5 +97,3 @@ public: }; } - -#endif diff --git a/rtgui/editid.h b/rtgui/editid.h index c4f9315c0..5c1cf2389 100644 --- a/rtgui/editid.h +++ b/rtgui/editid.h @@ -21,7 +21,7 @@ /// @brief List of pipette editing operation -enum EditUniqueID { +enum EditUniqueID : int { EUID_None, /// special value (default) EUID_ToneCurve1, diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 59ac5a807..06e85728d 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -16,11 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "mydiagonalcurve.h" -#include "../rtengine/curves.h" #include + #include +#include "mydiagonalcurve.h" + +#include "edit.h" + +#include "../rtengine/curves.h" + MyDiagonalCurve::MyDiagonalCurve () : MyCurve(), closest_point(0), diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index ee7a2de5f..dfc61063f 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -16,11 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "myflatcurve.h" -#include "../rtengine/curves.h" #include + #include +#include "myflatcurve.h" + +#include "edit.h" + +#include "../rtengine/curves.h" + MyFlatCurve::MyFlatCurve () : MyCurve(), clampedX(0.0), From fe74625d78e9feb8c401023724097262f0ac0d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Mar 2019 20:55:31 +0100 Subject: [PATCH 02/48] Fix const correctness of `RTSurface::get()` --- rtgui/rtsurface.cc | 7 ++++++- rtgui/rtsurface.h | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rtgui/rtsurface.cc b/rtgui/rtsurface.cc index 9f692878d..e2ae41f49 100644 --- a/rtgui/rtsurface.cc +++ b/rtgui/rtsurface.cc @@ -133,7 +133,12 @@ bool RTSurface::hasSurface() const return surface ? true : false; } -const Cairo::RefPtr& RTSurface::get() const +Cairo::RefPtr RTSurface::get() const +{ + return surface; +} + +const Cairo::RefPtr& RTSurface::get() { return surface; } diff --git a/rtgui/rtsurface.h b/rtgui/rtsurface.h index d55506269..64e68d7a1 100644 --- a/rtgui/rtsurface.h +++ b/rtgui/rtsurface.h @@ -45,7 +45,8 @@ public: int getHeight() const; bool hasSurface() const; - const Cairo::RefPtr& get() const; + Cairo::RefPtr get() const; + const Cairo::RefPtr& get(); static void init(); static void updateImages (); From 363385a8381e679a851ba5df9dfda6360f68d9d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Thu, 21 Mar 2019 21:27:04 +0100 Subject: [PATCH 03/48] Streamline `RTSurface` and fix potential bug in `updateImages()` --- rtgui/rtsurface.cc | 157 +++++++++++++++++++++++---------------------- rtgui/rtsurface.h | 31 ++++----- 2 files changed, 93 insertions(+), 95 deletions(-) diff --git a/rtgui/rtsurface.cc b/rtgui/rtsurface.cc index e2ae41f49..230c3ff4f 100644 --- a/rtgui/rtsurface.cc +++ b/rtgui/rtsurface.cc @@ -19,66 +19,110 @@ #include -#include "options.h" #include "rtsurface.h" +#include "options.h" + namespace { -std::map> surfaceCache; +using SurfaceCache = std::map>; + +SurfaceCache surfaceCache; } -double RTSurface::dpiBack = 0.; -int RTSurface::scaleBack = 0; - -RTSurface::RTSurface () : RTScalable() +RTSurface::RTSurface() : + surface(new Cairo::ImageSurface(nullptr, false)) { - Cairo::RefPtr imgSurf(new Cairo::ImageSurface(nullptr, false)); - surface = imgSurf; } -RTSurface::RTSurface(const RTSurface& other) : RTScalable() +RTSurface::RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName) : + RTSurface() { - surface = other.surface; + setImage(fileName, rtlFileName); } -RTSurface::RTSurface (Glib::ustring fileName, Glib::ustring rtlFileName) : RTScalable() +void RTSurface::setImage(const Glib::ustring& fileName, const Glib::ustring& rtlFileName) { - Cairo::RefPtr imgSurf(new Cairo::ImageSurface(nullptr, false)); - surface = imgSurf; - setImage (fileName, rtlFileName); -} - -void RTSurface::setImage (Glib::ustring fileName, Glib::ustring rtlFileName) -{ - Glib::ustring imageName; - - if (!rtlFileName.empty() && getDirection() == Gtk::TEXT_DIR_RTL) { - imageName = rtlFileName; - } else { - imageName = fileName; - } + const Glib::ustring& imageName = + !rtlFileName.empty() && getDirection() == Gtk::TEXT_DIR_RTL + ? rtlFileName + : fileName; changeImage (imageName); } -void RTSurface::setDPInScale (const double newDPI, const int newScale) +int RTSurface::getWidth() const { - if (getScale() != newScale || (getScale() == 1 && getDPI() != newDPI)) { - RTScalable::setDPInScale(newDPI, newScale); + return + surface + ? surface->get_width() + : -1; +} + +int RTSurface::getHeight() const +{ + return + surface + ? surface->get_height() + : -1; +} + +bool RTSurface::hasSurface() const +{ + return static_cast(surface); +} + +Cairo::RefPtr RTSurface::get() const +{ + return surface; +} + +const Cairo::RefPtr& RTSurface::get() +{ + return surface; +} + +void RTSurface::init() +{ + dpiBack = getDPI(); + scaleBack = getScale(); +} + +void RTSurface::updateImages() +{ + const double tweakedDpi = getTweakedDPI(); + + for (auto& entry : surfaceCache) { + entry.second = loadImage(entry.first, tweakedDpi); + } +} + +void RTSurface::setDPInScale(const double newDPI, const int newScale) +{ + if ( + getScale() != newScale + || ( + getScale() == 1 + && getDPI() != newDPI + ) + ) { + setDPInScale(newDPI, newScale); dpiBack = getDPI(); scaleBack = getScale(); - //printf("RTSurface::setDPInScale : New scale = %d & new DPI = %.3f (%.3f asked) -> Reloading all RTSurface\n", scaleBack, dpiBack, newDPI); + updateImages(); } } -void RTSurface::changeImage (Glib::ustring imageName) +void RTSurface::changeImage(const Glib::ustring& imageName) { - auto iterator = surfaceCache.find (imageName); + const SurfaceCache::const_iterator iterator = surfaceCache.find(imageName); - if (iterator == surfaceCache.end ()) { + if (iterator != surfaceCache.end()) { + surface = iterator->second; + } else { surface = loadImage(imageName, getTweakedDPI()); // HOMBRE: As of now, GDK_SCALE is forced to 1, so setting the Cairo::ImageSurface scale is not required @@ -92,53 +136,10 @@ void RTSurface::changeImage (Glib::ustring imageName) } */ - iterator = surfaceCache.emplace (imageName, surface).first; - } - - surface = iterator->second; -} - -int RTSurface::getWidth() const -{ - return surface ? surface->get_width() : -1; -} - -int RTSurface::getHeight() const -{ - return surface ? surface->get_height() : -1; -} - -void RTSurface::init() -{ - dpiBack = RTScalable::getDPI(); - scaleBack = RTScalable::getScale(); -} - -void RTSurface::updateImages() -{ - double res = getTweakedDPI(); - for (auto entry : surfaceCache) { - entry.second = loadImage(entry.first, res); - //printf("RTSurface::updateImages : %s\n", entry.first.c_str()); + surfaceCache.emplace(imageName, surface); } } -void RTSurface::from(Glib::RefPtr other) -{ - surface = other->surface; -} +double RTSurface::dpiBack = 0.; -bool RTSurface::hasSurface() const -{ - return surface ? true : false; -} - -Cairo::RefPtr RTSurface::get() const -{ - return surface; -} - -const Cairo::RefPtr& RTSurface::get() -{ - return surface; -} +int RTSurface::scaleBack = 0; diff --git a/rtgui/rtsurface.h b/rtgui/rtsurface.h index 64e68d7a1..c314ab1c1 100644 --- a/rtgui/rtsurface.h +++ b/rtgui/rtsurface.h @@ -19,28 +19,21 @@ #pragma once #include + #include "rtscalable.h" /** * @brief A derived class of Gtk::Image in order to handle theme-related icon sets. */ -class RTSurface : public RTScalable +class RTSurface : + public RTScalable { - -private: - - static double dpiBack; // used to keep track of master dpi change - static int scaleBack; // used to keep track of master scale change - Cairo::RefPtr surface; - void changeImage (Glib::ustring imageName); - public: + RTSurface(); + RTSurface(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {}); - RTSurface (); - RTSurface (const RTSurface& other); - RTSurface (Glib::ustring fileName, Glib::ustring rtlFileName = Glib::ustring()); + void setImage(const Glib::ustring& fileName, const Glib::ustring& rtlFileName = {}); - void setImage (Glib::ustring fileName, Glib::ustring rtlFileName = Glib::ustring()); int getWidth() const; int getHeight() const; bool hasSurface() const; @@ -49,9 +42,13 @@ public: const Cairo::RefPtr& get(); static void init(); - static void updateImages (); - static void setDPInScale (const double newDPI, const int newScale); - static void setScale (const int newScale); + static void updateImages(); + static void setDPInScale(double newDPI, int newScale); - void from(Glib::RefPtr other); +private: + void changeImage(const Glib::ustring& imageName); + + static double dpiBack; // used to keep track of master dpi change + static int scaleBack; // used to keep track of master scale change + Cairo::RefPtr surface; }; From 25fdf2114e43da652c782f4dc786b3516ff08293 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 1 Jun 2019 16:56:10 +0200 Subject: [PATCH 04/48] Change thumbnail cache eviction strategy --- rtgui/cachemanager.cc | 70 +++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index d86f6c41f..d5a42e84b 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -16,18 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "cachemanager.h" #include #include #include +#include #include #ifdef WIN32 #include #endif +#include "cachemanager.h" #include "guiutils.h" #include "options.h" #include "procparamchangers.h" @@ -340,66 +341,63 @@ Glib::ustring CacheManager::getCacheFileName (const Glib::ustring& subDir, void CacheManager::applyCacheSizeLimitation () const { // first count files without fetching file name and timestamp. + auto cachedir = opendir(Glib::build_filename(baseDir, "data").c_str()); + if (!cachedir) { + return; + } + std::size_t numFiles = 0; - try { + while (readdir(cachedir)) { + ++numFiles; + } - const auto dirName = Glib::build_filename (baseDir, "data"); - const auto dir = Gio::File::create_for_path (dirName); - - auto enumerator = dir->enumerate_children (""); - - while (numFiles <= options.maxCacheEntries && enumerator->next_file ()) { - ++numFiles; - } - - } catch (Glib::Exception&) {} + closedir(cachedir); + numFiles -= 2; // because . and .. are counted if (numFiles <= options.maxCacheEntries) { return; } using FNameMTime = std::pair; + std::vector files; + files.reserve(numFiles); + constexpr auto md5_size = 32; + // get filenames and timestamps try { + const auto dir = Gio::File::create_for_path(Glib::build_filename(baseDir, "data")); + const auto enumerator = dir->enumerate_children("standard::name,time::modified"); - const auto dirName = Glib::build_filename (baseDir, "data"); - const auto dir = Gio::File::create_for_path (dirName); - - auto enumerator = dir->enumerate_children ("standard::name,time::modified"); - - while (auto file = enumerator->next_file ()) { - files.emplace_back (file->get_name (), file->modification_time ()); + while (const auto file = enumerator->next_file()) { + const auto name = file->get_name(); + if (name.size() >= md5_size + 5) { + files.emplace_back(name, file->modification_time()); + } } } catch (Glib::Exception&) {} - if (files.size () <= options.maxCacheEntries) { + if (files.size() <= options.maxCacheEntries) { + // limit not reached return; } - std::sort (files.begin (), files.end (), [] (const FNameMTime& lhs, const FNameMTime& rhs) + constexpr auto reserve = 0.05f; // reserve 5% free cache space + const size_t toDelete = files.size() - options.maxCacheEntries + options.maxCacheEntries * reserve; + + std::nth_element(files.begin(), files.begin() + toDelete, files.end(), [] (const FNameMTime& lhs, const FNameMTime& rhs) { return lhs.second < rhs.second; }); - auto cacheEntries = files.size (); - - for (auto entry = files.begin (); cacheEntries-- > options.maxCacheEntries; ++entry) { - + for (auto entry = files.begin(); entry < files.begin() + toDelete; ++entry) { const auto& name = entry->first; + const auto name_size = name.size() - md5_size; + const auto fname = name.substr(0, name_size - 5); + const auto md5 = name.substr(name_size - 4, md5_size); - constexpr auto md5_size = 32; - const auto name_size = name.size(); - - if (name_size < md5_size + 5) { - continue; - } - - const auto fname = name.substr (0, name_size - md5_size - 5); - const auto md5 = name.substr (name_size - md5_size - 4, md5_size); - - deleteFiles (fname, md5, true, false); + deleteFiles(fname, md5, true, false); } } From f9c44f2e4757fc8ca56c20121cb0483c09b0fa46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Mon, 3 Jun 2019 09:19:46 +0200 Subject: [PATCH 05/48] Some minor cleanups and optimizations --- rtgui/cachemanager.cc | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index d5a42e84b..2b35e1e7a 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -20,15 +20,16 @@ #include #include -#include #include #include +#include #ifdef WIN32 #include #endif #include "cachemanager.h" + #include "guiutils.h" #include "options.h" #include "procparamchangers.h" @@ -352,7 +353,9 @@ void CacheManager::applyCacheSizeLimitation () const } closedir(cachedir); - numFiles -= 2; // because . and .. are counted + if (numFiles > 2) { + numFiles -= 2; // because . and .. are counted + } if (numFiles <= options.maxCacheEntries) { return; @@ -363,7 +366,7 @@ void CacheManager::applyCacheSizeLimitation () const std::vector files; files.reserve(numFiles); - constexpr auto md5_size = 32; + constexpr std::size_t md5_size = 32; // get filenames and timestamps try { const auto dir = Gio::File::create_for_path(Glib::build_filename(baseDir, "data")); @@ -383,15 +386,19 @@ void CacheManager::applyCacheSizeLimitation () const return; } - constexpr auto reserve = 0.05f; // reserve 5% free cache space - const size_t toDelete = files.size() - options.maxCacheEntries + options.maxCacheEntries * reserve; + const std::size_t toDelete = files.size() - options.maxCacheEntries + options.maxCacheEntries * 100 / 5; // reserve 5% free cache space - std::nth_element(files.begin(), files.begin() + toDelete, files.end(), [] (const FNameMTime& lhs, const FNameMTime& rhs) - { - return lhs.second < rhs.second; - }); + std::nth_element( + files.begin(), + files.begin() + toDelete, + files.end(), + [](const FNameMTime& lhs, const FNameMTime& rhs) -> bool + { + return lhs.second < rhs.second; + } + ); - for (auto entry = files.begin(); entry < files.begin() + toDelete; ++entry) { + for (std::vector::const_iterator entry = files.begin(), end = files.begin() + toDelete; entry != end; ++entry) { const auto& name = entry->first; const auto name_size = name.size() - md5_size; const auto fname = name.substr(0, name_size - 5); From 386ae560b1bfcf3953accb5b9200651fc7f508c8 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 3 Jun 2019 14:32:22 +0200 Subject: [PATCH 06/48] generateTranslationDiffs --- rtdata/languages/Deutsch | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index a2f33e6fe..7f562d51c 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -201,10 +201,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Farbmarkierung\n\nTaste: Strg + FILEBROWSER_COPYPROFILE;Profil kopieren FILEBROWSER_CURRENT_NAME;Aktueller Name: FILEBROWSER_DARKFRAME;Dunkelbild +FILEBROWSER_DELETEDIALOG_ALL;Möchten Sie wirklich %1 Dateien unwiderruflich löschen? FILEBROWSER_DELETEDIALOG_HEADER;Dateien löschen FILEBROWSER_DELETEDIALOG_SELECTED;Möchten Sie wirklich %1 Datei(en) unwiderruflich löschen? FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Möchten Sie wirklich %1 Datei(en) unwiderruflich löschen, mit allen aus der Stapelverarbeitung resultierenden zugehörigen Ausgabedateien? FILEBROWSER_EMPTYTRASH;Papierkorb leeren +FILEBROWSER_EMPTYTRASHHINT;Alle Dateien im Papierkorb\nunwiderruflich löschen. FILEBROWSER_EXTPROGMENU;Öffnen mit FILEBROWSER_FLATFIELD;Weißbild FILEBROWSER_MOVETODARKFDIR;In Dunkelbild-Verzeichnis verschieben @@ -2358,9 +2360,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -FILEBROWSER_DELETEDIALOG_ALL;Möchten Sie wirklich %1 Dateien unwiderruflich löschen? -FILEBROWSER_EMPTYTRASHHINT;Alle Dateien im Papierkorb\nunwiderruflich löschen. From cc60ea224807a3057ef71aedab60b4e792ba3581 Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Mon, 3 Jun 2019 17:38:50 -0400 Subject: [PATCH 07/48] Fix source comment and misc. typos Found via `codespell -q 3 -I ../rawtherapy-whitelist.txt -S ./rtdata/languages -L hist,fo,reall,bloc,alph` --- rtdata/languages/default | 2 +- rtdata/options/options.lin | 2 +- rtdata/options/options.osx | 2 +- rtdata/options/options.win | 2 +- rtengine/EdgePreservingDecomposition.cc | 2 +- rtengine/color.h | 2 +- rtengine/demosaic_algos.cc | 6 +++--- rtengine/eahd_demosaic.cc | 2 +- rtengine/improcfun.cc | 6 +++--- rtengine/ipretinex.cc | 2 +- rtengine/ipwavelet.cc | 6 +++--- rtgui/myflatcurve.cc | 2 +- rtgui/options.cc | 2 +- rtgui/toolpanelcoord.cc | 4 ++-- win.cmake | 2 +- 15 files changed, 22 insertions(+), 22 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 3b96e1b17..5ea726218 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1429,7 +1429,7 @@ TP_COLORAPP_SURROUND_AVER;Average TP_COLORAPP_SURROUND_DARK;Dark TP_COLORAPP_SURROUND_DIM;Dim TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness TP_COLORAPP_TCMODE_CHROMA;Chroma TP_COLORAPP_TCMODE_COLORF;Colorfulness diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 91520dc0e..1d2f9faac 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -6,7 +6,7 @@ [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be useful if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache data in a single place, # an external HD for example MultiUser=true diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 4decccb6d..11c5da4c8 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -6,7 +6,7 @@ [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be useful if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache data in a single place, # an external HD for example MultiUser=true diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 40e73aacc..a4a767bf4 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -6,7 +6,7 @@ [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be useful if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache data in a single place, # an external HD for example MultiUser=true # Windows users should not use the system theme : some composed widget won't be usable diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 6505cedab..6bda5d437 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -406,7 +406,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max fp = 1; for(int ii = 1; ii < m; ii++) { - fp = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guarunteed positive since StartRows must be created in increasing order. + fp = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guaranteed positive since StartRows must be created in increasing order. mic = mic + fp; } diff --git a/rtengine/color.h b/rtengine/color.h index e1ce1c08c..a94302e30 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -1796,7 +1796,7 @@ public: static inline double huelab_to_huehsv2 (float HH) { //hr=translate Hue Lab value (-Pi +Pi) in approximative hr (hsv values) (0 1) [red 1/6 yellow 1/6 green 1/6 cyan 1/6 blue 1/6 magenta 1/6 ] - // with multi linear correspondances (I expect there is no error !!) + // with multi linear correspondences (I expect there is no error !!) double hr = 0.0; //always put h between 0 and 1 diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 3536f1053..dc12bc01a 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1206,10 +1206,10 @@ void RawImageSource::igv_interpolate(int winw, int winh) } for (; col < width; col++, indx += 2) { - dest1[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT datas + dest1[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT data col++; if(col < width) - dest2[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT datas + dest2[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT data } } @@ -1561,7 +1561,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) for (int row = 0; row < height - 0; row++) for (int col = 0, indx = row * width + col; col < width - 0; col++, indx++) { int c = FC(row, col); - rgb[c][indx] = CLIP(rawData[row][col]); //rawData = RT datas + rgb[c][indx] = CLIP(rawData[row][col]); //rawData = RT data } // border_interpolate2(7, rgb); diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc index 4bbf37c69..1663a087d 100644 --- a/rtengine/eahd_demosaic.cc +++ b/rtengine/eahd_demosaic.cc @@ -415,7 +415,7 @@ void RawImageSource::eahd_demosaic () } } - // finish H-2th and H-1th row, homogenity value is still valailable + // finish H-2th and H-1th row, homogeneity value is still available for (int i = H - 1; i < H + 1; i++) for (int j = 0; j < W; j++) { int hc = homh[(i - 1) % 3][j]; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index f63313126..53d930e1e 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -729,7 +729,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw const float hue = params->colorappearance.colorh; const float rstprotection = 100. - params->colorappearance.rstprotection; - // extracting datas from 'params' to avoid cache flush (to be confirmed) + // extracting data from 'params' to avoid cache flush (to be confirmed) const ColorAppearanceParams::TcMode curveMode = params->colorappearance.curveMode; const bool hasColCurve1 = bool (customColCurve1); const bool t1L = hasColCurve1 && curveMode == ColorAppearanceParams::TcMode::LIGHT; @@ -1668,7 +1668,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw -//all this treatments reduce artifacts, but can lead to slighty different results +//all this treatments reduce artifacts, but can lead to slightly different results if (params->defringe.enabled) if (execsharp) { @@ -2231,7 +2231,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float shoulder = ((65536.0 / max (1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; const float hlrange = 65536.0 - shoulder; const bool isProPhoto = (params->icm.workingProfile == "ProPhoto"); - // extracting datas from 'params' to avoid cache flush (to be confirmed) + // extracting data from 'params' to avoid cache flush (to be confirmed) ToneCurveMode curveMode = params->toneCurve.curveMode; ToneCurveMode curveMode2 = params->toneCurve.curveMode2; bool highlight = params->toneCurve.hrenabled;//Get the value if "highlight reconstruction" is activated diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index 9d94e9326..309c7073b 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -656,7 +656,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e float cdfactor = 32768.f / delta; maxCD = -9999999.f; minCD = 9999999.f; - // coeff for auto "transmission" with 2 sigma #95% datas + // coeff for auto "transmission" with 2 sigma #95% data float aza = 16300.f / (2.f * stddv); float azb = -aza * (mean - 2.f * stddv); float bza = 16300.f / (2.f * stddv); diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index e6e84bc50..ff7aefa19 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -3004,7 +3004,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if(useChromAndHue) { float modhue = varhue[ii][jj]; modchro = varchrom[ii * 2][jj * 2]; - // hue chroma skin with initial lab datas + // hue chroma skin with initial lab data scale = 1.f; if(skinprot > 0.f) { @@ -3216,7 +3216,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; float modhue = varhue[ii][jj]; float modchro = varchrom[ii * 2][jj * 2]; - // hue chroma skin with initial lab datas + // hue chroma skin with initial lab data float scale = 1.f; if(skinprot > 0.f) { @@ -3252,7 +3252,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, float modchro = varchrom[ii * 2][jj * 2]; if(useSkinControl) { - // hue chroma skin with initial lab datas + // hue chroma skin with initial lab data float LL100 = labco->L[ii * 2][jj * 2] / 327.68f; float modhue = varhue[ii][jj]; diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 03ee362a2..29558a22b 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -1621,7 +1621,7 @@ void MyFlatCurve::movePoint(bool moveX, bool moveY, bool pipetteDrag) } } -// Set datas relative to cursor position +// Set data relative to cursor position void MyFlatCurve::getCursorPosition(Gdk::EventType evType, bool isHint, int evX, int evY, Gdk::ModifierType modifierKey) { int tx, ty; diff --git a/rtgui/options.cc b/rtgui/options.cc index 8f601b764..2437f5313 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -44,7 +44,7 @@ // User's settings directory, including images' profiles if used Glib::ustring Options::rtdir; -// User's cached datas' directory +// User's cached data directory Glib::ustring Options::cacheBaseDir; Options options; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index a595b1b1c..41e25387e 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -768,8 +768,8 @@ rtengine::RawImage* ToolPanelCoordinator::getFF() const rtengine::FramesMetaData *imd = ipc->getInitialImage()->getMetaData(); if (imd) { - // int iso = imd->getISOSpeed(); temporarilly removed because unused - // double shutter = imd->getShutterSpeed(); temporarilly removed because unused + // int iso = imd->getISOSpeed(); temporarily removed because unused + // double shutter = imd->getShutterSpeed(); temporarily removed because unused double aperture = imd->getFNumber(); double focallength = imd->getFocalLen(); std::string maker ( imd->getMake() ); diff --git a/win.cmake b/win.cmake index 9c292b2df..8b1caa12d 100644 --- a/win.cmake +++ b/win.cmake @@ -5,7 +5,7 @@ #set(CMAKE_BUILD_TYPE Release CACHE STRING "Between: None Debug Release RelWithDebInfo MinSizeRel.") set(CMAKE_INSTALL_PREFIX ./${CMAKE_BUILD_TYPE} CACHE PATH "Libraries installation path") -set(DATADIR . CACHE PATH "Datas installation path") +set(DATADIR . CACHE PATH "Data installation path") set(BINDIR . CACHE PATH "Binaries installation path") set(LIBDIR . CACHE PATH "Libraries installation path") set(DOCDIR ./doc CACHE PATH "Documentation installation path") From d46a043add523ee3136f2e897fb67f8be63f4cb7 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 4 Jun 2019 14:17:38 +0200 Subject: [PATCH 08/48] basic support for Fujifilm GFX 100 --- rtengine/camconst.json | 5 +++++ rtengine/dcraw.cc | 2 ++ 2 files changed, 7 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 2492eec28..9e6ec49b6 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1245,6 +1245,11 @@ Camera constants: "ranges": { "white": 64886 } }, + { // Quality C + "make_model": "FUJIFILM GFX 100", + "raw_crop": [ 0, 2, 11664, 8734 ] + }, + { // Quality B "make_model": "FUJIFILM GFX 50S", "dcraw_matrix": [ 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 ], // DNGv9.9 D65 diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ceb40f279..68934314e 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9279,6 +9279,8 @@ void CLASS identify() apply_tiff(); if (!strcmp(model, "X-T3")) { height = raw_height - 2; + } else if (!strcmp(model, "GFX 100")) { + load_flags = 0; } if (!load_raw) { load_raw = &CLASS unpacked_load_raw; From f18724e0166acb369f7c7f16a26bc773cc2794d3 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 4 Jun 2019 16:30:22 +0200 Subject: [PATCH 09/48] Silence some warnings --- rtengine/dcraw.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 68934314e..ae8aefa91 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -4,6 +4,9 @@ #if (__GNUC__ >= 6) #pragma GCC diagnostic ignored "-Wmisleading-indentation" #endif +#if (__GNUC__ >= 9) +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif #endif /*RT*/#include From a391e256bcf63ab3fcae4568c0525fa3496cdf29 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 4 Jun 2019 16:30:54 +0200 Subject: [PATCH 10/48] Fix possibly uninitialized variable --- rtengine/procparams.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 6d914bb27..c24ee0049 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -3965,7 +3965,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (ppVersion >= 346) { assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, sharpenMicro.uniformity, pedited->sharpenMicro.uniformity); } else { - double temp; + double temp = 50.0; assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, temp, pedited->sharpenMicro.uniformity); sharpenMicro.uniformity = temp / 10; } From 3c0b0ffd331ca6d9bae8eed63723bf17a9c6e1e4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 4 Jun 2019 17:01:05 +0200 Subject: [PATCH 11/48] Small speedup for loading unpacked 16 bit raw files --- rtengine/dcraw.cc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ae8aefa91..280b692e7 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -2507,11 +2507,19 @@ void CLASS unpacked_load_raw() while (1 << ++bits < maximum); read_shorts (raw_image, raw_width*raw_height); - for (row=0; row < raw_height; row++) - for (col=0; col < raw_width; col++) - if ((RAW(row,col) >>= load_flags) >> bits - && (unsigned) (row-top_margin) < height - && (unsigned) (col-left_margin) < width) derror(); + if (load_flags) { + for (row=0; row < raw_height; row++) + for (col=0; col < raw_width; col++) + if ((RAW(row,col) >>= load_flags) >> bits + && (unsigned) (row-top_margin) < height + && (unsigned) (col-left_margin) < width) derror(); + } else if (bits < 16) { + for (row=0; row < raw_height; row++) + for (col=0; col < raw_width; col++) + if (RAW(row,col) >> bits + && (unsigned) (row-top_margin) < height + && (unsigned) (col-left_margin) < width) derror(); + } } From df65774667f3d62cbc0698f219f743f81f910cd5 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 4 Jun 2019 17:52:39 +0200 Subject: [PATCH 12/48] Fix calculation of reserve --- rtgui/cachemanager.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 2b35e1e7a..b270c3795 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -386,7 +386,7 @@ void CacheManager::applyCacheSizeLimitation () const return; } - const std::size_t toDelete = files.size() - options.maxCacheEntries + options.maxCacheEntries * 100 / 5; // reserve 5% free cache space + const std::size_t toDelete = files.size() - options.maxCacheEntries + options.maxCacheEntries * 5 / 100; // reserve 5% free cache space std::nth_element( files.begin(), From 6486c491f8aafcb0e17b9c06172dbdaaf6b25cfa Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 5 Jun 2019 12:55:08 +0200 Subject: [PATCH 13/48] Vibrance causes RT to freeze, fixes #5346 --- rtengine/ipvibrance.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index 9bb4bc087..ca938fbbe 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -612,6 +612,7 @@ void ImProcFunctions::vibrance (LabImage* lab) const float fyy = Color::c1By116 * Lprov + Color::c16By116; const float yy_ = (Lprov > Color::epskap) ? fyy * fyy*fyy : Lprov / Color::kappaf; + float ChprovOld = std::numeric_limits::min(); do { inGamut = true; @@ -625,10 +626,15 @@ void ImProcFunctions::vibrance (LabImage* lab) hhModified = false; } } - aprovn = Chprov * sincosval.y; bprovn = Chprov * sincosval.x; + if (Chprov == ChprovOld) { // avoid endless loop + break; + } else { + ChprovOld = Chprov; + } + float fxx = 0.002f * aprovn + fyy; float fzz = fyy - 0.005f * bprovn; float xx_ = Color::f2xyz(fxx) * Color::D50x; From dec20d09fddd4f7493831a11c9935ae1a9fb8421 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Thu, 6 Jun 2019 22:26:34 -0700 Subject: [PATCH 14/48] Mac bundle: update to libomp and `--timestamp` the code signings. --- tools/osx/macosx_bundle.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 1413b5d76..f3ff8d8ca 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -165,11 +165,8 @@ cp /opt/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" # Copy liblensfun to Frameworks cp /opt/local/lib/liblensfun.2.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}" +# Copy libomp to Frameworks +cp /opt/local/lib/libomp.dylib "${RESOURCES}/../Frameworks" # Install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do @@ -207,7 +204,7 @@ plutil -convert binary1 "${CONTENTS}/Info.plist" # Sign the app CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" -codesign --deep --force -v -s "${CODESIGNID}" "${APP}" +codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${APP}" spctl -a -vvvv "${APP}" function CreateDmg { @@ -237,7 +234,7 @@ function CreateDmg { hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" # Sign disk image - codesign --deep --force -v -s "${CODESIGNID}" "${dmg_name}.dmg" + codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" # Zip disk image for redistribution zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt From 3b19b9f55b18042180969ad06babf1639dc528e2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Fri, 7 Jun 2019 16:37:59 +0200 Subject: [PATCH 15/48] Rawtherapee 5.6 crashes with.dng from PixelShift2DNG-0.9.8.67, fixes #5348 --- rtengine/rawimage.cc | 2 +- rtengine/rtthumbnail.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 18848274a..1fa1630ab 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -767,7 +767,7 @@ float** RawImage::compress_image(unsigned int frameNum, bool freeImage) this->data[row][col] = image[row * width + col][0]; } } else { - if(get_maker() == "Sigma" && dng_version) { // Hack to prevent sigma dng files from crashing + if((get_maker() == "Sigma" || get_maker() == "Pentax" || get_maker() == "Sony") && dng_version) { // Hack to prevent sigma dng files and dng files from PixelShift2DNG from crashing height -= top_margin; width -= left_margin; } diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 1ee09dcf3..0a74cf8c2 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -714,7 +714,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati int wmax = tmpw; int hmax = tmph; - if (ri->get_maker() == "Sigma" && ri->DNGVERSION()) { // Hack to prevent sigma dng files from crashing + if ((ri->get_maker() == "Sigma" || ri->get_maker() == "Pentax" || ri->get_maker() == "Sony") && ri->DNGVERSION()) { // Hack to prevent sigma dng files from crashing wmax = (width - 2 - left_margin) / hskip; hmax = (height - 2 - top_margin) / vskip; } From c0a033e717181a32e7e6d1a8c8334180573ce33e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sat, 8 Jun 2019 15:13:44 +0200 Subject: [PATCH 16/48] interpolateBadPixelsXtrans() : fix oob access --- rtengine/rawimagesource.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 0f0d31c40..b8c422545 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1298,6 +1298,7 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads ) for(dx = -2, dy = 0; dx <= 2 && !distance2PixelFound; dx += 4) if(ri->XTRANSFC(row, col + dx) == pixelColor) { distance2PixelFound = true; + break; } if(!distance2PixelFound) @@ -1306,6 +1307,7 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads ) for(dx = 0, dy = -2; dy <= 2 && !distance2PixelFound; dy += 4) if(ri->XTRANSFC(row + dy, col) == pixelColor) { distance2PixelFound = true; + break; } // calculate the value of its virtual counterpart (marked with a V in above examples) From 1e4f9ac2488eabb85221746f32e7040e89c51eaf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 9 Jun 2019 14:36:38 +0200 Subject: [PATCH 17/48] Avoid integer overflow when accessing luts with very large values --- rtengine/LUT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index de668cca8..9f16995d0 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -444,7 +444,7 @@ public: } idx = 0; - } else if (idx > maxs) { + } else if (index > maxsf) { if (clip & LUT_CLIP_ABOVE) { return data[upperBound]; } From f0d32c1da704b36fd3b1a409fdf08c7d26f219ec Mon Sep 17 00:00:00 2001 From: heckflosse Date: Sun, 9 Jun 2019 14:37:33 +0200 Subject: [PATCH 18/48] White dot artifacts caused by CIECAM02, fixes #5342 --- rtengine/improcfun.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 53d930e1e..c2e0c5b50 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1261,8 +1261,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw } Qpro = Qanc * (Qq / Qold); - // Jpro = 100.f * (Qpro * Qpro) / ((4.0f / c) * (4.0f / c) * (aw + 4.0f) * (aw + 4.0f)); - Jpro = Jpro * SQR (Qq / Qold); + Jpro = SQR ((10.f * Qpro) / wh); if (Jpro < 1.f) { Jpro = 1.f; @@ -1342,11 +1341,8 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Qold = 0.001f; } - // Qpro = (float) (Qq * (coef) / 327.68f); Qpro = Qanc * (Qq / Qold); - Jpro = Jpro * SQR (Qq / Qold); - - // Jpro = 100.f * (Qpro * Qpro) / ((4.0f / c) * (4.0f / c) * (aw + 4.0f) * (aw + 4.0f)); + Jpro = SQR ((10.f * Qpro) / wh); if (t1L) { //to workaround the problem if we modify curve1-lightnees after curve2 brightness(the cat that bites its own tail!) in fact it's another type of curve only for this case coef = 2.f; //adapt Q to J approximation From fe16bf79176c2c21d6d32061e2b10a1271293cbf Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 10 Jun 2019 16:40:44 +0200 Subject: [PATCH 19/48] Move badpixel code to own compilation unit --- rtengine/CMakeLists.txt | 1 + rtengine/badpixels.cc | 576 ++++++++++++++++++++++++++++++++++++ rtengine/dfmanager.h | 1 + rtengine/ffmanager.h | 1 - rtengine/pixelsmap.h | 98 +++++++ rtengine/rawimage.h | 72 ----- rtengine/rawimagesource.cc | 580 +------------------------------------ rtengine/rawimagesource.h | 11 +- 8 files changed, 697 insertions(+), 643 deletions(-) create mode 100644 rtengine/badpixels.cc create mode 100644 rtengine/pixelsmap.h diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index a1037f5a3..b44413224 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -30,6 +30,7 @@ link_directories("${PROJECT_SOURCE_DIR}/rtexif" set(CAMCONSTSFILE "camconst.json") set(RTENGINESOURCEFILES + badpixels.cc CA_correct_RT.cc EdgePreservingDecomposition.cc FTblockDN.cc diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc new file mode 100644 index 000000000..8d02be4a7 --- /dev/null +++ b/rtengine/badpixels.cc @@ -0,0 +1,576 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 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 "array2D.h" +#include "median.h" +#include "pixelsmap.h" +#include "rawimagesource.h" + +namespace rtengine +{ + +/* interpolateBadPixelsBayer: correct raw pixels looking at the bitmap + * takes into consideration if there are multiple bad pixels in the neighbourhood + */ +int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D &rawData) +{ + constexpr float eps = 1.f; + int counter = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) +#endif + + for(int row = 2; row < H - 2; ++row) { + for(int col = 2; col < W - 2; ++col) { + const int sk = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero + + if (sk) { + col += sk - 1; //-1 is because of col++ in cycle + continue; + } + + if (!bitmapBads.get(col, row)) { + continue; + } + + float wtdsum = 0.f, norm = 0.f; + + // diagonal interpolation + if (FC(row, col) == 1) { + // green channel. We can use closer pixels than for red or blue channel. Distance to centre pixel is sqrt(2) => weighting is 0.70710678 + // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad + // 0 0 0 0 0 + // 0 1 0 1 0 + // 0 0 0 0 0 + // 0 1 0 1 0 + // 0 0 0 0 0 + for (int dx = -1; dx <= 1; dx += 2) { + if (bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { + continue; + } + + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); + wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); + norm += dirwt; + } + } else { + // red and blue channel. Distance to centre pixel is sqrt(8) => weighting is 0.35355339 + // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad + // 1 0 0 0 1 + // 0 0 0 0 0 + // 0 0 0 0 0 + // 0 0 0 0 0 + // 1 0 0 0 1 + for (int dx = -2; dx <= 2; dx += 4) { + if (bitmapBads.get(col + dx, row - 2) || bitmapBads.get(col - dx, row + 2)) { + continue; + } + + const float dirwt = 0.35355339f / (fabsf(rawData[row - 2][col + dx] - rawData[row + 2][col - dx]) + eps); + wtdsum += dirwt * (rawData[row - 2][col + dx] + rawData[row + 2][col - dx]); + norm += dirwt; + } + } + + // channel independent. Distance to centre pixel is 2 => weighting is 0.5 + // Additionally for all channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad + // 0 0 1 0 0 + // 0 0 0 0 0 + // 1 0 0 0 1 + // 0 0 0 0 0 + // 0 0 1 0 0 + + // horizontal interpolation + if (!(bitmapBads.get(col - 2, row) || bitmapBads.get(col + 2, row))) { + const float dirwt = 0.5f / (fabsf(rawData[row][col - 2] - rawData[row][col + 2]) + eps); + wtdsum += dirwt * (rawData[row][col - 2] + rawData[row][col + 2]); + norm += dirwt; + } + + // vertical interpolation + if (!(bitmapBads.get(col, row - 2) || bitmapBads.get(col, row + 2))) { + const float dirwt = 0.5f / (fabsf(rawData[row - 2][col] - rawData[row + 2][col]) + eps); + wtdsum += dirwt * (rawData[row - 2][col] + rawData[row + 2][col]); + norm += dirwt; + } + + if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% + rawData[row][col] = wtdsum / (2.f * norm); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps + counter++; + } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens + int tot = 0; + float sum = 0.f; + + for (int dy = -2; dy <= 2; dy += 2) { + for (int dx = -2; dx <= 2; dx += 2) { + if (bitmapBads.get(col + dx, row + dy)) { + continue; + } + + sum += rawData[row + dy][col + dx]; + tot++; + } + } + + if (tot > 0) { + rawData[row][col] = sum / tot; + counter ++; + } + } + } + } + + return counter; // Number of interpolated pixels. +} + +/* interpolateBadPixelsNColours: correct raw pixels looking at the bitmap + * takes into consideration if there are multiple bad pixels in the neighbourhood + */ +int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, const int colours) +{ + constexpr float eps = 1.f; + int counter = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) +#endif + + for (int row = 2; row < H - 2; ++row) { + for (int col = 2; col < W - 2; ++col) { + const int sk = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero + + if (sk) { + col += sk - 1; //-1 is because of col++ in cycle + continue; + } + + if (!bitmapBads.get(col, row)) { + continue; + } + + float wtdsum[colours] = {}; + float norm[colours] = {}; + + // diagonal interpolation + for (int dx = -1; dx <= 1; dx += 2) { + if (bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { + continue; + } + + for (int c = 0; c < colours; ++c) { + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][(col + dx) * colours + c] - rawData[row + 1][(col - dx) * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colours + c] + rawData[row + 1][(col - dx) * colours + c]); + norm[c] += dirwt; + } + } + + // horizontal interpolation + if (!(bitmapBads.get(col - 1, row) || bitmapBads.get(col + 1, row))) { + for (int c = 0; c < colours; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row][(col - 1) * colours + c] - rawData[row][(col + 1) * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row][(col - 1) * colours + c] + rawData[row][(col + 1) * colours + c]); + norm[c] += dirwt; + } + } + + // vertical interpolation + if (!(bitmapBads.get(col, row - 1) || bitmapBads.get(col, row + 1))) { + for (int c = 0; c < colours; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row - 1][col * colours + c] - rawData[row + 1][col * colours + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][col * colours + c] + rawData[row + 1][col * colours + c]); + norm[c] += dirwt; + } + } + + if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% + for (int c = 0; c < colours; ++c) { + rawData[row][col * colours + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps + } + + counter++; + } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens + int tot = 0; + float sum[colours] = {}; + + for (int dy = -2; dy <= 2; dy += 2) { + for (int dx = -2; dx <= 2; dx += 2) { + if (bitmapBads.get(col + dx, row + dy)) { + continue; + } + + for (int c = 0; c < colours; ++c) { + sum[c] += rawData[row + dy][(col + dx) * colours + c]; + } + + tot++; + } + } + + if (tot > 0) { + for (int c = 0; c < colours; ++c) { + rawData[row][col * colours + c] = sum[c] / tot; + } + + counter ++; + } + } + } + } + + return counter; // Number of interpolated pixels. +} + +/* interpolateBadPixelsXtrans: correct raw pixels looking at the bitmap + * takes into consideration if there are multiple bad pixels in the neighbourhood + */ +int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) +{ + constexpr float eps = 1.f; + int counter = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) +#endif + + for (int row = 2; row < H - 2; ++row) { + for (int col = 2; col < W - 2; ++col) { + const int skip = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero + + if (skip) { + col += skip - 1; //-1 is because of col++ in cycle + continue; + } + + if (!bitmapBads.get(col, row)) { + continue; + } + + float wtdsum = 0.f, norm = 0.f; + unsigned int pixelColor = ri->XTRANSFC(row, col); + + if (pixelColor == 1) { + // green channel. A green pixel can either be a solitary green pixel or a member of a 2x2 square of green pixels + if (ri->XTRANSFC(row, col - 1) == ri->XTRANSFC(row, col + 1)) { + // If left and right neighbour have same colour, then this is a solitary green pixel + // For these the following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. + // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad + // 0 means, the pixel has a different colour and will not be used + // 0 1 0 2 0 + // 3 5 0 6 4 + // 0 0 P 0 0 + // 4 6 0 5 3 + // 0 2 0 1 0 + for (int dx = -1; dx <= 1; dx += 2) { // pixels marked 5 or 6 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f + if (bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { + continue; + } + + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); + wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); + norm += dirwt; + } + + for (int dx = -1; dx <= 1; dx += 2) { // pixels marked 1 or 2 on above example. Distance to P is sqrt(5) => weighting is 0.44721359f + if (bitmapBads.get(col + dx, row - 2) || bitmapBads.get(col - dx, row + 2)) { + continue; + } + + const float dirwt = 0.44721359f / (fabsf(rawData[row - 2][col + dx] - rawData[row + 2][col - dx]) + eps); + wtdsum += dirwt * (rawData[row - 2][col + dx] + rawData[row + 2][col - dx]); + norm += dirwt; + } + + for (int dx = -2; dx <= 2; dx += 4) { // pixels marked 3 or 4 on above example. Distance to P is sqrt(5) => weighting is 0.44721359f + if (bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { + continue; + } + + const float dirwt = 0.44721359f / (fabsf(rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); + wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); + norm += dirwt; + } + } else { + // this is a member of a 2x2 square of green pixels + // For these the following pixels will be used for interpolation. Pixel to be interpolated is at position P in the example. + // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad + // 0 means, the pixel has a different colour and will not be used + // 1 0 0 3 + // 0 P 2 0 + // 0 2 1 0 + // 3 0 0 0 + + // pixels marked 1 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f + const int offset1 = ri->XTRANSFC(row - 1, col - 1) == ri->XTRANSFC(row + 1, col + 1) ? 1 : -1; + + if (!(bitmapBads.get(col - offset1, row - 1) || bitmapBads.get(col + offset1, row + 1))) { + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][col - offset1] - rawData[row + 1][col + offset1]) + eps); + wtdsum += dirwt * (rawData[row - 1][col - offset1] + rawData[row + 1][col + offset1]); + norm += dirwt; + } + + // pixels marked 2 in above example. Distance to P is 1 => weighting is 1.f + int offsety = ri->XTRANSFC(row - 1, col) != 1 ? 1 : -1; + int offsetx = offset1 * offsety; + + if (!(bitmapBads.get(col + offsetx, row) || bitmapBads.get(col, row + offsety))) { + const float dirwt = 1.f / (fabsf(rawData[row][col + offsetx] - rawData[row + offsety][col]) + eps); + wtdsum += dirwt * (rawData[row][col + offsetx] + rawData[row + offsety][col]); + norm += dirwt; + } + + const int offsety2 = -offsety; + const int offsetx2 = -offsetx; + offsetx *= 2; + offsety *= 2; + + // pixels marked 3 in above example. Distance to P is sqrt(5) => weighting is 0.44721359f + if (!(bitmapBads.get(col + offsetx, row + offsety2) || bitmapBads.get(col + offsetx2, row + offsety))) { + const float dirwt = 0.44721359f / (fabsf(rawData[row + offsety2][col + offsetx] - rawData[row + offsety][col + offsetx2]) + eps); + wtdsum += dirwt * (rawData[row + offsety2][col + offsetx] + rawData[row + offsety][col + offsetx2]); + norm += dirwt; + } + } + } else { + // red and blue channel. + // Each red or blue pixel has exactly one neighbour of same colour in distance 2 and four neighbours of same colour which can be reached by a move of a knight in chess. + // For the distance 2 pixel (marked with an X) we generate a virtual counterpart (marked with a V) + // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. + // Pairs of pixels used in this step are numbered except for distance 2 pixels which are marked X and V. A pair will be used if none of the pixels of the pair is marked bad + // 0 1 0 0 0 0 0 X 0 0 remaining cases are symmetric + // 0 0 0 0 2 1 0 0 0 2 + // X 0 P 0 V 0 0 P 0 0 + // 0 0 0 0 1 0 0 0 0 0 + // 0 2 0 0 0 0 2 V 1 0 + + // Find two knight moves landing on a pixel of same colour as the pixel to be interpolated. + // If we look at first and last row of 5x5 square, we will find exactly two knight pixels. + // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the centre pixel + // When we find a knight pixel, we get its counterpart, which has distance (+-3,+-3), where the signs of distance depend on the corner of the found knight pixel. + // These pixels are marked 1 or 2 in above examples. Distance to P is sqrt(5) => weighting is 0.44721359f + // The following loop simply scans the four possible places. To keep things simple, it does not stop after finding two knight pixels, because it will not find more than two + for (int d1 = -2, offsety = 3; d1 <= 2; d1 += 4, offsety -= 6) { + for (int d2 = -1, offsetx = 3; d2 < 1; d2 += 2, offsetx -= 6) { + if (ri->XTRANSFC(row + d1, col + d2) == pixelColor) { + if (!(bitmapBads.get(col + d2, row + d1) || bitmapBads.get(col + d2 + offsetx, row + d1 + offsety))) { + const float dirwt = 0.44721359f / (fabsf(rawData[row + d1][col + d2] - rawData[row + d1 + offsety][col + d2 + offsetx]) + eps); + wtdsum += dirwt * (rawData[row + d1][col + d2] + rawData[row + d1 + offsety][col + d2 + offsetx]); + norm += dirwt; + } + } + } + } + + // now scan for the pixel of same colour in distance 2 in each direction (marked with an X in above examples). + bool distance2PixelFound = false; + int dx, dy; + + // check horizontal + for (dx = -2, dy = 0; dx <= 2 && !distance2PixelFound; dx += 4) { + if (ri->XTRANSFC(row, col + dx) == pixelColor) { + distance2PixelFound = true; + break; + } + } + + if (!distance2PixelFound) { + // no distance 2 pixel on horizontal, check vertical + for (dx = 0, dy = -2; dy <= 2 && !distance2PixelFound; dy += 4) { + if (ri->XTRANSFC(row + dy, col) == pixelColor) { + distance2PixelFound = true; + break; + } + } + } + + // calculate the value of its virtual counterpart (marked with a V in above examples) + float virtualPixel; + + if (dy == 0) { + virtualPixel = 0.5f * (rawData[row - 1][col - dx] + rawData[row + 1][col - dx]); + } else { + virtualPixel = 0.5f * (rawData[row - dy][col - 1] + rawData[row - dy][col + 1]); + } + + // and weight as usual. Distance to P is 2 => weighting is 0.5f + const float dirwt = 0.5f / (fabsf(virtualPixel - rawData[row + dy][col + dx]) + eps); + wtdsum += dirwt * (virtualPixel + rawData[row + dy][col + dx]); + norm += dirwt; + } + + if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% + rawData[row][col] = wtdsum / (2.f * norm); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps + counter++; + } + } + } + + return counter; // Number of interpolated pixels. +} + +/* Search for hot or dead pixels in the image and update the map + * For each pixel compare its value to the average of similar colour surrounding + * (Taken from Emil Martinec idea) + * (Optimized by Ingo Weyrich 2013 and 2015) + */ +int RawImageSource::findHotDeadPixels(PixelsMap &bpMap, const float thresh, const bool findHotPixels, const bool findDeadPixels) const +{ + const float varthresh = (20.0 * (thresh / 100.0) + 1.0) / 24.f; + + // allocate temporary buffer + float* cfablur = new float[H * W]; + + // counter for dead or hot pixels + int counter = 0; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) nowait +#endif + + for (int i = 2; i < H - 2; i++) { + for (int j = 2; j < W - 2; j++) { + const float temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], + rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], + rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); + cfablur[i * W + j] = rawData[i][j] - temp; + } + } + + // process borders. Former version calculated the median using mirrored border which does not make sense because the original pixel loses weight + // Setting the difference between pixel and median for border pixels to zero should do the job not worse then former version +#ifdef _OPENMP + #pragma omp single +#endif + { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < W; ++j) { + cfablur[i * W + j] = 0.f; + } + } + + for (int i = 2; i < H - 2; ++i) { + for (int j = 0; j < 2; ++j) { + cfablur[i * W + j] = 0.f; + } + + for (int j = W - 2; j < W; ++j) { + cfablur[i * W + j] = 0.f; + } + } + + for (int i = H - 2; i < H; ++i) { + for (int j = 0; j < W; ++j) { + cfablur[i * W + j] = 0.f; + } + } + } + +#ifdef _OPENMP + #pragma omp barrier // barrier because of nowait clause above + + #pragma omp for reduction(+:counter) schedule(dynamic,16) +#endif + + //cfa pixel heat/death evaluation + for (int rr = 2; rr < H - 2; ++rr) { + for (int cc = 2, rrmWpcc = rr * W + 2; cc < W - 2; ++cc, ++rrmWpcc) { + //evaluate pixel for heat/death + float pixdev = cfablur[rrmWpcc]; + + if (pixdev == 0.f) { + continue; + } + + if ((!findDeadPixels) && pixdev < 0) { + continue; + } + + if ((!findHotPixels) && pixdev > 0) { + continue; + } + + pixdev = fabsf(pixdev); + float hfnbrave = -pixdev; + +#ifdef __SSE2__ + // sum up 5*4 = 20 values using SSE + // 10 fabs function calls and 10 float additions with SSE + vfloat sum = vabsf(LVFU(cfablur[(rr - 2) * W + cc - 2])) + vabsf(LVFU(cfablur[(rr - 1) * W + cc - 2])); + sum += vabsf(LVFU(cfablur[(rr) * W + cc - 2])); + sum += vabsf(LVFU(cfablur[(rr + 1) * W + cc - 2])); + sum += vabsf(LVFU(cfablur[(rr + 2) * W + cc - 2])); + // horizontally add the values and add the result to hfnbrave + hfnbrave += vhadd(sum); + + // add remaining 5 values of last column + for (int mm = rr - 2; mm <= rr + 2; ++mm) { + hfnbrave += fabsf(cfablur[mm * W + cc + 2]); + } + +#else + + // 25 fabs function calls and 25 float additions without SSE + for (int mm = rr - 2; mm <= rr + 2; ++mm) { + for (int nn = cc - 2; nn <= cc + 2; ++nn) { + hfnbrave += fabsf(cfablur[mm * W + nn]); + } + } + +#endif + + if (pixdev > varthresh * hfnbrave) { + // mark the pixel as "bad" + bpMap.set(cc, rr); + counter++; + } + }//end of pixel evaluation + } + }//end of parallel processing + delete [] cfablur; + return counter; +} + +int RawImageSource::findZeroPixels(PixelsMap &bpMap) const +{ + int counter = 0; + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) +#endif + + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + if (ri->data[i][j] == 0.f) { + bpMap.set(j, i); + counter++; + } + } + } + return counter; +} + + +} diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 1cc22723b..62379187b 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -20,6 +20,7 @@ #include #include #include +#include "pixelsmap.h" #include "rawimage.h" namespace rtengine diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 4a65c2ed7..7022d1641 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -86,7 +86,6 @@ public: protected: typedef std::multimap ffList_t; - typedef std::map > bpList_t; ffList_t ffList; bool initialized; Glib::ustring currentPath; diff --git a/rtengine/pixelsmap.h b/rtengine/pixelsmap.h new file mode 100644 index 000000000..63dce4233 --- /dev/null +++ b/rtengine/pixelsmap.h @@ -0,0 +1,98 @@ +#pragma once + +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 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 "noncopyable.h" + +namespace rtengine +{ + +struct badPix { + uint16_t x; + uint16_t y; + badPix(uint16_t xc, uint16_t yc): x(xc), y(yc) {} +}; + +class PixelsMap : + public NonCopyable +{ + int w; // line width in base_t units + int h; // height + typedef unsigned long base_t; + static const size_t base_t_size = sizeof(base_t); + base_t *pm; + +public: + PixelsMap(int width, int height) + : w((width / (base_t_size * 8)) + 1), h(height), pm(new base_t[h * w]) + { + clear(); + } + + ~PixelsMap() + { + delete [] pm; + } + int width() const + { + return w; + } + int height() const + { + return h; + } + + // if a pixel is set returns true + bool get(int x, int y) const + { + return (pm[y * w + x / (base_t_size * 8)] & (base_t)1 << (x % (base_t_size * 8))) != 0; + } + + // set a pixel + void set(int x, int y) + { + pm[y * w + x / (base_t_size * 8)] |= (base_t)1 << (x % (base_t_size * 8)) ; + } + + // set pixels from a list + int set(const std::vector &bp) + { + for (std::vector::const_iterator iter = bp.begin(); iter != bp.end(); ++iter) { + set(iter->x, iter->y); + } + + return bp.size(); + } + + void clear() + { + memset(pm, 0, h * w * base_t_size); + } + // return 0 if at least one pixel in the word(base_t) is set, otherwise return the number of pixels to skip to the next word base_t + int skipIfZero(int x, int y) const + { + return pm[y * w + x / (base_t_size * 8)] == 0 ? base_t_size * 8 - x % (base_t_size * 8) : 0; + } +}; + +} diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 0dabfef0d..8e92495a1 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -25,82 +25,10 @@ #include "dcraw.h" #include "imageformat.h" -#include "noncopyable.h" namespace rtengine { -struct badPix { - uint16_t x; - uint16_t y; - badPix( uint16_t xc, uint16_t yc ): x(xc), y(yc) {} -}; - -class PixelsMap : - public NonCopyable -{ - int w; // line width in base_t units - int h; // height - typedef unsigned long base_t; - static const size_t base_t_size = sizeof(base_t); - base_t *pm; - -public: - PixelsMap(int width, int height ) - : h(height) - { - w = (width / (base_t_size * 8)) + 1; - pm = new base_t [h * w ]; - memset(pm, 0, h * w * base_t_size ); - } - - ~PixelsMap() - { - delete [] pm; - } - int width() const - { - return w; - } - int height() const - { - return h; - } - - // if a pixel is set returns true - bool get(int x, int y) - { - return (pm[y * w + x / (base_t_size * 8) ] & (base_t)1 << (x % (base_t_size * 8)) ) != 0; - } - - // set a pixel - void set(int x, int y) - { - pm[y * w + x / (base_t_size * 8) ] |= (base_t)1 << (x % (base_t_size * 8)) ; - } - - // set pixels from a list - int set( std::vector &bp) - { - for(std::vector::iterator iter = bp.begin(); iter != bp.end(); ++iter) { - set( iter->x, iter->y); - } - - return bp.size(); - } - - void clear() - { - memset(pm, 0, h * w * base_t_size ); - } - // return 0 if at least one pixel in the word(base_t) is set, otherwise return the number of pixels to skip to the next word base_t - int skipIfZero(int x, int y) - { - return pm[y * w + x / (base_t_size * 8) ] == 0 ? base_t_size * 8 - x % (base_t_size * 8) : 0; - } -}; - - class RawImage: public DCraw { public: diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index b8c422545..3b2738405 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -930,542 +930,6 @@ void RawImageSource::convertColorSpace(Imagefloat* image, const ColorManagementP colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast(getMetaData()))->getCamera()); } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -/* interpolateBadPixelsBayer: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood - */ -int RawImageSource::interpolateBadPixelsBayer( PixelsMap &bitmapBads, array2D &rawData ) -{ - static const float eps = 1.f; - int counter = 0; -#ifdef _OPENMP - #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) -#endif - - for( int row = 2; row < H - 2; row++ ) { - for(int col = 2; col < W - 2; col++ ) { - int sk = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero - - if( sk ) { - col += sk - 1; //-1 is because of col++ in cycle - continue; - } - - if(!bitmapBads.get(col, row)) { - continue; - } - - float wtdsum = 0.f, norm = 0.f; - - // diagonal interpolation - if(FC(row, col) == 1) { - // green channel. We can use closer pixels than for red or blue channel. Distance to centre pixel is sqrt(2) => weighting is 0.70710678 - // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. - // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad - // 0 0 0 0 0 - // 0 1 0 1 0 - // 0 0 0 0 0 - // 0 1 0 1 0 - // 0 0 0 0 0 - for( int dx = -1; dx <= 1; dx += 2) { - if( bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { - continue; - } - - float dirwt = 0.70710678f / ( fabsf( rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); - wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); - norm += dirwt; - } - } else { - // red and blue channel. Distance to centre pixel is sqrt(8) => weighting is 0.35355339 - // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. - // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad - // 1 0 0 0 1 - // 0 0 0 0 0 - // 0 0 0 0 0 - // 0 0 0 0 0 - // 1 0 0 0 1 - for( int dx = -2; dx <= 2; dx += 4) { - if( bitmapBads.get(col + dx, row - 2) || bitmapBads.get(col - dx, row + 2)) { - continue; - } - - float dirwt = 0.35355339f / ( fabsf( rawData[row - 2][col + dx] - rawData[row + 2][col - dx]) + eps); - wtdsum += dirwt * (rawData[row - 2][col + dx] + rawData[row + 2][col - dx]); - norm += dirwt; - } - } - - // channel independent. Distance to centre pixel is 2 => weighting is 0.5 - // Additionally for all channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. - // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad - // 0 0 1 0 0 - // 0 0 0 0 0 - // 1 0 0 0 1 - // 0 0 0 0 0 - // 0 0 1 0 0 - - // horizontal interpolation - if(!(bitmapBads.get(col - 2, row) || bitmapBads.get(col + 2, row))) { - float dirwt = 0.5f / ( fabsf( rawData[row][col - 2] - rawData[row][col + 2]) + eps); - wtdsum += dirwt * (rawData[row][col - 2] + rawData[row][col + 2]); - norm += dirwt; - } - - // vertical interpolation - if(!(bitmapBads.get(col, row - 2) || bitmapBads.get(col, row + 2))) { - float dirwt = 0.5f / ( fabsf( rawData[row - 2][col] - rawData[row + 2][col]) + eps); - wtdsum += dirwt * (rawData[row - 2][col] + rawData[row + 2][col]); - norm += dirwt; - } - - if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% - rawData[row][col] = wtdsum / (2.f * norm); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps - counter++; - } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens - int tot = 0; - float sum = 0; - - for( int dy = -2; dy <= 2; dy += 2) { - for( int dx = -2; dx <= 2; dx += 2) { - if(bitmapBads.get(col + dx, row + dy)) { - continue; - } - - sum += rawData[row + dy][col + dx]; - tot++; - } - } - - if (tot > 0) { - rawData[row][col] = sum / tot; - counter ++; - } - } - } - } - - return counter; // Number of interpolated pixels. -} - -/* interpolateBadPixels3Colours: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood - */ -int RawImageSource::interpolateBadPixelsNColours( PixelsMap &bitmapBads, const int colours ) -{ - static const float eps = 1.f; - int counter = 0; -#ifdef _OPENMP - #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) -#endif - - for( int row = 2; row < H - 2; row++ ) { - for(int col = 2; col < W - 2; col++ ) { - int sk = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero - - if( sk ) { - col += sk - 1; //-1 is because of col++ in cycle - continue; - } - - if(!bitmapBads.get(col, row)) { - continue; - } - - float wtdsum[colours], norm[colours]; - - for (int i = 0; i < colours; ++i) { - wtdsum[i] = norm[i] = 0.f; - } - - // diagonal interpolation - for( int dx = -1; dx <= 1; dx += 2) { - if( bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { - continue; - } - - for(int c = 0; c < colours; c++) { - float dirwt = 0.70710678f / ( fabsf( rawData[row - 1][(col + dx) * colours + c] - rawData[row + 1][(col - dx) * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colours + c] + rawData[row + 1][(col - dx) * colours + c]); - norm[c] += dirwt; - } - } - - // horizontal interpolation - if(!(bitmapBads.get(col - 1, row) || bitmapBads.get(col + 1, row))) { - for(int c = 0; c < colours; c++) { - float dirwt = 1.f / ( fabsf( rawData[row][(col - 1) * colours + c] - rawData[row][(col + 1) * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row][(col - 1) * colours + c] + rawData[row][(col + 1) * colours + c]); - norm[c] += dirwt; - } - } - - // vertical interpolation - if(!(bitmapBads.get(col, row - 1) || bitmapBads.get(col, row + 1))) { - for(int c = 0; c < colours; c++) { - float dirwt = 1.f / ( fabsf( rawData[row - 1][col * colours + c] - rawData[row + 1][col * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][col * colours + c] + rawData[row + 1][col * colours + c]); - norm[c] += dirwt; - } - } - - if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% - for(int c = 0; c < colours; c++) { - rawData[row][col * colours + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps - } - - counter++; - } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens - int tot = 0; - float sum[colours]; - - for (int i = 0; i < colours; ++i) { - sum[i] = 0.f; - } - - for( int dy = -2; dy <= 2; dy += 2) { - for( int dx = -2; dx <= 2; dx += 2) { - if(bitmapBads.get(col + dx, row + dy)) { - continue; - } - - for(int c = 0; c < colours; c++) { - sum[c] += rawData[row + dy][(col + dx) * colours + c]; - } - - tot++; - } - } - - if (tot > 0) { - for(int c = 0; c < colours; c++) { - rawData[row][col * colours + c] = sum[c] / tot; - } - - counter ++; - } - } - } - } - - return counter; // Number of interpolated pixels. -} -/* interpolateBadPixelsXtrans: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood - */ -int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads ) -{ - static const float eps = 1.f; - int counter = 0; -#ifdef _OPENMP - #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) -#endif - - for( int row = 2; row < H - 2; row++ ) { - for(int col = 2; col < W - 2; col++ ) { - int skip = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero - - if( skip ) { - col += skip - 1; //-1 is because of col++ in cycle - continue; - } - - if(!bitmapBads.get(col, row)) { - continue; - } - - float wtdsum = 0.f, norm = 0.f; - unsigned int pixelColor = ri->XTRANSFC(row, col); - - if(pixelColor == 1) { - // green channel. A green pixel can either be a solitary green pixel or a member of a 2x2 square of green pixels - if(ri->XTRANSFC(row, col - 1) == ri->XTRANSFC(row, col + 1)) { - // If left and right neighbour have same colour, then this is a solitary green pixel - // For these the following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. - // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad - // 0 means, the pixel has a different colour and will not be used - // 0 1 0 2 0 - // 3 5 0 6 4 - // 0 0 P 0 0 - // 4 6 0 5 3 - // 0 2 0 1 0 - for( int dx = -1; dx <= 1; dx += 2) { // pixels marked 5 or 6 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f - if( bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { - continue; - } - - float dirwt = 0.70710678f / ( fabsf( rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); - wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); - norm += dirwt; - } - - for( int dx = -1; dx <= 1; dx += 2) { // pixels marked 1 or 2 on above example. Distance to P is sqrt(5) => weighting is 0.44721359f - if( bitmapBads.get(col + dx, row - 2) || bitmapBads.get(col - dx, row + 2)) { - continue; - } - - float dirwt = 0.44721359f / ( fabsf( rawData[row - 2][col + dx] - rawData[row + 2][col - dx]) + eps); - wtdsum += dirwt * (rawData[row - 2][col + dx] + rawData[row + 2][col - dx]); - norm += dirwt; - } - - for( int dx = -2; dx <= 2; dx += 4) { // pixels marked 3 or 4 on above example. Distance to P is sqrt(5) => weighting is 0.44721359f - if( bitmapBads.get(col + dx, row - 1) || bitmapBads.get(col - dx, row + 1)) { - continue; - } - - float dirwt = 0.44721359f / ( fabsf( rawData[row - 1][col + dx] - rawData[row + 1][col - dx]) + eps); - wtdsum += dirwt * (rawData[row - 1][col + dx] + rawData[row + 1][col - dx]); - norm += dirwt; - } - } else { - // this is a member of a 2x2 square of green pixels - // For these the following pixels will be used for interpolation. Pixel to be interpolated is at position P in the example. - // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad - // 0 means, the pixel has a different colour and will not be used - // 1 0 0 3 - // 0 P 2 0 - // 0 2 1 0 - // 3 0 0 0 - - // pixels marked 1 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f - int offset1 = ri->XTRANSFC(row - 1, col - 1) == ri->XTRANSFC(row + 1, col + 1) ? 1 : -1; - - if( !(bitmapBads.get(col - offset1, row - 1) || bitmapBads.get(col + offset1, row + 1))) { - float dirwt = 0.70710678f / ( fabsf( rawData[row - 1][col - offset1] - rawData[row + 1][col + offset1]) + eps); - wtdsum += dirwt * (rawData[row - 1][col - offset1] + rawData[row + 1][col + offset1]); - norm += dirwt; - } - - // pixels marked 2 in above example. Distance to P is 1 => weighting is 1.f - int offsety = (ri->XTRANSFC(row - 1, col) != 1 ? 1 : -1); - int offsetx = offset1 * offsety; - - if( !(bitmapBads.get(col + offsetx, row) || bitmapBads.get(col, row + offsety))) { - float dirwt = 1.f / ( fabsf( rawData[row][col + offsetx] - rawData[row + offsety][col]) + eps); - wtdsum += dirwt * (rawData[row][col + offsetx] + rawData[row + offsety][col]); - norm += dirwt; - } - - int offsety2 = -offsety; - int offsetx2 = -offsetx; - offsetx *= 2; - offsety *= 2; - - // pixels marked 3 in above example. Distance to P is sqrt(5) => weighting is 0.44721359f - if( !(bitmapBads.get(col + offsetx, row + offsety2) || bitmapBads.get(col + offsetx2, row + offsety))) { - float dirwt = 0.44721359f / ( fabsf( rawData[row + offsety2][col + offsetx] - rawData[row + offsety][col + offsetx2]) + eps); - wtdsum += dirwt * (rawData[row + offsety2][col + offsetx] + rawData[row + offsety][col + offsetx2]); - norm += dirwt; - } - } - } else { - // red and blue channel. - // Each red or blue pixel has exactly one neighbour of same colour in distance 2 and four neighbours of same colour which can be reached by a move of a knight in chess. - // For the distance 2 pixel (marked with an X) we generate a virtual counterpart (marked with a V) - // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. - // Pairs of pixels used in this step are numbered except for distance 2 pixels which are marked X and V. A pair will be used if none of the pixels of the pair is marked bad - // 0 1 0 0 0 0 0 X 0 0 remaining cases are symmetric - // 0 0 0 0 2 1 0 0 0 2 - // X 0 P 0 V 0 0 P 0 0 - // 0 0 0 0 1 0 0 0 0 0 - // 0 2 0 0 0 0 2 V 1 0 - - // Find two knight moves landing on a pixel of same colour as the pixel to be interpolated. - // If we look at first and last row of 5x5 square, we will find exactly two knight pixels. - // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the centre pixel - // When we find a knight pixel, we get its counterpart, which has distance (+-3,+-3), where the signs of distance depend on the corner of the found knight pixel. - // These pixels are marked 1 or 2 in above examples. Distance to P is sqrt(5) => weighting is 0.44721359f - // The following loop simply scans the four possible places. To keep things simple, it does not stop after finding two knight pixels, because it will not find more than two - for(int d1 = -2, offsety = 3; d1 <= 2; d1 += 4, offsety -= 6) { - for(int d2 = -1, offsetx = 3; d2 < 1; d2 += 2, offsetx -= 6) { - if(ri->XTRANSFC(row + d1, col + d2) == pixelColor) { - if( !(bitmapBads.get(col + d2, row + d1) || bitmapBads.get(col + d2 + offsetx, row + d1 + offsety))) { - float dirwt = 0.44721359f / ( fabsf( rawData[row + d1][col + d2] - rawData[row + d1 + offsety][col + d2 + offsetx]) + eps); - wtdsum += dirwt * (rawData[row + d1][col + d2] + rawData[row + d1 + offsety][col + d2 + offsetx]); - norm += dirwt; - } - } - } - } - - // now scan for the pixel of same colour in distance 2 in each direction (marked with an X in above examples). - bool distance2PixelFound = false; - int dx, dy; - - // check horizontal - for(dx = -2, dy = 0; dx <= 2 && !distance2PixelFound; dx += 4) - if(ri->XTRANSFC(row, col + dx) == pixelColor) { - distance2PixelFound = true; - break; - } - - if(!distance2PixelFound) - - // no distance 2 pixel on horizontal, check vertical - for(dx = 0, dy = -2; dy <= 2 && !distance2PixelFound; dy += 4) - if(ri->XTRANSFC(row + dy, col) == pixelColor) { - distance2PixelFound = true; - break; - } - - // calculate the value of its virtual counterpart (marked with a V in above examples) - float virtualPixel; - - if(dy == 0) { - virtualPixel = 0.5f * (rawData[row - 1][col - dx] + rawData[row + 1][col - dx]); - } else { - virtualPixel = 0.5f * (rawData[row - dy][col - 1] + rawData[row - dy][col + 1]); - } - - // and weight as usual. Distance to P is 2 => weighting is 0.5f - float dirwt = 0.5f / ( fabsf( virtualPixel - rawData[row + dy][col + dx]) + eps); - wtdsum += dirwt * (virtualPixel + rawData[row + dy][col + dx]); - norm += dirwt; - } - - if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% - rawData[row][col] = wtdsum / (2.f * norm); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps - counter++; - } - } - } - - return counter; // Number of interpolated pixels. -} -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -/* Search for hot or dead pixels in the image and update the map - * For each pixel compare its value to the average of similar colour surrounding - * (Taken from Emil Martinec idea) - * (Optimized by Ingo Weyrich 2013 and 2015) - */ -int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels ) -{ - float varthresh = (20.0 * (thresh / 100.0) + 1.0 ) / 24.f; - - // allocate temporary buffer - float* cfablur; - cfablur = (float (*)) malloc (H * W * sizeof * cfablur); - - // counter for dead or hot pixels - int counter = 0; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) nowait -#endif - - for (int i = 2; i < H - 2; i++) { - for (int j = 2; j < W - 2; j++) { - const float& temp = median(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2], - rawData[i][j - 2], rawData[i][j], rawData[i][j + 2], - rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2]); - cfablur[i * W + j] = rawData[i][j] - temp; - } - } - - // process borders. Former version calculated the median using mirrored border which does not make sense because the original pixel loses weight - // Setting the difference between pixel and median for border pixels to zero should do the job not worse then former version -#ifdef _OPENMP - #pragma omp single -#endif - { - for(int i = 0; i < 2; i++) { - for(int j = 0; j < W; j++) { - cfablur[i * W + j] = 0.f; - } - } - - for(int i = 2; i < H - 2; i++) { - for(int j = 0; j < 2; j++) { - cfablur[i * W + j] = 0.f; - } - - for(int j = W - 2; j < W; j++) { - cfablur[i * W + j] = 0.f; - } - } - - for(int i = H - 2; i < H; i++) { - for(int j = 0; j < W; j++) { - cfablur[i * W + j] = 0.f; - } - } - } -#ifdef _OPENMP - #pragma omp barrier // barrier because of nowait clause above - - #pragma omp for reduction(+:counter) schedule(dynamic,16) -#endif - - //cfa pixel heat/death evaluation - for (int rr = 2; rr < H - 2; rr++) { - int rrmWpcc = rr * W + 2; - - for (int cc = 2; cc < W - 2; cc++, rrmWpcc++) { - //evaluate pixel for heat/death - float pixdev = cfablur[rrmWpcc]; - - if(pixdev == 0.f) { - continue; - } - - if((!findDeadPixels) && pixdev < 0) { - continue; - } - - if((!findHotPixels) && pixdev > 0) { - continue; - } - - pixdev = fabsf(pixdev); - float hfnbrave = -pixdev; - -#ifdef __SSE2__ - // sum up 5*4 = 20 values using SSE - // 10 fabs function calls and float 10 additions with SSE - vfloat sum = vabsf(LVFU(cfablur[(rr - 2) * W + cc - 2])) + vabsf(LVFU(cfablur[(rr - 1) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr + 1) * W + cc - 2])); - sum += vabsf(LVFU(cfablur[(rr + 2) * W + cc - 2])); - // horizontally add the values and add the result to hfnbrave - hfnbrave += vhadd(sum); - - // add remaining 5 values of last column - for (int mm = rr - 2; mm <= rr + 2; mm++) { - hfnbrave += fabsf(cfablur[mm * W + cc + 2]); - } - -#else - - // 25 fabs function calls and 25 float additions without SSE - for (int mm = rr - 2; mm <= rr + 2; mm++) { - for (int nn = cc - 2; nn <= cc + 2; nn++) { - hfnbrave += fabsf(cfablur[mm * W + nn]); - } - } - -#endif - - if (pixdev > varthresh * hfnbrave) { - // mark the pixel as "bad" - bpMap.set(cc, rr); - counter++; - } - }//end of pixel evaluation - } - }//end of parallel processing - free (cfablur); - return counter; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - void RawImageSource::getFullSize (int& w, int& h, int tr) { @@ -1741,23 +1205,13 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le printf( "Subtracting Darkframe:%s\n", rid->get_filename().c_str()); } - PixelsMap *bitmapBads = nullptr; + std::unique_ptr bitmapBads; int totBP = 0; // Hold count of bad pixels to correct if(ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica) - bitmapBads = new PixelsMap(W, H); -#ifdef _OPENMP - #pragma omp parallel for reduction(+:totBP) schedule(dynamic,16) -#endif - - for(int i = 0; i < H; i++) - for(int j = 0; j < W; j++) { - if(ri->data[i][j] == 0.f) { - bitmapBads->set(j, i); - totBP++; - } - } + bitmapBads.reset(new PixelsMap(W, H)); + totBP = findZeroPixels(*(bitmapBads.get())); if( settings->verbose) { printf( "%d pixels with value zero marked as bad pixels\n", totBP); @@ -1821,10 +1275,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if( bp ) { if(!bitmapBads) { - bitmapBads = new PixelsMap(W, H); + bitmapBads.reset(new PixelsMap(W, H)); } - totBP += bitmapBads->set( *bp ); + totBP += bitmapBads->set(*bp); if( settings->verbose ) { std::cout << "Correcting " << bp->size() << " pixels from .badpixels" << std::endl; @@ -1842,10 +1296,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if(bp) { if(!bitmapBads) { - bitmapBads = new PixelsMap(W, H); + bitmapBads.reset(new PixelsMap(W, H)); } - totBP += bitmapBads->set( *bp ); + totBP += bitmapBads->set(*bp); if( settings->verbose && !bp->empty()) { std::cout << "Correcting " << bp->size() << " hotpixels from darkframe" << std::endl; @@ -1917,10 +1371,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } if(!bitmapBads) { - bitmapBads = new PixelsMap(W, H); + bitmapBads.reset(new PixelsMap(W, H)); } - int nFound = findHotDeadPixels( *bitmapBads, raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); + int nFound = findHotDeadPixels(*(bitmapBads.get()), raw.hotdeadpix_thresh, raw.hotPixelFilter, raw.deadPixelFilter ); totBP += nFound; if( settings->verbose && nFound > 0) { @@ -1932,10 +1386,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le PDAFLinesFilter f(ri); if (!bitmapBads) { - bitmapBads = new PixelsMap(W, H); + bitmapBads.reset(new PixelsMap(W, H)); } - int n = f.mark(rawData, *bitmapBads); + int n = f.mark(rawData, *(bitmapBads.get())); totBP += n; if (n > 0) { @@ -1999,15 +1453,15 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le if ( ri->getSensorType() == ST_BAYER ) { if(numFrames == 4) { for(int i = 0; i < 4; ++i) { - interpolateBadPixelsBayer( *bitmapBads, *rawDataFrames[i] ); + interpolateBadPixelsBayer(*(bitmapBads.get()), *rawDataFrames[i]); } } else { - interpolateBadPixelsBayer( *bitmapBads, rawData ); + interpolateBadPixelsBayer(*(bitmapBads.get()), rawData); } } else if ( ri->getSensorType() == ST_FUJI_XTRANS ) { - interpolateBadPixelsXtrans( *bitmapBads ); + interpolateBadPixelsXtrans(*(bitmapBads.get())); } else { - interpolateBadPixelsNColours( *bitmapBads, ri->get_colors() ); + interpolateBadPixelsNColours(*(bitmapBads.get()), ri->get_colors()); } } @@ -2060,10 +1514,6 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le printf("Preprocessing: %d usec\n", t2.etime(t1)); } - if(bitmapBads) { - delete bitmapBads; - } - rawDirty = true; return; } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 530211715..95dba61f4 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -28,6 +28,7 @@ #include "dcp.h" #include "iimage.h" #include "imagesource.h" +#include "pixelsmap.h" #define HR_SCALE 2 @@ -258,11 +259,11 @@ protected: ); void ddct8x8s(int isgn, float a[8][8]); - int interpolateBadPixelsBayer( PixelsMap &bitmapBads, array2D &rawData ); - int interpolateBadPixelsNColours( PixelsMap &bitmapBads, const int colours ); - int interpolateBadPixelsXtrans( PixelsMap &bitmapBads ); - int findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels ); - + int interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D &rawData); + int interpolateBadPixelsNColours(const PixelsMap &bitmapBads, int colours); + int interpolateBadPixelsXtrans(const PixelsMap &bitmapBads); + int findHotDeadPixels(PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels) const; + int findZeroPixels(PixelsMap &bpMap) const; void cfa_linedn (float linenoiselevel, bool horizontal, bool vertical, const CFALineDenoiseRowBlender &rowblender);//Emil's line denoise void green_equilibrate_global (array2D &rawData); From 156f3009d5b92b410267cc6ae674eeeab4b7c1e4 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 10 Jun 2019 22:15:16 +0200 Subject: [PATCH 20/48] badpixels code: further cleanups --- rtengine/badpixels.cc | 88 +++++++++++++++++++-------------------- rtengine/pixelsmap.h | 2 +- rtengine/rawimagesource.h | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 8d02be4a7..895294cae 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -26,7 +26,7 @@ namespace rtengine { /* interpolateBadPixelsBayer: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood + * takes into consideration if there are multiple bad pixels in the neighborhood */ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array2D &rawData) { @@ -37,8 +37,8 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array #pragma omp parallel for reduction(+:counter) schedule(dynamic,16) #endif - for(int row = 2; row < H - 2; ++row) { - for(int col = 2; col < W - 2; ++col) { + for (int row = 2; row < H - 2; ++row) { + for (int col = 2; col < W - 2; ++col) { const int sk = bitmapBads.skipIfZero(col, row); //optimization for a stripe all zero if (sk) { @@ -54,8 +54,8 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array // diagonal interpolation if (FC(row, col) == 1) { - // green channel. We can use closer pixels than for red or blue channel. Distance to centre pixel is sqrt(2) => weighting is 0.70710678 - // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // green channel. We can use closer pixels than for red or blue channel. Distance to center pixel is sqrt(2) => weighting is 0.70710678 + // For green channel following pixels will be used for interpolation. Pixel to be interpolated is in center. // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad // 0 0 0 0 0 // 0 1 0 1 0 @@ -72,8 +72,8 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array norm += dirwt; } } else { - // red and blue channel. Distance to centre pixel is sqrt(8) => weighting is 0.35355339 - // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // red and blue channel. Distance to center pixel is sqrt(8) => weighting is 0.35355339 + // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in center. // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad // 1 0 0 0 1 // 0 0 0 0 0 @@ -91,8 +91,8 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array } } - // channel independent. Distance to centre pixel is 2 => weighting is 0.5 - // Additionally for all channel following pixels will be used for interpolation. Pixel to be interpolated is in centre. + // channel independent. Distance to center pixel is 2 => weighting is 0.5 + // Additionally for all channel following pixels will be used for interpolation. Pixel to be interpolated is in center. // 1 means that pixel is used in this step, if itself and his counterpart are not marked bad // 0 0 1 0 0 // 0 0 0 0 0 @@ -143,10 +143,10 @@ int RawImageSource::interpolateBadPixelsBayer(const PixelsMap &bitmapBads, array return counter; // Number of interpolated pixels. } -/* interpolateBadPixelsNColours: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood +/* interpolateBadPixelsNcolors: correct raw pixels looking at the bitmap + * takes into consideration if there are multiple bad pixels in the neighborhood */ -int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, const int colours) +int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, const int colors) { constexpr float eps = 1.f; int counter = 0; @@ -168,8 +168,8 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - float wtdsum[colours] = {}; - float norm[colours] = {}; + float wtdsum[colors] = {}; + float norm[colors] = {}; // diagonal interpolation for (int dx = -1; dx <= 1; dx += 2) { @@ -177,40 +177,40 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - for (int c = 0; c < colours; ++c) { - const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][(col + dx) * colours + c] - rawData[row + 1][(col - dx) * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colours + c] + rawData[row + 1][(col - dx) * colours + c]); + for (int c = 0; c < colors; ++c) { + const float dirwt = 0.70710678f / (fabsf(rawData[row - 1][(col + dx) * colors + c] - rawData[row + 1][(col - dx) * colors + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][(col + dx) * colors + c] + rawData[row + 1][(col - dx) * colors + c]); norm[c] += dirwt; } } // horizontal interpolation if (!(bitmapBads.get(col - 1, row) || bitmapBads.get(col + 1, row))) { - for (int c = 0; c < colours; ++c) { - const float dirwt = 1.f / (fabsf(rawData[row][(col - 1) * colours + c] - rawData[row][(col + 1) * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row][(col - 1) * colours + c] + rawData[row][(col + 1) * colours + c]); + for (int c = 0; c < colors; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row][(col - 1) * colors + c] - rawData[row][(col + 1) * colors + c]) + eps); + wtdsum[c] += dirwt * (rawData[row][(col - 1) * colors + c] + rawData[row][(col + 1) * colors + c]); norm[c] += dirwt; } } // vertical interpolation if (!(bitmapBads.get(col, row - 1) || bitmapBads.get(col, row + 1))) { - for (int c = 0; c < colours; ++c) { - const float dirwt = 1.f / (fabsf(rawData[row - 1][col * colours + c] - rawData[row + 1][col * colours + c]) + eps); - wtdsum[c] += dirwt * (rawData[row - 1][col * colours + c] + rawData[row + 1][col * colours + c]); + for (int c = 0; c < colors; ++c) { + const float dirwt = 1.f / (fabsf(rawData[row - 1][col * colors + c] - rawData[row + 1][col * colors + c]) + eps); + wtdsum[c] += dirwt * (rawData[row - 1][col * colors + c] + rawData[row + 1][col * colors + c]); norm[c] += dirwt; } } if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999% - for (int c = 0; c < colours; ++c) { - rawData[row][col * colours + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps + for (int c = 0; c < colors; ++c) { + rawData[row][col * colors + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps } counter++; } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens int tot = 0; - float sum[colours] = {}; + float sum[colors] = {}; for (int dy = -2; dy <= 2; dy += 2) { for (int dx = -2; dx <= 2; dx += 2) { @@ -218,8 +218,8 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - for (int c = 0; c < colours; ++c) { - sum[c] += rawData[row + dy][(col + dx) * colours + c]; + for (int c = 0; c < colors; ++c) { + sum[c] += rawData[row + dy][(col + dx) * colors + c]; } tot++; @@ -227,8 +227,8 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co } if (tot > 0) { - for (int c = 0; c < colours; ++c) { - rawData[row][col * colours + c] = sum[c] / tot; + for (int c = 0; c < colors; ++c) { + rawData[row][col * colors + c] = sum[c] / tot; } counter ++; @@ -241,7 +241,7 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co } /* interpolateBadPixelsXtrans: correct raw pixels looking at the bitmap - * takes into consideration if there are multiple bad pixels in the neighbourhood + * takes into consideration if there are multiple bad pixels in the neighborhood */ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) { @@ -266,15 +266,15 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) } float wtdsum = 0.f, norm = 0.f; - unsigned int pixelColor = ri->XTRANSFC(row, col); + const unsigned int pixelColor = ri->XTRANSFC(row, col); if (pixelColor == 1) { // green channel. A green pixel can either be a solitary green pixel or a member of a 2x2 square of green pixels if (ri->XTRANSFC(row, col - 1) == ri->XTRANSFC(row, col + 1)) { - // If left and right neighbour have same colour, then this is a solitary green pixel - // For these the following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. + // If left and right neighbor have same color, then this is a solitary green pixel + // For these the following pixels will be used for interpolation. Pixel to be interpolated is in center and marked with a P. // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad - // 0 means, the pixel has a different colour and will not be used + // 0 means, the pixel has a different color and will not be used // 0 1 0 2 0 // 3 5 0 6 4 // 0 0 P 0 0 @@ -313,7 +313,7 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) // this is a member of a 2x2 square of green pixels // For these the following pixels will be used for interpolation. Pixel to be interpolated is at position P in the example. // Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad - // 0 means, the pixel has a different colour and will not be used + // 0 means, the pixel has a different color and will not be used // 1 0 0 3 // 0 P 2 0 // 0 2 1 0 @@ -352,9 +352,9 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) } } else { // red and blue channel. - // Each red or blue pixel has exactly one neighbour of same colour in distance 2 and four neighbours of same colour which can be reached by a move of a knight in chess. + // Each red or blue pixel has exactly one neighbor of same color in distance 2 and four neighbors of same color which can be reached by a move of a knight in chess. // For the distance 2 pixel (marked with an X) we generate a virtual counterpart (marked with a V) - // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P. + // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in center and marked with a P. // Pairs of pixels used in this step are numbered except for distance 2 pixels which are marked X and V. A pair will be used if none of the pixels of the pair is marked bad // 0 1 0 0 0 0 0 X 0 0 remaining cases are symmetric // 0 0 0 0 2 1 0 0 0 2 @@ -362,9 +362,9 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) // 0 0 0 0 1 0 0 0 0 0 // 0 2 0 0 0 0 2 V 1 0 - // Find two knight moves landing on a pixel of same colour as the pixel to be interpolated. + // Find two knight moves landing on a pixel of same color as the pixel to be interpolated. // If we look at first and last row of 5x5 square, we will find exactly two knight pixels. - // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the centre pixel + // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the center pixel // When we find a knight pixel, we get its counterpart, which has distance (+-3,+-3), where the signs of distance depend on the corner of the found knight pixel. // These pixels are marked 1 or 2 in above examples. Distance to P is sqrt(5) => weighting is 0.44721359f // The following loop simply scans the four possible places. To keep things simple, it does not stop after finding two knight pixels, because it will not find more than two @@ -380,12 +380,12 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) } } - // now scan for the pixel of same colour in distance 2 in each direction (marked with an X in above examples). + // now scan for the pixel of same color in distance 2 in each direction (marked with an X in above examples). bool distance2PixelFound = false; int dx, dy; // check horizontal - for (dx = -2, dy = 0; dx <= 2 && !distance2PixelFound; dx += 4) { + for (dx = -2, dy = 0; dx <= 2; dx += 4) { if (ri->XTRANSFC(row, col + dx) == pixelColor) { distance2PixelFound = true; break; @@ -394,7 +394,7 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) if (!distance2PixelFound) { // no distance 2 pixel on horizontal, check vertical - for (dx = 0, dy = -2; dy <= 2 && !distance2PixelFound; dy += 4) { + for (dx = 0, dy = -2; dy <= 2; dy += 4) { if (ri->XTRANSFC(row + dy, col) == pixelColor) { distance2PixelFound = true; break; @@ -428,7 +428,7 @@ int RawImageSource::interpolateBadPixelsXtrans(const PixelsMap &bitmapBads) } /* Search for hot or dead pixels in the image and update the map - * For each pixel compare its value to the average of similar colour surrounding + * For each pixel compare its value to the average of similar color surrounding * (Taken from Emil Martinec idea) * (Optimized by Ingo Weyrich 2013 and 2015) */ diff --git a/rtengine/pixelsmap.h b/rtengine/pixelsmap.h index 63dce4233..9089ac91c 100644 --- a/rtengine/pixelsmap.h +++ b/rtengine/pixelsmap.h @@ -39,7 +39,7 @@ class PixelsMap : int w; // line width in base_t units int h; // height typedef unsigned long base_t; - static const size_t base_t_size = sizeof(base_t); + static constexpr size_t base_t_size = sizeof(base_t); base_t *pm; public: diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 95dba61f4..4c7b0ba21 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -102,7 +102,7 @@ protected: void transformRect (const PreviewProps &pp, int tran, int &sx1, int &sy1, int &width, int &height, int &fw); void transformPosition (int x, int y, int tran, int& tx, int& ty); - unsigned FC(int row, int col) + unsigned FC(int row, int col) const { return ri->FC(row, col); } From 0de04eea9329778a7773e0ff6ffa6fcdcd52f49a Mon Sep 17 00:00:00 2001 From: Benitoite Date: Thu, 13 Jun 2019 01:57:37 -0700 Subject: [PATCH 21/48] macOS: optionally notarize app and dmg For macOS 10.15 *Catalina* compatibility: will notarize app and dmg with credentials provided thru cmake command. --- tools/osx/macosx_bundle.sh | 66 +++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index f3ff8d8ca..e334122be 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -204,9 +204,38 @@ plutil -convert binary1 "${CONTENTS}/Info.plist" # Sign the app CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" -codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${APP}" -spctl -a -vvvv "${APP}" - +if ! test -z "$CODESIGNID" ; then + codesign --deep --force -v -s "${CODESIGNID}" --timestamp -o runtime "${APP}" + spctl -a -vvvv "${APP}" +fi + +# Notarize the app +NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" +if ! test -z "$NOTARY" ; then + ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.filmulator" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + echo "Result= $uuid" # Display identifier string + sleep 15 + while : + do + fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status + status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` + if [ "$status1" = "success" ]; then + xcrun stapler staple *app # staple the ticket + xcrun stapler validate -v *app + echo "Notarization success" + break + elif [ "$status1" = "in" ]; then + echo "Notarization still in progress, sleeping for 15 seconds and trying again" + sleep 15 + else + echo "Notarization failed fullstatus below" + echo "$fullstatus" + exit 1 + fi + done +fi + function CreateDmg { local srcDir="$(mktemp -dt $$)" @@ -234,7 +263,36 @@ function CreateDmg { hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" # Sign disk image - codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" + if ! test -z "$CODESIGNID" ; then + codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" + fi + + # Notarize the dmg + if ! test -z "$NOTARY" ; then + zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.filmulator" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + echo "dmg Result= $uuid" # Display identifier string + sleep 15 + while : + do + fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status + status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` + if [ "$status1" = "success" ]; then + xcrun stapler staple "${dmg_name}.dmg" # staple the ticket + xcrun stapler validate -v "${dmg_name}.dmg" + echo "dmg Notarization success" + break + elif [ "$status1" = "in" ]; then + echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" + sleep 15 + else + echo "dmg Notarization failed fullstatus below" + echo "$fullstatus" + exit 1 + fi + done + fi + # Zip disk image for redistribution zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt From 6095f8646739b35df902fa543e80a591200918fd Mon Sep 17 00:00:00 2001 From: Benitoite Date: Thu, 13 Jun 2019 02:03:00 -0700 Subject: [PATCH 22/48] macOS: Import notarization credentials Imports apple notarization credentials (Apple ID and App-specific password) given to cmake as `-DNOTARY:STRING="-u woz@apple.com -p abcd-efgh-ijkl-mnop"` --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 128551b02..e1e48bf9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,10 @@ if(APPLE) if("${CODESIGNID}") set(CODESIGNID "${CODESIGNID}" CACHE STRING "Codesigning Identity") endif() + if("${NOTARY}") + set(NOTARY "${NOTARY}" CACHE STRING "Notarization Identity") + endif() + endif() # Enforce absolute paths for non-bundle builds: From 7ee7be183364ceeaf8a3b8d097926d0258905172 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Thu, 13 Jun 2019 02:14:37 -0700 Subject: [PATCH 23/48] macOS: Copy some libraries into the bundle for libexpat and libz --- tools/osx/macosx_bundle.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index e334122be..291fc8778 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -155,6 +155,12 @@ ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme # Copy libjpeg-turbo into the app bundle cp /opt/local/lib/libjpeg.62.dylib "${RESOURCES}/../Frameworks" +# Copy libexpat into the app bundle +cp /opt/local/lib/libexpat.1.dylib "${RESOURCES}/../Frameworks" + +# Copy libz into the app bundle +cp /opt/local/lib/libz.1.dylib "${RESOURCES}/../Frameworks" + # Copy libtiff into the app bundle cp /opt/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks" From 1141f5fc65455dc1637c4bea27c514e26e0d1d41 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Thu, 13 Jun 2019 06:44:33 -0700 Subject: [PATCH 24/48] Fix a typo in macosx_bundle.sh --- tools/osx/macosx_bundle.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 291fc8778..0fc231852 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -219,7 +219,7 @@ fi NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" if ! test -z "$NOTARY" ; then ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.filmulator" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.rawtherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` echo "Result= $uuid" # Display identifier string sleep 15 while : @@ -276,7 +276,7 @@ function CreateDmg { # Notarize the dmg if ! test -z "$NOTARY" ; then zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.filmulator" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` echo "dmg Result= $uuid" # Display identifier string sleep 15 while : From 2ed66677b81ec441c6fae174bab367e70be31f60 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Jun 2019 23:09:00 -0700 Subject: [PATCH 25/48] Mac: Property lists for nested app bundle --- tools/osx/Info.plist-bin.in | 10 ++++++++++ tools/osx/rt-bin.entitlements | 8 ++++++++ tools/osx/rt.entitlements | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 tools/osx/Info.plist-bin.in create mode 100644 tools/osx/rt-bin.entitlements create mode 100644 tools/osx/rt.entitlements diff --git a/tools/osx/Info.plist-bin.in b/tools/osx/Info.plist-bin.in new file mode 100644 index 000000000..20ce5a741 --- /dev/null +++ b/tools/osx/Info.plist-bin.in @@ -0,0 +1,10 @@ + + + + + CFBundleName + RawTherapee-bin + CFBundleIdentifier + com.rawtherapee.rawtherapee + + diff --git a/tools/osx/rt-bin.entitlements b/tools/osx/rt-bin.entitlements new file mode 100644 index 000000000..9e5e269cb --- /dev/null +++ b/tools/osx/rt-bin.entitlements @@ -0,0 +1,8 @@ + + + + +com.apple.security.inherit + + + \ No newline at end of file diff --git a/tools/osx/rt.entitlements b/tools/osx/rt.entitlements new file mode 100644 index 000000000..2236af138 --- /dev/null +++ b/tools/osx/rt.entitlements @@ -0,0 +1,20 @@ + + + + + application-identifier + com.rawtherapee.rawtherapee + com.apple.security.temporary-exception.files.absolute-path.read-write + + "/" + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.files.user-selected.read-write + + com.apple.security.app-sandbox + + com.apple.security.files.downloads.read-write + + + From 8a8536702e303f3eb87ffead3a24d1368badb4ed Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Jun 2019 23:11:29 -0700 Subject: [PATCH 26/48] Mac: point to directories from a nested app --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e1e48bf9c..637cc1b9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,7 +164,7 @@ endif() if(NOT DEFINED DATADIR) if(BUILD_BUNDLE) if(APPLE) - set(DATADIR "../Resources") + set(DATADIR "../../Resources") else() set(DATADIR .) endif() @@ -176,7 +176,7 @@ endif() if(NOT DEFINED LIBDIR) if(BUILD_BUNDLE) if(APPLE) - set(LIBDIR "../Frameworks") + set(LIBDIR "../../Frameworks") else() set(LIBDIR .) endif() From 1ad9444259af2c20e4835dedb65a03a873209d95 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Jun 2019 23:12:31 -0700 Subject: [PATCH 27/48] Mac: cleanup executable loader script --- tools/osx/executable_loader.in | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/tools/osx/executable_loader.in b/tools/osx/executable_loader.in index dcc0cabc4..72d17b04e 100644 --- a/tools/osx/executable_loader.in +++ b/tools/osx/executable_loader.in @@ -7,21 +7,8 @@ app="${cwd%/Contents/*}" lib="${app}/Contents/Frameworks" resources="${app}/Contents/Resources" etc="${resources}"/etc - -### Pending deletion: -# See https://github.com/Beep6581/RawTherapee/issues/1779 -# cups_dir=/tmp/RT5 -# install -d "${cups_dir}" -# cp -f /usr/lib/libcups.2.dylib "${cups_dir}" -# export DYLD_LIBRARY_PATH="${lib}:${cups_dir}" - -# export GTK_EXE_PREFIX="${resources}" -# export GTK_DATA_PREFIX="${resources}" export XDG_DATA_DIRS="${resources}/share" -# export GTK_IM_MODULE_FILE="${etc}/gtk-3.0/gtk.immodules" - export DYLD_LIBRARY_PATH="${lib}" - export GTK_PATH="${lib}/gtk-3.0/3.0.0" export XDG_DATA_HOME="${resources}/share" export GSETTINGS_SCHEMA_DIR="${resources}/share/glib-2.0/schemas" @@ -31,25 +18,13 @@ export GDK_PIXBUF_MODULEDIR="${lib}/gdk-pixbuf-2.0/2.10.0/loaders" export RT_SETTINGS="${HOME}/Library/Application Support/RawTherapee/config" export RT_CACHE="${HOME}/Library/Application Support/RawTherapee/cache" -### Pending deletion: -# Environment variables for X11 backend -#if [[ -d ${etc}/fonts ]]; then -# export FONTCONFIG_PATH="${etc}/fonts" -#fi - # Strip out system argument case "$1" in -psn_*) shift ;; esac -# Commented-out as part of "crash-on-startup part 2" fix, see https://github.com/Beep6581/RawTherapee/issues/3882#issuecomment-311703141 -#if [[ -d "/tmp/RawTherapee.app" ]]; then -# rm -rf "/tmp/RawTherapee.app" -#fi -#ln -sf "${app}" /tmp - # Prevent crash when directory name contains special characters AppleLocale=`defaults read -g AppleLocale` export LANG=${AppleLocale%@*}.UTF-8 -exec "${cwd}/rawtherapee-bin" "$@" +exec "${cwd}/bin/rawtherapee-bin" "$@" From f77eb3e4d2390261ec544e8bb71ca472596982dc Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Jun 2019 23:14:52 -0700 Subject: [PATCH 28/48] Mac: Use codesigning sandbox, entitlements Allows file system access in MacOS 10.15 *Catalina* --- tools/osx/macosx_bundle.sh | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 0fc231852..79002facb 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -101,7 +101,7 @@ ETC="${RESOURCES}/etc" EXECUTABLE="${MACOS}/rawtherapee" msg "Removing old files:" -rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" +rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" msg "Creating bundle container:" install -d "${RESOURCES}" \ @@ -134,7 +134,7 @@ rm -r "${LIB}"/gdk-pixbuf-2.0 "${GTK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" -sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|@executable_path/../|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" +sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Users/rb/repo-rt/build/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas "${GTK_PREFIX}/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" @@ -188,30 +188,37 @@ find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib done msg "Registering @loader_path into the executable:" -echo " install_name_tool -add_rpath @loader_path/../Frameworks '${EXECUTABLE}'" | bash -v +echo " install_name_tool -add_rpath @executable_path/../../Frameworks '${EXECUTABLE}'" | bash -v echo " install_name_tool -add_rpath @loader_path/../Frameworks '${EXECUTABLE}-cli'" | bash -v msg "Installing required application bundle files:" PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx" - +ditto "${PROJECT_SOURCE_DIR}/build/Resources" "${RESOURCES}" # Executable loader # Note: executable is renamed to 'rawtherapee-bin'. -mv "${MACOS}/rawtherapee" "${MACOS}/rawtherapee-bin" +mkdir "${MACOS}/bin" +mv "${MACOS}/rawtherapee" "${MACOS}/bin/rawtherapee-bin" install -m 0755 "${PROJECT_SOURCE_DATA_DIR}/executable_loader.in" "${MACOS}/rawtherapee" # App bundle resources cp "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" cp "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist" +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist-bin.in" "${CONTENTS}/MacOS/bin/Info.plist" sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}| s|@shortVersion@|${PROJECT_VERSION}| s|@arch@|${arch}|" \ "${CONTENTS}/Info.plist" plutil -convert binary1 "${CONTENTS}/Info.plist" - +plutil -convert binary1 "${CONTENTS}/MacOS/bin/Info.plist" # Sign the app CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" if ! test -z "$CODESIGNID" ; then - codesign --deep --force -v -s "${CODESIGNID}" --timestamp -o runtime "${APP}" +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/Entitlements.plist" +plutil -convert binary1 "${CONTENTS}/Entitlements.plist" +install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt-bin.entitlements" "${CONTENTS}/MacOS/bin/Entitlements.plist" +plutil -convert binary1 "${CONTENTS}/MacOS/bin/Entitlements.plist" +codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" --timestamp -o runtime --entitlements "${APP}/Contents/MacOS/bin/Entitlements.plist" "${APP}/Contents/MacOS/bin/rawtherapee-bin" +codesign --deep --preserve-metadata=identifier,entitlements,runtime --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee" --timestamp -o runtime --entitlements "${APP}/Contents/Entitlements.plist" "${APP}" spctl -a -vvvv "${APP}" fi @@ -276,7 +283,7 @@ function CreateDmg { # Notarize the dmg if ! test -z "$NOTARY" ; then zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" - uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` + uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` echo "dmg Result= $uuid" # Display identifier string sleep 15 while : From 1d04026e9c5485cc7daf85b199bc7dba1bbcd082 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sat, 15 Jun 2019 23:24:38 -0700 Subject: [PATCH 29/48] Mac: update an absolute path --- tools/osx/macosx_bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 79002facb..2501e936b 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -134,7 +134,7 @@ rm -r "${LIB}"/gdk-pixbuf-2.0 "${GTK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" -sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Users/rb/repo-rt/build/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" +sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas "${GTK_PREFIX}/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas" From daedba584ada4b04b93915eff68c0edebc88c210 Mon Sep 17 00:00:00 2001 From: Benitoite Date: Sun, 16 Jun 2019 03:08:35 -0700 Subject: [PATCH 30/48] Mac: simplify exec. loader interpreter --- tools/osx/executable_loader.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/osx/executable_loader.in b/tools/osx/executable_loader.in index 72d17b04e..429173d8e 100644 --- a/tools/osx/executable_loader.in +++ b/tools/osx/executable_loader.in @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh cd "$(dirname "$0")" || exit 1 From ca387e0379ef854ed22afb5bcc6f579553fd094e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 18 Jun 2019 09:22:45 +0200 Subject: [PATCH 31/48] Use terser C++11 resets in `ProcParams::setDefaults()` --- rtengine/procparams.cc | 82 +++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index c24ee0049..1c05fbbad 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2742,23 +2742,23 @@ ProcParams::ProcParams() void ProcParams::setDefaults() { - toneCurve = ToneCurveParams(); + toneCurve = {}; - labCurve = LCurveParams(); + labCurve = {}; - rgbCurves = RGBCurvesParams(); + rgbCurves = {}; - localContrast = LocalContrastParams(); + localContrast = {}; - colorToning = ColorToningParams(); + colorToning = {}; - sharpenEdge = SharpenEdgeParams(); + sharpenEdge = {}; - sharpenMicro = SharpenMicroParams(); + sharpenMicro = {}; - sharpening = SharpeningParams(); + sharpening = {}; - prsharpening = SharpeningParams(); + prsharpening = {}; prsharpening.contrast = 15.0; prsharpening.method = "rld"; prsharpening.deconvamount = 100; @@ -2766,69 +2766,69 @@ void ProcParams::setDefaults() prsharpening.deconviter = 100; prsharpening.deconvdamping = 0; - vibrance = VibranceParams(); + vibrance = {}; - wb = WBParams(); + wb = {}; - colorappearance = ColorAppearanceParams(); + colorappearance = {}; - defringe = DefringeParams(); + defringe = {}; - impulseDenoise = ImpulseDenoiseParams(); + impulseDenoise = {}; - dirpyrDenoise = DirPyrDenoiseParams(); + dirpyrDenoise = {}; - epd = EPDParams(); + epd = {}; - fattal = FattalToneMappingParams(); + fattal = {}; - sh = SHParams(); + sh = {}; - crop = CropParams(); + crop = {}; - coarse = CoarseTransformParams(); + coarse = {}; - commonTrans = CommonTransformParams(); + commonTrans = {}; - rotate = RotateParams(); + rotate = {}; - distortion = DistortionParams(); + distortion = {}; - lensProf = LensProfParams(); + lensProf = {}; - perspective = PerspectiveParams(); + perspective = {}; - gradient = GradientParams(); + gradient = {}; - pcvignette = PCVignetteParams(); + pcvignette = {}; - vignetting = VignettingParams(); + vignetting = {}; - chmixer = ChannelMixerParams(); + chmixer = {}; - blackwhite = BlackWhiteParams(); + blackwhite = {}; - cacorrection = CACorrParams(); + cacorrection = {}; - resize = ResizeParams(); + resize = {}; - icm = ColorManagementParams(); + icm = {}; - wavelet = WaveletParams(); + wavelet = {}; - dirpyrequalizer = DirPyrEqualizerParams(); + dirpyrequalizer = {}; - hsvequalizer = HSVEqualizerParams(); + hsvequalizer = {}; - filmSimulation = FilmSimulationParams(); + filmSimulation = {}; - softlight = SoftLightParams(); + softlight = {}; - dehaze = DehazeParams(); + dehaze = {}; - raw = RAWParams(); + raw = {}; - metadata = MetaDataParams(); + metadata = {}; exif.clear(); iptc.clear(); From d3fb58a19c96fd88ef307f9691bc3e7ac506ff15 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 24 Jun 2019 19:43:43 +0200 Subject: [PATCH 32/48] clang error on badpixels.cc variable-sized object initializations, fixes #5358 --- rtengine/badpixels.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc index 895294cae..376e58b3b 100644 --- a/rtengine/badpixels.cc +++ b/rtengine/badpixels.cc @@ -168,8 +168,11 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co continue; } - float wtdsum[colors] = {}; - float norm[colors] = {}; + float wtdsum[colors]; + float norm[colors]; + for (int c = 0; c < colors; ++c) { + wtdsum[c] = norm[c] = 0.f; + } // diagonal interpolation for (int dx = -1; dx <= 1; dx += 2) { @@ -210,7 +213,10 @@ int RawImageSource::interpolateBadPixelsNColours(const PixelsMap &bitmapBads, co counter++; } else { //backup plan -- simple average. Same method for all channels. We could improve this, but it's really unlikely that this case happens int tot = 0; - float sum[colors] = {}; + float sum[colors]; + for (int c = 0; c < colors; ++c) { + sum[c] = 0.f; + } for (int dy = -2; dy <= 2; dy += 2) { for (int dx = -2; dx <= 2; dx += 2) { From 66c9cd61772bddd7b871addd90c4741246024bec Mon Sep 17 00:00:00 2001 From: heckflosse Date: Mon, 24 Jun 2019 19:52:17 +0200 Subject: [PATCH 33/48] Don't scan for darframes/flatfields/cluts if folder is not set, #2238 --- rtengine/dfmanager.cc | 5 ++++- rtengine/dfmanager.h | 2 +- rtengine/ffmanager.cc | 5 ++++- rtengine/ffmanager.h | 2 +- rtgui/filmsimulation.cc | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 5f1035a8e..7de712fb5 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -270,8 +270,11 @@ void dfInfo::updateBadPixelList( RawImage *df ) // ************************* class DFManager ********************************* -void DFManager::init( Glib::ustring pathname ) +void DFManager::init(const Glib::ustring& pathname) { + if (pathname.empty()) { + return; + } std::vector names; auto dir = Gio::File::create_for_path (pathname); diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 62379187b..2e55c3c22 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -78,7 +78,7 @@ protected: class DFManager { public: - void init( Glib::ustring pathname ); + void init(const Glib::ustring &pathname); Glib::ustring getPathname() { return currentPath; diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 6b0302d1e..6e4977076 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -231,8 +231,11 @@ void ffInfo::updateRawImage() // ************************* class FFManager ********************************* -void FFManager::init( Glib::ustring pathname ) +void FFManager::init(const Glib::ustring& pathname) { + if (pathname.empty()) { + return; + } std::vector names; auto dir = Gio::File::create_for_path (pathname); diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 7022d1641..9068216ef 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -75,7 +75,7 @@ protected: class FFManager { public: - void init( Glib::ustring pathname ); + void init(const Glib::ustring &pathname); Glib::ustring getPathname() { return currentPath; diff --git a/rtgui/filmsimulation.cc b/rtgui/filmsimulation.cc index aee06f310..734b46c34 100644 --- a/rtgui/filmsimulation.cc +++ b/rtgui/filmsimulation.cc @@ -300,7 +300,7 @@ ClutComboBox::ClutModel::ClutModel(const Glib::ustring &path) { m_model = Gtk::TreeStore::create (m_columns); //set_model (m_model); - count = parseDir(path); + count = path.empty() ? 0 : parseDir(path); } int ClutComboBox::ClutModel::parseDir(const Glib::ustring& path) From e76d98fb9fae610ca34f1f33cf0c7bf18dfe001a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 26 Jun 2019 20:49:07 +0200 Subject: [PATCH 34/48] raw crop for Sony DSC-RX0M2 --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 9e6ec49b6..607ff506a 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2364,6 +2364,11 @@ Camera constants: "ranges": { "black": 512, "white": 16300 } }, + { // Quality C, correction for frame width + "make_model": [ "Sony DSC-RX0M2" ], + "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage + }, + { // Quality B, correction for frame width, crop modes covered "make_model": [ "Sony ILCE-7RM2", "Sony DSC-RX1RM2" ], "dcraw_matrix": [ 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 ], // DNG_v9.1.1 D65 From a652752c2fd8e8454a91488398ea854a5c7be703 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 26 Jun 2019 22:12:38 +0200 Subject: [PATCH 35/48] raw crops for FUJIFILM X-T30 and Sony DSC-HX99 --- rtengine/camconst.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 607ff506a..abdf84c7d 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1327,7 +1327,7 @@ Camera constants: }, { // Quality C, only raw crop - "make_model": [ "FUJIFILM X-T3" ], + "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30" ], "raw_crop": [ 0, 5, 6252, 4176] }, @@ -2436,6 +2436,11 @@ Camera constants: "ranges": { "black": 512, "white": 16300 } }, + { // Quality C + "make_model": [ "Sony DSC-HX99" ], + "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage + }, + { // Quality C "make_model": [ "Sony DSC-R1" ], "raw_crop": [ 0, 0, 3924, 2608 ] From 9ea964f5d95bd599ec21e231df4b315b23942859 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 27 Jun 2019 15:32:28 +0200 Subject: [PATCH 36/48] camconst.json: some raw crops and white levels --- rtengine/camconst.json | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index abdf84c7d..396bdcf30 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1290,6 +1290,11 @@ Camera constants: "ranges": { "white": 16100 } }, + { // Quality C + "make_model": "FUJIFILM X-A5", + "ranges": { "white": 16100 } + }, + { // Quality B "make_model": "FUJIFILM X-A10", "dcraw_matrix": [ 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 ], // DNGv9.12 D65 @@ -1305,6 +1310,11 @@ Camera constants: "ranges": { "white": 16100 } }, + { // Quality C + "make_model": [ "FUJIFILM X-T100" ], + "ranges": { "white": 16100 } + }, + { // Quality B "make_model": "FUJIFILM X-E2S", "dcraw_matrix": [ 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 ], // DNG_v9.4 D65 @@ -1677,6 +1687,11 @@ Camera constants: "ranges": { "white": 4040 } // nominal 4056 }, + { // Quality C + "make_model": [ "OLYMPUS E-PL9" ], + "ranges": { "white": 4080 } // nominal 4093 + }, + { // Quality B, with long exposure noise reduction White Level gets WL-BL = around 256_12-bit levels less "make_model": [ "OLYMPUS E-PL7", "OLYMPUS E-PL8" ], "global_green_equilibration" : true, @@ -2365,7 +2380,7 @@ Camera constants: }, { // Quality C, correction for frame width - "make_model": [ "Sony DSC-RX0M2" ], + "make_model": [ "Sony DSC-RX0", "Sony DSC-RX0M2" ], "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage }, @@ -2443,7 +2458,8 @@ Camera constants: { // Quality C "make_model": [ "Sony DSC-R1" ], - "raw_crop": [ 0, 0, 3924, 2608 ] + "raw_crop": [ 0, 0, 3924, 2608 ], + "ranges": { "white": 16368 } }, { // Quality A From 4eb7240a41890c55c1f4d34c2661b14e226583c2 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 27 Jun 2019 22:39:36 +0200 Subject: [PATCH 37/48] change granularity of raw black point adjusters from 0.1 to 1 --- rtgui/bayerrawexposure.cc | 8 ++++---- rtgui/xtransrawexposure.cc | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rtgui/bayerrawexposure.cc b/rtgui/bayerrawexposure.cc index 73c96bcf1..f9027c09f 100644 --- a/rtgui/bayerrawexposure.cc +++ b/rtgui/bayerrawexposure.cc @@ -28,7 +28,7 @@ using namespace rtengine::procparams; BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposure", M("TP_EXPOS_BLACKPOINT_LABEL"), options.prevdemo != PD_Sidecar) { - PexBlack1 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_1"), -2048, 2048, 0.1, 0)); //black level + PexBlack1 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_1"), -2048, 2048, 1.0, 0)); //black level PexBlack1->setAdjusterListener (this); if (PexBlack1->delay < options.adjusterMaxDelay) { @@ -36,7 +36,7 @@ BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposur } PexBlack1->show(); - PexBlack2 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_2"), -2048, 2048, 0.1, 0)); //black level + PexBlack2 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_2"), -2048, 2048, 1.0, 0)); //black level PexBlack2->setAdjusterListener (this); if (PexBlack2->delay < options.adjusterMaxDelay) { @@ -44,7 +44,7 @@ BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposur } PexBlack2->show(); - PexBlack3 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_3"), -2048, 2048, 0.1, 0)); //black level + PexBlack3 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_3"), -2048, 2048, 1.0, 0)); //black level PexBlack3->setAdjusterListener (this); if (PexBlack3->delay < options.adjusterMaxDelay) { @@ -52,7 +52,7 @@ BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposur } PexBlack3->show(); - PexBlack0 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_0"), -2048, 2048, 0.1, 0)); //black level + PexBlack0 = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_0"), -2048, 2048, 1.0, 0)); //black level PexBlack0->setAdjusterListener (this); if (PexBlack0->delay < options.adjusterMaxDelay) { diff --git a/rtgui/xtransrawexposure.cc b/rtgui/xtransrawexposure.cc index a863ecfea..93f6ee202 100644 --- a/rtgui/xtransrawexposure.cc +++ b/rtgui/xtransrawexposure.cc @@ -30,7 +30,7 @@ using namespace rtengine::procparams; XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexposure", M("TP_EXPOS_BLACKPOINT_LABEL")) { - PexBlackRed = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_RED"), -2048, 2048, 0.1, 0)); //black level + PexBlackRed = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_RED"), -2048, 2048, 1.0, 0)); //black level PexBlackRed->setAdjusterListener (this); if (PexBlackRed->delay < options.adjusterMaxDelay) { @@ -38,7 +38,7 @@ XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexpo } PexBlackRed->show(); - PexBlackGreen = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_GREEN"), -2048, 2048, 0.1, 0)); //black level + PexBlackGreen = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_GREEN"), -2048, 2048, 1.0, 0)); //black level PexBlackGreen->setAdjusterListener (this); if (PexBlackGreen->delay < options.adjusterMaxDelay) { @@ -46,7 +46,7 @@ XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexpo } PexBlackGreen->show(); - PexBlackBlue = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_BLUE"), -2048, 2048, 0.1, 0)); //black level + PexBlackBlue = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_BLACK_BLUE"), -2048, 2048, 1.0, 0)); //black level PexBlackBlue->setAdjusterListener (this); if (PexBlackBlue->delay < options.adjusterMaxDelay) { From bb11f685353960bf377186ab85650fa05599cf6e Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 2 Jul 2019 21:01:51 +0200 Subject: [PATCH 38/48] Fix wrong SSE code path of shadowToneCurve() --- rtengine/improcfun.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index c2e0c5b50..b3fd5f5af 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -76,7 +76,7 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float //shadow tone curve vfloat Yv = cr * rv + cg * gv + cb * bv; - vfloat tonefactorv = shtonecurve(Yv); + 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); From c04171bf34e1d938c6ee4b3f43696e9c8d0e63d8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Tue, 2 Jul 2019 23:24:58 +0200 Subject: [PATCH 39/48] minor speedups --- rtengine/curves.cc | 30 ++++++++++++++++-------------- rtengine/improcfun.cc | 4 +++- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/rtengine/curves.cc b/rtengine/curves.cc index ecd38d4aa..f03a43e60 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -37,8 +37,6 @@ #include "ciecam02.h" #include "color.h" #include "iccstore.h" -#undef CLIPD -#define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) using namespace std; @@ -635,33 +633,37 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou //%%%%%%%%%%%%%%%%%%%%%%%%%% // change to [0,1] range shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value. - float val = 1.f / 65535.f; - float val2 = simplebasecurve (val, black, 0.015 * shcompr); - shCurve[0] = CLIPD(val2) / val; + if (black == 0.0) { + shCurve.makeConstant(1.f); + } else { + const float val = 1.f / 65535.f; + shCurve[0] = simplebasecurve(val, black, 0.015 * shcompr) / val; + } // gamma correction - val = Color::gammatab_srgb[0] / 65535.f; + float val = Color::gammatab_srgb1[0]; // apply brightness curve if (brightcurve) { - val = brightcurve->getVal (val); // TODO: getVal(double) is very slow! Optimize with a LUTf + val = brightcurve->getVal(val); // TODO: getVal(double) is very slow! Optimize with a LUTf } // store result in a temporary array - dcurve[0] = CLIPD(val); + dcurve[0] = LIM01(val); for (int i = 1; i < 0x10000; i++) { - float val = i / 65535.f; - float val2 = simplebasecurve (val, black, 0.015 * shcompr); - shCurve[i] = val2 / val; + if (black != 0.0) { + const float val = i / 65535.f; + shCurve[i] = simplebasecurve(val, black, 0.015 * shcompr) / val; + } // gamma correction - val = Color::gammatab_srgb[i] / 65535.f; + float val = Color::gammatab_srgb1[i]; // apply brightness curve if (brightcurve) { - val = CLIPD(brightcurve->getVal (val)); // TODO: getVal(double) is very slow! Optimize with a LUTf + val = LIM01(brightcurve->getVal (val)); // TODO: getVal(double) is very slow! Optimize with a LUTf } // store result in a temporary array @@ -849,7 +851,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector(val); } } else { diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b3fd5f5af..0c1431868 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2474,7 +2474,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } 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 (params->toneCurve.black != 0.0) { + shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); + } if (dcpProf) { dcpProf->step2ApplyTile (rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); From a5800a18b0c5818ac61b54fd07f7ebf68dd47546 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 4 Jul 2019 17:21:19 +0200 Subject: [PATCH 40/48] raw crop for OLYMPUS E-M1X highres mode --- rtengine/camconst.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 396bdcf30..0ae967fc0 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -1672,6 +1672,11 @@ Camera constants: "ranges": { "white": 4080 } // nominal 4095-4094, spread with some settings as long exposure }, + { // Quality C, only raw crop for highres mode + "make_model": "OLYMPUS E-M1X", + "raw_crop": [ 0, 0, 10388, 0 ] // Highres mode largest valid, full 80Mp 10400X7792, works also for non highres mode because larger width will be ignored + }, + { // Quality B, crop correction "make_model": [ "OLYMPUS E-M10", "OLYMPUS E-M10MarkII", "OLYMPUS E-M10 Mark III" ], "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], From 6fa533c40b34dec527f1176d47cc6c683422a73f Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 5 Jul 2019 15:30:30 +0200 Subject: [PATCH 41/48] Clarify permanent file deletion strings Closes #5365 --- rtdata/languages/Catala | 16 ++++++++-------- rtdata/languages/Chinese (Simplified) | 16 ++++++++-------- rtdata/languages/Czech | 14 +++++++------- rtdata/languages/Deutsch | 10 +++++++--- rtdata/languages/English (UK) | 16 ++++++++-------- rtdata/languages/English (US) | 16 ++++++++-------- rtdata/languages/Espanol | 14 +++++++------- rtdata/languages/Francais | 14 +++++++------- rtdata/languages/Italiano | 14 +++++++------- rtdata/languages/Japanese | 14 +++++++------- rtdata/languages/Magyar | 16 ++++++++-------- rtdata/languages/Nederlands | 14 +++++++------- rtdata/languages/Polish | 14 +++++++------- rtdata/languages/Portugues | 14 +++++++------- rtdata/languages/Portugues (Brasil) | 14 +++++++------- rtdata/languages/Russian | 16 ++++++++-------- rtdata/languages/Serbian (Cyrilic Characters) | 14 +++++++------- rtdata/languages/Swedish | 14 +++++++------- rtdata/languages/default | 14 +++++++------- 19 files changed, 139 insertions(+), 135 deletions(-) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 73970424b..974e51c38 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -84,8 +84,6 @@ FILEBROWSER_COPYPROFILE;Copia FILEBROWSER_CURRENT_NAME;Nom actual: FILEBROWSER_DARKFRAME;Marc fosc FILEBROWSER_DELETEDIALOG_HEADER;Confirmació d'esborrar fitxer -FILEBROWSER_DELETEDIALOG_SELECTED;Segur que voleu esborrar els %1 fitxers? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Segur que voleu suprimir els fitxers %1 seleccionats incloent la versió processada a la cua? FILEBROWSER_EMPTYTRASH;Buida paperera FILEBROWSER_EXTPROGMENU;Obre amb FILEBROWSER_FLATFIELD;Camp pla @@ -108,8 +106,6 @@ FILEBROWSER_POPUPPROCESS;Posa a la cua FILEBROWSER_POPUPPROCESSFAST;Posa a la cua (export. ràpida) FILEBROWSER_POPUPPROFILEOPERATIONS;Processant operacions de perfil FILEBROWSER_POPUPRANK;Rang -FILEBROWSER_POPUPREMOVE;Esborra el fitxer -FILEBROWSER_POPUPREMOVEINCLPROC;Esborra amb sortida de la cua FILEBROWSER_POPUPRENAME;Reanomena FILEBROWSER_POPUPSELECTALL;Selec. tot FILEBROWSER_POPUPTRASH;Llença a la paperera @@ -942,8 +938,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -956,13 +954,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 !FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 !FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 !FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 !FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files @@ -1703,7 +1703,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORAPP_SURROUND_DARK;Dark !TP_COLORAPP_SURROUND_DIM;Dim !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index fde2aab1b..82c8ddfa6 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -96,8 +96,6 @@ FILEBROWSER_COPYPROFILE;复制配置 FILEBROWSER_CURRENT_NAME;当前名称: FILEBROWSER_DARKFRAME;暗场 FILEBROWSER_DELETEDIALOG_HEADER;确认删除 -FILEBROWSER_DELETEDIALOG_SELECTED;确定删除所选的%1个文件? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;你确认要删除选择的 %1 文件 包括 一个处理队列中的版本? FILEBROWSER_EMPTYTRASH;清空垃圾箱 FILEBROWSER_EXTPROGMENU;调用程序... FILEBROWSER_FLATFIELD;平场 @@ -132,8 +130,6 @@ FILEBROWSER_POPUPRANK2;评 2 星 FILEBROWSER_POPUPRANK3;评 3 星 FILEBROWSER_POPUPRANK4;评 4 星 FILEBROWSER_POPUPRANK5;评 5 星 -FILEBROWSER_POPUPREMOVE;从文件系统中移除 -FILEBROWSER_POPUPREMOVEINCLPROC;删除序列输出 FILEBROWSER_POPUPRENAME;重命名 FILEBROWSER_POPUPSELECTALL;全部选中 FILEBROWSER_POPUPTRASH;移动到垃圾箱 @@ -957,8 +953,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. !FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 !FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 @@ -967,7 +967,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 !FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 !FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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 @@ -1654,7 +1654,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness !TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 61f51cd2d..5df69dd3a 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -164,8 +164,6 @@ FILEBROWSER_COPYPROFILE;Kopírovat FILEBROWSER_CURRENT_NAME;Současné jméno: FILEBROWSER_DARKFRAME;Tmavý snímek FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru -FILEBROWSER_DELETEDIALOG_SELECTED;Jste si jisti, že chcete vymazat %1 vybraných souborů? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Jste si jisti, že chcete vymazat %1 vybraných souborů včetně výstupů dávkového zpracování? FILEBROWSER_EMPTYTRASH;Vysypat koš FILEBROWSER_EXTPROGMENU;Otevřít pomocí FILEBROWSER_FLATFIELD;Flat Field @@ -200,8 +198,6 @@ FILEBROWSER_POPUPRANK2;Hodnocení 2 ** FILEBROWSER_POPUPRANK3;Hodnocení 3 *** FILEBROWSER_POPUPRANK4;Hodnocení 4 **** FILEBROWSER_POPUPRANK5;Hodnocení 5 ***** -FILEBROWSER_POPUPREMOVE;Smazat -FILEBROWSER_POPUPREMOVEINCLPROC;Smazat včetně výstupů z fronty FILEBROWSER_POPUPRENAME;Přejmenovat FILEBROWSER_POPUPSELECTALL;Vybrat vše FILEBROWSER_POPUPTRASH;Přesunout do koše @@ -228,7 +224,6 @@ FILEBROWSER_SHOWDIRHINT;Smazat všechny filtry.\nZkratka: d FILEBROWSER_SHOWEDITEDHINT;Ukázat upravené obrázky.\nZkratka: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Ukázat neupravené obrázky.\nZkratka: 6 FILEBROWSER_SHOWEXIFINFO;Zobrazit Exif informace.\n\nZkratky:\ni - režim více karet editoru,\nAlt-i - režim jedné karty editoru. -FILEBROWSER_SHOWNOTTRASHHINT;Zobrazit pouze nesmazané obrázky. FILEBROWSER_SHOWORIGINALHINT;Zobrazí pouze originální obrázky.\n\nPokud existuje několik obrázků se stejným názvem, ale rozdílnými příponami, bude jako originál vybrán ten, jehož přípona je nejvýše v seznamu přípon veVolby > Prohlížeč souborů > Analyzované přípony. FILEBROWSER_SHOWRANK1HINT;Ukázat obrázky hodnocené jednou hvězdičkou.\nZkratka: 1 FILEBROWSER_SHOWRANK2HINT;Ukázat obrázky hodnocené dvěma hvězdičkami.\nZkratka: 2 @@ -2321,6 +2316,11 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 7f562d51c..28cfb8e77 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -240,8 +240,6 @@ FILEBROWSER_POPUPRANK2;Bewertung 2 ** FILEBROWSER_POPUPRANK3;Bewertung 3 *** FILEBROWSER_POPUPRANK4;Bewertung 4 **** FILEBROWSER_POPUPRANK5;Bewertung 5 ***** -FILEBROWSER_POPUPREMOVE;Löschen -FILEBROWSER_POPUPREMOVEINCLPROC;Löschen (auch Resultate der Stapelverarbeitung) FILEBROWSER_POPUPRENAME;Umbenennen FILEBROWSER_POPUPSELECTALL;Alle auswählen FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben @@ -268,7 +266,6 @@ FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen.\nTaste: d FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen.\nTaste: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen.\nTaste: 6 FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i -FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen. FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird. FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen.\nTaste: 1 FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen.\nTaste: 2 @@ -2360,3 +2357,10 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - +!!!!!!!!!!!!!!!!!!!!!!!!! +! Untranslated keys follow; remove the ! prefix after an entry is translated. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index cda91f29a..6d1c7c09c 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -68,7 +68,7 @@ TP_COLORAPP_CHROMA_M_TOOLTIP;Colourfulness in CIECAM02 differs from L*a*b* and R TP_COLORAPP_CURVEEDITOR3;Colour curve TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colourfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. TP_COLORAPP_LABEL;CIE Colour Appearance Model 2002 -TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colours to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colours to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. TP_COLORAPP_TCMODE_COLORF;Colourfulness TP_COLORTONING_COLOR;Colour TP_COLORTONING_LABEL;Colour Toning @@ -239,12 +239,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_COPYPROFILE;Copy !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASH;Empty trash -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. !FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_FLATFIELD;Flat-Field !FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory @@ -277,8 +277,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** -!FILEBROWSER_POPUPREMOVE;Delete -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPRENAME;Rename !FILEBROWSER_POPUPSELECTALL;Select all !FILEBROWSER_POPUPTRASH;Move to trash @@ -305,7 +305,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 !FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 !FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 !FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 9affa9444..7f810f71f 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -122,12 +122,12 @@ !FILEBROWSER_COPYPROFILE;Copy !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? !FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: -!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to delete the selected %1 files? -!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? !FILEBROWSER_EMPTYTRASH;Empty trash -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. !FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_FLATFIELD;Flat-Field !FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory @@ -161,8 +161,8 @@ !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** -!FILEBROWSER_POPUPREMOVE;Delete -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_POPUPRENAME;Rename !FILEBROWSER_POPUPSELECTALL;Select all !FILEBROWSER_POPUPTRASH;Move to trash @@ -189,7 +189,7 @@ !FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 !FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 !FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 !FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 @@ -1430,7 +1430,7 @@ !TP_COLORAPP_SURROUND_DARK;Dark !TP_COLORAPP_SURROUND_DIM;Dim !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index b1d76b24f..15a4d81f5 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -180,8 +180,6 @@ FILEBROWSER_COPYPROFILE;Copiar perfil FILEBROWSER_CURRENT_NAME;Nombre actual: FILEBROWSER_DARKFRAME;Toma Negra FILEBROWSER_DELETEDIALOG_HEADER;Confirmación de borrar archivos -FILEBROWSER_DELETEDIALOG_SELECTED;¿Seguro que quiere borrar los %1 archivos seleccionados? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;¿Seguro que quiere borrar los %1 archivos seleccionados incluyendo la versión procesada en la cola? FILEBROWSER_EMPTYTRASH;Vaciar papelera FILEBROWSER_EXTPROGMENU;Abrir con FILEBROWSER_FLATFIELD;Campo plano @@ -216,8 +214,6 @@ FILEBROWSER_POPUPRANK2;Rango 2 ** FILEBROWSER_POPUPRANK3;Rango 3 *** FILEBROWSER_POPUPRANK4;Rango 4 **** FILEBROWSER_POPUPRANK5;Rango 5 ***** -FILEBROWSER_POPUPREMOVE;Borrar -FILEBROWSER_POPUPREMOVEINCLPROC;Borrar con salida de la cola FILEBROWSER_POPUPRENAME;Renombrar FILEBROWSER_POPUPSELECTALL;Seleccionar todo FILEBROWSER_POPUPTRASH;Mover a la papelera @@ -244,7 +240,6 @@ FILEBROWSER_SHOWDIRHINT;Quitar todos los filtros.\nTecla de Atajo: d FILEBROWSER_SHOWEDITEDHINT;Mostrar imágenes editadas.\nTecla de Atajo: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imágenes no editadas.\nTecla de Atajo: 6 FILEBROWSER_SHOWEXIFINFO;Mostrar datos Exif.\nTecla de Atajo: i\n\nTecla de Atajo en modo editor simple: Alt-I -FILEBROWSER_SHOWNOTTRASHHINT;Mostrar solo las imágenes no borradas. FILEBROWSER_SHOWORIGINALHINT;Muestre solo imágenes originales. \nCuando existen varias imágenes con el mismo nombre de archivo pero con diferentes extensiones, la que se considera original es aquella cuya extensión está más cerca de la parte superior de la lista de extensiones analizadas en Preferencias> Explorador de archivos> Extensiones analizadas. FILEBROWSER_SHOWRANK1HINT;Mostrar imágenes con 1 estrella.\nTecla de Atajo: 1 FILEBROWSER_SHOWRANK2HINT;Mostrar imágenes con 2 estrellas.\nTecla de Atajo: 2 @@ -2319,8 +2314,13 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !CURVEEDITOR_CATMULLROM;Flexible !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius !MAIN_FRAME_PLACES_DEL;Remove !MAIN_TAB_FAVORITES;Favorites diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index cd3ac7394..d7141f8b2 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -119,8 +119,6 @@ FILEBROWSER_COPYPROFILE;Copier le profil FILEBROWSER_CURRENT_NAME;Nom courant: FILEBROWSER_DARKFRAME;Trame Noire FILEBROWSER_DELETEDIALOG_HEADER;Confirmation de la suppression de fichier -FILEBROWSER_DELETEDIALOG_SELECTED;Êtes-vous sûr de vouloir supprimer les %1 fichiers selectionnés? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Êtes-vous sûr de vouloir supprimer les %1 fichiers sélectionnés, INCLUANT une version déjà traitée? FILEBROWSER_EMPTYTRASH;Vider la corbeille FILEBROWSER_EXTPROGMENU;Ouvrir avec FILEBROWSER_FLATFIELD;Champ Uniforme @@ -155,8 +153,6 @@ FILEBROWSER_POPUPRANK2;Rang 2 ** FILEBROWSER_POPUPRANK3;Rang 3 *** FILEBROWSER_POPUPRANK4;Rang 4 **** FILEBROWSER_POPUPRANK5;Rang 5 ***** -FILEBROWSER_POPUPREMOVE;Retirer du système de fichier -FILEBROWSER_POPUPREMOVEINCLPROC;Supprimer (y compris les sorties de la file de traitement) FILEBROWSER_POPUPRENAME;Renommer FILEBROWSER_POPUPSELECTALL;Sélectionner tout FILEBROWSER_POPUPTRASH;Déplacer dans la corbeille @@ -183,7 +179,6 @@ FILEBROWSER_SHOWDIRHINT;Voir toutes les images du dossier\nRaccourci: d FILEBROWSER_SHOWEDITEDHINT;Afficher les images éditées\nRaccourci: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Afficher les images non éditées\nRaccourci: 6 FILEBROWSER_SHOWEXIFINFO;Montrer les infos EXIF.\nRaccourci: i\n\nRaccourcis dans le mode Éditeur Unique: Alt-i -FILEBROWSER_SHOWNOTTRASHHINT;Voir uniquement les images non supprimées FILEBROWSER_SHOWORIGINALHINT;Voir seulement les images originales.\n\nQuand plusieurs images éxistent avec le même nom de fichier mais des extensions différentes, celle considéré originale est celle dont l'extention est au plus dans la liste des extensions dans Préférences > Navigateur de fichiers > Extensions considérées. FILEBROWSER_SHOWRANK1HINT;Voir les images 1 étoile\nRaccourci: 1 FILEBROWSER_SHOWRANK2HINT;Voir les images 2 étoiles\nRaccourci: 2 @@ -2264,8 +2259,13 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !MAIN_FRAME_PLACES_DEL;Remove !PROGRESSBAR_DECODING;Decoding... !PROGRESSBAR_GREENEQUIL;Green equilibration... diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index bedba34f6..6d44a132f 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -92,8 +92,6 @@ FILEBROWSER_COPYPROFILE;Copia FILEBROWSER_CURRENT_NAME;Nome corrente: FILEBROWSER_DARKFRAME;Dark Frame FILEBROWSER_DELETEDIALOG_HEADER;Conferma eliminazione del file -FILEBROWSER_DELETEDIALOG_SELECTED;Vuoi eliminare i %1 file selezionati? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Vuoi eliminare i %1 file inclusa la versione sviluppata nella coda? FILEBROWSER_EMPTYTRASH;Svuota cestino FILEBROWSER_EXTPROGMENU;Apri con FILEBROWSER_FLATFIELD;Flat Field @@ -128,8 +126,6 @@ FILEBROWSER_POPUPRANK2;Punteggio 2 ** FILEBROWSER_POPUPRANK3;Punteggio 3 *** FILEBROWSER_POPUPRANK4;Punteggio 4 **** FILEBROWSER_POPUPRANK5;Punteggio 5 ***** -FILEBROWSER_POPUPREMOVE;Elimina -FILEBROWSER_POPUPREMOVEINCLPROC;Elimina insieme a quanto sviluppato nella coda FILEBROWSER_POPUPRENAME;Rinomina FILEBROWSER_POPUPSELECTALL;Seleziona tutto FILEBROWSER_POPUPTRASH;Sposta nel cestino @@ -1270,10 +1266,14 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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. !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 0ab793099..2cec023e5 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -153,8 +153,6 @@ FILEBROWSER_COPYPROFILE;プロファイルをコピー FILEBROWSER_CURRENT_NAME;現在の名前: FILEBROWSER_DARKFRAME;ダークフレーム FILEBROWSER_DELETEDIALOG_HEADER;ファイル削除確認 -FILEBROWSER_DELETEDIALOG_SELECTED;選択済みのファイル %1 を削除してもいいですか? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;バッチ処理に組み込まれている選択済みのファイル %1 を削除してもいいですか? FILEBROWSER_EMPTYTRASH;ゴミ箱を空にする FILEBROWSER_EXTPROGMENU;..で開く FILEBROWSER_FLATFIELD;フラットフィールド @@ -189,8 +187,6 @@ FILEBROWSER_POPUPRANK2;ランク 2 ** FILEBROWSER_POPUPRANK3;ランク 3 *** FILEBROWSER_POPUPRANK4;ランク 4 **** FILEBROWSER_POPUPRANK5;ランク 5 ***** -FILEBROWSER_POPUPREMOVE;ファイルシステムから削除 -FILEBROWSER_POPUPREMOVEINCLPROC;ファイルシステムとバッチの結果から削除 FILEBROWSER_POPUPRENAME;名前変更 FILEBROWSER_POPUPSELECTALL;全選択 FILEBROWSER_POPUPTRASH;ゴミ箱へ移動 @@ -217,7 +213,6 @@ FILEBROWSER_SHOWDIRHINT;全ての絞り込みをクリア\nショートカット FILEBROWSER_SHOWEDITEDHINT;編集済み画像を表示\nショートカット: 7 FILEBROWSER_SHOWEDITEDNOTHINT;未編集画像を表示\nショートカット: 6 FILEBROWSER_SHOWEXIFINFO;EXIF情報を表示\nショートカット: i\n\nシングル・エディタ・タブのショートカット: Alt-i -FILEBROWSER_SHOWNOTTRASHHINT;削除されていない画像だけ表示 FILEBROWSER_SHOWORIGINALHINT;元画像だけを表示\n\nファイル名は同じだが拡張子が異なる画像がある場合は、環境設定の中のファイルブラウザタブにある拡張子リストの上位に位置する拡張子を持った画像を元画像とする。 FILEBROWSER_SHOWRANK1HINT;1つ星ランクを表示\nショートカット: 1 FILEBROWSER_SHOWRANK2HINT;2つ星ランクを表示\nショートカット: 2 @@ -2310,7 +2305,12 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !QUEUE_LOCATION_TITLE;Output Location diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index d1947b893..6286ba63c 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -82,8 +82,6 @@ FILEBROWSER_COPYPROFILE;Feldolgozási paraméterek másolása FILEBROWSER_CURRENT_NAME;Aktuális név: FILEBROWSER_DARKFRAME;Referencia feketekép (dark frame) FILEBROWSER_DELETEDIALOG_HEADER;Állománytörlés megerősítése -FILEBROWSER_DELETEDIALOG_SELECTED;Biztosan törölni kívánja a kijelölt %1 képet? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Biztos vagy benne, hogy törölni szeredné a kiválasztott %1 állományt, beleértve a feldolgozási sorba helyezett változatát IS? FILEBROWSER_EMPTYTRASH;Kuka ürítése FILEBROWSER_FLATFIELD;Flat Field FILEBROWSER_MOVETODARKFDIR;Mozgatás a 'dark frame' könyvtárba @@ -103,8 +101,6 @@ FILEBROWSER_POPUPOPENINEDITOR;Open in Szerkesztő FILEBROWSER_POPUPPROCESS;Feldolgozási sorba helyezés FILEBROWSER_POPUPPROCESSFAST;Feldolgozási sorba helyez (expressz export) FILEBROWSER_POPUPPROFILEOPERATIONS;Profilműveletek -FILEBROWSER_POPUPREMOVE;Törlés (végleges) -FILEBROWSER_POPUPREMOVEINCLPROC;Törlés (feldolgozási sorból is) FILEBROWSER_POPUPRENAME;Átnevezés FILEBROWSER_POPUPSELECTALL;Mindent kijelöl FILEBROWSER_POPUPTRASH;Kukába dobás @@ -870,8 +866,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. !FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) !FILEBROWSER_POPUPCOLORLABEL0;Label: None @@ -887,13 +885,15 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 !FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 !FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 !FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 !FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files @@ -1657,7 +1657,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORAPP_SURROUND_DARK;Dark !TP_COLORAPP_SURROUND_DIM;Dim !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index b8b30e64c..7317038a3 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -123,8 +123,6 @@ FILEBROWSER_COPYPROFILE;Kopieer profiel FILEBROWSER_CURRENT_NAME;Huidige naam: FILEBROWSER_DARKFRAME;Donkerframe FILEBROWSER_DELETEDIALOG_HEADER;Bevestiging bestand verwijderen -FILEBROWSER_DELETEDIALOG_SELECTED;Weet u zeker dat u de geselecteerde %1 bestanden wilt verwijderen? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Weet u zeker dat u de %1 geselecteerde bestanden wilt verwijderen *inclusief* de versies van de verwerkingsrij? FILEBROWSER_EMPTYTRASH;Leeg prullenbak FILEBROWSER_EXTPROGMENU;Open met FILEBROWSER_FLATFIELD;Vlakveld @@ -159,8 +157,6 @@ FILEBROWSER_POPUPRANK2;Waardering 2 ** FILEBROWSER_POPUPRANK3;Waardering 3 *** FILEBROWSER_POPUPRANK4;Waardering 4 **** FILEBROWSER_POPUPRANK5;Waardering 5 ***** -FILEBROWSER_POPUPREMOVE;Verwijder van bestandssysteem -FILEBROWSER_POPUPREMOVEINCLPROC;Verwijder (met bestand in verwerkingsrij) FILEBROWSER_POPUPRENAME;Hernoem FILEBROWSER_POPUPSELECTALL;Alles selecteren FILEBROWSER_POPUPTRASH;Verplaats naar prullenbak @@ -187,7 +183,6 @@ FILEBROWSER_SHOWDIRHINT;Verwijder alle filters.\nSneltoets: d FILEBROWSER_SHOWEDITEDHINT;Toon bewerkte foto's\nSneltoets: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Toon niet-bewerkte foto's\nSneltoets: 6 FILEBROWSER_SHOWEXIFINFO;Toon EXIF-info -FILEBROWSER_SHOWNOTTRASHHINT;Toon alleen niet-verwijderde foto's. FILEBROWSER_SHOWORIGINALHINT;Toon alleen originele afbeelding.\n\nAls er meerdere afbeeldingen zijn met dezelfde naam maar verschillende extensies, dan wordt de afbeelding waarvan de extensie het hoogst staat in de lijst met extensies in Voorkeuren > Bestandsnavigator > Extensies FILEBROWSER_SHOWRANK1HINT;Toon foto's met 1 ster.\nSneltoets: 1 FILEBROWSER_SHOWRANK2HINT;Toon foto's met 2 sterren.\nSneltoets: 2 @@ -1979,8 +1974,13 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !GENERAL_CURRENT;Current !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 05f099ea6..d1e27f0dc 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -96,8 +96,6 @@ FILEBROWSER_COPYPROFILE;Kopiuj profil FILEBROWSER_CURRENT_NAME;Obecna nazwa: FILEBROWSER_DARKFRAME;Czarna klatka FILEBROWSER_DELETEDIALOG_HEADER;Potwierdzenie usunięcia pliku -FILEBROWSER_DELETEDIALOG_SELECTED;Na pewno usunąć zaznaczone %1 plików? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Na pewno usunąć wybrany plik %1 WŁĄCZNIE z wersją utworzoną przez kolejkę przetwarzania? FILEBROWSER_EMPTYTRASH;Wyczyść kosz FILEBROWSER_EXTPROGMENU;Otwórz za pomocą FILEBROWSER_FLATFIELD;Puste pole @@ -132,8 +130,6 @@ FILEBROWSER_POPUPRANK2;Ocena 2 ** FILEBROWSER_POPUPRANK3;Ocena 3 *** FILEBROWSER_POPUPRANK4;Ocena 4 **** FILEBROWSER_POPUPRANK5;Ocena 5 ***** -FILEBROWSER_POPUPREMOVE;Usuń z dysku -FILEBROWSER_POPUPREMOVEINCLPROC;Usuń z dysku wraz z wynikiem przetwarzania FILEBROWSER_POPUPRENAME;Zmień nazwę FILEBROWSER_POPUPSELECTALL;Zaznacz wszystkie FILEBROWSER_POPUPTRASH;Przenieś do kosza @@ -1392,10 +1388,14 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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. !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index b59f4ffe0..7e5713093 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -120,8 +120,6 @@ FILEBROWSER_COPYPROFILE;Copiar FILEBROWSER_CURRENT_NAME;Nome atual: FILEBROWSER_DARKFRAME;Fotograma escuro FILEBROWSER_DELETEDIALOG_HEADER;Confirmação de eliminação de ficheiro -FILEBROWSER_DELETEDIALOG_SELECTED;Tem a certeza que quer eliminar os %1 ficheiros selecionados? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Tem a certeza que quer eliminar os %1 ficheiros selecionados incluindo uma versão processada na fila? FILEBROWSER_EMPTYTRASH;Esvaziar o caixote do lixo FILEBROWSER_EXTPROGMENU;Abrir com FILEBROWSER_FLATFIELD;Campo plano @@ -156,8 +154,6 @@ FILEBROWSER_POPUPRANK2;Classificação 2 estrelas FILEBROWSER_POPUPRANK3;Classificação 3 estrelas FILEBROWSER_POPUPRANK4;Classificação 4 estrelas FILEBROWSER_POPUPRANK5;Classificação 5 estrelas -FILEBROWSER_POPUPREMOVE;Eliminar -FILEBROWSER_POPUPREMOVEINCLPROC;Eliminar com saída da fila FILEBROWSER_POPUPRENAME;Renomear FILEBROWSER_POPUPSELECTALL;Selecionar tudo FILEBROWSER_POPUPTRASH;Mover para o caixote do lixo @@ -184,7 +180,6 @@ FILEBROWSER_SHOWDIRHINT;Limpar todos os filtros.\nAtalho: d FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: 6 FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\ni - Modo de editor em várias abas,\nAlt-i - Modo de editor numa só aba. -FILEBROWSER_SHOWNOTTRASHHINT;Mostrar apenas imagens não eliminadas. FILEBROWSER_SHOWORIGINALHINT;Mostrar apenas imagens originais.\n\nQuando existem várias imagens com o mesmo nome de ficheiro mas com extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de ficheiros > Extensões analisadas. FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas com 1 estrela.\nAtalho: 1 FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas com 2 estrelas.\nAtalho: 2 @@ -2262,8 +2257,13 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !MAIN_FRAME_PLACES_DEL;Remove !PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode !PROGRESSBAR_DECODING;Decoding... diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index da9a620df..beffbb9a8 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -120,8 +120,6 @@ FILEBROWSER_COPYPROFILE;Copiar perfil FILEBROWSER_CURRENT_NAME;Nome atual: FILEBROWSER_DARKFRAME;Quadro escuro FILEBROWSER_DELETEDIALOG_HEADER;Confirmação de exclusão de arquivo -FILEBROWSER_DELETEDIALOG_SELECTED;Tens certeza de que desejas excluir os %1 arquivos selecionados? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Tens certeza de que desejas excluir os %1 arquivos selecionados incluindo uma versão processada em fila? FILEBROWSER_EMPTYTRASH;Esvaziar lixeira FILEBROWSER_EXTPROGMENU;Abrir com FILEBROWSER_FLATFIELD;Flat-Field @@ -156,8 +154,6 @@ FILEBROWSER_POPUPRANK2;Classificação 2 ** FILEBROWSER_POPUPRANK3;Classificação 3 *** FILEBROWSER_POPUPRANK4;Classificação 4 **** FILEBROWSER_POPUPRANK5;Classificação 5 ***** -FILEBROWSER_POPUPREMOVE;Excluir -FILEBROWSER_POPUPREMOVEINCLPROC;Excluir com saída da fila FILEBROWSER_POPUPRENAME;Renomear FILEBROWSER_POPUPSELECTALL;Selecionar tudo FILEBROWSER_POPUPTRASH;Mover para a lixeira @@ -184,7 +180,6 @@ FILEBROWSER_SHOWDIRHINT;Limpar todos os filtros.\nAtalho: d FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: 6 FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\ni - Modo de Guias de Editores Múltiplos,\nAlt-i - Modo de Guia de Editor Único. -FILEBROWSER_SHOWNOTTRASHHINT;Mostre somente imagens não excluídas. FILEBROWSER_SHOWORIGINALHINT;Mostre somente imagens originais.\n\nQuando existem várias imagens com o mesmo nome de arquivo, mas extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de Arquivos > Extensões Analisadas. FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas com 1 estrela.\nAtalho: 1 FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas com 2 estrelas.\nAtalho: 2 @@ -2254,8 +2249,13 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset !HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power !MAIN_FRAME_PLACES_DEL;Remove diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index c2b43033e..870895dd7 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -113,8 +113,6 @@ FILEBROWSER_COPYPROFILE;Скопировать профиль FILEBROWSER_CURRENT_NAME;Текущее имя: FILEBROWSER_DARKFRAME;Темновой кадр FILEBROWSER_DELETEDIALOG_HEADER;Подтверждение удаления файла -FILEBROWSER_DELETEDIALOG_SELECTED;Вы уверены, что хотите удалить %1 выбранный(ых) файл(ов)? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Вы уверены, что хотите удалить %1 выделенных файлов, включая обработанные версии? FILEBROWSER_EMPTYTRASH;Очистить корзину FILEBROWSER_EXTPROGMENU;Открыть с помощью FILEBROWSER_FLATFIELD;Плоское поле @@ -149,8 +147,6 @@ FILEBROWSER_POPUPRANK2;Рейтинг 2 ** FILEBROWSER_POPUPRANK3;Рейтинг 3 *** FILEBROWSER_POPUPRANK4;Рейтинг 4 **** FILEBROWSER_POPUPRANK5;Рейтинг 5 ***** -FILEBROWSER_POPUPREMOVE;Удалить с диска -FILEBROWSER_POPUPREMOVEINCLPROC;Удалить с диска и пакетной обработки FILEBROWSER_POPUPRENAME;Переименовать FILEBROWSER_POPUPSELECTALL;Выбрать все FILEBROWSER_POPUPTRASH;Удалить в корзину @@ -177,7 +173,6 @@ FILEBROWSER_SHOWDIRHINT;Сбросить все фильтры.\nГорячая FILEBROWSER_SHOWEDITEDHINT;Показать измененные изображения.\nГорячая клавиша: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Показать не измененные изображения.\nГорячая клавиша: 6 FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-I -FILEBROWSER_SHOWNOTTRASHHINT;Показать только неудалённые изображения. FILEBROWSER_SHOWRANK1HINT;Показать изображения с рейтингом 1.\nГорячая клавиша: 1 FILEBROWSER_SHOWRANK2HINT;Показать изображения с рейтингом 2.\nГорячая клавиша: 2 FILEBROWSER_SHOWRANK3HINT;Показать изображения с рейтингом 3.\nГорячая клавиша: 3 @@ -1470,8 +1465,13 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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. !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo @@ -1872,7 +1872,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !TP_COLORAPP_SURROUND_DARK;Dark !TP_COLORAPP_SURROUND_DIM;Dim !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. +!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slightly dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 21a34119a..edcf1d2d6 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -85,8 +85,6 @@ FILEBROWSER_COPYPROFILE;Умножи профил FILEBROWSER_CURRENT_NAME;Тренутно име: FILEBROWSER_DARKFRAME;Тамни кадар FILEBROWSER_DELETEDIALOG_HEADER;Брисање датотеке -FILEBROWSER_DELETEDIALOG_SELECTED;Да ли сигурно желите да обришете %1 датотека? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Да ли желите да обришете %1 изабраних датотека, укључујући и оне које су заказане? FILEBROWSER_EMPTYTRASH;Избаци смеће FILEBROWSER_EXTPROGMENU;Отвори помоћу FILEBROWSER_FLATFIELD;Равно поље @@ -108,8 +106,6 @@ FILEBROWSER_POPUPPROCESS;Закажи за обраду FILEBROWSER_POPUPPROCESSFAST;Додај у заказано (брзи извоз) FILEBROWSER_POPUPPROFILEOPERATIONS;Профил FILEBROWSER_POPUPRANK;Оцена -FILEBROWSER_POPUPREMOVE;Уклони из система датотека -FILEBROWSER_POPUPREMOVEINCLPROC;Уклони из система датотека и заказаног FILEBROWSER_POPUPRENAME;Преименуј FILEBROWSER_POPUPSELECTALL;Изабери све FILEBROWSER_POPUPTRASH;Премести у смеће @@ -1229,8 +1225,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -1244,8 +1242,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILEBROWSER_POPUPRANK3;Rank 3 *** !FILEBROWSER_POPUPRANK4;Rank 4 **** !FILEBROWSER_POPUPRANK5;Rank 5 ***** +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !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. !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 14dc4069f..2263584cd 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -94,8 +94,6 @@ FILEBROWSER_COPYPROFILE;Kopiera profil FILEBROWSER_CURRENT_NAME;Nuvarande namn: FILEBROWSER_DARKFRAME;Svartbild FILEBROWSER_DELETEDIALOG_HEADER;Bekräftelse vid borttag -FILEBROWSER_DELETEDIALOG_SELECTED;Är du säker på att du vill ta bort de valda %1 filerna? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Är du säker på att du vill ta bort de valda filerna %1 OCH den behandlade versionen? FILEBROWSER_EMPTYTRASH;Töm papperskorgen FILEBROWSER_EXTPROGMENU;Öppna med FILEBROWSER_FLATFIELD;Plattfält @@ -130,8 +128,6 @@ FILEBROWSER_POPUPRANK2;Betyg 2 ** FILEBROWSER_POPUPRANK3;Betyg 3 *** FILEBROWSER_POPUPRANK4;Betyg 4 **** FILEBROWSER_POPUPRANK5;Betyg 5 ***** -FILEBROWSER_POPUPREMOVE;Ta bort från filsystemet -FILEBROWSER_POPUPREMOVEINCLPROC;Ta bort från filsystemet inkl. den behandlade FILEBROWSER_POPUPRENAME;Byt namn FILEBROWSER_POPUPSELECTALL;Markera allt FILEBROWSER_POPUPTRASH;Flytta till papperskorgen @@ -157,7 +153,6 @@ FILEBROWSER_SHOWDIRHINT;Återställ alla sökfilter.\nKortkommando: d FILEBROWSER_SHOWEDITEDHINT;Visa redigerade bilder.\nKortkommando: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Visa ickeredigerade bilder.\nKortkommando: 6 FILEBROWSER_SHOWEXIFINFO;Visa EXIF-information.\nKortkommando: i\n\nKortkommando i enkelbildsläget: Alt-i -FILEBROWSER_SHOWNOTTRASHHINT;Visa endast ej borttagna bilder. FILEBROWSER_SHOWORIGINALHINT;Visa endast ursprungliga bilder.\n\nNär flera bilder finns med samma filnamn men med olika filändelser så anses den bild vara urpsrungsbilden som har sin ändelse närmst toppen i listan över filändelser i Inställningar > Filbläddrare > Hanterade filändelser FILEBROWSER_SHOWRANK1HINT;Visa bilder med betyg 1.\nKortkommando: 1 FILEBROWSER_SHOWRANK2HINT;Visa bilder med betyg 2.\nKortkommando: 2 @@ -1768,9 +1763,14 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords. !FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles !FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles -!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? -!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? +!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? +!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +!FILEBROWSER_POPUPREMOVE;Delete permanently +!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. !GENERAL_CURRENT;Current !GENERAL_RESET;Reset !GENERAL_SAVE_AS;Save as... diff --git a/rtdata/languages/default b/rtdata/languages/default index 5ea726218..31e704d7d 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -121,12 +121,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\n FILEBROWSER_COPYPROFILE;Copy FILEBROWSER_CURRENT_NAME;Current name: FILEBROWSER_DARKFRAME;Dark-frame -FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to delete all %1 files in trash? +FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash? FILEBROWSER_DELETEDIALOG_HEADER;File delete confirmation: -FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to delete the selected %1 files? -FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? +FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files? +FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version? FILEBROWSER_EMPTYTRASH;Empty trash -FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. +FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash. FILEBROWSER_EXTPROGMENU;Open with FILEBROWSER_FLATFIELD;Flat-Field FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory @@ -160,8 +160,8 @@ FILEBROWSER_POPUPRANK2;Rank 2 ** FILEBROWSER_POPUPRANK3;Rank 3 *** FILEBROWSER_POPUPRANK4;Rank 4 **** FILEBROWSER_POPUPRANK5;Rank 5 ***** -FILEBROWSER_POPUPREMOVE;Delete -FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue +FILEBROWSER_POPUPREMOVE;Delete permanently +FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version FILEBROWSER_POPUPRENAME;Rename FILEBROWSER_POPUPSELECTALL;Select all FILEBROWSER_POPUPTRASH;Move to trash @@ -188,7 +188,7 @@ FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. 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_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 From 0f09559413c8c5c2dfe8d67b53667055f6e57108 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sat, 6 Jul 2019 12:58:53 +0200 Subject: [PATCH 42/48] Windows build crashes when trying to load a corrupted jpg, fixes #5366 --- rtengine/imageio.cc | 4 ++++ rtengine/jdatasrc.cc | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index f1fa8dbef..3b0fdcf6d 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -575,7 +575,11 @@ int ImageIO::loadJPEG (const Glib::ustring &fname) my_jpeg_stdio_src (&cinfo, file); +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) + if ( __builtin_setjmp((reinterpret_cast(cinfo.src))->error_jmp_buf) == 0 ) { +#else if ( setjmp((reinterpret_cast(cinfo.src))->error_jmp_buf) == 0 ) { +#endif if (pl) { pl->setProgressStr ("PROGRESSBAR_LOADJPEG"); pl->setProgress (0.0); diff --git a/rtengine/jdatasrc.cc b/rtengine/jdatasrc.cc index 0c2a13ed0..8c04a14a2 100644 --- a/rtengine/jdatasrc.cc +++ b/rtengine/jdatasrc.cc @@ -245,7 +245,11 @@ my_error_exit (j_common_ptr cinfo) j_decompress_ptr dinfo = (j_decompress_ptr)cinfo; // longjmp (((rt_jpeg_error_mgr*)(dinfo->src))->error_jmp_buf, 1); +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) + __builtin_longjmp ((reinterpret_cast(dinfo->src)) ->error_jmp_buf, 1); +#else longjmp ((reinterpret_cast(dinfo->src)) ->error_jmp_buf, 1); +#endif } From 7f5080ded055e348d71ee5320c277e8d3f1ecbc4 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sat, 6 Jul 2019 13:59:31 +0200 Subject: [PATCH 43/48] Update Deutsch locale --- rtdata/languages/Deutsch | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 28cfb8e77..4be1d35ce 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -81,6 +81,7 @@ #80 25.03.2019 Erweiterung (TooWaBoo) RT 5.6 #81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6 #82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6 +#83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -231,7 +232,7 @@ FILEBROWSER_POPUPMOVETO;Verschieben nach... FILEBROWSER_POPUPOPEN;Öffnen FILEBROWSER_POPUPOPENINEDITOR;Im Editor öffnen FILEBROWSER_POPUPPROCESS;Zur Warteschlange hinzufügen -FILEBROWSER_POPUPPROCESSFAST;Zur Warteschlange hinzufügen (Schnelles Exportieren) +FILEBROWSER_POPUPPROCESSFAST;Zur Warteschlange hinzufügen\n(Schnell-Export) FILEBROWSER_POPUPPROFILEOPERATIONS;Profiloperationen FILEBROWSER_POPUPRANK;Bewertung FILEBROWSER_POPUPRANK0;Nicht bewertet @@ -984,7 +985,7 @@ MAIN_TAB_DETAIL;Details MAIN_TAB_DETAIL_TOOLTIP;Taste: Alt + d MAIN_TAB_DEVELOP; Batchbearbeitung MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Exportieren +MAIN_TAB_EXPORT; Schnell-Export MAIN_TAB_EXPOSURE;Belichtung MAIN_TAB_EXPOSURE_TOOLTIP;Taste: Alt + e MAIN_TAB_FAVORITES;Favoriten @@ -2361,6 +2362,6 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!FILEBROWSER_POPUPREMOVE;Delete permanently -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version -!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash. +FILEBROWSER_POPUPREMOVE;Unwiederuflich löschen +FILEBROWSER_POPUPREMOVEINCLPROC;Unwiederuflich löschen\n(einschl. aller Dateien der Stabelverarbeitung) +FILEBROWSER_SHOWNOTTRASHHINT;Nur Bilder außerhalb des Papierkorbs anzeigen. From 3c18613afbdc1d2afad98e3cc77e20880e05f795 Mon Sep 17 00:00:00 2001 From: TooWaBoo Date: Sat, 6 Jul 2019 14:36:49 +0200 Subject: [PATCH 44/48] Typo fixed --- rtdata/languages/Deutsch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 4be1d35ce..950a33f45 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2362,6 +2362,6 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -FILEBROWSER_POPUPREMOVE;Unwiederuflich löschen -FILEBROWSER_POPUPREMOVEINCLPROC;Unwiederuflich löschen\n(einschl. aller Dateien der Stabelverarbeitung) +FILEBROWSER_POPUPREMOVE;Unwiderruflich löschen +FILEBROWSER_POPUPREMOVEINCLPROC;Unwiderruflich löschen\n(einschl. aller Dateien der Stabelverarbeitung) FILEBROWSER_SHOWNOTTRASHHINT;Nur Bilder außerhalb des Papierkorbs anzeigen. From 6cbcb9fee57b9df175e10e2bc460ff7b3a647d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 6 Jul 2019 17:37:49 +0200 Subject: [PATCH 45/48] Fix compilation and more C++11 (fixes #5368) --- rtengine/dfmanager.cc | 4 ++-- rtengine/pixelsmap.h | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 7de712fb5..4696af1a1 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -235,7 +235,7 @@ void dfInfo::updateBadPixelList( RawImage *df ) df->data[row + 2][col - 2] + df->data[row + 2][col] + df->data[row + 2][col + 2]); if( df->data[row][col] > m * threshold ) { - badPixelsThread.push_back( badPix(col, row) ); + badPixelsThread.emplace_back(col, row); } } @@ -566,7 +566,7 @@ int DFManager::scanBadPixelsFile( Glib::ustring filename ) if( numparms == 1 ) { // only one number in first line means, that this is the offset. offset = x; } else if(numparms == 2) { - bp.push_back( badPix(x + offset, y + offset) ); + bp.emplace_back(x + offset, y + offset); } while( fgets(line, sizeof(line), file ) ) { diff --git a/rtengine/pixelsmap.h b/rtengine/pixelsmap.h index 9089ac91c..b359d61d9 100644 --- a/rtengine/pixelsmap.h +++ b/rtengine/pixelsmap.h @@ -20,6 +20,7 @@ */ #include +#include #include #include "noncopyable.h" @@ -75,10 +76,10 @@ public: } // set pixels from a list - int set(const std::vector &bp) + int set(const std::vector& bp) { - for (std::vector::const_iterator iter = bp.begin(); iter != bp.end(); ++iter) { - set(iter->x, iter->y); + for (const auto& bad_pix : bp) { + set(bad_pix.x, bad_pix.y); } return bp.size(); @@ -86,7 +87,7 @@ public: void clear() { - memset(pm, 0, h * w * base_t_size); + std::memset(pm, 0, h * w * base_t_size); } // return 0 if at least one pixel in the word(base_t) is set, otherwise return the number of pixels to skip to the next word base_t int skipIfZero(int x, int y) const From e172dcabdaea64bb5f9fc587055b1ba9f0e98348 Mon Sep 17 00:00:00 2001 From: "luz.paz" Date: Sun, 7 Jul 2019 07:48:34 -0400 Subject: [PATCH 46/48] Fix misc. typos and whitespace Found via `codespell -q 3 -I ../rawtherapy-whitelist.txt -S ./rtdata/languages -L hist,fo,reall,bloc,alph,dof,thre,makro,chang,currentry,portugues,vektor,ue` --- rtengine/LUT.h | 2 +- rtengine/color.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 9f16995d0..6584eefe6 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -563,7 +563,7 @@ public: } } - // compress a LUT with size y into a LUT with size x (y>x) by using the passTrough LUT to calculate indexes + // compress a LUT with size y into a LUT with size x (y>x) by using the passThrough LUT to calculate indexes template::value>::type> void compressTo(LUT &dest, unsigned int numVals, const LUT &passThrough) const { diff --git a/rtengine/color.h b/rtengine/color.h index a94302e30..fb4eea458 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -102,7 +102,7 @@ private: static float computeXYZ2Lab(float f); static float computeXYZ2LabY(float f); - + public: typedef enum Channel { @@ -1094,7 +1094,7 @@ public: //very small differences between the 2 return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous - + } @@ -1111,7 +1111,7 @@ public: //very small differences between the 4 return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous - + } @@ -1509,8 +1509,8 @@ public: static const float C9 = 8.f, C8 = 15.f, C7 = 12.f, C4 = 7.f, C3 = 5.f, C2 = 5.f, C1 = 5.f; static const float H9 = 0.05f, H8 = 0.25f, H7 = 0.1f, H4 = 0.02f, H3 = 0.02f, H2 = 0.1f, H1 = 0.1f, H10 = -0.2f, H11 = -0.2f; - // "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0 - // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6 + // "real" skin color : take into account a slight usage of contrast and saturation in RT if option "skin" = 1, uses implicit factor 1.0 + // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit factor 0.6 // wide area for transition, uses explicit factor 0.4 if (lum >= 85.0f) { @@ -1588,8 +1588,8 @@ public: static const float C9 = 8.f, C8 = 15.f, C7 = 12.f, C4 = 7.f, C3 = 5.f, C2 = 5.f, C1 = 5.f; static const float H9 = 0.05f, H8 = 0.25f, H7 = 0.1f, H4 = 0.02f, H3 = 0.02f, H2 = 0.1f, H1 = 0.1f, H10 = -0.2f, H11 = -0.2f; - // "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0 - // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6 + // "real" skin color : take into account a slight usage of contrast and saturation in RT if option "skin" = 1, uses implicit factor 1.0 + // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit factor 0.6 // wide area for transition, uses explicit factor 0.4 if((b_l > -0.3f && b_r < 2.f) || basc == 0) { //range maxi skin if (lum >= 85.0f) { @@ -1704,8 +1704,8 @@ public: hue = HH; - // "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0 - // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6 + // "real" skin color : take into account a slight usage of contrast and saturation in RT if option "skin" = 1, uses implicit factor 1.0 + // wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit factor 0.6 // wide area for transition, uses explicit factor 0.4 if (lum >= 85.0f) { From bcc727e1cf5e9fb6d0a85dba5d20059b82fa7440 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 7 Jul 2019 22:45:30 +0200 Subject: [PATCH 47/48] Sony DSC-R1 camconst.json entry, closes #5359 Confirmed wl in commit 9ea964f5d. Updating quality level to B thanks to sample set in #5359 (not A as sample set lacks LENR). --- rtengine/camconst.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 0ae967fc0..97a14f66e 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -2461,7 +2461,7 @@ Camera constants: "raw_crop": [ 0, 0, -8, 0 ] // 8 rightmost columns are garbage }, - { // Quality C + { // Quality B "make_model": [ "Sony DSC-R1" ], "raw_crop": [ 0, 0, 3924, 2608 ], "ranges": { "white": 16368 } From 3b78a5c22720f6128e15a34e81212b011d3f3eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 9 Jul 2019 13:18:08 +0200 Subject: [PATCH 48/48] Minor cleanups after #5315 and #5368 --- rtengine/dfmanager.cc | 6 +++--- rtgui/mydiagonalcurve.cc | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 4696af1a1..c41c8a180 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -257,7 +257,7 @@ void dfInfo::updateBadPixelList( RawImage *df ) } if( df->data[row][3 * col] > m[0]*threshold || df->data[row][3 * col + 1] > m[1]*threshold || df->data[row][3 * col + 2] > m[2]*threshold) { - badPixels.push_back( badPix(col, row) ); + badPixels.emplace_back(col, row); } } } @@ -571,7 +571,7 @@ int DFManager::scanBadPixelsFile( Glib::ustring filename ) while( fgets(line, sizeof(line), file ) ) { if( sscanf(line, "%d %d", &x, &y) == 2 ) { - bp.push_back( badPix(x + offset, y + offset) ); + bp.emplace_back(x + offset, y + offset); } } } @@ -592,7 +592,7 @@ std::vector *DFManager::getBadPixels ( const std::string &mak, const std bool found = false; if( !serial.empty() ) { - // search with sreial number first + // search with serial number first std::ostringstream s; s << mak << " " << mod << " " << serial; iter = bpList.find( s.str() ); diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 64da24607..a3e7b9375 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -25,8 +25,6 @@ #include "editcallbacks.h" #include "../rtengine/curves.h" -#include -#include MyDiagonalCurve::MyDiagonalCurve () : MyCurve(),