diff --git a/LICENSE.txt b/LICENSE.txt
index 0aa0df7c8..653f0ac50 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -13,7 +13,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program. If not, see .
+ along with this program. If not, see .
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
diff --git a/README.md b/README.md
index 6d2c04875..ae9efd9c8 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,41 @@
-
+
-RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](http://www.gtk.org/) front-end. It uses a patched version of [dcraw](http://www.cybercom.net/~dcoffin/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
+RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](https://www.gtk.org) front-end. It uses a patched version of [dcraw](https://www.dechifro.org/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
-## Target audience
+## Target Audience
-RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
+RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](https://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
-Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
+Professionals may use RawTherapee as well while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
## Links
Website:
-http://rawtherapee.com/
+https://www.rawtherapee.com/
Forum:
https://discuss.pixls.us/c/software/rawtherapee
Features:
-http://rawpedia.rawtherapee.com/Features
+https://rawpedia.rawtherapee.com/Features
-Official documentation:
-http://rawpedia.rawtherapee.com/
+Documentation:
+https://rawpedia.rawtherapee.com/
Download RawTherapee:
-http://rawtherapee.com/downloads
+https://www.rawtherapee.com/downloads
Download source code tarballs:
-http://rawtherapee.com/shared/source/
+https://www.rawtherapee.com/shared/source/
-## Compilation, branches and Git
+## Compilation, Branches and Git
Refer to RawPedia for a detailed explanation of how to get the necessary dependencies and how to compile RawTherapee.
Linux:
-http://rawpedia.rawtherapee.com/Linux
+https://rawpedia.rawtherapee.com/Linux
Windows:
-http://rawpedia.rawtherapee.com/Windows
+https://rawpedia.rawtherapee.com/Windows
macOS:
-http://rawpedia.rawtherapee.com/macOS
+https://rawpedia.rawtherapee.com/macOS
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 17cf14fd6..33a984c1c 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,9 +1,9 @@
-RAWTHERAPEE 5.6-dev RELEASE NOTES
+RAWTHERAPEE 5.7-dev RELEASE NOTES
This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them.
Start by reading the "Getting Started" article on RawPedia:
-http://rawpedia.rawtherapee.com/
+https://rawpedia.rawtherapee.com/
While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that:
- Development versions only had limited testing, so there may be bugs unknown to us.
@@ -26,16 +26,20 @@ In order to use RawTherapee efficiently you should know that:
- All curves support the Shift and Ctrl keys while dragging a point. Shift+drag makes the point snap to a meaningful axis (top, bottom, diagonal, other), while Ctrl+drag makes your mouse movement super-fine for precise point positioning.
- There are many keyboard shortcuts which make working with RawTherapee much faster and give you greater control. Make sure you familiarize yourself with them on RawPedia's "Keyboard Shortcuts" page!
-New features since 5.6:
-TODO.
+New features since 5.7:
+- TODO
NEWS RELEVANT TO PACKAGE MAINTAINERS
+New since 5.7:
+- TODO
+
In general:
-- To get the source code, either clone from git or use the tarball from http://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs.
-- Requires GTK+ version >=3.16, though >=3.22.24 is recommended. GTK+ versions 3.24.2 - 3.24.6 have an issue with missing combobox menu arrows and are to be avoided.
+- To get the source code, either clone from git or use the tarball from https://rawtherapee.com/shared/source/ . Do not use the auto-generated GitHub release tarballs.
+- Requires GTK+ version >=3.16, though >=3.22.24 is recommended.
+- GTK+ versions 3.24.2 - 3.24.6 have an issue where combobox menu scroll-arrows are missing when the combobox list does not fit vertically on the screen. As a result, users would not be able to scroll in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.
- RawTherapee 5 requires GCC-4.9 or higher, or Clang.
- Do not use -ffast-math, it will not make RawTherapee faster but will introduce artifacts.
- Use -O3, it will make RawTherapee faster with no known side-effects.
@@ -52,15 +56,14 @@ See CONTRIBUTING.md
DOCUMENTATION
-http://rawpedia.rawtherapee.com/
-http://rawtherapee.com/blog/documentation
+https://rawpedia.rawtherapee.com/
REPORTING BUGS
If you found a problem, don't keep it to yourself. Read the "How to write useful bug reports" article to get the problem fixed:
-http://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports
+https://rawpedia.rawtherapee.com/How_to_write_useful_bug_reports
@@ -78,8 +81,8 @@ Server: chat.freenode.net
Channel: #rawtherapee
You can use freenode webchat to communicate without installing anything:
-http://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1
-More information here: http://rawpedia.rawtherapee.com/IRC
+https://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1
+More information here: https://rawpedia.rawtherapee.com/IRC
diff --git a/cmake/modules/FindUnalignedMalloc.cmake b/cmake/modules/FindUnalignedMalloc.cmake
index 4ddfb2afc..bce150c14 100644
--- a/cmake/modules/FindUnalignedMalloc.cmake
+++ b/cmake/modules/FindUnalignedMalloc.cmake
@@ -13,7 +13,7 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with RawTherapee. If not, see .
+# along with RawTherapee. If not, see .
include(CheckCXXSourceCompiles)
diff --git a/cmake/modules/FindX87Math.cmake b/cmake/modules/FindX87Math.cmake
index b25ba3292..c079c584b 100644
--- a/cmake/modules/FindX87Math.cmake
+++ b/cmake/modules/FindX87Math.cmake
@@ -13,7 +13,7 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with RawTherapee. If not, see .
+# along with RawTherapee. If not, see .
include(CheckCXXSourceCompiles)
diff --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml
index a53ccbf06..0e5dfef50 100644
--- a/com.rawtherapee.RawTherapee.appdata.xml
+++ b/com.rawtherapee.RawTherapee.appdata.xml
@@ -31,11 +31,12 @@
GPL-3.0+
https://github.com/Beep6581/RawTherapee/issues/new
https://www.paypal.me/rawtherapee
- http://rawpedia.rawtherapee.com/
- http://rawtherapee.com/
+ https://rawpedia.rawtherapee.com/
+ https://www.rawtherapee.com/
https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594
rawtherapee.desktop
+
@@ -47,16 +48,20 @@
+ Color-correcting a drosera rotundifolia in RawTherapee 5.7.
+ https://rawtherapee.com/images/screenshots/rt570_1.jpg
+
+
HDR DNG of a misty morning in the countryside
- http://rawtherapee.com/images/screenshots/rt540_1.jpg
+ https://rawtherapee.com/images/screenshots/rt540_1.jpg
Straight-out-of-camera vs RawTherapee
- http://rawtherapee.com/images/screenshots/rt540_2.jpg
+ https://rawtherapee.com/images/screenshots/rt540_2.jpg
RawTherapee using the Auto-Matched Tone Curve tool
- http://rawtherapee.com/images/screenshots/rt540_3.jpg
+ https://rawtherapee.com/images/screenshots/rt540_3.jpg
contactus@rawtherapee.com
diff --git a/header b/header
index c42b87574..966153c0e 100644
--- a/header
+++ b/header
@@ -14,5 +14,5 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
diff --git a/rtdata/images/svg/splash.svg b/rtdata/images/svg/splash.svg
index 2e46f0e6d..0989bfdb6 100644
--- a/rtdata/images/svg/splash.svg
+++ b/rtdata/images/svg/splash.svg
@@ -15,7 +15,7 @@
viewBox="0 0 146.05 91.545836"
version="1.1"
id="svg783"
- inkscape:version="0.92.2 2405546, 2018-03-11"
+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="splash.svg"
inkscape:export-filename="/tmp/splash.png"
inkscape:export-xdpi="96"
@@ -479,8 +479,8 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="0.93979686"
- inkscape:cx="-66.836581"
+ inkscape:zoom="0.90075514"
+ inkscape:cx="-60.984253"
inkscape:cy="136.82017"
inkscape:document-units="px"
inkscape:current-layer="layer1"
@@ -574,7 +574,7 @@
RawTherapee splash screen
- 2019-02-27
+
Maciej Dworak
@@ -996,7 +996,7 @@
id="tspan595"
x="283.85016"
y="2.2370076"
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 6
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:49.34799576px;line-height:1.25;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px">. 8
Raw
+ id="text191">
+ id="path193" />
+ id="path195" />
+ id="g180">
+ id="text178">
+ d="m 491.97892,49.720543 c 0.35766,-3.779712 0.50216,-7.579331 0.525,-11.374999 3.49046,0.443312 8.13144,-1.363048 10.53958,2.077082 2.06476,3.531904 -0.001,9.387903 -4.57968,9.241667 -2.15889,0.129374 -4.32419,-0.02526 -6.4849,0.05625 z m 3.6,-2.508333 c 5.08666,1.944261 6.57694,-7.524029 1.04583,-6.462496 -1.51765,0.07086 -0.55297,2.611495 -0.92921,3.817997 -0.0389,0.881499 -0.0777,1.762999 -0.11662,2.644499 z"
+ id="path182"
+ inkscape:connector-curvature="0" />
+ d="m 512.24558,47.203876 c 0.52141,4.243467 -6.54348,3.268808 -8.01041,0.668753 -1.60517,-3.045601 0.78554,-7.314219 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58483,1.929793 5.19166,1.42503 z m -5.125,-2.699999 c 1.63658,0.459668 4.34329,-0.405987 1.51633,-1.575 -0.87243,-0.02294 -1.46212,0.769347 -1.51633,1.575 z"
+ id="path184"
+ inkscape:connector-curvature="0" />
+ d="m 515.32058,49.720543 c -0.89608,-2.856903 -1.90527,-5.67603 -2.875,-8.508333 4.00292,-1.488552 4.10167,3.245809 4.90451,5.232714 0.59217,-1.75459 1.25338,-3.486278 1.87049,-5.232714 2.56625,-0.335933 4.13116,-0.124958 2.35362,2.287869 -0.9018,2.070641 -1.83023,4.13055 -2.68695,6.220464 -1.18878,-0.02218 -2.37788,-0.02114 -3.56667,0 z"
+ id="path186"
+ inkscape:connector-curvature="0" />
+ d="m 530.27891,47.203876 c 0.52141,4.243466 -6.54347,3.268809 -8.01041,0.668753 -1.60517,-3.045602 0.78554,-7.314218 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58479,1.929795 5.19166,1.42503 z m -5.12499,-2.699999 c 1.63658,0.45967 4.34327,-0.405989 1.51632,-1.575 -0.87243,-0.02294 -1.46213,0.769344 -1.51632,1.575 z"
+ id="path188"
+ inkscape:connector-curvature="0" />
+ d="m 531.04558,49.71221 c 0.30065,-3.781668 0.47414,-7.574189 0.5667,-11.366666 2.51426,-0.447643 4.06213,-0.083 3.225,2.558333 -0.13223,2.938617 -0.32432,5.874975 -0.37504,8.816666 -1.13879,-0.02585 -2.27775,-0.0128 -3.41666,-0.0083 z"
+ id="path190"
+ inkscape:connector-curvature="0" />
+ d="m 540.25391,40.995543 c 3.01725,-0.298693 5.7229,2.653473 4.72396,5.623958 -1.09074,4.689975 -9.56531,4.40163 -9.89531,-0.591666 -0.42534,-2.962386 2.38271,-5.18724 5.17135,-5.032292 z m -0.0583,2.45 c -4.24412,0.537467 0.25374,7.084332 1.54583,2.45625 0.26905,-1.066587 -0.2405,-2.522332 -1.54583,-2.45625 z"
+ id="path192"
+ inkscape:connector-curvature="0" />
+ d="m 545.04558,53.620543 c 0.35496,-4.053817 0.59136,-8.121391 0.6,-12.191666 2.97411,-0.291852 7.40962,-1.515461 9.14322,1.785934 1.76018,3.142194 -1.08502,8.159132 -4.89322,6.414066 -2.7439,-2.317277 -0.35353,3.728125 -1.92448,3.984374 -0.97516,-0.01651 -1.95042,-0.0079 -2.92552,0.0073 z m 3.84166,-10.066666 c -1.84548,2.987641 2.95745,6.020885 3.12496,1.783333 0.15011,-1.803962 -1.73874,-2.3203 -3.12496,-1.783333 z"
+ id="path194"
+ inkscape:connector-curvature="0" />
+ d="m 555.45391,49.720543 c 0.16034,-2.834333 0.35688,-5.66874 0.38337,-8.508333 1.15151,0.2957 3.7136,-0.830715 3.10003,1.108333 1.30955,-2.529937 4.72122,-0.53374 5.64375,-0.452079 3.42124,-2.856178 6.52957,1.306413 5.04717,4.754947 1.14945,2.896676 -2.16476,4.132344 -3.39923,2.534636 0.3676,-1.51179 0.62085,-7.734534 -1.76662,-4.462496 -0.99613,1.534445 1.11226,5.830528 -1.92507,5.00833 -4.04278,1.499834 0.86,-8.028853 -3.29167,-5.374996 -1.40096,2.809083 1.91426,6.388064 -3.79173,5.391658 z"
+ id="path196"
+ inkscape:connector-curvature="0" />
+ d="m 578.51224,47.203876 c 0.52141,4.243467 -6.54348,3.268808 -8.01041,0.668753 -1.60517,-3.045601 0.78554,-7.314219 4.38541,-6.885416 2.83009,-1.160482 6.54312,4.736022 3.01361,4.785125 -1.52676,0.0022 -3.05351,0.0043 -4.58027,0.0065 -0.10363,2.874436 3.58483,1.929793 5.19166,1.42503 z m -5.125,-2.699999 c 1.63658,0.459668 4.34329,-0.405987 1.51633,-1.575 -0.87243,-0.02294 -1.46212,0.769347 -1.51633,1.575 z"
+ id="path198"
+ inkscape:connector-curvature="0" />
+ d="m 579.21224,49.720543 c 0.93465,-2.56639 -0.64881,-7.469587 1.45625,-8.49583 1.0983,0.09576 2.93645,-0.553409 2.32712,1.12083 2.39227,-3.020404 7.77608,-0.814174 6.26354,3.128332 -0.35525,1.853997 0.77815,5.186306 -2.22355,4.231037 -2.77419,0.701084 0.4362,-9.35128 -3.9318,-4.784372 -1.3168,3.048475 1.7868,5.470432 -3.89156,4.800003 z"
+ id="path200"
+ inkscape:connector-curvature="0" />
+ d="m 596.02891,47.270543 c 0.87876,3.579834 -5.40876,3.65248 -5.43333,0.483333 -0.27646,-1.191085 0.79838,-3.603899 -0.17082,-4.124999 -1.63908,0.457718 -1.14045,-3.314326 0.60379,-2.291667 -0.78331,-2.571711 4.86457,-3.264417 3.13337,0 2.1881,-1.157251 2.856,2.651389 0.78214,2.291667 -1.64157,-0.379018 -1.16187,3.704272 -0.0989,3.849999 l 0.41666,-0.025 0.76667,-0.183333 z"
+ id="path202"
+ inkscape:connector-curvature="0" />
+
diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala
index 8b2bc5992..407348417 100644
--- a/rtdata/languages/Catala
+++ b/rtdata/languages/Catala
@@ -1423,7 +1423,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TAB_INSPECT; Inspect
diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified)
index b01c39d84..b93aed7af 100644
--- a/rtdata/languages/Chinese (Simplified)
+++ b/rtdata/languages/Chinese (Simplified)
@@ -1468,7 +1468,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index ce16e057f..d0b4d89f3 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -934,7 +934,7 @@ MAIN_MSG_SETPATHFIRST;K použití této funkce musíte nejprve zadat cílovou ce
MAIN_MSG_TOOMANYOPENEDITORS;Příliš mnoho otevřených editorů.\nPro pokračování nejprve některý ukončete.
MAIN_MSG_WRITEFAILED;Chyba zápisu\n"%1"\n\nUjistěte se, že složka existuje a máte práva do ní zapisovat.
MAIN_TAB_ADVANCED;Pokročilé
-MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: Alt-a
MAIN_TAB_COLOR;Barvy
MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c
MAIN_TAB_DETAIL;Detaily
diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch
index 7967786dd..57236e1e6 100644
--- a/rtdata/languages/Deutsch
+++ b/rtdata/languages/Deutsch
@@ -984,7 +984,7 @@ MAIN_MSG_SETPATHFIRST;Um diese Funktion zu nutzen, müssen Sie zuerst in den Ein
MAIN_MSG_TOOMANYOPENEDITORS;Zu viele geöffnete Editorfenster.\nUm fortzufahren, schließen sie bitte ein Editorfenster.
MAIN_MSG_WRITEFAILED;Fehler beim Schreiben von\n\n"%1"\n\nStellen Sie sicher, dass das Verzeichnis existiert und dass Sie Schreibrechte besitzen.
MAIN_TAB_ADVANCED;Erweitert
-MAIN_TAB_ADVANCED_TOOLTIP;Taste: Alt + w
+MAIN_TAB_ADVANCED_TOOLTIP;Taste: Alt + a
MAIN_TAB_COLOR;Farbe
MAIN_TAB_COLOR_TOOLTIP;Taste: Alt + c
MAIN_TAB_DETAIL;Details
diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK)
index 503e63860..c6b521c12 100644
--- a/rtdata/languages/English (UK)
+++ b/rtdata/languages/English (UK)
@@ -990,7 +990,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c
!MAIN_TAB_DETAIL;Detail
!MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index 52caa23e4..9b8eda038 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -902,7 +902,7 @@
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_COLOR;Color
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c
!MAIN_TAB_DETAIL;Detail
diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol
index c91bd4a6b..1e3b84371 100644
--- a/rtdata/languages/Espanol
+++ b/rtdata/languages/Espanol
@@ -954,7 +954,7 @@ MAIN_MSG_SETPATHFIRST;Para poder usar esta función, primero tiene que establece
MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\nPor favor cierre un editor para continuar.
MAIN_MSG_WRITEFAILED;Falla al escribir\n\n"%1"\n\nAsegurese de que el folder exista y que usted tenga permiso de escritura sobre él.
MAIN_TAB_ADVANCED;Avanzado
-MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: Alt-a
MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Tecla de Atajo: Alt-C
MAIN_TAB_DETAIL;Detalle
diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index 0fce8721c..508604d98 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -891,7 +891,7 @@ MAIN_MSG_SETPATHFIRST;Vous devez d'abord choisir un dossier cible dans Préfére
MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n"%1"\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire.
MAIN_TAB_ADVANCED;Avancé
-MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-a
MAIN_TAB_COLOR;Couleur
MAIN_TAB_COLOR_TOOLTIP;Raccourci:Alt-c
MAIN_TAB_DETAIL;Détail
diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano
index 977277a73..f11423d7a 100644
--- a/rtdata/languages/Italiano
+++ b/rtdata/languages/Italiano
@@ -1640,7 +1640,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TAB_INSPECT; Inspect
diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese
index 96ffea174..16dafb297 100644
--- a/rtdata/languages/Japanese
+++ b/rtdata/languages/Japanese
@@ -933,7 +933,7 @@ MAIN_MSG_SETPATHFIRST;この関数を使用するには、最初に環境設定
MAIN_MSG_TOOMANYOPENEDITORS;編集画面が多すぎます\n操作を続けるには何れかの画面を閉じてください
MAIN_MSG_WRITEFAILED;書き込みに失敗しました\n\n"%1"\n\nフォルダが在るか書き込み権限を持っているか確認してください
MAIN_TAB_ADVANCED;高度な機能
-MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-a
MAIN_TAB_COLOR;カラー
MAIN_TAB_COLOR_TOOLTIP;ショートカット: Alt-c
MAIN_TAB_DETAIL;CbDL
diff --git a/rtdata/languages/LICENSE b/rtdata/languages/LICENSE
index fbc14b67e..b269339a6 100755
--- a/rtdata/languages/LICENSE
+++ b/rtdata/languages/LICENSE
@@ -13,6 +13,6 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with RawTherapee. If not, see .
+# along with RawTherapee. If not, see .
#
diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar
index 26f1b1aa0..5879bf130 100644
--- a/rtdata/languages/Magyar
+++ b/rtdata/languages/Magyar
@@ -1357,7 +1357,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TAB_INSPECT; Inspect
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index 43afc8efa..d39173a52 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -2111,7 +2111,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish
index 528b6a198..a631353c3 100644
--- a/rtdata/languages/Polish
+++ b/rtdata/languages/Polish
@@ -1722,7 +1722,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TAB_INSPECT; Inspect
diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues
index e68f93e56..766b14e0b 100644
--- a/rtdata/languages/Portugues
+++ b/rtdata/languages/Portugues
@@ -889,7 +889,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função, primeiro tem de configurar um cam
MAIN_MSG_TOOMANYOPENEDITORS;Existem demasiados editores abertos.\nPor favor, feche um editor para continuar.
MAIN_MSG_WRITEFAILED;Falha ao gravar\n"%1"\n\nVerifique se a pasta existe e se tem permissão para gravar nela.
MAIN_TAB_ADVANCED;Avançado
-MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-a
MAIN_TAB_COLOR;Cor
MAIN_TAB_COLOR_TOOLTIP;Atalho: Alt-c
MAIN_TAB_DETAIL;Detalhe
diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil)
index c7cc2dfe7..aef5fcde9 100644
--- a/rtdata/languages/Portugues (Brasil)
+++ b/rtdata/languages/Portugues (Brasil)
@@ -888,7 +888,7 @@ MAIN_MSG_SETPATHFIRST;Para usar esta função primeiro defina um objetivo em Pre
MAIN_MSG_TOOMANYOPENEDITORS;Muitos editores abertos.\nPor favor, feche um editor para continuar.
MAIN_MSG_WRITEFAILED;Falha ao escrever\n"%1"\n\nVerifique se a pasta existe e se tens permissão para gravar nela.
MAIN_TAB_ADVANCED;Avançado
-MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-a
MAIN_TAB_COLOR;Cor
MAIN_TAB_COLOR_TOOLTIP;Atalho: Alt-c
MAIN_TAB_DETAIL;Detalhe
diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian
index a33458ef6..79c6bebfc 100644
--- a/rtdata/languages/Russian
+++ b/rtdata/languages/Russian
@@ -589,7 +589,7 @@ MAIN_MSG_QOVERWRITE;Вы хотите перезаписать его?
MAIN_MSG_SETPATHFIRST;Прежде необходимо установить целевой каталог в настройках\nчтоб использовать эту функцию!
MAIN_MSG_WRITEFAILED;Не удалось записать\n\n"%1".\n\nУбедитесь, что каталог существует и у вас есть права на запись в него.
MAIN_TAB_ADVANCED;Дополнительные
-MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: Alt-W
+MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: Alt-a
MAIN_TAB_COLOR;Цвет
MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: Alt-C
MAIN_TAB_DETAIL;Детализация
diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters)
index 98d74a5dd..2b98cfe2a 100644
--- a/rtdata/languages/Serbian (Cyrilic Characters)
+++ b/rtdata/languages/Serbian (Cyrilic Characters)
@@ -1614,7 +1614,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TAB_INSPECT; Inspect
diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish
index 17bf0299f..220339a45 100644
--- a/rtdata/languages/Swedish
+++ b/rtdata/languages/Swedish
@@ -1963,7 +1963,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
diff --git a/rtdata/languages/default b/rtdata/languages/default
index d887d9864..912abca3b 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -726,6 +726,7 @@ HISTORY_MSG_490;DRC - Amount
HISTORY_MSG_491;White Balance
HISTORY_MSG_492;RGB Curves
HISTORY_MSG_493;L*a*b* Adjustments
+HISTORY_MSG_494;Capture Sharpening
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
@@ -763,6 +764,12 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
HISTORY_MSG_METADATA_MODE;Metadata copy mode
HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
+HISTORY_MSG_PDSHARPEN_CONTRAST;CAS - Contrast threshold
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CAS - Auto threshold
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CAS - Auto radius
+HISTORY_MSG_PDSHARPEN_GAMMA;CAS - Gamma
+HISTORY_MSG_PDSHARPEN_ITERATIONS;CAS - Iterations
+HISTORY_MSG_PDSHARPEN_RADIUS;CAS - Radius
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@@ -773,6 +780,7 @@ HISTORY_MSG_RAW_BORDER;Raw border
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
+HISTORY_MSG_SHARPENING_GAMMA;Sharpening - Gamma
HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
@@ -903,7 +911,7 @@ MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in orde
MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
MAIN_TAB_ADVANCED;Advanced
-MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w
+MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c
MAIN_TAB_DETAIL;Detail
@@ -1794,6 +1802,8 @@ TP_PCVIGNETTE_ROUNDNESS;Roundness
TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle.
TP_PCVIGNETTE_STRENGTH;Strength
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners).
+TP_PDSHARPENING_LABEL;Capture Sharpening
+TP_PDSHARPENING_AUTORADIUS_TOOLTIP;If the checkbox is checked, RawTherapee calculates a value based on the raw data of the image.
TP_PERSPECTIVE_HORIZONTAL;Horizontal
TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Vertical
@@ -2022,6 +2032,7 @@ TP_SHARPENING_BLUR;Blur radius
TP_SHARPENING_CONTRAST;Contrast threshold
TP_SHARPENING_EDRADIUS;Radius
TP_SHARPENING_EDTOLERANCE;Edge tolerance
+TP_SHARPENING_GAMMA;Gamma
TP_SHARPENING_HALOCONTROL;Halo control
TP_SHARPENING_HCAMOUNT;Amount
TP_SHARPENING_LABEL;Sharpening
diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css
index 45dec6e39..3f5072f48 100644
--- a/rtdata/themes/RawTherapee-GTK3-20_.css
+++ b/rtdata/themes/RawTherapee-GTK3-20_.css
@@ -16,7 +16,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
/***************************/
diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css
index a796b60a1..58742e8ca 100644
--- a/rtdata/themes/RawTherapee-GTK3-_19.css
+++ b/rtdata/themes/RawTherapee-GTK3-_19.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
* {
diff --git a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css
index d1bb4fdbc..19e2eb049 100644
--- a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css
+++ b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css
index 581549750..5875e2132 100644
--- a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css
+++ b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css
index 7b5089430..ce4bb8d28 100644
--- a/rtdata/themes/TooWaBlue-GTK3-20_.css
+++ b/rtdata/themes/TooWaBlue-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/
diff --git a/rtdata/themes/TooWaBlue-GTK3-_19.css b/rtdata/themes/TooWaBlue-GTK3-_19.css
index 530ae3d3a..31676ca8d 100644
--- a/rtdata/themes/TooWaBlue-GTK3-_19.css
+++ b/rtdata/themes/TooWaBlue-GTK3-_19.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/
diff --git a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css
index 29ebd6c96..8f045e206 100644
--- a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css
+++ b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css
index 74dd5c7f0..579ca7a00 100644
--- a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css
+++ b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css
index 0f61e0935..8d6d05152 100644
--- a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css
+++ b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtdata/themes/TooWaGrey-GTK3-20_.css b/rtdata/themes/TooWaGrey-GTK3-20_.css
index f681ef374..0b29ed2e7 100644
--- a/rtdata/themes/TooWaGrey-GTK3-20_.css
+++ b/rtdata/themes/TooWaGrey-GTK3-20_.css
@@ -15,7 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with RawTherapee. If not, see .
+ along with RawTherapee. If not, see .
*/
diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc
index bad95a4d8..a2d68402f 100644
--- a/rtengine/CA_correct_RT.cc
+++ b/rtengine/CA_correct_RT.cc
@@ -18,7 +18,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
@@ -106,6 +106,10 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution)
//end of linear equation solver
}
+namespace rtengine {
+ extern const Settings* settings;
+}
+
using namespace std;
using namespace rtengine;
@@ -701,7 +705,9 @@ float* RawImageSource::CA_correct_RT(
blockvar[dir][c] = blocksqave[dir][c] / blockdenom[dir][c] - SQR(blockave[dir][c] / blockdenom[dir][c]);
} else {
processpasstwo = false;
- std::cout << "blockdenom vanishes" << std::endl;
+ if (settings->verbose) {
+ std::cout << "blockdenom vanishes" << std::endl;
+ }
break;
}
}
@@ -801,7 +807,9 @@ float* RawImageSource::CA_correct_RT(
numpar = 4;
if (numblox[1] < 10) {
- std::cout << "numblox = " << numblox[1] << std::endl;
+ if (settings->verbose) {
+ std::cout << "numblox = " << numblox[1] << std::endl;
+ }
processpasstwo = false;
}
}
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index fcf82328a..89d7208f0 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -32,6 +32,7 @@ set(CAMCONSTSFILE "camconst.json")
set(RTENGINESOURCEFILES
badpixels.cc
CA_correct_RT.cc
+ capturesharpening.cc
EdgePreservingDecomposition.cc
FTblockDN.cc
PF_correct_RT.cc
diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc
index ccffbe59c..d1e659114 100644
--- a/rtengine/FTblockDN.cc
+++ b/rtengine/FTblockDN.cc
@@ -18,7 +18,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/LUT.h b/rtengine/LUT.h
index 6584eefe6..34f572f58 100644
--- a/rtengine/LUT.h
+++ b/rtengine/LUT.h
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/*
diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc
index fe89a7b65..7df042663 100644
--- a/rtengine/PF_correct_RT.cc
+++ b/rtengine/PF_correct_RT.cc
@@ -23,7 +23,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/StopWatch.h b/rtengine/StopWatch.h
index 5eb103da4..94be402e4 100644
--- a/rtengine/StopWatch.h
+++ b/rtengine/StopWatch.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* Author: reine
*/
diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc
index 13cbd4d2a..b3a34295c 100644
--- a/rtengine/ahd_demosaic_RT.cc
+++ b/rtengine/ahd_demosaic_RT.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
//
diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h
index 846c4c47d..b2c720bd8 100644
--- a/rtengine/alignedbuffer.h
+++ b/rtengine/alignedbuffer.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _ALIGNEDBUFFER_
#define _ALIGNEDBUFFER_
diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc
index 47aa45c14..43aef0f71 100644
--- a/rtengine/amaze_demosaic_RT.cc
+++ b/rtengine/amaze_demosaic_RT.cc
@@ -22,7 +22,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/array2D.h b/rtengine/array2D.h
index 84728f043..7713cd55c 100644
--- a/rtengine/array2D.h
+++ b/rtengine/array2D.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/*
diff --git a/rtengine/badpixels.cc b/rtengine/badpixels.cc
index 376e58b3b..79b8187f7 100644
--- a/rtengine/badpixels.cc
+++ b/rtengine/badpixels.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "array2D.h"
diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h
index e754ac891..d0496810d 100644
--- a/rtengine/bilateral2.h
+++ b/rtengine/bilateral2.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _BILATERAL2_
#define _BILATERAL2_
diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h
index d686ad43e..da302964b 100644
--- a/rtengine/boxblur.h
+++ b/rtengine/boxblur.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _BOXBLUR_H_
#define _BOXBLUR_H_
diff --git a/rtengine/cache.h b/rtengine/cache.h
index ec284b2ae..6c1dacf43 100644
--- a/rtengine/cache.h
+++ b/rtengine/cache.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/camconst.json b/rtengine/camconst.json
index 4dbfe80f9..7f481e104 100644
--- a/rtengine/camconst.json
+++ b/rtengine/camconst.json
@@ -2250,6 +2250,11 @@ Camera constants:
}
},
+ { // Quality C, only raw crop
+ "make_model": "Samsung EX2F",
+ "raw_crop": [ 16, 7, -4, -4 ]
+ },
+
{ // Quality B, corrections for raw crop vs dcraw9.21, matched to Samsung's default
"make_model": "Samsung NX mini",
"dcraw_matrix": [ 5222,-1196,-550,-6540,14649,2009,-1666,2819,5657 ], // dng 8.6 d65
diff --git a/rtengine/capturesharpening.cc b/rtengine/capturesharpening.cc
new file mode 100644
index 000000000..8d9ee5b64
--- /dev/null
+++ b/rtengine/capturesharpening.cc
@@ -0,0 +1,798 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * Copyright (c) 2019 Ingo Weyrich (heckflosse67@gmx.de)
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+*/
+#include
+#include
+
+#include "rtengine.h"
+#include "rawimagesource.h"
+#include "rt_math.h"
+#include "improcfun.h"
+#include "procparams.h"
+#include "color.h"
+#include "gauss.h"
+#include "rt_algo.h"
+//#define BENCHMARK
+#include "StopWatch.h"
+#ifdef _OPENMP
+#include
+#endif
+#include "opthelper.h"
+#include "../rtgui/multilangmgr.h"
+
+namespace {
+
+void compute7x7kernel(float sigma, float kernel[7][7]) {
+
+ const double temp = -2.f * rtengine::SQR(sigma);
+ float sum = 0.f;
+ for (int i = -3; i <= 3; ++i) {
+ for (int j = -3; j <= 3; ++j) {
+ if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) {
+ kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 3][j + 3];
+ } else {
+ kernel[i + 3][j + 3] = 0.f;
+ }
+ }
+ }
+
+ for (int i = 0; i < 7; ++i) {
+ for (int j = 0; j < 7; ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+}
+
+void compute5x5kernel(float sigma, float kernel[5][5]) {
+
+ const double temp = -2.f * rtengine::SQR(sigma);
+ float sum = 0.f;
+ for (int i = -2; i <= 2; ++i) {
+ for (int j = -2; j <= 2; ++j) {
+ if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
+ kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 2][j + 2];
+ } else {
+ kernel[i + 2][j + 2] = 0.f;
+ }
+ }
+ }
+
+ for (int i = 0; i < 5; ++i) {
+ for (int j = 0; j < 5; ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+}
+
+void compute3x3kernel(float sigma, float kernel[3][3]) {
+
+ const double temp = -2.f * rtengine::SQR(sigma);
+ float sum = 0.f;
+ for (int i = -1; i <= 1; ++i) {
+ for (int j = -1; j <= 1; ++j) {
+ if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
+ kernel[i + 1][j + 1] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 1][j + 1];
+ } else {
+ kernel[i + 1][j + 1] = 0.f;
+ }
+ }
+ }
+
+ for (int i = 0; i < 3; ++i) {
+ for (int j = 0; j < 3; ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+}
+
+inline void gauss3x3div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[3][3])
+{
+
+ const float c11 = kernel[0][0];
+ const float c10 = kernel[0][1];
+ const float c00 = kernel[1][1];
+
+ for (int i = 1; i < H - 1; i++) {
+ dst[i][0] = 1.f;
+ for (int j = 1; j < W - 1; j++) {
+ const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+ dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
+ }
+ dst[i][W - 1] = 1.f;
+ }
+ // first and last row
+ for (int j = 0; j < W; ++j) {
+ dst[0][j] = 1.f;
+ }
+ for (int j = 0; j < W; ++j) {
+ dst[H - 1][j] = 1.f;
+ }
+}
+
+inline void gauss5x5div (float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[5][5])
+{
+
+ const float c21 = kernel[0][1];
+ const float c20 = kernel[0][2];
+ const float c11 = kernel[1][1];
+ const float c10 = kernel[1][2];
+ const float c00 = kernel[2][2];
+
+ for (int i = 2; i < H - 2; ++i) {
+ dst[i][0] = dst[i][1] = 1.f;
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 2; j < W - 2; ++j) {
+ const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
+ }
+ dst[i][W - 2] = dst[i][W - 1] = 1.f;
+ }
+
+ // first and last rows
+ for (int i = 0; i < 2; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ for (int i = H - 2 ; i < H; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+}
+
+inline void gauss7x7div(float** RESTRICT src, float** RESTRICT dst, float** RESTRICT divBuffer, const int W, const int H, const float kernel[7][7])
+{
+
+ const float c31 = kernel[0][2];
+ const float c30 = kernel[0][3];
+ const float c22 = kernel[1][1];
+ const float c21 = kernel[1][2];
+ const float c20 = kernel[1][3];
+ const float c11 = kernel[2][2];
+ const float c10 = kernel[2][3];
+ const float c00 = kernel[3][3];
+
+ for (int i = 3; i < H - 3; ++i) {
+ dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 3; j < W - 3; ++j) {
+ const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
+ c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
+ c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
+ c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
+ }
+ dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f;
+ }
+
+ // first and last rows
+ for (int i = 0; i < 3; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ for (int i = H - 3 ; i < H; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+}
+
+inline void gauss3x3mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[3][3])
+{
+ const float c11 = kernel[0][0];
+ const float c10 = kernel[0][1];
+ const float c00 = kernel[1][1];
+
+ for (int i = 1; i < H - 1; i++) {
+ for (int j = 1; j < W - 1; j++) {
+ const float val = c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+ dst[i][j] *= val;
+ }
+ }
+
+}
+
+inline void gauss5x5mult (float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[5][5])
+{
+
+ const float c21 = kernel[0][1];
+ const float c20 = kernel[0][2];
+ const float c11 = kernel[1][1];
+ const float c10 = kernel[1][2];
+ const float c00 = kernel[2][2];
+
+ for (int i = 2; i < H - 2; ++i) {
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 2; j < W - 2; ++j) {
+ const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] *= val;
+ }
+ }
+}
+
+inline void gauss7x7mult(float** RESTRICT src, float** RESTRICT dst, const int W, const int H, const float kernel[7][7])
+{
+
+ const float c31 = kernel[0][2];
+ const float c30 = kernel[0][3];
+ const float c22 = kernel[1][1];
+ const float c21 = kernel[1][2];
+ const float c20 = kernel[1][3];
+ const float c11 = kernel[2][2];
+ const float c10 = kernel[2][3];
+ const float c00 = kernel[3][3];
+
+ for (int i = 3; i < H - 3; ++i) {
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 3; j < W - 3; ++j) {
+ const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
+ c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
+ c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
+ c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] *= val;
+ }
+ }
+}
+
+void buildClipMaskBayer(const float * const *rawData, int W, int H, float** clipMask, const float whites[2][2])
+{
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 0; row < H; ++row) {
+ for (int col = 0; col < W; ++col) {
+ clipMask[row][col] = 1.f;
+ }
+ }
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 2; row < H - 2; ++row) {
+ float clip0 = whites[row & 1][0];
+ float clip1 = whites[row & 1][1];
+ for (int col = 2; col < W - 2; ++col) {
+ if (rawData[row][col] >= clip0) {
+ clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
+ clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
+ clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
+ clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
+ clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
+ }
+ std::swap(clip0, clip1);
+ }
+ }
+}
+
+void buildClipMaskXtrans(const float * const *rawData, int W, int H, float** clipMask, const float whites[6][6])
+{
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 0; row < H; ++row) {
+ for (int col = 0; col < W; ++col) {
+ clipMask[row][col] = 1.f;
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 2; row < H - 2; ++row) {
+ for (int col = 2; col < W - 2; ++col) {
+ const float clip = whites[row % 6][col % 6];
+ if (rawData[row][col] >= clip) {
+ clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
+ clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
+ clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
+ clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
+ clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
+ }
+ }
+ }
+}
+
+void buildClipMaskMono(const float * const *rawData, int W, int H, float** clipMask, float white)
+{
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 0; row < H; ++row) {
+ for (int col = 0; col < W; ++col) {
+ clipMask[row][col] = 1.f;
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int row = 2; row < H - 2; ++row) {
+ for (int col = 2; col < W - 2; ++col) {
+ if (rawData[row][col] >= white) {
+ clipMask[row - 2][col - 1] = clipMask[row - 2][col] = clipMask[row - 2][col + 1] = 0.f;
+ clipMask[row - 1][col - 2] = clipMask[row - 1][col - 1] = clipMask[row - 1][col] = clipMask[row - 1][col + 1] = clipMask[row - 1][col + 2] = 0.f;
+ clipMask[row][col - 2] = clipMask[row][col - 1] = clipMask[row][col] = clipMask[row][col + 1] = clipMask[row][col + 2] = 0.f;
+ clipMask[row + 1][col - 2] = clipMask[row + 1][col - 1] = clipMask[row + 1][col] = clipMask[row + 1][col + 1] = clipMask[row + 1][col + 2] = 0.f;
+ clipMask[row + 2][col - 1] = clipMask[row + 2][col] = clipMask[row + 2][col + 1] = 0.f;
+ }
+ }
+ }
+}
+
+float calcRadiusBayer(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, const unsigned int fc[2])
+{
+
+ float maxRatio = 1.f;
+#ifdef _OPENMP
+ #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16)
+#endif
+ for (int row = 4; row < H - 4; ++row) {
+ for (int col = 5 + (fc[row & 1] & 1); col < W - 4; col += 2) {
+ const float val00 = rawData[row][col];
+ if (val00 > 0.f) {
+ const float val1m1 = rawData[row + 1][col - 1];
+ const float val1p1 = rawData[row + 1][col + 1];
+ const float maxVal0 = std::max(val00, val1m1);
+ if (val1m1 > 0.f && maxVal0 > lowerLimit) {
+ const float minVal = std::min(val00, val1m1);
+ if (UNLIKELY(maxVal0 > maxRatio * minVal)) {
+ bool clipped = false;
+ if (maxVal0 == val00) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) {
+ clipped = true;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row][col - 2], val00, rawData[row + 2][col - 2], rawData[row + 2][col]) >= upperLimit) {
+ clipped = true;
+ }
+ }
+ if (!clipped) {
+ maxRatio = maxVal0 / minVal;
+ }
+ }
+ }
+ const float maxVal1 = std::max(val00, val1p1);
+ if (val1p1 > 0.f && maxVal1 > lowerLimit) {
+ const float minVal = std::min(val00, val1p1);
+ if (UNLIKELY(maxVal1 > maxRatio * minVal)) {
+ if (maxVal1 == val00) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col - 1], rawData[row - 1][col + 1], val1p1) >= upperLimit) {
+ continue;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(val00, rawData[row][col + 2], rawData[row + 2][col], rawData[row + 2][col + 2]) >= upperLimit) {
+ continue;
+ }
+ }
+ maxRatio = maxVal1 / minVal;
+ }
+ }
+ }
+ }
+ }
+ return std::sqrt((1.f / (std::log(1.f / maxRatio) / 2.f)) / -2.f);
+}
+
+float calcRadiusXtrans(const float * const *rawData, int W, int H, float lowerLimit, float upperLimit, unsigned int starty, unsigned int startx)
+{
+
+ float maxRatio = 1.f;
+#ifdef _OPENMP
+ #pragma omp parallel for reduction(max:maxRatio) schedule(dynamic, 16)
+#endif
+ for (int row = starty + 3; row < H - 4; row += 3) {
+ for (int col = startx + 3; col < W - 4; col += 3) {
+ const float valtl = rawData[row][col];
+ const float valtr = rawData[row][col + 1];
+ const float valbl = rawData[row + 1][col];
+ const float valbr = rawData[row + 1][col + 1];
+ if (valtl > 1.f) {
+ const float maxValtltr = std::max(valtl, valtr);
+ if (valtr > 1.f && maxValtltr > lowerLimit) {
+ const float minVal = std::min(valtl, valtr);
+ if (UNLIKELY(maxValtltr > maxRatio * minVal)) {
+ bool clipped = false;
+ if (maxValtltr == valtl) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) {
+ clipped = true;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
+ clipped = true;
+ }
+ }
+ if (!clipped) {
+ maxRatio = maxValtltr / minVal;
+ }
+ }
+ }
+ const float maxValtlbl = std::max(valtl, valbl);
+ if (valbl > 1.f && maxValtlbl > lowerLimit) {
+ const float minVal = std::min(valtl, valbl);
+ if (UNLIKELY(maxValtlbl > maxRatio * minVal)) {
+ bool clipped = false;
+ if (maxValtlbl == valtl) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col - 1], valtr, valbl, valbr) >= upperLimit) {
+ clipped = true;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
+ clipped = true;
+ }
+ }
+ if (!clipped) {
+ maxRatio = maxValtlbl / minVal;
+ }
+ }
+ }
+ }
+ if (valbr > 1.f) {
+ const float maxValblbr = std::max(valbl, valbr);
+ if (valbl > 1.f && maxValblbr > lowerLimit) {
+ const float minVal = std::min(valbl, valbr);
+ if (UNLIKELY(maxValblbr > maxRatio * minVal)) {
+ bool clipped = false;
+ if (maxValblbr == valbr) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
+ clipped = true;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(valtl, valtr, rawData[row + 2][col - 1], valbr) >= upperLimit) {
+ clipped = true;
+ }
+ }
+ if (!clipped) {
+ maxRatio = maxValblbr / minVal;
+ }
+ }
+ }
+ const float maxValtrbr = std::max(valtr, valbr);
+ if (valtr > 1.f && maxValtrbr > lowerLimit) {
+ const float minVal = std::min(valtr, valbr);
+ if (UNLIKELY(maxValtrbr > maxRatio * minVal)) {
+ if (maxValtrbr == valbr) { // check for influence by clipped green in neighborhood
+ if (rtengine::max(valtl, valtr, valbl, rawData[row + 2][col + 2]) >= upperLimit) {
+ continue;
+ }
+ } else { // check for influence by clipped green in neighborhood
+ if (rtengine::max(rawData[row - 1][col + 2], valtl, valbl, valbr) >= upperLimit) {
+ continue;
+ }
+ }
+ maxRatio = maxValtrbr / minVal;
+ }
+ }
+ }
+ }
+ }
+ return std::sqrt((1.f / (std::log(1.f / maxRatio))) / -2.f);
+}
+void CaptureDeconvSharpening (float** luminance, float** oldLuminance, const float * const * blend, int W, int H, double sigma, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal)
+{
+BENCHFUN
+ const bool is5x5 = (sigma <= 0.84);
+ const bool is3x3 = (sigma < 0.6);
+ float kernel7[7][7];
+ float kernel5[5][5];
+ float kernel3[3][3];
+ if (is3x3) {
+ compute3x3kernel(sigma, kernel3);
+ } else if (is5x5) {
+ compute5x5kernel(sigma, kernel5);
+ } else {
+ compute7x7kernel(sigma, kernel7);
+ }
+
+ constexpr int tileSize = 194;
+ constexpr int border = 3;
+ constexpr int fullTileSize = tileSize + 2 * border;
+
+ double progress = startVal;
+ const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H);
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ int progresscounter = 0;
+ array2D tmpIThr(fullTileSize, fullTileSize);
+ array2D tmpThr(fullTileSize, fullTileSize);
+ array2D lumThr(fullTileSize, fullTileSize);
+#pragma omp for schedule(dynamic,2) collapse(2)
+ for (int i = border; i < H - border; i+= tileSize) {
+ for(int j = border; j < W - border; j+= tileSize) {
+ const bool endOfCol = (i + tileSize + border) >= H;
+ const bool endOfRow = (j + tileSize + border) >= W;
+ // fill tiles
+ if (endOfRow || endOfCol) {
+ // special handling for small tiles at end of row or column
+ for (int k = 0, ii = endOfCol ? H - fullTileSize : i; k < fullTileSize; ++k, ++ii) {
+ for (int l = 0, jj = endOfRow ? W - fullTileSize : j; l < fullTileSize; ++l, ++jj) {
+ tmpIThr[k][l] = oldLuminance[ii - border][jj - border];
+ lumThr[k][l] = oldLuminance[ii - border][jj - border];
+ }
+ }
+ } else {
+ for (int ii = i; ii < i + fullTileSize; ++ii) {
+ for (int jj = j; jj < j + fullTileSize; ++jj) {
+ tmpIThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border];
+ lumThr[ii - i][jj - j] = oldLuminance[ii - border][jj - border];
+ }
+ }
+ }
+ if (is3x3) {
+ for (int k = 0; k < iterations; ++k) {
+ // apply 3x3 gaussian blur and divide luminance by result of gaussian blur
+ gauss3x3div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel3);
+ gauss3x3mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel3);
+ }
+ } else if (is5x5) {
+ for (int k = 0; k < iterations; ++k) {
+ // apply 5x5 gaussian blur and divide luminance by result of gaussian blur
+ gauss5x5div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel5);
+ gauss5x5mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel5);
+ }
+ } else {
+ for (int k = 0; k < iterations; ++k) {
+ // apply 7x7 gaussian blur and divide luminance by result of gaussian blur
+ gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, kernel7);
+ gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, kernel7);
+ }
+ }
+ if (endOfRow || endOfCol) {
+ // special handling for small tiles at end of row or column
+ for (int k = border, ii = endOfCol ? H - fullTileSize - border : i - border; k < fullTileSize - border; ++k) {
+ for (int l = border, jj = endOfRow ? W - fullTileSize - border : j - border; l < fullTileSize - border; ++l) {
+ luminance[ii + k][jj + l] = rtengine::intp(blend[ii + k][jj + l], max(tmpIThr[k][l], 0.0f), luminance[ii + k][jj + l]);
+ }
+ }
+ } else {
+ for (int ii = border; ii < fullTileSize - border; ++ii) {
+ for (int jj = border; jj < fullTileSize - border; ++jj) {
+ luminance[i + ii - border][j + jj - border] = rtengine::intp(blend[i + ii - border][j + jj - border], max(tmpIThr[ii][jj], 0.0f), luminance[i + ii - border][j + jj - border]);
+ }
+ }
+ }
+ if (plistener) {
+ if (++progresscounter % 16 == 0) {
+#ifdef _OPENMP
+ #pragma omp critical(csprogress)
+#endif
+ {
+ progress += 16.0 * progressStep;
+ progress = rtengine::min(progress, endVal);
+ plistener->setProgress(progress);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+}
+
+namespace rtengine
+{
+
+void RawImageSource::captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) {
+
+ if (plistener) {
+ plistener->setProgressStr(M("TP_PDSHARPENING_LABEL"));
+ plistener->setProgress(0.0);
+ }
+BENCHFUN
+ const float xyz_rgb[3][3] = { // XYZ from RGB
+ { 0.412453, 0.357580, 0.180423 },
+ { 0.212671, 0.715160, 0.072169 },
+ { 0.019334, 0.119193, 0.950227 }
+ };
+
+ float contrast = conrastThreshold / 100.f;
+
+ const float clipVal = (ri->get_white(1) - ri->get_cblack(1)) * scale_mul[1];
+
+ array2D& redVals = redCache ? *redCache : red;
+ array2D& greenVals = greenCache ? *greenCache : green;
+ array2D& blueVals = blueCache ? *blueCache : blue;
+
+ array2D clipMask(W, H);
+ constexpr float clipLimit = 0.95f;
+ if (ri->getSensorType() == ST_BAYER) {
+ const float whites[2][2] = {
+ {(ri->get_white(FC(0,0)) - c_black[FC(0,0)]) * scale_mul[FC(0,0)] * clipLimit, (ri->get_white(FC(0,1)) - c_black[FC(0,1)]) * scale_mul[FC(0,1)] * clipLimit},
+ {(ri->get_white(FC(1,0)) - c_black[FC(1,0)]) * scale_mul[FC(1,0)] * clipLimit, (ri->get_white(FC(1,1)) - c_black[FC(1,1)]) * scale_mul[FC(1,1)] * clipLimit}
+ };
+ buildClipMaskBayer(rawData, W, H, clipMask, whites);
+ const unsigned int fc[2] = {FC(0,0), FC(1,0)};
+ if (sharpeningParams.autoRadius) {
+ radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc);
+ }
+ } else if (ri->getSensorType() == ST_FUJI_XTRANS) {
+ float whites[6][6];
+ for (int i = 0; i < 6; ++i) {
+ for (int j = 0; j < 6; ++j) {
+ const auto color = ri->XTRANSFC(i, j);
+ whites[i][j] = (ri->get_white(color) - c_black[color]) * scale_mul[color] * clipLimit;
+ }
+ }
+ buildClipMaskXtrans(rawData, W, H, clipMask, whites);
+ bool found = false;
+ int i, j;
+ for (i = 6; i < 12 && !found; ++i) {
+ for (j = 6; j < 12 && !found; ++j) {
+ if (ri->XTRANSFC(i, j) == 1) {
+ if (ri->XTRANSFC(i, j - 1) != ri->XTRANSFC(i, j + 1)) {
+ if (ri->XTRANSFC(i - 1, j) != 1) {
+ if (ri->XTRANSFC(i, j - 1) != 1) {
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (sharpeningParams.autoRadius) {
+ radius = calcRadiusXtrans(rawData, W, H, 1000.f, clipVal, i, j);
+ }
+
+ } else if (ri->get_colors() == 1) {
+ buildClipMaskMono(rawData, W, H, clipMask, (ri->get_white(0) - c_black[0]) * scale_mul[0] * clipLimit);
+ if (sharpeningParams.autoRadius) {
+ const unsigned int fc[2] = {0, 0};
+ radius = calcRadiusBayer(rawData, W, H, 1000.f, clipVal, fc);
+ }
+ }
+
+ if (showMask) {
+ array2D& L = blue; // blue will be overridden anyway => we can use its buffer to store L
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = 0; i < H; ++i) {
+ Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W);
+ }
+ if (plistener) {
+ plistener->setProgress(0.1);
+ }
+
+ array2D& blend = red; // red will be overridden anyway => we can use its buffer to store the blend mask
+ buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask);
+ if (plistener) {
+ plistener->setProgress(0.2);
+ }
+ conrastThreshold = contrast * 100.f;
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+ for (int i = 0; i < H; ++i) {
+ for (int j = 0; j < W; ++j) {
+ red[i][j] = green[i][j] = blue[i][j] = blend[i][j] * 16384.f;
+ }
+ }
+ if (plistener) {
+ plistener->setProgress(1.0);
+ }
+ return;
+ }
+
+ array2D* Lbuffer = nullptr;
+ if (!redCache) {
+ Lbuffer = new array2D(W, H);
+ }
+
+ array2D* YOldbuffer = nullptr;
+ if (!greenCache) {
+ YOldbuffer = new array2D(W, H);
+ }
+
+ array2D* YNewbuffer = nullptr;
+ if (!blueCache) {
+ YNewbuffer = new array2D(W, H);
+ }
+ array2D& L = Lbuffer ? *Lbuffer : red;
+ array2D& YOld = YOldbuffer ? * YOldbuffer : green;
+ array2D& YNew = YNewbuffer ? * YNewbuffer : blue;
+ const float gamma = sharpeningParams.gamma;
+
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int i = 0; i < H; ++i) {
+ Color::RGB2L(redVals[i], greenVals[i], blueVals[i], L[i], xyz_rgb, W);
+ Color::RGB2Y(redVals[i], greenVals[i], blueVals[i], YOld[i], YNew[i], gamma, W);
+ }
+ if (plistener) {
+ plistener->setProgress(0.1);
+ }
+ // calculate contrast based blend factors to reduce sharpening in regions with low contrast
+ array2D& blend = clipMask; // we can share blend and clipMask buffer here
+ buildBlendMask(L, blend, W, H, contrast, 1.f, sharpeningParams.autoContrast, clipMask);
+ if (plistener) {
+ plistener->setProgress(0.2);
+ }
+ conrastThreshold = contrast * 100.f;
+
+ CaptureDeconvSharpening(YNew, YOld, blend, W, H, radius, sharpeningParams.deconviter, plistener, 0.2, 0.9);
+ if (plistener) {
+ plistener->setProgress(0.9);
+ }
+#ifdef _OPENMP
+ #pragma omp parallel for schedule(dynamic, 16)
+#endif
+ for (int i = 0; i < H; ++i) {
+ int j = 0;
+#ifdef __SSE2__
+ const vfloat gammav = F2V(gamma);
+ for (; j < W - 3; j += 4) {
+ const vfloat factor = pow_F(vmaxf(LVFU(YNew[i][j]), ZEROV) / vmaxf(LVFU(YOld[i][j]), F2V(0.00001f)), gammav);
+ STVFU(red[i][j], LVFU(redVals[i][j]) * factor);
+ STVFU(green[i][j], LVFU(greenVals[i][j]) * factor);
+ STVFU(blue[i][j], LVFU(blueVals[i][j]) * factor);
+ }
+
+#endif
+ for (; j < W; ++j) {
+ const float factor = pow_F(std::max(YNew[i][j], 0.f) / std::max(YOld[i][j], 0.00001f), gamma);
+ red[i][j] = redVals[i][j] * factor;
+ green[i][j] = greenVals[i][j] * factor;
+ blue[i][j] = blueVals[i][j] * factor;
+ }
+ }
+
+ delete Lbuffer;
+ delete YOldbuffer;
+ delete YNewbuffer;
+ if (plistener) {
+ plistener->setProgress(1.0);
+ }
+}
+
+} /* namespace */
diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc
index a7b789caf..5f6e46f8f 100644
--- a/rtengine/cfa_linedn_RT.cc
+++ b/rtengine/cfa_linedn_RT.cc
@@ -18,7 +18,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc
index 86b67e000..dfef273d6 100644
--- a/rtengine/ciecam02.cc
+++ b/rtengine/ciecam02.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "ciecam02.h"
#include "rtengine.h"
diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h
index 68763b965..fea35ab12 100644
--- a/rtengine/ciecam02.h
+++ b/rtengine/ciecam02.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _CIECAM02_
#define _CIECAM02_
diff --git a/rtengine/cieimage.h b/rtengine/cieimage.h
index 23b080ae3..660d40e78 100644
--- a/rtengine/cieimage.h
+++ b/rtengine/cieimage.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _CIEIMAGE_H_
#define _CIEIMAGE_H_
diff --git a/rtengine/color.cc b/rtengine/color.cc
index 7c12c0ca5..7a91f0073 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
*/
#include "rtengine.h"
@@ -1835,21 +1835,21 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3],
{
#ifdef __SSE2__
- vfloat minvalfv = F2V(0.f);
- vfloat maxvalfv = F2V(MAXVALF);
+ const vfloat maxvalfv = F2V(MAXVALF);
+ const vfloat rmv = F2V(wp[1][0]);
+ const vfloat gmv = F2V(wp[1][1]);
+ const vfloat bmv = F2V(wp[1][2]);
#endif
int i = 0;
#ifdef __SSE2__
- for(;i < width - 3; i+=4) {
+ for(; i < width - 3; i+=4) {
const vfloat rv = LVFU(R[i]);
const vfloat gv = LVFU(G[i]);
const vfloat bv = LVFU(B[i]);
- const vfloat yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv;
+ const vfloat yv = rmv * rv + gmv * gv + bmv * bv;
- vmask maxMask = vmaskf_gt(yv, maxvalfv);
- vmask minMask = vmaskf_lt(yv, minvalfv);
- if (_mm_movemask_ps((vfloat)vorm(maxMask, minMask))) {
+ if (_mm_movemask_ps((vfloat)vorm(vmaskf_gt(yv, maxvalfv), vmaskf_lt(yv, ZEROV)))) {
// take slower code path for all 4 pixels if one of the values is > MAXVALF. Still faster than non SSE2 version
for(int k = 0; k < 4; ++k) {
float y = yv[k];
@@ -1860,7 +1860,7 @@ void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3],
}
}
#endif
- for(;i < width; ++i) {
+ for(; i < width; ++i) {
const float rv = R[i];
const float gv = G[i];
const float bv = B[i];
diff --git a/rtengine/color.h b/rtengine/color.h
index 5bf178636..b859fb0cf 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
@@ -1804,6 +1804,31 @@ public:
return (hr);
}
+ static inline void RGB2Y(const float* R, const float* G, const float* B, float* Y1, float * Y2, float gamma, int W) {
+ gamma = 1.f / gamma;
+ int i = 0;
+#ifdef __SSE2__
+ const vfloat gammav = F2V(gamma);
+ const vfloat c1v = F2V(0.2627f);
+ const vfloat c2v = F2V(0.6780f);
+ const vfloat c3v = F2V(0.0593f);
+ for (; i < W - 3; i += 4) {
+ const vfloat Rv = vmaxf(LVFU(R[i]), ZEROV);
+ const vfloat Gv = vmaxf(LVFU(G[i]), ZEROV);
+ const vfloat Bv = vmaxf(LVFU(B[i]), ZEROV);
+ vfloat yv = pow_F(c1v * Rv + c2v * Gv + c3v * Bv, gammav);
+ STVFU(Y1[i], yv);
+ STVFU(Y2[i], yv);
+ }
+#endif
+ for (; i < W; ++i) {
+ const float r = std::max(R[i], 0.f);
+ const float g = std::max(G[i], 0.f);
+ const float b = std::max(B[i], 0.f);
+ Y1[i] = Y2[i] = pow_F(0.2627f * r + 0.6780f * g + 0.0593f * b, gamma);
+ }
+ }
+
};
}
diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc
index a22caddb8..3ddbdc28a 100644
--- a/rtengine/colortemp.cc
+++ b/rtengine/colortemp.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "colortemp.h"
#include "rtengine.h"
diff --git a/rtengine/colortemp.h b/rtengine/colortemp.h
index d529d844e..da83177be 100644
--- a/rtengine/colortemp.h
+++ b/rtengine/colortemp.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _COLORTEMP_
#define _COLORTEMP_
diff --git a/rtengine/coord.cc b/rtengine/coord.cc
index bf9ee816e..0a73cc29d 100644
--- a/rtengine/coord.cc
+++ b/rtengine/coord.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "coord.h"
diff --git a/rtengine/coord.h b/rtengine/coord.h
index 2f1325434..5f16cf606 100644
--- a/rtengine/coord.h
+++ b/rtengine/coord.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef __COORD__
diff --git a/rtengine/coord2d.h b/rtengine/coord2d.h
index bc030f22e..252219e47 100644
--- a/rtengine/coord2d.h
+++ b/rtengine/coord2d.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef __COORD2D__
#define __COORD2D__
diff --git a/rtengine/cplx_wavelet_dec.cc b/rtengine/cplx_wavelet_dec.cc
index a43a7b8b6..5b3650adc 100644
--- a/rtengine/cplx_wavelet_dec.cc
+++ b/rtengine/cplx_wavelet_dec.cc
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* 2010 Ilya Popov
* 2012 Emil Martinec
diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h
index fab6119d9..91e71fcd5 100644
--- a/rtengine/cplx_wavelet_dec.h
+++ b/rtengine/cplx_wavelet_dec.h
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* 2010 Ilya Popov
* 2012 Emil Martinec
diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h
index bd333d4b9..6b8255b89 100644
--- a/rtengine/cplx_wavelet_filter_coeffs.h
+++ b/rtengine/cplx_wavelet_filter_coeffs.h
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* 2012 Emil Martinec
* 2014 Jacques Desmis
diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h
index cab0d8e3e..4c98addfe 100644
--- a/rtengine/cplx_wavelet_level.h
+++ b/rtengine/cplx_wavelet_level.h
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* 2010 Ilya Popov
* 2012 Emil Martinec
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index ef2a5bf92..a7e3337c8 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/curves.h b/rtengine/curves.h
index 55068630a..25272d44c 100644
--- a/rtengine/curves.h
+++ b/rtengine/curves.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef __CURVES_H__
#define __CURVES_H__
diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc
index 6c948717a..8127ebfcb 100644
--- a/rtengine/dcp.cc
+++ b/rtengine/dcp.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/dcp.h b/rtengine/dcp.h
index 48b881661..826f073a5 100644
--- a/rtengine/dcp.h
+++ b/rtengine/dcp.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h
index 81da41718..fdebda0cc 100644
--- a/rtengine/dcraw.h
+++ b/rtengine/dcraw.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef DCRAW_H
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 1a913f9ad..f80982d8b 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "curves.h"
#include "dcrop.h"
diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h
index 4fc02da28..aa4a3a963 100644
--- a/rtengine/dcrop.h
+++ b/rtengine/dcrop.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc
index dc12bc01a..51db8bb3f 100644
--- a/rtengine/demosaic_algos.cc
+++ b/rtengine/demosaic_algos.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
@@ -1121,7 +1121,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &r
* Contact info: luis.sanz.rodriguez@gmail.com
*
* This code is distributed under a GNU General Public License, version 3.
-* Visit for more information.
+* Visit for more information.
*
***/
// Adapted to RawTherapee by Jacques Desmis 3/2013
@@ -2024,7 +2024,8 @@ void RawImageSource::refinement(int PassCount)
// Refinement based on EECI demozaicing algorithm by L. Chang and Y.P. Tan
// from "Lassus" : Luis Sanz Rodriguez, adapted by Jacques Desmis - JDC - and Oliver Duis for RawTherapee
-// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw : eg: Lighthouse + AMaZE : whitout refinement:39.96dB, with refinement:41.86 dB
+// increases the signal to noise ratio (PSNR) # +1 to +2 dB : tested with Dcraw :
+// eg: Lighthouse + AMaZE : without refinement:39.96 dB, with refinement:41.86 dB
// reduce color artifacts, improves the interpolation
// but it's relatively slow
//
diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc
index 311921c52..4877aacd8 100644
--- a/rtengine/dfmanager.cc
+++ b/rtengine/dfmanager.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "dfmanager.h"
#include "../rtgui/options.h"
diff --git a/rtengine/dfmanager.h b/rtengine/dfmanager.h
index 541981492..23ca97d14 100644
--- a/rtengine/dfmanager.h
+++ b/rtengine/dfmanager.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc
index dd85b87de..bb20b7cc1 100644
--- a/rtengine/diagonalcurves.cc
+++ b/rtengine/diagonalcurves.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc
index 94826e06e..e822d8492 100644
--- a/rtengine/dirpyr_equalizer.cc
+++ b/rtengine/dirpyr_equalizer.cc
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* (C) 2010 Emil Martinec
*
diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc
index 4873ee670..60cce506b 100644
--- a/rtengine/dual_demosaic_RT.cc
+++ b/rtengine/dual_demosaic_RT.cc
@@ -19,7 +19,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc
index 7b7f2a517..af6ecd2ff 100644
--- a/rtengine/dynamicprofile.cc
+++ b/rtengine/dynamicprofile.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "../rtengine/dynamicprofile.h"
diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h
index fc5c85e4c..aaffc5c4f 100644
--- a/rtengine/dynamicprofile.h
+++ b/rtengine/dynamicprofile.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _DYNAMICPROFILE_H_
#define _DYNAMICPROFILE_H_
diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc
index 1663a087d..aa8fdf485 100644
--- a/rtengine/eahd_demosaic.cc
+++ b/rtengine/eahd_demosaic.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc
index 4e3fbdabe..a40f107af 100644
--- a/rtengine/fast_demo.cc
+++ b/rtengine/fast_demo.cc
@@ -18,7 +18,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc
index 56660a82a..e1a9134a8 100644
--- a/rtengine/ffmanager.cc
+++ b/rtengine/ffmanager.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "ffmanager.h"
#include "../rtgui/options.h"
diff --git a/rtengine/ffmanager.h b/rtengine/ffmanager.h
index 43fb2f368..537f8ee46 100644
--- a/rtengine/ffmanager.h
+++ b/rtengine/ffmanager.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/filmnegativeproc.cc b/rtengine/filmnegativeproc.cc
index 12f19fba9..1a7270b82 100644
--- a/rtengine/filmnegativeproc.cc
+++ b/rtengine/filmnegativeproc.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/filmnegativethumb.cc b/rtengine/filmnegativethumb.cc
index 8c7564b86..6a4da31b0 100644
--- a/rtengine/filmnegativethumb.cc
+++ b/rtengine/filmnegativethumb.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/flatcurves.cc b/rtengine/flatcurves.cc
index fe5ecc5e1..d24c20a70 100644
--- a/rtengine/flatcurves.cc
+++ b/rtengine/flatcurves.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "curves.h"
#include
diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc
index c76e2a285..3fc20d43a 100644
--- a/rtengine/gamutwarning.cc
+++ b/rtengine/gamutwarning.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/**
diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h
index 19a27cdfd..e0aaa98d9 100644
--- a/rtengine/gamutwarning.h
+++ b/rtengine/gamutwarning.h
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/**
diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc
index b7de67851..ca330f9b9 100644
--- a/rtengine/gauss.cc
+++ b/rtengine/gauss.cc
@@ -14,17 +14,59 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "gauss.h"
+#include "rt_math.h"
#include
#include
#include "opthelper.h"
#include "boxblur.h"
-
namespace
{
+void compute7x7kernel(float sigma, float kernel[7][7]) {
+ const double temp = -2.f * rtengine::SQR(sigma);
+ float sum = 0.f;
+ for (int i = -3; i <= 3; ++i) {
+ for (int j = -3; j <= 3; ++j) {
+ if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 1.15)) {
+ kernel[i + 3][j + 3] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 3][j + 3];
+ } else {
+ kernel[i + 3][j + 3] = 0.f;
+ }
+ }
+ }
+
+ for (int i = 0; i < 7; ++i) {
+ for (int j = 0; j < 7; ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+}
+
+void compute5x5kernel(float sigma, float kernel[5][5]) {
+ const double temp = -2.f * rtengine::SQR(sigma);
+ float sum = 0.f;
+ for (int i = -2; i <= 2; ++i) {
+ for (int j = -2; j <= 2; ++j) {
+ if((rtengine::SQR(i) + rtengine::SQR(j)) <= rtengine::SQR(3.0 * 0.84)) {
+ kernel[i + 2][j + 2] = std::exp((rtengine::SQR(i) + rtengine::SQR(j)) / temp);
+ sum += kernel[i + 2][j + 2];
+ } else {
+ kernel[i + 2][j + 2] = 0.f;
+ }
+ }
+ }
+
+ for (int i = 0; i < 5; ++i) {
+ for (int j = 0; j < 5; ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+}
+
template void calculateYvVFactors( const T sigma, T &b1, T &b2, T &b3, T &B, T M[3][3])
{
// coefficient calculation
@@ -207,6 +249,174 @@ template void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST
}
}
+template void gauss7x7div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma)
+{
+
+ float kernel[7][7];
+ compute7x7kernel(sigma, kernel);
+
+ const float c31 = kernel[0][2];
+ const float c30 = kernel[0][3];
+ const float c22 = kernel[1][1];
+ const float c21 = kernel[1][2];
+ const float c20 = kernel[1][3];
+ const float c11 = kernel[2][2];
+ const float c10 = kernel[2][3];
+ const float c00 = kernel[3][3];
+
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic, 16) nowait
+#endif
+
+ for (int i = 3; i < H - 3; ++i) {
+ dst[i][0] = dst[i][1] = dst[i][2] = 1.f;
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 3; j < W - 3; ++j) {
+ const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
+ c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
+ c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
+ c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
+ }
+ dst[i][W - 3] = dst[i][W - 2] = dst[i][W - 1] = 1.f;
+ }
+
+ // first and last rows
+#ifdef _OPENMP
+ #pragma omp single
+#endif
+ {
+ for (int i = 0; i < 3; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ for (int i = H - 3 ; i < H; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ }
+}
+
+template void gauss5x5div (T** RESTRICT src, T** RESTRICT dst, T** RESTRICT divBuffer, const int W, const int H, float sigma)
+{
+
+ float kernel[5][5];
+ compute5x5kernel(sigma, kernel);
+
+ const float c21 = kernel[0][1];
+ const float c20 = kernel[0][2];
+ const float c11 = kernel[1][1];
+ const float c10 = kernel[1][2];
+ const float c00 = kernel[2][2];
+
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic, 16) nowait
+#endif
+
+ for (int i = 2; i < H - 2; ++i) {
+ dst[i][0] = dst[i][1] = 1.f;
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 2; j < W - 2; ++j) {
+ const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] = divBuffer[i][j] / std::max(val, 0.00001f);
+ }
+ dst[i][W - 2] = dst[i][W - 1] = 1.f;
+ }
+
+ // first and last rows
+#ifdef _OPENMP
+ #pragma omp single
+#endif
+ {
+ for (int i = 0; i < 2; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ for (int i = H - 2 ; i < H; ++i) {
+ for (int j = 0; j < W; ++j) {
+ dst[i][j] = 1.f;
+ }
+ }
+ }
+}
+
+template void gauss7x7mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma)
+{
+
+ float kernel[7][7];
+ compute7x7kernel(sigma, kernel);
+ const float c31 = kernel[0][2];
+ const float c30 = kernel[0][3];
+ const float c22 = kernel[1][1];
+ const float c21 = kernel[1][2];
+ const float c20 = kernel[1][3];
+ const float c11 = kernel[2][2];
+ const float c10 = kernel[2][3];
+ const float c00 = kernel[3][3];
+
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic, 16)
+#endif
+
+ for (int i = 3; i < H - 3; ++i) {
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 3; j < W - 3; ++j) {
+ const float val = c31 * (src[i - 3][j - 1] + src[i - 3][j + 1] + src[i - 1][j - 3] + src[i - 1][j + 3] + src[i + 1][j - 3] + src[i + 1][j + 3] + src[i + 3][j - 1] + src[i + 3][j + 1]) +
+ c30 * (src[i - 3][j] + src[i][j - 3] + src[i][j + 3] + src[i + 3][j]) +
+ c22 * (src[i - 2][j - 2] + src[i - 2][j + 2] + src[i + 2][j - 2] + src[i + 2][j + 2]) +
+ c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] * c21 + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] *= val;
+ }
+ }
+}
+
+template void gauss5x5mult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, float sigma)
+{
+
+ float kernel[5][5];
+ compute5x5kernel(sigma, kernel);
+
+ const float c21 = kernel[0][1];
+ const float c20 = kernel[0][2];
+ const float c11 = kernel[1][1];
+ const float c10 = kernel[1][2];
+ const float c00 = kernel[2][2];
+
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic, 16)
+#endif
+
+ for (int i = 2; i < H - 2; ++i) {
+ // I tried hand written SSE code but gcc vectorizes better
+ for (int j = 2; j < W - 2; ++j) {
+ const float val = c21 * (src[i - 2][j - 1] + src[i - 2][j + 1] + src[i - 1][j - 2] + src[i - 1][j + 2] + src[i + 1][j - 2] + src[i + 1][j + 2] + src[i + 2][j - 1] + src[i + 2][j + 1]) +
+ c20 * (src[i - 2][j] + src[i][j - 2] + src[i][j + 2] + src[i + 2][j]) +
+ c11 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) +
+ c10 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) +
+ c00 * src[i][j];
+
+ dst[i][j] *= val;
+ }
+ }
+}
// use separated filter if the support window is small and src == dst
template void gaussHorizontal3 (T** src, T** dst, int W, int H, const float c0, const float c1)
@@ -1143,6 +1353,8 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int
{
static constexpr auto GAUSS_SKIP = 0.25;
static constexpr auto GAUSS_3X3_LIMIT = 0.6;
+ static constexpr auto GAUSS_5X5_LIMIT = 0.84;
+ static constexpr auto GAUSS_7X7_LIMIT = 1.15;
static constexpr auto GAUSS_DOUBLE = 25.0;
if(buffer) {
@@ -1241,14 +1453,26 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int
if (sigma < GAUSS_DOUBLE) {
switch (gausstype) {
case GAUSS_MULT : {
- gaussHorizontalSse (src, src, W, H, sigma);
- gaussVerticalSsemult (src, dst, W, H, sigma);
+ if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
+ gauss5x5mult(src, dst, W, H, sigma);
+ } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
+ gauss7x7mult(src, dst, W, H, sigma);
+ } else {
+ gaussHorizontalSse (src, src, W, H, sigma);
+ gaussVerticalSsemult (src, dst, W, H, sigma);
+ }
break;
}
case GAUSS_DIV : {
- gaussHorizontalSse (src, dst, W, H, sigma);
- gaussVerticalSsediv (dst, dst, buffer2, W, H, sigma);
+ if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
+ gauss5x5div (src, dst, buffer2, W, H, sigma);
+ } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
+ gauss7x7div (src, dst, buffer2, W, H, sigma);
+ } else {
+ gaussHorizontalSse (src, dst, W, H, sigma);
+ gaussVerticalSsediv (dst, dst, buffer2, W, H, sigma);
+ }
break;
}
@@ -1268,14 +1492,26 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int
if (sigma < GAUSS_DOUBLE) {
switch (gausstype) {
case GAUSS_MULT : {
- gaussHorizontal (src, src, W, H, sigma);
- gaussVerticalmult (src, dst, W, H, sigma);
+ if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
+ gauss5x5mult(src, dst, W, H, sigma);
+ } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
+ gauss7x7mult(src, dst, W, H, sigma);
+ } else {
+ gaussHorizontal (src, src, W, H, sigma);
+ gaussVerticalmult (src, dst, W, H, sigma);
+ }
break;
}
case GAUSS_DIV : {
- gaussHorizontal (src, dst, W, H, sigma);
- gaussVerticaldiv (dst, dst, buffer2, W, H, sigma);
+ if (sigma <= GAUSS_5X5_LIMIT && src != dst) {
+ gauss5x5div (src, dst, buffer2, W, H, sigma);
+ } else if (sigma <= GAUSS_7X7_LIMIT && src != dst) {
+ gauss7x7div (src, dst, buffer2, W, H, sigma);
+ } else {
+ gaussHorizontal (src, dst, W, H, sigma);
+ gaussVerticaldiv (dst, dst, buffer2, W, H, sigma);
+ }
break;
}
diff --git a/rtengine/gauss.h b/rtengine/gauss.h
index 72f115cc4..b63301d2b 100644
--- a/rtengine/gauss.h
+++ b/rtengine/gauss.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _GAUSS_H_
#define _GAUSS_H_
diff --git a/rtengine/green_equil_RT.cc b/rtengine/green_equil_RT.cc
index 361bde882..fc4f18548 100644
--- a/rtengine/green_equil_RT.cc
+++ b/rtengine/green_equil_RT.cc
@@ -19,7 +19,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc
index e7fe9b8af..0ebe6c172 100644
--- a/rtengine/guidedfilter.cc
+++ b/rtengine/guidedfilter.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/**
diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h
index 6691af251..af8ed0901 100644
--- a/rtengine/guidedfilter.h
+++ b/rtengine/guidedfilter.h
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc
index 7134ac34f..35dd74463 100644
--- a/rtengine/hilite_recon.cc
+++ b/rtengine/hilite_recon.cc
@@ -20,7 +20,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc
index f9268ea5d..212b11d00 100644
--- a/rtengine/histmatching.cc
+++ b/rtengine/histmatching.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "rawimagesource.h"
diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc
index 7e27b90a5..0e56eae48 100644
--- a/rtengine/hphd_demosaic_RT.cc
+++ b/rtengine/hphd_demosaic_RT.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h
index 29426c62d..3e0d0b5d6 100644
--- a/rtengine/iccmatrices.h
+++ b/rtengine/iccmatrices.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _ICCMATRICES_
#define _ICCMATRICES_
diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc
index 268a6b1c2..a8d54b810 100644
--- a/rtengine/iccstore.cc
+++ b/rtengine/iccstore.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h
index 6b57fd072..5c76660e5 100644
--- a/rtengine/iccstore.h
+++ b/rtengine/iccstore.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc
index c9a4f223a..a1ec979a1 100644
--- a/rtengine/iimage.cc
+++ b/rtengine/iimage.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "procparams.h"
diff --git a/rtengine/iimage.h b/rtengine/iimage.h
index 6dae0dbfd..8f163d329 100644
--- a/rtengine/iimage.h
+++ b/rtengine/iimage.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IIMAGE_
#define _IIMAGE_
diff --git a/rtengine/image16.cc b/rtengine/image16.cc
index 8516ebc30..b0ac6c2af 100644
--- a/rtengine/image16.cc
+++ b/rtengine/image16.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "image16.h"
#include "imagefloat.h"
diff --git a/rtengine/image16.h b/rtengine/image16.h
index e550d745d..108fd0b5c 100644
--- a/rtengine/image16.h
+++ b/rtengine/image16.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
//
// A class representing a 16 bit rgb image with separate planes and 16 byte aligned data
diff --git a/rtengine/image8.cc b/rtengine/image8.cc
index 93dee7537..8bf3f564c 100644
--- a/rtengine/image8.cc
+++ b/rtengine/image8.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/image8.h b/rtengine/image8.h
index a566a5e2f..d36001378 100644
--- a/rtengine/image8.h
+++ b/rtengine/image8.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
//
// A class representing a 8 bit rgb image without alpha channel
diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc
index b074cdbb2..403f4708c 100644
--- a/rtengine/imagedata.cc
+++ b/rtengine/imagedata.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h
index 774547487..99caaf361 100644
--- a/rtengine/imagedata.h
+++ b/rtengine/imagedata.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef __IMAGEDATA_H__
#define __IMAGEDATA_H__
diff --git a/rtengine/imagedimensions.cc b/rtengine/imagedimensions.cc
index 2604114df..5e780558c 100644
--- a/rtengine/imagedimensions.cc
+++ b/rtengine/imagedimensions.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "imagedimensions.h"
diff --git a/rtengine/imagedimensions.h b/rtengine/imagedimensions.h
index 90c002cc2..fce7a4dea 100644
--- a/rtengine/imagedimensions.h
+++ b/rtengine/imagedimensions.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc
index 842b4fe0f..1e8cdce5c 100644
--- a/rtengine/imagefloat.cc
+++ b/rtengine/imagefloat.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include "imagefloat.h"
diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h
index 6ed4efa9d..761fc485f 100644
--- a/rtengine/imagefloat.h
+++ b/rtengine/imagefloat.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
//
// A class representing a 16 bit rgb image with separate planes and 16 byte aligned data
diff --git a/rtengine/imageformat.h b/rtengine/imageformat.h
index 22708daef..dc40cf147 100644
--- a/rtengine/imageformat.h
+++ b/rtengine/imageformat.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IMAGEFORMAT_
#define _IMAGEFORMAT_
diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc
index 1e4f8c008..f335f5be8 100644
--- a/rtengine/imageio.cc
+++ b/rtengine/imageio.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
diff --git a/rtengine/imageio.h b/rtengine/imageio.h
index 5c2858fad..86b718e35 100644
--- a/rtengine/imageio.h
+++ b/rtengine/imageio.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IMAGEIO_
#define _IMAGEIO_
diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h
index bf73b5bb2..edc1102c4 100644
--- a/rtengine/imagesource.h
+++ b/rtengine/imagesource.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
@@ -46,7 +46,7 @@ struct LensProfParams;
struct RAWParams;
struct RetinexParams;
struct ToneCurveParams;
-
+struct CaptureSharpeningParams;
}
class ImageMatrices
@@ -83,7 +83,7 @@ public:
virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {};
virtual void filmNegativeProcess (const procparams::FilmNegativeParams ¶ms) {};
virtual bool getFilmNegativeExponents (Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams& currentParams, std::array& newExps) { return false; };
- virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold) {};
+ virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold, bool cache = false) {};
virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {};
virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {};
virtual void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {};
@@ -182,6 +182,7 @@ public:
return this;
}
virtual void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) = 0;
+ virtual void captureSharpening(const procparams::CaptureSharpeningParams &sharpeningParams, bool showMask, double &conrastThreshold, double &radius) = 0;
};
}
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index 22bafd844..ed2b506af 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "improccoordinator.h"
#include "curves.h"
@@ -55,6 +55,7 @@ ImProcCoordinator::ImProcCoordinator() :
softProof(false),
gamutCheck(false),
sharpMask(false),
+ sharpMaskChanged(false),
scale(10),
highDetailPreprocessComputed(false),
highDetailRawComputed(false),
@@ -122,6 +123,8 @@ ImProcCoordinator::ImProcCoordinator() :
flatFieldAutoClipListener(nullptr),
bayerAutoContrastListener(nullptr),
xtransAutoContrastListener(nullptr),
+ pdSharpenAutoContrastListener(nullptr),
+ pdSharpenAutoRadiusListener(nullptr),
frameCountListener(nullptr),
imageTypeListener(nullptr),
actListener(nullptr),
@@ -356,18 +359,35 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
}
bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicAutoContrast : params->raw.xtranssensor.dualDemosaicAutoContrast;
double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast;
- imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic
+ imgsrc->demosaic(rp, autoContrast, contrastThreshold, params->pdsharpening.enabled);
if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) {
- bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0);
- }
- if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) {
+ bayerAutoContrastListener->autoContrastChanged(contrastThreshold);
+ } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) {
xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0);
}
-
// if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag
- todo |= M_INIT;
+ todo |= (M_INIT | M_CSHARP);
+ }
+
+ if ((todo & (M_RAW | M_CSHARP)) && params->pdsharpening.enabled) {
+ double pdSharpencontrastThreshold = params->pdsharpening.contrast;
+ double pdSharpenRadius = params->pdsharpening.deconvradius;
+ imgsrc->captureSharpening(params->pdsharpening, sharpMask, pdSharpencontrastThreshold, pdSharpenRadius);
+ if (pdSharpenAutoContrastListener && params->pdsharpening.autoContrast) {
+ pdSharpenAutoContrastListener->autoContrastChanged(pdSharpencontrastThreshold);
+ }
+ if (pdSharpenAutoRadiusListener && params->pdsharpening.autoRadius) {
+ pdSharpenAutoRadiusListener->autoRadiusChanged(pdSharpenRadius);
+ }
+ }
+
+
+ if ((todo & M_RAW)
+ || (!highDetailRawComputed && highDetailNeeded)
+ || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified())
+ || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) {
if (highDetailNeeded) {
highDetailRawComputed = true;
} else {
@@ -1421,9 +1441,16 @@ void ImProcCoordinator::getSoftProofing(bool &softProof, bool &gamutCheck)
gamutCheck = this->gamutCheck;
}
-void ImProcCoordinator::setSharpMask (bool sharpMask)
+ProcEvent ImProcCoordinator::setSharpMask (bool sharpMask)
{
- this->sharpMask = sharpMask;
+ if (this->sharpMask != sharpMask) {
+ sharpMaskChanged = true;
+ this->sharpMask = sharpMask;
+ return params->pdsharpening.enabled ? rtengine::EvPdShrMaskToggled : rtengine::EvShrEnabled;
+ } else {
+ sharpMaskChanged = false;
+ return rtengine::EvShrEnabled;
+ }
}
void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb)
@@ -1593,13 +1620,13 @@ void ImProcCoordinator::process()
while (changeSinceLast) {
const bool panningRelatedChange =
- params->toneCurve != nextParams->toneCurve
+ params->toneCurve.isPanningRelatedChange(nextParams->toneCurve)
|| params->labCurve != nextParams->labCurve
|| params->localContrast != nextParams->localContrast
|| params->rgbCurves != nextParams->rgbCurves
|| params->colorToning != nextParams->colorToning
|| params->vibrance != nextParams->vibrance
- || params->wb != nextParams->wb
+ || params->wb.isPanningRelatedChange(nextParams->wb)
|| params->colorappearance != nextParams->colorappearance
|| params->epd != nextParams->epd
|| params->fattal != nextParams->fattal
@@ -1625,8 +1652,11 @@ void ImProcCoordinator::process()
|| params->retinex != nextParams->retinex
|| params->wavelet != nextParams->wavelet
|| params->dirpyrequalizer != nextParams->dirpyrequalizer
- || params->dehaze != nextParams->dehaze;
+ || params->dehaze != nextParams->dehaze
+ || params->pdsharpening != nextParams->pdsharpening
+ || sharpMaskChanged;
+ sharpMaskChanged = false;
*params = *nextParams;
int change = changeSinceLast;
changeSinceLast = 0;
diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h
index 061876968..edd0353a0 100644
--- a/rtengine/improccoordinator.h
+++ b/rtengine/improccoordinator.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IMPROCCOORDINATOR_H_
#define _IMPROCCOORDINATOR_H_
@@ -79,7 +79,7 @@ protected:
bool softProof;
bool gamutCheck;
bool sharpMask;
-
+ bool sharpMaskChanged;
int scale;
bool highDetailPreprocessComputed;
bool highDetailRawComputed;
@@ -163,6 +163,8 @@ protected:
FlatFieldAutoClipListener *flatFieldAutoClipListener;
AutoContrastListener *bayerAutoContrastListener;
AutoContrastListener *xtransAutoContrastListener;
+ AutoContrastListener *pdSharpenAutoContrastListener;
+ AutoRadiusListener *pdSharpenAutoRadiusListener;
FrameCountListener *frameCountListener;
ImageTypeListener *imageTypeListener;
@@ -286,7 +288,7 @@ public:
void getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const override;
void setSoftProofing (bool softProof, bool gamutCheck) override;
void getSoftProofing (bool &softProof, bool &gamutCheck) override;
- void setSharpMask (bool sharpMask) override;
+ ProcEvent setSharpMask (bool sharpMask) override;
bool updateTryLock () override
{
return updaterThreadStart.trylock();
@@ -372,6 +374,16 @@ public:
xtransAutoContrastListener = acl;
}
+ void setpdSharpenAutoRadiusListener (AutoRadiusListener* acl) override
+ {
+ pdSharpenAutoRadiusListener = acl;
+ }
+
+ void setpdSharpenAutoContrastListener (AutoContrastListener* acl) override
+ {
+ pdSharpenAutoContrastListener = acl;
+ }
+
void setImageTypeListener (ImageTypeListener* itl) override
{
imageTypeListener = itl;
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 23dc4b1ba..db77e02fa 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include
@@ -5815,7 +5815,7 @@ void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, const Glib:
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with darktable. If not, see .
+ along with darktable. If not, see .
*/
void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread)
{
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index 314978f14..0f56dc556 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IMPROCFUN_H_
#define _IMPROCFUN_H_
@@ -249,7 +249,7 @@ public:
void Lanczos(const LabImage* src, LabImage* dst, float scale);
void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale);
- void deconvsharpening(float** luminance, float** buffer, int W, int H, const procparams::SharpeningParams &sharpenParam);
+ void deconvsharpening(float** luminance, float** buffer, const float* const * blend, int W, int H, const procparams::SharpeningParams &sharpenParam, double Scale);
void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening
void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast
void MLmicrocontrast(LabImage* lab); //Manuel's microcontrast
diff --git a/rtengine/impulse_denoise.cc b/rtengine/impulse_denoise.cc
index 907afc1a1..c08f55700 100644
--- a/rtengine/impulse_denoise.cc
+++ b/rtengine/impulse_denoise.cc
@@ -12,7 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* 2010 Emil Martinec
*
diff --git a/rtengine/init.cc b/rtengine/init.cc
index 8d7ee451f..8d3ee96cb 100644
--- a/rtengine/init.cc
+++ b/rtengine/init.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
#include "../rtgui/profilestorecombobox.h"
diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc
index 42a5f92b3..60d4cb9ff 100644
--- a/rtengine/ipdehaze.cc
+++ b/rtengine/ipdehaze.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
/*
diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc
index 8b5a2cb71..14aeb4049 100644
--- a/rtengine/iplab2rgb.cc
+++ b/rtengine/iplab2rgb.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "rtengine.h"
#include "improcfun.h"
diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc
index 5945398d2..af6567c3c 100644
--- a/rtengine/iplabregions.cc
+++ b/rtengine/iplabregions.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifdef _OPENMP
diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc
index 1bf21829e..6143f48a3 100644
--- a/rtengine/iplocalcontrast.cc
+++ b/rtengine/iplocalcontrast.cc
@@ -19,7 +19,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifdef _OPENMP
diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc
index 2a66e68cb..0c1fb1ad8 100644
--- a/rtengine/ipresize.cc
+++ b/rtengine/ipresize.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "improcfun.h"
diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc
index 309c7073b..7117c9f2a 100644
--- a/rtengine/ipretinex.cc
+++ b/rtengine/ipretinex.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
* adaptation to RawTherapee
* 2015 Jacques Desmis
diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc
index 2433ca13c..cddc8734b 100644
--- a/rtengine/ipshadowshighlights.cc
+++ b/rtengine/ipshadowshighlights.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "improcfun.h"
diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc
index 9d7358fa9..bbd1de155 100644
--- a/rtengine/ipsharpen.cc
+++ b/rtengine/ipsharpen.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "improcfun.h"
@@ -158,7 +158,7 @@ namespace rtengine
extern const Settings* settings;
-void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam)
+void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, const float * const * blend, int W, int H, const SharpeningParams &sharpenParam, double Scale)
{
if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) {
return;
@@ -175,10 +175,6 @@ BENCHFUN
}
}
- // calculate contrast based blend factors to reduce sharpening in regions with low contrast
- JaggedArray blend(W, H);
- float contrast = sharpenParam.contrast / 100.f;
- buildBlendMask(luminance, blend, W, H, contrast, 1.f);
JaggedArray* blurbuffer = nullptr;
if (sharpenParam.blurradius >= 0.25f) {
@@ -201,7 +197,7 @@ BENCHFUN
}
const float damping = sharpenParam.deconvdamping / 5.0;
const bool needdamp = sharpenParam.deconvdamping > 0;
- const double sigma = sharpenParam.deconvradius / scale;
+ const double sigma = sharpenParam.deconvradius / Scale;
const float amount = sharpenParam.deconvamount / 100.f;
#ifdef _OPENMP
@@ -254,11 +250,12 @@ void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpen
int W = lab->W, H = lab->H;
+ // calculate contrast based blend factors to reduce sharpening in regions with low contrast
+ JaggedArray blend(W, H);
+ float contrast = sharpenParam.contrast / 100.f;
+ buildBlendMask(lab->L, blend, W, H, contrast, 1.f);
+
if(showMask) {
- // calculate contrast based blend factors to reduce sharpening in regions with low contrast
- JaggedArray blend(W, H);
- float contrast = sharpenParam.contrast / 100.f;
- buildBlendMask(lab->L, blend, W, H, contrast, 1.f);
#ifdef _OPENMP
#pragma omp parallel for
#endif
@@ -274,7 +271,7 @@ void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpen
JaggedArray b2(W, H);
if (sharpenParam.method == "rld") {
- deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam);
+ deconvsharpening (lab->L, b2, blend, lab->W, lab->H, sharpenParam, scale);
return;
}
BENCHFUN
@@ -290,11 +287,6 @@ BENCHFUN
}
}
- // calculate contrast based blend factors to reduce sharpening in regions with low contrast
- JaggedArray blend(W, H);
- float contrast = sharpenParam.contrast / 100.f;
- buildBlendMask(lab->L, blend, W, H, contrast);
-
JaggedArray blur(W, H);
if (sharpenParam.blurradius >= 0.25f) {
@@ -886,11 +878,11 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask)
int W = ncie->W, H = ncie->H;
+ // calculate contrast based blend factors to reduce sharpening in regions with low contrast
+ JaggedArray blend(W, H);
+ float contrast = params->sharpening.contrast / 100.f;
+ buildBlendMask(ncie->sh_p, blend, W, H, contrast);
if(showMask) {
- // calculate contrast based blend factors to reduce sharpening in regions with low contrast
- JaggedArray blend(W, H);
- float contrast = params->sharpening.contrast / 100.f;
- buildBlendMask(ncie->sh_p, blend, W, H, contrast);
#ifdef _OPENMP
#pragma omp parallel for
#endif
@@ -903,9 +895,8 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask)
return;
}
-
if (params->sharpening.method == "rld") {
- deconvsharpening (ncie->sh_p, b2, ncie->W, ncie->H, params->sharpening);
+ deconvsharpening (ncie->sh_p, b2, blend, ncie->W, ncie->H, params->sharpening, scale);
return;
}
@@ -921,11 +912,6 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask)
}
}
- // calculate contrast based blend factors to reduce sharpening in regions with low contrast
- JaggedArray blend(W, H);
- float contrast = params->sharpening.contrast / 100.f;
- buildBlendMask(ncie->sh_p, blend, W, H, contrast);
-
#ifdef _OPENMP
#pragma omp parallel
#endif
diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc
index 6aca9b8eb..c7a4d1af7 100644
--- a/rtengine/ipsoftlight.cc
+++ b/rtengine/ipsoftlight.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifdef _OPENMP
diff --git a/rtengine/iptcpairs.h b/rtengine/iptcpairs.h
index e0b34180f..21099735a 100644
--- a/rtengine/iptcpairs.h
+++ b/rtengine/iptcpairs.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _IPTCPAIRS_
#define _IPTCPAIRS_
diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc
index 5b1e7c458..8dee92479 100644
--- a/rtengine/iptransform.cc
+++ b/rtengine/iptransform.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "rtengine.h"
#include "improcfun.h"
diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc
index ca938fbbe..a7199064a 100644
--- a/rtengine/ipvibrance.cc
+++ b/rtengine/ipvibrance.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "rt_math.h"
diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc
index ff7aefa19..07e9da85b 100644
--- a/rtengine/ipwavelet.cc
+++ b/rtengine/ipwavelet.cc
@@ -16,7 +16,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
// * 2014 Jacques Desmis
// * 2014 Ingo Weyrich
diff --git a/rtengine/jaggedarray.h b/rtengine/jaggedarray.h
index 01da776a6..59c1485d8 100644
--- a/rtengine/jaggedarray.h
+++ b/rtengine/jaggedarray.h
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc
index 81b1a4303..b31bc89a1 100644
--- a/rtengine/labimage.cc
+++ b/rtengine/labimage.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/labimage.h b/rtengine/labimage.h
index 28bb891a9..bcc2484ab 100644
--- a/rtengine/labimage.h
+++ b/rtengine/labimage.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _LABIMAGE_H_
#define _LABIMAGE_H_
diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc
index cf025ddbe..b456fc478 100644
--- a/rtengine/lcp.cc
+++ b/rtengine/lcp.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/lcp.h b/rtengine/lcp.h
index 2d9707907..30b7e5191 100644
--- a/rtengine/lcp.h
+++ b/rtengine/lcp.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with RawTherapee. If not, see .
+* along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/loadinitial.cc b/rtengine/loadinitial.cc
index 6192ca6db..00dbbf836 100644
--- a/rtengine/loadinitial.cc
+++ b/rtengine/loadinitial.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "rtengine.h"
#include "stdimagesource.h"
diff --git a/rtengine/median.h b/rtengine/median.h
index 30adbacb3..acd92235c 100644
--- a/rtengine/median.h
+++ b/rtengine/median.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*
* These median implementations from Flössie and Ingo Weyrich are inspired by this work:
*
diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc
index 28d187e4c..259e08565 100644
--- a/rtengine/myfile.cc
+++ b/rtengine/myfile.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "myfile.h"
#include
diff --git a/rtengine/myfile.h b/rtengine/myfile.h
index e4609c697..f2ed4150c 100644
--- a/rtengine/myfile.h
+++ b/rtengine/myfile.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _MYFILE_
#define _MYFILE_
diff --git a/rtengine/mytime.h b/rtengine/mytime.h
index a0ce15bc7..80fb0899a 100644
--- a/rtengine/mytime.h
+++ b/rtengine/mytime.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/noncopyable.h b/rtengine/noncopyable.h
index d34c42441..d915a6f78 100644
--- a/rtengine/noncopyable.h
+++ b/rtengine/noncopyable.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/opthelper.h b/rtengine/opthelper.h
index ce1f620e1..b65ede227 100644
--- a/rtengine/opthelper.h
+++ b/rtengine/opthelper.h
@@ -15,7 +15,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc
index 0c5b2d786..d0694fd11 100644
--- a/rtengine/pdaflinesfilter.cc
+++ b/rtengine/pdaflinesfilter.cc
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "pdaflinesfilter.h"
diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h
index 3ae406ec8..7f4c7985b 100644
--- a/rtengine/pdaflinesfilter.h
+++ b/rtengine/pdaflinesfilter.h
@@ -15,7 +15,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/pipettebuffer.cc b/rtengine/pipettebuffer.cc
index 4ad8afad1..d915381ef 100644
--- a/rtengine/pipettebuffer.cc
+++ b/rtengine/pipettebuffer.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "pipettebuffer.h"
diff --git a/rtengine/pipettebuffer.h b/rtengine/pipettebuffer.h
index ab9ba6197..01b24720c 100644
--- a/rtengine/pipettebuffer.h
+++ b/rtengine/pipettebuffer.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#pragma once
diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc
index b31ff62c9..4b93f3f61 100644
--- a/rtengine/pixelshift.cc
+++ b/rtengine/pixelshift.cc
@@ -16,7 +16,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
diff --git a/rtengine/pixelsmap.h b/rtengine/pixelsmap.h
index b359d61d9..f747c52d9 100644
--- a/rtengine/pixelsmap.h
+++ b/rtengine/pixelsmap.h
@@ -16,7 +16,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include
diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc
index e62a1adea..7216e6a34 100644
--- a/rtengine/previewimage.cc
+++ b/rtengine/previewimage.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "previewimage.h"
diff --git a/rtengine/previewimage.h b/rtengine/previewimage.h
index 26b9a85d2..71ddefe8a 100644
--- a/rtengine/previewimage.h
+++ b/rtengine/previewimage.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _PREVIEWIMAGE_
#define _PREVIEWIMAGE_
diff --git a/rtengine/processingjob.cc b/rtengine/processingjob.cc
index a377e3963..2f9c15196 100644
--- a/rtengine/processingjob.cc
+++ b/rtengine/processingjob.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include "processingjob.h"
diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h
index b2a81e4c2..004eb006f 100644
--- a/rtengine/processingjob.h
+++ b/rtengine/processingjob.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef _PROCESSINGJOB_
#define _PROCESSINGJOB_
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index bb6a30038..ca098f216 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#ifndef __PROCEVENT__
#define __PROCEVENT__
@@ -520,7 +520,8 @@ enum ProcEventCode {
EvWBEnabled = 490,
EvRGBEnabled = 491,
EvLEnabled = 492,
-// EvPixelShiftOneGreen = 493, can be reused
+ EvPdShrEnabled = 493,
+ EvPdShrMaskToggled = 494,
NUMOFEVENTS
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 436ad5e24..cacf5672b 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -14,7 +14,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with RawTherapee. If not, see .
+ * along with RawTherapee. If not, see .
*/
#include