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/23] 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/23] 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/23] 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 a5800a18b0c5818ac61b54fd07f7ebf68dd47546 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 4 Jul 2019 17:21:19 +0200 Subject: [PATCH 04/23] 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 05/23] 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 06/23] 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 07/23] 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 08/23] 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 09/23] 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 10/23] 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 4d6c3f2ce2438fcd9ecc7337f2329b493d2a050f Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Sun, 7 Jul 2019 15:29:24 +0200 Subject: [PATCH 11/23] Speedup for color propagation --- rtengine/hilite_recon.cc | 137 ++++++++++++++++++++++++-------------- rtengine/rawimagesource.h | 2 - 2 files changed, 86 insertions(+), 53 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 699d42071..38da3ea26 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -28,14 +28,11 @@ #include "rawimagesource.h" #include "rt_math.h" #include "opthelper.h" -namespace rtengine -{ +#define BENCHMARK +#include "StopWatch.h" -extern const Settings* settings; - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int W, int box ) +namespace { +void boxblur2(float** src, float** dst, float** temp, int startY, int startX, int H, int W, int box ) { //box blur image channel; box size = 2*box+1 //horizontal blur @@ -45,23 +42,23 @@ void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int for (int row = 0; row < H; row++) { int len = box + 1; - temp[row][0] = src[row][0] / len; + temp[row][0] = src[row + startY][startX] / len; for (int j = 1; j <= box; j++) { - temp[row][0] += src[row][j] / len; + temp[row][0] += src[row + startY][j + startX] / len; } for (int col = 1; col <= box; col++) { - temp[row][col] = (temp[row][col - 1] * len + src[row][col + box]) / (len + 1); + temp[row][col] = (temp[row][col - 1] * len + src[row + startY][col + box + startX]) / (len + 1); len ++; } for (int col = box + 1; col < W - box; col++) { - temp[row][col] = temp[row][col - 1] + (src[row][col + box] - src[row][col - box - 1]) / len; + temp[row][col] = temp[row][col - 1] + (src[row + startY][col + box + startX] - src[row + startY][col - box - 1 + startX]) / len; } for (int col = W - box; col < W; col++) { - temp[row][col] = (temp[row][col - 1] * len - src[row][col - box - 1]) / (len - 1); + temp[row][col] = (temp[row][col - 1] * len - src[row + startY][col - box - 1 + startX]) / (len - 1); len --; } } @@ -210,7 +207,7 @@ void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int } -void RawImageSource::boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int box, int samp ) +void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int box, int samp ) { #ifdef _OPENMP @@ -386,8 +383,16 @@ void RawImageSource::boxblur_resamp(float **src, float **dst, float ** temp, int } +} +namespace rtengine +{ + +extern const Settings* settings; + + void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** blue) { + BENCHFUN double progress = 0.0; if (plistener) { @@ -477,28 +482,58 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b for (int c = 0; c < ColorCount; c++) { medFactor[c] = max(1.0f, max_f[c] / medpt) / (-blendpt); } + int minx = width - 1; + int maxx = 0; + int miny = height - 1; + int maxy = 0; - multi_array2D channelblur(width, height, 0, 48); - array2D temp(width, height); // allocate temporary buffer + #pragma omp parallel for reduction(min:minx,miny) reduction(max:maxx,maxy) schedule(dynamic, 16) + for (int i = 0; i < height; ++i) { + for (int j = 0; j< width; ++j) { + if(red[i][j] >= max_f[0] || green[i][j] >= max_f[1] || blue[i][j] >= max_f[2]) { + minx = std::min(minx, j); + maxx = std::max(maxx, j); + miny = std::min(miny, i); + maxy = std::max(maxy, i); + } + } + } + + std::cout << "minx : " << minx << std::endl; + std::cout << "maxx : " << maxx << std::endl; + std::cout << "miny : " << miny << std::endl; + std::cout << "maxy : " << maxy << std::endl; + + constexpr int blurBorder = 256; + minx = std::max(0, minx - blurBorder); + miny = std::max(0, miny - blurBorder); + maxx = std::min(width - 1, maxx + blurBorder); + maxy = std::min(height - 1, maxy + blurBorder); + const int blurWidth = maxx - minx + 1; + const int blurHeight = maxy - miny + 1; + + std::cout << "Corrected area reduced by factor: " << (((float)width * height) / (blurWidth * blurHeight)) << std::endl; + multi_array2D channelblur(blurWidth, blurHeight, 0, 48); + array2D temp(blurWidth, blurHeight); // allocate temporary buffer // blur RGB channels - boxblur2(red, channelblur[0], temp, height, width, 4); + boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, blurWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(green, channelblur[1], temp, height, width, 4); + boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, blurWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(blue, channelblur[2], temp, height, width, 4); - + boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, blurWidth, 4); + if(plistener) { progress += 0.05; plistener->setProgress(progress); @@ -509,9 +544,9 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for #endif - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i][j]) + fabsf(channelblur[1][i][j] - green[i][j]) + fabsf(channelblur[2][i][j] - blue[i][j]); + for(int i = 0; i < blurHeight; i++) + for(int j = 0; j < blurWidth; j++) { + channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i + miny][j + minx]) + fabsf(channelblur[1][i][j] - green[i + miny][j + minx]) + fabsf(channelblur[2][i][j] - blue[i + miny][j + minx]); } for (int c = 1; c < 3; c++) { @@ -523,7 +558,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b plistener->setProgress(progress); } - multi_array2D hilite_full(width, height, ARRAY2D_CLEAR_DATA, 32); + multi_array2D hilite_full(blurWidth, blurHeight, ARRAY2D_CLEAR_DATA, 32); if(plistener) { progress += 0.10; @@ -538,18 +573,18 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for reduction(+:hipass_sum,hipass_norm) schedule(dynamic,16) #endif - for (int i = 0; i < height; i++) { - for (int j = 0; j < width; j++) { + for (int i = 0; i < blurHeight; i++) { + for (int j = 0; j < blurWidth; j++) { //if one or more channels is highlight but none are blown, add to highlight accumulator - if ((red[i][j] > thresh[0] || green[i][j] > thresh[1] || blue[i][j] > thresh[2]) && - (red[i][j] < max_f[0] && green[i][j] < max_f[1] && blue[i][j] < max_f[2])) { + if ((red[i + miny][j + minx] > thresh[0] || green[i + miny][j + minx] > thresh[1] || blue[i + miny][j + minx] > thresh[2]) && + (red[i + miny][j + minx] < max_f[0] && green[i + miny][j + minx] < max_f[1] && blue[i + miny][j + minx] < max_f[2])) { hipass_sum += channelblur[0][i][j]; hipass_norm ++; - hilite_full[0][i][j] = red[i][j]; - hilite_full[1][i][j] = green[i][j]; - hilite_full[2][i][j] = blue[i][j]; + hilite_full[0][i][j] = red[i + miny][j + minx]; + hilite_full[1][i][j] = green[i + miny][j + minx]; + hilite_full[2][i][j] = blue[i + miny][j + minx]; hilite_full[3][i][j] = 1.f; } @@ -563,10 +598,10 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b plistener->setProgress(progress); } - array2D hilite_full4(width, height); + array2D hilite_full4(blurWidth, blurHeight); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //blur highlight data - boxblur2(hilite_full[3], hilite_full4, temp, height, width, 1); + boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, blurWidth, 1); temp.free(); // free temporary buffer @@ -579,8 +614,8 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for schedule(dynamic,16) #endif - for (int i = 0; i < height; i++) { - for (int j = 0; j < width; j++) { + for (int i = 0; i < blurHeight; i++) { + for (int j = 0; j < blurWidth; j++) { if (channelblur[0][i][j] > hipass_ave) { //too much variation hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0.f; @@ -597,18 +632,18 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b channelblur[0].free(); //free up some memory hilite_full4.free(); //free up some memory - int hfh = (height - (height % pitch)) / pitch; - int hfw = (width - (width % pitch)) / pitch; + int hfh = (blurHeight - (blurHeight % pitch)) / pitch; + int hfw = (blurWidth - (blurWidth % pitch)) / pitch; multi_array2D hilite(hfw + 1, hfh + 1, ARRAY2D_CLEAR_DATA, 48); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // blur and resample highlight data; range=size of blur, pitch=sample spacing - array2D temp2((width / pitch) + ((width % pitch) == 0 ? 0 : 1), height); + array2D temp2((blurWidth / pitch) + ((blurWidth % pitch) == 0 ? 0 : 1), blurHeight); for (int m = 0; m < 4; m++) { - boxblur_resamp(hilite_full[m], hilite[m], temp2, height, width, range, pitch); + boxblur_resamp(hilite_full[m], hilite[m], temp2, blurHeight, blurWidth, range, pitch); if(plistener) { progress += 0.05; @@ -953,12 +988,12 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for schedule(dynamic,16) #endif - for (int i = 0; i < height; i++) { + for (int i = 0; i < blurHeight; i++) { int i1 = min((i - (i % pitch)) / pitch, hfh - 1); - for (int j = 0; j < width; j++) { + for (int j = 0; j < blurWidth; j++) { - float pixel[3] = {red[i][j], green[i][j], blue[i][j]}; + float pixel[3] = {red[i + miny][j + minx], green[i + miny][j + minx], blue[i + miny][j + minx]}; if (pixel[0] < max_f[0] && pixel[1] < max_f[1] && pixel[2] < max_f[2]) { continue; //pixel not clipped @@ -1109,36 +1144,36 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b float Y = (0.299 * clipfix[0] + 0.587 * clipfix[1] + 0.114 * clipfix[2]); float factor = whitept / Y; - red[i][j] = clipfix[0] * factor; - green[i][j] = clipfix[1] * factor; - blue[i][j] = clipfix[2] * factor; + red[i + miny][j + minx] = clipfix[0] * factor; + green[i + miny][j + minx] = clipfix[1] * factor; + blue[i + miny][j + minx] = clipfix[2] * factor; } else {//some channels clipped float notclipped[3] = {pixel[0] <= max_f[0] ? 1.f : 0.f, pixel[1] <= max_f[1] ? 1.f : 0.f, pixel[2] <= max_f[2] ? 1.f : 0.f}; if (notclipped[0] == 0.f) { //red clipped - red[i][j] = max(red[i][j], (clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / + red[i + miny][j + minx] = max(red[i + miny][j + minx], (clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2] + epsilon)))); } if (notclipped[1] == 0.f) { //green clipped - green[i][j] = max(green[i][j], (clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / + green[i + miny][j + minx] = max(green[i + miny][j + minx], (clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0] + epsilon)))); } if (notclipped[2] == 0.f) { //blue clipped - blue[i][j] = max(blue[i][j], (clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / + blue[i + miny][j + minx] = max(blue[i + miny][j + minx], (clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1] + epsilon)))); } } - Y = (0.299 * red[i][j] + 0.587 * green[i][j] + 0.114 * blue[i][j]); + Y = (0.299 * red[i + miny][j + minx] + 0.587 * green[i + miny][j + minx] + 0.114 * blue[i + miny][j + minx]); if (Y > whitept) { float factor = whitept / Y; - red[i][j] *= factor; - green[i][j] *= factor; - blue[i][j] *= factor; + red[i + miny][j + minx] *= factor; + green[i + miny][j + minx] *= factor; + blue[i + miny][j + minx] *= factor; } } } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 4c7b0ba21..64018f354 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -195,8 +195,6 @@ public: } static void inverse33 (const double (*coeff)[3], double (*icoeff)[3]); - void boxblur2(float** src, float** dst, float** temp, int H, int W, int box ); - void boxblur_resamp(float **src, float **dst, float** temp, int H, int W, int box, int samp ); void MSR(float** luminance, float **originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); void HLRecovery_inpaint (float** red, float** green, float** blue) override; static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); From bcc727e1cf5e9fb6d0a85dba5d20059b82fa7440 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Sun, 7 Jul 2019 22:45:30 +0200 Subject: [PATCH 12/23] 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 54fdbe41ea361467ff90104e7183fc38aad42efb Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 8 Jul 2019 23:57:24 +0200 Subject: [PATCH 13/23] dump SSE code in boxblur2 because new code is faster with auto-vectorization, also pad bufferwidth for boxblur2 to a multiple of 16 --- rtengine/hilite_recon.cc | 189 +++++++++++---------------------------- 1 file changed, 52 insertions(+), 137 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 38da3ea26..b7c4d349c 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -22,6 +22,10 @@ // //////////////////////////////////////////////////////////////// +#ifndef NDEBUG +#include +#endif + #include #include #include "array2D.h" @@ -32,8 +36,11 @@ #include "StopWatch.h" namespace { -void boxblur2(float** src, float** dst, float** temp, int startY, int startX, int H, int W, int box ) +void boxblur2(const float* const* src, float** dst, float** temp, int startY, int startX, int H, int W, int box) { + constexpr int numCols = 16; + assert((W % numCols) == 0); + //box blur image channel; box size = 2*box+1 //horizontal blur #ifdef _OPENMP @@ -63,148 +70,52 @@ void boxblur2(float** src, float** dst, float** temp, int startY, int startX, in } } -#ifdef __SSE2__ //vertical blur #ifdef _OPENMP #pragma omp parallel #endif { - float len = box + 1; - vfloat lenv = F2V( len ); - vfloat lenp1v = F2V( len + 1.0f ); - vfloat onev = F2V( 1.0f ); - vfloat tempv, temp2v; + float tempvalN[numCols] ALIGNED64; #ifdef _OPENMP - #pragma omp for nowait + #pragma omp for #endif - - for (int col = 0; col < W - 7; col += 8) { - tempv = LVFU(temp[0][col]) / lenv; - temp2v = LVFU(temp[0][col + 4]) / lenv; - + for (int col = 0; col < W - numCols + 1; col += numCols) { + float len = box + 1; + for(int n = 0; n < numCols; n++) { + tempvalN[n] = temp[0][col + n] / len; + } for (int i = 1; i <= box; i++) { - tempv = tempv + LVFU(temp[i][col]) / lenv; - temp2v = temp2v + LVFU(temp[i][col + 4]) / lenv; + for(int n = 0; n < numCols; n++) { + tempvalN[n] += temp[i][col + n] / len; + } + } + for(int n = 0; n < numCols; n++) { + dst[0][col + n] = tempvalN[n]; } - - _mm_storeu_ps( &dst[0][col], tempv); - _mm_storeu_ps( &dst[0][col + 4], temp2v); - for (int row = 1; row <= box; row++) { - tempv = (tempv * lenv + LVFU(temp[(row + box)][col])) / lenp1v; - temp2v = (temp2v * lenv + LVFU(temp[(row + box)][col + 4])) / lenp1v; - _mm_storeu_ps( &dst[row][col], tempv); - _mm_storeu_ps( &dst[row][col + 4], temp2v); - lenv = lenp1v; - lenp1v = lenp1v + onev; + for(int n = 0; n < numCols; n++) { + tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1); + dst[row][col + n] = tempvalN[n]; + } + len ++; } - + const float rlen = 1.f / len; for (int row = box + 1; row < H - box; row++) { - tempv = tempv + (LVFU(temp[(row + box)][col]) - LVFU(temp[(row - box - 1)][col])) / lenv; - temp2v = temp2v + (LVFU(temp[(row + box)][col + 4]) - LVFU(temp[(row - box - 1)][col + 4])) / lenv; - _mm_storeu_ps( &dst[row][col], tempv); - _mm_storeu_ps( &dst[row][col + 4], temp2v); + for(int n = 0; n < numCols; n++) { + tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; + dst[row][col + n] = tempvalN[n]; + } } for (int row = H - box; row < H; row++) { - lenp1v = lenv; - lenv = lenv - onev; - tempv = (tempv * lenp1v - LVFU(temp[(row - box - 1)][col])) / lenv; - temp2v = (temp2v * lenp1v - LVFU(temp[(row - box - 1)][col + 4])) / lenv; - _mm_storeu_ps( &dst[row][col], tempv ); - _mm_storeu_ps( &dst[row][col + 4], temp2v ); - } - } - -#ifdef _OPENMP - #pragma omp single -#endif - { - for (int col = W - (W % 8); col < W - 3; col += 4) { - tempv = LVFU(temp[0][col]) / lenv; - - for (int i = 1; i <= box; i++) { - tempv = tempv + LVFU(temp[i][col]) / lenv; - } - - _mm_storeu_ps( &dst[0][col], tempv); - - for (int row = 1; row <= box; row++) { - tempv = (tempv * lenv + LVFU(temp[(row + box)][col])) / lenp1v; - _mm_storeu_ps( &dst[row][col], tempv); - lenv = lenp1v; - lenp1v = lenp1v + onev; - } - - for (int row = box + 1; row < H - box; row++) { - tempv = tempv + (LVFU(temp[(row + box)][col]) - LVFU(temp[(row - box - 1)][col])) / lenv; - _mm_storeu_ps( &dst[row][col], tempv); - } - - for (int row = H - box; row < H; row++) { - lenp1v = lenv; - lenv = lenv - onev; - tempv = (tempv * lenp1v - LVFU(temp[(row - box - 1)][col])) / lenv; - _mm_storeu_ps( &dst[row][col], tempv ); - } - } - - for (int col = W - (W % 4); col < W; col++) { - int len = box + 1; - dst[0][col] = temp[0][col] / len; - - for (int i = 1; i <= box; i++) { - dst[0][col] += temp[i][col] / len; - } - - for (int row = 1; row <= box; row++) { - dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + box)][col]) / (len + 1); - len ++; - } - - for (int row = box + 1; row < H - box; row++) { - dst[row][col] = dst[(row - 1)][col] + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len; - } - - for (int row = H - box; row < H; row++) { - dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - box - 1)][col]) / (len - 1); - len --; + for(int n = 0; n < numCols; n++) { + tempvalN[n] = (dst[(row - 1)][col + n] * len - temp[(row - box - 1)][col + n]) / (len - 1); + dst[row][col + n] = tempvalN[n]; } + len --; } } } - -#else - //vertical blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = box + 1; - dst[0][col] = temp[0][col] / len; - - for (int i = 1; i <= box; i++) { - dst[0][col] += temp[i][col] / len; - } - - for (int row = 1; row <= box; row++) { - dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + box)][col]) / (len + 1); - len ++; - } - - for (int row = box + 1; row < H - box; row++) { - dst[row][col] = dst[(row - 1)][col] + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len; - } - - for (int row = H - box; row < H; row++) { - dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - box - 1)][col]) / (len - 1); - len --; - } - } - -#endif - } void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int box, int samp ) @@ -263,19 +174,19 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b } } - static const int numCols = 8; // process numCols columns at once for better L1 CPU cache usage + constexpr int numCols = 8; // process numCols columns at once for better L1 CPU cache usage #ifdef _OPENMP #pragma omp parallel #endif { - float tempvalN[numCols] ALIGNED16; + float tempvalN[numCols] ALIGNED64; #ifdef _OPENMP #pragma omp for nowait #endif //vertical blur for (int col = 0; col < (W / samp) - (numCols - 1); col += numCols) { - int len = box + 1; + float len = box + 1; for(int n = 0; n < numCols; n++) { tempvalN[n] = temp[0][col + n] / len; @@ -304,10 +215,10 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b len ++; } - + const float rlen = 1.f / len; for (int row = box + 1; row < H - box; row++) { for(int n = 0; n < numCols; n++) { - tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) / len; + tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; } if(row % samp == 0) { @@ -511,28 +422,32 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b maxy = std::min(height - 1, maxy + blurBorder); const int blurWidth = maxx - minx + 1; const int blurHeight = maxy - miny + 1; + const int bufferWidth = blurWidth + ((16 - (blurWidth % 16)) & 15); + + std::cout << "blurWidth : " << blurWidth << std::endl; + std::cout << "bufferWidth : " << bufferWidth << std::endl; std::cout << "Corrected area reduced by factor: " << (((float)width * height) / (blurWidth * blurHeight)) << std::endl; - multi_array2D channelblur(blurWidth, blurHeight, 0, 48); - array2D temp(blurWidth, blurHeight); // allocate temporary buffer + multi_array2D channelblur(bufferWidth, blurHeight, 0, 48); + array2D temp(bufferWidth, blurHeight); // allocate temporary buffer // blur RGB channels - boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, blurWidth, 4); + boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, bufferWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, blurWidth, 4); + boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, bufferWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, blurWidth, 4); + boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, bufferWidth, 4); if(plistener) { progress += 0.05; @@ -558,7 +473,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b plistener->setProgress(progress); } - multi_array2D hilite_full(blurWidth, blurHeight, ARRAY2D_CLEAR_DATA, 32); + multi_array2D hilite_full(bufferWidth, blurHeight, ARRAY2D_CLEAR_DATA, 32); if(plistener) { progress += 0.10; @@ -598,10 +513,10 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b plistener->setProgress(progress); } - array2D hilite_full4(blurWidth, blurHeight); + array2D hilite_full4(bufferWidth, blurHeight); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //blur highlight data - boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, blurWidth, 1); + boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, bufferWidth, 1); temp.free(); // free temporary buffer From 4f73e5bb3cb4cbdd5749a8b7614319b65567cee8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 9 Jul 2019 00:20:04 +0200 Subject: [PATCH 14/23] Fix oob access in last commit --- rtengine/hilite_recon.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index b7c4d349c..e78bd7365 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -36,10 +36,10 @@ #include "StopWatch.h" namespace { -void boxblur2(const float* const* src, float** dst, float** temp, int startY, int startX, int H, int W, int box) +void boxblur2(const float* const* src, float** dst, float** temp, int startY, int startX, int H, int W, int bufferW, int box) { constexpr int numCols = 16; - assert((W % numCols) == 0); + assert((bufferW % numCols) == 0); //box blur image channel; box size = 2*box+1 //horizontal blur @@ -79,7 +79,7 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in #ifdef _OPENMP #pragma omp for #endif - for (int col = 0; col < W - numCols + 1; col += numCols) { + for (int col = 0; col < bufferW - numCols + 1; col += numCols) { float len = box + 1; for(int n = 0; n < numCols; n++) { tempvalN[n] = temp[0][col + n] / len; @@ -433,21 +433,21 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b // blur RGB channels - boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, bufferWidth, 4); + boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, bufferWidth, 4); + boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); if(plistener) { progress += 0.05; plistener->setProgress(progress); } - boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, bufferWidth, 4); + boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); if(plistener) { progress += 0.05; @@ -516,7 +516,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b array2D hilite_full4(bufferWidth, blurHeight); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //blur highlight data - boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, bufferWidth, 1); + boxblur2(hilite_full[3], hilite_full4, temp, 0, 0, blurHeight, blurWidth, bufferWidth, 1); temp.free(); // free temporary buffer From fe43bf1bf2df00d51826093cd09269c03a7ece03 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 9 Jul 2019 00:40:25 +0200 Subject: [PATCH 15/23] color propagation: use up to 4 cores where previously only up to 3 cores were used --- rtengine/hilite_recon.cc | 313 +++++++++++++++++++++------------------ 1 file changed, 169 insertions(+), 144 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index e78bd7365..a726481dd 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -617,192 +617,217 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for nowait #endif - for (int c = 0; c < 3; c++) { - for (int j = 1; j < hfw - 1; j++) { - for (int i = 2; i < hfh - 2; i++) { - //from left - if (hilite[3][i][j] > epsilon) { - hilite_dir0[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; - } else { - hilite_dir0[c][j][i] = 0.1f * ((hilite_dir0[0 + c][j - 1][i - 2] + hilite_dir0[0 + c][j - 1][i - 1] + hilite_dir0[0 + c][j - 1][i] + hilite_dir0[0 + c][j - 1][i + 1] + hilite_dir0[0 + c][j - 1][i + 2]) / - (hilite_dir0[0 + 3][j - 1][i - 2] + hilite_dir0[0 + 3][j - 1][i - 1] + hilite_dir0[0 + 3][j - 1][i] + hilite_dir0[0 + 3][j - 1][i + 1] + hilite_dir0[0 + 3][j - 1][i + 2] + epsilon)); + for (int c = 0; c < 3; c++) { + for (int j = 1; j < hfw - 1; j++) { + for (int i = 2; i < hfh - 2; i++) { + //from left + if (hilite[3][i][j] > epsilon) { + hilite_dir0[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; + } else { + hilite_dir0[c][j][i] = 0.1f * ((hilite_dir0[0 + c][j - 1][i - 2] + hilite_dir0[0 + c][j - 1][i - 1] + hilite_dir0[0 + c][j - 1][i] + hilite_dir0[0 + c][j - 1][i + 1] + hilite_dir0[0 + c][j - 1][i + 2]) / + (hilite_dir0[0 + 3][j - 1][i - 2] + hilite_dir0[0 + 3][j - 1][i - 1] + hilite_dir0[0 + 3][j - 1][i] + hilite_dir0[0 + 3][j - 1][i + 1] + hilite_dir0[0 + 3][j - 1][i + 2] + epsilon)); + } + } + + if(hilite[3][2][j] <= epsilon) { + hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2]; + } + + if(hilite[3][3][j] <= epsilon) { + hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3]; + } + + if(hilite[3][hfh - 3][j] <= epsilon) { + hilite_dir[4 + c][hfh - 1][j] = hilite_dir0[c][j][hfh - 3]; + } + + if(hilite[3][hfh - 4][j] <= epsilon) { + hilite_dir[4 + c][hfh - 2][j] = hilite_dir0[c][j][hfh - 4]; } } - if(hilite[3][2][j] <= epsilon) { - hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2]; - } - - if(hilite[3][3][j] <= epsilon) { - hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3]; - } - - if(hilite[3][hfh - 3][j] <= epsilon) { - hilite_dir[4 + c][hfh - 1][j] = hilite_dir0[c][j][hfh - 3]; - } - - if(hilite[3][hfh - 4][j] <= epsilon) { - hilite_dir[4 + c][hfh - 2][j] = hilite_dir0[c][j][hfh - 4]; + for (int i = 2; i < hfh - 2; i++) { + if(hilite[3][i][hfw - 2] <= epsilon) { + hilite_dir4[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i]; + } } } - for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][hfw - 2] <= epsilon) { - hilite_dir4[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i]; +#ifdef _OPENMP + #pragma omp single +#endif + { + for (int j = hfw - 2; j > 0; j--) { + for (int i = 2; i < hfh - 2; i++) { + //from right + if (hilite[3][i][j] > epsilon) { + hilite_dir4[3][j][i] = 1.f; + } else { + hilite_dir4[3][j][i] = (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)]) == 0.f ? 0.f : 0.1f; + } + } + + if(hilite[3][2][j] <= epsilon) { + hilite_dir[0 + 3][0][j] += hilite_dir4[3][j][2]; + } + + if(hilite[3][hfh - 3][j] <= epsilon) { + hilite_dir[4 + 3][hfh - 1][j] += hilite_dir4[3][j][hfh - 3]; + } + } + + for (int i = 2; i < hfh - 2; i++) { + if(hilite[3][i][0] <= epsilon) { + hilite_dir[0 + 3][i - 2][0] += hilite_dir4[3][0][i]; + hilite_dir[4 + 3][i + 2][0] += hilite_dir4[3][0][i]; + } + + if(hilite[3][i][1] <= epsilon) { + hilite_dir[0 + 3][i - 2][1] += hilite_dir4[3][1][i]; + hilite_dir[4 + 3][i + 2][1] += hilite_dir4[3][1][i]; + } + + if(hilite[3][i][hfw - 2] <= epsilon) { + hilite_dir[0 + 3][i - 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; + hilite_dir[4 + 3][i + 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; + } } } } - if(plistener) { progress += 0.05; plistener->setProgress(progress); } - for (int j = hfw - 2; j > 0; j--) { - for (int i = 2; i < hfh - 2; i++) { - //from right - if (hilite[3][i][j] > epsilon) { - hilite_dir4[3][j][i] = 1.f; - } else { - hilite_dir4[3][j][i] = (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)]) == 0.f ? 0.f : 0.1f; - } - } - - if(hilite[3][2][j] <= epsilon) { - hilite_dir[0 + 3][0][j] += hilite_dir4[3][j][2]; - } - - if(hilite[3][hfh - 3][j] <= epsilon) { - hilite_dir[4 + 3][hfh - 1][j] += hilite_dir4[3][j][hfh - 3]; - } - } - - for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][0] <= epsilon) { - hilite_dir[0 + 3][i - 2][0] += hilite_dir4[3][0][i]; - hilite_dir[4 + 3][i + 2][0] += hilite_dir4[3][0][i]; - } - - if(hilite[3][i][1] <= epsilon) { - hilite_dir[0 + 3][i - 2][1] += hilite_dir4[3][1][i]; - hilite_dir[4 + 3][i + 2][1] += hilite_dir4[3][1][i]; - } - - if(hilite[3][i][hfw - 2] <= epsilon) { - hilite_dir[0 + 3][i - 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; - hilite_dir[4 + 3][i + 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; - } - } - #ifdef _OPENMP - #pragma omp parallel for + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for nowait #endif - for (int c = 0; c < 3; c++) { - for (int j = hfw - 2; j > 0; j--) { - for (int i = 2; i < hfh - 2; i++) { - //from right - if (hilite[3][i][j] > epsilon) { - hilite_dir4[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; - } else { - hilite_dir4[c][j][i] = 0.1 * ((hilite_dir4[c][(j + 1)][(i - 2)] + hilite_dir4[c][(j + 1)][(i - 1)] + hilite_dir4[c][(j + 1)][(i)] + hilite_dir4[c][(j + 1)][(i + 1)] + hilite_dir4[c][(j + 1)][(i + 2)]) / - (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)] + epsilon)); + for (int c = 0; c < 3; c++) { + for (int j = hfw - 2; j > 0; j--) { + for (int i = 2; i < hfh - 2; i++) { + //from right + if (hilite[3][i][j] > epsilon) { + hilite_dir4[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; + } else { + hilite_dir4[c][j][i] = 0.1f * ((hilite_dir4[c][(j + 1)][(i - 2)] + hilite_dir4[c][(j + 1)][(i - 1)] + hilite_dir4[c][(j + 1)][(i)] + hilite_dir4[c][(j + 1)][(i + 1)] + hilite_dir4[c][(j + 1)][(i + 2)]) / + (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)] + epsilon)); + } + } + + if(hilite[3][2][j] <= epsilon) { + hilite_dir[0 + c][0][j] += hilite_dir4[c][j][2]; + } + + if(hilite[3][hfh - 3][j] <= epsilon) { + hilite_dir[4 + c][hfh - 1][j] += hilite_dir4[c][j][hfh - 3]; } } - if(hilite[3][2][j] <= epsilon) { - hilite_dir[0 + c][0][j] += hilite_dir4[c][j][2]; - } + for (int i = 2; i < hfh - 2; i++) { + if(hilite[3][i][0] <= epsilon) { + hilite_dir[0 + c][i - 2][0] += hilite_dir4[c][0][i]; + hilite_dir[4 + c][i + 2][0] += hilite_dir4[c][0][i]; + } - if(hilite[3][hfh - 3][j] <= epsilon) { - hilite_dir[4 + c][hfh - 1][j] += hilite_dir4[c][j][hfh - 3]; + if(hilite[3][i][1] <= epsilon) { + hilite_dir[0 + c][i - 2][1] += hilite_dir4[c][1][i]; + hilite_dir[4 + c][i + 2][1] += hilite_dir4[c][1][i]; + } + + if(hilite[3][i][hfw - 2] <= epsilon) { + hilite_dir[0 + c][i - 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; + hilite_dir[4 + c][i + 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; + } } } - for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][0] <= epsilon) { - hilite_dir[0 + c][i - 2][0] += hilite_dir4[c][0][i]; - hilite_dir[4 + c][i + 2][0] += hilite_dir4[c][0][i]; - } - - if(hilite[3][i][1] <= epsilon) { - hilite_dir[0 + c][i - 2][1] += hilite_dir4[c][1][i]; - hilite_dir[4 + c][i + 2][1] += hilite_dir4[c][1][i]; - } - - if(hilite[3][i][hfw - 2] <= epsilon) { - hilite_dir[0 + c][i - 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; - hilite_dir[4 + c][i + 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; - } - } - } - - if(plistener) { - progress += 0.05; - plistener->setProgress(progress); - } - - - for (int i = 1; i < hfh - 1; i++) - for (int j = 2; j < hfw - 2; j++) { - //from top - if (hilite[3][i][j] > epsilon) { - hilite_dir[0 + 3][i][j] = 1.f; - } else { - hilite_dir[0 + 3][i][j] = (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2]) == 0.f ? 0.f : 0.1f; - } - } - - for (int j = 2; j < hfw - 2; j++) { - if(hilite[3][hfh - 2][j] <= epsilon) { - hilite_dir[4 + 3][hfh - 1][j] += hilite_dir[0 + 3][hfh - 2][j]; - } - } - #ifdef _OPENMP - #pragma omp parallel for + #pragma omp single #endif + { + for (int i = 1; i < hfh - 1; i++) + for (int j = 2; j < hfw - 2; j++) { + //from top + if (hilite[3][i][j] > epsilon) { + hilite_dir[0 + 3][i][j] = 1.f; + } else { + hilite_dir[0 + 3][i][j] = (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2]) == 0.f ? 0.f : 0.1f; + } + } - for (int c = 0; c < 3; c++) { - for (int i = 1; i < hfh - 1; i++) { for (int j = 2; j < hfw - 2; j++) { - //from top - if (hilite[3][i][j] > epsilon) { - hilite_dir[0 + c][i][j] = hilite[c][i][j] / hilite[3][i][j]; - } else { - hilite_dir[0 + c][i][j] = 0.1 * ((hilite_dir[0 + c][i - 1][j - 2] + hilite_dir[0 + c][i - 1][j - 1] + hilite_dir[0 + c][i - 1][j] + hilite_dir[0 + c][i - 1][j + 1] + hilite_dir[0 + c][i - 1][j + 2]) / - (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2] + epsilon)); + if(hilite[3][hfh - 2][j] <= epsilon) { + hilite_dir[4 + 3][hfh - 1][j] += hilite_dir[0 + 3][hfh - 2][j]; } } } - - for (int j = 2; j < hfw - 2; j++) { - if(hilite[3][hfh - 2][j] <= epsilon) { - hilite_dir[4 + c][hfh - 1][j] += hilite_dir[0 + c][hfh - 2][j]; - } - } } - if(plistener) { progress += 0.05; plistener->setProgress(progress); } - for (int i = hfh - 2; i > 0; i--) - for (int j = 2; j < hfw - 2; j++) { - //from bottom - if (hilite[3][i][j] > epsilon) { - hilite_dir[4 + 3][i][j] = 1.f; - } else { - hilite_dir[4 + 3][i][j] = (hilite_dir[4 + 3][(i + 1)][(j - 2)] + hilite_dir[4 + 3][(i + 1)][(j - 1)] + hilite_dir[4 + 3][(i + 1)][(j)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 2)]) == 0.f ? 0.f : 0.1f; +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int c = 0; c < 3; c++) { + for (int i = 1; i < hfh - 1; i++) { + for (int j = 2; j < hfw - 2; j++) { + //from top + if (hilite[3][i][j] > epsilon) { + hilite_dir[0 + c][i][j] = hilite[c][i][j] / hilite[3][i][j]; + } else { + hilite_dir[0 + c][i][j] = 0.1f * ((hilite_dir[0 + c][i - 1][j - 2] + hilite_dir[0 + c][i - 1][j - 1] + hilite_dir[0 + c][i - 1][j] + hilite_dir[0 + c][i - 1][j + 1] + hilite_dir[0 + c][i - 1][j + 2]) / + (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2] + epsilon)); + } + } + } + + for (int j = 2; j < hfw - 2; j++) { + if(hilite[3][hfh - 2][j] <= epsilon) { + hilite_dir[4 + c][hfh - 1][j] += hilite_dir[0 + c][hfh - 2][j]; + } } } + +#ifdef _OPENMP + #pragma omp single +#endif + for (int i = hfh - 2; i > 0; i--) + for (int j = 2; j < hfw - 2; j++) { + //from bottom + if (hilite[3][i][j] > epsilon) { + hilite_dir[4 + 3][i][j] = 1.f; + } else { + hilite_dir[4 + 3][i][j] = (hilite_dir[4 + 3][(i + 1)][(j - 2)] + hilite_dir[4 + 3][(i + 1)][(j - 1)] + hilite_dir[4 + 3][(i + 1)][(j)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 2)]) == 0.f ? 0.f : 0.1f; + } + } + } + + if(plistener) { + progress += 0.05; + plistener->setProgress(progress); + } + #ifdef _OPENMP #pragma omp parallel for #endif @@ -814,7 +839,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b if (hilite[3][i][j] > epsilon) { hilite_dir[4 + c][i][j] = hilite[c][i][j] / hilite[3][i][j]; } else { - hilite_dir[4 + c][i][j] = 0.1 * ((hilite_dir[4 + c][(i + 1)][(j - 2)] + hilite_dir[4 + c][(i + 1)][(j - 1)] + hilite_dir[4 + c][(i + 1)][(j)] + hilite_dir[4 + c][(i + 1)][(j + 1)] + hilite_dir[4 + c][(i + 1)][(j + 2)]) / + hilite_dir[4 + c][i][j] = 0.1f * ((hilite_dir[4 + c][(i + 1)][(j - 2)] + hilite_dir[4 + c][(i + 1)][(j - 1)] + hilite_dir[4 + c][(i + 1)][(j)] + hilite_dir[4 + c][(i + 1)][(j + 1)] + hilite_dir[4 + c][(i + 1)][(j + 2)]) / (hilite_dir[4 + 3][(i + 1)][(j - 2)] + hilite_dir[4 + 3][(i + 1)][(j - 1)] + hilite_dir[4 + 3][(i + 1)][(j)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 2)] + epsilon)); } } 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 16/23] 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(), From c56106beaee25a0bd370bc22e75de23258ae40f7 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 9 Jul 2019 17:39:53 +0200 Subject: [PATCH 17/23] color propagation: small speedup, also some code formating --- rtengine/hilite_recon.cc | 273 +++++++++++++++++++-------------------- 1 file changed, 133 insertions(+), 140 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index a726481dd..7fe527a78 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -22,9 +22,7 @@ // //////////////////////////////////////////////////////////////// -#ifndef NDEBUG #include -#endif #include #include @@ -81,19 +79,19 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in #endif for (int col = 0; col < bufferW - numCols + 1; col += numCols) { float len = box + 1; - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = temp[0][col + n] / len; } for (int i = 1; i <= box; i++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] += temp[i][col + n] / len; } } - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { dst[0][col + n] = tempvalN[n]; } for (int row = 1; row <= box; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1); dst[row][col + n] = tempvalN[n]; } @@ -101,14 +99,14 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in } const float rlen = 1.f / len; for (int row = box + 1; row < H - box; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; dst[row][col + n] = tempvalN[n]; } } for (int row = H - box; row < H; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = (dst[(row - 1)][col + n] * len - temp[(row - box - 1)][col + n]) / (len - 1); dst[row][col + n] = tempvalN[n]; } @@ -118,7 +116,7 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in } } -void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int box, int samp ) +void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, int W, int box, int samp ) { #ifdef _OPENMP @@ -145,7 +143,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int col = 1; col <= box; col++) { tempval = (tempval * len + src[row][col + box]) / (len + 1); - if(col % samp == 0) { + if (col % samp == 0) { temp[row][col / samp] = tempval; } @@ -157,7 +155,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int col = box + 1; col < W - box; col++) { tempval = tempval + (src[row][col + box] - src[row][col - box - 1]) * oneByLen; - if(col % samp == 0) { + if (col % samp == 0) { temp[row][col / samp] = tempval; } } @@ -165,7 +163,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int col = W - box; col < W; col++) { tempval = (tempval * len - src[row][col - box - 1]) / (len - 1); - if(col % samp == 0) { + if (col % samp == 0) { temp[row][col / samp] = tempval; } @@ -188,27 +186,27 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int col = 0; col < (W / samp) - (numCols - 1); col += numCols) { float len = box + 1; - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = temp[0][col + n] / len; } for (int i = 1; i <= box; i++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] += temp[i][col + n] / len; } } - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { dst[0][col + n] = tempvalN[n]; } for (int row = 1; row <= box; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1); } - if(row % samp == 0) { - for(int n = 0; n < numCols; n++) { + if (row % samp == 0) { + for (int n = 0; n < numCols; n++) { dst[row / samp][col + n] = tempvalN[n]; } } @@ -217,24 +215,24 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b } const float rlen = 1.f / len; for (int row = box + 1; row < H - box; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; } - if(row % samp == 0) { - for(int n = 0; n < numCols; n++) { + if (row % samp == 0) { + for (int n = 0; n < numCols; n++) { dst[row / samp][col + n] = tempvalN[n]; } } } for (int row = H - box; row < H; row++) { - for(int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; n++) { tempvalN[n] = (tempvalN[n] * len - temp[(row - box - 1)][col + n]) / (len - 1); } - if(row % samp == 0) { - for(int n = 0; n < numCols; n++) { + if (row % samp == 0) { + for (int n = 0; n < numCols; n++) { dst[row / samp][col + n] = tempvalN[n]; } } @@ -263,7 +261,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int row = 1; row <= box; row++) { tempval = (tempval * len + temp[(row + box)][col]) / (len + 1); - if(row % samp == 0) { + if (row % samp == 0) { dst[row / samp][col] = tempval; } @@ -273,7 +271,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int row = box + 1; row < H - box; row++) { tempval = tempval + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len; - if(row % samp == 0) { + if (row % samp == 0) { dst[row / samp][col] = tempval; } } @@ -281,7 +279,7 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b for (int row = H - box; row < H; row++) { tempval = (tempval * len - temp[(row - box - 1)][col]) / (len - 1); - if(row % samp == 0) { + if (row % samp == 0) { dst[row / samp][col] = tempval; } @@ -290,8 +288,6 @@ void boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int b } } } - - } } @@ -301,7 +297,7 @@ namespace rtengine extern const Settings* settings; -void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** blue) +void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blue) { BENCHFUN double progress = 0.0; @@ -311,8 +307,8 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b plistener->setProgress (progress); } - int height = H; - int width = W; + const int height = H; + const int width = W; constexpr int range = 2; constexpr int pitch = 4; @@ -330,20 +326,20 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b constexpr float itrans[ColorCount][ColorCount] = { { 1.f, 0.8660254f, -0.5f }, { 1.f, -0.8660254f, -0.5f }, { 1.f, 0.f, 1.f } }; - if(settings->verbose) - for(int c = 0; c < 3; c++) { + if (settings->verbose) + for (int c = 0; c < 3; c++) { printf("chmax[%d] : %f\tclmax[%d] : %f\tratio[%d] : %f\n", c, chmax[c], c, clmax[c], c, chmax[c] / clmax[c]); } float factor[3]; - for(int c = 0; c < ColorCount; c++) { + for (int c = 0; c < ColorCount; c++) { factor[c] = chmax[c] / clmax[c]; } float minFactor = min(factor[0], factor[1], factor[2]); - if(minFactor > 1.f) { // all 3 channels clipped + if (minFactor > 1.f) { // all 3 channels clipped // calculate clip factor per channel for (int c = 0; c < ColorCount; c++) { factor[c] /= minFactor; @@ -354,15 +350,15 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b float maxValNew = 0.f; for (int c = 0; c < ColorCount; c++) { - if(chmax[c] / factor[c] > maxValNew) { + if (chmax[c] / factor[c] > maxValNew) { maxValNew = chmax[c] / factor[c]; maxpos = c; } } - float clipFactor = clmax[maxpos] / maxValNew; + const float clipFactor = clmax[maxpos] / maxValNew; - if(clipFactor < maxpct) + if (clipFactor < maxpct) // if max clipFactor < maxpct (0.95) adjust per channel factors for (int c = 0; c < ColorCount; c++) { @@ -372,7 +368,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b factor[0] = factor[1] = factor[2] = 1.f; } - if(settings->verbose) + if (settings->verbose) for (int c = 0; c < ColorCount; c++) { printf("correction factor[%d] : %f\n", c, factor[c]); } @@ -384,10 +380,10 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b max_f[c] = chmax[c] * maxpct / factor[c]; } - float whitept = max(max_f[0], max_f[1], max_f[2]); - float clippt = min(max_f[0], max_f[1], max_f[2]); - float medpt = max_f[0] + max_f[1] + max_f[2] - whitept - clippt; - float blendpt = blendthresh * clippt; + const float whitept = max(max_f[0], max_f[1], max_f[2]); + const float clippt = min(max_f[0], max_f[1], max_f[2]); + const float medpt = max_f[0] + max_f[1] + max_f[2] - whitept - clippt; + const float blendpt = blendthresh * clippt; float medFactor[3]; for (int c = 0; c < ColorCount; c++) { @@ -401,7 +397,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for reduction(min:minx,miny) reduction(max:maxx,maxy) schedule(dynamic, 16) for (int i = 0; i < height; ++i) { for (int j = 0; j< width; ++j) { - if(red[i][j] >= max_f[0] || green[i][j] >= max_f[1] || blue[i][j] >= max_f[2]) { + if (red[i][j] >= max_f[0] || green[i][j] >= max_f[1] || blue[i][j] >= max_f[2]) { minx = std::min(minx, j); maxx = std::max(maxx, j); miny = std::min(miny, i); @@ -410,10 +406,10 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - std::cout << "minx : " << minx << std::endl; - std::cout << "maxx : " << maxx << std::endl; - std::cout << "miny : " << miny << std::endl; - std::cout << "maxy : " << maxy << std::endl; + if (plistener) { + progress += 0.05; + plistener->setProgress(progress); + } constexpr int blurBorder = 256; minx = std::max(0, minx - blurBorder); @@ -424,10 +420,16 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b const int blurHeight = maxy - miny + 1; const int bufferWidth = blurWidth + ((16 - (blurWidth % 16)) & 15); + std::cout << "minx : " << minx << std::endl; + std::cout << "maxx : " << maxx << std::endl; + std::cout << "miny : " << miny << std::endl; + std::cout << "maxy : " << maxy << std::endl; + std::cout << "blurWidth : " << blurWidth << std::endl; std::cout << "bufferWidth : " << bufferWidth << std::endl; - std::cout << "Corrected area reduced by factor: " << (((float)width * height) / (blurWidth * blurHeight)) << std::endl; + std::cout << "Corrected area reduced by factor: " << (((float)width * height) / (bufferWidth * blurHeight)) << std::endl; + std::cout << "Peak memory usage reduced from ~" << (30ul * ((size_t)width * (size_t)height)) / (1024*1024) << " Mb to ~" << (30ul * ((size_t)bufferWidth * (size_t)blurHeight)) / (1024*1024) << " Mb" << std::endl; multi_array2D channelblur(bufferWidth, blurHeight, 0, 48); array2D temp(bufferWidth, blurHeight); // allocate temporary buffer @@ -435,22 +437,22 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b boxblur2(red, channelblur[0], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); - if(plistener) { - progress += 0.05; + if (plistener) { + progress += 0.07; plistener->setProgress(progress); } boxblur2(green, channelblur[1], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); - if(plistener) { - progress += 0.05; + if (plistener) { + progress += 0.07; plistener->setProgress(progress); } boxblur2(blue, channelblur[2], temp, miny, minx, blurHeight, blurWidth, bufferWidth, 4); - if(plistener) { - progress += 0.05; + if (plistener) { + progress += 0.07; plistener->setProgress(progress); } @@ -459,8 +461,8 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b #pragma omp parallel for #endif - for(int i = 0; i < blurHeight; i++) - for(int j = 0; j < blurWidth; j++) { + for (int i = 0; i < blurHeight; i++) + for (int j = 0; j < blurWidth; j++) { channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i + miny][j + minx]) + fabsf(channelblur[1][i][j] - green[i + miny][j + minx]) + fabsf(channelblur[2][i][j] - blue[i + miny][j + minx]); } @@ -468,15 +470,15 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b channelblur[c].free(); //free up some memory } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } multi_array2D hilite_full(bufferWidth, blurHeight, ARRAY2D_CLEAR_DATA, 32); - if(plistener) { - progress += 0.10; + if (plistener) { + progress += 0.05; plistener->setProgress(progress); } @@ -506,9 +508,9 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } }//end of filling highlight array - float hipass_ave = 2.f * hipass_sum / (hipass_norm + epsilon); + const float hipass_ave = 2.f * hipass_sum / (hipass_norm + epsilon); - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -520,8 +522,8 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b temp.free(); // free temporary buffer - if(plistener) { - progress += 0.05; + if (plistener) { + progress += 0.07; plistener->setProgress(progress); } @@ -560,7 +562,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b for (int m = 0; m < 4; m++) { boxblur_resamp(hilite_full[m], hilite[m], temp2, blurHeight, blurWidth, range, pitch); - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -577,7 +579,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b multi_array2D hilite_dir0(hfh, hfw, ARRAY2D_CLEAR_DATA, 64); multi_array2D hilite_dir4(hfh, hfw, ARRAY2D_CLEAR_DATA, 64); - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -594,25 +596,25 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(hilite[3][2][j] <= epsilon) { + if (hilite[3][2][j] <= epsilon) { hilite_dir[0 + 3][0][j] = hilite_dir0[3][j][2]; } - if(hilite[3][3][j] <= epsilon) { + if (hilite[3][3][j] <= epsilon) { hilite_dir[0 + 3][1][j] = hilite_dir0[3][j][3]; } - if(hilite[3][hfh - 3][j] <= epsilon) { + if (hilite[3][hfh - 3][j] <= epsilon) { hilite_dir[4 + 3][hfh - 1][j] = hilite_dir0[3][j][hfh - 3]; } - if(hilite[3][hfh - 4][j] <= epsilon) { + if (hilite[3][hfh - 4][j] <= epsilon) { hilite_dir[4 + 3][hfh - 2][j] = hilite_dir0[3][j][hfh - 4]; } } for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][hfw - 2] <= epsilon) { + if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir4[3][hfw - 1][i] = hilite_dir0[3][hfw - 2][i]; } } @@ -637,25 +639,25 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(hilite[3][2][j] <= epsilon) { + if (hilite[3][2][j] <= epsilon) { hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2]; } - if(hilite[3][3][j] <= epsilon) { + if (hilite[3][3][j] <= epsilon) { hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3]; } - if(hilite[3][hfh - 3][j] <= epsilon) { + if (hilite[3][hfh - 3][j] <= epsilon) { hilite_dir[4 + c][hfh - 1][j] = hilite_dir0[c][j][hfh - 3]; } - if(hilite[3][hfh - 4][j] <= epsilon) { + if (hilite[3][hfh - 4][j] <= epsilon) { hilite_dir[4 + c][hfh - 2][j] = hilite_dir0[c][j][hfh - 4]; } } for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][hfw - 2] <= epsilon) { + if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir4[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i]; } } @@ -675,34 +677,34 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(hilite[3][2][j] <= epsilon) { + if (hilite[3][2][j] <= epsilon) { hilite_dir[0 + 3][0][j] += hilite_dir4[3][j][2]; } - if(hilite[3][hfh - 3][j] <= epsilon) { + if (hilite[3][hfh - 3][j] <= epsilon) { hilite_dir[4 + 3][hfh - 1][j] += hilite_dir4[3][j][hfh - 3]; } } for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][0] <= epsilon) { + if (hilite[3][i][0] <= epsilon) { hilite_dir[0 + 3][i - 2][0] += hilite_dir4[3][0][i]; hilite_dir[4 + 3][i + 2][0] += hilite_dir4[3][0][i]; } - if(hilite[3][i][1] <= epsilon) { + if (hilite[3][i][1] <= epsilon) { hilite_dir[0 + 3][i - 2][1] += hilite_dir4[3][1][i]; hilite_dir[4 + 3][i + 2][1] += hilite_dir4[3][1][i]; } - if(hilite[3][i][hfw - 2] <= epsilon) { + if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir[0 + 3][i - 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; hilite_dir[4 + 3][i + 2][hfw - 2] += hilite_dir4[3][hfw - 2][i]; } } } } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -727,27 +729,27 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(hilite[3][2][j] <= epsilon) { + if (hilite[3][2][j] <= epsilon) { hilite_dir[0 + c][0][j] += hilite_dir4[c][j][2]; } - if(hilite[3][hfh - 3][j] <= epsilon) { + if (hilite[3][hfh - 3][j] <= epsilon) { hilite_dir[4 + c][hfh - 1][j] += hilite_dir4[c][j][hfh - 3]; } } for (int i = 2; i < hfh - 2; i++) { - if(hilite[3][i][0] <= epsilon) { + if (hilite[3][i][0] <= epsilon) { hilite_dir[0 + c][i - 2][0] += hilite_dir4[c][0][i]; hilite_dir[4 + c][i + 2][0] += hilite_dir4[c][0][i]; } - if(hilite[3][i][1] <= epsilon) { + if (hilite[3][i][1] <= epsilon) { hilite_dir[0 + c][i - 2][1] += hilite_dir4[c][1][i]; hilite_dir[4 + c][i + 2][1] += hilite_dir4[c][1][i]; } - if(hilite[3][i][hfw - 2] <= epsilon) { + if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir[0 + c][i - 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; hilite_dir[4 + c][i + 2][hfw - 2] += hilite_dir4[c][hfw - 2][i]; } @@ -769,13 +771,13 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } for (int j = 2; j < hfw - 2; j++) { - if(hilite[3][hfh - 2][j] <= epsilon) { + if (hilite[3][hfh - 2][j] <= epsilon) { hilite_dir[4 + 3][hfh - 1][j] += hilite_dir[0 + 3][hfh - 2][j]; } } } } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -802,7 +804,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } for (int j = 2; j < hfw - 2; j++) { - if(hilite[3][hfh - 2][j] <= epsilon) { + if (hilite[3][hfh - 2][j] <= epsilon) { hilite_dir[4 + c][hfh - 1][j] += hilite_dir[0 + c][hfh - 2][j]; } } @@ -823,7 +825,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -846,7 +848,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } @@ -911,38 +913,38 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b hilite_dir4[c][hfw - 1][hfh - 1] = hilite_dir4[c][hfw - 1][hfh - 2] = hilite_dir4[c][hfw - 2][hfh - 1] = hilite_dir4[c][hfw - 2][hfh - 2] = hilite_dir4[c][hfw - 3][hfh - 3]; } - if(plistener) { + if (plistener) { progress += 0.05; plistener->setProgress(progress); } //free up some memory - for(int c = 0; c < 4; c++) { + for (int c = 0; c < 4; c++) { hilite[c].free(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // now reconstruct clipped channels using color ratios - +StopWatch Stop1("last loop"); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif for (int i = 0; i < blurHeight; i++) { - int i1 = min((i - (i % pitch)) / pitch, hfh - 1); + const int i1 = min((i - (i % pitch)) / pitch, hfh - 1); for (int j = 0; j < blurWidth; j++) { - float pixel[3] = {red[i + miny][j + minx], green[i + miny][j + minx], blue[i + miny][j + minx]}; + const float pixel[3] = {red[i + miny][j + minx], green[i + miny][j + minx], blue[i + miny][j + minx]}; if (pixel[0] < max_f[0] && pixel[1] < max_f[1] && pixel[2] < max_f[2]) { continue; //pixel not clipped } - int j1 = min((j - (j % pitch)) / pitch, hfw - 1); + const int j1 = min((j - (j % pitch)) / pitch, hfw - 1); //estimate recovered values using modified HLRecovery_blend algorithm - float rgb[ColorCount], rgb_blend[ColorCount] = {}, cam[2][ColorCount], lab[2][ColorCount], sum[2], chratio; + float rgb[ColorCount], rgb_blend[ColorCount] = {}, cam[2][ColorCount], lab[2][ColorCount], sum[2]; // Copy input pixel to rgb so it's easier to access in loops rgb[0] = pixel[0]; @@ -972,12 +974,10 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } - if(sum[0] == 0.f) { // avoid division by zero - sum[0] = epsilon; - } - - chratio = sqrtf(sum[1] / sum[0]); + // avoid division by zero + sum[0] = std::max(sum[0], epsilon); + const float chratio = sqrtf(sum[1] / sum[0]); // Apply ratio to lightness in lab space for (int c = 1; c < ColorCount; c++) { @@ -998,19 +998,18 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } // Copy converted pixel back - float rfrac = max(0.f, min(1.f, medFactor[0] * (pixel[0] - blendpt))); - float gfrac = max(0.f, min(1.f, medFactor[1] * (pixel[1] - blendpt))); - float bfrac = max(0.f, min(1.f, medFactor[2] * (pixel[2] - blendpt))); - if (pixel[0] > blendpt) { + const float rfrac = max(0.f, min(1.f, medFactor[0] * (pixel[0] - blendpt))); rgb_blend[0] = rfrac * rgb[0] + (1.f - rfrac) * pixel[0]; } if (pixel[1] > blendpt) { + const float gfrac = max(0.f, min(1.f, medFactor[1] * (pixel[1] - blendpt))); rgb_blend[1] = gfrac * rgb[1] + (1.f - gfrac) * pixel[1]; } if (pixel[2] > blendpt) { + const float bfrac = max(0.f, min(1.f, medFactor[2] * (pixel[2] - blendpt))); rgb_blend[2] = bfrac * rgb[2] + (1.f - bfrac) * pixel[2]; } @@ -1019,7 +1018,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b //there are clipped highlights //first, determine weighted average of unclipped extensions (weighting is by 'hue' proximity) - float totwt = 0.f; + bool totwt = false; float clipfix[3] = {0.f, 0.f, 0.f}; float Y = epsilon + rgb_blend[0] + rgb_blend[1] + rgb_blend[2]; @@ -1031,25 +1030,23 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b float Yhi = 1.f / (hilite_dir0[0][j1][i1] + hilite_dir0[1][j1][i1] + hilite_dir0[2][j1][i1]); if (Yhi < 2.f) { - float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir0[0][j1][i1] * Yhi) + + const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir0[0][j1][i1] * Yhi) + SQR(rgb_blend[1] - hilite_dir0[1][j1][i1] * Yhi) + - SQR(rgb_blend[2] - hilite_dir0[2][j1][i1] * Yhi))); - totwt = dirwt; - dirwt /= (hilite_dir0[3][j1][i1] + epsilon); + SQR(rgb_blend[2] - hilite_dir0[2][j1][i1] * Yhi))) * (hilite_dir0[3][j1][i1] + epsilon)); + totwt = true; clipfix[0] = dirwt * hilite_dir0[0][j1][i1]; clipfix[1] = dirwt * hilite_dir0[1][j1][i1]; clipfix[2] = dirwt * hilite_dir0[2][j1][i1]; } for (int dir = 0; dir < 2; dir++) { - float Yhi = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); + const float Yhi = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); if (Yhi < 2.f) { - float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi) + + const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi) + SQR(rgb_blend[1] - hilite_dir[dir * 4 + 1][i1][j1] * Yhi) + - SQR(rgb_blend[2] - hilite_dir[dir * 4 + 2][i1][j1] * Yhi))); - totwt += dirwt; - dirwt /= (hilite_dir[dir * 4 + 3][i1][j1] + epsilon); + SQR(rgb_blend[2] - hilite_dir[dir * 4 + 2][i1][j1] * Yhi))) * (hilite_dir[dir * 4 + 3][i1][j1] + epsilon)); + totwt = true; clipfix[0] += dirwt * hilite_dir[dir * 4 + 0][i1][j1]; clipfix[1] += dirwt * hilite_dir[dir * 4 + 1][i1][j1]; clipfix[2] += dirwt * hilite_dir[dir * 4 + 2][i1][j1]; @@ -1060,56 +1057,51 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b Yhi = 1.f / (hilite_dir4[0][j1][i1] + hilite_dir4[1][j1][i1] + hilite_dir4[2][j1][i1]); if (Yhi < 2.f) { - float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir4[0][j1][i1] * Yhi) + + const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir4[0][j1][i1] * Yhi) + SQR(rgb_blend[1] - hilite_dir4[1][j1][i1] * Yhi) + - SQR(rgb_blend[2] - hilite_dir4[2][j1][i1] * Yhi))); - totwt += dirwt; - dirwt /= (hilite_dir4[3][j1][i1] + epsilon); + SQR(rgb_blend[2] - hilite_dir4[2][j1][i1] * Yhi))) * (hilite_dir4[3][j1][i1] + epsilon)); + totwt = true; clipfix[0] += dirwt * hilite_dir4[0][j1][i1]; clipfix[1] += dirwt * hilite_dir4[1][j1][i1]; clipfix[2] += dirwt * hilite_dir4[2][j1][i1]; } - if(totwt == 0.f) { + if (UNLIKELY(!totwt)) { continue; } - clipfix[0] /= totwt; - clipfix[1] /= totwt; - clipfix[2] /= totwt; - //now correct clipped channels if (pixel[0] > max_f[0] && pixel[1] > max_f[1] && pixel[2] > max_f[2]) { //all channels clipped - float Y = (0.299 * clipfix[0] + 0.587 * clipfix[1] + 0.114 * clipfix[2]); + const float Y = 0.299f * clipfix[0] + 0.587f * clipfix[1] + 0.114f * clipfix[2]; - float factor = whitept / Y; + const float factor = whitept / Y; red[i + miny][j + minx] = clipfix[0] * factor; green[i + miny][j + minx] = clipfix[1] * factor; blue[i + miny][j + minx] = clipfix[2] * factor; } else {//some channels clipped - float notclipped[3] = {pixel[0] <= max_f[0] ? 1.f : 0.f, pixel[1] <= max_f[1] ? 1.f : 0.f, pixel[2] <= max_f[2] ? 1.f : 0.f}; + const float notclipped[3] = {pixel[0] <= max_f[0] ? 1.f : 0.f, pixel[1] <= max_f[1] ? 1.f : 0.f, pixel[2] <= max_f[2] ? 1.f : 0.f}; if (notclipped[0] == 0.f) { //red clipped - red[i + miny][j + minx] = max(red[i + miny][j + minx], (clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / - (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2] + epsilon)))); + red[i + miny][j + minx] = max(pixel[0], clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / + (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2] + epsilon))); } if (notclipped[1] == 0.f) { //green clipped - green[i + miny][j + minx] = max(green[i + miny][j + minx], (clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / - (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0] + epsilon)))); + green[i + miny][j + minx] = max(pixel[1], clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) / + (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0] + epsilon))); } if (notclipped[2] == 0.f) { //blue clipped - blue[i + miny][j + minx] = max(blue[i + miny][j + minx], (clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / - (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1] + epsilon)))); + blue[i + miny][j + minx] = max(pixel[2], clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) / + (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1] + epsilon))); } } - Y = (0.299 * red[i + miny][j + minx] + 0.587 * green[i + miny][j + minx] + 0.114 * blue[i + miny][j + minx]); + Y = 0.299f * red[i + miny][j + minx] + 0.587f * green[i + miny][j + minx] + 0.114f * blue[i + miny][j + minx]; if (Y > whitept) { - float factor = whitept / Y; + const float factor = whitept / Y; red[i + miny][j + minx] *= factor; green[i + miny][j + minx] *= factor; @@ -1117,8 +1109,9 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b } } } +std::cout << "progress : " << progress << std::endl; - if(plistener) { + if (plistener) { plistener->setProgress(1.00); } From 0b1ba37c759a7417a4fa88f5643f8a5466def6b8 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 9 Jul 2019 19:40:08 +0200 Subject: [PATCH 18/23] color propagation: fix segfault whan there is nothing to reconstruct --- rtengine/hilite_recon.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 7fe527a78..15077b92a 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -406,6 +406,10 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } + if (minx > maxx || miny > maxy) { // nothing to reconstruct + return; + } + if (plistener) { progress += 0.05; plistener->setProgress(progress); From 3f9c232f18b172367e2e43501a1db18ff24513dc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Tue, 9 Jul 2019 23:15:38 +0200 Subject: [PATCH 19/23] hilite_recon.cc --- rtengine/hilite_recon.cc | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 15077b92a..a0a8cb83d 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -3,9 +3,11 @@ // Highlight reconstruction // // copyright (c) 2008-2011 Emil Martinec +// copyright (c) 2019 Ingo Weyrich // // // code dated: June 16, 2011 +// code dated: July 09. 2019, speedups by Ingo Weyrich // // hilite_recon.cc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -424,16 +426,6 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu const int blurHeight = maxy - miny + 1; const int bufferWidth = blurWidth + ((16 - (blurWidth % 16)) & 15); - std::cout << "minx : " << minx << std::endl; - std::cout << "maxx : " << maxx << std::endl; - std::cout << "miny : " << miny << std::endl; - std::cout << "maxy : " << maxy << std::endl; - - std::cout << "blurWidth : " << blurWidth << std::endl; - std::cout << "bufferWidth : " << bufferWidth << std::endl; - - std::cout << "Corrected area reduced by factor: " << (((float)width * height) / (bufferWidth * blurHeight)) << std::endl; - std::cout << "Peak memory usage reduced from ~" << (30ul * ((size_t)width * (size_t)height)) / (1024*1024) << " Mb to ~" << (30ul * ((size_t)bufferWidth * (size_t)blurHeight)) / (1024*1024) << " Mb" << std::endl; multi_array2D channelblur(bufferWidth, blurHeight, 0, 48); array2D temp(bufferWidth, blurHeight); // allocate temporary buffer @@ -929,7 +921,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // now reconstruct clipped channels using color ratios -StopWatch Stop1("last loop"); + #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif @@ -1113,7 +1105,6 @@ StopWatch Stop1("last loop"); } } } -std::cout << "progress : " << progress << std::endl; if (plistener) { plistener->setProgress(1.00); From 856b437983bbf26dea19a2f92989d898488715ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 10 Jul 2019 13:16:03 +0200 Subject: [PATCH 20/23] Some minor code cleanups --- rtengine/hilite_recon.cc | 423 ++++++++++++++++++++------------------- 1 file changed, 221 insertions(+), 202 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index a0a8cb83d..c6c540e10 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -7,7 +7,7 @@ // // // code dated: June 16, 2011 -// code dated: July 09. 2019, speedups by Ingo Weyrich +// code dated: July 09, 2019, speedups by Ingo Weyrich // // hilite_recon.cc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,17 +25,20 @@ //////////////////////////////////////////////////////////////// #include - -#include #include +#include + #include "array2D.h" +#include "opthelper.h" #include "rawimagesource.h" #include "rt_math.h" -#include "opthelper.h" + #define BENCHMARK #include "StopWatch.h" -namespace { +namespace +{ + void boxblur2(const float* const* src, float** dst, float** temp, int startY, int startX, int H, int W, int bufferW, int box) { constexpr int numCols = 16; @@ -46,27 +49,24 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in #ifdef _OPENMP #pragma omp parallel for #endif - - for (int row = 0; row < H; row++) { + for (int row = 0; row < H; ++row) { int len = box + 1; temp[row][0] = src[row + startY][startX] / len; - for (int j = 1; j <= box; j++) { + for (int j = 1; j <= box; ++j) { temp[row][0] += src[row + startY][j + startX] / len; } - for (int col = 1; col <= box; col++) { + for (int col = 1; col <= box; ++col, ++len) { temp[row][col] = (temp[row][col - 1] * len + src[row + startY][col + box + startX]) / (len + 1); - len ++; } - for (int col = box + 1; col < W - box; col++) { + for (int col = box + 1; col < W - box; ++col) { temp[row][col] = temp[row][col - 1] + (src[row + startY][col + box + startX] - src[row + startY][col - box - 1 + startX]) / len; } - for (int col = W - box; col < W; col++) { + for (int col = W - box; col < W; ++col, --len) { temp[row][col] = (temp[row][col - 1] * len - src[row + startY][col - box - 1 + startX]) / (len - 1); - len --; } } @@ -81,45 +81,50 @@ void boxblur2(const float* const* src, float** dst, float** temp, int startY, in #endif for (int col = 0; col < bufferW - numCols + 1; col += numCols) { float len = box + 1; - for (int n = 0; n < numCols; n++) { + + for (int n = 0; n < numCols; ++n) { tempvalN[n] = temp[0][col + n] / len; } - for (int i = 1; i <= box; i++) { - for (int n = 0; n < numCols; n++) { + + for (int i = 1; i <= box; ++i) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] += temp[i][col + n] / len; } } - for (int n = 0; n < numCols; n++) { + + for (int n = 0; n < numCols; ++n) { dst[0][col + n] = tempvalN[n]; } - for (int row = 1; row <= box; row++) { - for (int n = 0; n < numCols; n++) { + + for (int row = 1; row <= box; ++row, ++len) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1); dst[row][col + n] = tempvalN[n]; } - len ++; - } - const float rlen = 1.f / len; - for (int row = box + 1; row < H - box; row++) { - for (int n = 0; n < numCols; n++) { - tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; - dst[row][col + n] = tempvalN[n]; - } } - for (int row = H - box; row < H; row++) { - for (int n = 0; n < numCols; n++) { + const float rlen = 1.f / len; + + for (int row = box + 1; row < H - box; ++row) { + for (int n = 0; n < numCols; ++n) { + tempvalN[n] += (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; + dst[row][col + n] = tempvalN[n]; + } + } + + for (int row = H - box; row < H; ++row, --len) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] = (dst[(row - 1)][col + n] * len - temp[(row - box - 1)][col + n]) / (len - 1); dst[row][col + n] = tempvalN[n]; } - len --; } } } } -void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, int W, int box, int samp ) +void boxblur_resamp(const float* const* src, float** dst, float** temp, int H, int W, int box, int samp) { + assert(samp != 0); #ifdef _OPENMP #pragma omp parallel @@ -128,33 +133,29 @@ void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, #ifdef _OPENMP #pragma omp for #endif - //box blur image channel; box size = 2*box+1 //horizontal blur - for (int row = 0; row < H; row++) - { + for (int row = 0; row < H; ++row) { int len = box + 1; float tempval = src[row][0] / len; - for (int j = 1; j <= box; j++) { + for (int j = 1; j <= box; ++j) { tempval += src[row][j] / len; } temp[row][0] = tempval; - for (int col = 1; col <= box; col++) { + for (int col = 1; col <= box; ++col, ++len) { tempval = (tempval * len + src[row][col + box]) / (len + 1); if (col % samp == 0) { temp[row][col / samp] = tempval; } - - len ++; } - float oneByLen = 1.f / (float)len; + const float oneByLen = 1.f / static_cast(len); - for (int col = box + 1; col < W - box; col++) { + for (int col = box + 1; col < W - box; ++col) { tempval = tempval + (src[row][col + box] - src[row][col - box - 1]) * oneByLen; if (col % samp == 0) { @@ -162,84 +163,81 @@ void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, } } - for (int col = W - box; col < W; col++) { + for (int col = W - box; col < W; ++col, --len) { tempval = (tempval * len - src[row][col - box - 1]) / (len - 1); if (col % samp == 0) { temp[row][col / samp] = tempval; } - - len --; } } } constexpr int numCols = 8; // process numCols columns at once for better L1 CPU cache usage + #ifdef _OPENMP #pragma omp parallel #endif { float tempvalN[numCols] ALIGNED64; + #ifdef _OPENMP #pragma omp for nowait #endif - //vertical blur for (int col = 0; col < (W / samp) - (numCols - 1); col += numCols) { float len = box + 1; - for (int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] = temp[0][col + n] / len; } - for (int i = 1; i <= box; i++) { - for (int n = 0; n < numCols; n++) { + for (int i = 1; i <= box; ++i) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] += temp[i][col + n] / len; } } - for (int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; ++n) { dst[0][col + n] = tempvalN[n]; } - for (int row = 1; row <= box; row++) { - for (int n = 0; n < numCols; n++) { + for (int row = 1; row <= box; ++row, ++len) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1); } if (row % samp == 0) { - for (int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; ++n) { dst[row / samp][col + n] = tempvalN[n]; } } - - len ++; } + const float rlen = 1.f / len; - for (int row = box + 1; row < H - box; row++) { - for (int n = 0; n < numCols; n++) { - tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; + + for (int row = box + 1; row < H - box; ++row) { + for (int n = 0; n < numCols; ++n) { + tempvalN[n] += (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) * rlen; } if (row % samp == 0) { - for (int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; ++n) { dst[row / samp][col + n] = tempvalN[n]; } } } - for (int row = H - box; row < H; row++) { - for (int n = 0; n < numCols; n++) { + for (int row = H - box; row < H; ++row, --len) { + for (int n = 0; n < numCols; ++n) { tempvalN[n] = (tempvalN[n] * len - temp[(row - box - 1)][col + n]) / (len - 1); } if (row % samp == 0) { - for (int n = 0; n < numCols; n++) { + for (int n = 0; n < numCols; ++n) { dst[row / samp][col + n] = tempvalN[n]; } } - - len --; } } @@ -250,42 +248,38 @@ void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, { //vertical blur - for (int col = (W / samp) - ((W / samp) % numCols); col < W / samp; col++) { + for (int col = (W / samp) - ((W / samp) % numCols); col < W / samp; ++col) { int len = box + 1; float tempval = temp[0][col] / len; - for (int i = 1; i <= box; i++) { + for (int i = 1; i <= box; ++i) { tempval += temp[i][col] / len; } dst[0][col] = tempval; - for (int row = 1; row <= box; row++) { + for (int row = 1; row <= box; ++row, ++len) { tempval = (tempval * len + temp[(row + box)][col]) / (len + 1); if (row % samp == 0) { dst[row / samp][col] = tempval; } - - len ++; } - for (int row = box + 1; row < H - box; row++) { - tempval = tempval + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len; + for (int row = box + 1; row < H - box; ++row) { + tempval += (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len; if (row % samp == 0) { dst[row / samp][col] = tempval; } } - for (int row = H - box; row < H; row++) { + for (int row = H - box; row < H; ++row, --len) { tempval = (tempval * len - temp[(row - box - 1)][col]) / (len - 1); if (row % samp == 0) { dst[row / samp][col] = tempval; } - - len --; } } } @@ -293,20 +287,20 @@ void boxblur_resamp(const float * const *src, float **dst, float ** temp, int H, } } + namespace rtengine { extern const Settings* settings; - -void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blue) +void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue) { BENCHFUN double progress = 0.0; if (plistener) { - plistener->setProgressStr ("PROGRESSBAR_HLREC"); - plistener->setProgress (progress); + plistener->setProgressStr("PROGRESSBAR_HLREC"); + plistener->setProgress(progress); } const int height = H; @@ -321,29 +315,35 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu //%%%%%%%%%%%%%%%%%%%% //for blend algorithm: constexpr float blendthresh = 1.0; - constexpr int ColorCount = 3; // Transform matrixes rgb>lab and back - constexpr float trans[ColorCount][ColorCount] = - { { 1.f, 1.f, 1.f }, { 1.7320508f, -1.7320508f, 0.f }, { -1.f, -1.f, 2.f } }; - constexpr float itrans[ColorCount][ColorCount] = - { { 1.f, 0.8660254f, -0.5f }, { 1.f, -0.8660254f, -0.5f }, { 1.f, 0.f, 1.f } }; + constexpr float trans[3][3] = { + {1.f, 1.f, 1.f}, + {1.7320508f, -1.7320508f, 0.f}, + {-1.f, -1.f, 2.f} + }; + constexpr float itrans[3][3] = { + {1.f, 0.8660254f, -0.5f}, + {1.f, -0.8660254f, -0.5f}, + {1.f, 0.f, 1.f} + }; - if (settings->verbose) - for (int c = 0; c < 3; c++) { + if (settings->verbose) { + for (int c = 0; c < 3; ++c) { printf("chmax[%d] : %f\tclmax[%d] : %f\tratio[%d] : %f\n", c, chmax[c], c, clmax[c], c, chmax[c] / clmax[c]); } + } float factor[3]; - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { factor[c] = chmax[c] / clmax[c]; } - float minFactor = min(factor[0], factor[1], factor[2]); + const float minFactor = min(factor[0], factor[1], factor[2]); if (minFactor > 1.f) { // all 3 channels clipped // calculate clip factor per channel - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { factor[c] /= minFactor; } @@ -351,7 +351,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu int maxpos = 0; float maxValNew = 0.f; - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { if (chmax[c] / factor[c] > maxValNew) { maxValNew = chmax[c] / factor[c]; maxpos = c; @@ -360,24 +360,26 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu const float clipFactor = clmax[maxpos] / maxValNew; - if (clipFactor < maxpct) - + if (clipFactor < maxpct) { // if max clipFactor < maxpct (0.95) adjust per channel factors - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { factor[c] *= (maxpct / clipFactor); } + } } else { factor[0] = factor[1] = factor[2] = 1.f; } - if (settings->verbose) - for (int c = 0; c < ColorCount; c++) { + if (settings->verbose) { + for (int c = 0; c < 3; ++c) { printf("correction factor[%d] : %f\n", c, factor[c]); } + } - float max_f[3], thresh[3]; + float max_f[3]; + float thresh[3]; - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { thresh[c] = chmax[c] * threshpct / factor[c]; max_f[c] = chmax[c] * maxpct / factor[c]; } @@ -386,11 +388,13 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu const float clippt = min(max_f[0], max_f[1], max_f[2]); const float medpt = max_f[0] + max_f[1] + max_f[2] - whitept - clippt; const float blendpt = blendthresh * clippt; + float medFactor[3]; - for (int c = 0; c < ColorCount; c++) { - medFactor[c] = max(1.0f, max_f[c] / medpt) / (-blendpt); + for (int c = 0; c < 3; ++c) { + medFactor[c] = max(1.0f, max_f[c] / medpt) / -blendpt; } + int minx = width - 1; int maxx = 0; int miny = height - 1; @@ -456,13 +460,13 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp parallel for #endif - - for (int i = 0; i < blurHeight; i++) - for (int j = 0; j < blurWidth; j++) { + for (int i = 0; i < blurHeight; ++i) { + for (int j = 0; j < blurWidth; ++j) { channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i + miny][j + minx]) + fabsf(channelblur[1][i][j] - green[i + miny][j + minx]) + fabsf(channelblur[2][i][j] - blue[i + miny][j + minx]); } + } - for (int c = 1; c < 3; c++) { + for (int c = 1; c < 3; ++c) { channelblur[c].free(); //free up some memory } @@ -478,31 +482,36 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu plistener->setProgress(progress); } - double hipass_sum = 0.f; + double hipass_sum = 0.0; int hipass_norm = 0; // set up which pixels are clipped or near clipping #ifdef _OPENMP #pragma omp parallel for reduction(+:hipass_sum,hipass_norm) schedule(dynamic,16) #endif - - for (int i = 0; i < blurHeight; i++) { - for (int j = 0; j < blurWidth; j++) { - //if one or more channels is highlight but none are blown, add to highlight accumulator - if ((red[i + miny][j + minx] > thresh[0] || green[i + miny][j + minx] > thresh[1] || blue[i + miny][j + minx] > thresh[2]) && - (red[i + miny][j + minx] < max_f[0] && green[i + miny][j + minx] < max_f[1] && blue[i + miny][j + minx] < max_f[2])) { - + for (int i = 0; i < blurHeight; ++i) { + for (int j = 0; j < blurWidth; ++j) { + if ( + ( + red[i + miny][j + minx] > thresh[0] + || green[i + miny][j + minx] > thresh[1] + || blue[i + miny][j + minx] > thresh[2] + ) + && red[i + miny][j + minx] < max_f[0] + && green[i + miny][j + minx] < max_f[1] + && blue[i + miny][j + minx] < max_f[2] + ) { + // if one or more channels is highlight but none are blown, add to highlight accumulator hipass_sum += channelblur[0][i][j]; - hipass_norm ++; + ++hipass_norm; hilite_full[0][i][j] = red[i + miny][j + minx]; hilite_full[1][i][j] = green[i + miny][j + minx]; hilite_full[2][i][j] = blue[i + miny][j + minx]; hilite_full[3][i][j] = 1.f; - } } - }//end of filling highlight array + } const float hipass_ave = 2.f * hipass_sum / (hipass_norm + epsilon); @@ -526,9 +535,8 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif - - for (int i = 0; i < blurHeight; i++) { - for (int j = 0; j < blurWidth; j++) { + for (int i = 0; i < blurHeight; ++i) { + for (int j = 0; j < blurWidth; ++j) { if (channelblur[0][i][j] > hipass_ave) { //too much variation hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0.f; @@ -545,17 +553,17 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu channelblur[0].free(); //free up some memory hilite_full4.free(); //free up some memory - int hfh = (blurHeight - (blurHeight % pitch)) / pitch; - int hfw = (blurWidth - (blurWidth % pitch)) / pitch; + const int hfh = (blurHeight - blurHeight % pitch) / pitch; + const int hfw = (blurWidth - blurWidth % pitch) / pitch; multi_array2D hilite(hfw + 1, hfh + 1, ARRAY2D_CLEAR_DATA, 48); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // blur and resample highlight data; range=size of blur, pitch=sample spacing - array2D temp2((blurWidth / pitch) + ((blurWidth % pitch) == 0 ? 0 : 1), blurHeight); + array2D temp2(blurWidth / pitch + (blurWidth % pitch == 0 ? 0 : 1), blurHeight); - for (int m = 0; m < 4; m++) { + for (int m = 0; m < 4; ++m) { boxblur_resamp(hilite_full[m], hilite[m], temp2, blurHeight, blurWidth, range, pitch); if (plistener) { @@ -566,7 +574,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu temp2.free(); - for (int c = 0; c < 4; c++) { + for (int c = 0; c < 4; ++c) { hilite_full[c].free(); //free up some memory } @@ -582,8 +590,8 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu //fill gaps in highlight map by directional extension //raster scan from four corners - for (int j = 1; j < hfw - 1; j++) { - for (int i = 2; i < hfh - 2; i++) { + for (int j = 1; j < hfw - 1; ++j) { + for (int i = 2; i < hfh - 2; ++i) { //from left if (hilite[3][i][j] > epsilon) { hilite_dir0[3][j][i] = 1.f; @@ -609,7 +617,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int i = 2; i < hfh - 2; i++) { + for (int i = 2; i < hfh - 2; ++i) { if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir4[3][hfw - 1][i] = hilite_dir0[3][hfw - 2][i]; } @@ -622,10 +630,9 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp for nowait #endif - - for (int c = 0; c < 3; c++) { - for (int j = 1; j < hfw - 1; j++) { - for (int i = 2; i < hfh - 2; i++) { + for (int c = 0; c < 3; ++c) { + for (int j = 1; j < hfw - 1; ++j) { + for (int i = 2; i < hfh - 2; ++i) { //from left if (hilite[3][i][j] > epsilon) { hilite_dir0[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; @@ -652,7 +659,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int i = 2; i < hfh - 2; i++) { + for (int i = 2; i < hfh - 2; ++i) { if (hilite[3][i][hfw - 2] <= epsilon) { hilite_dir4[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i]; } @@ -663,8 +670,8 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #pragma omp single #endif { - for (int j = hfw - 2; j > 0; j--) { - for (int i = 2; i < hfh - 2; i++) { + for (int j = hfw - 2; j > 0; --j) { + for (int i = 2; i < hfh - 2; ++i) { //from right if (hilite[3][i][j] > epsilon) { hilite_dir4[3][j][i] = 1.f; @@ -682,7 +689,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int i = 2; i < hfh - 2; i++) { + for (int i = 2; i < hfh - 2; ++i) { if (hilite[3][i][0] <= epsilon) { hilite_dir[0 + 3][i - 2][0] += hilite_dir4[3][0][i]; hilite_dir[4 + 3][i + 2][0] += hilite_dir4[3][0][i]; @@ -712,10 +719,9 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp for nowait #endif - - for (int c = 0; c < 3; c++) { - for (int j = hfw - 2; j > 0; j--) { - for (int i = 2; i < hfh - 2; i++) { + for (int c = 0; c < 3; ++c) { + for (int j = hfw - 2; j > 0; --j) { + for (int i = 2; i < hfh - 2; ++i) { //from right if (hilite[3][i][j] > epsilon) { hilite_dir4[c][j][i] = hilite[c][i][j] / hilite[3][i][j]; @@ -734,7 +740,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int i = 2; i < hfh - 2; i++) { + for (int i = 2; i < hfh - 2; ++i) { if (hilite[3][i][0] <= epsilon) { hilite_dir[0 + c][i - 2][0] += hilite_dir4[c][0][i]; hilite_dir[4 + c][i + 2][0] += hilite_dir4[c][0][i]; @@ -756,8 +762,8 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #pragma omp single #endif { - for (int i = 1; i < hfh - 1; i++) - for (int j = 2; j < hfw - 2; j++) { + for (int i = 1; i < hfh - 1; ++i) + for (int j = 2; j < hfw - 2; ++j) { //from top if (hilite[3][i][j] > epsilon) { hilite_dir[0 + 3][i][j] = 1.f; @@ -766,7 +772,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int j = 2; j < hfw - 2; j++) { + for (int j = 2; j < hfw - 2; ++j) { if (hilite[3][hfh - 2][j] <= epsilon) { hilite_dir[4 + 3][hfh - 1][j] += hilite_dir[0 + 3][hfh - 2][j]; } @@ -785,10 +791,9 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp for nowait #endif - - for (int c = 0; c < 3; c++) { - for (int i = 1; i < hfh - 1; i++) { - for (int j = 2; j < hfw - 2; j++) { + for (int c = 0; c < 3; ++c) { + for (int i = 1; i < hfh - 1; ++i) { + for (int j = 2; j < hfw - 2; ++j) { //from top if (hilite[3][i][j] > epsilon) { hilite_dir[0 + c][i][j] = hilite[c][i][j] / hilite[3][i][j]; @@ -799,7 +804,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int j = 2; j < hfw - 2; j++) { + for (int j = 2; j < hfw - 2; ++j) { if (hilite[3][hfh - 2][j] <= epsilon) { hilite_dir[4 + c][hfh - 1][j] += hilite_dir[0 + c][hfh - 2][j]; } @@ -810,8 +815,8 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp single #endif - for (int i = hfh - 2; i > 0; i--) - for (int j = 2; j < hfw - 2; j++) { + for (int i = hfh - 2; i > 0; --i) { + for (int j = 2; j < hfw - 2; ++j) { //from bottom if (hilite[3][i][j] > epsilon) { hilite_dir[4 + 3][i][j] = 1.f; @@ -820,6 +825,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } } + } if (plistener) { progress += 0.05; @@ -829,10 +835,9 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp parallel for #endif - - for (int c = 0; c < 4; c++) { - for (int i = hfh - 2; i > 0; i--) { - for (int j = 2; j < hfw - 2; j++) { + for (int c = 0; c < 4; ++c) { + for (int i = hfh - 2; i > 0; --i) { + for (int j = 2; j < hfw - 2; ++j) { //from bottom if (hilite[3][i][j] > epsilon) { hilite_dir[4 + c][i][j] = hilite[c][i][j] / hilite[3][i][j]; @@ -850,20 +855,22 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } //fill in edges - for (int dir = 0; dir < 2; dir++) { - for (int i = 1; i < hfh - 1; i++) - for (int c = 0; c < 4; c++) { + for (int dir = 0; dir < 2; ++dir) { + for (int i = 1; i < hfh - 1; ++i) { + for (int c = 0; c < 4; ++c) { hilite_dir[dir * 4 + c][i][0] = hilite_dir[dir * 4 + c][i][1]; hilite_dir[dir * 4 + c][i][hfw - 1] = hilite_dir[dir * 4 + c][i][hfw - 2]; } + } - for (int j = 1; j < hfw - 1; j++) - for (int c = 0; c < 4; c++) { + for (int j = 1; j < hfw - 1; ++j) { + for (int c = 0; c < 4; ++c) { hilite_dir[dir * 4 + c][0][j] = hilite_dir[dir * 4 + c][1][j]; hilite_dir[dir * 4 + c][hfh - 1][j] = hilite_dir[dir * 4 + c][hfh - 2][j]; } + } - for (int c = 0; c < 4; c++) { + for (int c = 0; c < 4; ++c) { hilite_dir[dir * 4 + c][0][0] = hilite_dir[dir * 4 + c][1][0] = hilite_dir[dir * 4 + c][0][1] = hilite_dir[dir * 4 + c][1][1] = hilite_dir[dir * 4 + c][2][2]; hilite_dir[dir * 4 + c][0][hfw - 1] = hilite_dir[dir * 4 + c][1][hfw - 1] = hilite_dir[dir * 4 + c][0][hfw - 2] = hilite_dir[dir * 4 + c][1][hfw - 2] = hilite_dir[dir * 4 + c][2][hfw - 3]; hilite_dir[dir * 4 + c][hfh - 1][0] = hilite_dir[dir * 4 + c][hfh - 2][0] = hilite_dir[dir * 4 + c][hfh - 1][1] = hilite_dir[dir * 4 + c][hfh - 2][1] = hilite_dir[dir * 4 + c][hfh - 3][2]; @@ -871,38 +878,42 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } } - for (int i = 1; i < hfh - 1; i++) - for (int c = 0; c < 4; c++) { + for (int i = 1; i < hfh - 1; ++i) { + for (int c = 0; c < 4; ++c) { hilite_dir0[c][0][i] = hilite_dir0[c][1][i]; hilite_dir0[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i]; } + } - for (int j = 1; j < hfw - 1; j++) - for (int c = 0; c < 4; c++) { + for (int j = 1; j < hfw - 1; ++j) { + for (int c = 0; c < 4; ++c) { hilite_dir0[c][j][0] = hilite_dir0[c][j][1]; hilite_dir0[c][j][hfh - 1] = hilite_dir0[c][j][hfh - 2]; } + } - for (int c = 0; c < 4; c++) { + for (int c = 0; c < 4; ++c) { hilite_dir0[c][0][0] = hilite_dir0[c][0][1] = hilite_dir0[c][1][0] = hilite_dir0[c][1][1] = hilite_dir0[c][2][2]; hilite_dir0[c][hfw - 1][0] = hilite_dir0[c][hfw - 1][1] = hilite_dir0[c][hfw - 2][0] = hilite_dir0[c][hfw - 2][1] = hilite_dir0[c][hfw - 3][2]; hilite_dir0[c][0][hfh - 1] = hilite_dir0[c][0][hfh - 2] = hilite_dir0[c][1][hfh - 1] = hilite_dir0[c][1][hfh - 2] = hilite_dir0[c][2][hfh - 3]; hilite_dir0[c][hfw - 1][hfh - 1] = hilite_dir0[c][hfw - 1][hfh - 2] = hilite_dir0[c][hfw - 2][hfh - 1] = hilite_dir0[c][hfw - 2][hfh - 2] = hilite_dir0[c][hfw - 3][hfh - 3]; } - for (int i = 1; i < hfh - 1; i++) - for (int c = 0; c < 4; c++) { + for (int i = 1; i < hfh - 1; ++i) { + for (int c = 0; c < 4; ++c) { hilite_dir4[c][0][i] = hilite_dir4[c][1][i]; hilite_dir4[c][hfw - 1][i] = hilite_dir4[c][hfw - 2][i]; } + } - for (int j = 1; j < hfw - 1; j++) - for (int c = 0; c < 4; c++) { + for (int j = 1; j < hfw - 1; ++j) { + for (int c = 0; c < 4; ++c) { hilite_dir4[c][j][0] = hilite_dir4[c][j][1]; hilite_dir4[c][j][hfh - 1] = hilite_dir4[c][j][hfh - 2]; } + } - for (int c = 0; c < 4; c++) { + for (int c = 0; c < 4; ++c) { hilite_dir4[c][0][0] = hilite_dir4[c][0][1] = hilite_dir4[c][1][0] = hilite_dir4[c][1][1] = hilite_dir4[c][2][2]; hilite_dir4[c][hfw - 1][0] = hilite_dir4[c][hfw - 1][1] = hilite_dir4[c][hfw - 2][0] = hilite_dir4[c][hfw - 2][1] = hilite_dir4[c][hfw - 3][2]; hilite_dir4[c][0][hfh - 1] = hilite_dir4[c][0][hfh - 2] = hilite_dir4[c][1][hfh - 1] = hilite_dir4[c][1][hfh - 2] = hilite_dir4[c][2][hfh - 3]; @@ -915,7 +926,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu } //free up some memory - for (int c = 0; c < 4; c++) { + for (int c = 0; c < 4; ++c) { hilite[c].free(); } @@ -925,47 +936,52 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) #endif + for (int i = 0; i < blurHeight; ++i) { + const int i1 = min((i - i % pitch) / pitch, hfh - 1); - for (int i = 0; i < blurHeight; i++) { - const int i1 = min((i - (i % pitch)) / pitch, hfh - 1); - - for (int j = 0; j < blurWidth; j++) { - - const float pixel[3] = {red[i + miny][j + minx], green[i + miny][j + minx], blue[i + miny][j + minx]}; + for (int j = 0; j < blurWidth; ++j) { + const float pixel[3] = { + red[i + miny][j + minx], + green[i + miny][j + minx], + blue[i + miny][j + minx] + }; if (pixel[0] < max_f[0] && pixel[1] < max_f[1] && pixel[2] < max_f[2]) { continue; //pixel not clipped } - const int j1 = min((j - (j % pitch)) / pitch, hfw - 1); + const int j1 = min((j - j % pitch) / pitch, hfw - 1); //estimate recovered values using modified HLRecovery_blend algorithm - float rgb[ColorCount], rgb_blend[ColorCount] = {}, cam[2][ColorCount], lab[2][ColorCount], sum[2]; - - // Copy input pixel to rgb so it's easier to access in loops - rgb[0] = pixel[0]; - rgb[1] = pixel[1]; - rgb[2] = pixel[2]; + float rgb[3] = { + pixel[0], + pixel[1], + pixel[2] + };// Copy input pixel to rgb so it's easier to access in loops + float rgb_blend[3] = {}; + float cam[2][3]; + float lab[2][3]; + float sum[2]; // Initialize cam with raw input [0] and potentially clipped input [1] - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { cam[0][c] = rgb[c]; cam[1][c] = min(cam[0][c], clippt); } // Calculate the lightness correction ratio (chratio) - for (int i2 = 0; i2 < 2; i2++) { - for (int c = 0; c < ColorCount; c++) { + for (int i2 = 0; i2 < 2; ++i2) { + for (int c = 0; c < 3; ++c) { lab[i2][c] = 0; - for (int j = 0; j < ColorCount; j++) { + for (int j = 0; j < 3; ++j) { lab[i2][c] += trans[c][j] * cam[i2][j]; } } sum[i2] = 0.f; - for (int c = 1; c < ColorCount; c++) { + for (int c = 1; c < 3; ++c) { sum[i2] += SQR(lab[i2][c]); } } @@ -976,36 +992,36 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu const float chratio = sqrtf(sum[1] / sum[0]); // Apply ratio to lightness in lab space - for (int c = 1; c < ColorCount; c++) { + for (int c = 1; c < 3; ++c) { lab[0][c] *= chratio; } // Transform back from lab to RGB - for (int c = 0; c < ColorCount; c++) { - cam[0][c] = 0; + for (int c = 0; c < 3; ++c) { + cam[0][c] = 0.f; - for (int j = 0; j < ColorCount; j++) { + for (int j = 0; j < 3; ++j) { cam[0][c] += itrans[c][j] * lab[0][j]; } } - for (int c = 0; c < ColorCount; c++) { - rgb[c] = cam[0][c] / ColorCount; + for (int c = 0; c < 3; ++c) { + rgb[c] = cam[0][c] / 3; } // Copy converted pixel back if (pixel[0] > blendpt) { - const float rfrac = max(0.f, min(1.f, medFactor[0] * (pixel[0] - blendpt))); + const float rfrac = LIM01(medFactor[0] * (pixel[0] - blendpt)); rgb_blend[0] = rfrac * rgb[0] + (1.f - rfrac) * pixel[0]; } if (pixel[1] > blendpt) { - const float gfrac = max(0.f, min(1.f, medFactor[1] * (pixel[1] - blendpt))); + const float gfrac = LIM01(medFactor[1] * (pixel[1] - blendpt)); rgb_blend[1] = gfrac * rgb[1] + (1.f - gfrac) * pixel[1]; } if (pixel[2] > blendpt) { - const float bfrac = max(0.f, min(1.f, medFactor[2] * (pixel[2] - blendpt))); + const float bfrac = LIM01(medFactor[2] * (pixel[2] - blendpt)); rgb_blend[2] = bfrac * rgb[2] + (1.f - bfrac) * pixel[2]; } @@ -1019,7 +1035,7 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu float Y = epsilon + rgb_blend[0] + rgb_blend[1] + rgb_blend[2]; - for (int c = 0; c < ColorCount; c++) { + for (int c = 0; c < 3; ++c) { rgb_blend[c] /= Y; } @@ -1035,13 +1051,13 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu clipfix[2] = dirwt * hilite_dir0[2][j1][i1]; } - for (int dir = 0; dir < 2; dir++) { - const float Yhi = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); + for (int dir = 0; dir < 2; ++dir) { + const float Yhi2 = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]); - if (Yhi < 2.f) { - const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi) + - SQR(rgb_blend[1] - hilite_dir[dir * 4 + 1][i1][j1] * Yhi) + - SQR(rgb_blend[2] - hilite_dir[dir * 4 + 2][i1][j1] * Yhi))) * (hilite_dir[dir * 4 + 3][i1][j1] + epsilon)); + if (Yhi2 < 2.f) { + const float dirwt = 1.f / ((1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi2) + + SQR(rgb_blend[1] - hilite_dir[dir * 4 + 1][i1][j1] * Yhi2) + + SQR(rgb_blend[2] - hilite_dir[dir * 4 + 2][i1][j1] * Yhi2))) * (hilite_dir[dir * 4 + 3][i1][j1] + epsilon)); totwt = true; clipfix[0] += dirwt * hilite_dir[dir * 4 + 0][i1][j1]; clipfix[1] += dirwt * hilite_dir[dir * 4 + 1][i1][j1]; @@ -1076,7 +1092,11 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu green[i + miny][j + minx] = clipfix[1] * factor; blue[i + miny][j + minx] = clipfix[2] * factor; } else {//some channels clipped - const float notclipped[3] = {pixel[0] <= max_f[0] ? 1.f : 0.f, pixel[1] <= max_f[1] ? 1.f : 0.f, pixel[2] <= max_f[2] ? 1.f : 0.f}; + const float notclipped[3] = { + pixel[0] <= max_f[0] ? 1.f : 0.f, + pixel[1] <= max_f[1] ? 1.f : 0.f, + pixel[2] <= max_f[2] ? 1.f : 0.f + }; if (notclipped[0] == 0.f) { //red clipped red[i + miny][j + minx] = max(pixel[0], clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) / @@ -1112,6 +1132,5 @@ void RawImageSource::HLRecovery_inpaint (float** red, float** green, float** blu }// end of HLReconstruction - } From 494aa99323086517a40e1618d7dc76eb46d890ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 12 Jul 2019 08:10:30 +0200 Subject: [PATCH 21/23] Fix missing include guards --- rtengine/dfmanager.h | 10 +++++++--- rtengine/ffmanager.h | 10 +++++++--- rtengine/iccjpeg.h | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h index 2e55c3c22..541981492 100644 --- a/rtengine/dfmanager.h +++ b/rtengine/dfmanager.h @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include -#include +#pragma once + #include +#include +#include + +#include + #include "pixelsmap.h" #include "rawimage.h" diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h index 9068216ef..43fb2f368 100644 --- a/rtengine/ffmanager.h +++ b/rtengine/ffmanager.h @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include -#include +#pragma once + #include +#include +#include + +#include + #include "rawimage.h" namespace rtengine diff --git a/rtengine/iccjpeg.h b/rtengine/iccjpeg.h index ce715948d..5197d1602 100644 --- a/rtengine/iccjpeg.h +++ b/rtengine/iccjpeg.h @@ -15,6 +15,7 @@ * with ICC profiles exceeding 64K bytes in size. See iccprofile.c * for details. */ +#pragma once #include /* needed to define "FILE", "NULL" */ #include "jpeglib.h" From 7257aee2351a71e768ab3cb4b94f75952ec181f5 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 12 Jul 2019 12:56:47 +0200 Subject: [PATCH 22/23] DCPStore: use std::string instead of slow Glib::ustring --- rtengine/dcp.cc | 28 +++++++++++----------------- rtengine/dcp.h | 4 ++-- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 1c99b682c..56855b604 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -1833,8 +1833,7 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) && lastdot <= sname.size() - 4 && !sname.casefold().compare(lastdot, 4, ".dcp") ) { - const Glib::ustring cam_short_name = sname.substr(0, lastdot).uppercase(); - file_std_profiles[cam_short_name] = fname; // They will be loaded and cached on demand + file_std_profiles[sname.substr(0, lastdot).casefold_collate_key()] = fname; // They will be loaded and cached on demand } } else { // Directory @@ -1845,11 +1844,10 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) for (const auto& alias : getAliases(rt_profile_dir)) { const Glib::ustring alias_name = Glib::ustring(alias.first).uppercase(); - const Glib::ustring real_name = Glib::ustring(alias.second).uppercase(); - const std::map::const_iterator real = file_std_profiles.find(real_name); + const std::map::const_iterator real = file_std_profiles.find(Glib::ustring(alias.second).casefold_collate_key()); if (real != file_std_profiles.end()) { - file_std_profiles[alias_name] = real->second; + file_std_profiles[alias_name.casefold_collate_key()] = real->second; } } } @@ -1871,19 +1869,19 @@ bool DCPStore::isValidDCPFileName(const Glib::ustring& filename) const DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const { + const auto key = filename.casefold_collate_key(); MyMutex::MyLock lock(mutex); + const std::map::const_iterator iter = profile_cache.find(key); - const std::map::iterator r = profile_cache.find(filename); - - if (r != profile_cache.end()) { - return r->second; + if (iter != profile_cache.end()) { + return iter->second; } DCPProfile* const res = new DCPProfile(filename); if (res->isValid()) { // Add profile - profile_cache[filename] = res; + profile_cache[key] = res; if (options.rtSettings.verbose) { printf("DCP profile '%s' loaded from disk\n", filename.c_str()); } @@ -1896,13 +1894,9 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const DCPProfile* DCPStore::getStdProfile(const Glib::ustring& requested_cam_short_name) const { - const Glib::ustring name = requested_cam_short_name.uppercase(); - - // Warning: do NOT use map.find(), since it does not seem to work reliably here - for (const auto& file_std_profile : file_std_profiles) { - if (file_std_profile.first == name) { - return getProfile(file_std_profile.second); - } + const std::map::const_iterator iter = file_std_profiles.find(requested_cam_short_name.casefold_collate_key()); + if (iter != file_std_profiles.end()) { + return getProfile(iter->second); } // profile not found, looking if we're in loadAll=false mode diff --git a/rtengine/dcp.h b/rtengine/dcp.h index dc6915d26..48b881661 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -169,10 +169,10 @@ private: std::vector profileDir; // these contain standard profiles from RT. keys are all in uppercase, file path is value - std::map file_std_profiles; + std::map file_std_profiles; // Maps file name to profile as cache - mutable std::map profile_cache; + mutable std::map profile_cache; }; } From d1c9a5f989629700f3fefa8aeb872f3cafbb54cc Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Fri, 12 Jul 2019 13:46:45 +0200 Subject: [PATCH 23/23] Removed timing code --- rtengine/hilite_recon.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index c6c540e10..b0a7e6229 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -33,9 +33,6 @@ #include "rawimagesource.h" #include "rt_math.h" -#define BENCHMARK -#include "StopWatch.h" - namespace { @@ -295,7 +292,6 @@ extern const Settings* settings; void RawImageSource::HLRecovery_inpaint(float** red, float** green, float** blue) { - BENCHFUN double progress = 0.0; if (plistener) {