Merge branch 'dev' into metadata-exiv2

- Rating (#5325) not yet implemented
This commit is contained in:
Flössie 2019-09-24 14:30:54 +02:00
commit 28f0bc14da
539 changed files with 7707 additions and 5098 deletions

1
.gitignore vendored
View File

@ -5,6 +5,7 @@
.project
.settings
.directory
.vscode
CMakeCache.txt
CMakeFiles

View File

@ -28,6 +28,7 @@ Development contributors, in last name alphabetical order:
Adam Reichold
Philip Rinn
Jan Rinze
Alberto Romei
Ben S.
Andrey Skvortsov
Fabio Suprani

View File

@ -136,6 +136,9 @@ option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting
option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF)
#option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF)
option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF)
set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library")
# Set installation directories:
if(WIN32 OR APPLE)
if(BUILD_BUNDLE)
@ -409,7 +412,7 @@ if(WITH_PROF)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-unused-result")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result")
if(OPTION_OMP)
find_package(OpenMP)
if(OPENMP_FOUND)
@ -584,6 +587,23 @@ int main()
return 0;
}" LENSFUN_HAS_LOAD_DIRECTORY)
set(TCMALLOC_LIB_DIR)
if(ENABLE_TCMALLOC)
if(TCMALLOC_LIB_DIR)
find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH)
else()
find_library(TCMALLOC_LIBRARIES tcmalloc)
endif()
if(TCMALLOC_LIBRARIES)
message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}")
else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE)
message(STATUS "tcmalloc not found")
endif()
else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE)
endif()
add_subdirectory(rtengine)
add_subdirectory(rtgui)

View File

@ -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 <http://www.gnu.org/licenses/>.
along with this program. If not, see <https://www.gnu.org/licenses/>.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

View File

@ -1,41 +1,41 @@
![RawTherapee logo](http://rawtherapee.com/images/logos/rawtherapee_logo_discuss.png)
![RawTherapee logo](https://www.rawtherapee.com/images/logos/rawtherapee_logo_discuss.png)
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

View File

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

View File

@ -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 <http://www.gnu.org/licenses/>.
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
include(CheckCXXSourceCompiles)

View File

@ -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 <http://www.gnu.org/licenses/>.
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
include(CheckCXXSourceCompiles)

View File

@ -8,34 +8,21 @@
<summary xml:lang="pl">Zaawansowany program do wywoływania zdjęć typu raw</summary>
<translation type="gettext">rawtherapee</translation>
<description>
<p>
RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of 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.
</p>
<p>
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). 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) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere.
</p>
<p>
Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software.
</p>
<p>RawTherapee is a powerful, cross-platform raw photo processing program. It is written mostly in C++ using a GTK+ front-end. It uses a patched version of 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.</p>
<p>RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as HDR DNG files and non-raw image formats (JPEG, TIFF and PNG). 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) as well as look up basic concepts which lie outside the scope of RawPedia, such as color balance, elsewhere.</p>
<p>Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as Digital Asset Management, printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the open-source community is sufficiently developed by now to offer all those peripheral features in other specialized software.</p>
</description>
<keywords>
<keyword>raw</keyword>
<keyword>photo</keyword>
<keyword>photography</keyword>
<keyword>develop</keyword>
<keyword>pp3</keyword>
<keyword>graphics</keyword>
</keywords>
<content_rating type="oars-1.0" />
<metadata_license>CC-BY-SA-4.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<url type="bugtracker">https://github.com/Beep6581/RawTherapee/issues/new</url>
<url type="bugtracker">https://github.com/Beep6581/RawTherapee/issues</url>
<url type="donation">https://www.paypal.me/rawtherapee</url>
<url type="help">http://rawpedia.rawtherapee.com/</url>
<url type="homepage">http://rawtherapee.com/</url>
<url type="help">https://rawpedia.rawtherapee.com</url>
<url type="homepage">https://www.rawtherapee.com</url>
<url type="translate">https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594</url>
<launchable type="desktop-id">rawtherapee.desktop</launchable>
<releases>
<release version="5.7" date="2019-09-10" type="stable"></release>
<release version="5.6" date="2019-04-20" type="stable"></release>
<release version="5.6~rc2" date="2019-04-17" type="development"></release>
<release version="5.6~rc1" date="2019-04-10" type="development"></release>
@ -47,16 +34,20 @@
</provides>
<screenshots>
<screenshot type="default">
<caption>HDR DNG of a misty morning in the countryside</caption>
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_1.jpg</image>
<caption>Color correction</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_drosera_rotundifolia.png</image>
</screenshot>
<screenshot>
<caption>Straight-out-of-camera vs RawTherapee</caption>
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_2.jpg</image>
<caption>File browser</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_file_browser.png</image>
</screenshot>
<screenshot>
<caption>RawTherapee using the Auto-Matched Tone Curve tool</caption>
<image width="1920" height="1080">http://rawtherapee.com/images/screenshots/rt540_3.jpg</image>
<screenshot type="default">
<caption>High dynamic range compression</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_field_sunset.png</image>
</screenshot>
<screenshot type="default">
<caption>Developing a film negative</caption>
<image width="1920" height="1080">https://rawtherapee.com/images/screenshots/rt57_film_negative.png</image>
</screenshot>
</screenshots>
<update_contact>contactus@rawtherapee.com</update_contact>

2
header
View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -16,6 +16,8 @@
"Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS DIGITAL REBEL XS"],
"Canon EOS 1200D": ["Canon EOS Kiss X70", "Canon EOS REBEL T5"],
"Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"],
"Canon EOS 2000D": ["Canon EOS 1500D", "Canon EOS Kiss X90", "Canon EOS Rebel T7"],
"Canon EOS 4000D": ["Canon EOS 3000D", "Canon EOS Rebel T100"],
"MINOLTA DYNAX 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"],
"MINOLTA DYNAX 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"],

View File

@ -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 @@
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>RawTherapee splash screen</dc:title>
<dc:date>2019-02-27</dc:date>
<dc:date />
<dc:creator>
<cc:Agent>
<dc:title>Maciej Dworak</dc:title>
@ -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</tspan></text>
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</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Eras Medium ITC';-inkscape-font-specification:'Eras Medium ITC';letter-spacing:1px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.07075834px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter155);enable-background:new"
@ -1048,73 +1048,88 @@
id="tspan611"
sodipodi:role="line">Raw</tspan></text>
<g
aria-label=". 6"
transform="matrix(0.24127119,0,0.01264448,0.24127122,4.1926296,267.35338)"
aria-label=". 7"
transform="matrix(0.24127119,0,0.01264448,0.24127122,4.1926291,267.35338)"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';letter-spacing:-7.09514618px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4749);enable-background:new"
id="text1152">
id="text191">
<path
d="m 286.21154,2.2370076 q 0.19276,-3.22882392 0.33734,-8.7226438 l 4.96371,0.072287 q 0.79516,0 4.19265,-0.072287 -0.19276,2.6264315 -0.43372,8.7226438 l -4.19265,-0.048191 q -0.45782,0 -4.86733,0.048191 z"
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"
id="path1154" />
id="path193" />
<path
d="m 315.05617,-18.750348 q 1.25297,-0.216861 2.38547,-0.216861 2.77101,0 4.96372,1.084306 2.2168,1.084307 3.3493,3.373398 1.1325,2.264996 1.1325,5.0600976 0,1.855369 -0.53011,3.5902595 -0.50601,1.7107947 -1.46984,3.1806325 -0.96382,1.4457421 -2.40957,2.60233572 -1.42164,1.13249798 -3.06015,1.73489048 -1.61441,0.6023925 -3.44569,0.8915409 -1.83127,0.3132441 -3.71073,0.3132441 -4.36133,0 -7.59015,-1.445742 -3.20473,-1.46983778 -4.67457,-3.9998864 -1.44574,-2.5541443 -1.44574,-5.6142983 0,-1.7589862 0.38553,-3.8553121 0.40963,-2.096326 1.75899,-4.98781 1.37345,-2.91558 3.73483,-6.698605 2.38548,-3.783025 4.84324,-6.915466 h 12.337 q -3.66255,4.216747 -4.86733,5.710681 -1.7108,2.144517 -3.22883,4.433609 -1.49393,2.264996 -2.50595,4.216748 -0.98792,1.951751 -1.6867,3.831216 -0.40963,1.108402 -0.60239,2.07223 -0.16867,0.9638283 -0.16867,1.8071778 0,1.132498 0.45782,2.1686131 0.45781,1.0361152 1.37345,1.6385077 0.91564,0.6023925 2.19271,0.6023925 1.20478,0 2.12042,-0.5542011 0.93973,-0.5782968 1.39755,-1.5662206 0.45782,-1.0120194 0.45782,-2.1204216 0,-1.9517518 -1.42165,-2.8432928 -1.39755,-0.891541 -2.7951,-0.891541 -0.43372,0 -1.30116,0.120479 0.5542,-0.891541 2.07223,-3.445686 z"
d="m 300.45417,2.2370076 q 1.42165,-2.7228142 2.77101,-5.15648 1.34936,-2.4336658 5.18057,-9.6623766 l 4.26494,-8.096155 q 0.43373,-0.84335 1.44574,-2.867389 -2.12042,-0.02409 -3.25291,-0.02409 -5.03601,0 -10.93945,0.313244 0.24095,-3.204728 0.33734,-7.39738 h 25.90288 l -0.36144,7.614241 -5.75887,11.059927 -3.66255,7.252806 q -1.46984,3.0360583 -3.27701,6.9636576 z"
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"
id="path1156" />
id="path195" />
</g>
<g
style="fill:#ffffff;enable-background:new"
transform="matrix(0.24804687,0,0,0.2480469,-16.632728,273.1232)"
id="g188">
id="g180">
<g
aria-label="Development"
transform="skewX(3)"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:sans-serif;text-align:end;letter-spacing:-1.06666672px;word-spacing:0px;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text186">
id="text178">
<path
d="m 491.97892,49.720543 q 0.18333,-1.9 0.25,-3.041667 0.1,-1.699999 0.2,-4.399999 0.075,-2.066667 0.075,-2.958333 v -0.975 q 0.975,0.025 1.68333,0.025 0.68333,0 1.79167,-0.03333 1.10833,-0.04167 2.08333,-0.04167 1.11667,0 1.95833,0.133333 0.84167,0.133333 1.56667,0.55 0.73333,0.416667 1.225,1.091666 0.49167,0.675 0.75,1.583334 0.25833,0.9 0.25833,1.858333 0,0.941667 -0.2,1.816667 -0.2,0.866666 -0.55833,1.566666 -0.35833,0.7 -0.84167,1.208333 -0.475,0.5 -1.09166,0.858334 -0.45834,0.266666 -0.925,0.416666 -0.46667,0.15 -1.275,0.241667 -0.9,0.1 -2.04167,0.1 l -3.36667,-0.025 q -0.475,0 -1.54166,0.025 z m 3.6,-2.508333 q 0.45833,0.04167 0.95833,0.04167 0.85,0 1.51667,-0.15 0.66666,-0.15 1.16666,-0.641666 0.50834,-0.491667 0.75,-1.258333 0.24167,-0.775 0.24167,-1.583334 0,-0.991666 -0.35833,-1.666666 -0.35834,-0.683334 -0.95834,-0.95 -0.59166,-0.266667 -1.61666,-0.266667 -0.6,0 -1.41667,0.05 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path190" />
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" />
<path
d="m 512.24558,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.825,-0.141667 -0.83333,-0.133333 -1.44166,-0.483333 -0.6,-0.35 -1.00834,-0.866667 -0.40833,-0.525 -0.625,-1.241667 -0.20833,-0.716666 -0.20833,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64167,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.125,-2.699999 h 2.75 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11667,0.516667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path192" />
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" />
<path
d="m 515.32058,49.720543 -0.88333,-2.733333 -1.99167,-5.775 q 0.95,0.01667 1.76667,0.01667 0.85,0 1.6,-0.01667 0.14167,0.575 0.55833,2.016667 0.41667,1.433333 0.91667,3.416666 l 0.21666,-0.691667 q 0.05,-0.125 0.39167,-1.066666 l 1.325,-3.675 q 0.9,0.01667 1.7,0.01667 0.825,0 1.71667,-0.01667 l -1.15,2.475 -2.14167,4.916666 -0.45833,1.116667 q -0.98334,-0.01667 -1.73334,-0.01667 -0.81666,0 -1.83333,0.01667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path194" />
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" />
<path
d="m 530.27891,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.82499,-0.141667 -0.83334,-0.133333 -1.44167,-0.483333 -0.6,-0.35 -1.00833,-0.866667 -0.40834,-0.525 -0.625,-1.241667 -0.20834,-0.716666 -0.20834,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64166,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.12499,-2.699999 h 2.74999 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11666,0.516667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path196" />
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" />
<path
d="m 531.04558,49.71221 0.15,-1.791667 0.325,-6.225 0.0917,-3.349999 q 1.15833,0.01667 1.74166,0.01667 0.75834,0 1.675,-0.01667 l -0.19166,2.558333 -0.30834,6.299999 -0.0667,2.516667 q -0.89167,-0.01667 -1.60834,-0.01667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path198" />
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" />
<path
d="m 540.25391,40.995543 q 1.03334,0 1.98334,0.316667 0.95833,0.316667 1.61666,0.916667 0.65834,0.591666 0.96667,1.391666 0.31667,0.791667 0.31667,1.708334 0,0.891666 -0.28334,1.699999 -0.275,0.8 -0.94166,1.508334 -0.66667,0.7 -1.7,1.05 -1.025,0.35 -2.175,0.35 -1.05834,0 -2.03334,-0.308334 -0.975,-0.308333 -1.63333,-0.9 -0.65,-0.591666 -0.98333,-1.416666 -0.325,-0.825 -0.325,-1.733334 0,-0.908333 0.31666,-1.733333 0.325,-0.825 1.01667,-1.483333 0.7,-0.658333 1.725,-1.008333 1.025,-0.358334 2.13333,-0.358334 z m -0.0583,2.45 q -0.53333,0 -0.95,0.275 -0.41667,0.275 -0.63333,0.808334 -0.20834,0.525 -0.20834,1.149999 0,0.916667 0.45834,1.408334 0.45833,0.483333 1.15,0.483333 0.525,0 0.94166,-0.275 0.41667,-0.283333 0.625,-0.825 0.21667,-0.55 0.21667,-1.175 0,-0.516666 -0.16667,-0.933333 -0.16666,-0.416667 -0.55,-0.666667 -0.375,-0.25 -0.88333,-0.25 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path200" />
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" />
<path
d="m 545.04558,53.620543 q 0.15833,-1.708334 0.26666,-3.408333 0.19167,-2.908334 0.25834,-4.875 0.075,-1.975 0.075,-3.908333 1.69166,-0.258334 2.65,-0.341667 0.95833,-0.09167 1.91666,-0.09167 1.2,0 2.20834,0.25 1.00833,0.25 1.61666,0.883334 0.61667,0.633333 0.925,1.508333 0.30834,0.875 0.30834,1.833333 0,0.875 -0.25,1.7 -0.25,0.816667 -0.76667,1.475 -0.51667,0.658333 -1.19167,0.975 -0.66666,0.316667 -1.49166,0.316667 -0.40834,0 -0.85,-0.08333 -0.43334,-0.075 -0.825,-0.225 -0.39167,-0.15 -0.65834,-0.3 -0.25833,-0.158333 -0.65,-0.45 l -0.0917,2.325 q -0.0583,1.6 -0.0583,2.416667 -0.96666,-0.01667 -1.65833,-0.01667 -0.6,0 -1.73333,0.01667 z m 3.84166,-10.066666 q -0.0667,0.375 -0.0917,0.616666 -0.025,0.233334 -0.05,0.641667 -0.025,0.4 -0.025,0.641666 0,0.683334 0.20833,1.15 0.21667,0.458334 0.59167,0.716667 0.38333,0.25 0.81666,0.25 0.45834,0 0.84167,-0.258333 0.38333,-0.266667 0.60833,-0.791667 0.225,-0.525 0.225,-1.183333 0,-0.891667 -0.475,-1.433333 -0.46666,-0.541667 -1.36666,-0.541667 -0.56667,0 -1.28334,0.191667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path202" />
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" />
<path
d="m 555.45391,49.720543 0.23334,-4.016667 0.13333,-3.141666 0.0167,-1.35 q 0.91666,0.01667 1.61666,0.01667 0.79167,0 1.54167,-0.01667 l -0.0583,1.108333 q 0.25833,-0.333333 0.43333,-0.508333 0.18333,-0.183333 0.44167,-0.341667 0.25833,-0.166666 0.53333,-0.258333 0.275,-0.1 0.61667,-0.158333 0.34166,-0.05833 0.71666,-0.05833 0.425,0 0.78334,0.075 0.35833,0.06667 0.61666,0.175 0.25834,0.108334 0.45,0.25 0.19167,0.141667 0.33334,0.325 0.15,0.175 0.34166,0.516667 0.36667,-0.533333 0.775,-0.808333 0.40834,-0.275 0.925,-0.4 0.525,-0.133334 1.075,-0.133334 0.725,0 1.36667,0.208334 0.64167,0.208333 1.05,0.725 0.41667,0.508333 0.41667,1.325 0,0.383333 -0.0583,1.158333 -0.05,0.775 -0.15,2.666666 -0.0917,1.883334 -0.1,2.641667 -0.76666,-0.01667 -1.48333,-0.01667 -0.875,0 -1.83333,0.01667 0.0833,-1.058333 0.16666,-2.65 0.0917,-1.6 0.0917,-2.216666 0,-0.533334 -0.125,-0.791667 -0.125,-0.266667 -0.325,-0.358333 -0.19167,-0.1 -0.425,-0.1 -0.25,0 -0.43333,0.09167 -0.2,0.1 -0.35,0.308334 -0.2,0.275 -0.325,0.691666 -0.1,0.325 -0.15834,0.991667 -0.0583,0.683333 -0.0917,1.8 l -0.0667,2.233333 q -0.89167,-0.01667 -1.60833,-0.01667 -0.73334,0 -1.725,0.01667 0.075,-0.741667 0.175,-2.491667 0.1,-1.75 0.1,-2.341666 0,-0.5 -0.1,-0.75 -0.1,-0.25 -0.28334,-0.4 -0.175,-0.15 -0.475,-0.15 -0.325,0 -0.56666,0.191667 -0.24167,0.191666 -0.41667,0.55 -0.16667,0.358333 -0.24167,0.991666 -0.0667,0.625 -0.125,1.916667 -0.0583,1.291666 -0.075,2.483333 -1.00833,-0.01667 -1.63333,-0.01667 -0.69167,0 -1.71667,0.01667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path204" />
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" />
<path
d="m 578.51224,47.203876 q -0.10833,0.5 -0.41666,2.416667 -0.96667,0.191667 -1.625,0.25 -0.65834,0.06667 -1.33334,0.06667 -0.99166,0 -1.825,-0.141667 -0.83333,-0.133333 -1.44166,-0.483333 -0.6,-0.35 -1.00834,-0.866667 -0.40833,-0.525 -0.625,-1.241667 -0.20833,-0.716666 -0.20833,-1.475 0,-1.066666 0.425,-2.083333 0.425,-1.025 1.09167,-1.6 0.675,-0.575 1.55,-0.816666 0.875,-0.241667 1.79166,-0.241667 0.95,0 1.80834,0.225 0.86666,0.216667 1.46666,0.766667 0.6,0.55 0.85,1.241666 0.25834,0.691667 0.25834,1.491667 0,0.475 -0.10834,1.058333 l -5.84166,0.0083 q -0.008,0.133334 -0.008,0.241667 0,0.9 0.64167,1.325 0.64167,0.425 1.56667,0.425 0.55,0 1.25,-0.125 0.70833,-0.133333 1.74166,-0.441667 z m -5.125,-2.699999 h 2.75 q 0.008,-0.141667 0.008,-0.241667 0,-0.433333 -0.15834,-0.741667 -0.15,-0.308333 -0.44166,-0.45 -0.28334,-0.141666 -0.64167,-0.141666 -0.25,0 -0.48333,0.08333 -0.23334,0.075 -0.425,0.233333 -0.18334,0.15 -0.30834,0.35 -0.125,0.2 -0.18333,0.391667 -0.0583,0.183333 -0.11667,0.516667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path206" />
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" />
<path
d="m 579.21224,49.720543 q 0.24167,-1.891667 0.36667,-4.175 0.13333,-2.291666 0.15833,-4.333333 1,0.01667 1.725,0.01667 0.84167,0 1.61667,-0.01667 l -0.0833,1.133333 q 0.275,-0.308333 0.475,-0.483333 0.2,-0.183333 0.49166,-0.35 0.3,-0.175 0.63334,-0.283333 0.33333,-0.108334 0.725,-0.166667 0.4,-0.06667 0.83333,-0.06667 0.6,0 1.16667,0.133334 0.575,0.125 0.95833,0.366666 0.38333,0.233334 0.64167,0.591667 0.25833,0.35 0.34166,0.758333 0.0833,0.408334 0.0833,0.841667 0,0.316667 -0.0667,1.366667 l -0.14167,3.016666 q -0.0417,0.891667 -0.0417,1.65 -0.84167,-0.01667 -1.575,-0.01667 -0.99167,0 -1.80834,0.01667 0.075,-0.758333 0.15834,-2.25 0.0833,-1.5 0.0833,-2.108333 0,-0.941667 -0.36667,-1.308333 -0.35833,-0.375 -0.90833,-0.375 -0.48333,0 -0.91667,0.316666 -0.425,0.316667 -0.65833,0.925 -0.23333,0.6 -0.33333,1.983333 -0.0917,1.383334 -0.125,2.816667 -0.83334,-0.01667 -1.625,-0.01667 -0.83334,0 -1.80834,0.01667 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path208" />
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" />
<path
d="m 596.02891,47.270543 q -0.15,0.7 -0.25833,1.366667 l -0.18334,1.016666 q -0.825,0.183334 -1.29166,0.233334 -0.45834,0.05 -0.89167,0.05 -0.70833,0 -1.25833,-0.125 -0.55,-0.116667 -0.91667,-0.433334 -0.36667,-0.325 -0.5,-0.741666 -0.13333,-0.416667 -0.13333,-0.883334 0,-0.08333 0.008,-0.291666 0.008,-0.216667 0.0583,-0.95 l 0.18334,-2.883333 h -1.3 q 0.0417,-0.575 0.075,-1.516667 l 0.025,-0.775 h 1.38333 q 0.05,-0.383333 0.125,-1.675 l 1.425,-0.291666 q 0.39167,-0.075 1.66667,-0.383334 -0.0583,1.091667 -0.0833,2.35 h 1.9 q -0.0667,1.733333 -0.0667,2.291667 h -1.91667 l -0.1,2.083333 q -0.0167,0.466666 -0.0167,0.6 0,0.4 0.0833,0.666666 0.0917,0.266667 0.30833,0.383334 0.225,0.116666 0.49167,0.116666 0.2,0 0.41666,-0.025 0.21667,-0.03333 0.76667,-0.183333 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'Eras Bold ITC';-inkscape-font-specification:'Eras Bold ITC Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px"
id="path210" />
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" />
</g>
</g>
<g
style="fill:#ffffff;enable-background:new"
transform="matrix(0.24804687,0,0,0.2480469,-127.75775,273.1232)"
id="g220" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 89 KiB

