Merge branch 'dev' into metadata-exiv2
- Rating (#5325) not yet implemented
This commit is contained in:
commit
28f0bc14da
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@
|
||||
.project
|
||||
.settings
|
||||
.directory
|
||||
.vscode
|
||||
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
30
README.md
30
README.md
@ -1,41 +1,41 @@
|
||||

|
||||

|
||||
|
||||
RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](http://www.gtk.org/) front-end. It uses a patched version of [dcraw](http://www.cybercom.net/~dcoffin/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
|
||||
RawTherapee is a powerful, cross-platform raw photo processing program, released as [libre software](https://en.wikipedia.org/wiki/Free_software) under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html). It is written mostly in C++ using a [GTK+](https://www.gtk.org) front-end. It uses a patched version of [dcraw](https://www.dechifro.org/dcraw/) for reading raw files, with an in-house solution which adds the highest quality support for certain camera models unsupported by dcraw and enhances the accuracy of certain raw files already supported by dcraw. It is notable for the advanced control it gives the user over the demosaicing and development process.
|
||||
|
||||
## Target audience
|
||||
## Target Audience
|
||||
|
||||
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](http://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
|
||||
RawTherapee is designed for developing raw files from a broad range of digital cameras, as well as [HDR DNG](https://helpx.adobe.com/photoshop/digital-negative.html) files and non-raw image formats ([JPEG](https://en.wikipedia.org/wiki/JPEG), [TIFF](https://en.wikipedia.org/wiki/Tagged_Image_File_Format) and [PNG](https://en.wikipedia.org/wiki/Portable_Network_Graphics)). The target audience ranges from enthusiast newcomers who wish to broaden their understanding of how digital imaging works to semi-professional photographers. Knowledge in color science is not compulsory, but it is recommended that you are eager to learn and ready to read our documentation ([RawPedia](https://rawpedia.rawtherapee.com/)) as well as look up basic concepts which lie outside the scope of RawPedia, such as [color balance](https://en.wikipedia.org/wiki/Color_balance), elsewhere.
|
||||
|
||||
Of course, professionals may use RawTherapee too while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
|
||||
Professionals may use RawTherapee as well while enjoying complete freedom, but will probably lack some peripheral features such as [Digital Asset Management](https://en.wikipedia.org/wiki/Digital_asset_management), printing, uploading, etc. RawTherapee is not aimed at being an inclusive all-in-one program, and the [open-source community](https://en.wikipedia.org/wiki/Open-source_movement) is sufficiently developed by now to offer all those peripheral features in other specialized software.
|
||||
|
||||
## Links
|
||||
|
||||
Website:
|
||||
http://rawtherapee.com/
|
||||
https://www.rawtherapee.com/
|
||||
|
||||
Forum:
|
||||
https://discuss.pixls.us/c/software/rawtherapee
|
||||
|
||||
Features:
|
||||
http://rawpedia.rawtherapee.com/Features
|
||||
https://rawpedia.rawtherapee.com/Features
|
||||
|
||||
Official documentation:
|
||||
http://rawpedia.rawtherapee.com/
|
||||
Documentation:
|
||||
https://rawpedia.rawtherapee.com/
|
||||
|
||||
Download RawTherapee:
|
||||
http://rawtherapee.com/downloads
|
||||
https://www.rawtherapee.com/downloads
|
||||
|
||||
Download source code tarballs:
|
||||
http://rawtherapee.com/shared/source/
|
||||
https://www.rawtherapee.com/shared/source/
|
||||
|
||||
## Compilation, branches and Git
|
||||
## Compilation, Branches and Git
|
||||
Refer to RawPedia for a detailed explanation of how to get the necessary dependencies and how to compile RawTherapee.
|
||||
|
||||
Linux:
|
||||
http://rawpedia.rawtherapee.com/Linux
|
||||
https://rawpedia.rawtherapee.com/Linux
|
||||
|
||||
Windows:
|
||||
http://rawpedia.rawtherapee.com/Windows
|
||||
https://rawpedia.rawtherapee.com/Windows
|
||||
|
||||
macOS:
|
||||
http://rawpedia.rawtherapee.com/macOS
|
||||
https://rawpedia.rawtherapee.com/macOS
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
2
header
@ -14,5 +14,5 @@
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with RawTherapee. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
@ -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"],
|
||||
|
@ -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 |
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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/>.
|
||||
#
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -21,3 +21,6 @@ DCPIlluminant=0
|
||||
|
||||
[RAW]
|
||||
CA=true
|
||||
|
||||
[PostDemosaicSharpening]
|
||||
Enabled=true
|
||||
|
@ -23,3 +23,6 @@ DCPIlluminant=0
|
||||
|
||||
[RAW]
|
||||
CA=true
|
||||
|
||||
[PostDemosaicSharpening]
|
||||
Enabled=true
|
||||
|
@ -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
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
/***************************/
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
* {
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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 ***/
|
||||
|
@ -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 ***/
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -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/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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_
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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*()
|
||||
{
|
||||
|
@ -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"
|
||||
|
@ -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_
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
812
rtengine/capturesharpening.cc
Normal file
812
rtengine/capturesharpening.cc
Normal 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 */
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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_
|
||||
|
@ -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_
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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_
|
||||
|
@ -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"
|
||||
|
@ -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__
|
||||
|
@ -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__
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
//
|
||||
|
@ -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");
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
@ -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/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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_
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
403
rtengine/filmnegativeproc.cc
Normal file
403
rtengine/filmnegativeproc.cc
Normal 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 ¤tParams, 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 ¶ms)
|
||||
{
|
||||
// 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));
|
||||
}
|
||||
}
|
130
rtengine/filmnegativethumb.cc
Normal file
130
rtengine/filmnegativethumb.cc
Normal 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 ¶ms,
|
||||
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
Loading…
x
Reference in New Issue
Block a user