View File

@ -1314,6 +1314,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1421,7 +1423,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TAB_INSPECT; Inspect
@ -1447,6 +1449,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_GRADIENT;Graduated filter
@ -1851,6 +1854,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: <b>-</b>
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -1361,6 +1361,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1466,7 +1468,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: <b>theme-based</b>\nShortcut: <b>9</b>
@ -1485,6 +1487,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!OPTIONS_DEFRAW_MISSING;The default profile for <b>raw photos</b> could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"<b>%1</b>" will be used instead.
!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_LOCALCONTRAST;Local contrast
!PARTIALPASTE_METADATA;Metadata mode
!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1798,6 +1801,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: <b>-</b>
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -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<b>"%1"</b>\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: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Barvy
MAIN_TAB_COLOR_TOOLTIP;Zkratka: <b>Alt-c</b>
MAIN_TAB_DETAIL;Detaily
@ -2323,4 +2323,13 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio

View File

@ -82,6 +82,7 @@
#81 15.04.2019 Erweiterung (TooWaBoo) RT 5.6
#82 25.05.2019 Erweiterung (TooWaBoo) RT 5.6
#83 06.07.2019 Erweiterung (TooWaBoo) RT 5.6
#84 18.07.2019 Erweiterung (TooWaBoo) RT 5.6
ABOUT_TAB_BUILD;Version
ABOUT_TAB_CREDITS;Danksagungen
@ -241,6 +242,8 @@ FILEBROWSER_POPUPRANK2;Bewertung 2 **
FILEBROWSER_POPUPRANK3;Bewertung 3 ***
FILEBROWSER_POPUPRANK4;Bewertung 4 ****
FILEBROWSER_POPUPRANK5;Bewertung 5 *****
FILEBROWSER_POPUPREMOVE;Unwiderruflich löschen
FILEBROWSER_POPUPREMOVEINCLPROC;Unwiderruflich löschen\n(einschl. aller Dateien der Stabelverarbeitung)
FILEBROWSER_POPUPRENAME;Umbenennen
FILEBROWSER_POPUPSELECTALL;Alle auswählen
FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben
@ -267,6 +270,7 @@ FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen.\nTaste: <b>d</b>
FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen.\nTaste: <b>7</b>
FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen.\nTaste: <b>6</b>
FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: <b>i</b>\nIm Ein-Reitermodus:\nTaste: <b>Alt</b> + <b>i</b>
FILEBROWSER_SHOWNOTTRASHHINT;Nur Bilder außerhalb des Papierkorbs anzeigen.
FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird.
FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen.\nTaste: <b>1</b>
FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen.\nTaste: <b>2</b>
@ -825,6 +829,8 @@ HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen
HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;(Sensor-Matrix)\nFarbinterpolation\nKontrastschwelle
HISTORY_MSG_FILMNEGATIVE_ENABLED;(Filmnegativ)
HISTORY_MSG_FILMNEGATIVE_VALUES;(Filmnegativ) - Werte
HISTORY_MSG_HISTMATCHING;(Belichtung)\nAuto-Tonwertkurve
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;(Farbmanagement)\nAusgabeprofil\nVorlagen
HISTORY_MSG_ICM_OUTPUT_TEMP;(Farbmanagement)\nAusgabeprofil\nIccV4-Illuminant D
@ -978,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<b>"%1"</b>\n\nStellen Sie sicher, dass das Verzeichnis existiert und dass Sie Schreibrechte besitzen.
MAIN_TAB_ADVANCED;Erweitert
MAIN_TAB_ADVANCED_TOOLTIP;Taste: <b>Alt</b> + <b>w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Taste: <b>Alt</b> + <b>a</b>
MAIN_TAB_COLOR;Farbe
MAIN_TAB_COLOR_TOOLTIP;Taste: <b>Alt</b> + <b>c</b>
MAIN_TAB_DETAIL;Details
@ -1061,6 +1067,7 @@ PARTIALPASTE_EQUALIZER;Wavelet
PARTIALPASTE_EVERYTHING;Alle Parameter aktivieren / deaktivieren
PARTIALPASTE_EXIFCHANGES;Änderungen an Exif-Daten
PARTIALPASTE_EXPOSURE;Belichtung
PARTIALPASTE_FILMNEGATIVE;Filmnegativ
PARTIALPASTE_FILMSIMULATION;Filmsimulation
PARTIALPASTE_FLATFIELDAUTOSELECT;Weißbild: Automatische Auswahl
PARTIALPASTE_FLATFIELDBLURRADIUS;Weißbild: Unschärferadius
@ -1714,6 +1721,12 @@ TP_EXPOSURE_TCMODE_STANDARD;Standard
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Gewichteter Standard
TP_EXPOS_BLACKPOINT_LABEL;Schwarzpunkt
TP_EXPOS_WHITEPOINT_LABEL;Weißpunkt
TP_FILMNEGATIVE_BLUE;Blauverhältnis
TP_FILMNEGATIVE_GREEN;Bezugsexponent (Kontrast)
TP_FILMNEGATIVE_GUESS_TOOLTIP;Berechnet die Exponenten durch Auswahl zweier neutraler\nReferenzpunkte im Bild. Weiß (Hellgrau) und Schwarz (Dunkelgrau).\nDie Reihenfolge spielt keine Rolle. Die Exponenten werden aktualisiert,\nnachdem der zweite Punkt ausgewählt wurde.
TP_FILMNEGATIVE_LABEL;Filmnegativ
TP_FILMNEGATIVE_PICK;Weißen und schwarzen Bereich auswählen
TP_FILMNEGATIVE_RED;Rotverhältnis
TP_FILMSIMULATION_LABEL;Filmsimulation
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee sucht nach Hald-CLUT-Bildern, die für die Filmsimulation benötigt werden, in einem Ordner, der viel Zeit benötigt.\nGehen Sie zu\n< Einstellungen > Bildbearbeitung > Filmsimulation >\nund prüfen Sie welcher Order benutzt wird. Wählen Sie den Ordner aus, der nur die Hald-CLUT-Bilder beinhaltet, oder einen leeren Ordner, wenn Sie die Filsimulation nicht verwenden möchten.\n\nWeitere Informationen über die Filmsimulation finden Sie auf RawPedia.\n\nMöchten Sie die Suche beenden?
TP_FILMSIMULATION_STRENGTH;Intensität
@ -2358,10 +2371,3 @@ ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen.\nTaste: <b>Alt</b> + <b>f</b>
ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: <b>+</b>
ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
FILEBROWSER_POPUPREMOVE;Unwiderruflich löschen
FILEBROWSER_POPUPREMOVEINCLPROC;Unwiderruflich löschen\n(einschl. aller Dateien der Stabelverarbeitung)
FILEBROWSER_SHOWNOTTRASHHINT;Nur Bilder außerhalb des Papierkorbs anzeigen.

View File

@ -838,6 +838,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -988,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<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
!MAIN_TAB_DETAIL;Detail
!MAIN_TAB_DETAIL_TOOLTIP;Shortcut: <b>Alt-d</b>
@ -1064,6 +1066,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PARTIALPASTE_EVERYTHING;Everything
!PARTIALPASTE_EXIFCHANGES;Exif
!PARTIALPASTE_EXPOSURE;Exposure
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection
!PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius
@ -1665,6 +1668,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -748,6 +748,8 @@
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -900,7 +902,7 @@
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_COLOR;Color
!MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
!MAIN_TAB_DETAIL;Detail
@ -983,6 +985,7 @@
!PARTIALPASTE_EVERYTHING;Everything
!PARTIALPASTE_EXIFCHANGES;Exif
!PARTIALPASTE_EXPOSURE;Exposure
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection
!PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius
@ -1636,6 +1639,12 @@
!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -954,7 +954,7 @@ MAIN_MSG_SETPATHFIRST;Para poder usar esta función, primero tiene que establece
MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\n<b>Por favor cierre un editor para continuar.</b>
MAIN_MSG_WRITEFAILED;Falla al escribir\n\n<b>"%1"</b>\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: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Tecla de Atajo: <b>Alt-C</b>
MAIN_TAB_DETAIL;Detalle
@ -2321,10 +2321,13 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
!MAIN_FRAME_PLACES_DEL;Remove
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!PREFERENCES_CHUNKSIZES;Tiles per thread
!PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic
@ -2342,6 +2345,12 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile

View File

@ -889,7 +889,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<b>"%1"</b>\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire.
MAIN_TAB_ADVANCED;Avancé
MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Couleur
MAIN_TAB_COLOR_TOOLTIP;Raccourci:<b>Alt-c</b>
MAIN_TAB_DETAIL;Détail
@ -2266,7 +2266,10 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!MAIN_FRAME_PLACES_DEL;Remove
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PROGRESSBAR_DECODING;Decoding...
!PROGRESSBAR_GREENEQUIL;Green equilibration...
!PROGRESSBAR_HLREC;Highlight reconstruction...
@ -2275,6 +2278,12 @@ ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile

View File

@ -1539,6 +1539,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1638,7 +1640,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!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: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TAB_INSPECT; Inspect
@ -1652,6 +1654,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_LOCALCONTRAST;Local contrast
@ -1903,6 +1906,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: <b>-</b>
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -152,8 +152,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;カラー・ラベル\n\nドロップダウン・
FILEBROWSER_COPYPROFILE;プロファイルをコピー
FILEBROWSER_CURRENT_NAME;現在の名前:
FILEBROWSER_DARKFRAME;ダークフレーム
FILEBROWSER_DELETEDIALOG_ALL;ゴミ箱の中にある<b>%1</b>枚のファイル全てを<b>完全<b>に削除しますか?
FILEBROWSER_DELETEDIALOG_HEADER;ファイル削除確認
FILEBROWSER_DELETEDIALOG_SELECTED;選択した<b>%1</b>枚のファイルを<b>完全<b>に削除しますか?
FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;キュー処理に保持されているファイルを<b>含め</b>、選択した<b>%1</b>枚のファイルを<b>完全<b>に削除しますか?
FILEBROWSER_EMPTYTRASH;ゴミ箱を空にする
FILEBROWSER_EMPTYTRASHHINT;ゴミ箱の中のファイルを全て<b>完全に</b> 削除します
FILEBROWSER_EXTPROGMENU;..で開く
FILEBROWSER_FLATFIELD;フラットフィールド
FILEBROWSER_MOVETODARKFDIR;ダークフレーム・ディレクトリに移動
@ -187,6 +191,8 @@ FILEBROWSER_POPUPRANK2;ランク 2 **
FILEBROWSER_POPUPRANK3;ランク 3 ***
FILEBROWSER_POPUPRANK4;ランク 4 ****
FILEBROWSER_POPUPRANK5;ランク 5 *****
FILEBROWSER_POPUPREMOVE;完全に削除
FILEBROWSER_POPUPREMOVEINCLPROC;キュー処理に保持されているファイルを含めて完全に削除
FILEBROWSER_POPUPRENAME;名前変更
FILEBROWSER_POPUPSELECTALL;全選択
FILEBROWSER_POPUPTRASH;ゴミ箱へ移動
@ -213,6 +219,7 @@ FILEBROWSER_SHOWDIRHINT;全ての絞り込みをクリア\nショートカット
FILEBROWSER_SHOWEDITEDHINT;編集済み画像を表示\nショートカット: <b>7</b>
FILEBROWSER_SHOWEDITEDNOTHINT;未編集画像を表示\nショートカット: <b>6</b>
FILEBROWSER_SHOWEXIFINFO;EXIF情報を表示\nショートカット: <b>i</b>\n\nシングル・エディタ・タブのショートカット: <b>Alt-i</b>
FILEBROWSER_SHOWNOTTRASHHINT;ゴミ箱の中にある画像だけを表示
FILEBROWSER_SHOWORIGINALHINT;元画像だけを表示\n\nファイル名は同じだが拡張子が異なる画像がある場合は、環境設定の中のファイルブラウザタブにある拡張子リストの上位に位置する拡張子を持った画像を元画像とする。
FILEBROWSER_SHOWRANK1HINT;1つ星ランクを表示\nショートカット: <b>1</b>
FILEBROWSER_SHOWRANK2HINT;2つ星ランクを表示\nショートカット: <b>2</b>
@ -771,6 +778,8 @@ HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示
HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値
HISTORY_MSG_FILMNEGATIVE_ENABLED;ネガフィルム
HISTORY_MSG_FILMNEGATIVE_VALUES;ネガフィルムの値
HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ
HISTORY_MSG_ICM_OUTPUT_TEMP;出力 - ICC-v4 光源 D
@ -924,7 +933,7 @@ MAIN_MSG_SETPATHFIRST;この関数を使用するには、最初に環境設定
MAIN_MSG_TOOMANYOPENEDITORS;編集画面が多すぎます\n操作を続けるには何れかの画面を閉じてください
MAIN_MSG_WRITEFAILED;書き込みに失敗しました\n\n<b>"%1"</b>\n\nフォルダが在るか書き込み権限を持っているか確認してください
MAIN_TAB_ADVANCED;高度な機能
MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;カラー
MAIN_TAB_COLOR_TOOLTIP;ショートカット: <b>Alt-c</b>
MAIN_TAB_DETAIL;CbDL
@ -1007,6 +1016,7 @@ PARTIALPASTE_EQUALIZER;ウェーブレット
PARTIALPASTE_EVERYTHING;すべて
PARTIALPASTE_EXIFCHANGES;exifデータを変える
PARTIALPASTE_EXPOSURE;露光量
PARTIALPASTE_FILMNEGATIVE;ネガフィルム
PARTIALPASTE_FILMSIMULATION;フィルムシミュレーション
PARTIALPASTE_FLATFIELDAUTOSELECT;フラットフィールド 自動選択
PARTIALPASTE_FLATFIELDBLURRADIUS;フラットフィールド ぼかし半径
@ -1065,6 +1075,7 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;カラーピッカーのフォント
PREFERENCES_APPEARANCE_CROPMASKCOLOR;切り抜きのマスクカラー
PREFERENCES_APPEARANCE_MAINFONT;メインフォント
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;ナビゲーターのガイドカラー
PREFERENCES_APPEARANCE_PSEUDOHIDPI;擬似HiDPIモード
PREFERENCES_APPEARANCE_THEME;テーマ
PREFERENCES_APPLNEXTSTARTUP;要再起動
PREFERENCES_AUTOMONPROFILE;OSのメインモニター・プロファイルを使用
@ -1284,6 +1295,7 @@ QUEUE_FORMAT_TITLE;ファイル形式
QUEUE_LOCATION_FOLDER;フォルダに保存
QUEUE_LOCATION_TEMPLATE;テンプレートを使う
QUEUE_LOCATION_TEMPLATE_TOOLTIP;次の書式文字を使用することができます:\n<b>%f</b>, <b>%d1</b>, <b>%d2</b>, ..., <b>%p1</b>, <b>%p2</b>, ...<b>%r</b>\n\nこれらの書式文字は画像パス名のそれぞれ別々の部分、画像の属性を参照します\n\n例えば、次の画像を処理中の場合は:\n\n<b><i>/home/tom/photos/2010-10-31/dsc0042.nef</i></b>\n書式文字の意味するものは:\n<b>%d4</b> = <i>home</i>\n<b>%d3</b> = <i>tom</i>\n<b>%d2</b> = <i>photos</i>\n<b>%d1</b> = <i>2010-10-31</i>\n<b>%f</b> = <i>dsc0042</i>\n<b>%p1</b> = <i>/home/tom/photos/2010-10-31/</i>\n<b>%p2</b> = <i>/home/tom/photos/</i>\n<b>%p3</b> = <i>/home/tom/</i>\n<b>%p4</b> = <i>/home/</i>\n\n<b>%r</b>は写真のランクに置き換えられます。評価なしはrは'0 'に置換されます。画像がごみ箱にある場合、rは'X'に置換されます\n\n元画像と同じ場所に出力したい場合はこのように書きます:\n<b>%p1/%f</b>\n\n処理画像のディレクトリ下 "<i>converted</i>" という名前のディレクトリに出力画像を保存したい場合このように書きます:\n<b>%p1/converted/%f</b>\n\n"<i>/home/tom/photos/converted/2010-10-31</i>" という名前のディレクトリに出力画像を保存したい場合はこのように書きます:\n<b>%p2/converted/%d1/%f</b>
QUEUE_LOCATION_TITLE;出力の場所
QUEUE_STARTSTOP_TOOLTIP;キューにある画像の現像を始める、或いは中止する\n\nショートカット: <b>Ctrl</b>+<b>s</b>
SAMPLEFORMAT_0;データ形式不明
SAMPLEFORMAT_1;符号なし8ビット
@ -1658,6 +1670,12 @@ TP_EXPOSURE_TCMODE_STANDARD;標準
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加重平均
TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント
TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント
TP_FILMNEGATIVE_BLUE;ブルーの比率
TP_FILMNEGATIVE_GREEN;参考指数(コントラスト)
TP_FILMNEGATIVE_GUESS_TOOLTIP;画像の中でニュートラルな参考ポイントを2点選んで指数を計算します;白い(明るいグレー)1点と黒い(暗いグレー)1点を選びます。順番は関係ありません。2つ目のポイントが選択されると指数が更新されます。
TP_FILMNEGATIVE_LABEL;ネガフィルム
TP_FILMNEGATIVE_PICK;白と黒のポイントをピックアップする
TP_FILMNEGATIVE_RED;レッドの比率
TP_FILMSIMULATION_LABEL;フィルムシミュレーション
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されていますプログラムに組み込むにはフォルダーが大き過ぎるため。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか
TP_FILMSIMULATION_STRENGTH;強さ
@ -2301,16 +2319,3 @@ ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカッ
ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: <b>+</b>
ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: <b>-</b>
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to <b>permanently</b> delete all <b>%1</b> files in trash?
!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to <b>permanently</b> delete the selected <b>%1</b> files?
!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to <b>permanently</b> delete the selected <b>%1</b> files, <b>including</b> a queue-processed version?
!FILEBROWSER_EMPTYTRASHHINT;<b>Permanently</b> delete all files in trash.
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!QUEUE_LOCATION_TITLE;Output Location

View File

@ -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 <http://www.gnu.org/licenses/>.
# along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
#

View File

@ -1248,6 +1248,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1355,7 +1357,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
!MAIN_MSG_WRITEFAILED;Failed to write\n<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
!MAIN_TAB_ADVANCED;Advanced
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TAB_INSPECT; Inspect
@ -1385,6 +1387,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_GRADIENT;Graduated filter
@ -1816,6 +1819,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés <b>-</b>
!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -2036,6 +2036,8 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -2109,7 +2111,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!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: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
@ -2119,6 +2121,7 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!OPTIONS_DEFRAW_MISSING;The default profile for <b>raw photos</b> could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"<b>%1</b>" will be used instead.
!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_LOCALCONTRAST;Local contrast
!PARTIALPASTE_METADATA;Metadata mode
!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -2230,6 +2233,12 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: <b>-</b>
!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors
!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve
!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_ICM_WORKING_TRC;Tone response curve:
!TP_ICM_WORKING_TRC_CUSTOM;Custom
!TP_ICM_WORKING_TRC_GAMMA;Gamma

View File

@ -1621,6 +1621,8 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1720,7 +1722,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!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: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TAB_INSPECT; Inspect
@ -1733,6 +1735,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_LOCALCONTRAST;Local contrast
!PARTIALPASTE_METADATA;Metadata mode
!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1929,6 +1932,12 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: <b>-</b>
!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
!TP_EXPOSURE_TCMODE_LUMINANCE;Luminance
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.

View File

@ -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<b>"%1"</b>\n\nVerifique se a pasta existe e se tem permissão para gravar nela.
MAIN_TAB_ADVANCED;Avançado
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Cor
MAIN_TAB_COLOR_TOOLTIP;Atalho: <b>Alt-c</b>
MAIN_TAB_DETAIL;Detalhe
@ -2264,7 +2264,10 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: <b>-</b>
!FILEBROWSER_POPUPREMOVE;Delete permanently
!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!MAIN_FRAME_PLACES_DEL;Remove
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!PROGRESSBAR_DECODING;Decoding...
!PROGRESSBAR_GREENEQUIL;Green equilibration...
@ -2274,6 +2277,12 @@ ZOOMPANEL_ZOOMOUT;Afastar\nAtalho: <b>-</b>
!PROGRESSBAR_RAWCACORR;Raw CA correction...
!QUEUE_LOCATION_TITLE;Output Location
!TP_CROP_PPI;PPI
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_MODE_HEADER;Lens Profile

View File

@ -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<b>"%1"</b>\n\nVerifique se a pasta existe e se tens permissão para gravar nela.
MAIN_TAB_ADVANCED;Avançado
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Atalho: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Cor
MAIN_TAB_COLOR_TOOLTIP;Atalho: <b>Alt-c</b>
MAIN_TAB_DETAIL;Detalhe
@ -2258,7 +2258,10 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: <b>-</b>
!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!MAIN_FRAME_PLACES_DEL;Remove
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched.
!PROGRESSBAR_DECODING;Decoding...
@ -2271,6 +2274,12 @@ ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: <b>-</b>
!TP_COLORTONING_LABREGION_OFFSET;Offset
!TP_COLORTONING_LABREGION_POWER;Power
!TP_CROP_PPI;PPI
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.

View File

@ -589,7 +589,7 @@ MAIN_MSG_QOVERWRITE;Вы хотите перезаписать его?
MAIN_MSG_SETPATHFIRST;Прежде необходимо установить целевой каталог в настройках\nчтоб использовать эту функцию!
MAIN_MSG_WRITEFAILED;Не удалось записать\n\n<b>"%1"</b>.\n\nУбедитесь, что каталог существует и у вас есть права на запись в него.
MAIN_TAB_ADVANCED;Дополнительные
MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: <b>Alt-W</b>
MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Цвет
MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: <b>Alt-C</b>
MAIN_TAB_DETAIL;Детализация
@ -1706,6 +1706,8 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type
@ -1775,6 +1777,7 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
@ -1974,6 +1977,12 @@ ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: <b>-</b>
!TP_DISTORTION_AUTO_TIP;Automatically corrects lens distortion in raw files by matching it against the embedded JPEG image if one exists and has had its lens disortion auto-corrected by the camera.
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast.

View File

@ -1514,6 +1514,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1612,7 +1614,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!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: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TAB_INSPECT; Inspect
@ -1636,6 +1638,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_LOCALCONTRAST;Local contrast
@ -1902,6 +1905,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике <b>-</b>
!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual
!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FILMSIMULATION_LABEL;Film Simulation
!TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
!TP_FILMSIMULATION_STRENGTH;Strength

View File

@ -1863,6 +1863,8 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -1961,7 +1963,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!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: <b>Alt-w</b>
!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
!MAIN_TAB_FAVORITES;Favorites
!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: <b>Alt-u</b>
!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: <b>middle grey</b>\nShortcut: <b>9</b>
@ -1972,6 +1974,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_DEHAZE;Haze removal
!PARTIALPASTE_FILMNEGATIVE;Film Negative
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_LOCALCONTRAST;Local contrast
!PARTIALPASTE_METADATA;Metadata mode
@ -2117,6 +2120,12 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: <b>-</b>
!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors
!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve
!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
!TP_FILMNEGATIVE_BLUE;Blue ratio
!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
!TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
!TP_FILMNEGATIVE_LABEL;Film Negative
!TP_FILMNEGATIVE_PICK;Pick white and black spots
!TP_FILMNEGATIVE_RED;Red ratio
!TP_FLATFIELD_CLIPCONTROL;Clip control
!TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast.
!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one.

View File

@ -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
@ -743,10 +744,13 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
@ -761,6 +765,13 @@ 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_PDSHARPEN_RADIUS_BOOST;CAS - Corner radius boost
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
@ -771,6 +782,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
@ -899,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<b>"%1"</b>\n\nMake sure that the folder exists and that you have write permission to it.
MAIN_TAB_ADVANCED;Advanced
MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt-w</b>
MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: <b>Alt</b>-<b>a</b>
MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Shortcut: <b>Alt-c</b>
MAIN_TAB_DETAIL;Detail
@ -982,6 +994,7 @@ PARTIALPASTE_EQUALIZER;Wavelet levels
PARTIALPASTE_EVERYTHING;Everything
PARTIALPASTE_EXIFCHANGES;Exif
PARTIALPASTE_EXPOSURE;Exposure
PARTIALPASTE_FILMNEGATIVE;Film Negative
PARTIALPASTE_FILMSIMULATION;Film simulation
PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection
PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius
@ -1527,6 +1540,7 @@ TP_DEFRINGE_RADIUS;Radius
TP_DEFRINGE_THRESHOLD;Threshold
TP_DEHAZE_DEPTH;Depth
TP_DEHAZE_LABEL;Haze Removal
TP_DEHAZE_LUMINANCE;Luminance only
TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
TP_DEHAZE_STRENGTH;Strength
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones
@ -1635,6 +1649,12 @@ TP_EXPOSURE_TCMODE_STANDARD;Standard
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard
TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points
TP_EXPOS_WHITEPOINT_LABEL;Raw White Points
TP_FILMNEGATIVE_BLUE;Blue ratio
TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
TP_FILMNEGATIVE_GUESS_TOOLTIP;Calculate exponents by picking two neutral reference spots in the image; one white (light gray) and one black (dark gray). The order does not matter. The exponents will be updated after the second spot is picked.
TP_FILMNEGATIVE_LABEL;Film Negative
TP_FILMNEGATIVE_PICK;Pick white and black spots
TP_FILMNEGATIVE_RED;Red ratio
TP_FILMSIMULATION_LABEL;Film Simulation
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee is configured to look for Hald CLUT images, which are used for the Film Simulation tool, in a folder which is taking too long to load.\nGo to Preferences > Image Processing > Film Simulation\nto see which folder is being used. You should either point RawTherapee to a folder which contains only Hald CLUT images and nothing more, or to an empty folder if you don't want to use the Film Simulation tool.\n\nRead the Film Simulation article in RawPedia for more information.\n\nDo you want to cancel the scan now?
TP_FILMSIMULATION_STRENGTH;Strength
@ -1783,6 +1803,7 @@ 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_PERSPECTIVE_HORIZONTAL;Horizontal
TP_PERSPECTIVE_LABEL;Perspective
TP_PERSPECTIVE_VERTICAL;Vertical
@ -2011,12 +2032,14 @@ 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
TP_SHARPENING_METHOD;Method
TP_SHARPENING_ONLYEDGES;Sharpen only edges
TP_SHARPENING_RADIUS;Radius
TP_SHARPENING_RADIUS_BOOST;Corner radius boost
TP_SHARPENING_RLD;RL Deconvolution
TP_SHARPENING_RLD_AMOUNT;Amount
TP_SHARPENING_RLD_DAMPING;Damping

View File

@ -21,3 +21,6 @@ DCPIlluminant=0
[RAW]
CA=true
[PostDemosaicSharpening]
Enabled=true

View File

@ -23,3 +23,6 @@ DCPIlluminant=0
[RAW]
CA=true
[PostDemosaicSharpening]
Enabled=true

View File

@ -1,8 +1,8 @@
[Desktop Entry]
Type=Application
Version=1.0
Version=1.1
Name=RawTherapee
GenericName=Raw photo editor
GenericName=Raw Photo Editor
GenericName[cs]=Editor raw obrázků
GenericName[fr]=Éditeur d'images raw
GenericName[pl]=Edytor zdjęć raw
@ -11,9 +11,10 @@ Comment[cs]=Program pro konverzi a zpracování digitálních raw fotografií
Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur)
Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw
Icon=rawtherapee
TryExec=rawtherapee
Exec=rawtherapee %f
Terminal=false
MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif;
Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK;
Keywords=raw;photography;develop;pp3;graphics;
Categories=Graphics;Photography;2DGraphics;RasterGraphics;GTK;
Keywords=raw;photo;photography;develop;pp3;graphics;
StartupWMClass=rawtherapee

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
/***************************/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
* {

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////
@ -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;
}
}

View File

@ -33,6 +33,7 @@ set(CAMCONSTSFILE "camconst.json")
set(RTENGINESOURCEFILES
badpixels.cc
CA_correct_RT.cc
capturesharpening.cc
EdgePreservingDecomposition.cc
FTblockDN.cc
PF_correct_RT.cc
@ -62,6 +63,8 @@ set(RTENGINESOURCEFILES
eahd_demosaic.cc
fast_demo.cc
ffmanager.cc
filmnegativeproc.cc
filmnegativethumb.cc
flatcurves.cc
gauss.cc
green_equil_RT.cc

View File

@ -401,13 +401,10 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
//How many diagonals in the decomposition?
MaxFillAbove++; //Conceptually, now "fill" includes an existing diagonal. Simpler in the math that follows.
int j, mic, fp;
mic = 1;
fp = 1;
int mic = 1;
for(int ii = 1; ii < m; ii++) {
fp = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guaranteed positive since StartRows must be created in increasing order.
mic = mic + fp;
mic += rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove); //Guaranteed positive since StartRows must be created in increasing order.
}
//Initialize the decomposition - setup memory, start rows, etc.
@ -421,7 +418,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
for(int ii = 1; ii < m; ii++) {
//Set j to the number of diagonals to be created corresponding to a diagonal on this source matrix...
j = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove);
int j = rtengine::min(StartRows[ii] - StartRows[ii - 1], MaxFillAbove);
//...and create those diagonals. I want to take a moment to tell you about how much I love minimalistic loops: very much.
while(j-- != 0)
@ -491,7 +488,7 @@ bool MultiDiagonalSymmetricMatrix::CreateIncompleteCholeskyFactorization(int Max
findmap[j] = FindIndex( icStartRows[j]);
}
for(j = 0; j < n; j++) {
for(int j = 0; j < n; j++) {
//Calculate d for this column.
d[j] = Diagonals[0][j];
@ -557,12 +554,11 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
float* RESTRICT *d = IncompleteCholeskyFactorization->Diagonals;
int* RESTRICT s = IncompleteCholeskyFactorization->StartRows;
int M = IncompleteCholeskyFactorization->m, N = IncompleteCholeskyFactorization->n;
int i, j;
if(M != DIAGONALSP1) { // can happen in theory
for(j = 0; j < N; j++) {
for(int j = 0; j < N; j++) {
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
i = 1;
int i = 1;
int c = j - s[i];
while(c >= 0) {
@ -574,9 +570,9 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
x[j] = sub; // only one memory-write per j
}
} else { // that's the case almost every time
for(j = 0; j <= s[M - 1]; j++) {
for(int j = 0; j <= s[M - 1]; j++) {
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
i = 1;
int i = 1;
int c = j - s[1];
while(c >= 0) {
@ -588,7 +584,7 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
x[j] = sub; // only one memory-write per j
}
for(j = s[M - 1] + 1; j < N; j++) {
for(int j = s[M - 1] + 1; j < N; j++) {
float sub = b[j]; // using local var to reduce memory writes, gave a big speedup
for(int i = DIAGONALSP1 - 1; i > 0; i--) { // using a constant upperbound allows the compiler to unroll this loop (gives a good speedup)
@ -605,14 +601,15 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
#pragma omp parallel for
#endif
for(j = 0; j < N; j++) {
for(int j = 0; j < N; j++) {
x[j] = x[j] / d[0][j];
}
if(M != DIAGONALSP1) { // can happen in theory
int j = N;
while(j-- > 0) {
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
i = 1;
int i = 1;
int c = j + s[1];
while(c < N) {
@ -624,9 +621,9 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
x[j] = sub; // only one memory-write per j
}
} else { // that's the case almost every time
for(j = N - 1; j >= (N - 1) - s[M - 1]; j--) {
for(int j = N - 1; j >= (N - 1) - s[M - 1]; j--) {
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
i = 1;
int i = 1;
int c = j + s[1];
while(c < N) {
@ -638,7 +635,7 @@ void MultiDiagonalSymmetricMatrix::CholeskyBackSolve(float* RESTRICT x, float* R
x[j] = sub; // only one memory-write per j
}
for(j = (N - 2) - s[M - 1]; j >= 0; j--) {
for(int j = (N - 2) - s[M - 1]; j >= 0; j--) {
float sub = x[j]; // using local var to reduce memory writes, gave a big speedup
for(int i = DIAGONALSP1 - 1; i > 0; i--) { // using a constant upperbound allows the compiler to unroll this loop (gives a good speedup)

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
/*

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////

View File

@ -14,14 +14,14 @@
* 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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*
* Author: reine
*/
#pragma once
#ifndef STOPWATCH_H
#define STOPWATCH_H
#include <iostream>
#include <string>
#include "mytime.h"
#ifdef BENCHMARK
@ -36,45 +36,34 @@ class StopWatch
{
public:
explicit StopWatch( const char* msg, bool microseconds = false ) : microseconds(microseconds)
explicit StopWatch(const char* msg, bool microSeconds = false) : message(msg), unit(microSeconds ? " us" : " ms"), divisor(microSeconds ? 1 : 1000)
{
message = msg;
start();
stopped = false;
}
~StopWatch()
{
if(!stopped) {
if (!stopped) {
stop();
}
}
void start()
{
startTime.set();
};
}
void stop()
{
stopTime.set();
if(!microseconds) {
long elapsedTime = stopTime.etime(startTime) / 1000;
std::cout << message << " took " << elapsedTime << " ms" << std::endl;
} else {
long elapsedTime = stopTime.etime(startTime);
std::cout << message << " took " << elapsedTime << " us" << std::endl;
}
const long elapsedTime = stopTime.etime(startTime) / divisor;
std::cout << message << " took " << elapsedTime << unit << std::endl;
stopped = true;
}
void stop(const char *msg)
{
message = msg;
stop();
};
private:
bool microseconds;
MyTime startTime;
MyTime stopTime;
const char *message;
const std::string message;
const std::string unit;
const int divisor;
bool stopped;
};
#endif /* STOPWATCH_H */

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
//
@ -40,7 +40,7 @@ void RawImageSource::ahd_demosaic()
{
BENCHFUN
constexpr int dir[4] = { -1, 1, -TS, TS };
constexpr int dirs[4] = { -1, 1, -TS, TS };
float xyz_cam[3][3];
LUTf cbrt(65536);
@ -55,9 +55,10 @@ void RawImageSource::ahd_demosaic()
constexpr float d65_white[3] = { 0.950456, 1, 1.088754 };
double progress = 0.0;
if (plistener) {
plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_AHD")));
plistener->setProgress (0.0);
plistener->setProgress (progress);
}
for (int i = 0; i < 65536; i++) {
@ -65,16 +66,17 @@ void RawImageSource::ahd_demosaic()
cbrt[i] = r > 0.008856 ? std::cbrt(r) : 7.787 * r + 16 / 116.0;
}
for (int i = 0; i < 3; i++)
for (int i = 0; i < 3; i++) {
for (unsigned int j = 0; j < 3; j++) {
xyz_cam[i][j] = 0;
for (int k = 0; k < 3; k++) {
xyz_cam[i][j] += xyz_rgb[i][k] * imatrices.rgb_cam[k][j] / d65_white[i];
}
}
}
border_interpolate2(W, H, 5, rawData, red, green, blue);
#ifdef _OPENMP
#pragma omp parallel
#endif
@ -153,9 +155,9 @@ void RawImageSource::ahd_demosaic()
auto lix = &lab[d][tr][tc];
for (int i = 0; i < 4; i++) {
ldiff[d][i] = std::fabs(lix[0][0] - lix[dir[i]][0]);
abdiff[d][i] = SQR(lix[0][1] - lix[dir[i]][1])
+ SQR(lix[0][2] - lix[dir[i]][2]);
ldiff[d][i] = std::fabs(lix[0][0] - lix[dirs[i]][0]);
abdiff[d][i] = SQR(lix[0][1] - lix[dirs[i]][1])
+ SQR(lix[0][2] - lix[dirs[i]][2]);
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _ALIGNEDBUFFER_
#define _ALIGNEDBUFFER_

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////
@ -49,11 +49,11 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
stop.reset(new StopWatch("amaze demosaic"));
}
volatile double progress = 0.0;
double progress = 0.0;
if (plistener) {
plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_AMAZE")));
plistener->setProgress (0.0);
plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), M("TP_RAW_AMAZE")));
plistener->setProgress(progress);
}
const int width = winw, height = winh;
@ -768,7 +768,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
//if both agree on interpolation direction, choose the one with strongest directional discrimination;
//otherwise, choose the u/d and l/r difference fluctuation weights
if ((0.5 - varwt) * (0.5 - diffwt) > 0 && fabsf(0.5 - diffwt) < fabsf(0.5 - varwt)) {
if ((0.5f - varwt) * (0.5f - diffwt) > 0.f && fabsf(0.5f - diffwt) < fabsf(0.5f - varwt)) {
hvwt[indx >> 1] = varwt;
} else {
hvwt[indx >> 1] = diffwt;
@ -1236,7 +1236,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
//first ask if one gets more directional discrimination from nearby B/R sites
float pmwtalt = xdivf(pmwt[(indx - m1) >> 1] + pmwt[(indx + p1) >> 1] + pmwt[(indx - p1) >> 1] + pmwt[(indx + m1) >> 1], 2);
if (fabsf(0.5 - pmwt[indx1]) < fabsf(0.5 - pmwtalt)) {
if (fabsf(0.5f - pmwt[indx1]) < fabsf(0.5f - pmwtalt)) {
pmwt[indx1] = pmwtalt; //a better result was obtained from the neighbours
}
@ -1304,7 +1304,7 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c
for (int cc = 12 + (FC(rr, 2) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12; cc += 2, indx += 2, indx1++) {
if (fabsf(0.5 - pmwt[indx >> 1]) < fabsf(0.5 - hvwt[indx >> 1]) ) {
if (fabsf(0.5f - pmwt[indx >> 1]) < fabsf(0.5f - hvwt[indx >> 1]) ) {
continue;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
/*
@ -214,6 +214,12 @@ public:
return ptr;
}
// use as pointer to T**
operator const T* const *()
{
return ptr;
}
// use as pointer to data
operator T*()
{

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "array2D.h"

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _BILATERAL2_
#define _BILATERAL2_

View File

@ -14,18 +14,20 @@
* 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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _BOXBLUR_H_
#define _BOXBLUR_H_
#include <assert.h>
#include <memory>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "alignedbuffer.h"
#include "rt_math.h"
#include "opthelper.h"
#include "StopWatch.h"
namespace rtengine
@ -204,15 +206,15 @@ template<class T, class A> void boxblur (T** src, A** dst, T* buffer, int radx,
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU( dst[0][col], tempv);
STVFU( dst[0][col + 4], temp1v);
STVFU(dst[0][col], tempv);
STVFU(dst[0][col + 4], temp1v);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenp1v;
}
@ -221,16 +223,16 @@ template<class T, class A> void boxblur (T** src, A** dst, T* buffer, int radx,
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v;
STVFU( dst[row][col], tempv);
STVFU( dst[row][col + 4], temp1v);
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenm1v;
}
}
@ -312,6 +314,223 @@ template<class T, class A> void boxblur (T** src, A** dst, T* buffer, int radx,
}
inline void boxblur (float** src, float** dst, int radius, int W, int H, bool multiThread)
{
//box blur using rowbuffers and linebuffers instead of a full size buffer
if (radius == 0) {
if (src != dst) {
#ifdef _OPENMP
#pragma omp parallel for if (multiThread)
#endif
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
dst[row][col] = src[row][col];
}
}
}
return;
}
constexpr int numCols = 8; // process numCols columns at once for better usage of L1 cpu cache
#ifdef _OPENMP
#pragma omp parallel if (multiThread)
#endif
{
std::unique_ptr<float> buffer(new float[std::max(W, 8 * H)]);
//horizontal blur
float* const lineBuffer = buffer.get();
#ifdef _OPENMP
#pragma omp for
#endif
for (int row = 0; row < H; row++) {
float len = radius + 1;
float tempval = src[row][0];
lineBuffer[0] = tempval;
for (int j = 1; j <= radius; j++) {
tempval += src[row][j];
}
tempval /= len;
dst[row][0] = tempval;
for (int col = 1; col <= radius; col++) {
lineBuffer[col] = src[row][col];
tempval = (tempval * len + src[row][col + radius]) / (len + 1);
dst[row][col] = tempval;
++len;
}
for (int col = radius + 1; col < W - radius; col++) {
lineBuffer[col] = src[row][col];
dst[row][col] = tempval = tempval + (src[row][col + radius] - lineBuffer[col - radius - 1]) / len;
}
for (int col = W - radius; col < W; col++) {
dst[row][col] = tempval = (tempval * len - lineBuffer[col - radius - 1]) / (len - 1);
--len;
}
}
//vertical blur
#ifdef __SSE2__
vfloat (* const rowBuffer)[2] = (vfloat(*)[2]) buffer.get();
const vfloat leninitv = F2V(radius + 1);
const vfloat onev = F2V(1.f);
vfloat tempv, temp1v, lenv, lenp1v, lenm1v, rlenv;
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int col = 0; col < W - 7; col += 8) {
lenv = leninitv;
tempv = LVFU(dst[0][col]);
temp1v = LVFU(dst[0][col + 4]);
rowBuffer[0][0] = tempv;
rowBuffer[0][1] = temp1v;
for (int i = 1; i <= radius; i++) {
tempv = tempv + LVFU(dst[i][col]);
temp1v = temp1v + LVFU(dst[i][col + 4]);
}
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU(dst[0][col], tempv);
STVFU(dst[0][col + 4], temp1v);
for (int row = 1; row <= radius; row++) {
rowBuffer[row][0] = LVFU(dst[row][col]);
rowBuffer[row][1] = LVFU(dst[row][col + 4]);
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(dst[row + radius][col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(dst[row + radius][col + 4])) / lenp1v;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenp1v;
}
rlenv = onev / lenv;
for (int row = radius + 1; row < H - radius; row++) {
rowBuffer[row][0] = LVFU(dst[row][col]);
rowBuffer[row][1] = LVFU(dst[row][col + 4]);
tempv = tempv + (LVFU(dst[row + radius][col]) - rowBuffer[row - radius - 1][0]) * rlenv ;
temp1v = temp1v + (LVFU(dst[row + radius][col + 4]) - rowBuffer[row - radius - 1][1]) * rlenv ;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
}
for (int row = H - radius; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - rowBuffer[row - radius - 1][0]) / lenm1v;
temp1v = (temp1v * lenv - rowBuffer[row - radius - 1][1]) / lenm1v;
STVFU(dst[row][col], tempv);
STVFU(dst[row][col + 4], temp1v);
lenv = lenm1v;
}
}
#else
float (* const rowBuffer)[8] = (float(*)[8]) buffer.get();
#ifdef _OPENMP
#pragma omp for nowait
#endif
for (int col = 0; col < W - numCols + 1; col += 8) {
float len = radius + 1;
for (int k = 0; k < numCols; k++) {
rowBuffer[0][k] = dst[0][col + k];
}
for (int i = 1; i <= radius; i++) {
for (int k = 0; k < numCols; k++) {
dst[0][col + k] += dst[i][col + k];
}
}
for(int k = 0; k < numCols; k++) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= radius; row++) {
for(int k = 0; k < numCols; k++) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
}
len ++;
}
for (int row = radius + 1; row < H - radius; row++) {
for(int k = 0; k < numCols; k++) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) / len;
}
}
for (int row = H - radius; row < H; row++) {
for(int k = 0; k < numCols; k++) {
dst[row][col + k] = (dst[row - 1][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1);
}
len --;
}
}
#endif
//vertical blur, remaining columns
#ifdef _OPENMP
#pragma omp single
#endif
{
const int remaining = W % numCols;
if (remaining > 0) {
float (* const rowBuffer)[8] = (float(*)[8]) buffer.get();
const int col = W - remaining;
float len = radius + 1;
for(int k = 0; k < remaining; ++k) {
rowBuffer[0][k] = dst[0][col + k];
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; ++k) {
dst[0][col + k] += dst[row][col + k];
}
}
for(int k = 0; k < remaining; ++k) {
dst[0][col + k] /= len;
}
for (int row = 1; row <= radius; ++row) {
for(int k = 0; k < remaining; ++k) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = (dst[row - 1][col + k] * len + dst[row + radius][col + k]) / (len + 1);
}
len ++;
}
const float rlen = 1.f / len;
for (int row = radius + 1; row < H - radius; ++row) {
for(int k = 0; k < remaining; ++k) {
rowBuffer[row][k] = dst[row][col + k];
dst[row][col + k] = dst[row - 1][col + k] + (dst[row + radius][col + k] - rowBuffer[row - radius - 1][k]) * rlen;
}
}
for (int row = H - radius; row < H; ++row) {
for(int k = 0; k < remaining; ++k) {
dst[row][col + k] = (dst[(row - 1)][col + k] * len - rowBuffer[row - radius - 1][k]) / (len - 1);
}
len --;
}
}
}
}
}
template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H)
{
//box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1)
@ -382,15 +601,15 @@ template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, in
tempv = tempv / lenv;
temp1v = temp1v / lenv;
STVFU( dst[0 * W + col], tempv);
STVFU( dst[0 * W + col + 4], temp1v);
STVFU(dst[0 * W + col], tempv);
STVFU(dst[0 * W + col + 4], temp1v);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
temp1v = (temp1v * lenv + LVFU(temp[(row + rady) * W + col + 4])) / lenp1v;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
STVFU(dst[row * W + col], tempv);
STVFU(dst[row * W + col + 4], temp1v);
lenv = lenp1v;
}
@ -399,16 +618,16 @@ template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, in
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
temp1v = temp1v + (LVFU(temp[(row + rady) * W + col + 4]) - LVFU(temp[(row - rady - 1) * W + col + 4])) * rlenv ;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
STVFU(dst[row * W + col], tempv);
STVFU(dst[row * W + col + 4], temp1v);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
temp1v = (temp1v * lenv - LVFU(temp[(row - rady - 1) * W + col + 4])) / lenm1v;
STVFU( dst[row * W + col], tempv);
STVFU( dst[row * W + col + 4], temp1v);
STVFU(dst[row * W + col], tempv);
STVFU(dst[row * W + col + 4], temp1v);
lenv = lenm1v;
}
}
@ -422,12 +641,12 @@ template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, in
}
tempv = tempv / lenv;
STVFU( dst[0 * W + col], tempv);
STVFU(dst[0 * W + col], tempv);
for (int row = 1; row <= rady; row++) {
lenp1v = lenv + onev;
tempv = (tempv * lenv + LVFU(temp[(row + rady) * W + col])) / lenp1v;
STVFU( dst[row * W + col], tempv);
STVFU(dst[row * W + col], tempv);
lenv = lenp1v;
}
@ -435,13 +654,13 @@ template<class T, class A> void boxblur (T* src, A* dst, A* buffer, int radx, in
for (int row = rady + 1; row < H - rady; row++) {
tempv = tempv + (LVFU(temp[(row + rady) * W + col]) - LVFU(temp[(row - rady - 1) * W + col])) * rlenv ;
STVFU( dst[row * W + col], tempv);
STVFU(dst[row * W + col], tempv);
}
for (int row = H - rady; row < H; row++) {
lenm1v = lenv - onev;
tempv = (tempv * lenv - LVFU(temp[(row - rady - 1) * W + col])) / lenm1v;
STVFU( dst[row * W + col], tempv);
STVFU(dst[row * W + col], tempv);
lenv = lenm1v;
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once

View File

@ -48,7 +48,7 @@ Examples:
// For new models that are still not supported by the dcraw version used in current RT, we have to fill all the
// alternate names or else RT will not recognize the alternate model names.
// For models supported by dcraw, filling the alternate names is simply desired (for better user info).
// The format of multiple naming is to write all names in brackets i.e instead of
// The format of multiple naming is to write all names in brackets i.e instead of
// "make_model": "Canon EOS 550D",
// type
// "make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ],
@ -115,9 +115,9 @@ How to Measure White Levels:
dcraw provides the default values used by RawTherapee, but often provides too high white levels, and only provides a
single value regardless of color channel, ISO or aperture. If you open an image with a large clipped area and that
is rendered in a pink/magenta color rather than white it usually means that the white level constant is too high. You can
fix this by adjusting the"Raw White Point" in the raw tab inside RawTherapee, or permanently fix it by measuring and
fix this by adjusting white-point correction in the Raw tab > Raw White Points, or permanently fix it by measuring and
providing a more exact white level in camconst.json so RawTherapee gets to know from start where the camera actually
clips. Providing a complete and detailed white-level profile can be a quite large and complicated effort. As an
clips. Providing a complete and detailed white-level profile can be a quite large and complicated effort. As an
alternative you can provide a simpler profile.We suggest one of the following alternatives in rising difficulty
(and generally diminishing return):
A) Provide a single white-level value measured on the native ISO (base ISO). For many cameras this will actually be
@ -159,7 +159,7 @@ How to Measure White Levels:
histogram. While it's common to with very little variation, say only +/-2 units, some can have +/-500 or more (some may
have different variation depending on ISO). There can also be camera-to-camera variation.
If the white level is set too high RawTherapee will not think the pixels are clipped and you can get discoloured
If the white level is set too high RawTherapee will not think the pixels are clipped and you can get discolored
highlights (usually pink), this is what we want to avoid. If white level is set too low RawTherapee will clip early, ie
you lose a little highlight detail, but the color is rendered correctly and highlight reconstruction can work properly,
so this is not as bad. This is why we want conservative values.
@ -167,21 +167,21 @@ How to Measure White Levels:
By conservative values we mean that if you see a white level of most often 15760 and occasionally 15759 (i.e. very small
variation of white level which is a common case), you set the white level around 50-100 14-bit units below or
10-20 12-bit units. Say at 15700 in this example, or 4080 instead of 4095 for 12-bit raws. This way we get a little margin
from noise and camera variation. Since sensor raw values are linear, you lose, for example,
from noise and camera variation. Since sensor raw values are linear, you lose, for example,
log2(1-50/15760) = -0.005 stops of detail, i.e. irrelevant. Thus it is better to provide RawTherapee with knowledge
where the image clips rather than keeping that last 0.005 stop of highlight information and risking that clipping will
not be detected properly.
It is very usual for white level to be a bell distribution instead of a candle when the camera applies long exposure
noise reduction (LENR) by subtracting a black frame and/or when the system is destabilized due to temperature. Some models have
always a bell distribution at WL. If you have a fuzzy white level look at the linear histogram; you will probably see a
always a bell distribution at WL. If you have a fuzzy white level look at the linear histogram; you will probably see a
normal/Gaussian distribution (bell shape) noise peak at clipping and probably also a peak at a hard raw data clip level
usually at or close to a power of two - 1, such as 4095 or 16383. Then you pick a value just before the bell shape
rises, i.e. to the left of the bell meaning that you cut away the whole fuzzy noise peak. If a little of the starting edge
of the noise will be included it's not harmful, but 99% of it should be above. This would mean that it's better to
of the noise will be included it's not harmful, but 99% of it should be above. This would mean that it's better to
measure white level on long exposure/high temp raws but since this if difficult and time consuming we choose to measure
on normal raws and cover the abnormalities with the conservative WL values. A more detailed approach when we only have
non-LENR measures is to subtract a value according to per ISO read noise. We can find data regarding read noise (stdev
on normal raws and cover the abnormalities with the conservative WL values. A more detailed approach when we only have
non-LENR measures is to subtract a value according to per ISO read noise. We can find data regarding read noise (stdev
of Gaussian distribution) at http://www.photonstophotos.net/Charts/RN_ADU.htm . We find the per ISO tead_noise and
subtract from the measured value 6*read_noise. This gives confidence that 99.5% of the bell is clipped out.
@ -201,7 +201,7 @@ How to Measure White Levels:
need a margin on white_max as it clips there as a result of an in-camera math operation.
Note that aperture scaling can be quite small, for the 5D mark II it's only 0.2 stop down to f/1.2 and then it can be
discussed if it's worthwhile to care. The "worst" cameras scale about 0.6 stops though, and then it's more valuable to
discussed if it's worthwhile to care. The "worst" cameras scale about 0.6 stops though, and then it's more valuable to
compensate. If you skip aperture scaling RawTherapee will clip the files a little bit too early and you miss that last
fraction of highlight detail, but you get no processing problems. Setting un-conservative scale factors can on the other
hand cause a too high white level and break highlight processing, so be careful.
@ -209,7 +209,7 @@ How to Measure White Levels:
Scaling can vary slightly depending on ISO (if white levels vary) so make sure to provide conservative scalings so
regardless of ISO you don't get a too high white level. We recommend to keep a small margin here also white levels,
i.e. 0.5% lower or so. For example if base (not conservative!) white level is 15750 and the scaled is 16221 we have a
scaling factor of 16221/15750=1.0299 i.e. +2.9% we set the factor to 1.025 to keep a margin. The abnormal cases are
scaling factor of 16221/15750=1.0299 i.e. +2.9% we set the factor to 1.025 to keep a margin. The abnormal cases are
already covered by setting conservative per ISO White levels.
The scale factor you provide here is applied on the white level before black level subtraction (if any), i.e. directly on
@ -239,10 +239,10 @@ How to Measure White Levels:
You can use RawTherapee for analysis too, it's safer as you are using it's own raw decoder but it's not as
user-friendly: enable verbose mode in options so you get output on the console. When you load a file you will see a
message of current black and white levels and if they came from dcraw or camconst.json. If you're adjusting an existing
message of current black and white levels and if they came from dcraw or camconst.json. If you're adjusting an existing
camconst.json value you can just read what it is in the file and not need to enable verbose output.
Reset exposure sliders to neutral, and zoom in on a large clipped highlight. Move around the mouse pointer within, it
Reset exposure sliders to neutral, and zoom in on a large clipped highlight. Move around the mouse pointer within, it
should show stable 100% on R G B. If so, the white level is not too high, it could however be too low. To test that, go
to the raw tab and adjust the "white point linear correction factor", reduce it until one of the channels is no longer
100%, and then increase in steps of 0.01 until all are 100 again. Usually you play around in the range 0.90 to 0.99, i.e.
@ -438,7 +438,7 @@ Camera constants:
{ "iso": [ 160 ], "levels": 13000 }, // nominal f8-13105
{ "iso": [ 320, 640, 1250, 2500 ], "levels": 13300 }, // G1,G2 F4.0-13422-F2.8-13562-13616
{ "iso": [ 5000, 10000, 20000 ], "levels": 13200 }, // G1,G2 F4.0-13422-F2.8-13562-13616
{ "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16100 }, // nominal 16383,
{ "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 16100 }, // nominal 16383,
{ "iso": [ 6400, 8000, 12800, 16000, 25600, 32000 ], "levels": 16000 }, // R,G1,G2 16383, LENR?
{ "iso": [ 40000, 51200, 102400 ], "levels": 15800 } // 16383, LENR?
],
@ -462,7 +462,7 @@ Camera constants:
"make_model": [ "Canon EOS 5DS R", "Canon EOS 5DS" ],
//"dcraw_matrix": [ 6848,-1661,-221,-3904,10931,3434,-470,1251,6039 ], // DNG_V9.0 A
"dcraw_matrix": [ 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 ], // DNG_V9.0 D65
"raw_crop": [ 192, 96, 8696, 5800 ], // 800, 300, 7500, 4700 - 160,64,8730x5800 - sensor 8896x5920 top64, left160, official crop left196, top100, right 8883, bottom 5891, 8688X5792
"raw_crop": [ 192, 96, 8696, 5800 ], // 800, 300, 7500, 4700 - 160,64,8730x5800 - sensor 8896x5920 top64, left160, official crop left196, top100, right 8883, bottom 5891, 8688X5792
"masked_areas": [ 100, 40, 5892, 158 ], // left out 40 first columns from calculations because possibly the BL is still imbalanced there
"ranges": {
"white": [
@ -497,7 +497,7 @@ Camera constants:
{ "iso": [ 160, 320, 640, 1250, 2500 ], "levels": 13100 }, // typical 13225
{ "iso": [ 5000, 10000 ], "levels": 13000 }, // typical 13225
{ "iso": [ 20000 ], "levels": 12800 }, // typical 13225
{ "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383
{ "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383
],
"white_max": 16383,
"aperture_scaling": [
@ -522,7 +522,7 @@ Camera constants:
"dcraw_matrix": [ 6875,-970,-932,-4691,12459,2501,-874,1953,5809 ], // DNG v_9.12 D65
"raw_crop": [ 120, 44, 6264, 4180 ], // fullraw size 6384x4224 useful 120,44,6264x4180
// "raw_crop": [ 128, 52, 6248, 4168 ], // official jpeg crop 120+12,44+12,6240x4160
"masked_areas": [ 44, 4, 4220, 116 ],
"masked_areas": [ 44, 4, 4220, 116 ],
"ranges": {
"white": [
{ "iso": [ 50, 100, 125, 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200 ], "levels": 16300 }, // typical 16383
@ -532,7 +532,7 @@ Camera constants:
{ "iso": [ 320, 640, 1250, 2500 ], "levels": 13250 }, // typical 13337
{ "iso": [ 5000, 10000 ], "levels": 13100 }, // typical 13367
{ "iso": [ 20000, 40000 ], "levels": 12900 }, // typical 13367
{ "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383
{ "iso": [ 51200, 102400 ], "levels": 15900 } // typical 16383
],
"white_max": 16383,
"aperture_scaling": [
@ -588,8 +588,8 @@ Camera constants:
{ "iso": [ 100, 125 ], "levels": 13500 }, // typical 13583 - LENR 13550
{ "iso": [ 160, 320, 640, 1250, 2500, 5000 ], "levels": 12500 }, // typical 12559
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15200 }, // typical 15303 - LENR 15270,15260,15240,15220,
{ "iso": [ 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 }, // typical G1,G2 15303, R,B = 15430 LENR 15200 .. 15100
{ "iso": 51200, "levels": 16300 } // typical 16383 red 16371
{ "iso": [ 6400, 8000, 10000, 12800, 16000, 20000, 25600 ], "levels": 15100 }, // typical G1,G2 15303, R,B = 15430 LENR 15200 .. 15100
{ "iso": 51200, "levels": 16300 } // typical 16383 red 16371
],
"white_max": 16383,
"aperture_scaling": [
@ -620,7 +620,7 @@ Camera constants:
{ "iso": [ 200, 400 ], "levels": 16100 }, // typical 16224
{ "iso": 800, "levels": 15900 }, // gaussian histogram 15900-16224
{ "iso": 1600, "levels": 14900 }, // gaussian histogram 14900-15750
{ "iso": 1250, "levels": 11900 } // gaussian histogram 11900-12500
{ "iso": 1250, "levels": 11900 } // gaussian histogram 11900-12500
],
"white_max": 16383,
"aperture_scaling": [
@ -805,6 +805,13 @@ Camera constants:
// Canon mid-range DSLRs (Rebels)
{ // Quality C
"make_model": [ "Canon EOS 400D DIGITAL" ],
"ranges": {
"white": 4056
}
},
{ // Quality B, ISO and aperture WL data by ..... at RawTherapee forums, missing samples safely guessed
"make_model": [ "Canon EOS 550D", "Canon EOS Rebel T2i", "Canon EOS Kiss X4" ],
"dcraw_matrix": [ 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 ], // dcraw 550d
@ -1075,9 +1082,9 @@ Camera constants:
"masked_areas": [ 40, 16, 4000, 54 ],
"ranges": {
"white": [
{ "iso": [ 100, 125, 160 ], "levels": 16300 }, // 16383
{ "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12600 }, // 12632..14500
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15000 }, // 15095, 15488
{ "iso": [ 100, 125, 160 ], "levels": 16300 }, // 16383
{ "iso": [ 320, 640, 1250, 2500, 5000, 10000 ], "levels": 12600 }, // 12632..14500
{ "iso": [ 200, 250, 400, 500, 800, 1000, 1600, 2000, 3200, 4000 ], "levels": 15000 }, // 15095, 15488
{ "iso": [ 6400, 8000, 12800, 25600 ], "levels": 16200 } // 16383
],
"white_max": 16383,
@ -1097,10 +1104,10 @@ Camera constants:
},
{ // Quality C, White Levels not properly indicated, aperture scaling..missing factors are guessed
"make_model": [ "Canon EOS M5","Canon EOS M6" ],
"make_model": [ "Canon EOS M5","Canon EOS M6" ],
"dcraw_matrix": [ 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 ], // DNG_V9.8 D65
"raw_crop": [ 264, 36, 6024, 4020 ], // full size 6288x4056,
//"raw_crop": [ 272, 44, 6008, 4008 ], // matched to official crop 276,48,6275,4047 - official jpeg 6000X4000
//"raw_crop": [ 272, 44, 6008, 4008 ], // matched to official crop 276,48,6275,4047 - official jpeg 6000X4000
"masked_areas": [ 40, 96, 4000, 260 ],
"ranges": {
"white": [
@ -1109,9 +1116,9 @@ Camera constants:
{ "iso": [ 320 ], "levels": 13100 }, // nominal green 13200, 13528-14466-14380-14368 - blue13262-14186,
{ "iso": [ 640, 1250 ], "levels": 13200 }, // iso 640 G1,G2 13260-13450 - blue13230-13430 -iso 1250 13430
{ "iso": [ 2500, 5000, 10000 ], "levels": 13000 }, //
{ "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400 ], "levels": 16100 }, // 16383
// { "iso": [ 1600 ], "levels": 15000 }, // one sample of m6 = 15100 !!
// { "iso": [ 6400 ], "levels": 15500 }, // one sample of m6 = 15600 !!
{ "iso": [ 400, 500, 800, 1000, 1600, 2000, 3200, 4000, 6400 ], "levels": 16100 }, // 16383
// { "iso": [ 1600 ], "levels": 15000 }, // one sample of m6 = 15100 !!
// { "iso": [ 6400 ], "levels": 15500 }, // one sample of m6 = 15600 !!
{ "iso": [ 8000, 12800, 16000, 25600 ], "levels": 16000 } // R,G1,G2 16383, B 16243
],
"white_max": 16383,
@ -1169,7 +1176,7 @@ Camera constants:
"dcraw_matrix": [ 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 ], // D65 matrix from adobe dcp
//"raw_crop": [ 80, 50, 4400, 3316 ], // full frame 4480x3366 borders 80,50 - much shade in corners, no/wrong auto distortion
//"raw_crop": [ 104, 144, 4360, 3128 ], // Mixed best average frame, width is 4352 from 3/2, height 3120 from 4/3 - auto distortion does not work correctly
//"raw_crop": [ 200, 144, 4168, 3128 ], // Optional official 4/3 frame 4160x3120, 4pix borders, Left Border 204-4, Top Border 148-4
//"raw_crop": [ 200, 144, 4168, 3128 ], // Optional official 4/3 frame 4160x3120, 4pix borders, Left Border 204-4, Top Border 148-4
"raw_crop": [ 104, 252, 4360, 2912 ], // Default official 3/2 frame 4352x2904, 4pix borders, Left Border 108-4, Top border 256-4
"masked_areas": [ 148, 2, 3340, 78 ],
"ranges": { "white": 16300 }
@ -1339,8 +1346,8 @@ Camera constants:
{ // Quality C, only raw crop
"make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30" ],
"raw_crop": [ 0, 5, 6252, 4176]
},
},
{ // Quality B
"make_model": "FUJIFILM X30",
"dcraw_matrix": [ 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 ], // DNG_v8.7 D65
@ -1359,6 +1366,11 @@ Camera constants:
"raw_crop": [ 4, 4, -4, -4 ] // full raw 6016x4016, Official 6000x4000
},
{ // Quality C
"make_model": "LEICA Q2",
"raw_crop": [ 0, 0, 8392, 5624 ]
},
{ // Quality B, Matrix from Adobe's dcp D65 instead of the internal in Leica's DNG
"make_model": "LEICA SL (Typ 601)",
"dcraw_matrix": [ 11492,-4930,-1188,-5593,14673,873,-609,1474,6343 ], // DNGv9.3 D65
@ -1610,14 +1622,14 @@ Camera constants:
"ranges": { "white": 3980 } // 12-bit files.
},
{ // Quality C, only colour matrix and PDAF lines info
{ // Quality C, only color matrix and PDAF lines info
"make_model" : "Nikon Z 7",
"dcraw_matrix" : [10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785], // Adobe DNG Converter 11.0 ColorMatrix2
"pdaf_pattern" : [0, 12],
"pdaf_offset" : 29
},
{ // Quality C, only colour matrix and PDAF lines info
{ // Quality C, only color matrix and PDAF lines info
"make_model" : "Nikon Z 6",
"dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464], // Adobe DNG Converter 11.1 Beta ColorMatrix2
"pdaf_pattern" : [0, 12],
@ -1713,9 +1725,15 @@ Camera constants:
{ // Quality B,
"make_model": "OLYMPUS TG-5",
"dcraw_matrix": [ 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 ], // DNG_V9.12 D65
"raw_crop": [ 0, 0, -18, 0 ], // 18 pixels at right are garbage
"ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093
},
{ // Quality C, only raw crop
"make_model": "OLYMPUS TG-6",
"raw_crop": [ 0, 0, -24, 0 ] // 24 pixels at right are garbage
},
{ // Quality C, only green equilibration
"make_model" : ["OLYMPUS E-3", "OLYMPUS E-520"],
"global_green_equilibration" : true
@ -1741,6 +1759,15 @@ Camera constants:
}
},
{ // Quality C, only color matrix
"make_model" : "Panasonic DC-GF10",
"dcraw_matrix": [ 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 ], // ColorMatrix2 from Adobe DNG Converter 11.3
"raw_crop": [ 0, 0, 4600, 0 ], // SensorWidth=4816 SensorHeight=3464. Width=4600 to match DNG.
"ranges": {
"black": 15
}
},
{ // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 ..
"make_model": [ "Panasonic DMC-CM1", "Panasonic DMC-CM10" ],
"dcraw_matrix": [ 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 ], // dcp_v8.7 d65
@ -1788,7 +1815,7 @@ Camera constants:
{ // Quality B,
"make_model": [ "Panasonic DMC-FZ2500", "Panasonic DMC-FZ2000", "Panasonic DMC-FZH1" ],
"dcraw_matrix": [ 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 ], // dcp_v9.8 d65
"dcraw_matrix": [ 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 ], // dcp_v9.8 d65
"ranges": {
"black": 15, // 15 is BL offset. dcraw/RT read the base BL from Exif and calculates total BL = BLbase+BLoffset
"white": [
@ -1879,7 +1906,8 @@ Camera constants:
"dcraw_matrix": [ 7122,-2092,-419,-4643,11769,3283,-1363,2413,5944 ], // RT
"ranges": {
"black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
"white": 4060 } // Exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
"white": 4060 // Exif:4095 normal distribution 4080-4095, 4070-4095 on long exposure NR
}
},
{ // Quality A, Replicated from rawimage.cc
@ -1899,7 +1927,8 @@ Camera constants:
"dcraw_matrix": [ 7694,-1791,-745,-4917,12818,2332,-1221,2322,7197 ], // Colin Walker
"ranges": {
"black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
"white": 4050 } // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
"white": 4050 // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
}
},
{ // Quality A, Replicated from rawimage.cc
@ -1907,7 +1936,8 @@ Camera constants:
"dcraw_matrix": [ 8074,-1846,-861,-5026,12999,2239,-1320,2375,7422 ], // Colin Walker
"ranges": {
"black": 15, // 15 is BL offset. dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset
"white": 4050 } // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
"white": 4050 // Exif:4095 normal distribution 4080-4095, 4050-4095 on long exposure NR
}
},
{ // Quality A, Replicated from rawimage.cc
@ -2220,7 +2250,12 @@ Camera constants:
}
},
{ // Quality B, corrections for raw crop vs dcraw9.21, matched to Samsung's default
{ // 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
"raw_crop": [ 128, 36, 5480, 3656 ], // jpeg 5472x3648 - full raw: 5664 x 3710 - Samsung's official crop: 132, 40, 5604, 3688
@ -2243,8 +2278,8 @@ Camera constants:
{ "iso": 100, "levels": 16000 }, // 16000 typical 16084, LE 16120 and 16383, LENR 16280
{ "iso": [ 200, 400, 800, 1600, 3200, 6400, 12800 ], "levels": 16300 }, // 16383
{ "iso": [ 25600, 51200 ], "levels": 16300 } // 16383
]
}
]
}
},
{ // Quality C, corrections for frame size, black and white levels not declared properly
@ -2283,7 +2318,7 @@ Camera constants:
//"dcraw_matrix": [ 5666,139,-892,3780,5428,270,1366,9757,4526 ], // experimental inverted icc sunny8161
//"dcraw_matrix": [ 10288,-2449,-1718,8976,1868,-1608,7011,5039,-249 ], // experimental inverted icc tungsten8130 wp11
//"dcraw_matrix": [ 5864,679,-1491,2963,7635,-919,-640,13738,2790 ], // experimental inverted icc sunny8160
//"dcraw_matrix": [ 14032,-2231,-1016,-5263,14816,170,-112,183,9113 ], // hardcoded
//"dcraw_matrix": [ 14032,-2231,-1016,-5263,14816,170,-112,183,9113 ], // hardcoded
"ranges": { "black": 16, "white": 4070 }, // BL is 16 or 31, should be measured at the horizontal black stripe at the top
"raw_crop": [ 12, 52, -110, -8 ] // for small size all numbers/2
},
@ -2367,7 +2402,7 @@ Camera constants:
"ranges": { "black": 512, "white": 16300 },
// contributed by Horshak from https://www.dpreview.com/forums/post/60873077
"pdaf_pattern" : [ 0,12,36,54,72,90,114,126,144,162,180,204,216,240,252,270,294,306,324,342,366,384,396,414,432,450,474,492,504,522,540,564,576,594,606,630 ],
"pdaf_offset" : 3
"pdaf_offset" : 3
},
{ // Quality A, correction for frame width
@ -2402,8 +2437,8 @@ Camera constants:
{ // Quality C, color matrix copied from ILCE-9, LongExposures 2-3sec only
"make_model": "Sony ILCE-7M3",
"dcraw_matrix": [ 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 ], // ILCE-9, DNG_v9.12 D65
// "raw_crop": [ 8, 8, 6008, 4008 ], // full raw frame 6048x4024 Dcraw auto identify 6024x4024, jpeg 12,12,6000x4000
// "ranges": { "black": 512, "white": 16300 }
// "raw_crop": [ 8, 8, 6008, 4008 ], // full raw frame 6048x4024 Dcraw auto identify 6024x4024, jpeg 12,12,6000x4000
// "ranges": { "black": 512, "white": 16300 }
"ranges": {
"black": 512,
"white": [
@ -2437,6 +2472,11 @@ Camera constants:
"pdaf_offset" : 31
},
{ // Quality C,
"make_model": "Sony ILCE-7RM4",
"raw_crop": [ 0, 0, 9568, 0 ] // full raw frame 9600x6376 - 32 rightmost columns are garbage
},
{ // Quality B, color matrix copied from a7rm2
"make_model": "Sony ILCE-9",
"dcraw_matrix": [ 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 ], // DNG_v9.12 D65

View File

@ -0,0 +1,812 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <cmath>
#include <iostream>
#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 <omp.h>
#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, double sigmaCornerOffset, int iterations, rtengine::ProgressListener* plistener, double startVal, double endVal)
{
BENCHFUN
const bool is5x5 = (sigma <= 0.84 && sigmaCornerOffset == 0.0);
const bool is3x3 = (sigma < 0.6 && sigmaCornerOffset == 0.0);
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 = 5;
constexpr int fullTileSize = tileSize + 2 * border;
const float maxRadius = std::min<float>(1.15f, sigma + sigmaCornerOffset);
const float maxDistance = sqrt(rtengine::SQR(W * 0.5f) + rtengine::SQR(H * 0.5f));
const float distanceFactor = (maxRadius - sigma) / maxDistance;
double progress = startVal;
const double progressStep = (endVal - startVal) * rtengine::SQR(tileSize) / (W * H);
#ifdef _OPENMP
#pragma omp parallel
#endif
{
int progresscounter = 0;
array2D<float> tmpIThr(fullTileSize, fullTileSize);
array2D<float> tmpThr(fullTileSize, fullTileSize);
array2D<float> 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 {
if (sigmaCornerOffset > 0.0) {
float lkernel7[7][7];
const float distance = sqrt(rtengine::SQR(i + tileSize / 2 - H / 2) + rtengine::SQR(j + tileSize / 2 - W / 2));
compute7x7kernel(sigma + distanceFactor * distance, lkernel7);
for (int k = 0; k < iterations - 1; ++k) {
// apply 7x7 gaussian blur and divide luminance by result of gaussian blur
gauss7x7div(tmpIThr, tmpThr, lumThr, fullTileSize, fullTileSize, lkernel7);
gauss7x7mult(tmpThr, tmpIThr, fullTileSize, fullTileSize, lkernel7);
}
} 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<float>& redVals = redCache ? *redCache : red;
array2D<float>& greenVals = greenCache ? *greenCache : green;
array2D<float>& blueVals = blueCache ? *blueCache : blue;
array2D<float> 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<float>& 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<float>& 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<float>* Lbuffer = nullptr;
if (!redCache) {
Lbuffer = new array2D<float>(W, H);
}
array2D<float>* YOldbuffer = nullptr;
if (!greenCache) {
YOldbuffer = new array2D<float>(W, H);
}
array2D<float>* YNewbuffer = nullptr;
if (!blueCache) {
YNewbuffer = new array2D<float>(W, H);
}
array2D<float>& L = Lbuffer ? *Lbuffer : red;
array2D<float>& YOld = YOldbuffer ? * YOldbuffer : green;
array2D<float>& 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<float>& 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.deconvradiusOffset, 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 */

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////
@ -54,15 +54,15 @@ void RawImageSource::CLASS cfa_linedn(float noise, bool horizontal, bool vertica
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double progress = 0.0;
if (plistener) {
plistener->setProgressStr ("PROGRESSBAR_LINEDENOISE");
plistener->setProgress (0.0);
plistener->setProgressStr("PROGRESSBAR_LINEDENOISE");
plistener->setProgress(progress);
}
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float noisevar = SQR(3 * noise * 65535); // _noise_ (as a fraction of saturation) is input to the algorithm
float noisevarm4 = 4.0f * noisevar;
volatile double progress = 0.0;
float* RawDataTmp = (float*)malloc( width * height * sizeof(float));
#ifdef _OPENMP
#pragma omp parallel

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "ciecam02.h"
#include "rtengine.h"

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _CIECAM02_
#define _CIECAM02_

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _CIEIMAGE_H_
#define _CIEIMAGE_H_

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#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];
@ -2016,45 +2016,6 @@ void Color::Lch2Luv(float c, float h, float &u, float &v)
v = c * sincosval.y;
}
// NOT TESTED
void Color::XYZ2Luv (float X, float Y, float Z, float &L, float &u, float &v)
{
X /= 65535.f;
Y /= 65535.f;
Z /= 65535.f;
if (Y > float(eps)) {
L = 116.f * std::cbrt(Y) - 16.f;
} else {
L = float(kappa) * Y;
}
u = 13.f * L * float(u0);
v = 13.f * L * float(v0);
}
// NOT TESTED
void Color::Luv2XYZ (float L, float u, float v, float &X, float &Y, float &Z)
{
if (L > float(epskap)) {
float t = (L + 16.f) / 116.f;
Y = t * t * t;
} else {
Y = L / float(kappa);
}
float a = ((52.f * L) / (u + 13.f * L * float(u0)) - 1.f) / 3.f;
float d = Y * (((39 * L) / (v + 13 * float(v0))) - 5.f);
float b = -5.f * Y;
X = (d - b) / (a + 1.f / 3.f);
Z = X * a + b;
X *= 65535.f;
Y *= 65535.f;
Z *= 65535.f;
}
/*
* Gamut mapping algorithm

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
@ -210,6 +210,11 @@ public:
return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2];
}
static vfloat rgbLuminance(vfloat r, vfloat g, vfloat b, const vfloat workingspace[3])
{
return r * workingspace[0] + g * workingspace[1] + b * workingspace[2];
}
/**
* @brief Convert red/green/blue to L*a*b
* @brief Convert red/green/blue to hue/saturation/luminance
@ -240,20 +245,20 @@ public:
static inline void rgb2slfloat(float r, float g, float b, float &s, float &l)
{
float m = min(r, g, b);
float M = max(r, g, b);
float C = M - m;
float minVal = min(r, g, b);
float maxVal = max(r, g, b);
float C = maxVal - minVal;
l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f)
l = (maxVal + minVal) * 7.6295109e-6f; // (0.5f / 65535.f)
if (C < 0.65535f) { // 0.00001f * 65535.f
s = 0.f;
} else {
if (l <= 0.5f) {
s = C / (M + m);
s = C / (maxVal + minVal);
} else {
s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f
s = C / (131070.f - (maxVal + minVal)); // 131070.f = 2.f * 65535.f
}
}
}
@ -261,11 +266,11 @@ public:
static inline void rgb2hslfloat(float r, float g, float b, float &h, float &s, float &l)
{
float m = min(r, g, b);
float M = max(r, g, b);
float C = M - m;
float minVal = min(r, g, b);
float maxVal = max(r, g, b);
float C = maxVal - minVal;
l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f)
l = (maxVal + minVal) * 7.6295109e-6f; // (0.5f / 65535.f)
if (C < 0.65535f) { // 0.00001f * 65535.f
h = 0.f;
@ -273,14 +278,14 @@ public:
} else {
if (l <= 0.5f) {
s = C / (M + m);
s = C / (maxVal + minVal);
} else {
s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f
s = C / (131070.f - (maxVal + minVal)); // 131070.f = 2.f * 65535.f
}
if ( r == M ) {
if ( r == maxVal ) {
h = (g - b);
} else if ( g == M ) {
} else if ( g == maxVal ) {
h = (2.f * C) + (b - r);
} else {
h = (4.f * C) + (r - g);
@ -686,32 +691,6 @@ public:
static void Lch2Luv(float c, float h, float &u, float &v);
/**
* @brief Convert the XYZ values to Luv values
* Warning: this method has never been used/tested so far
* @param x X coordinate [0 ; 65535] ; can be negative or superior to 65535
* @param y Y coordinate [0 ; 65535] ; can be negative or superior to 65535
* @param z Z coordinate [0 ; 65535] ; can be negative or superior to 65535
* @param L 'L' channel [0 ; 32768] (return value)
* @param u 'u' channel [-42000 ; 42000] ; can be more than 42000 (return value)
* @param v 'v' channel [-42000 ; 42000] ; can be more than 42000 (return value)
*/
static void XYZ2Luv (float X, float Y, float Z, float &L, float &u, float &v);
/**
* @brief Convert the Luv values to XYZ values
* Warning: this method has never been used/tested so far
* @param L 'L' channel [0 ; 32768]
* @param u 'u' channel [-42000 ; 42000] ; can be more than 42000
* @param v 'v' channel [-42000 ; 42000] ; can be more than 42000
* @param x X coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
* @param y Y coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
* @param z Z coordinate [0 ; 65535] ; can be negative or superior to 65535 (return value)
*/
static void Luv2XYZ (float L, float u, float v, float &X, float &Y, float &Z);
/**
* @brief Return "f" in function of CIE's kappa and epsilon constants
* @param f f can be fx fy fz where:
@ -1830,6 +1809,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);
}
}
};
}

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "colortemp.h"
#include "rtengine.h"
@ -1088,11 +1088,11 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
//};
gmul /= green;
//printf("rmul=%f gmul=%f bmul=%f\n",rmul, gmul, bmul);
double max = rtengine::max(rmul, gmul, bmul);
double maxRGB = rtengine::max(rmul, gmul, bmul);
rmul /= max;
gmul /= max;
bmul /= max;
rmul /= maxRGB;
gmul /= maxRGB;
bmul /= maxRGB;
if(settings->CRI_color != 0) { //activate if CRi_color !=0
@ -1104,7 +1104,6 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
// and calcul with : blackbody at equivalent temp of lamp
// CRI_color-1 = display Lab values of color CRI_color -1
const double whiteD50[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with this tool : spect 5nm
double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02
double Xchk[50], Ychk[50], Zchk[50]; //50 : I think it's a good limit for number of color : for CRI and Palette
double Xcam02[50], Ycam02[50], Zcam02[50];
@ -1113,9 +1112,6 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
const double epsilon = 0.008856; //Lab
double xr[50], yr[50], zr[50];
double fx[50], fy[50], fz[50];
double x, y, z;
double Ywb = 1.0;
int illum;
int numero_color = settings->CRI_color - 1;
@ -1223,6 +1219,9 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
}
if (CRI_type) {
double x, y, z;
double Ywb = 1.0;
const double* spect_illum[] = {
Daylight5300_spect, Cloudy6200_spect, Shade7600_spect, A2856_spect, FluoF1_spect, FluoF2_spect, FluoF3_spect,
FluoF4_spect, FluoF5_spect, FluoF6_spect, FluoF7_spect, FluoF8_spect, FluoF9_spect, FluoF10_spect, FluoF11_spect,
@ -1281,6 +1280,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
//calculate Matrix CAM02 : better than Von Kries and Bradford==> for Lamp
double adap = 1.0;
double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02
cieCAT02(Xwb, Ywb, Zwb, CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22, adap);
//here new value of X,Y,Z for lamp with chromatic CAM02 adaptation
@ -1306,6 +1306,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul,
//now conversion to Lab
// Lamp
double fx[50], fy[50], fz[50];
for(int i = 0; i < N_c; i++) {
xr[i] = Xcam02Lamp[i] / whiteD50[0];

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _COLORTEMP_
#define _COLORTEMP_

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "coord.h"

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __COORD__

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __COORD2D__
#define __COORD2D__

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*
* 2010 Ilya Popov <ilia_popov@rambler.ru>
* 2012 Emil Martinec <ejmartin@uchicago.edu>

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*
* 2010 Ilya Popov <ilia_popov@rambler.ru>
* 2012 Emil Martinec <ejmartin@uchicago.edu>
@ -45,7 +45,6 @@ private:
static const int maxlevels = 10;//should be greater than any conceivable order of decimation
int lvltot, subsamp;
int numThreads;
int m_w, m_h;//dimensions
int wavfilt_len, wavfilt_offset;
@ -97,7 +96,7 @@ public:
template<typename E>
wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop, int numThreads, int Daub4Len)
: coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), numThreads(numThreads), m_w(width), m_h(height)
: coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), m_w(width), m_h(height)
{
//initialize wavelet filters

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*
* 2012 Emil Martinec <ejmartin@uchicago.edu>
* 2014 Jacques Desmis <jdesmis@gmail.com>

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*
* 2010 Ilya Popov <ilia_popov@rambler.ru>
* 2012 Emil Martinec <ejmartin@uchicago.edu>

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <vector>
#include <algorithm>
@ -641,15 +641,15 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
}
// gamma correction
float val = Color::gammatab_srgb1[0];
float val0 = Color::gammatab_srgb1[0];
// apply brightness curve
if (brightcurve) {
val = brightcurve->getVal(val); // TODO: getVal(double) is very slow! Optimize with a LUTf
val0 = brightcurve->getVal(val0); // TODO: getVal(double) is very slow! Optimize with a LUTf
}
// store result in a temporary array
dcurve[0] = LIM01<float>(val);
dcurve[0] = LIM01<float>(val0);
for (int i = 1; i < 0x10000; i++) {
@ -1508,10 +1508,10 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
#endif
L1 = Lr * 327.68f;
float a, b, X, Y, Z;
float La, Lb, X, Y, Z;
// converting back to rgb
Color::Lch2Lab(c1, h1, a, b);
Color::Lab2XYZ(L1, a, b, X, Y, Z);
Color::Lch2Lab(c1, h1, La, Lb);
Color::Lab2XYZ(L1, La, Lb, X, Y, Z);
lut1[i] = X;
lut2[i] = Y;
lut3[i] = Z;
@ -1822,12 +1822,12 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const
{
// look at midtone slope
const float xd = 0.07;
const float tx[] = { 0.30, 0.35, 0.40, 0.45 }; // we only look in the midtone range
const float tx0[] = { 0.30, 0.35, 0.40, 0.45 }; // we only look in the midtone range
for (size_t i = 0; i < sizeof(tx) / sizeof(tx[0]); i++) {
float x0 = tx[i] - xd;
for (size_t i = 0; i < sizeof(tx0) / sizeof(tx0[0]); i++) {
float x0 = tx0[i] - xd;
float y0 = CurveFactory::gamma2(lutToneCurve[CurveFactory::igamma2(x0) * 65535.f] / 65535.f) - k * x0;
float x1 = tx[i] + xd;
float x1 = tx0[i] + xd;
float y1 = CurveFactory::gamma2(lutToneCurve[CurveFactory::igamma2(x1) * 65535.f] / 65535.f) - k * x1;
float slope = 1.0 + (y1 - y0) / (x1 - x0);
@ -1967,15 +1967,15 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
saturated_scale_factor = 1.f;
} else if (C < hilim) {
// S-curve transition between low and high limit
float x = (C - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
float cx = (C - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
if (x < 0.5f) {
x = 2.f * SQR(x);
if (cx < 0.5f) {
cx = 2.f * SQR(cx);
} else {
x = 1.f - 2.f * SQR(1 - x);
cx = 1.f - 2.f * SQR(1.f - cx);
}
saturated_scale_factor = (1.f - x) + saturated_scale_factor * x;
saturated_scale_factor = (1.f - cx) + saturated_scale_factor * cx;
} else {
// do nothing, high saturation color, keep scale factor
}
@ -1995,15 +1995,15 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
// do nothing, keep scale factor
} else if (nL < hilim) {
// S-curve transition
float x = (nL - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
float cx = (nL - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
if (x < 0.5f) {
x = 2.f * SQR(x);
if (cx < 0.5f) {
cx = 2.f * SQR(cx);
} else {
x = 1.f - 2.f * SQR(1 - x);
cx = 1.f - 2.f * SQR(1 - cx);
}
dark_scale_factor = dark_scale_factor * (1.0f - x) + x;
dark_scale_factor = dark_scale_factor * (1.0f - cx) + cx;
} else {
dark_scale_factor = 1.f;
}
@ -2021,15 +2021,15 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
// do nothing, keep scale factor
} else if (J < hilim) {
// S-curve transition
float x = (J - lolim) / (hilim - lolim);
float cx = (J - lolim) / (hilim - lolim);
if (x < 0.5f) {
x = 2.f * SQR(x);
if (cx < 0.5f) {
cx = 2.f * SQR(cx);
} else {
x = 1.f - 2.f * SQR(1 - x);
cx = 1.f - 2.f * SQR(1 - cx);
}
dark_scale_factor = dark_scale_factor * (1.f - x) + x;
dark_scale_factor = dark_scale_factor * (1.f - cx) + cx;
} else {
dark_scale_factor = 1.f;
}
@ -2089,15 +2089,15 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
keep = 1.f;
} else if (sat_scale < hilim) {
// S-curve transition
float x = (sat_scale - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
float cx = (sat_scale - lolim) / (hilim - lolim); // x = [0..1], 0 at lolim, 1 at hilim
if (x < 0.5f) {
x = 2.f * SQR(x);
if (cx < 0.5f) {
cx = 2.f * SQR(cx);
} else {
x = 1.f - 2.f * SQR(1 - x);
cx = 1.f - 2.f * SQR(1 - cx);
}
keep = (1.f - x) + keep * x;
keep = (1.f - cx) + keep * cx;
} else {
// do nothing, very high increase, keep minimum amount
}

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __CURVES_H__
#define __CURVES_H__
@ -31,7 +31,7 @@
#include "../rtgui/mydiagonalcurve.h"
#include "color.h"
#include "pipettebuffer.h"
#include "noncopyable.h"
#include "LUT.h"
#define CURVES_MIN_POLY_POINTS 1000
@ -468,7 +468,7 @@ protected:
void NURBS_set ();
public:
DiagonalCurve (const std::vector<double>& points, int ppn = CURVES_MIN_POLY_POINTS);
explicit DiagonalCurve (const std::vector<double>& points, int ppn = CURVES_MIN_POLY_POINTS);
~DiagonalCurve () override;
double getVal (double t) const override;
@ -479,7 +479,7 @@ public:
};
};
class FlatCurve : public Curve
class FlatCurve : public Curve, public rtengine::NonCopyable
{
private:
@ -493,7 +493,7 @@ private:
public:
FlatCurve (const std::vector<double>& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
explicit FlatCurve (const std::vector<double>& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
~FlatCurve () override;
double getVal (double t) const override;

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <iostream>
@ -333,8 +333,6 @@ double xyCoordToTemperature(const std::array<double, 2>& white_xy)
// Search for line pair coordinate is between.
double last_dt = 0.0;
double last_dv = 0.0;
double last_du = 0.0;
for (uint32_t index = 1; index <= 30; ++index) {
// Convert slope to delta-u and delta-v, with length 1.
@ -370,23 +368,11 @@ double xyCoordToTemperature(const std::array<double, 2>& white_xy)
// Interpolate the temperature.
res = 1.0e6 / (temp_table[index - 1].r * f + temp_table[index].r * (1.0 - f));
// Find delta from black body point to test coordinate.
uu = u - (temp_table [index - 1].u * f + temp_table [index].u * (1.0 - f));
vv = v - (temp_table [index - 1].v * f + temp_table [index].v * (1.0 - f));
// Interpolate vectors along slope.
du = du * (1.0 - f) + last_du * f;
dv = dv * (1.0 - f) + last_dv * f;
len = sqrt (du * du + dv * dv);
du /= len;
dv /= len;
break;
}
// Try next line pair.
last_dt = dt;
last_du = du;
last_dv = dv;
}
return res;
@ -2179,8 +2165,7 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll)
&& lastdot <= sname.size() - 4
&& !sname.casefold().compare(lastdot, 4, ".dcp")
) {
const Glib::ustring cam_short_name = sname.substr(0, lastdot).uppercase();
file_std_profiles[cam_short_name] = fname; // They will be loaded and cached on demand
file_std_profiles[sname.substr(0, lastdot).casefold_collate_key()] = fname; // They will be loaded and cached on demand
}
} else {
// Directory
@ -2191,11 +2176,10 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll)
for (const auto& alias : getAliases(rt_profile_dir)) {
const Glib::ustring alias_name = Glib::ustring(alias.first).uppercase();
const Glib::ustring real_name = Glib::ustring(alias.second).uppercase();
const std::map<Glib::ustring, Glib::ustring>::const_iterator real = file_std_profiles.find(real_name);
const std::map<std::string, Glib::ustring>::const_iterator real = file_std_profiles.find(Glib::ustring(alias.second).casefold_collate_key());
if (real != file_std_profiles.end()) {
file_std_profiles[alias_name] = real->second;
file_std_profiles[alias_name.casefold_collate_key()] = real->second;
}
}
}
@ -2217,19 +2201,19 @@ bool DCPStore::isValidDCPFileName(const Glib::ustring& filename) const
DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const
{
const auto key = filename.casefold_collate_key();
MyMutex::MyLock lock(mutex);
const std::map<std::string, DCPProfile*>::const_iterator iter = profile_cache.find(key);
const std::map<Glib::ustring, DCPProfile*>::iterator r = profile_cache.find(filename);
if (r != profile_cache.end()) {
return r->second;
if (iter != profile_cache.end()) {
return iter->second;
}
DCPProfile* const res = new DCPProfile(filename);
if (res->isValid()) {
// Add profile
profile_cache[filename] = res;
profile_cache[key] = res;
if (options.rtSettings.verbose) {
printf("DCP profile '%s' loaded from disk\n", filename.c_str());
}
@ -2242,13 +2226,9 @@ DCPProfile* DCPStore::getProfile(const Glib::ustring& filename) const
DCPProfile* DCPStore::getStdProfile(const Glib::ustring& requested_cam_short_name) const
{
const Glib::ustring name = requested_cam_short_name.uppercase();
// Warning: do NOT use map.find(), since it does not seem to work reliably here
for (const auto& file_std_profile : file_std_profiles) {
if (file_std_profile.first == name) {
return getProfile(file_std_profile.second);
}
const std::map<std::string, Glib::ustring>::const_iterator iter = file_std_profiles.find(requested_cam_short_name.casefold_collate_key());
if (iter != file_std_profiles.end()) {
return getProfile(iter->second);
}
// profile not found, looking if we're in loadAll=false mode

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
@ -169,10 +169,10 @@ private:
std::vector<Glib::ustring> profileDir;
// these contain standard profiles from RT. keys are all in uppercase, file path is value
std::map<Glib::ustring, Glib::ustring> file_std_profiles;
std::map<std::string, Glib::ustring> file_std_profiles;
// Maps file name to profile as cache
mutable std::map<Glib::ustring, DCPProfile*> profile_cache;
mutable std::map<std::string, DCPProfile*> profile_cache;
};
}

View File

@ -240,7 +240,7 @@ int CLASS fcol (int row, int col)
#ifndef __GLIBC__
char *my_memmem (char *haystack, size_t haystacklen,
char *needle, size_t needlelen)
const char *needle, size_t needlelen)
{
char *c;
for (c = haystack; c <= haystack + haystacklen - needlelen; c++)
@ -2417,59 +2417,78 @@ void CLASS hasselblad_correct()
void CLASS hasselblad_load_raw()
{
struct jhead jh;
int shot, row, col, *back[5], len[2], diff[12], pred, sh, f, s, c;
unsigned upix, urow, ucol;
ushort *ip;
struct jhead jh;
int *back[5], diff[12];
if (!ljpeg_start (&jh, 0)) return;
order = 0x4949;
ph1_bithuff_t ph1_bithuff(this, ifp, order);
hb_bits(-1);
back[4] = (int *) calloc (raw_width, 3*sizeof **back);
merror (back[4], "hasselblad_load_raw()");
FORC3 back[c] = back[4] + c*raw_width;
cblack[6] >>= sh = tiff_samples > 1;
shot = LIM(shot_select, 1, tiff_samples) - 1;
for (row=0; row < raw_height; row++) {
FORC4 back[(c+3) & 3] = back[c];
for (col=0; col < raw_width; col+=2) {
for (s=0; s < tiff_samples*2; s+=2) {
FORC(2) len[c] = ph1_huff(jh.huff[0]);
FORC(2) {
diff[s+c] = hb_bits(len[c]);
if ((diff[s+c] & (1 << (len[c]-1))) == 0)
diff[s+c] -= (1 << len[c]) - 1;
if (diff[s+c] == 65535) diff[s+c] = -32768;
}
}
for (s=col; s < col+2; s++) {
pred = 0x8000 + load_flags;
if (col) pred = back[2][s-2];
if (col && row > 1) switch (jh.psv) {
case 11: pred += back[0][s]/2 - back[0][s-2]/2; break;
}
f = (row & 1)*3 ^ ((col+s) & 1);
FORC (tiff_samples) {
pred += diff[(s & 1)*tiff_samples+c];
upix = pred >> sh & 0xffff;
if (raw_image && c == shot)
RAW(row,s) = upix;
if (image) {
urow = row-top_margin + (c & 1);
ucol = col-left_margin - ((c >> 1) & 1);
ip = &image[urow*width+ucol][f];
if (urow < height && ucol < width)
*ip = c < 4 ? upix : (*ip + upix) >> 1;
}
}
back[2][s] = pred;
}
if (!ljpeg_start (&jh, 0)) {
return;
}
order = 0x4949;
ph1_bithuff_t ph1_bithuff(this, ifp, order);
hb_bits(-1);
back[4] = (int *) calloc(raw_width, 3 * sizeof **back);
merror(back[4], "hasselblad_load_raw()");
for (int c = 0; c < 3; ++c) {
back[c] = back[4] + c * raw_width;
}
const int sh = tiff_samples > 1;
cblack[6] >>= sh;
const int shot = LIM(shot_select, 1, tiff_samples) - 1;
for (int row = 0; row < raw_height; ++row) {
for (int c = 0; c < 4; ++c) {
back[(c + 3) & 3] = back[c];
}
for (int col = 0; col < raw_width; col += 2) {
for (int s = 0; s < tiff_samples * 2; s += 2) {
const int len[2]= {
static_cast<int>(ph1_huff(jh.huff[0])),
static_cast<int>(ph1_huff(jh.huff[0]))
};
for (int c = 0; c < 2; ++c) {
diff[s + c] = hb_bits(len[c]);
if ((diff[s + c] & (1 << (len[c] - 1))) == 0) {
diff[s + c] -= (1 << len[c]) - 1;
}
if (diff[s + c] == 65535) {
diff[s + c] = -32768;
}
}
}
for (int s = col; s < col + 2; ++s) {
int pred;
if (col) {
pred = back[2][s - 2];
if (row > 1 && jh.psv == 11) {
pred += back[0][s] / 2 - back[0][s - 2] / 2;
}
} else {
pred = 0x8000 + load_flags;
}
for (int c = 0; c < tiff_samples; ++c) {
pred += diff[(s & 1) * tiff_samples + c];
const unsigned upix = pred >> sh & 0xffff;
if (raw_image && c == shot) {
RAW(row, s) = upix;
}
if (image) {
const int f = (row & 1) * 3 ^ ((col + s) & 1);
const unsigned urow = row - top_margin + (c & 1);
const unsigned ucol = col - left_margin - ((c >> 1) & 1);
ushort* const ip = &image[urow * width + ucol][f];
if (urow < height && ucol < width) {
*ip = c < 4 ? upix : (*ip + upix) >> 1;
}
}
}
back[2][s] = pred;
}
}
}
free(back[4]);
ljpeg_end(&jh);
if (image) {
mix_green = 1;
}
}
free (back[4]);
ljpeg_end (&jh);
if (image) mix_green = 1;
}
void CLASS leaf_hdr_load_raw()
@ -4216,8 +4235,8 @@ void CLASS foveon_interpolate()
foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3
- ddft[0][c][0] ) / 4 - ddft[0][c][1];
}
memcpy (black, black+8, sizeof *black*8);
memcpy (black+height-11, black+height-22, 11*sizeof *black);
memmove (black, black+8, sizeof *black*8);
memmove (black+height-11, black+height-22, 11*sizeof *black);
memcpy (last, black, sizeof last);
for (row=1; row < height-1; row++) {
@ -6549,6 +6568,31 @@ guess_cfa_pc:
cblack[4] = cblack[5] = MIN(sqrt(len),64);
case 50714: /* BlackLevel */
RT_blacklevel_from_constant = ThreeValBool::F;
//-----------------------------------------------------------------------------
// taken from LibRaw.
/*
Copyright 2008-2019 LibRaw LLC (info@libraw.org)
LibRaw is free software; you can redistribute it and/or modify
it under the terms of the one of two licenses as you choose:
1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
(See file LICENSE.LGPL provided in LibRaw distribution archive for details).
2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
(See file LICENSE.CDDL provided in LibRaw distribution archive for details).
*/
if (tiff_ifd[ifd].samples > 1 && tiff_ifd[ifd].samples == len) // LinearDNG, per-channel black
{
for (i = 0; i < 4 && i < len; i++)
{
double b = getreal(type);
cblack[i] = b+0.5;
}
black = 0;
} else
//-----------------------------------------------------------------------------
if(cblack[4] * cblack[5] == 0) {
int dblack[] = { 0,0,0,0 };
black = getreal(type);
@ -9233,8 +9277,8 @@ void CLASS identify()
fseek (ifp, 0, SEEK_SET);
fread (head, 1, 32, ifp);
/* RT: changed string constant */
if ((cp = (char *) memmem (head, 32, (char*)"MMMM", 4)) ||
(cp = (char *) memmem (head, 32, (char*)"IIII", 4))) {
if ((cp = (char *) memmem (head, 32, "MMMM", 4)) ||
(cp = (char *) memmem (head, 32, "IIII", 4))) {
parse_phase_one (cp-head);
if (cp-head && parse_tiff(0)) apply_tiff();
} else if (order == 0x4949 || order == 0x4d4d) {

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef DCRAW_H

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "curves.h"
#include "dcrop.h"
@ -204,10 +204,8 @@ void Crop::update(int todo)
}
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
int kall = 2;
parent->ipf.Tile_calc(tilesize, overlap, kall, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
kall = 0;
parent->ipf.Tile_calc(tilesize, overlap, 2, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
float *min_b = new float [9];
float *min_r = new float [9];
@ -653,10 +651,9 @@ void Crop::update(int todo)
if (todo & M_LINDENOISE) {
if (skip == 1 && denoiseParams.enabled) {
int kall = 0;
float nresi, highresi;
parent->ipf.RGB_denoise(kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi);
parent->ipf.RGB_denoise(0, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi);
if (parent->adnListener) {
parent->adnListener->noiseChanged(nresi, highresi);
@ -885,9 +882,6 @@ void Crop::update(int todo)
if (skip == 1) {
if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) {
parent->ipf.impulsedenoise(labnCrop);
}
if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) {
parent->ipf.defringe(labnCrop);
}
@ -900,7 +894,6 @@ void Crop::update(int todo)
}
// if (skip==1) {
WaveletParams WaveParams = params.wavelet;
if (params.dirpyrequalizer.cbdlMethod == "aft") {
if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) {
@ -909,81 +902,81 @@ void Crop::update(int todo)
}
}
int kall = 0;
int minwin = min(labnCrop->W, labnCrop->H);
int maxlevelcrop = 10;
// if(cp.mul[9]!=0)maxlevelcrop=10;
// adap maximum level wavelet to size of crop
if (minwin * skip < 1024) {
maxlevelcrop = 9; //sampling wavelet 512
}
if (minwin * skip < 512) {
maxlevelcrop = 8; //sampling wavelet 256
}
if (minwin * skip < 256) {
maxlevelcrop = 7; //sampling 128
}
if (minwin * skip < 128) {
maxlevelcrop = 6;
}
if (minwin < 64) {
maxlevelcrop = 5;
}
int realtile;
if (params.wavelet.Tilesmethod == "big") {
realtile = 22;
} else /*if (params.wavelet.Tilesmethod == "lit")*/ {
realtile = 12;
}
int tilesize = 128 * realtile;
int overlap = (int) tilesize * 0.125f;
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
parent->ipf.Tile_calc(tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
//now we have tile dimensions, overlaps
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int minsizetile = min(tilewidth, tileheight);
int maxlev2 = 10;
if (minsizetile < 1024 && maxlevelcrop == 10) {
maxlev2 = 9;
}
if (minsizetile < 512) {
maxlev2 = 8;
}
if (minsizetile < 256) {
maxlev2 = 7;
}
if (minsizetile < 128) {
maxlev2 = 6;
}
int maxL = min(maxlev2, maxlevelcrop);
if (parent->awavListener) {
parent->awavListener->wavChanged(float (maxL));
}
if ((params.wavelet.enabled)) {
WaveletParams WaveParams = params.wavelet;
int kall = 0;
int minwin = min(labnCrop->W, labnCrop->H);
int maxlevelcrop = 10;
// if(cp.mul[9]!=0)maxlevelcrop=10;
// adap maximum level wavelet to size of crop
if (minwin * skip < 1024) {
maxlevelcrop = 9; //sampling wavelet 512
}
if (minwin * skip < 512) {
maxlevelcrop = 8; //sampling wavelet 256
}
if (minwin * skip < 256) {
maxlevelcrop = 7; //sampling 128
}
if (minwin * skip < 128) {
maxlevelcrop = 6;
}
if (minwin < 64) {
maxlevelcrop = 5;
}
int realtile;
if (params.wavelet.Tilesmethod == "big") {
realtile = 22;
} else /*if (params.wavelet.Tilesmethod == "lit")*/ {
realtile = 12;
}
int tilesize = 128 * realtile;
int overlap = (int) tilesize * 0.125f;
int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip;
parent->ipf.Tile_calc(tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip);
//now we have tile dimensions, overlaps
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int minsizetile = min(tilewidth, tileheight);
int maxlev2 = 10;
if (minsizetile < 1024 && maxlevelcrop == 10) {
maxlev2 = 9;
}
if (minsizetile < 512) {
maxlev2 = 8;
}
if (minsizetile < 256) {
maxlev2 = 7;
}
if (minsizetile < 128) {
maxlev2 = 6;
}
int maxL = min(maxlev2, maxlevelcrop);
if (parent->awavListener) {
parent->awavListener->wavChanged(float (maxL));
}
WavCurve wavCLVCurve;
WavOpacityCurveRG waOpacityCurveRG;
WavOpacityCurveBY waOpacityCurveBY;
WavOpacityCurveW waOpacityCurveW;
WavOpacityCurveWL waOpacityCurveWL;
LUTf wavclCurve;
LUTu dummy;
params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL);

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cmath>
#include <cassert>
@ -1121,7 +1121,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D<float> &r
* Contact info: luis.sanz.rodriguez@gmail.com
*
* This code is distributed under a GNU General Public License, version 3.
* Visit <http://www.gnu.org/licenses/> for more information.
* Visit <https://www.gnu.org/licenses/> 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
//

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "dfmanager.h"
#include "../rtgui/options.h"
@ -328,8 +328,8 @@ void DFManager::init(const Glib::ustring& pathname)
} else {
printf( "%s: MEAN of \n ", i.key().c_str());
for( std::list<Glib::ustring>::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) {
printf( "%s, ", iter->c_str() );
for(std::list<Glib::ustring>::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) {
printf("%s, ", path->c_str());
}
printf("\n");

View File

@ -14,12 +14,16 @@
* 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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <string>
#include <glibmm/ustring.h>
#include <map>
#pragma once
#include <cmath>
#include <map>
#include <string>
#include <glibmm/ustring.h>
#include "pixelsmap.h"
#include "rawimage.h"

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <glib.h>
#include <glib/gstdio.h>
@ -230,7 +230,6 @@ void DiagonalCurve::NURBS_set ()
poly_x.clear();
poly_y.clear();
unsigned int sc_xsize = j - 1;
j = 0;
// adding the initial horizontal segment, if any
if (x[0] > 0.) {
@ -314,18 +313,13 @@ inline void catmull_rom_spline(int n_points,
double space = (t2-t1) / n_points;
double t;
int i;
double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y;
double B1_x, B1_y, B2_x, B2_y, C_x, C_y;
res_x.push_back(p1_x);
res_y.push_back(p1_y);
// special case, a segment at 0 or 1 is computed exactly
if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) {
for (i = 1; i < n_points-1; ++i) {
t = p1_x + space * i;
for (int i = 1; i < n_points-1; ++i) {
double t = p1_x + space * i;
if (t >= p2_x) {
break;
}
@ -333,38 +327,38 @@ inline void catmull_rom_spline(int n_points,
res_y.push_back(p1_y);
}
} else {
for (i = 1; i < n_points-1; ++i) {
t = t1 + space * i;
for (int i = 1; i < n_points-1; ++i) {
double t = t1 + space * i;
c = (t1 - t)/(t1 - t0);
d = (t - t0)/(t1 - t0);
A1_x = c * p0_x + d * p1_x;
A1_y = c * p0_y + d * p1_y;
double c = (t1 - t)/(t1 - t0);
double d = (t - t0)/(t1 - t0);
double A1_x = c * p0_x + d * p1_x;
double A1_y = c * p0_y + d * p1_y;
c = (t2 - t)/(t2 - t1);
d = (t - t1)/(t2 - t1);
A2_x = c * p1_x + d * p2_x;
A2_y = c * p1_y + d * p2_y;
double A2_x = c * p1_x + d * p2_x;
double A2_y = c * p1_y + d * p2_y;
c = (t3 - t)/(t3 - t2);
d = (t - t2)/(t3 - t2);
A3_x = c * p2_x + d * p3_x;
A3_y = c * p2_y + d * p3_y;
double A3_x = c * p2_x + d * p3_x;
double A3_y = c * p2_y + d * p3_y;
c = (t2 - t)/(t2 - t0);
d = (t - t0)/(t2 - t0);
B1_x = c * A1_x + d * A2_x;
B1_y = c * A1_y + d * A2_y;
double B1_x = c * A1_x + d * A2_x;
double B1_y = c * A1_y + d * A2_y;
c = (t3 - t)/(t3 - t1);
d = (t - t1)/(t3 - t1);
B2_x = c * A2_x + d * A3_x;
B2_y = c * A2_y + d * A3_y;
double B2_x = c * A2_x + d * A3_x;
double B2_y = c * A2_y + d * A3_y;
c = (t2 - t)/(t2 - t1);
d = (t - t1)/(t2 - t1);
C_x = c * B1_x + d * B2_x;
C_y = c * B1_y + d * B2_y;
double C_x = c * B1_x + d * B2_x;
double C_y = c * B1_y + d * B2_y;
res_x.push_back(C_x);
res_y.push_back(C_y);
@ -512,7 +506,6 @@ double DiagonalCurve::getVal (double t) const
++d;
}
return LIM01(*(poly_y.begin() + d));
break;
}
case DCT_NURBS : {

File diff suppressed because it is too large Load Diff

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "../rtengine/dynamicprofile.h"

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef _DYNAMICPROFILE_H_
#define _DYNAMICPROFILE_H_

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <cmath>

View File

@ -1,94 +0,0 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "rtengine.h"
#include <iostream>
//#include <giomm.h>
#include <helpers.h>
class PListener :
public rtengine::ProgressListener
{
public:
void setProgressStr(const Glib::ustring& str)
{
std::cout << str << std::endl;
}
void setProgress (double p)
{
std::cout << p << std::endl;
}
void setProgressState(bool inProcessing)
{
}
void error(const Glib::ustring& descr)
{
}
};
int main (int argc, char* argv[])
{
if (argc < 4) {
std::cout << "Usage: rtcmd <infile> <paramfile> <outfile>" << std::endl;
exit(1);
}
Glib::thread_init ();
// create and fill settings
rtengine::Settings* s = rtengine::Settings::create ();
s->demosaicMethod = "hphd";
s->colorCorrectionSteps = 2;
s->iccDirectory = "";
s->colorimetricIntent = 1;
s->monitorProfile = "";
// init rtengine
rtengine::init (s);
// the settings can be modified later through the "s" pointer without calling any api function
// Create a listener object. Any class is appropriate that inherits from rtengine::ProgressListener
PListener pl;
// Load the image given in the first command line parameter
rtengine::InitialImage* ii;
int errorCode;
ii = rtengine::InitialImage::load (argv[1], true, errorCode, &pl);
if (!ii) {
ii = rtengine::InitialImage::load (argv[1], false, errorCode, &pl);
}
if (!ii) {
std::cout << "Input file not supported." << std::endl;
exit(2);
}
// create an instance of ProcParams structure that holds the image processing settings. You find the memory map in a separate file and the non-basic types like strings and vectors can be manipulated through helper functions
rtengine::procparams::ProcParams params;
params.load (argv[2]);
/* First, simplest scenario. Develop image and save it in a file */
// create a processing job with the loaded image and the current processing parameters
rtengine::ProcessingJob* job = ProcessingJob::create (i, params);
// process image. The error is given back in errorcode.
rtengine::IImage16* res = rtengine::processImage (job, errorCode, &pl);
// save image to disk
res->saveToFile (argv[3]);
// through "res" you can access width/height and pixel data, too
}

View File

@ -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 <http://www.gnu.org/licenses/>.
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////

View File

@ -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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include "ffmanager.h"
#include "../rtgui/options.h"
@ -277,8 +277,8 @@ void FFManager::init(const Glib::ustring& pathname)
} else {
printf( "%s: MEAN of \n ", i.key().c_str());
for( std::list<Glib::ustring>::iterator iter = i.pathNames.begin(); iter != i.pathNames.end(); ++iter ) {
printf( "%s, ", iter->c_str() );
for(std::list<Glib::ustring>::iterator path = i.pathNames.begin(); path != i.pathNames.end(); ++path) {
printf("%s, ", path->c_str());
}
printf("\n");

View File

@ -14,12 +14,16 @@
* 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 <http://www.gnu.org/licenses/>.
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
*/
#include <string>
#include <glibmm/ustring.h>
#include <map>
#pragma once
#include <cmath>
#include <map>
#include <string>
#include <glibmm/ustring.h>
#include "rawimage.h"
namespace rtengine

View File

@ -0,0 +1,403 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2019 Alberto Romei <aldrop8@gmail.com>
*
* 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 <https://www.gnu.org/licenses/>.
*/
#include <cmath>
#include <iostream>
#ifdef _OPENMP
#include <omp.h>
#endif
#include "rawimagesource.h"
#include "mytime.h"
#include "opthelper.h"
#include "procparams.h"
#include "rt_algo.h"
#include "rtengine.h"
//#define BENCHMARK
#include "StopWatch.h"
namespace rtengine
{
extern const Settings* settings;
}
namespace
{
bool channelsAvg(
const rtengine::RawImage* ri,
int width,
int height,
const float* cblacksom,
rtengine::Coord spotPos,
int spotSize,
const rtengine::procparams::FilmNegativeParams& params,
std::array<float, 3>& avgs
)
{
avgs = {}; // Channel averages
if (ri->getSensorType() != rtengine::ST_BAYER && ri->getSensorType() != rtengine::ST_FUJI_XTRANS) {
return false;
}
if (rtengine::settings->verbose) {
printf("Spot coord: x=%d y=%d\n", spotPos.x, spotPos.y);
}
const int half_spot_size = spotSize / 2;
const int& x1 = spotPos.x - half_spot_size;
const int& x2 = spotPos.x + half_spot_size;
const int& y1 = spotPos.y - half_spot_size;
const int& y2 = spotPos.y + half_spot_size;
if (x1 < 0 || x2 > width || y1 < 0 || y2 > height) {
return false; // Spot goes outside bounds, bail out.
}
std::array<int, 3> pxCount = {}; // Per-channel sample counts
for (int c = x1; c < x2; ++c) {
for (int r = y1; r < y2; ++r) {
const int ch = ri->getSensorType() == rtengine::ST_BAYER ? ri->FC(r,c) : ri->XTRANSFC(r,c);
++pxCount[ch];
// Sample the original unprocessed values from RawImage, subtracting black levels.
// Scaling is irrelevant, as we are only interested in the ratio between two spots.
avgs[ch] += ri->data[r][c] - cblacksom[ch];
}
}
for (int ch = 0; ch < 3; ++ch) {
avgs[ch] /= pxCount[ch];
}
return true;
}
}
bool rtengine::RawImageSource::getFilmNegativeExponents(Coord2D spotA, Coord2D spotB, int tran, const FilmNegativeParams &currentParams, std::array<float, 3>& newExps)
{
newExps = {
static_cast<float>(currentParams.redRatio * currentParams.greenExp),
static_cast<float>(currentParams.greenExp),
static_cast<float>(currentParams.blueRatio * currentParams.greenExp)
};
constexpr int spotSize = 32; // TODO: Make this configurable?
Coord spot;
std::array<float, 3> clearVals;
std::array<float, 3> denseVals;
// Sample first spot
transformPosition(spotA.x, spotA.y, tran, spot.x, spot.y);
if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, clearVals)) {
return false;
}
// Sample second spot
transformPosition(spotB.x, spotB.y, tran, spot.x, spot.y);
if (!channelsAvg(ri, W, H, cblacksom, spot, spotSize, currentParams, denseVals)) {
return false;
}
// Detect which one is the dense spot, based on green channel
if (clearVals[1] < denseVals[1]) {
std::swap(clearVals, denseVals);
}
if (settings->verbose) {
printf("Clear film values: R=%g G=%g B=%g\n", clearVals[0], clearVals[1], clearVals[2]);
printf("Dense film values: R=%g G=%g B=%g\n", denseVals[0], denseVals[1], denseVals[2]);
}
const float denseGreenRatio = clearVals[1] / denseVals[1];
// Calculate logarithms in arbitrary base
const auto logBase =
[](float base, float num) -> float
{
return std::log(num) / std::log(base);
};
// Calculate exponents for each channel, based on the ratio between the bright and dark values,
// compared to the ratio in the reference channel (green)
for (int ch = 0; ch < 3; ++ch) {
if (ch == 1) {
newExps[ch] = 1.f; // Green is the reference channel
} else {
newExps[ch] = CLAMP(logBase(clearVals[ch] / denseVals[ch], denseGreenRatio), 0.3f, 4.f);
}
}
if (settings->verbose) {
printf("New exponents: R=%g G=%g B=%g\n", newExps[0], newExps[1], newExps[2]);
}
return true;
}
void rtengine::RawImageSource::filmNegativeProcess(const procparams::FilmNegativeParams &params)
{
// BENCHFUNMICRO
if (!params.enabled) {
return;
}
// Exponents are expressed as positive in the parameters, so negate them in order
// to get the reciprocals.
const std::array<float, 3> exps = {
static_cast<float>(-params.redRatio * params.greenExp),
static_cast<float>(-params.greenExp),
static_cast<float>(-params.blueRatio * params.greenExp)
};
MyTime t1, t2, t3,t4, t5;
t1.set();
// Channel vectors to calculate medians
std::array<std::vector<float>, 3> cvs;
// Sample one every 5 pixels, and push the value in the appropriate channel vector.
// Choose an odd step, not a multiple of the CFA size, to get a chance to visit each channel.
if (ri->getSensorType() == ST_BAYER) {
for (int row = 0; row < H; row += 5) {
const int c0 = ri->FC(row, 0);
const int c1 = ri->FC(row, 5);
int col = 0;
for (; col < W - 5; col += 10) {
cvs[c0].push_back(rawData[row][col]);
cvs[c1].push_back(rawData[row][col + 5]);
}
if (col < W) {
cvs[c0].push_back(rawData[row][col]);
}
}
}
else if (ri->getSensorType() == ST_FUJI_XTRANS) {
for (int row = 0; row < H; row += 5) {
const std::array<unsigned int, 6> cs = {
ri->XTRANSFC(row, 0),
ri->XTRANSFC(row, 5),
ri->XTRANSFC(row, 10),
ri->XTRANSFC(row, 15),
ri->XTRANSFC(row, 20),
ri->XTRANSFC(row, 25)
};
int col = 0;
for (; col < W - 25; col += 30) {
for (int c = 0; c < 6; ++c) {
cvs[cs[c]].push_back(rawData[row][col + c * 5]);
}
}
for (int c = 0; col < W; col += 5, ++c) {
cvs[cs[c]].push_back(rawData[row][col]);
}
}
}
constexpr float MAX_OUT_VALUE = 65000.f;
t2.set();
if (settings->verbose) {
printf("Median vector fill loop time us: %d\n", t2.etime(t1));
}
t2.set();
std::array<float, 3> medians; // Channel median values
std::array<float, 3> mults = {
1.f,
1.f,
1.f
}; // Channel normalization multipliers
for (int c = 0; c < 3; ++c) {
// Find median values for each channel
if (!cvs[c].empty()) {
findMinMaxPercentile(cvs[c].data(), cvs[c].size(), 0.5f, medians[c], 0.5f, medians[c], true);
medians[c] = pow_F(rtengine::max(medians[c], 1.f), exps[c]);
// Determine the channel multiplier so that N times the median becomes 65k. This clips away
// the values in the dark border surrounding the negative (due to the film holder, for example),
// the reciprocal of which have blown up to stellar values.
mults[c] = MAX_OUT_VALUE / (medians[c] * 24.f);
}
}
t3.set();
if (settings->verbose) {
printf("Sample count: %zu, %zu, %zu\n", cvs[0].size(), cvs[1].size(), cvs[2].size());
printf("Medians: %g %g %g\n", medians[0], medians[1], medians[2] );
printf("Computed multipliers: %g %g %g\n", mults[0], mults[1], mults[2] );
printf("Median calc time us: %d\n", t3.etime(t2));
}
constexpr float CLIP_VAL = 65535.f;
t3.set();
if (ri->getSensorType() == ST_BAYER) {
#ifdef __SSE2__
const vfloat onev = F2V(1.f);
const vfloat clipv = F2V(CLIP_VAL);
#endif
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 16)
#endif
for (int row = 0; row < H; ++row) {
int col = 0;
// Avoid trouble with zeroes, minimum pixel value is 1.
const float exps0 = exps[FC(row, col)];
const float exps1 = exps[FC(row, col + 1)];
const float mult0 = mults[FC(row, col)];
const float mult1 = mults[FC(row, col + 1)];
#ifdef __SSE2__
const vfloat expsv = _mm_setr_ps(exps0, exps1, exps0, exps1);
const vfloat multsv = _mm_setr_ps(mult0, mult1, mult0, mult1);
for (; col < W - 3; col += 4) {
STVFU(rawData[row][col], vminf(multsv * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv), clipv));
}
#endif // __SSE2__
for (; col < W - 1; col += 2) {
rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL);
rawData[row][col + 1] = rtengine::min(mult1 * pow_F(rtengine::max(rawData[row][col + 1], 1.f), exps1), CLIP_VAL);
}
if (col < W) {
rawData[row][col] = rtengine::min(mult0 * pow_F(rtengine::max(rawData[row][col], 1.f), exps0), CLIP_VAL);
}
}
} else if (ri->getSensorType() == ST_FUJI_XTRANS) {
#ifdef __SSE2__
const vfloat onev = F2V(1.f);
const vfloat clipv = F2V(CLIP_VAL);
#endif
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic, 16)
#endif
for (int row = 0; row < H; row ++) {
int col = 0;
// Avoid trouble with zeroes, minimum pixel value is 1.
const std::array<float, 6> expsc = {
exps[ri->XTRANSFC(row, 0)],
exps[ri->XTRANSFC(row, 1)],
exps[ri->XTRANSFC(row, 2)],
exps[ri->XTRANSFC(row, 3)],
exps[ri->XTRANSFC(row, 4)],
exps[ri->XTRANSFC(row, 5)]
};
const std::array<float, 6> multsc = {
mults[ri->XTRANSFC(row, 0)],
mults[ri->XTRANSFC(row, 1)],
mults[ri->XTRANSFC(row, 2)],
mults[ri->XTRANSFC(row, 3)],
mults[ri->XTRANSFC(row, 4)],
mults[ri->XTRANSFC(row, 5)]
};
#ifdef __SSE2__
const vfloat expsv0 = _mm_setr_ps(expsc[0], expsc[1], expsc[2], expsc[3]);
const vfloat expsv1 = _mm_setr_ps(expsc[4], expsc[5], expsc[0], expsc[1]);
const vfloat expsv2 = _mm_setr_ps(expsc[2], expsc[3], expsc[4], expsc[5]);
const vfloat multsv0 = _mm_setr_ps(multsc[0], multsc[1], multsc[2], multsc[3]);
const vfloat multsv1 = _mm_setr_ps(multsc[4], multsc[5], multsc[0], multsc[1]);
const vfloat multsv2 = _mm_setr_ps(multsc[2], multsc[3], multsc[4], multsc[5]);
for (; col < W - 11; col += 12) {
STVFU(rawData[row][col], vminf(multsv0 * pow_F(vmaxf(LVFU(rawData[row][col]), onev), expsv0), clipv));
STVFU(rawData[row][col + 4], vminf(multsv1 * pow_F(vmaxf(LVFU(rawData[row][col + 4]), onev), expsv1), clipv));
STVFU(rawData[row][col + 8], vminf(multsv2 * pow_F(vmaxf(LVFU(rawData[row][col + 8]), onev), expsv2), clipv));
}
#endif // __SSE2__
for (; col < W - 5; col += 6) {
for (int c = 0; c < 6; ++c) {
rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL);
}
}
for (int c = 0; col < W; col++, c++) {
rawData[row][col + c] = rtengine::min(multsc[c] * pow_F(rtengine::max(rawData[row][col + c], 1.f), expsc[c]), CLIP_VAL);
}
}
}
t4.set();
if (settings->verbose) {
printf("Pow loop time us: %d\n", t4.etime(t3));
}
t4.set();
PixelsMap bitmapBads(W, H);
int totBP = 0; // Hold count of bad pixels to correct
if (ri->getSensorType() == ST_BAYER) {
#ifdef _OPENMP
#pragma omp parallel for reduction(+:totBP) schedule(dynamic,16)
#endif
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
if (rawData[i][j] >= MAX_OUT_VALUE) {
bitmapBads.set(j, i);
++totBP;
}
}
}
if (totBP > 0) {
interpolateBadPixelsBayer(bitmapBads, rawData);
}
}
else if (ri->getSensorType() == ST_FUJI_XTRANS) {
#ifdef _OPENMP
#pragma omp parallel for reduction(+:totBP) schedule(dynamic,16)
#endif
for (int i = 0; i < H; ++i) {
for (int j = 0; j < W; ++j) {
if (rawData[i][j] >= MAX_OUT_VALUE) {
bitmapBads.set(j, i);
totBP++;
}
}
}
if (totBP > 0) {
interpolateBadPixelsXtrans(bitmapBads);
}
}
t5.set();
if (settings->verbose) {
printf("Bad pixels count: %d\n", totBP);
printf("Bad pixels interpolation time us: %d\n", t5.etime(t4));
}
}

View File

@ -0,0 +1,130 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2019 Alberto Romei <aldrop8@gmail.com>
*
* 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 <https://www.gnu.org/licenses/>.
*/
#include <cmath>
#include "rtengine.h"
#include "rtthumbnail.h"
#include "opthelper.h"
#include "rt_algo.h"
#include "rtengine.h"
#include "settings.h"
#include "procparams.h"
#define BENCHMARK
#include "StopWatch.h"
namespace rtengine
{
extern const Settings* settings;
}
void rtengine::Thumbnail::processFilmNegative(
const procparams::ProcParams &params,
const Imagefloat* baseImg,
const int rwidth, const int rheight,
float &rmi, float &gmi, float &bmi
) {
// Channel exponents
const float rexp = -params.filmNegative.redRatio * params.filmNegative.greenExp;
const float gexp = -params.filmNegative.greenExp;
const float bexp = -params.filmNegative.blueRatio * params.filmNegative.greenExp;
// Need to calculate channel averages, to fake the same conditions
// found in rawimagesource, where get_ColorsCoeff is called with
// forceAutoWB=true.
float rsum = 0.f, gsum = 0.f, bsum = 0.f;
// Channel vectors to calculate medians
std::vector<float> rv, gv, bv;
for (int i = 0; i < rheight; i++) {
for (int j = 0; j < rwidth; j++) {
const float r = baseImg->r(i, j);
const float g = baseImg->g(i, j);
const float b = baseImg->b(i, j);
rsum += r;
gsum += g;
bsum += b;
rv.push_back(r);
gv.push_back(g);
bv.push_back(b);
}
}
const float ravg = rsum / (rheight*rwidth);
const float gavg = gsum / (rheight*rwidth);
const float bavg = bsum / (rheight*rwidth);
// Shifting current WB multipliers, based on channel averages.
rmi /= (gavg/ravg);
// gmi /= (gAvg/gAvg); green chosen as reference channel
bmi /= (gavg/bavg);
float rmed, gmed, bmed;
findMinMaxPercentile(rv.data(), rv.size(), 0.5f, rmed, 0.5f, rmed, true);
findMinMaxPercentile(gv.data(), gv.size(), 0.5f, gmed, 0.5f, gmed, true);
findMinMaxPercentile(bv.data(), bv.size(), 0.5f, bmed, 0.5f, bmed, true);
rmed = powf(rmed, rexp);
gmed = powf(gmed, gexp);
bmed = powf(bmed, bexp);
const float MAX_OUT_VALUE = 65000.f;
const float rmult = (MAX_OUT_VALUE / (rmed * 24)) ;
const float gmult = (MAX_OUT_VALUE / (gmed * 24)) ;
const float bmult = (MAX_OUT_VALUE / (bmed * 24)) ;
if (settings->verbose) {
printf("Thumbnail channel medians: %g %g %g\n", rmed, gmed, bmed);
printf("Thumbnail computed multipliers: %g %g %g\n", rmult, gmult, bmult);
}
#ifdef __SSE2__
const vfloat clipv = F2V(MAXVALF);
const vfloat rexpv = F2V(rexp);
const vfloat gexpv = F2V(gexp);
const vfloat bexpv = F2V(bexp);
const vfloat rmultv = F2V(rmult);
const vfloat gmultv = F2V(gmult);
const vfloat bmultv = F2V(bmult);
#endif
for (int i = 0; i < rheight; i++) {
float *rline = baseImg->r(i);
float *gline = baseImg->g(i);
float *bline = baseImg->b(i);
int j = 0;
#ifdef __SSE2__
for (; j < rwidth - 3; j +=4) {
STVFU(rline[j], vminf(rmultv * pow_F(LVFU(rline[j]), rexpv), clipv));
STVFU(gline[j], vminf(gmultv * pow_F(LVFU(gline[j]), gexpv), clipv));
STVFU(bline[j], vminf(bmultv * pow_F(LVFU(bline[j]), bexpv), clipv));
}
#endif
for (; j < rwidth; ++j) {
rline[j] = CLIP(rmult * pow_F(rline[j], rexp));
gline[j] = CLIP(gmult * pow_F(gline[j], gexp));
bline[j] = CLIP(bmult * pow_F(bline[j], bexp));
}
}
}

Some files were not shown because too many files have changed in this diff Show More