diff -Nru rawtherapee-5.3/AUTHORS.txt rawtherapee-5.4/AUTHORS.txt --- rawtherapee-5.3/AUTHORS.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/AUTHORS.txt 2018-03-20 11:04:15.000000000 +0000 @@ -3,7 +3,7 @@ Gábor Horváth -Developement contributors, in last name alphabetical order: +Development contributors, in last name alphabetical order: Martin Burri Javier Celaya diff -Nru rawtherapee-5.3/cmake/modules/FindUnalignedMalloc.cmake rawtherapee-5.4/cmake/modules/FindUnalignedMalloc.cmake --- rawtherapee-5.3/cmake/modules/FindUnalignedMalloc.cmake 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/cmake/modules/FindUnalignedMalloc.cmake 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,49 @@ +# This file is part of RawTherapee. +# +# Copyright (C) 2018 Flössie +# +# RawTherapee is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# RawTherapee is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with RawTherapee. If not, see . + +include(CheckCXXSourceCompiles) + +set(CMAKE_REQUIRED_QUIET_COPY "${CMAKE_REQUIRED_QUIET}") +set(CMAKE_REQUIRED_QUIET ON) + +set(TEST_SOURCE +" +#include +#include + +int main() +{ +#if defined(__SSE2__) && (defined(__i386) || defined(_M_IX86)) && defined(__linux) + static_assert(std::alignment_of::value >= 16, \"Unaligned heap objects possible\"); +#endif + + return 0; +} +") + +CHECK_CXX_SOURCE_COMPILES("${TEST_SOURCE}" HAVE_ALIGNED_MALLOC) + +if(NOT HAVE_ALIGNED_MALLOC) + set(HAVE_UNALIGNED_MALLOC 1) +else() + unset(HAVE_ALIGNED_MALLOC) +endif() + +unset(TEST_SOURCE) + +set(CMAKE_REQUIRED_QUIET "${CMAKE_REQUIRED_QUIET_COPY}") +unset(CMAKE_REQUIRED_QUIET_COPY) diff -Nru rawtherapee-5.3/cmake/modules/FindX87Math.cmake rawtherapee-5.4/cmake/modules/FindX87Math.cmake --- rawtherapee-5.3/cmake/modules/FindX87Math.cmake 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/cmake/modules/FindX87Math.cmake 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,60 @@ +# This file is part of RawTherapee. +# +# Copyright (C) 2018 Flössie +# +# RawTherapee is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# RawTherapee is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with RawTherapee. If not, see . + +include(CheckCXXSourceCompiles) + +set(CMAKE_REQUIRED_QUIET_COPY "${CMAKE_REQUIRED_QUIET}") +set(CMAKE_REQUIRED_QUIET ON) + +set(TEST_SOURCE +" +#if !defined(__i386) && !defined(_M_IX86) +#error +#endif + +#if defined(__SSE2__) +#error +#endif + +int main() +{ +} +") + +CHECK_CXX_SOURCE_COMPILES("${TEST_SOURCE}" HAVE_X87_MATH) + +set(TEST_SOURCE +" +#if !defined(__i386) && !defined(_M_IX86) +#error +#endif + +#if !defined(__SSE2__) +#error +#endif + +int main() +{ +} +") + +CHECK_CXX_SOURCE_COMPILES("${TEST_SOURCE}" HAVE_X86_SSE_MATH) + +unset(TEST_SOURCE) + +set(CMAKE_REQUIRED_QUIET "${CMAKE_REQUIRED_QUIET_COPY}") +unset(CMAKE_REQUIRED_QUIET_COPY) diff -Nru rawtherapee-5.3/CMakeLists.txt rawtherapee-5.4/CMakeLists.txt --- rawtherapee-5.3/CMakeLists.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/CMakeLists.txt 2018-03-20 11:04:15.000000000 +0000 @@ -1,5 +1,8 @@ if(WIN32) cmake_minimum_required(VERSION 2.8.4) +elseif(APPLE) + cmake_minimum_required(VERSION 3.3) + CMAKE_POLICY(SET CMP0025 NEW) else() cmake_minimum_required(VERSION 2.6) endif() @@ -54,7 +57,8 @@ set(PROC_TARGET_NUMBER 0 CACHE STRING "Selected target processor from the list above (taken from ProcessorTargets.cmake)") # Set special compilation flags for rtengine which get added to CMAKE_CXX_FLAGS: -set(RTENGINE_CXX_FLAGS "" CACHE STRING "Special compilation flags for RTEngine") +# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto vectorization by using -ftree-vectorize +set(RTENGINE_CXX_FLAGS "-ftree-vectorize" CACHE STRING "Special compilation flags for RTEngine") # Loads the ProcessorTargets list: include(ProcessorTargets.cmake) @@ -88,6 +92,20 @@ # Stop compilation on typos such as std:swap (missing colon will be detected as unused label): set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") +# Special treatment for x87 and x86-32 SSE (see GitHub issue #4324) +include(FindX87Math) +if(HAVE_X87_MATH) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffloat-store") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffloat-store") +endif() +if(HAVE_X86_SSE_MATH) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -mfpmath=sse") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2 -mfpmath=sse") +endif() + +# On i386 Linux we can fix unaligned SSE malloc (see GitHub issue #4432) +include(FindUnalignedMalloc) + if(WIN32) # Add additional paths. Look in the MinGW path first, then in the Gtkmm path. # If you wish to build some dependent libraries, you have to install them in MinGW to use them: @@ -108,6 +126,7 @@ option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) +option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) @@ -266,10 +285,15 @@ # Check for libraries: find_package(PkgConfig) +if(WIN32) +pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.22.24) +pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.22) +else() pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.16) +pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.16) +endif() pkg_check_modules (GLIB2 REQUIRED glib-2.0>=2.44) pkg_check_modules (GLIBMM REQUIRED glibmm-2.4>=2.44) -pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.16) pkg_check_modules (CAIROMM REQUIRED cairomm-1.0) pkg_check_modules (GIO REQUIRED gio-2.0>=2.44) pkg_check_modules (GIOMM REQUIRED giomm-2.4>=2.44) @@ -302,6 +326,7 @@ find_package(KLT REQUIRED) endif() + # Check for libcanberra-gtk3 (sound events on Linux): if(UNIX AND(NOT APPLE)) pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) @@ -312,6 +337,21 @@ endif() if(WITH_LTO) + # Using LTO with older versions of binutils requires setting extra flags + SET(BINUTILS_VERSION_MININUM "2.29") + execute_process(COMMAND ar --version OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED) + string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED "${BINUTILS_VERSION_DETECTED}") + if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS "${BINUTILS_VERSION_MININUM}") + if(APPLE) + SET(CMAKE_AR "/opt/local/bin/ar") + SET(CMAKE_RANLIB "/opt/local/bin/ranlib") + else() + SET(CMAKE_AR "/usr/bin/gcc-ar") + SET(CMAKE_RANLIB "/usr/bin/gcc-ranlib") + endif() + message(STATUS "Binutils version detected as less than " ${BINUTILS_VERSION_MININUM} " - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\"" ${CMAKE_AR} "\"\n CMAKE_RANLIB=\"" ${CMAKE_RANLIB} "\"") + endif() + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") @@ -336,6 +376,35 @@ endif() endif() +# check for libfftw3f_omp +include(CheckCSourceCompiles) +if(OPENMP_FOUND) + set(CMAKE_REQUIRED_INCLUDES ${FFTW3F_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LIBRARIES) + foreach(l ${FFTW3F_LIBRARIES}) + find_library(_f ${l} PATHS ${FFTW3F_LIBRARY_DIRS}) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${_f}) + endforeach() + check_c_source_compiles( +"#include +int main() +{ + fftwf_init_threads(); + fftwf_plan_with_nthreads(1); + return 0; +}" _fftw3f_multithread) + if(_fftw3f_multithread) + add_definitions(-DRT_FFTW3F_OMP) + else() + find_library(fftw3f_omp fftw3f_omp PATHS ${FFTW3F_LIBRARY_DIRS}) + if(fftw3f_omp) + add_definitions(-DRT_FFTW3F_OMP) + set(FFTW3F_LIBRARIES ${FFTW3F_LIBRARIES} ${fftw3f_omp}) + endif() + endif() +endif() + + # Find out whether we are building out of source: get_filename_component(ABS_SOURCE_DIR "${PROJECT_SOURCE_DIR}" ABSOLUTE) get_filename_component(ABS_BINARY_DIR "${CMAKE_BINARY_DIR}" ABSOLUTE) diff -Nru rawtherapee-5.3/CONTRIBUTING.md rawtherapee-5.4/CONTRIBUTING.md --- rawtherapee-5.3/CONTRIBUTING.md 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/CONTRIBUTING.md 2018-03-20 11:04:15.000000000 +0000 @@ -14,6 +14,13 @@ ## Contributing as a Programmer - Announce and discuss your plans in GitHub before starting work. +- Work in a new branch. Fork if necessary. - Keep branches small so that completed and working features can be merged into the "dev" branch often, and so that they can be abandoned if they head in the wrong direction. - Use C++11 -- Code must be run through astyle version 3 or newer before being merged. +- The naming isn't homogeneous throughout the code but here is a rough guideline: + - *Types* (classes, structs, enums, typedefs...) should be named with `UpperCamelCase` + - *Functions* and *methods* should be named with `lowerCamelCase` + - *Variables* should be either named with `lowerCamelCase` or better with `lower_underscores` to avoid conflicts + - *Enum values* should be named with `UPPER_UNDERSCORES` + - Most important: Be consistent, even when not sticking to the rules +- Code may be run through astyle version 3 or newer. If using astyle, it is important that the astyle changes go into their own commit, so that style changes are not mixed with actual code changes. Command: `astyle --options=rawtherapee.astylerc code.cc` diff -Nru rawtherapee-5.3/debian/changelog rawtherapee-5.4/debian/changelog --- rawtherapee-5.3/debian/changelog 2017-09-30 22:03:29.000000000 +0000 +++ rawtherapee-5.4/debian/changelog 2018-03-21 18:22:47.000000000 +0000 @@ -1,3 +1,13 @@ +rawtherapee (5.4-1) unstable; urgency=medium + + * New upstream release. + * Add upstream metadata. + * Bump Standards-Version to 4.1.3 (no changes necessary). + * Bump debhelper compat to 11 (no changes necessary). + * Update Vcs URLs in debian/control. + + -- Philip Rinn Wed, 21 Mar 2018 19:22:47 +0100 + rawtherapee (5.3-1) unstable; urgency=medium * New upstream release: @@ -111,7 +121,7 @@ * New upstream release: - Documentation is removed so we don't need to repack the source anymore. - - Location of cache and config folder changed. See NEWS.Debian for details. + - Location of cache and config folder changed. See NEWS.Debian for details. * Drop patch debian/patches/01-AboutThisBuild.patch. -- Philip Rinn Sun, 6 Jul 2014 13:14:54 +0200 diff -Nru rawtherapee-5.3/debian/compat rawtherapee-5.4/debian/compat --- rawtherapee-5.3/debian/compat 2017-01-23 09:44:21.000000000 +0000 +++ rawtherapee-5.4/debian/compat 2018-03-21 18:22:47.000000000 +0000 @@ -1 +1 @@ -10 +11 diff -Nru rawtherapee-5.3/debian/control rawtherapee-5.4/debian/control --- rawtherapee-5.3/debian/control 2017-09-30 21:34:35.000000000 +0000 +++ rawtherapee-5.4/debian/control 2018-03-21 18:22:47.000000000 +0000 @@ -4,7 +4,7 @@ Maintainer: Philip Rinn Build-Depends: cmake, - debhelper (>= 10), + debhelper (>= 11), imagemagick, libcanberra-gtk3-dev, libexiv2-dev, @@ -20,9 +20,9 @@ libsigc++-2.0-dev, libtiff-dev, zlib1g-dev, -Standards-Version: 4.1.1 -Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/rawtherapee.git -Vcs-Git: https://anonscm.debian.org/git/collab-maint/rawtherapee.git +Standards-Version: 4.1.3 +Vcs-Browser: https://salsa.debian.org/debian/rawtherapee +Vcs-Git: https://salsa.debian.org/debian/rawtherapee.git Homepage: http://www.rawtherapee.com Package: rawtherapee diff -Nru rawtherapee-5.3/debian/copyright rawtherapee-5.4/debian/copyright --- rawtherapee-5.3/debian/copyright 2017-01-23 15:33:42.000000000 +0000 +++ rawtherapee-5.4/debian/copyright 2018-03-21 18:22:47.000000000 +0000 @@ -1,7 +1,7 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: rawtherapee Upstream-Contact: Gabor Horvath -Source: http://rawtherapee.googlecode.com +Source: https://github.com/Beep6581/RawTherapee Files: * Copyright: 2004-2011, Gabor Horvath @@ -49,10 +49,6 @@ Copyright: 1997-2014, Dave Coffin License: GPL-3+ -Files: rtengine/impulse_denoise.h -Copyright: 2010, Emil Martinec -License: GPL-3+ - Files: rtengine/expo_before_b.cc Copyright: 2010, Jacques Desmis License: GPL-3+ diff -Nru rawtherapee-5.3/debian/upstream/metadata rawtherapee-5.4/debian/upstream/metadata --- rawtherapee-5.3/debian/upstream/metadata 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/debian/upstream/metadata 2018-03-21 18:22:47.000000000 +0000 @@ -0,0 +1,7 @@ +Name: rawtherapee +Contact: https://discuss.pixls.us/c/software/rawtherapee +Repository: https://github.com/Beep6581/RawTherapee.git +Repository-Browse: https://github.com/Beep6581/RawTherapee +Bug-Database: https://github.com/Beep6581/RawTherapee/issues +Bug-Submit: https://github.com/Beep6581/RawTherapee/issues/new + diff -Nru rawtherapee-5.3/.gitignore rawtherapee-5.4/.gitignore --- rawtherapee-5.3/.gitignore 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/.gitignore 2018-03-20 11:04:15.000000000 +0000 @@ -13,8 +13,8 @@ cmake_install.cmake install_manifest.txt -build -Build +build* +Build* Debug RelWithDebInfo MinSizeRel diff -Nru rawtherapee-5.3/licenses/osx_libiomp5_LICENSE.txt rawtherapee-5.4/licenses/osx_libiomp5_LICENSE.txt --- rawtherapee-5.3/licenses/osx_libiomp5_LICENSE.txt 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/licenses/osx_libiomp5_LICENSE.txt 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,27 @@ +Copyright (c) 2013-2016, Intel Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru rawtherapee-5.3/rawtherapee.appdata.xml rawtherapee-5.4/rawtherapee.appdata.xml --- rawtherapee-5.3/rawtherapee.appdata.xml 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rawtherapee.appdata.xml 2018-03-20 11:04:15.000000000 +0000 @@ -1,49 +1,51 @@ - - - rawtherapee.desktop - CC-BY-SA-4.0 - GPL-3.0+ + + rawtherapee.desktop RawTherapee - A powerful cross-platform raw image processing program + An advanced raw photo development program + Program pro konverzi a zpracování digitálních raw fotografií + Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur) + Zaawansowany program do wywoływania zdjęć typu raw + rawtherapee

- RawTherapee is a powerful raw image processing program. All the internal calculations are done in a high precision 32-bit floating point engine which facilitates non-destructive editing. Images are opened directly without the hassle of having to import them. Adjustments made by the user are immediately reflected in the preview and saved to a separate sidecar file. These adjustments are then applied during the export process, or can be copied (fully and partially) onto other images, thereby allowing easy batch image processing. + 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. +

+

+ 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.

- All aspects of RawTherapee are documented in the RawPedia wiki. There is also an active forum and IRC channel for interaction with the developers and other users. + 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.

- - - http://rawpedia.rawtherapee.com/images/9/99/Rt-5-misty1.jpg - - - http://rawpedia.rawtherapee.com/images/2/2f/Rt-5-cc24-lcp.jpg - - - http://rawtherapee.com/images/screenshots/rt-42_07-hdr-landscape.jpg - - - http://rawtherapee.com/images/screenshots/rt-42_03-macro-detail-toning.jpg - - - http://rawtherapee.com/images/screenshots/rt-42_05-cow-bw-toning.jpg - - - http://rawtherapee.com/images/screenshots/rt-42_08-fb-metadata.jpg - - - http://rawtherapee.com/images/screenshots/rt-42_09-queue.jpg - - raw + photo photography develop pp3 graphics + CC-BY-SA-4.0 + GPL-3.0+ + https://github.com/Beep6581/RawTherapee/issues/new + https://www.paypal.me/rawtherapee + http://rawpedia.rawtherapee.com/ http://rawtherapee.com/ + https://discuss.pixls.us/t/localization-how-to-translate-rawtherapee-and-rawpedia/2594 + + + HDR DNG of a misty morning in the countryside + http://rawtherapee.com/images/screenshots/rt540_1.jpg + + + Straight-out-of-camera vs RawTherapee + http://rawtherapee.com/images/screenshots/rt540_2.jpg + + + RawTherapee using the Auto-Matched Tone Curve tool + http://rawtherapee.com/images/screenshots/rt540_3.jpg + + contactus@rawtherapee.com
diff -Nru rawtherapee-5.3/rawtherapee.astylerc rawtherapee-5.4/rawtherapee.astylerc --- rawtherapee-5.3/rawtherapee.astylerc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rawtherapee.astylerc 2018-03-20 11:04:15.000000000 +0000 @@ -4,5 +4,5 @@ break-blocks pad-oper convert-tabs -pad-first-paren-out pad-header +unpad-paren diff -Nru rawtherapee-5.3/README.md rawtherapee-5.4/README.md --- rawtherapee-5.3/README.md 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/README.md 2018-03-20 11:04:15.000000000 +0000 @@ -1,10 +1,10 @@ ![RawTherapee logo](http://rawtherapee.com/images/logos/rawtherapee_logo_discuss.png) -RawTherapee is a powerful, cross-platform raw photo processing program, released under the [GNU General Public License Version 3](https://opensource.org/licenses/gpl-3.0.html) and written 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+](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. ## Target audience -RawTherapee is a [libre software](https://en.wikipedia.org/wiki/Free_software) 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](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. 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. @@ -28,9 +28,6 @@ Download source code tarballs: http://rawtherapee.com/shared/source/ -Git handbook: -http://git-scm.com/book/en/ - ## Compilation, branches and Git Refer to RawPedia for a detailed explanation of how to get the necessary dependencies and how to compile RawTherapee. diff -Nru rawtherapee-5.3/ReleaseInfo.cmake rawtherapee-5.4/ReleaseInfo.cmake --- rawtherapee-5.3/ReleaseInfo.cmake 2017-09-30 19:39:19.000000000 +0000 +++ rawtherapee-5.4/ReleaseInfo.cmake 2018-03-20 12:12:36.000000000 +0000 @@ -1,7 +1,7 @@ -set(GIT_DESCRIBE 5.3) +set(GIT_DESCRIBE 5.4) set(GIT_BRANCH releases) -set(GIT_COMMIT ec0f7936) -set(GIT_COMMIT_DATE 2017-09-30) +set(GIT_COMMIT a5e8eb9c) +set(GIT_COMMIT_DATE 2018-03-20) set(GIT_COMMITS_SINCE_TAG 0) set(GIT_COMMITS_SINCE_BRANCH 0) -set(GIT_VERSION_NUMERIC_BS 5.3.0) +set(GIT_VERSION_NUMERIC_BS 5.4.0) diff -Nru rawtherapee-5.3/RELEASE_NOTES.txt rawtherapee-5.4/RELEASE_NOTES.txt --- rawtherapee-5.3/RELEASE_NOTES.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/RELEASE_NOTES.txt 2018-03-20 11:04:15.000000000 +0000 @@ -1,81 +1,116 @@ -RAWTHERAPEE 5.3 RELEASE NOTES ------------------------------ -This is RawTherapee 5.3 stable, released on 2017-09-30. +RAWTHERAPEE 5.4 RELEASE NOTES -RawTherapee provides you with a selection of powerful tools with which you can practice the art of developing raw photos. Be sure to read RawPedia to understand how each tool works so that you may make the most of it. +This is RawTherapee 5.4, released on 2018-03-20. + +Start by reading the "Getting Started" article on RawPedia: http://rawpedia.rawtherapee.com/ -A great place to start is the "Getting Started" article. Click on "Main page" in the top-left corner when you have finished reading that article to see all other articles. -News Relevant to Photographers ------------------------------- -RawTherapee supports most raw formats, including Pentax Pixel Shift, Canon Dual-Pixel, and those from Foveon and X-Trans sensors. + + +NEWS RELEVANT TO PHOTOGRAPHERS + +RawTherapee supports most raw formats, including Pentax and Sony Pixel Shift, Canon Dual-Pixel, and those from Foveon and X-Trans sensors. If you're wondering whether it supports your camera's raw format, first download RawTherapee and try for yourself. If a raw format is not supported it will either not open, or the preview in the Editor tab will appear black, white, or have a strong color cast - usually magenta. In that case, read the "Adding Support for New Raw Formats" RawPedia article. In order to use RawTherapee efficiently you should know that: - You can scroll all panels using the mouse scroll-wheel. - You can right-click on a tool's name to automatically expand it while collapsing all others. - To change slider values or drop-down list items with the mouse scroll-wheel, hold the Shift key. This is so that you can safely scroll the panels without accidentally changing a slider or other tool setting. -- All curves support the Shift and Ctrl keys while dragging a point. Shift+drag makes the point snap to meaningful axes (top, bottom, diagonal, other), while Ctrl+drag makes your mouse movement super-fine for precise point positioning. +- 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.2: -- CIECAM02 enhanced with control over the scene and viewing conditions. -- CIECAM02-friendly "Average Surround" color theme and L* middle gray preview background color, takes into account human vision and color appearance with regard to the surrounding color. -- Manually save the collapsed/expanded state of tools. -- Lensfun support, for automatic (and manual) profiled lens correction. -- ACES, DCI-P3 Theater and DCI-P3 D65 output color profiles. -- Numerous speed optimizations and bug fixes. +New features since 5.3: +- New default processing profiles, now the default look for raw photos closely matches the out-of-camera look with regard to tones and includes lens distortion and vignetting correction. +- New histogram matching tool, to have RawTherapee automatically adjust the image for you to match the out-of-camera look with a single click of a button. +- New HDR Tone Mapping tool to compress the light in scenes with a high dynamic range, allowing you to show details in both shadows and highlights in a realistic way. +- New Local Contrast tool to boost clarity using a simple interface. +- New color toning method L*a*b* Color Correction Grid. +- New RCD demosaicing algorithm to minimize artifacts even with artificial lighting and strong chromatic aberration. +- New thumbnail overlay icons in the File Browser and Filmstrip to help you distinguish normal images from HDR and Pixel Shift ones. +- Added support for showing out-of-gamut areas based on the output profile. +- Added support for reading and writing metadata and ICC profiles to and from PNG images. +- Added support for processing Sony Pixel Shift ARQ raw files - make sure that the ARQ extension is enabled in Preferences > File Browser > Parsed Extensions. +- Create Sony ARQ raw files using https://github.com/agriggio/make_arq +- Added support for saving 32-bit floating-point TIFFs clamped to [0;1]. +- Added profiled chromatic aberration correction support using Lensfun. +- More tools now have an on/off switch. +- The user interface is cleaner, with all power-house tools moved into a new "Advanced" tab to prevent slider-shock to newcomers. +- The Metadata tab now lets you choose whether you want to copy metadata unchanged, edit metadata or strip metadata when saving images. Now you can also make metadata changes in batch mode. +- The choice of whether the main histogram should display information using the working profile or the output profile is now available from the Editor tab's top toolbar. +- The Crop tool's aspect ratio now defaults to that of the image, and RawTherapee automatically zooms-to-fit the crop once it's placed. +- RGB input-type ICC profiles can now be used as output profiles. +- The saved reference image for profiling (created from within the Color Management tool) now contains metadata. +- PNG and compressed TIFF images make use of better compression. +- Shortcut key changes: Zoom-to-fit the crop using "f", fit the whole image using "Alt+f". + +There were several hundred commits optimizing processing speed and memory usage as well as bug fixes and code refactoring, though the details of these are too arcane to list here. The effort involved thousands of developer-hours. + +RawTherapee and other open-source projects require access to sample raw files from various camera makes and models in order to support those raw formats correctly. +You can help by submitting raw files to RPU: +https://raw.pixls.us/ + + + +NEWS RELEVANT TO PACKAGE MAINTAINERS -News Relevant to Package Maintainers ------------------------------------- In general: -- Requires GTK+ version >=3.16, though 3.22 is recommended. +- 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. - 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. - For stable releases use -DCACHE_NAME_SUFFIX="" - For development builds and release-candidates use -DCACHE_NAME_SUFFIX="5-dev" -Changes since 5.2: -- Lensfun is required. To use the system-wide lensfun database, do not set the CMake option -DLENSFUNDBDIR. To use a custom lensfun database, set -DLENSFUNDBDIR="path/to/database". See the compilation instructions in RawPedia for more information. -News Relevant to Developers ---------------------------- -- Announce and discuss your plans in GitHub before starting work. -- Keep branches small so that completed and working features can be merged into the "dev" branch often, and so that they can be abandoned if they head in the wrong direction. -- Use C++11. + +NEWS RELEVANT TO DEVELOPERS + +See CONTRIBUTING.md + + DOCUMENTATION -------------- -http://rawtherapee.com/blog/documentation + http://rawpedia.rawtherapee.com/ +http://rawtherapee.com/blog/documentation + + 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 + + FORUM ------ + RawTherapee shares a forum with users and developers of other Free/Libre/Open Source Software: https://discuss.pixls.us/c/software/rawtherapee + + LIVE CHAT WITH USERS AND DEVELOPERS --------------------------------------- -  Network: freenode -  Server:  chat.freenode.net -  Channel: #rawtherapee + +Network: freenode +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 + + SOCIAL NETWORKS ---------------- + Google+ -http://plus.google.com/106783532637761598368 +https://plus.google.com/+RawTherapee + + REVISION HISTORY ----------------- + The complete changelog is available at: https://github.com/Beep6581/RawTherapee/commits/ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/MINOLTA DYNAX 7D.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/MINOLTA DYNAX 7D.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/Nikon D700.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/Nikon D700.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/NIKON D700.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/NIKON D700.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/NIKON D750.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/NIKON D750.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/PENTAX K10D.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/PENTAX K10D.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/SONY DSLR-A580.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/SONY DSLR-A580.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/SONY ILCE-7M2.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/SONY ILCE-7M2.dcp differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/dcpprofiles/SONY ILCE-7RM3.dcp and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/dcpprofiles/SONY ILCE-7RM3.dcp differ diff -Nru rawtherapee-5.3/rtdata/icons/mime-types rawtherapee-5.4/rtdata/icons/mime-types --- rawtherapee-5.3/rtdata/icons/mime-types 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/icons/mime-types 2018-03-20 11:04:15.000000000 +0000 @@ -9,10 +9,14 @@ 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; @@ -22,15 +26,14 @@ 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-hasselblad-3fr; -image/x-hasselblad-fff; -image/x-leaf-mos; -image/x-phaseone-iiq; image/x-tif; inode/directory; diff -Nru rawtherapee-5.3/rtdata/icons/rawtherapee.desktop.in rawtherapee-5.4/rtdata/icons/rawtherapee.desktop.in --- rawtherapee-5.3/rtdata/icons/rawtherapee.desktop.in 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/icons/rawtherapee.desktop.in 2018-03-20 11:04:15.000000000 +0000 @@ -13,6 +13,6 @@ Icon=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-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;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-raw;image/x-rwz;image/x-samsung-srw;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-leaf-mos;image/x-phaseone-iiq;image/x-tif; +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; Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/adj-black.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/adj-black.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/adj-white.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/adj-white.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/atom.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/atom.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/equalizer-narrow.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/equalizer-narrow.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/equalizer-wide.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/equalizer-wide.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/gamut-hist.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/gamut-hist.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/gamut-softproof.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/gamut-softproof.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/gamut-warning.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/gamut-warning.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/HDR-thumbnail.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/HDR-thumbnail.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Dark/actions/PixelShift-thumbnail.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Dark/actions/PixelShift-thumbnail.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/adj-black.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/adj-black.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/adj-white.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/adj-white.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/atom.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/atom.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/equalizer-narrow.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/equalizer-narrow.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/equalizer-wide.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/equalizer-wide.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/gamut-hist.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/gamut-hist.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/gamut-softproof.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/gamut-softproof.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/gamut-warning.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/gamut-warning.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/HDR-thumbnail.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/HDR-thumbnail.png differ Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/Light/actions/PixelShift-thumbnail.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/Light/actions/PixelShift-thumbnail.png differ diff -Nru rawtherapee-5.3/rtdata/images/rt_splash.svg rawtherapee-5.4/rtdata/images/rt_splash.svg --- rawtherapee-5.3/rtdata/images/rt_splash.svg 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/images/rt_splash.svg 2018-03-20 11:04:15.000000000 +0000 @@ -15,7 +15,7 @@ viewBox="0 0 146.05 91.545836" version="1.1" id="svg783" - inkscape:version="0.92.1 r" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" sodipodi:docname="rt_splash.svg" inkscape:export-filename="/tmp/splash.png" inkscape:export-xdpi="96" @@ -517,10 +517,10 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="1.6106713" - inkscape:cx="274.80436" + inkscape:zoom="1.5681835" + inkscape:cx="427.50017" inkscape:cy="87.101745" - inkscape:document-units="mm" + inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" units="px" @@ -544,7 +544,7 @@ inkscape:snap-nodes="false" inkscape:snap-global="true" inkscape:window-width="1920" - inkscape:window-height="1023" + inkscape:window-height="1019" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1"> @@ -902,14 +902,21 @@ y="2.2370076" x="283.85016" id="tspan3664" - sodipodi:role="line">. 3 + sodipodi:role="line">. 4 + + transform="matrix(0.24804687,0,0,0.2480469,58.508951,273.1232)" + style="fill:#ffffff;enable-background:new"> Development + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:17.06666565px;line-height:110.00000238%;font-family:'ITC Eras Std';-inkscape-font-specification:'ITC Eras Std Bold';text-align:end;letter-spacing:-1.06666672px;text-anchor:end;fill:#ffffff;stroke-width:1.06666672px">Release Candidate 3 Binary files /tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/images/splash.png and /tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/images/splash.png differ diff -Nru rawtherapee-5.3/rtdata/languages/Catala rawtherapee-5.4/rtdata/languages/Catala --- rawtherapee-5.3/rtdata/languages/Catala 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Catala 2018-03-20 11:04:15.000000000 +0000 @@ -7,6 +7,7 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Restaura predeterminats BATCHQUEUE_AUTOSTART;Auto engega +BATCHQUEUE_AUTOSTARTHINT;Inicia processat automàticament en rebre un nou treball BATCH_PROCESSING;Processament per lots CURVEEDITOR_CURVE;Corba CURVEEDITOR_CURVES;Corbes @@ -148,12 +149,7 @@ FILEBROWSER_SHOWTRASHHINT;Veure què hi ha a la paperera.\nDrecera: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostra imatges sense etiqueta de color.\nDrecera: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostra imatges sense rang.\nDrecera: 0 -FILEBROWSER_STARTPROCESSING;Inicia procés -FILEBROWSER_STARTPROCESSINGHINT;Inicia el processament de les imatges de la cua -FILEBROWSER_STOPPROCESSING;Atura processament -FILEBROWSER_STOPPROCESSINGHINT;Atura processament d'imatges de la cua FILEBROWSER_THUMBSIZE;Tamany minifoto -FILEBROWSER_TOOLTIP_STOPPROCESSING;Inicia processat automàticament en rebre un nou treball FILEBROWSER_ZOOMINHINT;Engrandir minifoto.\nDrecera: + FILEBROWSER_ZOOMOUTHINT;Reduïr minifoto.\nDrecera: - GENERAL_ABOUT;Respecte a @@ -356,7 +352,6 @@ HISTORY_MSG_170;Vibrància - corba HISTORY_MSG_171;Corba 'LC' HISTORY_MSG_172;Restriccció LC als tons vermell i pell -HISTORY_MSG_173;RS - Detall de la luminància HISTORY_NEWSNAPSHOT;Afegeix HISTORY_SNAPSHOT;Instantània HISTORY_SNAPSHOTS;Instantànies @@ -440,8 +435,6 @@ MAIN_TOOLTIP_TOGGLE;Alterna vista abans/després.\nDrecera: Majús-B NAVIGATOR_XY_FULL;Amplada = %1, Altura = %2 NAVIGATOR_XY_NA;x = n/a, y = n/a -OPTIONS_DEFIMG_MISSING;No es troba el perfil per omissió per a fotografies no-raw o no s'ha especificat.\n\nReviseu el directori de perfils, potser falta o està fet malbé.\n\nEs faran servir els valors interns per omissió. -OPTIONS_DEFRAW_MISSING;No es troba el perfil per omissió per a fotografies raw.\n\nReviseu el directori de perfils, potser falta o està fet malbé.\n\nEs faran servir els valors interns per omissió. PARTIALPASTE_BASICGROUP;Ajustos bàsics PARTIALPASTE_CACORRECTION;Correcció A. C.(Aberració Cromàtica) PARTIALPASTE_CHANNELMIXER;Barrejador de canals @@ -512,7 +505,6 @@ PREFERENCES_CUSTPROFBUILDHINT;Nom del fitxer executable (o script) per a usar un nou perfil de procés en una imatge.\nRep paràmetres en línia d'ordres per a la generació de perfils basats en regles:\n[raw/JPG path] [path per omissió del perfil de procés] [número f] [expos. en segons] [long. focal en mm] [ISO] [objectiu] [càmera] PREFERENCES_CUSTPROFBUILDPATH;Executable path PREFERENCES_CUTOVERLAYBRUSH;Cropa màscara color/transparència -PREFERENCES_DARKFRAME;Marc fosc PREFERENCES_DARKFRAMEFOUND;Trobat PREFERENCES_DARKFRAMESHOTS;trets PREFERENCES_DARKFRAMETEMPLATES;plantilles @@ -524,13 +516,11 @@ PREFERENCES_DIROTHER;Un altre PREFERENCES_DIRSELECTDLG;Selecc. directori d'inici... PREFERENCES_DIRSOFTWARE;Instal·lació al directori -PREFERENCES_EDITORCMDLINE;Una altra línia de comandament PREFERENCES_EDITORLAYOUT;Sortida d'editor PREFERENCES_EXTERNALEDITOR;Editor extern PREFERENCES_FBROWSEROPTS;Opcions de navegador i minifotos PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barra de gestor de fitxers d'una línia (inapropiat en monitors de baixa resolució) PREFERENCES_FILEFORMAT;Format de fitxer -PREFERENCES_FLATFIELD;Camp pla PREFERENCES_FLATFIELDFOUND;Trobat PREFERENCES_FLATFIELDSDIR;Carpeta de camps plans PREFERENCES_FLATFIELDSHOTS;trets @@ -688,11 +678,11 @@ TP_DEFRINGE_LABEL;Desserrella TP_DEFRINGE_RADIUS;Radi TP_DEFRINGE_THRESHOLD;Llindar -TP_DIRPYRDENOISE_CHROMA;Crominància -TP_DIRPYRDENOISE_GAMMA;Gama -TP_DIRPYRDENOISE_LABEL;Reducció de soroll (només imatges raw) -TP_DIRPYRDENOISE_LDETAIL;Detall de luminància -TP_DIRPYRDENOISE_LUMA;Luminància +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominància +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detall de luminància +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminància +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Reducció de soroll (només imatges raw) +TP_DIRPYRDENOISE_MAIN_GAMMA;Gama TP_DIRPYREQUALIZER_LABEL;Contrast per grau de detall TP_DIRPYREQUALIZER_LUMACOARSEST;Més bast TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- @@ -950,7 +940,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Obre una altra finestra de detall ZOOMPANEL_ZOOM100;Zoom 100%\nDrecera: z -ZOOMPANEL_ZOOMFITSCREEN;Ajusta a la finestra\nDrecera: f +ZOOMPANEL_ZOOMFITSCREEN;Ajusta a la finestra\nDrecera: Alt-f ZOOMPANEL_ZOOMIN;Apropa\nDrecera: + ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - @@ -959,6 +949,7 @@ !!!!!!!!!!!!!!!!!!!!!!!!! !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -976,6 +967,7 @@ !DYNPROFILEEDITOR_PROFILE;Processing Profile !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps @@ -1017,9 +1009,11 @@ !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -1049,7 +1043,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1101,7 +1095,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1142,7 +1136,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1317,6 +1311,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1356,9 +1365,9 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: @@ -1371,6 +1380,10 @@ !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning @@ -1378,6 +1391,8 @@ !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1385,9 +1400,9 @@ !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1408,6 +1423,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1423,8 +1444,9 @@ !PREFERENCES_D65;6500K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 !PREFERENCES_FLUOF11;Fluorescent F11 @@ -1509,10 +1531,19 @@ !PROFILEPANEL_PINTERNAL;Neutral !PROGRESSBAR_NOIMAGES;No images found !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear @@ -1649,14 +1680,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1668,6 +1699,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1696,63 +1729,59 @@ !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1764,6 +1793,8 @@ !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_EPD_GAMMA;Gamma !TP_EPD_TOOLTIP;Tone mapping is possible in L*a*b* mode (standard) and CIECAM02 mode.\n\nWhen in L*a*b* mode, tone mapping can also be used on the residual image of the Wavelet Levels tool.\n\nTo engage CIECAM02 tone mapping mode enable the following settings:\n1. CIECAM02\n2. Algorithm="Brightness + Colorfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1811,6 +1842,15 @@ !TP_LABCURVE_CURVEEDITOR_LH;LH !TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) !TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1843,7 +1883,7 @@ !TP_RAW_DCB;DCB !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1851,7 +1891,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps !TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. @@ -1890,6 +1930,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1903,6 +1945,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1991,6 +2034,10 @@ !TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2161,4 +2208,4 @@ !TP_WBALANCE_WATER1;UnderWater 1 !TP_WBALANCE_WATER2;UnderWater 2 !TP_WBALANCE_WATER_HEADER;UnderWater -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Chinese (Simplified)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Chinese (Simplified)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Chinese (Simplified)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Chinese (Simplified)" 2018-03-20 11:04:15.000000000 +0000 @@ -168,10 +168,6 @@ FILEBROWSER_SHOWRECENTLYSAVEDHINT;显示保存的图片\n快捷: Alt-7 FILEBROWSER_SHOWTRASHHINT;显示垃圾箱内容 FILEBROWSER_SHOWUNRANKHINT;显示未评星图片 -FILEBROWSER_STARTPROCESSING;开始处理 -FILEBROWSER_STARTPROCESSINGHINT;开始处理或保存队列中的图片 -FILEBROWSER_STOPPROCESSING;停止处理 -FILEBROWSER_STOPPROCESSINGHINT;停止处理图片 FILEBROWSER_THUMBSIZE;缩略图大小 FILEBROWSER_ZOOMINHINT;增大缩略图 FILEBROWSER_ZOOMOUTHINT;减小缩略图 @@ -320,7 +316,6 @@ HISTORY_MSG_159;边缘停止 HISTORY_MSG_160;拉伸 HISTORY_MSG_162;色调映射 -HISTORY_MSG_173;降噪 - 亮度细节 HISTORY_MSG_174;CIECAM02 HISTORY_MSG_183;CAM02 - 对比度 (J) HISTORY_MSG_210;渐变 - 角度 @@ -537,7 +532,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;暗场 PREFERENCES_DARKFRAMEFOUND;找到 PREFERENCES_DARKFRAMESHOTS;张 PREFERENCES_DARKFRAMETEMPLATES;模板 @@ -551,15 +545,12 @@ PREFERENCES_DIROTHER;其他 PREFERENCES_DIRSELECTDLG;启动时选择图片路径... PREFERENCES_DIRSOFTWARE;软件安装路径 -PREFERENCES_EDITORCMDLINE;其他命令行 PREFERENCES_EDITORLAYOUT;编辑器布局 PREFERENCES_EXPAUT;进阶 PREFERENCES_EXTERNALEDITOR;外部编辑器 PREFERENCES_FBROWSEROPTS;文件浏览选项 PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) PREFERENCES_FILEFORMAT;文件格式 -PREFERENCES_FILMSIMULATION;胶片模拟 -PREFERENCES_FLATFIELD;平场 PREFERENCES_FLATFIELDFOUND;找到 PREFERENCES_FLATFIELDSDIR;平场图像路径 PREFERENCES_FLATFIELDSHOTS;张 @@ -827,10 +818,10 @@ TP_DARKFRAME_LABEL;黑框架 TP_DEFRINGE_LABEL;去色彩边缘(紫边) TP_DEFRINGE_RADIUS;半径 -TP_DIRPYRDENOISE_LABEL;降噪 -TP_DIRPYRDENOISE_LDETAIL;明亮度细节 -TP_DIRPYRDENOISE_LUMA;光亮度/发光度 -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;明亮度细节 +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;光亮度/发光度 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;降噪 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB TP_DIRPYREQUALIZER_ALGO;皮肤色彩范围 TP_DIRPYREQUALIZER_ARTIF;减少杂色 TP_DIRPYREQUALIZER_HUESKIN;皮肤色相 @@ -1026,8 +1017,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;开启(新)细节窗口 ZOOMPANEL_ZOOM100;缩放到100%\n快捷键: z -ZOOMPANEL_ZOOMFITCROPSCREEN;适应边缘到屏幕\n快捷键:Alt-f -ZOOMPANEL_ZOOMFITSCREEN;适应屏幕\n快捷键: f +ZOOMPANEL_ZOOMFITCROPSCREEN;适应边缘到屏幕\n快捷键:f +ZOOMPANEL_ZOOMFITSCREEN;适应屏幕\n快捷键: Alt-f ZOOMPANEL_ZOOMIN;缩放拉近\n快捷键: + ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - @@ -1035,6 +1026,8 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1042,6 +1035,7 @@ !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps !EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations @@ -1066,8 +1060,8 @@ !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. @@ -1138,6 +1132,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround !HISTORY_MSG_177;CAM02 - Scene luminosity @@ -1165,7 +1160,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1210,7 +1205,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1251,7 +1246,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1426,6 +1421,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1463,6 +1473,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1473,12 +1485,25 @@ !MAIN_TOOLTIP_PREVIEWG;Preview the Green channel.\nShortcut: g !MAIN_TOOLTIP_PREVIEWL;Preview the Luminosity.\nShortcut: v\n\n0.299*R + 0.587*G + 0.114*B !MONITOR_PROFILE_SYSTEM;System default -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. !PREFERENCES_BEHSETALLHINT;Set all parameters to the Set mode.\nAdjustments of parameters in the batch tool panel will be absolute, the actual values will be displayed. +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial processing profile should be generated for an image.\n\nThe path of the communication file (*.ini style, a.k.a. "Keyfile") is added as a command line parameter. It contains various parameters required for the scripts and image Exif to allow a rules-based processing profile generation.\n\nWARNING: You are responsible for using double quotes where necessary if you're using paths containing spaces. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1491,10 +1516,19 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1595,14 +1629,14 @@ !TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 !TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1614,6 +1648,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1640,64 +1676,60 @@ !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. !TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. @@ -1709,6 +1741,8 @@ !TP_EPD_TOOLTIP;Tone mapping is possible in L*a*b* mode (standard) and CIECAM02 mode.\n\nWhen in L*a*b* mode, tone mapping can also be used on the residual image of the Wavelet Levels tool.\n\nTo engage CIECAM02 tone mapping mode enable the following settings:\n1. CIECAM02\n2. Algorithm="Brightness + Colorfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" !TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1776,6 +1810,15 @@ !TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. !TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection !TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1812,7 +1855,7 @@ !TP_RAW_DMETHOD;Method !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1821,7 +1864,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1861,6 +1904,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1874,6 +1919,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1962,6 +2008,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Chinese (Traditional)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Chinese (Traditional)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Chinese (Traditional)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Chinese (Traditional)" 2018-03-20 11:04:15.000000000 +0000 @@ -3,6 +3,7 @@ ADJUSTER_RESET_TO_DEFAULT;重置預設參數 BATCHQUEUE_AUTOSTART;Auto start +BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives CURVEEDITOR_LINEAR;線性 CURVEEDITOR_LOADDLGLABEL;正載入曲線... CURVEEDITOR_SAVEDLGLABEL;正儲存曲線... @@ -60,12 +61,7 @@ FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size GENERAL_ABOUT;關於 @@ -258,7 +254,6 @@ PREFERENCES_DIROTHER;其他 PREFERENCES_DIRSELECTDLG;啟動時選擇圖片路徑... PREFERENCES_DIRSOFTWARE;軟體安裝路徑 -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;檔流覽選項 PREFERENCES_FILEFORMAT;檔格式 @@ -436,6 +431,7 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -471,6 +467,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -580,6 +577,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. @@ -677,7 +675,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -707,7 +705,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -759,7 +757,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -800,7 +798,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -975,6 +973,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1025,6 +1038,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1034,8 +1049,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1063,8 +1076,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1090,6 +1105,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1109,13 +1126,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1140,6 +1157,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1157,18 +1180,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1294,6 +1316,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1304,8 +1335,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1450,14 +1481,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1469,6 +1500,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1506,68 +1539,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1597,6 +1625,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1718,6 +1748,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1768,7 +1807,7 @@ !TP_RAW_DMETHOD;Method !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1777,7 +1816,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1817,6 +1856,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1830,6 +1871,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1936,6 +1978,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2162,7 +2208,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Czech rawtherapee-5.4/rtdata/languages/Czech --- rawtherapee-5.3/rtdata/languages/Czech 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Czech 2018-03-20 11:04:15.000000000 +0000 @@ -38,6 +38,8 @@ #37 2017-01-10 updated by mkyral #38 2017-04-26 updated by mkyral #39 2017-07-21 updated by mkyral +#40 2017-12-13 updated by mkyral +#41 2018-03-03 updated by mkyral ABOUT_TAB_BUILD;Verze ABOUT_TAB_CREDITS;Zásluhy @@ -46,7 +48,9 @@ ABOUT_TAB_SPLASH;Úvodní obrazovka ADJUSTER_RESET_TO_DEFAULT;Vrátit se k původnímu BATCHQUEUE_AUTOSTART;Automatický start +BATCHQUEUE_AUTOSTARTHINT;Automatické spuštění zpracování po vložení nové úlohy. BATCHQUEUE_DESTFILENAME;Cesta a název souboru +BATCHQUEUE_STARTSTOPHINT;Spustit nebo zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s BATCH_PROCESSING;Dávkové zpracování CURVEEDITOR_AXIS_IN;Vstup: CURVEEDITOR_AXIS_LEFT_TAN;LS: @@ -73,6 +77,7 @@ CURVEEDITOR_TOOLTIPSAVE;Uložit současnou křivku. CURVEEDITOR_TYPE;Typ DIRBROWSER_FOLDERS;Složky +DONT_SHOW_AGAIN;Zprávu znova nezobrazovat. DYNPROFILEEDITOR_DELETE;Smazat DYNPROFILEEDITOR_EDIT;Upravit DYNPROFILEEDITOR_EDIT_RULE;Upravit pravidlo dynamického profilu @@ -107,6 +112,7 @@ EXIFPANEL_RESETALL;Obnovit vše EXIFPANEL_RESETALLHINT;Obnoví původní hodnoty u všech štítků. EXIFPANEL_RESETHINT;Obnoví původní hodnoty u vybraných štítků. +EXIFPANEL_SHOWALL;Zobrazit vše EXIFPANEL_SUBDIRECTORY;Podadresář EXPORT_BYPASS;Kroky zpracování pro přeskočení EXPORT_BYPASS_ALL;Vybrat / Zrušit výběr všeho @@ -232,12 +238,7 @@ FILEBROWSER_SHOWTRASHHINT;Ukázat obsah koše.\nZkratka: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Ukázat obrázky bez barevného štítku.\nZkratka: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Ukázat nehodnocené obrázky.\nZkratka: 0 -FILEBROWSER_STARTPROCESSING;Spustit zpracování -FILEBROWSER_STARTPROCESSINGHINT;Spustit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s -FILEBROWSER_STOPPROCESSING;Zastavit zpracovávaní -FILEBROWSER_STOPPROCESSINGHINT;Zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s FILEBROWSER_THUMBSIZE;Velikost náhledu -FILEBROWSER_TOOLTIP_STOPPROCESSING;Automatické spuštění zpracování po vložení nové úlohy. FILEBROWSER_UNRANK_TOOLTIP;Zrušit hodnocení.\nZkratka: Shift - 0 FILEBROWSER_ZOOMINHINT;Zvětšit velikosti náhledů.\n\nZkratky:\n+ - režim více karet editoru,\nAlt-+ - režim jedné karty editoru. FILEBROWSER_ZOOMOUTHINT;Zmenšit velikosti náhledů.\n\nZkratky:\n- - režim více karet editoru,\nAlt-- - režim jedné karty editoru. @@ -269,8 +270,10 @@ GENERAL_OPEN;Otevřít GENERAL_PORTRAIT;Na výšku GENERAL_SAVE;Uložit +GENERAL_SLIDER;Posuvník GENERAL_UNCHANGED;(Beze změny) GENERAL_WARNING;Varování +GIMP_PLUGIN_INFO;Vítejte v RawTherapee doplňku pro GIMP!\nPo dokončení úprav prostě zavřete hlavní okno RawTherapee a obrázek bude automaticky načten GIMPem. HISTOGRAM_TOOLTIP_B;Skrýt/Zobrazit histogram modré. HISTOGRAM_TOOLTIP_BAR;Skrýt/Zobrazit řádek RGB indikátoru\nKlikněte pravým tlačítkem myši na náhled pro zmrazení/uvolnění. HISTOGRAM_TOOLTIP_CHRO;Skrýt/Zobrazit histogram barevnosti. @@ -316,9 +319,9 @@ HISTORY_MSG_31;RLD - Míra HISTORY_MSG_32;RLD - Útlum HISTORY_MSG_33;RLD - Průchody -HISTORY_MSG_34;LCP korekce zkreslení -HISTORY_MSG_35;LCP korekce vinětace -HISTORY_MSG_36;LCP korekce CA +HISTORY_MSG_34;Korekce objektivu - Zkreslení +HISTORY_MSG_35;Korekce objektivu - Vinětace +HISTORY_MSG_36;Korekce objektivu - ChA HISTORY_MSG_37;Expozice - Automatické úrovně HISTORY_MSG_38;Vyvážení bílé - Metoda HISTORY_MSG_39;VB - Teplota @@ -367,7 +370,7 @@ HISTORY_MSG_82;Profil změněn HISTORY_MSG_83;S/S - Maska ostrosti HISTORY_MSG_84;Korekce perspektivy -HISTORY_MSG_85;LCP +HISTORY_MSG_85;Korekce objektivu - LCP soubor HISTORY_MSG_86;RGB křivky - Režim svítivost HISTORY_MSG_87;Redukce impulzního šumu HISTORY_MSG_88;Redukce impulzního šumu - práh @@ -455,7 +458,7 @@ HISTORY_MSG_170;Živost - HH křivka HISTORY_MSG_171;L*a*b* - LC křivka HISTORY_MSG_172;L*a*b* - Omezení LC -HISTORY_MSG_173;Redukce šumu - Jas detailu +HISTORY_MSG_173;Redukce šumu - Obnovení detailů HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 přizpůsobení HISTORY_MSG_176;CAM02 - Okolí pro prohlížení @@ -485,7 +488,7 @@ HISTORY_MSG_200;CAM02 - Mapování tónů HISTORY_MSG_201;Redukce šumu - Barevnost Č a Z HISTORY_MSG_202;Redukce šumu - Barevnost M a Ž -HISTORY_MSG_203;Redukce šumu - Metoda +HISTORY_MSG_203;Redukce šumu - Barevný prostor HISTORY_MSG_204;Kroky rozšíření LMMSE HISTORY_MSG_205;CAM02 - Filtr vypálených/špatných pixelů HISTORY_MSG_206;CAT02 - Automatická svítivost scény @@ -537,9 +540,9 @@ HISTORY_MSG_253;KdDÚ - Omezení vzniku artefaktů HISTORY_MSG_254;KdDÚ - Tóny pleti HISTORY_MSG_255;Redukce šumu - Medián -HISTORY_MSG_256;Redukce šumu - Typ mediánu +HISTORY_MSG_256;Redukce šumu - Medián - Typ HISTORY_MSG_257;Barevné tónování -HISTORY_MSG_258;Barevní tónování - Barevná křivka +HISTORY_MSG_258;Barevné tónování - Barevná křivka HISTORY_MSG_259;Barevné tónování - Křivka neprůhlednosti HISTORY_MSG_260;Barevné tónování - a*[b*] neprůhlednost HISTORY_MSG_261;Barevné tónování - Metoda @@ -578,7 +581,7 @@ HISTORY_MSG_294;Simulace filmu - Síla HISTORY_MSG_295;Simulace filmu - Film HISTORY_MSG_296;Redukce šumu - Křivka jasů -HISTORY_MSG_297;Redukce šumu - Kvalita +HISTORY_MSG_297;Redukce šumu - Mód HISTORY_MSG_298;Filtr mrtvých pixelů HISTORY_MSG_299;Redukce šumu - Křivka barevnosti HISTORY_MSG_300;- @@ -741,6 +744,33 @@ HISTORY_MSG_473;PS - Použít LMMSE HISTORY_MSG_474;PS - korekce HISTORY_MSG_475;PS - korekce kanálu +HISTORY_MSG_476;CAM02 - Teplota (výstup) +HISTORY_MSG_477;CAM02 - Zelená (výstup) +HISTORY_MSG_478;CAM02 - Yb (výstup) +HISTORY_MSG_479;CAM02 - CAT02 přizpůsobení (výstup) +HISTORY_MSG_480;CAM02 - Automatická CAT02 (výstup) +HISTORY_MSG_481;CAM02 - Teplota scény +HISTORY_MSG_482;CAM02 - Zelená scény +HISTORY_MSG_483;CAM02 - Yb scény +HISTORY_MSG_484;CAT02 - Automatická Yb scény +HISTORY_MSG_485;Korekce objektivu +HISTORY_MSG_486;Korekce objektivu - Fotoaparát +HISTORY_MSG_487;Korekce objektivu - Objektiv +HISTORY_MSG_488;HDR Mapování tónů +HISTORY_MSG_489;HDR TM - Práh +HISTORY_MSG_490;HDR TM - Míra +HISTORY_MSG_491;Vyvážení bílé +HISTORY_MSG_492;RGB křivky +HISTORY_MSG_493;L*a*b* úpravy +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Barevné tónování - Korekce barev +HISTORY_MSG_HISTMATCHING;Automaticky nalezená Tónová křivka +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Místní kontrast - Míra +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Místní kontrast - Tmavé +HISTORY_MSG_LOCALCONTRAST_ENABLED;Místní kontrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Místní kontrast - Světlé +HISTORY_MSG_LOCALCONTRAST_RADIUS;Místní kontrast - Poloměr +HISTORY_MSG_METADATA_MODE;Režim kopírování metadat +HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Kotva HISTORY_NEWSNAPSHOT;Přidat HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s HISTORY_SNAPSHOT;Snímek @@ -787,6 +817,10 @@ IPTCPANEL_TITLEHINT;Vložte krátké, popisné a lidsky čitelné jméno obrázku. Například název souboru. IPTCPANEL_TRANSREFERENCE;Číslo úlohy IPTCPANEL_TRANSREFERENCEHINT;Zadejte číslo nebo identifikátor potřebný v pracovním postupu nebo pro sledování. +LENSPROFILE_CORRECTION_AUTOMATCH;Automatický dohledané korekční parametry +LENSPROFILE_CORRECTION_LCPFILE;LCP Soubor +LENSPROFILE_CORRECTION_MANUAL;Ruční korekční parametry +LENSPROFILE_LENS_WARNING;Varování: crop factor použitý pro profilování objektivu je větší než crop factor fotoaparátu. Výsledek může být nesprávný. MAIN_BUTTON_FULLSCREEN;Celá obrazovka MAIN_BUTTON_NAVNEXT_TOOLTIP;Přejít k dalšímu obrázku relativnímu k obrázku otevřenému v editoru.\nZkratka: Shift-F4\n\nPřejít k dalšímu obrázku relativnímu k vybranému náhledu v prohlížeči souborů nebo na filmovém pásu:\nZkratka: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Přejít k předchozímu obrázku relativnímu k obrázku otevřenému v editoru.\nZkratka: Shift-F3\n\nPřejít k předchozímu obrázku relativnímu k vybranému náhledu v prohlížeči souborů nebo na filmovém pásu:\nZkratka: F3 @@ -822,17 +856,19 @@ MAIN_MSG_SETPATHFIRST;K použití této funkce musíte nejprve zadat cílovou cestu\nv okně "Volby"! MAIN_MSG_TOOMANYOPENEDITORS;Příliš mnoho otevřených editorů.\nPro pokračování nejprve některý ukončete. MAIN_MSG_WRITEFAILED;Chyba zápisu\n"%1"\n\nUjistěte se, že složka existuje a máte práva do ní zapisovat. +MAIN_TAB_ADVANCED;Pokročilé +MAIN_TAB_ADVANCED_TOOLTIP;Zkratka: Alt-w MAIN_TAB_COLOR;Barvy MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c MAIN_TAB_DETAIL;Detaily MAIN_TAB_DETAIL_TOOLTIP;Zkratka: Alt-d -MAIN_TAB_DEVELOP; Dávková editace +MAIN_TAB_DEVELOP; Dávková editace MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; Rychlý export +MAIN_TAB_EXPORT; Rychlý export MAIN_TAB_EXPOSURE;Expozice MAIN_TAB_EXPOSURE_TOOLTIP;Zkratka: Alt-e -MAIN_TAB_FILTER; Filtr -MAIN_TAB_INSPECT; Prohlížení +MAIN_TAB_FILTER; Filtr +MAIN_TAB_INSPECT; Prohlížení MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadata MAIN_TAB_METADATA_TOOLTIP;Zkratka: Alt-m @@ -840,11 +876,10 @@ MAIN_TAB_RAW_TOOLTIP;Zkratka: Alt-r MAIN_TAB_TRANSFORM;Transformace MAIN_TAB_TRANSFORM_TOOLTIP;Zkratka: Alt-t -MAIN_TAB_WAVELET;Vlnka -MAIN_TAB_WAVELET_TOOLTIP;Zkratka: Alt-w MAIN_TOOLTIP_BACKCOLOR0;Barva pozadí náhledu: Dle motivu\nZkratka: 9 MAIN_TOOLTIP_BACKCOLOR1;Barva pozadí náhledu: Černá\nZkratka: 9 MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: Bílá\nZkratka: 9 +MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: Středně šedá\nZkratka: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Zamknout / Odemknout pohled Před\n\nZamknout: ponechá pohled Před nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\nOdemknout: pohled Před bude následovat pohled Poté, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje. MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: l MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: < @@ -873,8 +908,10 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Šířka: %1, Výška: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Výchozí profil pro ne raw fotky nelze nalézt nebo nastavit.\n\nZkontrolujte prosím vaši složku s profily, buď chybí nebo je poškozena.\n\nBudou použity výchozí přednastavené hodnoty. -OPTIONS_DEFRAW_MISSING;Výchozí profil pro raw fotky nelze nalézt nebo nastavit.\n\nZkontrolujte prosím vaši složku s profily, buď chybí nebo je poškozena.\n\nBudou použity výchozí přednastavené hodnoty. +OPTIONS_BUNDLED_MISSING;Vložený profil "%1" nelze nalézt .\n\nVaše instalace může být poškozena.\n\nBudou použity výchozí přednastavené hodnoty. +OPTIONS_DEFIMG_MISSING;Výchozí profil pro ne raw fotky nelze nalézt nebo nastavit.\n\nZkontrolujte prosím vaši složku s profily, buď chybí nebo je poškozena.\n\nMísto něj bude použit profil "%1". +OPTIONS_DEFRAW_MISSING;Výchozí profil pro raw fotky nelze nalézt nebo nastavit.\n\nZkontrolujte prosím vaši složku s profily, buď chybí nebo je poškozena.\n\nMísto něj bude použit profil "%1". +PARTIALPASTE_ADVANCEDGROUP;Pokročilá nastavení PARTIALPASTE_BASICGROUP;Základní nastavení PARTIALPASTE_CACORRECTION;Korekce chromatické aberace PARTIALPASTE_CHANNELMIXER;Míchání kanálů @@ -912,8 +949,10 @@ PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;L*a*b* úpravy PARTIALPASTE_LENSGROUP;Nastavení související s objektivy -PARTIALPASTE_LENSPROFILE;Korekční profil objektivu -PARTIALPASTE_METAGROUP;Metadata +PARTIALPASTE_LENSPROFILE;Korekční profily objektivů +PARTIALPASTE_LOCALCONTRAST;Místní kontrast +PARTIALPASTE_METADATA;Režim metadat +PARTIALPASTE_METAGROUP;Nastavení metadat PARTIALPASTE_PCVIGNETTE;Viněta PARTIALPASTE_PERSPECTIVE;Perspektiva PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtr mrtvých pixelů @@ -933,7 +972,7 @@ PARTIALPASTE_RAW_FALSECOLOR;Potlačení chybných barev PARTIALPASTE_RAW_IMAGENUM;Dílčí snímek PARTIALPASTE_RAW_LMMSEITERATIONS;Kroky rozšíření LMMSE -PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift PARTIALPASTE_RESIZE;Změna velikosti PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;RGB křivky @@ -942,9 +981,9 @@ PARTIALPASTE_SHARPENEDGE;Hrany PARTIALPASTE_SHARPENING;Doostření (USM/RL) PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_TM_FATTAL;HDR mapování tónů PARTIALPASTE_VIBRANCE;Živost PARTIALPASTE_VIGNETTING;Korekce vinětace -PARTIALPASTE_WAVELETGROUP;Úrovně vlnky PARTIALPASTE_WHITEBALANCE;Nastavení bílé PREFERENCES_ADD;Přidat PREFERENCES_APPLNEXTSTARTUP;vyžaduje restart aplikace @@ -954,6 +993,7 @@ PREFERENCES_AUTLISVLOW;Ne PREFERENCES_AUTLOW;Nízká PREFERENCES_AUTOMONPROFILE;Použít barevný profil hlavního monitoru z operačního systému +PREFERENCES_AUTOSAVE_TP_OPEN;Před ukončením automaticky uložit\nstav sbalení/rozbalení nástrojů. PREFERENCES_AUTSTD;Běžná PREFERENCES_BATCH_PROCESSING;Dávkové zpracování PREFERENCES_BEHADDALL;Vše do 'Přidat' @@ -969,7 +1009,7 @@ PREFERENCES_CACHEOPTS;Vlastnosti mezipaměti PREFERENCES_CACHETHUMBHEIGHT;Maximální výška náhledu PREFERENCES_CIEART;CIECAM02 optimalizace -PREFERENCES_CIEART_FRAME;CIECAM0 2 -Specifická nastavení +PREFERENCES_CIEART_FRAME;CIECAM02 - Specifická nastavení PREFERENCES_CIEART_LABEL;Použít jednoduchou přesnost místo dvojnásobné PREFERENCES_CIEART_TOOLTIP;Pokud je povoleno, budou pro CIECAM02 výpočty použita reálná čísla s jednoduchou přesností místo čísel s dvojnásobnou přesností. Tím se dosáhne mírného zrychlení výpočtů za cenu nepatrné ztráty kvality. PREFERENCES_CLIPPINGIND;Indikace oříznutí @@ -977,6 +1017,12 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximální počet přednačtených CLUTů PREFERENCES_CLUTSDIR;Složka HaldCLUT PREFERENCES_CMMBPC;Kompenzace černého bodu +PREFERENCES_CROP;Úprava ořezu +PREFERENCES_CROP_AUTO_FIT;Automaticky přizpůsobit přiblížení oblasti ořezu +PREFERENCES_CROP_GUIDES;Zobrazovat vodítka i když neprobíhá ořez +PREFERENCES_CROP_GUIDES_FRAME;Snímek +PREFERENCES_CROP_GUIDES_FULL;Originál +PREFERENCES_CROP_GUIDES_NONE;Nic PREFERENCES_CURVEBBOXPOS;Pozice tlačítek pro kopírování a vložení křivky PREFERENCES_CURVEBBOXPOS_ABOVE;Nad PREFERENCES_CURVEBBOXPOS_BELOW;Pod @@ -989,37 +1035,36 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Cesta k programu PREFERENCES_CUTOVERLAYBRUSH;Barva masky ořezu/průhlednosti -PREFERENCES_D50;5000K +PREFERENCES_D50;Nastavení v hlavní nabídce +PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Tmavý snímek PREFERENCES_DARKFRAMEFOUND;Nalezeno PREFERENCES_DARKFRAMESHOTS;snímků -PREFERENCES_DARKFRAMETEMPLATES;šablon +PREFERENCES_DARKFRAMETEMPLATES;šablony PREFERENCES_DATEFORMAT;Formát data PREFERENCES_DATEFORMATHINT;Lze použít následující formátovací řetězce:\n%y\t- rok (year)\n%m\t- měsíc (month)\n%d\t- den (day)\n\nNapříklad český formát data:\n%d. %m. %y PREFERENCES_DAUB_LABEL;Použít D6 Daubechiesové vlnky namísto D4 PREFERENCES_DAUB_TOOLTIP;Nástroje Redukce šumu a Úrovně vlnky používají Daubechiesové mateřskou vlnku. Pokud místo D4 vyberete D6 zvýší se počet ortogonálních Daubechiesové koeficientů a pravděpodobně zvýší kvalitu úrovní malého měřítka. Není zde rozdíl ve spotřebě paměti nebo délce zpracování. PREFERENCES_DIRDARKFRAMES;Složka tmavých snímků +PREFERENCES_DIRECTORIES;Složky PREFERENCES_DIRHOME;Domovská složka PREFERENCES_DIRLAST;Poslední navštívená složka PREFERENCES_DIROTHER;Jiná PREFERENCES_DIRSELECTDLG;Zvolte složku s obrázky při spuštění... PREFERENCES_DIRSOFTWARE;Instalační složka -PREFERENCES_EDITORCMDLINE;Jiný příkaz +PREFERENCES_EDITORCMDLINE;Vlastní příkazová řádka PREFERENCES_EDITORLAYOUT;Rozvržení editoru PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externí editor PREFERENCES_FBROWSEROPTS;Volby prohlížeče souborů / náhledů PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Jednořádková lišta nástrojů v prohlížeči souborů\n(vypněte na nízkých rozlišeních) PREFERENCES_FILEFORMAT;Formát souboru -PREFERENCES_FILMSIMULATION;Simulace filmu -PREFERENCES_FLATFIELD;Flat Field PREFERENCES_FLATFIELDFOUND;Nalezeno PREFERENCES_FLATFIELDSDIR;Složka Flat Field souborů PREFERENCES_FLATFIELDSHOTS;snímků -PREFERENCES_FLATFIELDTEMPLATES;šablon +PREFERENCES_FLATFIELDTEMPLATES;šablony PREFERENCES_FLUOF2;Fluorescenční F2 PREFERENCES_FLUOF7;Fluorescenční F7 PREFERENCES_FLUOF11;Fluorescenční F11 @@ -1032,7 +1077,8 @@ PREFERENCES_GREY05;Yb=05 CIE L#30 PREFERENCES_GREY10;Yb=10 CIE L#40 PREFERENCES_GREY15;Yb=15 CIE L#45 -PREFERENCES_GREY18;Yb=18 CIE L#50 +PREFERENCES_GREY18;Nastavení v hlavní nabídce +PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 PREFERENCES_GREY23;Yb=23 CIE L#55 PREFERENCES_GREY30;Yb=30 CIE L#60 PREFERENCES_GREY40;Yb=40 CIE L#70 @@ -1054,6 +1100,7 @@ PREFERENCES_INTENT_RELATIVE;Relativní kolorimetrie PREFERENCES_INTENT_SATURATION;Nasycení PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Ukázat vložené JPEG náhledy u needitovaných snímků +PREFERENCES_LANG;Jazyk PREFERENCES_LANGAUTODETECT;Použít systémový jazyk PREFERENCES_LEVAUTDN;Úroveň odšumění PREFERENCES_LEVDN;Velikost buňky @@ -1097,7 +1144,7 @@ PREFERENCES_PREVDEMO_FAST;Rychlá PREFERENCES_PREVDEMO_LABEL;Metoda demozajkování pro náhled při přiblížení menším než 100%: PREFERENCES_PREVDEMO_SIDECAR;Stejná jako v PP3 -PREFERENCES_PRINTER;Tiskárna (obtah) +PREFERENCES_PRINTER;Tiskárna (měkký nátisk) PREFERENCES_PROFILEHANDLING;Řízení profilů zpracování PREFERENCES_PROFILELOADPR;Priorita nahrávání profilů zpracování PREFERENCES_PROFILEPRCACHE;Profil v mezipaměti @@ -1115,6 +1162,7 @@ PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Zapamatovat si procento přiblížení a posun aktuálního obrázku a použít tyto hodnoty při otevírání nového obrázku.\n\nTato volba funguje pouze v režimu "Mód jedné karty editoru" a volba "Metoda demozajkování pro náhled při přiblížení menším než 100%" je nastavena na "Stejně jako v PP3". PREFERENCES_RGBDTL_LABEL;Maximální počet vláken pro redukci šumu a úrovně vlnky PREFERENCES_RGBDTL_TOOLTIP;Pro automatické nastavení maximálního možného počtu vláken ponechte nastaveno na "0". Čím více vláken běží paralelně, tím rychlejší je výpočet. Paměťové nároky najdete na RawPedii. +PREFERENCES_SAVE_TP_OPEN_NOW;Uložit stav sbalení/rozbalení nástrojů hned PREFERENCES_SELECTFONT;Vyberte hlavní písmo PREFERENCES_SELECTFONT_COLPICKER;Vybrat písmo pro Průzkumníka barev PREFERENCES_SELECTLANG;Volba jazyka @@ -1145,6 +1193,7 @@ PREFERENCES_TAB_IMPROC;Zpracování obrázku PREFERENCES_TAB_PERFORMANCE;Výkon a kvalita PREFERENCES_TAB_SOUND;Zvuky +PREFERENCES_THEME;Vzhled PREFERENCES_TIMAX;Vysoký PREFERENCES_TINB;Počet dlaždic PREFERENCES_TISTD;Běžný @@ -1168,7 +1217,7 @@ PROFILEPANEL_MYPROFILES;Mé profily PROFILEPANEL_PASTEPPASTE;Parametry pro vložení PROFILEPANEL_PCUSTOM;Vlastní -PROFILEPANEL_PDYNAMIC;Dynamiký +PROFILEPANEL_PDYNAMIC;Dynamický PROFILEPANEL_PFILE;Ze souboru PROFILEPANEL_PINTERNAL;Neutrální PROFILEPANEL_PLASTSAVED;Poslední uschovaný @@ -1192,13 +1241,21 @@ PROGRESSBAR_SAVETIFF;Ukládání TIFF souboru... PROGRESSBAR_SNAPSHOT_ADDED;Snímek přidán PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil upracování změněn v prohlížeči +QINFO_FRAMECOUNT;%2 snímků +QINFO_HDR;HDR / %2 snímků QINFO_ISO;ISO QINFO_NOEXIF;Exif údaje nejsou k dispozici. +QINFO_PIXELSHIFT;Pixel Shift / %2 snímků +SAMPLEFORMAT_0;Neznámý datový formát +SAMPLEFORMAT_1;Neznaménkový, 8 bitů +SAMPLEFORMAT_2;Neznaménkový, 16 bitů +SAMPLEFORMAT_4;LogLuv, 24 bitů +SAMPLEFORMAT_8;LogLuv, 32 bitů +SAMPLEFORMAT_16;S pohyblivou čárkou, 32 bitů SAVEDLG_AUTOSUFFIX;Automaticky přidat příponu pokud soubor již existuje SAVEDLG_FILEFORMAT;Formát souboru SAVEDLG_FORCEFORMATOPTS;Vynutit volby uložení SAVEDLG_JPEGQUAL;Kvalita JPEG -SAVEDLG_PNGCOMPR;PNG Komprese SAVEDLG_PUTTOQUEUE;Vložit soubor do fronty SAVEDLG_PUTTOQUEUEHEAD;Vložit na začátek fronty SAVEDLG_PUTTOQUEUETAIL;Vložit na konec fronty @@ -1212,8 +1269,8 @@ SAVEDLG_TIFFUNCOMPRESSED;Nekomprimovaný TIFF SAVEDLG_WARNFILENAME;Soubor bude pojmenován SHCSELECTOR_TOOLTIP;Klikněte pravým tlačítkem myši pro obnovení výchozí pozice těchto tří posuvníků. -SOFTPROOF_GAMUTCHECK_TOOLTIP;Pokud je aktivní, budou pixely mimo barevnou paletu výstupního profilu označeny šedou barvou. -SOFTPROOF_TOOLTIP;Jemně korekční\nPokud je aktivní, umožní vám simulovat vykreslení dle výstupního profilu ICM. Nejužitečnější pro simulaci tiskového výstupu. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Zvýraznění pixelů s barvou mimo gamut bude respektovat:\n- profil tiskárny, pokud je nastaven a je povolen měkký nátisk,\n- výstupní profil, pokud není profil tiskárny nastaven a měkký nátisk je povolen,\n- profil monitoru, pokud je měkký nátisk zakázán. +SOFTPROOF_TOOLTIP;Měkký nátisk simuluje přizpůsobení obrázku:\n- během tisku, pokud je nastaven tiskový profil ve Volby > Správa barev.\n- během prohlížení na displeji, kde, pokud není profil tiskárny nastaven, je použit aktuální výstupní profil. THRESHOLDSELECTOR_B;Dole THRESHOLDSELECTOR_BL;Dole vlevo THRESHOLDSELECTOR_BR;Dole vpravo @@ -1302,11 +1359,11 @@ TP_COARSETRAF_TOOLTIP_ROTLEFT;Otočit doleva.\n\nZkratky:\n[ - režim více karet editoru,\nAlt-[- režim jedné karty editoru. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Otočit doprava.\n\nZkratky:\n] - režim více karet editoru,\nAlt-]- režim jedné karty editoru. TP_COARSETRAF_TOOLTIP_VFLIP;Překlopit vertikálně. -TP_COLORAPP_ADAPTSCENE;Svítivost scény -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolutní jas scény prostředí(cd/m²).\n 1) Vypočítáno z Exifu:\nRychlost závěrky - citlivost - clona - expoziční korekce fotoaparátu.\n 2) Vypočítáno z hodnoty raw bílého bodu a expoziční kompenzace Rawtherapee. -TP_COLORAPP_ADAPTVIEWING;Svítivost prohlížení (cd/m²) +TP_COLORAPP_ADAPTSCENE;Absolutní jas scény +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolutní jas scény prostředí (cd/m²).\n 1) Vypočítáno z Exifu:\nRychlost závěrky - citlivost - clona - expoziční korekce fotoaparátu.\n 2) Vypočítáno z hodnoty raw bílého bodu a expoziční kompenzace Rawtherapee. +TP_COLORAPP_ADAPTVIEWING;Absolutní jas prohlížení (cd/m²) TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolutní jas prostředí prohlížení\n(obvykle 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RT vypočítá optimální hodnotu z Exif dat.\nPokud si přejete zadat hodnotu ručně, nejprve zrušte zatržení tohoto pole. +TP_COLORAPP_ADAP_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RawTherapee vypočítá optimální hodnotu z Exif dat.\nPokud si přejete zadat hodnotu ručně, nejprve zrušte zatržení tohoto pole. TP_COLORAPP_ALGO;Algoritmus TP_COLORAPP_ALGO_ALL;Vše TP_COLORAPP_ALGO_JC;Světlost + Barevnost (JC) @@ -1314,7 +1371,7 @@ TP_COLORAPP_ALGO_QM;Jas a pestrobarevnost (QM) TP_COLORAPP_ALGO_TOOLTIP;Umožňuje vybrat mezi podmnožinou nebo všemi parametry. TP_COLORAPP_BADPIXSL;Filtr vypálených/mrtvých pixelů -TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02. +TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02. TP_COLORAPP_BRIGHT;Jas (O) TP_COLORAPP_BRIGHT_TOOLTIP;Jas v CIECAM02 bere v potaz svítivost bílé a rozdíly jasů mezi L*a*b* a RGB. TP_COLORAPP_CHROMA;Barevnost (C) @@ -1326,8 +1383,8 @@ TP_COLORAPP_CIECAT_DEGREE;CAT02 přizpůsobení TP_COLORAPP_CONTRAST;Kontrast (I) TP_COLORAPP_CONTRAST_Q;Kontrast (O) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast pro posuvník Q se v CIECAM02 liší od kontrastu L*a*b* a RGB. -TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast pro posuvník J se v CIECAM02 liší od kontrastu L*a*b* a RGB. +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. +TP_COLORAPP_CONTRAST_TOOLTIP;Liší se od kontrastu L*a*b* a RGB. TP_COLORAPP_CURVEEDITOR1;Tónová křivka 1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Zobrazuje histogram L* (L*a*b*) křivky před CIECAM02.\nPokud je volba "Zobrazit CIECAM02 histogramy výstupu v křivkách" povolena, zobrazí histogram J nebo Q po CIECAM02 .\n\nJ a Q histogramy nejsou na hlavním panelu zobrazeny.\n\nHistogram konečného výsledku je zobrazen na hlavním panelu. TP_COLORAPP_CURVEEDITOR2;Tónová křivka 2 @@ -1338,6 +1395,7 @@ TP_COLORAPP_DATACIE_TOOLTIP;Pokud je povoleno, zobrazuje histogram v CIECAM02 křivkách přibližné hodnoty/rozsahy po CIECAM02 úpravách J nebo Q, a C, S nebo M.\nVýběr neovlivňuje histogram na hlavním panelu.\n\nPokud je zakázáno, zobrazuje histogram v CIECAM02 křivkách L*a*b* hodnoty před CIECAM02 úpravami. TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Pokud je povoleno (doporučeno), RawTherapee vypočítá optimální hodnotu, jenž následně používá jak CAT02 tak i celý CIECAM02.\nZakažte, pokud si přejete zadat hodnotu ručně (doporučeny jsou hodnoty nad 65). TP_COLORAPP_DEGREE_TOOLTIP;Míra CIE Chromatic Adaptation Transform 2002. +TP_COLORAPP_FREE;Volná teplota + zelená + CAT02 + [výstup] TP_COLORAPP_GAMUT;Kontrola palety (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Povolí kontrolu palety v L*a*b* režimu. TP_COLORAPP_HUE;Odstín (h) @@ -1349,7 +1407,9 @@ TP_COLORAPP_LIGHT;Světlost (I) TP_COLORAPP_LIGHT_TOOLTIP;Světlost v CIECAM02 se liší od světlosti v L*a*b* a RGB. TP_COLORAPP_MODEL;VB - Model -TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RT , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno ve Volby > Správa barev.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RT nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno ve Volby > Správa barev. +TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RawTherapee , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RawTherapee nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nVolná teplota+zelená + CAT02 + [výstup]: teplota a zelená je vybrána uživatelem, vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení. +TP_COLORAPP_NEUTRAL;Obnovit +TP_COLORAPP_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek. TP_COLORAPP_RSTPRO;Ochrana červených a pleťových tónů TP_COLORAPP_RSTPRO_TOOLTIP;Ochrana červených a pleťových tónů ovlivňuje posuvníky i křivky. TP_COLORAPP_SHARPCIE;--nepoužito-- @@ -1370,10 +1430,14 @@ TP_COLORAPP_TCMODE_LABEL3;Mód barevné křivky TP_COLORAPP_TCMODE_LIGHTNESS;Světlost TP_COLORAPP_TCMODE_SATUR;Nasycení +TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Tint=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504 TP_COLORAPP_TONECIE;Mapování tónů pomocí CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Pokud je volba zakázána, probíhá mapování tónů v prostoru L*a*b*.\nPokud je volba povolena. probíhá mapování tónů pomocí CIECAM02.\nAby měla tato volba efekt, musí být povolen nástroj Mapování tónů. TP_COLORAPP_WBCAM;WB [RT+CAT02] + [výstup] TP_COLORAPP_WBRT;WB [RT] + [výstup] +TP_COLORAPP_YB;Yb% (střední jas) +TP_COLORAPP_YBSCENE;Yb% (střední jas) +TP_COLORAPP_YBSCENE_TOOLTIP;Pokud je povolena automatika, Yb je vypočteno ze střední hodnoty jasu aktuálního obrázku TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automaticky TP_COLORTONING_BALANCE;Vyvážené @@ -1385,6 +1449,8 @@ TP_COLORTONING_HUE;Odstín TP_COLORTONING_LAB;Mísení L*a*b* TP_COLORTONING_LABEL;Barevné tónování +TP_COLORTONING_LABGRID;Korekční mřížka L*a*b* barev +TP_COLORTONING_LABGRID_VALUES;SV: a=%1 b=%2\nSA: a=%3 b=%4 TP_COLORTONING_LUMA;Jas TP_COLORTONING_LUMAMODE;Zachování jasu TP_COLORTONING_LUMAMODE_TOOLTIP;Pokud je povoleno, je při změně barvy (červená, zelená, tyrkysová, modrá...) zachován jas každého pixelu. @@ -1433,68 +1499,63 @@ TP_DEFRINGE_LABEL;Odstranění lemu TP_DEFRINGE_RADIUS;Poloměr TP_DEFRINGE_THRESHOLD;Práh -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 jemný -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 jemný -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Pouze barevnost -TP_DIRPYRDENOISE_AUT;Automatická celková -TP_DIRPYRDENOISE_AUTO;Automatická celková -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Zkusí odhadnout barevný šum\nPozor, tento výpočet je zprůměrován a zcela subjektivní! -TP_DIRPYRDENOISE_BLUE;Barevnost - Modrá a žlutá -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. -TP_DIRPYRDENOISE_CCCURVE;Křivka barevnosti -TP_DIRPYRDENOISE_CHROMA;Barevnost - Hlavní -TP_DIRPYRDENOISE_CHROMAFR;Barevnost -TP_DIRPYRDENOISE_CTYPE;Metoda -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nVíce zónová automatika\nBez náhledu - funguje pouze při ukládání, přesto je možné pomocí funkce "Náhled" získat alespoň částečnou představu o výsledku, Nastavení jsou aplikována na centrální dlaždici.\nObrázek je rozdělen na dlaždice (V závislosti na velikosti obrázku jich bude 10 až 70) a pro každou dlaždici bude vypočítáno vhodné nastavení redukce barevného šumu.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. -TP_DIRPYRDENOISE_CUR;Křivka -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Barevnost -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Zvýší (násobí) hodnoty všech barevných posuvníků.\nKřivka vám umožní nastavit sílu redukce barevného šumu jako funkci barvy. Například pro zvýšení účinku v oblastech s nízkým nasycení a snížení v oblastech s vysokým nasycením. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje akci 'jasového' odstranění šumu +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Více zónová automatika +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatická celková +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Zkusí odhadnout barevný šum\nPozor, tento výpočet je zprůměrován a zcela subjektivní! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Barevnost - Modrá a žlutá +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Křivka barevnosti +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Zvýší (násobí) hodnoty všech barevných posuvníků.\nKřivka vám umožní nastavit sílu redukce barevného šumu jako funkci barvy. Například pro zvýšení účinku v oblastech s nízkým nasycení a snížení v oblastech s vysokým nasycením. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Barevnost +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Ručně +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Barevnost - Hlavní +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metoda +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Ručně\nOvlivňuje celý obrázek.\nVolby redukce šumu nastavujete ručně.\n\nCelková automatika\nOvlivňuje celý obrázek.\nPro výpočet parametrů celkové redukce barevného šumu je použito 9 zón.\n\nVíce zónová automatika\nBez náhledu - funguje pouze při ukládání, přesto je možné pomocí funkce "Náhled" získat alespoň částečnou představu o výsledku, Nastavení jsou aplikována na centrální dlaždici.\nObrázek je rozdělen na dlaždice (V závislosti na velikosti obrázku jich bude 10 až 70) a pro každou dlaždici bude vypočítáno vhodné nastavení redukce barevného šumu.\n\nNáhled\nOvlivňuje celý obrázek.\nPro výpočet celkového nastavení redukce barevného šumu je použita viditelná část obrázku. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Více zónový náhled +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Náhled +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Zobrazuje zbývající úroveň zašumění části obrázku viditelného v náhledu po vlnkové transformaci.\n\n>300 Hodně šumu\n100-300 Šum\n50-100 Málo šumu\n<50 Velmi málo šumu\n\nPozor, hodnoty RGB a L*a*b* se budou lišit. Hodnoty RGB jsou méně přesné, protože v RGB režimu nedochází ke kompletnímu oddělení jasu a barev. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Velikost náhledu=%1, Střed: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Náhled šumu: Průměr=%1 Výšky=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Náhled šumu: Průměr= - Výšky= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Velikost dlaždice=%1, Střed: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Barevnost - Červená a zelená TP_DIRPYRDENOISE_ENH;Vylepšený režim TP_DIRPYRDENOISE_ENH_TOOLTIP;Zvýší kvalitu odstranění šumu, ale zároveň prodlouží dobu zpracování o 20%. -TP_DIRPYRDENOISE_GAMMA;Gama -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gama ovlivňuje sílu redukce šumu v rozsahu tónů. Menší hodnoty ovlivňují stíny, kdežto vysoké hodnoty zesílí efekt v jasných tónech. -TP_DIRPYRDENOISE_LAB;L*a*b* TP_DIRPYRDENOISE_LABEL;Redukce šumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Křivka jasů -TP_DIRPYRDENOISE_LDETAIL;Jas - Detail -TP_DIRPYRDENOISE_LM;Pouze jas -TP_DIRPYRDENOISE_LPLABM;Vyvážená L* (trochu) + a*b* (normální) -TP_DIRPYRDENOISE_LTYPE;Ovládání jasu -TP_DIRPYRDENOISE_LUMA;Jas -TP_DIRPYRDENOISE_LUMAFR;Jas -TP_DIRPYRDENOISE_MAN;Ručně -TP_DIRPYRDENOISE_MANU;Ručně -TP_DIRPYRDENOISE_MED;Filtr medián -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediánu -TP_DIRPYRDENOISE_MEDTYPE;Typ mediánu -TP_DIRPYRDENOISE_METHOD;Metoda -TP_DIRPYRDENOISE_METHOD11;Kvalita -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Kvalita může být přizpůsobena vzoru šumu. Nastavení "Vysoká" vylepší efekt redukce šumu za cenu navýšení času zpracování. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Pro raw obrázky může být použita jak RGB tak i L*a*b* metoda.\n\nPro ostatní obrázky bude vždy použita metoda L*a*b* bez ohledu na výběr. -TP_DIRPYRDENOISE_METM_TOOLTIP;Pokud je použito 'Pouze Jas' a 'L*a*b*' metody, bude při odstranění šumu použit filtr medián hned po vlnkové transformaci.\nPokud je použit "RGB" mód, bude filtr použit až na úplný závěr procesu redukce šumu. -TP_DIRPYRDENOISE_MET_TOOLTIP;Aplikuje filtr medián požadované velikosti okna. Čím větší velikost okna, tím déle bude zpracování trvat.\n\n3×3 jemný: upraví 5 pixelů v okně 3x3 pixely.\n3×3: upraví 9 pixelů v okně 3x3 pixely.\n5×5 jemný; upraví 13 pixelů v okně 5x5 pixelů.\n5×5: upraví 25 pixelů v okně 5x5 pixelů.\n7×7: upraví 49 pixelů v okně 7x7 pixelů.\n9×9: upraví 81 pixelů v okně 9x9 pixelů.\n\nV některých případech může být větší kvality dosaženo pomocí několika průběhů s menšími okny než jedním průběhem s velkým oknem. -TP_DIRPYRDENOISE_NOISELABEL;Náhled šumu: Průměr=%1 Výšky=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Náhled šumu: Průměr= - Výšky= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zobrazuje zbývající úroveň zašumění části obrázku viditelného v náhledu po vlnkové transformaci.\n\n>300 Hodně šumu\n100-300 Šum\n50-100 Málo šumu\n<50 Velmi málo šumu\n\nUpozornění: hodnoty RGB a L*a*b* režimu se budou lišit. Protože v RGB režimu nedochází ke kompletnímu oddělení jasu a barev jsou RGB hodnoty jméně přesné -TP_DIRPYRDENOISE_PASSES;Počet průchodů mediánu -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Aplikování tří průchodů filtru medián s oknem 3×3 často vede k lepšímu výsledku než jednou aplikovaný filtr medián s oknem 7×7. -TP_DIRPYRDENOISE_PON;Více zónová automatika -TP_DIRPYRDENOISE_PRE;Více zónový náhled -TP_DIRPYRDENOISE_PREV;Náhled -TP_DIRPYRDENOISE_PREVLABEL;Velikost náhledu=%1, Střed: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Barevnost - Červená a zelená -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Běžná -TP_DIRPYRDENOISE_SHALBI;Vysoká +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Ovládání jasu +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Křivka jasů +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Obnovení detailů +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Jas +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Jas +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Barevný prostor +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Pro raw obrázky může být použita jak RGB tak i L*a*b* metoda.\n\nPro ostatní obrázky bude vždy použita metoda L*a*b* bez ohledu na výběr. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gama +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gama ovlivňuje sílu redukce šumu v rozsahu tónů. Menší hodnoty ovlivňují stíny, kdežto vysoké hodnoty zesílí efekt v jasných tónech. +TP_DIRPYRDENOISE_MAIN_MODE;Mód +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Agresívní +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Konzervativní +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Konzervativní" zachovává nízkofrekvenční barevné vzory, zatímco "Agresivní" je vyhladí. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediánu +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Pouze barevnost +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr medián +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Pouze jas +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Pokud je použito 'Pouze Jas' a 'L*a*b*' metody, bude při odstranění šumu použit filtr medián hned po vlnkové transformaci.\nPokud je použit "RGB" mód, bude filtr použit až na úplný závěr procesu redukce šumu. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Vyvážená L* (trochu) + a*b* (normální) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Počet průchodů mediánu +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Aplikování tří průchodů filtru medián s oknem 3×3 často vede k lepšímu výsledku než jednou aplikovaný filtr medián s oknem 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Typ mediánu +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Aplikuje filtr medián požadované velikosti okna. Čím větší velikost okna, tím déle bude zpracování trvat.\n\n3×3 jemný: upraví 5 pixelů v okně 3x3 pixely.\n3×3: upraví 9 pixelů v okně 3x3 pixely.\n5×5 jemný; upraví 13 pixelů v okně 5x5 pixelů.\n5×5: upraví 25 pixelů v okně 5x5 pixelů.\n7×7: upraví 49 pixelů v okně 7x7 pixelů.\n9×9: upraví 81 pixelů v okně 9x9 pixelů.\n\nV některých případech může být větší kvality dosaženo pomocí několika průběhů s menšími okny než jedním průběhem s velkým oknem. TP_DIRPYRDENOISE_SLI;Posuvník -TP_DIRPYRDENOISE_TILELABEL;Velikost dlaždice=%1, Střed: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 jemný +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 jemný +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Rozsah pleťových tónů TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Jemný: blíž k barvám pleti, minimalizuje zásahy na ostatních barvách.\nVelký: více zabrání vzniku artefaktů. TP_DIRPYREQUALIZER_ARTIF;Omezení artefaktů @@ -1534,6 +1595,8 @@ TP_EXPOSURE_CURVEEDITOR2;Tónová křivka 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Podívejte se prosím na článek "Exposure > Tone Curves" na RawPedii, kde se můžete naučit. jak pomocí dvou tónových křivek dosáhnout ten nejlepší výsledek. TP_EXPOSURE_EXPCOMP;Kompenzace expozice +TP_EXPOSURE_HISTMATCHING;Automaticky nalezená Tónová křivka +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatické nastavení posuvníků a křivek (kromě kompenzace expozice) tak, aby bylo dosaženo co největší shody s vloženým Jpeg náhledem. TP_EXPOSURE_LABEL;Expozice TP_EXPOSURE_SATURATION;Nasycení TP_EXPOSURE_TCMODE_FILMLIKE;Jako film @@ -1590,7 +1653,7 @@ TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Základní expozice -TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Použije vložený DCP základní posun expozice. Toto nastavení je dostupné pouze ji pokud DCP obsahuje. +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Použije vložený DCP základní posun expozice. Toto nastavení je dostupné pouze pokud ji vybrané DCP obsahuje. TP_ICM_APPLYHUESATMAP;Základní tabulka TP_ICM_APPLYHUESATMAP_TOOLTIP;Použije vloženou DCP základní tabulku (HueSatMap). Toto nastavení je dostupné pouze pokud ji vybrané DCP obsahuje. TP_ICM_APPLYLOOKTABLE;Tabulka vzhledu @@ -1600,7 +1663,7 @@ TP_ICM_BPC;Kompenzace černého bodu TP_ICM_DCPILLUMINANT;Osvětlení TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolované -TP_ICM_DCPILLUMINANT_TOOLTIP;Vyberte které vložené DCP osvětlení se má použít. Ve výchozím stavu se použije "interpolované", což je mix mezi dvěma osvětleními založenými na vyvážení bílé. Nastavené je dostupné pouze v případě, že je povoleno dvojité DCP osvětlení s podporou interpolace. +TP_ICM_DCPILLUMINANT_TOOLTIP;Vyberte které vložené DCP osvětlení se má použít. Ve výchozím stavu se použije "interpolované", což je mix mezi dvěma osvětleními založenými na vyvážení bílé. Nastavené je povoleno pouze v případě, že je vybráno\t dvojité DCP osvětlení s podporou interpolace. TP_ICM_INPUTCAMERA;Standard fotoaparátu TP_ICM_INPUTCAMERAICC;Automatický dohledaný profil fotoaparátu TP_ICM_INPUTCAMERAICC_TOOLTIP;Použít RawTherapee specifický DCP nebo ICC vstupní barevný profil fotoaparátu jenž je mnohem přesnější než zjednodušená matice. Není dostupné pro všechny fotoaparáty. Profily jsou uloženy ve složkách /iccprofiles/input a /dcpprofiles a jsou automaticky vybrány dle jména souboru shodného s fotoaparátem. @@ -1622,7 +1685,7 @@ TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Obecně se vyvážení bílé aplikuje při ukládání obrázku pro vytvoření ICC profilů a neaplikuje při vytváření DCP profilů. TP_ICM_SAVEREFERENCE_TOOLTIP;Uloží lineární TIFF obrázek před aplikováním vstupního profilu. Výsledek může být použit pro kalibraci a generování profilu fotoaparátu. TP_ICM_TONECURVE;Tónová křivka -TP_ICM_TONECURVE_TOOLTIP;Použije vloženou DCP tónovou křivku. Nastavení je dostupné pouze v případě, že DCP obsahuje tónovou křivku. +TP_ICM_TONECURVE_TOOLTIP;Použije vloženou DCP tónovou křivku. Nastavení je dostupné pouze v případě, že vybrané DCP obsahuje tónovou křivku. TP_ICM_WORKINGPROFILE;Pracovní barevný prostor TP_IMPULSEDENOISE_LABEL;Redukce impulzního šumu TP_IMPULSEDENOISE_THRESH;Práh @@ -1666,10 +1729,19 @@ TP_LENSGEOM_AUTOCROP;Automatický ořez TP_LENSGEOM_FILL;Automatické vyplnění TP_LENSGEOM_LABEL;Objektiv / Geometrie -TP_LENSPROFILE_LABEL;Korekční profil objektivu +TP_LENSPROFILE_LABEL;Korekční profily objektivů TP_LENSPROFILE_USECA;Korekce chromatické aberace TP_LENSPROFILE_USEDIST;Korekce zkreslení TP_LENSPROFILE_USEVIGN;Korekce vinětace +TP_LOCALCONTRAST_AMOUNT;Míra +TP_LOCALCONTRAST_DARKNESS;Úroveň tmavé +TP_LOCALCONTRAST_LABEL;Místní kontrast +TP_LOCALCONTRAST_LIGHTNESS;Úroveň světlé +TP_LOCALCONTRAST_RADIUS;Poloměr +TP_METADATA_EDIT;Aplikovat změny +TP_METADATA_MODE;Režim kopírování metadat +TP_METADATA_STRIP;Odstranit všechna metadata +TP_METADATA_TUNNEL;Kopírovat beze změny TP_NEUTRAL;Obnovit TP_NEUTRAL_TIP;Nastaví posuvníky expozice na neutrální hodnoty,\nPoužije stejné kontroly jako volba "Automatické úrovně" bez ohledu na to, zda jsou nebo nejsou Automatické úrovně použity. TP_PCVIGNETTE_FEATHER;Rozptyl @@ -1720,7 +1792,7 @@ TP_RAW_DMETHOD;Metoda TP_RAW_DMETHOD_PROGRESSBAR;%1 demozajkování... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Vylepšení demozajkování... -TP_RAW_DMETHOD_TOOLTIP;Poznámka: IGV a LMMSE jsou určeny pro obrázky s vysokým ISO, kde pomáhají redukci šumu minimalizovat posterizaci a vyžehlený vzhled.\n\nPixel Shift je určen pro soubory Pentax Pixel Shift.\nPro soubory neobsahující Pixel Shift data je použita metoda AMaZE. +TP_RAW_DMETHOD_TOOLTIP;Poznámka: IGV a LMMSE jsou určeny pro obrázky s vysokým ISO, kterým pomáhají vyhnout se u redukce šumu vzniku vzorů, posterizaci a vyžehlenému vzhledu.\n\nPixel Shift je určen pro soubory Pentax/Sony Pixel Shift.\nPro soubory neobsahující Pixel Shift data je použita metoda AMaZE. TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Počet kroků potlačování chybných barev TP_RAW_FAST;Rychlá @@ -1729,7 +1801,7 @@ TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Dílčí snímek -TP_RAW_IMAGENUM_TOOLTIP;Některé raw snímky obsahují několik podsnímků (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nV případě, že je pro demozajkování použita jiná metoda než Pixel Shift, tato volba určí, který podsnímek se použije.\n\nPokud je použita Pixel Shift metoda demozajkování na Pixel Shift raw soubory, budou použity všechny podsnímky a tato volba určí, který snímek bude použit pro pohyblivé části. +TP_RAW_IMAGENUM_TOOLTIP;Některé raw snímky obsahují několik podsnímků (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nV případě, že je pro demozajkování použita jiná metoda než Pixel Shift, tato volba určí, který podsnímek se použije.\n\nPokud je použita Pixel Shift metoda demozajkování na Pixel Shift raw soubory, budou použity všechny podsnímky a tato volba určí, který snímek bude použit pro pohyblivé části. TP_RAW_LABEL;Demozajkování TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;Kroky rozšíření LMMSE @@ -1769,6 +1841,8 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Kontrolovat červenou/modrou vodorovně TP_RAW_PIXELSHIFTNONGREENVERTICAL;Kontrolovat červenou/modrou svisle TP_RAW_PIXELSHIFTNREADISO;nRead +TP_RAW_PIXELSHIFTONEGREEN;Použít jednu zelenou místo průměru +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;V oblastech bez pohybu použije jednu zelenou namísto zprůměrování obou zelených. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Váha červené a modré TP_RAW_PIXELSHIFTSHOWMOTION;Ukázat masku pohybu @@ -1782,6 +1856,7 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev faktor modrý TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev faktor zelený TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev faktor červený +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Snímač s Bayerovou maskou TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Tří průchodová dává lepší výsledky (doporučeno pro fotky s nízkým ISO).\nJednoprůchodová je téměř k nerozeznání od tří průchodové pro vysoké ISO a je rychlejší. TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí @@ -1922,6 +1997,10 @@ TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;Matice 3×3 namísto 5×5 TP_SHARPENMICRO_UNIFORMITY;Jednolitost +TP_TM_FATTAL_AMOUNT;Míra +TP_TM_FATTAL_ANCHOR;Kotva +TP_TM_FATTAL_LABEL;HDR Mapování tónů +TP_TM_FATTAL_THRESHOLD;Práh TP_VIBRANCE_AVOIDCOLORSHIFT;Zabránit posunu barev TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tóny pleti @@ -2115,7 +2194,7 @@ TP_WBALANCE_CUSTOM;Vlastní TP_WBALANCE_DAYLIGHT;Denní světlo (slunečno) TP_WBALANCE_EQBLUERED;Korekce modrá/červená -TP_WBALANCE_EQBLUERED_TOOLTIP;Umožňuje odchýlení se od normálního chování "vyvážení bílé" pomocí změny vyvážení modré a červené.\nToto může být užitečné v těchto případech:\na) podmínky jsou velmi odlišné od standardních (například pod vodou),\nb) podmínky se velmi liší od podmínek za kterých probíhala kalibrace,\nc) nevhodné snímače nebo ICC profily. +TP_WBALANCE_EQBLUERED_TOOLTIP;Umožňuje odchýlení se od normálního chování "vyvážení bílé" pomocí změny vyvážení modré a červené.\nToto může být užitečné v těchto případech:\na) podmínky jsou velmi odlišné od běžného osvětlení (například pod vodou),\nb) podmínky se velmi liší od podmínek za kterých probíhala kalibrace,\nc) nevhodné snímače nebo ICC profily. TP_WBALANCE_FLASH55;Leica TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta @@ -2160,44 +2239,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otevřít (nové) okno detailu ZOOMPANEL_ZOOM100;Zvětšit na 100%\nZkratka: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit obrazovce\nZkratka: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Přizpůsobit obrázek obrazovce\nZkratka: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit ořez obrazovce\nZkratka: f +ZOOMPANEL_ZOOMFITSCREEN;Přizpůsobit celý obrázek obrazovce\nZkratka: Alt-f ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: + ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!DONT_SHOW_AGAIN;Don't show this message again. -!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -!HISTORY_MSG_476;CAM02 - Temp out -!HISTORY_MSG_477;CAM02 - Green out -!HISTORY_MSG_478;CAM02 - Yb out -!HISTORY_MSG_479;CAM02 - CAT02 adaptation out -!HISTORY_MSG_480;CAM02 - Automatic CAT02 out -!HISTORY_MSG_481;CAM02 - Temp scene -!HISTORY_MSG_482;CAM02 - Green scene -!HISTORY_MSG_483;CAM02 - Yb scene -!HISTORY_MSG_484;CAM02 - Auto Yb scene -!HISTORY_MSG_485;Lens Correction -!HISTORY_MSG_486;Lens Correction - Camera -!HISTORY_MSG_487;Lens Correction - Lens -!LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters -!LENSPROFILE_CORRECTION_LCPFILE;LCP File -!LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters -!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. -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_D50_OLD;5000K -!PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 -!PREFERENCES_LANG;Language -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_THEME;Theme -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -!TP_COLORAPP_NEUTRAL;Reset -!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 -!TP_COLORAPP_YB;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance diff -Nru rawtherapee-5.3/rtdata/languages/Dansk rawtherapee-5.4/rtdata/languages/Dansk --- rawtherapee-5.3/rtdata/languages/Dansk 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Dansk 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Vis billeder vurderet med 5 stjerner FILEBROWSER_SHOWTRASHHINT;Vis indhold i papirkurven FILEBROWSER_SHOWUNRANKHINT;Vis billeder uden vurdering -FILEBROWSER_STARTPROCESSING;Begynd bearbejdning -FILEBROWSER_STARTPROCESSINGHINT;Begynd at bearbejde/gemme billeder i køen -FILEBROWSER_STOPPROCESSING;Stop bearbejdning -FILEBROWSER_STOPPROCESSINGHINT;Stop bearbejdningen af billeder FILEBROWSER_THUMBSIZE;Miniaturestr. FILEBROWSER_ZOOMINHINT;Gør miniaturer større FILEBROWSER_ZOOMOUTHINT;Gør miniaturer mindre @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Andet PREFERENCES_DIRSELECTDLG;Vælg startmappe... PREFERENCES_DIRSOFTWARE;Installationsmappe -PREFERENCES_EDITORCMDLINE;Anden kommandostreng PREFERENCES_EXTERNALEDITOR;Eksternt redigeringsprogram PREFERENCES_FBROWSEROPTS;Indstllinger til filbrowser PREFERENCES_FILEFORMAT;Filformat @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/default rawtherapee-5.4/rtdata/languages/default --- rawtherapee-5.3/rtdata/languages/default 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/default 2018-03-20 11:04:15.000000000 +0000 @@ -9,7 +9,9 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Reset to default BATCHQUEUE_AUTOSTART;Auto-start +BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. BATCHQUEUE_DESTFILENAME;Path and file name +BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s BATCH_PROCESSING;Batch Processing CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -71,6 +73,7 @@ EXIFPANEL_RESETALL;Reset All EXIFPANEL_RESETALLHINT;Reset all tags to their original values. EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +EXIFPANEL_SHOWALL;Show all EXIFPANEL_SUBDIRECTORY;Subdirectory EXPORT_BYPASS;Processing steps to bypass EXPORT_BYPASS_ALL;Select / Unselect All @@ -196,12 +199,7 @@ FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -FILEBROWSER_STARTPROCESSING;Start processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s FILEBROWSER_THUMBSIZE;Thumbnail size -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -233,6 +231,7 @@ GENERAL_OPEN;Open GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Save +GENERAL_SLIDER;Slider GENERAL_UNCHANGED;(Unchanged) GENERAL_WARNING;Warning GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -420,7 +419,7 @@ HISTORY_MSG_170;Vibrance - HH curve HISTORY_MSG_171;L*a*b* - LC curve HISTORY_MSG_172;L*a*b* - Restrict LC -HISTORY_MSG_173;NR - Luminance detail +HISTORY_MSG_173;NR - Detail recovery HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 adaptation HISTORY_MSG_176;CAM02 - Viewing surround @@ -450,7 +449,7 @@ HISTORY_MSG_200;CAM02 - Tone mapping HISTORY_MSG_201;NR - Chrominance - R&G HISTORY_MSG_202;NR - Chrominance - B&Y -HISTORY_MSG_203;NR - Method +HISTORY_MSG_203;NR - Color space HISTORY_MSG_204;LMMSE enhancement steps HISTORY_MSG_205;CAM02 - Hot/bad pixel filter HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -502,7 +501,7 @@ HISTORY_MSG_253;CbDL - Reduce artifacts HISTORY_MSG_254;CbDL - Skin hue HISTORY_MSG_255;NR - Median filter -HISTORY_MSG_256;NR - Median type +HISTORY_MSG_256;NR - Median - Type HISTORY_MSG_257;Color Toning HISTORY_MSG_258;CT - Color curve HISTORY_MSG_259;CT - Opacity curve @@ -543,7 +542,7 @@ HISTORY_MSG_294;Film Simulation - Strength HISTORY_MSG_295;Film Simulation - Film HISTORY_MSG_296;NR - Luminance curve -HISTORY_MSG_297;NR - Quality +HISTORY_MSG_297;NR - Mode HISTORY_MSG_298;Dead pixel filter HISTORY_MSG_299;NR - Chrominance curve HISTORY_MSG_300;- @@ -718,6 +717,21 @@ HISTORY_MSG_485;Lens Correction HISTORY_MSG_486;Lens Correction - Camera HISTORY_MSG_487;Lens Correction - Lens +HISTORY_MSG_488;HDR Tone Mapping +HISTORY_MSG_489;HDR TM - Threshold +HISTORY_MSG_490;HDR TM - Amount +HISTORY_MSG_491;White Balance +HISTORY_MSG_492;RGB Curves +HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +HISTORY_MSG_METADATA_MODE;Metadata copy mode +HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -803,6 +817,8 @@ MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +MAIN_TAB_ADVANCED;Advanced +MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w MAIN_TAB_COLOR;Color MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c MAIN_TAB_DETAIL;Detail @@ -821,8 +837,6 @@ MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r MAIN_TAB_TRANSFORM;Transform MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -MAIN_TAB_WAVELET;Wavelet -MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -855,8 +869,10 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Width: %1, Height: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +PARTIALPASTE_ADVANCEDGROUP;Advanced Settings PARTIALPASTE_BASICGROUP;Basic Settings PARTIALPASTE_CACORRECTION;Chromatic aberration correction PARTIALPASTE_CHANNELMIXER;Channel mixer @@ -895,7 +911,9 @@ PARTIALPASTE_LABCURVE;L*a*b* adjustments PARTIALPASTE_LENSGROUP;Lens Related Settings PARTIALPASTE_LENSPROFILE;Profiled lens correction -PARTIALPASTE_METAGROUP;Metadata +PARTIALPASTE_LOCALCONTRAST;Local contrast +PARTIALPASTE_METADATA;Metadata mode +PARTIALPASTE_METAGROUP;Metadata settings PARTIALPASTE_PCVIGNETTE;Vignette filter PARTIALPASTE_PERSPECTIVE;Perspective PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -915,7 +933,7 @@ PARTIALPASTE_RAW_FALSECOLOR;False color suppression PARTIALPASTE_RAW_IMAGENUM;Sub-image PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift PARTIALPASTE_RESIZE;Resize PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;RGB curves @@ -924,9 +942,9 @@ PARTIALPASTE_SHARPENEDGE;Edges PARTIALPASTE_SHARPENING;Sharpening (USM/RL) PARTIALPASTE_SHARPENMICRO;Microcontrast +PARTIALPASTE_TM_FATTAL;HDR Tone mapping PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Vignetting correction -PARTIALPASTE_WAVELETGROUP;Wavelet Levels PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_ADD;Add PREFERENCES_APPLNEXTSTARTUP;restart required @@ -960,6 +978,12 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs PREFERENCES_CLUTSDIR;HaldCLUT directory PREFERENCES_CMMBPC;Black point compensation +PREFERENCES_CROP;Crop editing +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +PREFERENCES_CROP_GUIDES_FRAME;Frame +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;None PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons PREFERENCES_CURVEBBOXPOS_ABOVE;Above PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -977,7 +1001,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Dark-Frame PREFERENCES_DARKFRAMEFOUND;Found PREFERENCES_DARKFRAMESHOTS;shots PREFERENCES_DARKFRAMETEMPLATES;templates @@ -986,20 +1009,19 @@ PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. PREFERENCES_DIRDARKFRAMES;Dark-frames directory +PREFERENCES_DIRECTORIES;Directories PREFERENCES_DIRHOME;Home directory PREFERENCES_DIRLAST;Last visited directory PREFERENCES_DIROTHER;Other PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... PREFERENCES_DIRSOFTWARE;Installation directory -PREFERENCES_EDITORCMDLINE;Other command line +PREFERENCES_EDITORCMDLINE;Custom command line PREFERENCES_EDITORLAYOUT;Editor Layout PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;External Editor PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) PREFERENCES_FILEFORMAT;File format -PREFERENCES_FILMSIMULATION;Film Simulation -PREFERENCES_FLATFIELD;Flat-Field PREFERENCES_FLATFIELDFOUND;Found PREFERENCES_FLATFIELDSDIR;Flat-fields directory PREFERENCES_FLATFIELDSHOTS;shots @@ -1180,13 +1202,21 @@ PROGRESSBAR_SAVETIFF;Saving TIFF file... PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +QINFO_FRAMECOUNT;%2 frames +QINFO_HDR;HDR / %2 frame(s) QINFO_ISO;ISO QINFO_NOEXIF;Exif data not available. +QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +SAMPLEFORMAT_0;Unknown data format +SAMPLEFORMAT_1;Unsigned 8 bits +SAMPLEFORMAT_2;Unsigned 16 bits +SAMPLEFORMAT_4;LogLuv 24 bits +SAMPLEFORMAT_8;LogLuv 32 bits +SAMPLEFORMAT_16;32 bits floating point SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists SAVEDLG_FILEFORMAT;File format SAVEDLG_FORCEFORMATOPTS;Force saving options SAVEDLG_JPEGQUAL;JPEG quality -SAVEDLG_PNGCOMPR;PNG compression SAVEDLG_PUTTOQUEUE;Put into processing queue SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue @@ -1200,8 +1230,8 @@ SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF SAVEDLG_WARNFILENAME;File will be named SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. THRESHOLDSELECTOR_B;Bottom THRESHOLDSELECTOR_BL;Bottom-left THRESHOLDSELECTOR_BR;Bottom-right @@ -1361,14 +1391,14 @@ TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode TP_COLORAPP_TCMODE_LIGHTNESS;Lightness TP_COLORAPP_TCMODE_SATUR;Saturation -TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] TP_COLORAPP_YB;Yb% (mean luminance) TP_COLORAPP_YBSCENE;Yb% (mean luminance) -TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatic TP_COLORTONING_BALANCE;Balance @@ -1380,6 +1410,8 @@ TP_COLORTONING_HUE;Hue TP_COLORTONING_LAB;L*a*b* blending TP_COLORTONING_LABEL;Color Toning +TP_COLORTONING_LABGRID;L*a*b* color correction grid +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Preserve luminance TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1428,68 +1460,63 @@ TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Chroma only -TP_DIRPYRDENOISE_AUT;Automatic global -TP_DIRPYRDENOISE_AUTO;Automatic global -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -TP_DIRPYRDENOISE_CHROMAFR;Chrominance -TP_DIRPYRDENOISE_CTYPE;Method -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_CUR;Curve -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green TP_DIRPYRDENOISE_ENH;Enhanced mode TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -TP_DIRPYRDENOISE_LAB;L*a*b* TP_DIRPYRDENOISE_LABEL;Noise Reduction -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminance curve -TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -TP_DIRPYRDENOISE_LM;Luminance only -TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Luminance control -TP_DIRPYRDENOISE_LUMA;Luminance -TP_DIRPYRDENOISE_LUMAFR;Luminance -TP_DIRPYRDENOISE_MAN;Manual -TP_DIRPYRDENOISE_MANU;Manual -TP_DIRPYRDENOISE_MED;Median Filter -TP_DIRPYRDENOISE_MEDMETHOD;Median method -TP_DIRPYRDENOISE_MEDTYPE;Median type -TP_DIRPYRDENOISE_METHOD;Method -TP_DIRPYRDENOISE_METHOD11;Quality -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -TP_DIRPYRDENOISE_PASSES;Median iterations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -TP_DIRPYRDENOISE_PON;Auto multi-zones -TP_DIRPYRDENOISE_PRE;Preview multi-zones -TP_DIRPYRDENOISE_PREV;Preview -TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;High +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +TP_DIRPYRDENOISE_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. TP_DIRPYRDENOISE_SLI;Slider -TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Skin Color Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1529,6 +1556,8 @@ TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. TP_EXPOSURE_EXPCOMP;Exposure compensation +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_EXPOSURE_LABEL;Exposure TP_EXPOSURE_SATURATION;Saturation TP_EXPOSURE_TCMODE_FILMLIKE;Film-like @@ -1665,6 +1694,15 @@ TP_LENSPROFILE_USECA;Chromatic aberration correction TP_LENSPROFILE_USEDIST;Distortion correction TP_LENSPROFILE_USEVIGN;Vignetting correction +TP_LOCALCONTRAST_AMOUNT;Amount +TP_LOCALCONTRAST_DARKNESS;Darkness level +TP_LOCALCONTRAST_LABEL;Local Contrast +TP_LOCALCONTRAST_LIGHTNESS;Lightness level +TP_LOCALCONTRAST_RADIUS;Radius +TP_METADATA_EDIT;Apply modifications +TP_METADATA_MODE;Metadata copy mode +TP_METADATA_STRIP;Strip all metadata +TP_METADATA_TUNNEL;Copy unchanged TP_NEUTRAL;Reset TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. TP_PCVIGNETTE_FEATHER;Feather @@ -1715,7 +1753,7 @@ TP_RAW_DMETHOD;Method TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;False color suppression steps TP_RAW_FAST;Fast @@ -1724,7 +1762,7 @@ TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Sub-image -TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. TP_RAW_LABEL;Demosaicing TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1764,6 +1802,8 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical TP_RAW_PIXELSHIFTNREADISO;nRead +TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1777,6 +1817,7 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1917,6 +1958,10 @@ TP_SHARPENMICRO_LABEL;Microcontrast TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity +TP_TM_FATTAL_AMOUNT;Amount +TP_TM_FATTAL_ANCHOR;Anchor +TP_TM_FATTAL_LABEL;HDR Tone Mapping +TP_TM_FATTAL_THRESHOLD;Threshold TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2155,7 +2200,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Deutsch rawtherapee-5.4/rtdata/languages/Deutsch --- rawtherapee-5.3/rtdata/languages/Deutsch 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Deutsch 2018-03-20 11:04:15.000000000 +0000 @@ -43,6 +43,15 @@ #42 13.05.2017 Erweiterung (TooWaBoo) RT 5.0 r1 #43 21.07.2017 Erweiterung (TooWaBoo) RT 5.1 #44 21.09.2017 Erweiterung (TooWaBoo) RT 5.2 +#45 15.10.2017 Erweiterung (TooWaBoo) RT 5.3 +#46 18.10.2017 Erweiterung (TooWaBoo) RT 5.3 +#47 19.11.2017 HDR-Dynamikkompression (TooWaBoo) RT 5.3 +#48 13.12.2017 Erweiterung (TooWaBoo) RT 5.3 +#49 21.12.2017 Lokaler Kontrast (TooWaBoo) RT 5.3 +#50 07.01.2018 Crop Settings (TooWaBoo) RT 5.3 +#51 10.02.2018 Erweiterung (TooWaBoo) RT 5.3 +#52 10.02.2018 Korrektur (TooWaBoo) RT 5.3 +#53 26.02.2018 Erweiterung (TooWaBoo) RT 5.3 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen @@ -51,7 +60,9 @@ ABOUT_TAB_SPLASH;Startbild ADJUSTER_RESET_TO_DEFAULT;Standard wiederherstellen BATCHQUEUE_AUTOSTART;Automatisch starten +BATCHQUEUE_AUTOSTARTHINT;Bei neuem Job die Verarbeitung automatisch starten BATCHQUEUE_DESTFILENAME;Pfad und Dateiname +BATCHQUEUE_STARTSTOPHINT;Startet / Stoppt die Verarbeitung\nder Warteschlange.\n\nTaste: Strg + s BATCH_PROCESSING;Stapelverarbeitung CURVEEDITOR_AXIS_IN;x: CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -113,6 +124,7 @@ EXIFPANEL_RESETALL;Alle zurücksetzen EXIFPANEL_RESETALLHINT;Alle Attribute auf die ursprünglichen Werte zurücksetzen EXIFPANEL_RESETHINT;Gewählte Attribute auf die ursprünglichen Werte zurücksetzen +EXIFPANEL_SHOWALL;Alle anzeigen EXIFPANEL_SUBDIRECTORY;Unterverzeichnis EXPORT_BYPASS;Verarbeitungsschritte überspringen EXPORT_BYPASS_ALL;Alle/Keine auswählen @@ -238,12 +250,7 @@ FILEBROWSER_SHOWTRASHHINT;Inhalt des Papierkorbs anzeigen\nTaste: Strg + t FILEBROWSER_SHOWUNCOLORHINT;Nur unmarkierte Bilder anzeigen\nTaste: Alt + 0 FILEBROWSER_SHOWUNRANKHINT;Nur unbewertete Bilder anzeigen\nTaste: 0 -FILEBROWSER_STARTPROCESSING;Verarbeitung starten -FILEBROWSER_STARTPROCESSINGHINT;Verarbeitung und Speicherung der\nBilder starten.\nTaste: Strg + s -FILEBROWSER_STOPPROCESSING;Verarbeitung stoppen -FILEBROWSER_STOPPROCESSINGHINT;Verarbeitung der Bilder abbrechen.\nTaste: Strg + s FILEBROWSER_THUMBSIZE;Miniaturbildgröße -FILEBROWSER_TOOLTIP_STOPPROCESSING;Bei neuem Job die Verarbeitung automatisch starten FILEBROWSER_UNRANK_TOOLTIP;Bewertung entfernen\nTaste: Umschalt + 0 FILEBROWSER_ZOOMINHINT;Miniaturbilder vergrößern\n\nIm Multi-Reitermodus:\nTaste: +\nIm Ein-Reitermodus:\nTaste: Alt + FILEBROWSER_ZOOMOUTHINT;Miniaturbilder verkleinern\n\nIm Multi-Reitermodus:\nTaste: -\nIm Ein-Reitermodus:\nTaste: Alt - @@ -275,6 +282,7 @@ GENERAL_OPEN;Öffnen GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Speichern +GENERAL_SLIDER;Regler GENERAL_UNCHANGED;(Unverändert) GENERAL_WARNING;Warnung GIMP_PLUGIN_INFO;Willkommen zum RawTherapee GIMP-Plugin!\nNach den Änderungen bitte das RawTherapee-Fenster schließen.\nDas Bild wird dann automatisch in GIMP importiert. @@ -492,7 +500,7 @@ HISTORY_MSG_200;(CIECAM02)\nDynamikkompression HISTORY_MSG_201;(Rauschreduzierung)\nDelta-Chrominanz\nRot / Grün HISTORY_MSG_202;(Rauschreduzierung)\nDelta-Chrominanz\nBlau / Gelb -HISTORY_MSG_203;(Rauschreduzierung)\nMethode +HISTORY_MSG_203;(Rauschreduzierung)\nFarbraum HISTORY_MSG_204;(Sensor-Matrix)\nFarbinterpolation\nLMMSE-Verbesserung HISTORY_MSG_205;(CIECAM02)\nBetrachtungsbed.\nHot / Bad-Pixelfilter HISTORY_MSG_206;(CIECAM02) - Szene\nAuto-Luminanz @@ -544,7 +552,7 @@ HISTORY_MSG_253;(Detailebenenkontrast)\nArtefakte reduzieren HISTORY_MSG_254;(Detailebenenkontrast)\nHautfarbton HISTORY_MSG_255;(Rauschreduzierung)\nMedianfilter -HISTORY_MSG_256;(Rauschreduzierung)\nMediantyp +HISTORY_MSG_256;(Rauschreduzierung)\nMedianfilter - Mediantyp HISTORY_MSG_257;(Farbanpassungen) HISTORY_MSG_258;(Farbanpassungen)\nFarbkurve HISTORY_MSG_259;(Farbanpassungen)\nDeckkraftkurve @@ -573,9 +581,9 @@ HISTORY_MSG_282;(Farbanpassungen)\nSättigung schützen\nSchwelle HISTORY_MSG_283;(Farbanpassungen)\nIntensität HISTORY_MSG_284;(Farbanpassungen)\nSättigung schützen\nAutomatisch -HISTORY_MSG_285;(Rauschreduzierung)\nMedianmethode +HISTORY_MSG_285;(Rauschreduzierung)\nMedianfilter - Methode HISTORY_MSG_286;(Rauschreduzierung)\nMediantyp -HISTORY_MSG_287;(Rauschreduzierung)\nMedianiterationen +HISTORY_MSG_287;(Rauschreduzierung)\nMedianfilter - Iterationen HISTORY_MSG_288;(Weißbild)\nKontrolle zu heller Bereiche HISTORY_MSG_289;(Weißbild)\nAuto-Kontrolle zu\nheller Bereiche HISTORY_MSG_290;(Sensor-Matrix)\nSchwarzpunkt - Rot @@ -734,31 +742,15 @@ HISTORY_MSG_443;(Farbmanagement)\nAusgabeprofil\nSchwarzpunkt-Kompensation HISTORY_MSG_444;(Weißabgleich)\nAWB-Temperatur-Korrektur HISTORY_MSG_445;(Sensor-Matrix)\nFarbinterpolation\nUnterbild -HISTORY_MSG_446;EvPixelShiftMotion -HISTORY_MSG_447;EvPixelShiftMotionCorrection -HISTORY_MSG_448;EvPixelShiftStddevFactorGreen HISTORY_MSG_449;(Sensor-Matrix)\nFarbinterpolation\nISO-Anpassung -HISTORY_MSG_450;EvPixelShiftNreadIso -HISTORY_MSG_451;EvPixelShiftPrnu HISTORY_MSG_452;(Sensor-Matrix)\nFarbinterpolation\nBewegungsmaske\nanzeigen HISTORY_MSG_453;(Sensor-Matrix)\nFarbinterpolation\nNur Maske anzeigen -HISTORY_MSG_454;EvPixelShiftAutomatic -HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal -HISTORY_MSG_456;EvPixelShiftNonGreenVertical HISTORY_MSG_457;(Sensor-Matrix)\nFarbinterpolation\nBewegung im Rot/Blau-\nKanal erkennen -HISTORY_MSG_458;EvPixelShiftStddevFactorRed -HISTORY_MSG_459;EvPixelShiftStddevFactorBlue -HISTORY_MSG_460;EvPixelShiftGreenAmaze -HISTORY_MSG_461;EvPixelShiftNonGreenAmaze HISTORY_MSG_462;(Sensor-Matrix)\nFarbinterpolation\nBewegung im Grün-\nKanal erkennen -HISTORY_MSG_463;EvPixelShiftRedBlueWeight HISTORY_MSG_464;(Sensor-Matrix)\nFarbinterpolation\nUnschärfebewegungsmaske HISTORY_MSG_465;(Sensor-Matrix)\nFarbinterpolation\nUnschärferadius -HISTORY_MSG_466;EvPixelShiftSum -HISTORY_MSG_467;EvPixelShiftExp0 HISTORY_MSG_468;(Sensor-Matrix)\nFarbinterpolation\nLücken in der Bewegungs-\nmaske erkennen HISTORY_MSG_469;(Sensor-Matrix)\nFarbinterpolation\nMedian -HISTORY_MSG_470;EvPixelShiftMedian3 HISTORY_MSG_471;(Sensor-Matrix)\nFarbinterpolation\nBewegungskorrektur HISTORY_MSG_472;(Sensor-Matrix)\nFarbinterpolation\nWeicher Übergang HISTORY_MSG_473;(Sensor-Matrix)\nFarbinterpolation\nLMMSE für Bewegungs-\nteile verwenden @@ -776,6 +768,21 @@ HISTORY_MSG_485;(Objektivkorrektur)\nProfil HISTORY_MSG_486;(Objektivkorrektur)\nProfil - Kamera HISTORY_MSG_487;(Objektivkorrektur)\nProfil - Objektiv +HISTORY_MSG_488;(HDR-Dynamikkompression) +HISTORY_MSG_489;(HDR-Dynamikkompression)\nSchwelle +HISTORY_MSG_490;(HDR-Dynamikkompression)\nIntensität +HISTORY_MSG_491;(Weißabgleich) +HISTORY_MSG_492;(RGB-Kurven) +HISTORY_MSG_493;(L*a*b*) +HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbanpassungen)\nL*a*b* - Farbkorrektur +HISTORY_MSG_HISTMATCHING;(Belichtung)\nAuto-Tonwertkurve +HISTORY_MSG_LOCALCONTRAST_AMOUNT;(Lokaler Kontrast)\nIntensität +HISTORY_MSG_LOCALCONTRAST_DARKNESS;(Lokaler Kontrast)\nDunkle Bereiche +HISTORY_MSG_LOCALCONTRAST_ENABLED;(Lokaler Kontrast) +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;(Lokaler Kontrast)\nHelle Bereiche +HISTORY_MSG_LOCALCONTRAST_RADIUS;(Lokaler Kontrast)\nRadius +HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus +HISTORY_MSG_TM_FATTAL_ANCHOR;(HDR-Dynamikkompression)\nHelligkeitsverschiebung HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss @@ -861,6 +868,8 @@ MAIN_MSG_SETPATHFIRST;Um diese Funktion zu nutzen, müssen Sie zuerst in den Einstellungen einen Zielpfad setzen. MAIN_MSG_TOOMANYOPENEDITORS;Zu viele geöffnete Editorfenster.\nUm fortzufahren, schließen sie bitte ein Editorfenster. MAIN_MSG_WRITEFAILED;Fehler beim Schreiben von\n\n"%1"\n\nStellen Sie sicher, dass das Verzeichnis existiert und dass Sie Schreibrechte besitzen. +MAIN_TAB_ADVANCED;Erweitert +MAIN_TAB_ADVANCED_TOOLTIP;Taste: Alt + w MAIN_TAB_COLOR;Farbe MAIN_TAB_COLOR_TOOLTIP;Taste: Alt + c MAIN_TAB_DETAIL;Details @@ -913,8 +922,10 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Breite = %1, Höhe = %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Die Standard-Profile für Nicht-RAW-Bilder wurden nicht gefunden oder nicht festgelegt.\n\nBitte prüfen Sie das Profil-Verzeichnis, es fehlt möglicherweise oder ist beschädigt.\n\nEs werden stattdessen interne Standardwerte verwendet. -OPTIONS_DEFRAW_MISSING;Die Standard-Profile für RAW-Bilder wurden nicht gefunden oder nicht festgelegt.\n\nBitte prüfen Sie das Profil-Verzeichnis, es fehlt möglicherweise oder ist beschädigt.\n\nEs werden stattdessen interne Standardwerte verwendet. +OPTIONS_BUNDLED_MISSING;Das mitgelieferte Profil %1 konnte nicht gefunden werden!\n\nIhre Installation könnte beschädigt sein.\n\nEs werden die internen Standardwerte verwendet. +OPTIONS_DEFIMG_MISSING;Das Standardprofil für Bilddateien wurde nicht gefunden oder ist beschädigt.\n\nBitte überprüfen Sie das Verzeichnis Ihrer Profile.\n\nProfil %1 wird stattdessen verwendet. +OPTIONS_DEFRAW_MISSING;Das Standardprofil für RAW-Dateien wurde nicht gefunden oder ist beschädigt.\n\nBitte überprüfen Sie das Verzeichnis Ihrer Profile.\n\nProfil %1 wird stattdessen verwendet. +PARTIALPASTE_ADVANCEDGROUP;Erweiterte Einstellungen PARTIALPASTE_BASICGROUP;Basisparameter PARTIALPASTE_CACORRECTION;Farbsaum entfernen PARTIALPASTE_CHANNELMIXER;RGB-Kanalmixer @@ -953,6 +964,8 @@ PARTIALPASTE_LABCURVE;L*a*b* - Einstellungen PARTIALPASTE_LENSGROUP;Objektivkorrekturen PARTIALPASTE_LENSPROFILE;Objektivkorrekturprofil +PARTIALPASTE_LOCALCONTRAST;Lokaler Kontrast +PARTIALPASTE_METADATA;Kopiermodus PARTIALPASTE_METAGROUP;Metadaten PARTIALPASTE_PCVIGNETTE;Vignettierungsfilter PARTIALPASTE_PERSPECTIVE;Perspektive @@ -982,6 +995,7 @@ PARTIALPASTE_SHARPENEDGE;Kantenschärfung PARTIALPASTE_SHARPENING;Schärfung PARTIALPASTE_SHARPENMICRO;Mikrokontrast +PARTIALPASTE_TM_FATTAL;HDR-Dynamikkompression PARTIALPASTE_VIBRANCE;Dynamik PARTIALPASTE_VIGNETTING;Vignettierungskorrektur PARTIALPASTE_WAVELETGROUP;Wavelet @@ -1018,6 +1032,12 @@ PREFERENCES_CLUTSCACHE_LABEL;Maximale Anzahl CLUTs im Zwischenspeicher PREFERENCES_CLUTSDIR;HaldCLUT-Verzeichnis PREFERENCES_CMMBPC;Schwarzpunkt-Kompensation +PREFERENCES_CROP;Einstellung des Ausschnittswerkzeuges +PREFERENCES_CROP_AUTO_FIT;Automatischer Zoom des Ausschnitts +PREFERENCES_CROP_GUIDES;Hilfslinien anzeigen wenn Ausschnitt nicht verändert wird +PREFERENCES_CROP_GUIDES_FRAME;Rahmen +PREFERENCES_CROP_GUIDES_FULL;Vorgabe des Ausschnittswerkzeuges +PREFERENCES_CROP_GUIDES_NONE;Keine PREFERENCES_CURVEBBOXPOS;Position der Kurven-Buttons PREFERENCES_CURVEBBOXPOS_ABOVE;Oben PREFERENCES_CURVEBBOXPOS_BELOW;Unten @@ -1035,7 +1055,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Dunkelbild PREFERENCES_DARKFRAMEFOUND;Gefunden PREFERENCES_DARKFRAMESHOTS;Aufnahmen PREFERENCES_DARKFRAMETEMPLATES;Vorlagen @@ -1044,20 +1063,19 @@ PREFERENCES_DAUB_LABEL;Benutze Daubechies D6-Wavelets anstatt D4 PREFERENCES_DAUB_TOOLTIP;Rauschreduzierung und Waveletebenen verwenden ein Debauchies Mutter-Wavelet. Wenn Sie D6 statt D4 wählen, erhöhen Sie die Anzahl der orthogonalen Daubechies-Koeffizienten, was die Qualität bei niedrigen Ebenen verbessern kann. Es gibt keinen Unterschied zwischen D4 und D6 im Speicherverbrauch oder in der Verarbeitungszeit. PREFERENCES_DIRDARKFRAMES;Dunkelbild-Verzeichnis +PREFERENCES_DIRECTORIES;Verzeichnisse PREFERENCES_DIRHOME;Benutzer-Verzeichnis PREFERENCES_DIRLAST;Zuletzt geöffnetes Verzeichnis PREFERENCES_DIROTHER;Anderes PREFERENCES_DIRSELECTDLG;Wähle das Bild-Verzeichnis beim Programmstart... PREFERENCES_DIRSOFTWARE;Installationsverzeichnis -PREFERENCES_EDITORCMDLINE;Befehlszeile +PREFERENCES_EDITORCMDLINE;Benutzerdefinierte Befehlszeile PREFERENCES_EDITORLAYOUT;Editor-Layout PREFERENCES_EXPAUT;Experte PREFERENCES_EXTERNALEDITOR;Externer Editor PREFERENCES_FBROWSEROPTS;Bildinformationen und Miniaturbilder PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Einzeilige Toolbar\n(Bei geringer Bildschirmauflösung deaktivieren) PREFERENCES_FILEFORMAT;Dateiformat -PREFERENCES_FILMSIMULATION;Filmsimulation -PREFERENCES_FLATFIELD;Weißbild PREFERENCES_FLATFIELDFOUND;Gefunden PREFERENCES_FLATFIELDSDIR;Weißbild-Verzeichnis PREFERENCES_FLATFIELDSHOTS;Aufnahmen @@ -1159,7 +1177,7 @@ PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Öffnen eines neuen Bildes mit den Zoom- und Positionswerten\ndes vorangegangenen Bildes.\n\nFunktioniert nur unter folgenden Bedingungen:\nEin-Reitermodus aktiv\n“Demosaikmethode für 100%-Ansicht“ muss auf “Wie im Bild-\nverarbeitungsprofil vorgegeben“ eingestellt sein. PREFERENCES_RGBDTL_LABEL;Maximale Anzahl Threads für Rauschreduzierung PREFERENCES_RGBDTL_TOOLTIP;Die Rauschreduzierung benötigt mindestens 128MB RAM für ein 10 Megapixel-Bild oder 512MB für ein 40 Megapixel-Bild, und zusätzlich 128MB RAM pro Thread. Je mehr Threads parallel ablaufen, desto schneller ist die Berechnung. Bei Einstellung "0" werden so viele Threads wie möglich benutzt. -PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt sichern +PREFERENCES_SAVE_TP_OPEN_NOW;Werkzeugstatus jetzt speichern PREFERENCES_SELECTFONT;Schriftart PREFERENCES_SELECTFONT_COLPICKER;Schriftart für die Farbwähler PREFERENCES_SELECTLANG;Sprache @@ -1238,8 +1256,17 @@ PROGRESSBAR_SAVETIFF;Speichere TIFF... PROGRESSBAR_SNAPSHOT_ADDED;Schnappschuss hinzugefügt PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil wurde in der Dateiverwaltung geändert +QINFO_FRAMECOUNT;%2 Frames +QINFO_HDR;HDR / %2 Frame(s) QINFO_ISO;ISO QINFO_NOEXIF;Keine Exif-Daten vorhanden. +QINFO_PIXELSHIFT;Pixel Shift / %2 Frame(s) +SAMPLEFORMAT_0;Unbekanntes Format +SAMPLEFORMAT_1;Ohne Vorzeichen 8 Bits +SAMPLEFORMAT_2;Ohne Vorzeichen 16 Bits +SAMPLEFORMAT_4;LogLuv 24 Bits +SAMPLEFORMAT_8;LogLuv 32 Bits +SAMPLEFORMAT_16;32 Bits Fließkomma SAVEDLG_AUTOSUFFIX;Suffix anfügen, wenn die Datei bereits existiert SAVEDLG_FILEFORMAT;Dateiformat SAVEDLG_FORCEFORMATOPTS;Erzwinge Speicheroptionen @@ -1258,8 +1285,8 @@ SAVEDLG_TIFFUNCOMPRESSED;Unkomprimiertes TIFF SAVEDLG_WARNFILENAME;Die Datei wird gespeichert als SHCSELECTOR_TOOLTIP;Um die 3 Regler zurückzusetzen, rechte Maustaste klicken. -SOFTPROOF_GAMUTCHECK_TOOLTIP;Wenn eingeschaltet, werden die Pixel, die\naußerhalb des Gamut-Farbbereichs liegen,\nin Grau angezeigt. -SOFTPROOF_TOOLTIP;Soft-Proofing:\n\nWenn eingeschaltet, wird das Rendern mit dem\nAusgabefarbprofil simuliert.\nVorzugsweise für die Simulation der Druckausgabe. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Markiert Pixel deren Farbe außerhalb des Farbumfangs liegen in Abhängigkeit des:\n- Druckerprofils, wenn eines eingestellt und Soft-Proofing aktiviert ist.\n- Ausgabeprofils, wenn ein Druckerprofil nicht eingestellt und Soft-Proofing aktiviert ist.\n- Monitorprofils, wenn Soft-Proofing deaktiviert ist. +SOFTPROOF_TOOLTIP;Soft-Proofing simuliert das Aussehen des Bildes:\n- für den Druck, wenn ein Druckerprofil unter Einstellungen > Farbmanagement eingestellt ist.\n- wenn es auf einem Bildschirm dargestellt wird, der das aktuelle Ausgabeprofil verwendet und kein Druckerprofil eingestellt ist. THRESHOLDSELECTOR_B;Unten THRESHOLDSELECTOR_BL;Unten-Links THRESHOLDSELECTOR_BR;Unten-Rechts @@ -1438,6 +1465,8 @@ TP_COLORTONING_HUE;Farbton TP_COLORTONING_LAB;L*a*b*-Überlagerung TP_COLORTONING_LABEL;Farbanpassungen +TP_COLORTONING_LABGRID;L*a*b* - Farbkorrektur +TP_COLORTONING_LABGRID_VALUES;HL: a=%1, b=%2\nS: a=%3, b=%4 TP_COLORTONING_LUMA;Luminanz TP_COLORTONING_LUMAMODE;Luminanz schützen TP_COLORTONING_LUMAMODE_TOOLTIP;Wenn aktiviert, wird die Luminanz der Farben Rot, Grün, Cyan, Blau... geschützt. @@ -1486,68 +1515,64 @@ TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwelle -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 weich -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 weich -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Nur Farbe -TP_DIRPYRDENOISE_AUT;Automatisch Global -TP_DIRPYRDENOISE_AUTO;Automatisch Global -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Bewertung des Farbrauschens.\nDie Bewertung ist ungenau und sehr subjektiv! -TP_DIRPYRDENOISE_BLUE;Delta-Chrominanz Blau / Gelb -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. -TP_DIRPYRDENOISE_CCCURVE;Chrominanzkurve -TP_DIRPYRDENOISE_CHROMA;Chrominanz (Master) -TP_DIRPYRDENOISE_CHROMAFR;Chrominanz -TP_DIRPYRDENOISE_CTYPE;Methode -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nAbhängig von der Bildgröße, wird das Bild in ca. 10 bis 70\nKacheln aufgeteilt. Für jede Kachel wird die Chrominanz-\nRauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. -TP_DIRPYRDENOISE_CUR;Kurve -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Farbe -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Erhöht den Wert aller Chrominanz-Regler und\nregelt die Chrominanz-Rauschreduzierung als\nFunktion der Chromatizität. Die Intensität kann über\nKontrollpunkte für schwach bis intensiv gesättigte\nFarben unterschiedlich eingestellt werden. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduliert die Wirkung der Luminanz-Rauschreduzierung +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto-Multizonen +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisch Global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Bewertung des Farbrauschens.\nDie Bewertung ist ungenau und sehr subjektiv! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Delta-Chrominanz Blau / Gelb +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominanzkurve +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Erhöht / Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominanz +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Benutzerdefiniert +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominanz (Master) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Methode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Benutzerdefiniert:\nManuelle Anpassung der Chrominanz-Rauschreduzierung.\n\nAutomatisch Global:\nEs werden 9 Zonen für die Berechnung der Chrominanz-\nRauschreduzierung verwendet.\n\nAuto-Multizonen:\nKeine Voransicht - wird erst beim Speichern angewendet.\nAbhängig von der Bildgröße, wird das Bild in ca. 10 bis 70\nKacheln aufgeteilt. Für jede Kachel wird die Chrominanz-\nRauschreduzierung individuell berechnet.\n\nVorschau:\nNur der sichbare Teil des Bildes wird für die Berechnung\nder Chrominanz-Rauschreduzierung verwendet. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Vorschau +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Vorschau +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs\nin der 100%-Ansicht an.\n\n<50: Sehr wenig Rauschen\n50 - 100: Wenig Rauschen\n100 - 300: Durchschnittliches Rauschen\n>300: Hohes Rauschen\n\nDie Werte unterscheiden sich im L*a*b*- und RGB-Modus.\nDie RGB-Werte sind ungenauer, da der RGB-Modus\nLuminanz und Chrominanz nicht komplett trennt. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Vorschaugröße = %1, Zentrum: Px = %2 Py = %2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Rauschen: Mittelwert = %1 Hoch = %2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Rauschen: Mittelwert = --- Hoch = --- +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Kachelgröße = %1 Zentrum: Tx = %2 Ty = %2 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Delta-Chrominanz Rot / Grün TP_DIRPYRDENOISE_ENH;Erweiterter Modus TP_DIRPYRDENOISE_ENH_TOOLTIP;Erhöht die Qualität der Rauschreduzierung auf Kosten einer um 20% erhöhten Verarbeitungszeit. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Mit Gamma kann die Intensität der\nRauschreduzierung über den Farbbereich\nvariiert werden. Bei kleinen Werten sind\nnur dunkle Farbtöne betroffen, bei\ngrößeren Werten wird der Effekt auf\nhellere Töne ausgeweitet. -TP_DIRPYRDENOISE_LAB;L*a*b* TP_DIRPYRDENOISE_LABEL;Rauschreduzierung -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminanzkurve -TP_DIRPYRDENOISE_LDETAIL;Luminanzdetails -TP_DIRPYRDENOISE_LM;Nur Luminanz -TP_DIRPYRDENOISE_LPLABM;Gewichtet L* (wenig) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Luminanzkontrolle -TP_DIRPYRDENOISE_LUMA;Luminanz -TP_DIRPYRDENOISE_LUMAFR;Luminanz -TP_DIRPYRDENOISE_MAN;Benutzerdefiniert -TP_DIRPYRDENOISE_MANU;Benutzerdefiniert -TP_DIRPYRDENOISE_MED;Medianfilter -TP_DIRPYRDENOISE_MEDMETHOD;Medianmethode -TP_DIRPYRDENOISE_MEDTYPE;Mediantyp -TP_DIRPYRDENOISE_METHOD;Methode -TP_DIRPYRDENOISE_METHOD11;Qualität -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Einstellung der Qualität der Rauschreduzierung.\nDie Einstellung “Hoch“ verbessert die Rausch-\nreduzierung auf Kosten der Verarbeitungszeit. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Für RAW-Bilder kann entweder die RGB-\noder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der\nAuswahl immer die L*a*b*-Methode verwendet. -TP_DIRPYRDENOISE_METM_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. -TP_DIRPYRDENOISE_MET_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe größer das Fenster, umso länger dauert die Verarbeitungszeit.\n\n3×3 weich: Nutzt 5 Pixel in einem 3×3-Pixelfenster.\n3×3: Nutzt 9 Pixel in einem 3×3-Pixelfenster.\n5×5 weich: Nutzt 13 Pixel in einem 5×5-Pixelfenster.\n5×5: Nutzt 25 Pixel in einem 5×5-Pixelfenster.\n7×7: Nutzt 49 Pixel in einem 7×7-Pixelfenster.\n9×9: Nutzt 81 Pixel in einem 9×9-Pixelfenster.\n\nManchmal ist das Ergebnis mit einem kleineren Fenster und mehreren Iterationen besser, als mit einem größeren und nur einer Iteration. -TP_DIRPYRDENOISE_NOISELABEL;Rauschen: Mittelwert = %1 Hoch = %2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Rauschen: Mittelwert = --- Hoch = --- -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Zeigt das Restrauschen des sichtbaren Bildbereichs\nin der 100%-Ansicht an.\n\n<50: Sehr wenig Rauschen\n50 - 100: Wenig Rauschen\n100 - 300: Durchschnittliches Rauschen\n>300: Hohes Rauschen\n\nDie Werte unterscheiden sich im L*a*b*- und RGB-Modus.\nDie RGB-Werte sind ungenauer, da der RGB-Modus\nLuminanz und Chrominanz nicht komplett trennt. -TP_DIRPYRDENOISE_PASSES;Medianiterationen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. -TP_DIRPYRDENOISE_PON;Auto-Multizonen -TP_DIRPYRDENOISE_PRE;Vorschau -TP_DIRPYRDENOISE_PREV;Vorschau -TP_DIRPYRDENOISE_PREVLABEL;Vorschaugröße = %1, Zentrum: Px = %2 Py = %2 -TP_DIRPYRDENOISE_RED;Delta-Chrominanz Rot / Grün -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Hoch +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanzkontrolle +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminanzdetails +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminanz +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanz +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Farbraum +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Rauschreduzierung +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Für RAW-Bilder kann entweder die RGB-\noder L*a*b*-Methode verwendet werden.\n\nFür andere Bilder wird unabhängig von der\nAuswahl immer die L*a*b*-Methode verwendet. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Mit Gamma kann die Intensität der\nRauschreduzierung über den Farbbereich\nvariiert werden. Bei kleinen Werten sind\nnur dunkle Farbtöne betroffen, bei\ngrößeren Werten wird der Effekt auf\nhellere Töne ausgeweitet. +TP_DIRPYRDENOISE_MAIN_MODE;Qualität +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoch +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Einstellung der Qualität der Rauschreduzierung.\nDie Einstellung “Hoch“ verbessert die Rausch-\nreduzierung auf Kosten der Verarbeitungszeit. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Nur Farbe +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Medianfilter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Nur Luminanz +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Bei der Methode “Nur Luminanz“ und “L*a*b*“,\nwird der Medianfilter nach den Waveletschritten\nverarbeitet.\nBei RGB wird der Medianfilter am Ende der\nRauschreduzierung verarbeitet. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewichtet L* (wenig) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iterationen +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Manchmal führt ein kleines 3×3-Fenster mit\nmehreren Iterationen zu besseren Ergebnissen\nals ein 7×7-Fenster mit nur einer Iteration. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Mediantyp +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Einen Medianfilter mit der gewünschten Fenstergröße auswählen.\nJe größer das Fenster, umso länger dauert die Verarbeitungszeit.\n\n3×3 weich: Nutzt 5 Pixel in einem 3×3-Pixelfenster.\n3×3: Nutzt 9 Pixel in einem 3×3-Pixelfenster.\n5×5 weich: Nutzt 13 Pixel in einem 5×5-Pixelfenster.\n5×5: Nutzt 25 Pixel in einem 5×5-Pixelfenster.\n7×7: Nutzt 49 Pixel in einem 7×7-Pixelfenster.\n9×9: Nutzt 81 Pixel in einem 9×9-Pixelfenster.\n\nManchmal ist das Ergebnis mit einem kleineren Fenster und mehreren Iterationen besser, als mit einem größeren und nur einer Iteration. TP_DIRPYRDENOISE_SLI;Regler -TP_DIRPYRDENOISE_TILELABEL;Kachelgröße = %1 Zentrum: Tx = %2 Ty = %2 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 weich +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 weich +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Hautfarbtonbereich TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fein: Ist näher an den Hautfarbtönen und minimiert den Einfluss auf andere Farben.\n\nGrob: Minimiert Artefakte. TP_DIRPYREQUALIZER_ARTIF;Artefakte reduzieren @@ -1587,6 +1612,8 @@ TP_EXPOSURE_CURVEEDITOR2;Tonwertkurve 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Um mit den doppelten Tonwert-Kurven die besten Ergenisse zu erzielen, lesen Sie bitte den Abschnitt im Handbuch unter:\nDer Werkzeugkasten > Reiter Belichtung > Belichtungsbereich > Tonwertkurve. TP_EXPOSURE_EXPCOMP;Belichtungskorrektur +TP_EXPOSURE_HISTMATCHING;Auto-Tonwertkurve +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Passt Regler und Kurven (mit Ausnahme der Belichtungskorrektur)\nautomatisch an, um das eingebettete JPEG-Bild zu simulieren. TP_EXPOSURE_LABEL;Belichtung TP_EXPOSURE_SATURATION;Sättigung TP_EXPOSURE_TCMODE_FILMLIKE;Filmähnlich @@ -1723,6 +1750,15 @@ TP_LENSPROFILE_USECA;CA korrigieren TP_LENSPROFILE_USEDIST;Verzeichnung korrigieren TP_LENSPROFILE_USEVIGN;Vignettierung korrigieren +TP_LOCALCONTRAST_AMOUNT;Intensität +TP_LOCALCONTRAST_DARKNESS;Dunkle Bereiche +TP_LOCALCONTRAST_LABEL;Lokaler Kontrast +TP_LOCALCONTRAST_LIGHTNESS;Helle Bereiche +TP_LOCALCONTRAST_RADIUS;Radius +TP_METADATA_EDIT;Veränderte Daten +TP_METADATA_MODE;Kopiermodus +TP_METADATA_STRIP;Keine +TP_METADATA_TUNNEL;Unveränderte Daten TP_NEUTRAL;Zurücksetzen TP_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen TP_PCVIGNETTE_FEATHER;Bereich @@ -1822,6 +1858,8 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical TP_RAW_PIXELSHIFTNREADISO;nRead +TP_RAW_PIXELSHIFTONEGREEN;Benutze ein Grün +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Benutze ein Grün anstelle des\nDurchschnitts beider Grüns für\nBereiche ohne Bewegung. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight TP_RAW_PIXELSHIFTSHOWMOTION;Bewegungsmaske anzeigen @@ -1835,6 +1873,7 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Sensor mit Bayer-Matrix TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Mit “3-Pass“ erzielt man die besten Ergebnisse\n(empfohlen bei Bildern mit niedrigen ISO-Werten).\n\nBei hohen ISO-Werten unterscheidet sich “1-Pass“\nkaum gegenüber “3-Pass“, ist aber deutlich schneller. TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix @@ -1975,6 +2014,10 @@ TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;3×3-Matrix statt 5×5-Matrix TP_SHARPENMICRO_UNIFORMITY;Gleichmäßigkeit +TP_TM_FATTAL_AMOUNT;Intensität +TP_TM_FATTAL_ANCHOR;Helligkeitsverschiebung +TP_TM_FATTAL_LABEL;HDR-Dynamikkompression +TP_TM_FATTAL_THRESHOLD;Schwelle TP_VIBRANCE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hautfarbtöne @@ -2213,8 +2256,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Neues Detailfenster öffnen ZOOMPANEL_ZOOM100;Zoom 100%\nTaste: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen\nTaste: Alt + f -ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Ausschnitt an Bildschirm anpassen\nTaste: f +ZOOMPANEL_ZOOMFITSCREEN;An Bildschirm anpassen\nTaste: Alt + f ZOOMPANEL_ZOOMIN;Hineinzoomen\nTaste: + ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/English (UK)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/English (UK)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/English (UK)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/English (UK)" 2018-03-20 11:04:15.000000000 +0000 @@ -13,6 +13,7 @@ HISTORY_MSG_191;CAM02 - Colourfulness (M) HISTORY_MSG_197;CAM02 - Colour curve HISTORY_MSG_198;CAM02 - Colour curve +HISTORY_MSG_203;NR - Colour space HISTORY_MSG_221;B&W - Colour filter HISTORY_MSG_240;GF - Centre HISTORY_MSG_245;VC - Centre @@ -21,6 +22,7 @@ HISTORY_MSG_322;W - Gamut - Avoid colour shift HISTORY_MSG_385;W - Residual - Colour Balance HISTORY_MSG_419;Retinex - Colour space +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Colour correction MAIN_TAB_COLOR;Colour MAIN_TOOLTIP_BACKCOLOR0;Background colour of the preview: Theme-based\nShortcut: 9 MAIN_TOOLTIP_BACKCOLOR1;Background colour of the preview: Black\nShortcut: 9 @@ -42,7 +44,8 @@ PREFERENCES_PRTPROFILE;Colour profile PREFERENCES_SELECTFONT_COLPICKER;Select Colour Picker's font PREFERENCES_TAB_COLORMGR;Colour Management -SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colours from the output profile. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colours with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Colour Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. TOOLBAR_TOOLTIP_COLORPICKER;Lockable Colour Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a colour picker\nDrag it around while pressing the left mouse button\nDelete the colour picker with a right mouse button click\nDelete all colour pickers with Shift + Right mouse button click\nRight click away from any colour picker to go back to the Hand tool TOOLBAR_TOOLTIP_STRAIGHTEN;Straighten / fine rotation.\nShortcut: s\n\nIndicate the vertical or horizontal by drawing a guide line over the image preview. Angle of rotation will be shown next to the guide line. Centre of rotation is the geometrical centre of the image. TP_BWMIX_CC_ENABLED;Adjust complementary colour @@ -63,15 +66,17 @@ TP_COLORAPP_TCMODE_COLORF;Colourfulness TP_COLORTONING_COLOR;Colour TP_COLORTONING_LABEL;Colour Toning +TP_COLORTONING_LABGRID;L*a*b* colour correction grid TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change colour (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated colour blending.\n"Colour balance (Shadows/Midtones/Highlights)" and "Saturation 2 colours" use direct colours.\n\nThe Black-and-White tool can be enabled when using any colour toning method, which allows for colour toning. TP_COLORTONING_SPLITCOCO;Colour Balance Shadows/Midtones/Highlights TP_COLORTONING_SPLITLR;Saturation 2 colours TP_COLORTONING_TWO2;Special chroma '2 colours' TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colours:\nMore predictable. -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Centre: Px=%2 Py=%3 -TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and centre to the preview size and centre you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Centre: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Colour space TP_DIRPYREQUALIZER_ALGO;Skin Colour Range TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colours of the skin, minimizing the action on other colours\nLarge: avoid more artifacts. TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colours (hue, chroma, luma) and the rest of the image. @@ -114,7 +119,9 @@ !ABOUT_TAB_SPLASH;Splash !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -176,6 +183,7 @@ !EXIFPANEL_RESETALL;Reset All !EXIFPANEL_RESETALLHINT;Reset all tags to their original values. !EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +!EXIFPANEL_SHOWALL;Show all !EXIFPANEL_SUBDIRECTORY;Subdirectory !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All @@ -297,12 +305,7 @@ !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -!FILEBROWSER_STARTPROCESSING;Start processing -!FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -!FILEBROWSER_STOPPROCESSING;Stop processing -!FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s !FILEBROWSER_THUMBSIZE;Thumbnail size -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. !FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -333,6 +336,7 @@ !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -513,7 +517,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -540,7 +544,6 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -589,7 +592,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_259;CT - Opacity curve !HISTORY_MSG_260;CT - a*[b*] opacity !HISTORY_MSG_261;CT - Method @@ -628,7 +631,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -800,6 +803,20 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -885,6 +902,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL;Detail !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d @@ -902,8 +921,6 @@ !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM;Transform !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool. !MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l !MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: < @@ -932,8 +949,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_BASICGROUP;Basic Settings !PARTIALPASTE_CACORRECTION;Chromatic aberration correction !PARTIALPASTE_CHANNELMIXER;Channel mixer @@ -969,7 +988,9 @@ !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -988,7 +1009,7 @@ !PARTIALPASTE_RAW_DMETHOD;Demosaic method !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RESIZE;Resize !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves @@ -997,9 +1018,9 @@ !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;Add !PREFERENCES_APPLNEXTSTARTUP;restart required @@ -1031,6 +1052,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1047,7 +1074,6 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates @@ -1056,20 +1082,19 @@ !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories !PREFERENCES_DIRHOME;Home directory !PREFERENCES_DIRLAST;Last visited directory !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_EDITORCMDLINE;Other command line +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor !PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) !PREFERENCES_FILEFORMAT;File format -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1241,13 +1266,21 @@ !PROGRESSBAR_SAVETIFF;Saving TIFF file... !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) !QINFO_ISO;ISO !QINFO_NOEXIF;Exif data not available. +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FILEFORMAT;File format !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_JPEGQUAL;JPEG quality -!SAVEDLG_PNGCOMPR;PNG compression !SAVEDLG_PUTTOQUEUE;Put into processing queue !SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue !SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue @@ -1261,7 +1294,6 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1403,14 +1435,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1420,6 +1452,7 @@ !TP_COLORTONING_HIGHLIGHT;Highlights !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_METHOD;Method @@ -1462,65 +1495,59 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DIRPYREQUALIZER_HUESKIN;Skin hue !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. @@ -1556,6 +1583,8 @@ !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. !TP_EXPOSURE_EXPCOMP;Exposure compensation +!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_EXPOSURE_LABEL;Exposure !TP_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like @@ -1679,6 +1708,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1727,7 +1765,7 @@ !TP_RAW_DMETHOD;Method !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1735,7 +1773,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1775,6 +1813,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1788,6 +1828,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1927,6 +1968,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple @@ -2156,7 +2201,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/English (US)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/English (US)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/English (US)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/English (US)" 2018-03-20 11:04:15.000000000 +0000 @@ -10,7 +10,9 @@ !ABOUT_TAB_SPLASH;Splash !ADJUSTER_RESET_TO_DEFAULT;Reset to default !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -72,6 +74,7 @@ !EXIFPANEL_RESETALL;Reset All !EXIFPANEL_RESETALLHINT;Reset all tags to their original values. !EXIFPANEL_RESETHINT;Reset the selected tags to their original values. +!EXIFPANEL_SHOWALL;Show all !EXIFPANEL_SUBDIRECTORY;Subdirectory !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All @@ -197,12 +200,7 @@ !FILEBROWSER_SHOWTRASHHINT;Show contents of trash.\nShortcut: Ctrl-t !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_SHOWUNRANKHINT;Show unranked images.\nShortcut: 0 -!FILEBROWSER_STARTPROCESSING;Start processing -!FILEBROWSER_STARTPROCESSINGHINT;Start processing the images in the queue.\n\nShortcut: Ctrl+s -!FILEBROWSER_STOPPROCESSING;Stop processing -!FILEBROWSER_STOPPROCESSINGHINT;Stop processing the images in the queue.\n\nShortcut: Ctrl+s !FILEBROWSER_THUMBSIZE;Thumbnail size -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n+ - Multiple Editor Tabs Mode,\nAlt-+ - Single Editor Tab Mode. !FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n- - Multiple Editor Tabs Mode,\nAlt-- - Single Editor Tab Mode. @@ -234,6 +232,7 @@ !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait !GENERAL_SAVE;Save +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -421,7 +420,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -451,7 +450,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -503,7 +502,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -544,7 +543,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -719,6 +718,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot @@ -804,6 +818,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR;Color !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL;Detail @@ -822,8 +838,6 @@ !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM;Transform !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -856,8 +870,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_BASICGROUP;Basic Settings !PARTIALPASTE_CACORRECTION;Chromatic aberration correction !PARTIALPASTE_CHANNELMIXER;Channel mixer @@ -896,7 +912,9 @@ !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -916,7 +934,7 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RESIZE;Resize !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves @@ -925,9 +943,9 @@ !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;Add !PREFERENCES_APPLNEXTSTARTUP;restart required @@ -961,6 +979,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -978,7 +1002,6 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates @@ -987,20 +1010,19 @@ !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories !PREFERENCES_DIRHOME;Home directory !PREFERENCES_DIRLAST;Last visited directory !PREFERENCES_DIROTHER;Other !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory -!PREFERENCES_EDITORCMDLINE;Other command line +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_EXTERNALEDITOR;External Editor !PREFERENCES_FBROWSEROPTS;File Browser / Thumbnail Options !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) !PREFERENCES_FILEFORMAT;File format -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1181,13 +1203,21 @@ !PROGRESSBAR_SAVETIFF;Saving TIFF file... !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) !QINFO_ISO;ISO !QINFO_NOEXIF;Exif data not available. +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FILEFORMAT;File format !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_JPEGQUAL;JPEG quality -!SAVEDLG_PNGCOMPR;PNG compression !SAVEDLG_PUTTOQUEUE;Put into processing queue !SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue !SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue @@ -1201,8 +1231,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1362,14 +1392,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1381,6 +1411,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1429,68 +1461,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1530,6 +1557,8 @@ !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. !TP_EXPOSURE_EXPCOMP;Exposure compensation +!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_EXPOSURE_LABEL;Exposure !TP_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like @@ -1666,6 +1695,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1716,7 +1754,7 @@ !TP_RAW_DMETHOD;Method !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1725,7 +1763,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1765,6 +1803,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1778,6 +1818,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1918,6 +1959,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2156,7 +2201,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Espanol rawtherapee-5.4/rtdata/languages/Espanol --- rawtherapee-5.3/rtdata/languages/Espanol 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Espanol 2018-03-20 11:04:15.000000000 +0000 @@ -68,6 +68,7 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Restablece los valores predeterminados BATCHQUEUE_AUTOSTART;Inicio automático +BATCHQUEUE_AUTOSTARTHINT;Iniciar automáticamente el procesamiento en cuanto llega un nuevo trabajo BATCHQUEUE_DESTFILENAME;Ruta y nombre del archivo BATCH_PROCESSING;Proceso por lotes CURVEEDITOR_CURVE;Curva @@ -230,12 +231,7 @@ FILEBROWSER_SHOWTRASHHINT;Mostrar el contenido de la papelera.\nAtajo: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostrar imágenes sin etiqueta de color.\nAtajo: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostrar imágenes sin rango.\nAtajo: 0 -FILEBROWSER_STARTPROCESSING;Iniciar procesamiento -FILEBROWSER_STARTPROCESSINGHINT;Iniciar el procesamiento de imágenes en la cola -FILEBROWSER_STOPPROCESSING;Parar procesamiento -FILEBROWSER_STOPPROCESSINGHINT;Parar el procesamiento de imágenes en la cola FILEBROWSER_THUMBSIZE;Tamaño miniatura -FILEBROWSER_TOOLTIP_STOPPROCESSING;Iniciar automáticamente el procesamiento en cuanto llega un nuevo trabajo FILEBROWSER_UNRANK_TOOLTIP;Sin Rango\nAtajoShift - 0 FILEBROWSER_ZOOMINHINT;Agrandar miniatura.\nAtajo: +\n\nAtajo en modo editor simple: Alt-+ FILEBROWSER_ZOOMOUTHINT;Reducir miniatura.\nAtajo: -\n\nAtajo en modo editor simple: Alt-- @@ -442,7 +438,6 @@ HISTORY_MSG_170;Vib - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Restringe 'LC' -HISTORY_MSG_173;RR - Detalle en luminancia HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptación CAT02 HISTORY_MSG_176;CAM02 - Entorno de visualización @@ -472,7 +467,6 @@ HISTORY_MSG_200;CAMO2 - Mapeo tonal HISTORY_MSG_201;RR - Crominancia Ro,Ve HISTORY_MSG_202;RR - Crominancia Az,Am -HISTORY_MSG_203;RR - Método HISTORY_MSG_204;Pasos de mejora LMMSE HISTORY_MSG_205;CAM02 - Píxel caliente/muerto HISTORY_MSG_206;CAT02 - Luz de escena auto. @@ -524,7 +518,6 @@ HISTORY_MSG_253;CbDL - Reducir elementos extraños HISTORY_MSG_254;CbDL - Matiz de piel HISTORY_MSG_255;RR - Filtro Median -HISTORY_MSG_256;RR - Tipo Median HISTORY_MSG_257;Tonificación de Color HISTORY_MSG_258;TC - Color HISTORY_MSG_259;TC - Opacidad @@ -565,7 +558,6 @@ HISTORY_MSG_294;Simulación de Fílmico - Intensidad HISTORY_MSG_295;Simulación de Fílmico - Filme HISTORY_MSG_296;RR - Modular luminancia -HISTORY_MSG_297;RR - Calidad HISTORY_MSG_298;Filtro Pixel Muerto HISTORY_NEWSNAPSHOT;Agregar HISTORY_NEWSNAPSHOT_TOOLTIP;Atajo: Alt-s @@ -662,8 +654,6 @@ NAVIGATOR_NA; -- NAVIGATOR_XY_FULL;Ancho = %1, Alto = %2 NAVIGATOR_XY_NA;x = n/a, y = n/a -OPTIONS_DEFIMG_MISSING;El perfil predeterminado para fotos no raw no se pudo encontrar o no está establecido.\n\nPor favor verifique su folder de perfiles, puede estar dañado o no existir.\n\nSe usarán valores predeterminados internos. -OPTIONS_DEFRAW_MISSING;El perfil predeterminado para fotos raw no se pudo encontrar o no está establecido.\n\nPor favor verifique su folder de perfiles, puede estar dañado o no existir.\n\nSe usarán valores predeterminados internos. PARTIALPASTE_BASICGROUP;Ajustes básicos PARTIALPASTE_CACORRECTION;Corrección de aberraciones cromáticas PARTIALPASTE_CHANNELMIXER;Mezclador de canales @@ -759,7 +749,6 @@ PREFERENCES_D55;5500ºK PREFERENCES_D60;6000ºK PREFERENCES_D65;6500ºK -PREFERENCES_DARKFRAME;Toma Negra PREFERENCES_DARKFRAMEFOUND;Encontrado PREFERENCES_DARKFRAMESHOTS;disparos PREFERENCES_DARKFRAMETEMPLATES;plantillas @@ -771,14 +760,11 @@ PREFERENCES_DIROTHER;Otro PREFERENCES_DIRSELECTDLG;Seleccionar carpeta de imágenes en el arranque... PREFERENCES_DIRSOFTWARE;Carpeta de instalación -PREFERENCES_EDITORCMDLINE;Otra línea de comando PREFERENCES_EDITORLAYOUT;Disposición del editor PREFERENCES_EXTERNALEDITOR;Editor externo PREFERENCES_FBROWSEROPTS;Opciones del explorador de archivos/Miniaturas PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barra de herramientas del explorador en una sola fila (deseleccionar para pantallas de baja resolución) PREFERENCES_FILEFORMAT;Formato de archivo -PREFERENCES_FILMSIMULATION;Simulación de Fílmico -PREFERENCES_FLATFIELD;Campo plano PREFERENCES_FLATFIELDFOUND;Encontrado PREFERENCES_FLATFIELDSDIR;Carpeta de archivos de campo plano PREFERENCES_FLATFIELDSHOTS;disparos @@ -1130,33 +1116,32 @@ TP_DEFRINGE_LABEL;Quitar borde púrpura TP_DEFRINGE_RADIUS;Radio TP_DEFRINGE_THRESHOLD;Umbral -TP_DIRPYRDENOISE_BLUE;Crominancia: Azul-Amarillo -TP_DIRPYRDENOISE_CHROMA;Crominancia: Maestra -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modula la acción de eliminación de ruido 'de luminancia' +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominancia: Azul-Amarillo +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominancia: Maestra +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominancia: Rojo-Verde TP_DIRPYRDENOISE_ENH;Modo mejorado TP_DIRPYRDENOISE_ENH_TOOLTIP;Incrementa la calidad de la Reducción de Ruido a costa de un incremento de 20% en el tiempo de procesamiento -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma hace variar la fuerza de reducción del ruido a lo largo del rango tonal.\n\n Valores pequeños dirigen la reducción hacia las sombras, mientras que valores grandes extienden el efecto hasta los tonos brillantes -TP_DIRPYRDENOISE_LABEL;Reducción de ruido -TP_DIRPYRDENOISE_LABM;Lab -TP_DIRPYRDENOISE_LCURVE;Curva de Luminancia -TP_DIRPYRDENOISE_LDETAIL;Detalle en luminancia -TP_DIRPYRDENOISE_LM;Sólo luminancia -TP_DIRPYRDENOISE_LUMA;Luminancia -TP_DIRPYRDENOISE_MED;Median -TP_DIRPYRDENOISE_MEDMETHOD;Método Median -TP_DIRPYRDENOISE_MEDTYPE;Tipo Median -TP_DIRPYRDENOISE_METHOD;Método -TP_DIRPYRDENOISE_METHOD11;Calidad -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La Calidad puede ser adaptada a un patrón de ruido. Al seleccionar "Alto" se incrementa el efecto de reducción de ruido a costa de prolongar el tiempo de procesamiento. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Para imágenes raw puede usar tanto el método RGB como el Lab.\n\nPara imágenes no raw el método Lab será usado de todas maneras, ignorando el método seleccionado. -TP_DIRPYRDENOISE_METM_TOOLTIP;Cuando se utiliza "Sólo Luminancia" y los métodos "Lab", el filtro Median será aplicado inmediatamente después de cada proceso de toda la cadena de reducción de ruido.\nCuando se utiliza el modo "RGB", el filtro Median se aplicará al final de toda la cadena de procesos de reducción de ruido. -TP_DIRPYRDENOISE_PASSES;Iteracciones Median -TP_DIRPYRDENOISE_RED;Crominancia: Rojo-Verde -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Estándar -TP_DIRPYRDENOISE_SHALBI;Alto +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Curva de Luminancia +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detalle en luminancia +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Método +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Reducción de ruido +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Para imágenes raw puede usar tanto el método RGB como el Lab.\n\nPara imágenes no raw el método Lab será usado de todas maneras, ignorando el método seleccionado. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma hace variar la fuerza de reducción del ruido a lo largo del rango tonal.\n\n Valores pequeños dirigen la reducción hacia las sombras, mientras que valores grandes extienden el efecto hasta los tonos brillantes +TP_DIRPYRDENOISE_MAIN_MODE;Calidad +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Alto +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Estándar +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;La Calidad puede ser adaptada a un patrón de ruido. Al seleccionar "Alto" se incrementa el efecto de reducción de ruido a costa de prolongar el tiempo de procesamiento. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Método Median +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;Lab +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Sólo luminancia +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Cuando se utiliza "Sólo Luminancia" y los métodos "Lab", el filtro Median será aplicado inmediatamente después de cada proceso de toda la cadena de reducción de ruido.\nCuando se utiliza el modo "RGB", el filtro Median se aplicará al final de toda la cadena de procesos de reducción de ruido. +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iteracciones Median +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo Median TP_DIRPYREQUALIZER_ALGO;Rango de Color de Piel TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fino: cercano a los colores de la piel, minimizando la acción en otros colores\nAmplio: evita más elementos extraños. TP_DIRPYREQUALIZER_HUESKIN;Matiz de la piel @@ -1492,7 +1477,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Abrir (nueva) ventana de detalle ZOOMPANEL_ZOOM100;Zoom al 100%\nAtajo: z -ZOOMPANEL_ZOOMFITSCREEN;Ajustar a pantalla\nAtajo: f +ZOOMPANEL_ZOOMFITSCREEN;Ajustar a pantalla\nAtajo: Alt-f ZOOMPANEL_ZOOMIN;Aumentar Zoom\nAtajo: + ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - @@ -1500,6 +1485,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1515,6 +1501,7 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1535,8 +1522,13 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1710,6 +1702,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1740,9 +1747,9 @@ !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !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. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: @@ -1754,14 +1761,20 @@ !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_GRADIENT;Graduated filter +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1773,6 +1786,12 @@ !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1781,6 +1800,8 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. @@ -1841,9 +1862,18 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White @@ -1852,51 +1882,52 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !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? @@ -1912,6 +1943,15 @@ !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. !TP_LABCURVE_CURVEEDITOR_CC;CC +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1928,7 +1968,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1965,6 +2005,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1978,6 +2020,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* @@ -2059,6 +2102,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2224,4 +2271,4 @@ !TP_WAVELET_TON;Toning !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru rawtherapee-5.3/rtdata/languages/Euskara rawtherapee-5.4/rtdata/languages/Euskara --- rawtherapee-5.3/rtdata/languages/Euskara 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Euskara 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Besterik PREFERENCES_DIRSELECTDLG;Abioko irudien karpeta hautatu... PREFERENCES_DIRSOFTWARE;Inatalazio karpeta -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Arakatzailearen aukerak PREFERENCES_FILEFORMAT;Artxiboen formatua @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Francais rawtherapee-5.4/rtdata/languages/Francais --- rawtherapee-5.3/rtdata/languages/Francais 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Francais 2018-03-20 11:04:15.000000000 +0000 @@ -7,7 +7,9 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Réglages par défaut BATCHQUEUE_AUTOSTART;Démarrage auto +BATCHQUEUE_AUTOSTARTHINT;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche BATCHQUEUE_DESTFILENAME;Chemin et nom de fichier +BATCHQUEUE_STARTSTOPHINT;Démarre ou arrête le traitement des images dans la file.\n\nRaccourci: Ctrl+s BATCH_PROCESSING;Traitement par lot CURVEEDITOR_AXIS_IN;E: CURVEEDITOR_AXIS_LEFT_TAN;TG: @@ -34,6 +36,7 @@ CURVEEDITOR_TOOLTIPSAVE;Enregistrer la courbe actuelle CURVEEDITOR_TYPE;Type: DIRBROWSER_FOLDERS;Répertoires +DONT_SHOW_AGAIN;Ne plus montrer ce message. DYNPROFILEEDITOR_DELETE;Supprimer DYNPROFILEEDITOR_EDIT;Modifier DYNPROFILEEDITOR_EDIT_RULE;Modifier une règle de Profil Dynamique @@ -68,6 +71,7 @@ EXIFPANEL_RESETALL;Réinitialiser tout EXIFPANEL_RESETALLHINT;Réinitialise tous les tags à leur valeur initiale EXIFPANEL_RESETHINT;Réinitialise les données sélectionnées à la valeur initiale +EXIFPANEL_SHOWALL;Voir tout EXIFPANEL_SUBDIRECTORY;Sous-répertoire EXPORT_BYPASS;Étapes de traitement à ignorer EXPORT_BYPASS_ALL;Sélectionner / Désélectionner tout @@ -193,12 +197,7 @@ FILEBROWSER_SHOWTRASHHINT;Voir le contenu de la corbeille\nRaccourci: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Afficher les images sans label de couleur\nRaccourci: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Voir les images sans étoile\nRaccourci: 0 -FILEBROWSER_STARTPROCESSING;Démarrer le traitement -FILEBROWSER_STARTPROCESSINGHINT;Démarre le traitement/sauvegarde des images dans la file -FILEBROWSER_STOPPROCESSING;Arrêter le traitement -FILEBROWSER_STOPPROCESSINGHINT;Arrête le traitement des images FILEBROWSER_THUMBSIZE;Taille vign. -FILEBROWSER_TOOLTIP_STOPPROCESSING;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche FILEBROWSER_UNRANK_TOOLTIP;Effacer le rang\nRaccourci: Shift-0 FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourci: +\n\nRaccourcis dans le mode Éditeur Unique: Alt-+ FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourci: -\n\nRaccourcis dans le mode Éditeur Unique: Alt-- @@ -230,8 +229,10 @@ GENERAL_OPEN;Ouvrir GENERAL_PORTRAIT;Portrait GENERAL_SAVE;Enregistrer +GENERAL_SLIDER;Curseur GENERAL_UNCHANGED;(Inchangé) GENERAL_WARNING;Attention +GIMP_PLUGIN_INFO;Bienvenue dans le plugin RawTherapee de GIMP!\nUne fois l'édition terminée, fermez simplement la fenêtre principale de RawTherapee et l'image sera importée automatiquement dans GIMP. HISTOGRAM_TOOLTIP_B;Montrer/cacher l'histogramme BLEU HISTOGRAM_TOOLTIP_BAR;Montrer/Cacher l'indicateur RVB du pixel pointé\nCliquer le bouton droit de la souris sur l'image de prévisualisation pour geler/dégeler HISTOGRAM_TOOLTIP_CHRO;Montrer/Cacher l'histogramme de Chromaticité @@ -416,7 +417,7 @@ HISTORY_MSG_170;Vib. - Courbe HISTORY_MSG_171;Courbe 'LC' HISTORY_MSG_172;Lab - Restreindre 'LC' -HISTORY_MSG_173;Réd. Bruit - Détail Luminance +HISTORY_MSG_173;Réd. de bruit - Récupération des détails HISTORY_MSG_174;Modèle d'Apparence de la Couleur 2002 HISTORY_MSG_175;CAM02 - Adaptation CAT02 HISTORY_MSG_176;CAM02 - Environ. de visionnage @@ -446,7 +447,7 @@ HISTORY_MSG_200;CAM02 - Compression tonale HISTORY_MSG_201;Réd. de bruit - Chrom. R,V HISTORY_MSG_202;Réd. de bruit - Chrom. B,J -HISTORY_MSG_203;Réd. de bruit - Méthode +HISTORY_MSG_203;Réd. de bruit - Espace couleur HISTORY_MSG_204;Niveau d'amélioration LMMSE HISTORY_MSG_205;CAM02 Pixels chauds/morts HISTORY_MSG_206;CAT02 - Luminosité de la scène auto @@ -498,7 +499,7 @@ HISTORY_MSG_253;CpND - Réduction des artéfactes HISTORY_MSG_254;CpND - Teinte chair HISTORY_MSG_255;Réd. de bruit - Filtre médian -HISTORY_MSG_256;Réd. de bruit - Type de médiane +HISTORY_MSG_256;Réd. de bruit - Médian - Type HISTORY_MSG_257;Virage Partiel HISTORY_MSG_258;Virage Partiel - Couleur HISTORY_MSG_259;Virage Partiel - Opacité @@ -539,7 +540,7 @@ HISTORY_MSG_294;Simulation de Film - Force HISTORY_MSG_295;Simulation de Film - Film HISTORY_MSG_296;Réd. de bruit - Courbe de luminance -HISTORY_MSG_297;Réd. de bruit - Qualité +HISTORY_MSG_297;Réd. de bruit - Mode HISTORY_MSG_298;Filtre de pixel mort HISTORY_MSG_299;Réd. de bruit - Courbe de chrominance HISTORY_MSG_300;- @@ -702,6 +703,33 @@ HISTORY_MSG_473;PS - Utiliser LMMSE HISTORY_MSG_474;PS - Égaliser HISTORY_MSG_475;PS - Égaliser par canal +HISTORY_MSG_476;CAM02 - Temp sortie +HISTORY_MSG_477;CAM02 - Vert sortie +HISTORY_MSG_478;CAM02 - Yb sortie +HISTORY_MSG_479;CAM02 - adaptation CAT02 sortie +HISTORY_MSG_480;CAM02 - CAT02 auto sortie +HISTORY_MSG_481;CAM02 - Temp scène +HISTORY_MSG_482;CAM02 - Green scène +HISTORY_MSG_483;CAM02 - Yb scène +HISTORY_MSG_484;CAM02 - Yb auto scène +HISTORY_MSG_485;Correction d'Objectif +HISTORY_MSG_486;Corr. d'Obj. - Appareil +HISTORY_MSG_487;Corr. d'Obj. - Objectif +HISTORY_MSG_488;Compression tonale HDR +HISTORY_MSG_489;CT HDR - Seuil +HISTORY_MSG_490;CT HDR - Quantité +HISTORY_MSG_491;Balances des Blancs +HISTORY_MSG_492;Courbes RVB +HISTORY_MSG_493;Ajustements L*a*b* +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Virage Partiel - Correction couleur +HISTORY_MSG_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste Local - Quantité +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Local - Ombres +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste Local +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste Local - H.L. +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste Local - Rayon +HISTORY_MSG_METADATA_MODE;Mode de copie des métadonnées +HISTORY_MSG_TM_FATTAL_ANCHOR;CT HDR - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s HISTORY_SNAPSHOT;Capture @@ -748,6 +776,10 @@ IPTCPANEL_TITLEHINT;Enterez un nom court et humainement lisible pour l'image, cela peut être le nom du fichier. IPTCPANEL_TRANSREFERENCE;ID du travail IPTCPANEL_TRANSREFERENCEHINT;Enterez un nombre ou identifiant servant au contrôle du flux de travail ou au suivi. +LENSPROFILE_CORRECTION_AUTOMATCH;Paramètres de correction trouvés automatiquement +LENSPROFILE_CORRECTION_LCPFILE;Fichier LCP +LENSPROFILE_CORRECTION_MANUAL;Paramètres de correction manuel +LENSPROFILE_LENS_WARNING;Attention: la taille du capteur utilisé pour le profilage de l'objectif est plus grand que celui de l'appareil sélectionné, le résultat peut être faux. MAIN_BUTTON_FULLSCREEN;Plein écran MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigue à l'image Suivante relativement à l'image ouverte dans l'Éditeur\nRaccourci: Shift-F4\n\nPour naviguer à l'image Suivante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navigue à l'image Précédente relativement à l'image ouverte dans l'Éditeur\nRaccourci: Shift-F3\n\nPour naviguer à l'image Précédente relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: F3 @@ -783,6 +815,8 @@ MAIN_MSG_SETPATHFIRST;Vous devez d'abord choisir un dossier cible dans Préférences\npour pouvoir utiliser cette fonction! MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n"%1"\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire. +MAIN_TAB_ADVANCED;Avancé +MAIN_TAB_ADVANCED_TOOLTIP;Raccourci: Alt-w MAIN_TAB_COLOR;Couleur MAIN_TAB_COLOR_TOOLTIP;Raccourci:Alt-c MAIN_TAB_DETAIL;Détail @@ -806,6 +840,7 @@ MAIN_TOOLTIP_BACKCOLOR0;Couleur de fond de l'aperçu: Selon le thème\nRaccourci : 9 MAIN_TOOLTIP_BACKCOLOR1;Couleur de fond de l'aperçu: Noir\nRaccourci : 9 MAIN_TOOLTIP_BACKCOLOR2;Couleur de fond de l'aperçu: Blanc\nRaccourci: 9 +MAIN_TOOLTIP_BACKCOLOR3;Couleur de fond de l'aperçu: Gris moyen\nRaccourci : 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vérouille / déverouille la vue Avant\n\nVérouille: garde la vue Avant inchangée - \nutile pour évaluer l'effet cumulatif de plusieurs outils.\nDe plus, une comparaison peut être faite à partir de n'importe quelle étape de l'historique\n\nDéverouille: la vue Avant représentera l'étape précédant la vue Après, montrant l'effet qui vient d'être modifié MAIN_TOOLTIP_HIDEHP;Montrer/cacher le panneau gauche (incluant l'historique)\nRaccourci: l MAIN_TOOLTIP_INDCLIPPEDH;Indication hautes lumières hors domaine\nRaccourci: < @@ -834,8 +869,10 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Largeur = %1, Hauteur = %2 NAVIGATOR_XY_NA;x = n/d, y = n/d -OPTIONS_DEFIMG_MISSING;Le profil par défaut pour les images standards n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez également le dossier de vos profils, il peut être manquant ou endommagé\n\nLes valeurs internes pas défaut seront utilisées. -OPTIONS_DEFRAW_MISSING;Le profil par défaut pour les images Raw n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez également le dossier de vos profils, il peut être manquant ou endommagé\n\nLes valeurs internes pas défaut seront utilisées. +OPTIONS_BUNDLED_MISSING;Le profile fourni "%1" n'a pas été trouvé!\n\nVotre installation peut être endomagé.\n\nLes valeurs internes par défaut seront utilisées à la place. +OPTIONS_DEFIMG_MISSING;Le profil par défaut pour les images standards n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"%1" sera utilisé à la place. +OPTIONS_DEFRAW_MISSING;Le profil par défaut pour les images Raw n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"%1" sera utilisé à la place. +PARTIALPASTE_ADVANCEDGROUP;Réglages Avancés PARTIALPASTE_BASICGROUP;Réglages de base PARTIALPASTE_CACORRECTION;Aberration chromatique PARTIALPASTE_CHANNELMIXER;Mixage des canaux @@ -874,6 +911,8 @@ PARTIALPASTE_LABCURVE;Courbes Lab PARTIALPASTE_LENSGROUP;Réglages de l'objectif PARTIALPASTE_LENSPROFILE;Profil de correction d'Objectif +PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_METADATA;Mode des Metadonnées PARTIALPASTE_METAGROUP;Réglages des Métadonnées PARTIALPASTE_PCVIGNETTE;Filtre Vignettage PARTIALPASTE_PERSPECTIVE;Perspective @@ -903,6 +942,7 @@ PARTIALPASTE_SHARPENEDGE;Bords PARTIALPASTE_SHARPENING;Netteté PARTIALPASTE_SHARPENMICRO;Microcontraste +PARTIALPASTE_TM_FATTAL;Compression tonale HDR PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Correction du vignettage PARTIALPASTE_WAVELETGROUP;Niveaux d'ondelette @@ -915,6 +955,7 @@ PREFERENCES_AUTLISVLOW;Aucun PREFERENCES_AUTLOW;Bas PREFERENCES_AUTOMONPROFILE;Utiliser automatiquement le profil de l'écran principal +PREFERENCES_AUTOSAVE_TP_OPEN;Sauver automatiquement l'état ouvert/fermé\n des outils avant de fermer PREFERENCES_AUTSTD;Standard PREFERENCES_BATCH_PROCESSING;Traitement par lot PREFERENCES_BEHADDALL;Tout à 'Ajoute' @@ -938,6 +979,12 @@ PREFERENCES_CLUTSCACHE_LABEL;Nombre maximum de chache CLUT PREFERENCES_CLUTSDIR;Dossier HaldCLUT PREFERENCES_CMMBPC;Compensation du point noir +PREFERENCES_CROP;Édition du recadrage +PREFERENCES_CROP_AUTO_FIT;Zommer automatiquement sur la zone recadrée +PREFERENCES_CROP_GUIDES;Guides affichés en dehors de l'édition du recadrage +PREFERENCES_CROP_GUIDES_FRAME;Cadre +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Aucun PREFERENCES_CURVEBBOXPOS;Position des boutons copier/coller des courbes PREFERENCES_CURVEBBOXPOS_ABOVE;Au-dessus PREFERENCES_CURVEBBOXPOS_BELOW;En-dessous @@ -951,10 +998,10 @@ PREFERENCES_CUSTPROFBUILDPATH;Chemin de l'exécutable PREFERENCES_CUTOVERLAYBRUSH;Masque de recadrage PREFERENCES_D50;5000K +PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Soustraction de Trame Noire PREFERENCES_DARKFRAMEFOUND;Trouvé PREFERENCES_DARKFRAMESHOTS;image(s) PREFERENCES_DARKFRAMETEMPLATES;modèle(s) @@ -963,20 +1010,19 @@ PREFERENCES_DAUB_LABEL;Utiliser les ondelettes de Daubechies D6 au lieu de D4 PREFERENCES_DAUB_TOOLTIP;Les outils de Réduction de Bruit et de Niveaux d'Ondelettes utilisent une ondelette de Debauchie mère. Si vous choisissez D6 au lieu de D4 vous augmentez le nombre de coéf. orthogonaux de Daubechies et augmentez probablement la qualité des niveaux de taille moyenne. Il n'y a pas de différence de consommation mémoire ou de temps de traitement entre les deux. PREFERENCES_DIRDARKFRAMES;Dossier des images de Trame Noire +PREFERENCES_DIRECTORIES;Dossiers PREFERENCES_DIRHOME;Racine de mes documents personnels PREFERENCES_DIRLAST;Dernier dossier visité PREFERENCES_DIROTHER;Autre PREFERENCES_DIRSELECTDLG;Choix du dossier Image au lancement... PREFERENCES_DIRSOFTWARE;Dossier d'installation -PREFERENCES_EDITORCMDLINE;Autre ligne de commande +PREFERENCES_EDITORCMDLINE;Ligne de commande personnelle PREFERENCES_EDITORLAYOUT;Disposition de l'éditeur PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Éditeur externe PREFERENCES_FBROWSEROPTS;Options du navigateur de fichiers et de vignettes PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barre de menu de l'explorateur de fichiers uni-ligne\n(à désactiver pour les écrans de faible résolution) PREFERENCES_FILEFORMAT;Format du fichier -PREFERENCES_FILMSIMULATION;Simulation de Film -PREFERENCES_FLATFIELD;Champ Uniforme PREFERENCES_FLATFIELDFOUND;Trouvé PREFERENCES_FLATFIELDSDIR;Dossier des images de Champ Uniforme PREFERENCES_FLATFIELDSHOTS;image(s) @@ -994,6 +1040,7 @@ PREFERENCES_GREY10;Yb=10 CIE L#40 PREFERENCES_GREY15;Yb=15 CIE L#45 PREFERENCES_GREY18;Yb=18 CIE L#50 +PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 PREFERENCES_GREY23;Yb=23 CIE L#55 PREFERENCES_GREY30;Yb=30 CIE L#60 PREFERENCES_GREY40;Yb=40 CIE L#70 @@ -1015,6 +1062,7 @@ PREFERENCES_INTENT_RELATIVE;Colorimétrie relative PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Afficher vignette incluse dans fichier RAW si non édité +PREFERENCES_LANG;Langage PREFERENCES_LANGAUTODETECT;Utiliser les paramètres linguistiques de l'OS PREFERENCES_LEVAUTDN;Niveau de débruitage PREFERENCES_LEVDN;Taille de la cellule @@ -1043,7 +1091,7 @@ PREFERENCES_OUTDIRFOLDER;Dossier de sauvegarde PREFERENCES_OUTDIRFOLDERHINT;Place les images traitées dans le dossier selectionné PREFERENCES_OUTDIRTEMPLATE;Utiliser le modèle -PREFERENCES_OUTDIRTEMPLATEHINT;Vous pouvez utiliser les paramètres de chaîne formatées suivants:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nCes chaînes de formattage se réfèrent aux différentes parties du chemin de la photo, certains de ses attributs ou un numéro de séquence arbitraire dans le traitement par lot.\n\nPar exemple, si la photo en cours de traitement a le chemin suivant:\n/home/tom/image/02-09-2006/dsc0012.nef\nla signification des chaînes de formattage est:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r sera remplacé par le rang de la photo. Si la photo n'a pas de rang, %r sera remplacé par '0'. Si la photo est dans la corbeille de RawTherapee, %r sera remplacé par 'x'.\n\n%s1, %s2, etc. sera remplacé par un index de séquence constitué de 1 à 9 chiffre. L'index de la séquence commencera à 1 à chaque fois que le file de traitement est démarrée, et est incrémenté de 1 pour chaque image traitée.\n\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n%p1/%f\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "convertis" situé dans le dossier de l'originale, écrivez:\n%p1/convertis/%f\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "/home/tom/photos/convertis/2010-10-31", écrivez:\n%p2/convertis/%d1/%f +PREFERENCES_OUTDIRTEMPLATEHINT;Vous pouvez utiliser les paramètres de chaîne formatées suivants:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nCes chaînes de formattage se réfèrent aux différentes parties du chemin de la photo, certains de ses attributs ou un numéro de séquence arbitraire dans le traitement par lot.\n\nPar exemple, si la photo en cours de traitement a le chemin suivant:\n/home/tom/photos/2010-10-31/dsc0042.nef\nla signification des chaînes de formattage est:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r sera remplacé par le rang de la photo. Si la photo n'a pas de rang, %r sera remplacé par '0'. Si la photo est dans la corbeille de RawTherapee, %r sera remplacé par 'x'.\n\n%s1, %s2, etc. sera remplacé par un index de séquence constitué de 1 à 9 chiffres. L'index de la séquence commencera à 1 à chaque fois que le file de traitement est démarrée, et est incrémenté de 1 pour chaque image traitée.\n\nSi vous voulez enregistrer l'image de sortie là où se trouve l'originale, écrivez:\n%p1/%f\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "convertis" situé dans le dossier de l'originale, écrivez:\n%p1/convertis/%f\n\nSi vous voulez enregistrer l'image de sortie dans un dossier nommé "/home/tom/photos/convertis/2010-10-31", écrivez:\n%p2/convertis/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Superposer les noms de fichier sur les vignettes dans le navigateur de fichier PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Superposer les noms de fichier sur les vignettes dans le panneau d'édition PREFERENCES_OVERWRITEOUTPUTFILE;Écraser le fichier s'il existe déjà @@ -1076,6 +1124,7 @@ PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Retient le niveau de zoom et la position de l'image courante lors de l'ouverture d'une nouvelle image.\n\nCette option ne fonctionne que dans le mode "Éditeur unique" et quand "Méthode de dématriçage utilisé pour l'aperçu à un zoom <100%" is set to "Idem PP3". PREFERENCES_RGBDTL_LABEL;Nombre maximum d'unités de calcul pour la Réduction du bruit PREFERENCES_RGBDTL_TOOLTIP;La réduction du bruit nécessite un minimum d'à peu près 128Mo de RAM pour une image de 10MPix ou 512Mo pour une image de 40MPix, ainsi que 128Mo de RAM supplémentaire par unité de calcul. Plus il y aura d'unités de calcul travaillant en parallèle, plus ce sera rapide. Laissez la valeur à "0" pour utiliser automatiquement autant d'unités de calcul que possible. +PREFERENCES_SAVE_TP_OPEN_NOW;Sauver l'état ouvert/fermé maintenant PREFERENCES_SELECTFONT;Police principale PREFERENCES_SELECTFONT_COLPICKER;Police des pipette à couleur PREFERENCES_SELECTLANG;Choix de la langue @@ -1106,6 +1155,7 @@ PREFERENCES_TAB_IMPROC;Traitement de l'image PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Sons +PREFERENCES_THEME;Thème PREFERENCES_TIMAX;Haut PREFERENCES_TINB;Nombre de tuiles PREFERENCES_TISTD;Standard @@ -1153,8 +1203,17 @@ PROGRESSBAR_SAVETIFF;Enregistrement du fichier TIFF... PROGRESSBAR_SNAPSHOT_ADDED;Signet ajouté PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil modifié dans le navigateur +QINFO_FRAMECOUNT;%2 images +QINFO_HDR;HDR / %2 image(s) QINFO_ISO;ISO QINFO_NOEXIF;Données EXIF non disponibles. +QINFO_PIXELSHIFT;PixelShift / %2 images +SAMPLEFORMAT_0;Format de donnée inconnu +SAMPLEFORMAT_1;8 bits non signé +SAMPLEFORMAT_2;16 bits non signé +SAMPLEFORMAT_4;LogLuv 24 bits +SAMPLEFORMAT_8;LogLuv 32 bits +SAMPLEFORMAT_16;32 bits à virgule flottante SAVEDLG_AUTOSUFFIX;Ajouter automatiquement un suffixe si le fichier existe déjà SAVEDLG_FILEFORMAT;Format de fichier SAVEDLG_FORCEFORMATOPTS;Forcer les options d'enregistrement @@ -1173,8 +1232,8 @@ SAVEDLG_TIFFUNCOMPRESSED;TIFF non compressé SAVEDLG_WARNFILENAME;Le fichier sera nommé SHCSELECTOR_TOOLTIP;Cliquez le bouton droit de la souris\npour réinitialiser la position de ces 3 curseurs -SOFTPROOF_GAMUTCHECK_TOOLTIP;Si activé, indique en gris les pixels dont la couleurs est en dehors du gamut du profil de sortie -SOFTPROOF_TOOLTIP;Épreuvage écran\nSi activé, simule le rendu généré par le profile de sortie de l'outil ICM. Particulièrement utile pour simuler le rendu en sortie d'imprimante. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Met en lumière les pixels en dehors du gamut en fonction:\n- du profile de l'imprimante, si l'un est sélectionné et que l'épreuvage écran est activé,\n- du profile de sortie, si aucun profile d'imprimante n'est sélectionné et que l'épreuvage écran est activé,\n- du profile du moniteur, si l'épreuvage écran est désactivé. +SOFTPROOF_TOOLTIP;L'épreuvage écran simule l'apparence de l'image:\n- lorsque imprimé, si un profile d'imprimante a été sélectionné dans Préférences > Gestion des couleurs,\n- lorsque visionné sur un écran qui utilise le profile de sortie actuel, si un profile d'imprimante n'est pas sélectionné. THRESHOLDSELECTOR_B;Bas THRESHOLDSELECTOR_BL;Bas-gauche THRESHOLDSELECTOR_BR;Bas-droite @@ -1299,6 +1358,7 @@ TP_COLORAPP_DATACIE_TOOLTIP;Quand activé, les histogrammes de fond des courbes CIECAM02 montrent des valeurs/amplitudes approximatives de J/Q, ou de C:s/M après les ajustements CIECAM.\nCette sélection n'a pas d'incidence sur l'histogramme général.\n\nQuand désactivé, les histogrammes de fond des courbes CIECAM affichent les valeurs Lab avant les ajustements CIECAM TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Si la case est cochée (recommandé), RT calcule une valeur optimale, qui est utilisée par CAT02, mais aussi pour l'ensemble de CIECAM02.\nVous pouvez décocher la case et changer la valeur du curseur; (les valeurs supérieures à 65 sont recommandées) TP_COLORAPP_DEGREE_TOOLTIP;Niveau d'adaptation chromatique CIE CAT 2002 +TP_COLORAPP_FREE;Temp libre+vert + CAT02 + [sortie] TP_COLORAPP_GAMUT;Contrôle du gamut (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Permet le controle du gamut en mode Lab TP_COLORAPP_HUE;Teinte (h) @@ -1311,6 +1371,8 @@ TP_COLORAPP_LIGHT_TOOLTIP;Luminosité dans CIECAM02 est différent de celui de Lab et RVB TP_COLORAPP_MODEL;Modèle de Point Blanc TP_COLORAPP_MODEL_TOOLTIP;Modèle de Point Blanc\n\nBB [RT] + [sortie]:\nLa BB de RT est utilisée pour la scène, CIECAM est réglé sur D50, le blanc du périphérique de sortie utilise la valeur réglée dans Préférences\n\nBB [RT+CAT02] + [sortie]:\nLes réglages de BB de RT sont utilisés par CAT02 et le blanc du périphérique de sortie utilise la valeur réglée dans Préférences +TP_COLORAPP_NEUTRAL;Résinitialiser +TP_COLORAPP_NEUTRAL_TIP;Réinitialiser tous les curseurs, cases à cocher et courbes à leurs valeur par défaut TP_COLORAPP_RSTPRO;Protection des tons chairs et rouges TP_COLORAPP_RSTPRO_TOOLTIP;Protection des tons chairs et rouges (curseurs et courbes) TP_COLORAPP_SHARPCIE;Netteté, Contraste par niveau de détails, Microcontraste & Aberration chromatique avec Q/C @@ -1331,10 +1393,14 @@ TP_COLORAPP_TCMODE_LABEL3;Courbe chroma mode TP_COLORAPP_TCMODE_LIGHTNESS;Luminosité TP_COLORAPP_TCMODE_SATUR;Saturation +TP_COLORAPP_TEMP_TOOLTIP;Pour sélectionner un illuminant, toujours régler Teinte=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 TP_COLORAPP_TONECIE;Compression Tonale utilisant CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Si cette option est désactivée, la compression tonale est faite dans l'espace Lab.\nSi cette options est activée, la compression tonale est faite en utilisant CIECAM02.\nL'outil Compression Tonale doit être activé pour que ce réglage prenne effet TP_COLORAPP_WBCAM;BB [RT+CAT02] + [sortie] TP_COLORAPP_WBRT;BB [RT] + [sortie] +TP_COLORAPP_YB;Yb% (luminance moyenne) +TP_COLORAPP_YBSCENE;Yb% (luminance moyenne) +TP_COLORAPP_YBSCENE_TOOLTIP;si auto activé, Yb est calculé suivant la valeur de luminance moyenne de l'image actuelle TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatique TP_COLORTONING_BALANCE;Balance @@ -1346,6 +1412,8 @@ TP_COLORTONING_HUE;Teinte TP_COLORTONING_LAB;Mixage Lab TP_COLORTONING_LABEL;Virage Partiel +TP_COLORTONING_LABGRID;Grille de correction L*a*b* +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nO: a=%3 b=%4 TP_COLORTONING_LUMA;Luminance TP_COLORTONING_LUMAMODE;Préserver la luminance TP_COLORTONING_LUMAMODE_TOOLTIP;Si activé, lorsque vous changez la couleur (rouge, vert, cyan, bleu, etc.), la luminance de chaque pixel est préservé @@ -1394,69 +1462,65 @@ TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 doux -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 doux -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Chroma uniquement -TP_DIRPYRDENOISE_AUT;Global automatique -TP_DIRPYRDENOISE_AUTO;Global automatique -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! -TP_DIRPYRDENOISE_BLUE;Chrominance - Bleu-Jaune -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAperçu\nAgit sur l'image entière.\nLa partie visible de l'image dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. -TP_DIRPYRDENOISE_CCCURVE;Courbe de chrominance -TP_DIRPYRDENOISE_CHROMA;Chrominance - Maître -TP_DIRPYRDENOISE_CHROMAFR;Chrominance -TP_DIRPYRDENOISE_CTYPE;Méthode -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAutomatique multi-zones\nPas d'aperçu - ne fonctionne que lors de l'enregistrement, mais utiliser la méthode "Aperçu" en faisant correspondre la taille et le centre de la tuile à la taille et au centre de l'aperçu, vous permet d'avoir une idée des résultats attendus.\nL'image est divisé en tuiles (entre 10 et 70 en fonction de la taille de l'image) et chaque tuile reçoit son propre réglage de réduction de bruit de chrominance.\n\nAperçu\nAgit sur l'image entière.\nLa partie de l'image visible dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. -TP_DIRPYRDENOISE_CUR;Courbe -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Augmente (multiplie) la valeur de tousles curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones peu saturées et pour la réduire dans ceux celles très saturées. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Module l'action du débruitage de 'Luminance' +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Multi-zones auto +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automatique +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Essaie d'évaluer le bruit chroma\nFaites attention, cela calcul une moyenne, et est très subjectif ! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Bleu-Jaune +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Courbe de chrominance +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Augmente (multiplie) la valeur de tous les curseurs de chrominance.\nCette courbe vous permet d'ajuster la force de la réduction de bruit chromatique en fonction de la chromaticité, par exemple pour augmenter l'action dans les zones faiblement saturées et pour la diminuer dans celles très saturées. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuel +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Maître +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Méthode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAperçu\nAgit sur l'image entière.\nLa partie visible de l'image dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manuel\nAgit sur l'image entière.\nVous controlez les paramètres de réduction de bruit manuellement.\n\nGlobal automatique\nAgit sur l'image entière.\n9 zones sont utilisées pour calculer un réglage de réduction de bruit de chroma.\n\nAutomatique multi-zones\nPas d'aperçu - ne fonctionne que lors de l'enregistrement, mais utiliser la méthode "Aperçu" en faisant correspondre la taille et le centre de la tuile à la taille et au centre de l'aperçu, vous permet d'avoir une idée des résultats attendus.\nL'image est divisé en tuiles (entre 10 et 70 en fonction de la taille de l'image) et chaque tuile reçoit son propre réglage de réduction de bruit de chrominance.\n\nAperçu\nAgit sur l'image entière.\nLa partie de l'image visible dans l'aperçu est utilisé pour calculer un réglage de réduction de bruit de chroma. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Aperçu multi-zones +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Aperçu +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Affiche les niveaux de bruit résiduel de la partie de l'image visible dans l'aperçu après les ondelettes.\n\n>300 Très bruité\n100-300 Bruité\n50-100 Peu bruité\n<50 Très peu bruité\n\nAttention, les valeurs diffèreront entre le mode RVB et L*a*b*. Les valeurs RVB sont moins précises car le mode RVB ne séparent pas complètement la luminance et la chrominance. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Taille de l'aperçu=%1, Centre: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Bruit de l'aperçu: Moyen=%1 Haut=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Bruit de l'aperçu: Moyen= - Haut= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Taille des tuiles =%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Rouge-Vert TP_DIRPYRDENOISE_ENH;Mode amélioré TP_DIRPYRDENOISE_ENH_TOOLTIP;Augmente la qualité du débruitage, mais augmente le temps de traitement d'environ 20% -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma fait varier la quantité de réduction de bruit sur l'échelle des tons. Les plus petites valeurs cibleront les ombres, les plus hautes valeurs cibleront les tons les plus clairs. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Réduction du bruit -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Courbe de luminance -TP_DIRPYRDENOISE_LDETAIL;Niveau de détails de Luminance -TP_DIRPYRDENOISE_LM;Luminance seulement -TP_DIRPYRDENOISE_LPLABM;L* pondéré (faiblement) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Contrôle de luminance -TP_DIRPYRDENOISE_LUMA;Luminance -TP_DIRPYRDENOISE_LUMAFR;Luminance -TP_DIRPYRDENOISE_MAN;Manuel -TP_DIRPYRDENOISE_MANU;Manuel -TP_DIRPYRDENOISE_MED;Filtre Médian -TP_DIRPYRDENOISE_MEDMETHOD;Méthode -TP_DIRPYRDENOISE_MEDTYPE;Type de médiane -TP_DIRPYRDENOISE_METHOD;Méthode -TP_DIRPYRDENOISE_METHOD11;Qualité -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;La qualité peut être adapté à la trame du bruit. Régler sur "haut" augmentera l'effet de la réduction de bruit au prix d'un temps de traitement plus long. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Pour les images raw, les méthodes RVB ou Lab peuvent être utilisées.\n\nPour les images non-raw la méthode Lab sera utilisée, indépendamment de ce qu'indique ce bouton. -TP_DIRPYRDENOISE_METM_TOOLTIP;Lorsque vous utilisez les méthodes "Luminance seulement" et "Lab", un filtrage médian sera effectué juste après l'étape des ondelettes dans le pipeline de la réduction de bruit.\nEm mode "RVB", il sera effectué à la toute fin du pipeline de la réduction de bruit. -TP_DIRPYRDENOISE_MET_TOOLTIP;Applique un filtre médian de la taille de "fenêtre" désirée. Plus cette taille est grande, plus cela prendra de temps.\n\n3×3 doux: traite 5 pixels dans une fenêtre de 3×3 pixels.\n3×3: traite 9 pixels dans une fenêtre de 3×3 pixels.\n5×5 doux: traite 13 pixels dans une fenêtre de 5×5 pixels.\n5×5: traite 25 pixels dans une fenêtre de 5×5 pixels.\n7×7: traite 49 pixels dans une fenêtre de 7×7 pixels.\n9×9: traite 81 pixels dans une fenêtre 9×9 pixels.\n\nIl est parfois possible d'atteindre une meilleurs qualité en appliquant plusieurs itérations d'une petite fenêtre qu'une seule itération d'une grande. -TP_DIRPYRDENOISE_NOISELABEL;Bruit de l'aperçu: Moyen=%1 Haut=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Bruit de l'aperçu: Moyen= - Haut= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Affiche les niveaux de bruit résiduel de la partie de l'image visible dans l'aperçu après les ondelettes.\n\n>300 Très bruité\n100-300 Bruité\n50-100 Peu bruité\n<50 Très peu bruité\n\nAttention, les valeurs diffèreront entre le mode RVB et L*a*b*. Les valeurs RVB sont moins précises car le mode RVB ne séparent pas complètement la luminance et la chrominance. +TP_DIRPYRDENOISE_LABEL;Réduction de Bruit +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Contrôle de luminance +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Courbe de luminance +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Niveau de détails de Luminance +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Méthode +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Réduction du bruit +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RVB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Pour les images raw, les méthodes RVB ou Lab peuvent être utilisées.\n\nPour les images non-raw la méthode Lab sera utilisée, indépendamment de ce qu'indique ce bouton. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma fait varier la quantité de réduction de bruit sur l'échelle des tons. Les plus petites valeurs cibleront les ombres, les plus hautes valeurs cibleront les tons les plus clairs. +TP_DIRPYRDENOISE_MAIN_MODE;Qualité +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Haut +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;La qualité peut être adapté à la trame du bruit. Régler sur "haut" augmentera l'effet de la réduction de bruit au prix d'un temps de traitement plus long. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Méthode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma uniquement +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtre Médian +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance seulement +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RVB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Lorsque vous utilisez les méthodes "Luminance seulement" et "Lab", un filtrage médian sera effectué juste après l'étape des ondelettes dans le pipeline de la réduction de bruit.\nEm mode "RVB", il sera effectué à la toute fin du pipeline de la réduction de bruit. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;L* pondéré (faiblement) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Itérations +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Appliquer trois itérations avec une taille de fenêtre de 3×3 aboutit souvent à de meilleurs résultats qu'une seule itération avec une taille de fenêtre de 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Type de médiane +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Applique un filtre médian de la taille de "fenêtre" désirée. Plus cette taille est grande, plus cela prendra de temps.\n\n3×3 doux: traite 5 pixels dans une fenêtre de 3×3 pixels.\n3×3: traite 9 pixels dans une fenêtre de 3×3 pixels.\n5×5 doux: traite 13 pixels dans une fenêtre de 5×5 pixels.\n5×5: traite 25 pixels dans une fenêtre de 5×5 pixels.\n7×7: traite 49 pixels dans une fenêtre de 7×7 pixels.\n9×9: traite 81 pixels dans une fenêtre 9×9 pixels.\n\nIl est parfois possible d'atteindre une meilleurs qualité en appliquant plusieurs itérations d'une petite fenêtre qu'une seule itération d'une grande. TP_DIRPYRDENOISE_PASSE;Itérations -TP_DIRPYRDENOISE_PASSES;Itérations -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Appliquer trois itérations avec une taille de fenêtre de 3×3 aboutit souvent à de meilleurs résultats qu'une seule itération avec une taille de fenêtre de 7×7. -TP_DIRPYRDENOISE_PON;Multi-zones auto -TP_DIRPYRDENOISE_PRE;Aperçu multi-zones -TP_DIRPYRDENOISE_PREV;Aperçu -TP_DIRPYRDENOISE_PREVLABEL;Taille de l'aperçu=%1, Centre: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Chrominance - Rouge-Vert -TP_DIRPYRDENOISE_RGB;RVB -TP_DIRPYRDENOISE_RGBM;RVB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Haut TP_DIRPYRDENOISE_SLI;Curseur -TP_DIRPYRDENOISE_TILELABEL;Taille des tuiles =%1, Centre: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 doux +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 doux +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Domaine des tons chairs TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fin: plus proche des tons chairs, minimisant l'actions sur les autres couleurs\nLarge: évite plus d'artéfacts TP_DIRPYREQUALIZER_ARTIF;Réduire les artéfacts @@ -1496,6 +1560,8 @@ TP_EXPOSURE_CURVEEDITOR2;Courbe Tonale 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Référez-vous à la section suivante du manuel pour en savoir plus sur les manières d'obtenir les meilleurs résultats avec l'option de double courbe:\nThe Toolbox > Exposure Tab > Exposure Panel > Tone Curve TP_EXPOSURE_EXPCOMP;Compensation d'exposition +TP_EXPOSURE_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Ajuste automatiquement les curseurs et courbes (excepté la compensation d'exposition) pour obtenir l'aspect de l'aperçu JPEG inclus. TP_EXPOSURE_LABEL;Exposition TP_EXPOSURE_SATURATION;Saturation TP_EXPOSURE_TCMODE_FILMLIKE;Similaire Film @@ -1632,6 +1698,15 @@ TP_LENSPROFILE_USECA;Corr. de l'aber. chromatique TP_LENSPROFILE_USEDIST;Corr. de la distortion TP_LENSPROFILE_USEVIGN;Corr. du vignettage +TP_LOCALCONTRAST_AMOUNT;Quantité +TP_LOCALCONTRAST_DARKNESS;Niveau des ombres +TP_LOCALCONTRAST_LABEL;Contraste Local +TP_LOCALCONTRAST_LIGHTNESS;Niveau des hautes-lumières +TP_LOCALCONTRAST_RADIUS;Rayon +TP_METADATA_EDIT;Appliquer les modifications +TP_METADATA_MODE;Mode de copie des métadonnées +TP_METADATA_STRIP;Retirer toutes les métadonnées +TP_METADATA_TUNNEL;Copier à l'identique TP_NEUTRAL;Réinit. TP_NEUTRAL_TIP;Réinitialise les valeurs de l'exposition à des valeurs neutres TP_PCVIGNETTE_FEATHER;Étendue @@ -1731,6 +1806,8 @@ TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Vérifier rouge/bleu horizontal TP_RAW_PIXELSHIFTNONGREENVERTICAL;Vérifier rouge/bleu vertical TP_RAW_PIXELSHIFTNREADISO;Lire +TP_RAW_PIXELSHIFTONEGREEN;Utiliser un seul canal vert +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Utilise un seul canal vert au lieu de faire la moyennes des deux canaux verts pour détecter les régions sans mouvement. TP_RAW_PIXELSHIFTPRNU;PRNU (%) TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Poid Rouge&Bleu TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement @@ -1744,6 +1821,7 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Facteur DevStd Bleu TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Facteur DevStd Vert TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Facteur DevStd Rouge +TP_RAW_RCD;RCD TP_RAW_SENSOR_BAYER_LABEL;Capteur à matrice de Bayer TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passes donne les meilleurs résultats (recommendé pour les images de faible ISO).\n1-passe est presque indifférentiable de 3-passes pour les images à haut ISO et est plus rapide. TP_RAW_SENSOR_XTRANS_LABEL;Capteur à matrice X-Trans @@ -1884,6 +1962,10 @@ TP_SHARPENMICRO_LABEL;Microcontraste TP_SHARPENMICRO_MATRIX;Matrice 3×3 au lieu de 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformité +TP_TM_FATTAL_AMOUNT;Quantité +TP_TM_FATTAL_ANCHOR;Ancre +TP_TM_FATTAL_LABEL;Compression Tonale HDR +TP_TM_FATTAL_THRESHOLD;Seuil TP_VIBRANCE_AVOIDCOLORSHIFT;Éviter les dérives de teinte TP_VIBRANCE_CURVEEDITOR_SKINTONES;TT TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons chair @@ -2122,44 +2204,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Ouvrir une (nouvelle) vue détaillée ZOOMPANEL_ZOOM100;Zoom à 100%\nRaccourci: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Zoom/affiche la zone recadrée\nRaccourci: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Zoom/affiche la zone recadrée\nRaccourci: f +ZOOMPANEL_ZOOMFITSCREEN;Affiche l'image entière\nRaccourci: Alt-f ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: + ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: - -!!!!!!!!!!!!!!!!!!!!!!!!! -! Untranslated keys follow; remove the ! prefix after an entry is translated. -!!!!!!!!!!!!!!!!!!!!!!!!! - -!DONT_SHOW_AGAIN;Don't show this message again. -!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -!HISTORY_MSG_476;CAM02 - Temp out -!HISTORY_MSG_477;CAM02 - Green out -!HISTORY_MSG_478;CAM02 - Yb out -!HISTORY_MSG_479;CAM02 - CAT02 adaptation out -!HISTORY_MSG_480;CAM02 - Automatic CAT02 out -!HISTORY_MSG_481;CAM02 - Temp scene -!HISTORY_MSG_482;CAM02 - Green scene -!HISTORY_MSG_483;CAM02 - Yb scene -!HISTORY_MSG_484;CAM02 - Auto Yb scene -!HISTORY_MSG_485;Lens Correction -!HISTORY_MSG_486;Lens Correction - Camera -!HISTORY_MSG_487;Lens Correction - Lens -!LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters -!LENSPROFILE_CORRECTION_LCPFILE;LCP File -!LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters -!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. -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_D50_OLD;5000K -!PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 -!PREFERENCES_LANG;Language -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_THEME;Theme -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -!TP_COLORAPP_NEUTRAL;Reset -!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 -!TP_COLORAPP_YB;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance diff -Nru rawtherapee-5.3/rtdata/languages/Greek rawtherapee-5.4/rtdata/languages/Greek --- rawtherapee-5.3/rtdata/languages/Greek 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Greek 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Άλλο PREFERENCES_DIRSELECTDLG;Επιλέξτε τοποθεσία εικόνων κατά την έναρξη... PREFERENCES_DIRSOFTWARE;Τοποθεσία εγκατάστασης -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Επιλογές περιήγησης αρχείων PREFERENCES_FILEFORMAT;Είδος αρχείου @@ -426,7 +421,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -462,6 +459,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -556,7 +554,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -574,6 +571,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -672,7 +670,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -702,7 +700,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -754,7 +752,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -795,7 +793,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -970,6 +968,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1021,6 +1034,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1030,8 +1045,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1060,8 +1073,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1087,6 +1102,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1106,13 +1123,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1137,6 +1154,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1154,18 +1177,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1291,6 +1313,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1301,8 +1332,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1447,14 +1478,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1466,6 +1497,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1503,68 +1536,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1594,6 +1622,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1715,6 +1745,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1764,7 +1803,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1772,7 +1811,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1812,6 +1851,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1825,6 +1866,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1934,6 +1976,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2160,7 +2206,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Hebrew rawtherapee-5.4/rtdata/languages/Hebrew --- rawtherapee-5.3/rtdata/languages/Hebrew 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Hebrew 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;אחר PREFERENCES_DIRSELECTDLG;בחר תיקיית צילומים לאתחול PREFERENCES_DIRSOFTWARE;תיקיית התקנה -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;ברירות דפדפן PREFERENCES_FILEFORMAT;תצורת קובץ @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Italiano rawtherapee-5.4/rtdata/languages/Italiano --- rawtherapee-5.3/rtdata/languages/Italiano 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Italiano 2018-03-20 11:04:15.000000000 +0000 @@ -11,6 +11,7 @@ ABOUT_TAB_SPLASH;Emblema ADJUSTER_RESET_TO_DEFAULT;Ripristina BATCHQUEUE_AUTOSTART;Autoavvia +BATCHQUEUE_AUTOSTARTHINT;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato BATCHQUEUE_DESTFILENAME;Percorso e nome file BATCH_PROCESSING;Sviluppo in serie CURVEEDITOR_CURVE;Curva @@ -174,12 +175,7 @@ FILEBROWSER_SHOWTRASHHINT;Mostra il contenuto del cestino.\nScorciatoia: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Mostra le immagini senza etichetta colorata.\nScorciatoia: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostra le immagini non classificate.\nScorciatoia: 0 -FILEBROWSER_STARTPROCESSING;Comincia a sviluppare -FILEBROWSER_STARTPROCESSINGHINT;Inizia a sviluppare le immagini nella Coda. -FILEBROWSER_STOPPROCESSING;Ferma lo sviluppo -FILEBROWSER_STOPPROCESSINGHINT;Ferma lo sviluppo delle immagini nella Coda. FILEBROWSER_THUMBSIZE;Dimensione miniature -FILEBROWSER_TOOLTIP_STOPPROCESSING;Inizia a sviluppare automaticamente quando un nuovo lavoro viene accodato FILEBROWSER_UNRANK_TOOLTIP;Nessun Punteggio.\nScorciatoia: Shift-0 FILEBROWSER_ZOOMINHINT;Aumenta la dimensione delle miniature.\n\nScorciatoie:\n+ - Modalità a Schede Multiple,\nAlt-+ - Modalità a Schede Singole. FILEBROWSER_ZOOMOUTHINT;Diminuisci la dimensione delle miniature.\n\nScorciatoie:\n- - Modalità a Schede Multiple,\nAlt-- - Modalità a Schede Singole. @@ -386,7 +382,6 @@ HISTORY_MSG_170;Vividezza - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Limita LC -HISTORY_MSG_173;NR - Dettaglio di Luminanza HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adattamento CAT02 HISTORY_MSG_176;CAM02 - Ambiente di Visualizzazione @@ -416,7 +411,6 @@ HISTORY_MSG_200;CAM02 - Tone mapping HISTORY_MSG_201;NR - Crominanza R,G HISTORY_MSG_202;NR - Crominanza B,Y -HISTORY_MSG_203;NR - Metodo HISTORY_MSG_204;Passaggi di miglioramento LMMSE HISTORY_MSG_205;CAM02 - Pixel Surriscaldati/Guasti HISTORY_MSG_206;CAT02 - Lum. automatica della scena @@ -569,8 +563,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Larghezza: %1, Altezza: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Il profilo predefinito per le foto non-raw non può essere trovato o non è stato impostato.\n\nControlla la tua cartella dei profili, potrebbe essere assente o danneggiata.\n\nSaranno utilizzati i valori di default. -OPTIONS_DEFRAW_MISSING;Il profilo predefinito per le foto raw non può essere trovato o non è stato impostato.\n\nControlla la tua cartella dei profili, potrebbe essere assente o danneggiata.\n\nSaranno utilizzati i valori di default. PARTIALPASTE_BASICGROUP;Parametri principali PARTIALPASTE_CACORRECTION;Correzione AC PARTIALPASTE_CHANNELMIXER;Miscelatore Canali @@ -661,7 +653,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Dark Frame PREFERENCES_DARKFRAMEFOUND;Trovati PREFERENCES_DARKFRAMESHOTS;fotogrammi PREFERENCES_DARKFRAMETEMPLATES;modelli @@ -673,13 +664,11 @@ PREFERENCES_DIROTHER;Altra PREFERENCES_DIRSELECTDLG;Seleziona la cartella delle immagini all'avvio... PREFERENCES_DIRSOFTWARE;Cartella d'installazione -PREFERENCES_EDITORCMDLINE;Altra linea di comando PREFERENCES_EDITORLAYOUT;Disposizione PREFERENCES_EXTERNALEDITOR;Programma di ritocco esterni PREFERENCES_FBROWSEROPTS;Opzioni del Navigatore e delle miniature PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Barra di navigazione a singola riga (deseleziona nel caso di schermo a bassa risoluzione) PREFERENCES_FILEFORMAT;Formato file -PREFERENCES_FLATFIELD;Flat Field PREFERENCES_FLATFIELDFOUND;Trovati PREFERENCES_FLATFIELDSDIR;Cartella dei fotogrammi di campo (Flat Field) PREFERENCES_FLATFIELDSHOTS;fotogrammi @@ -995,20 +984,20 @@ TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Raggio TP_DEFRINGE_THRESHOLD;Soglia -TP_DIRPYRDENOISE_BLUE;Crominanza - Blu-Giallo -TP_DIRPYRDENOISE_CHROMA;Crominanza (Principale) +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominanza - Blu-Giallo +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominanza (Principale) +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominanza - Rosso-Verde TP_DIRPYRDENOISE_ENH;Modalità Migliorata TP_DIRPYRDENOISE_ENH_TOOLTIP;Aumenta la qualità della riduzione rumore al costo di un incremento del 20% del tempo di elaborazione. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Riduzione Rumore -TP_DIRPYRDENOISE_LDETAIL;Dettaglio di Luminanza -TP_DIRPYRDENOISE_LUMA;Luminanza -TP_DIRPYRDENOISE_METHOD;Metodo -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Per immagini raw può essere usato il metodo RGB o Lab.\n\nPer immagini non raw verrà utilizzato il metodo Lab, indipendentemente dalla selezione. -TP_DIRPYRDENOISE_RED;Crominanza - Rosso-Verde -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Dettaglio di Luminanza +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminanza +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metodo +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Riduzione Rumore +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Per immagini raw può essere usato il metodo RGB o Lab.\n\nPer immagini non raw verrà utilizzato il metodo Lab, indipendentemente dalla selezione. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Il gamma varia la forza della riduzione rumore su tutto l'intervallo di toni. Valori più piccoli incideranno sulle ombre, mentre valori maggiori estenderanno l'effetto ai toni più luminosi. TP_DIRPYREQUALIZER_ALGO;Algoritmo Pelle TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: più simile ai colori dell'incarnato, minimizzando l'azione di altri colori\nAmpio: evita ulteriori artefatti TP_DIRPYREQUALIZER_HUESKIN;Tonalità della Pelle @@ -1323,7 +1312,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Apri (nuova) finestra di dettaglio ZOOMPANEL_ZOOM100;Ingrandimento al 100%.\nScorciatoia: z -ZOOMPANEL_ZOOMFITSCREEN;Adatta allo schermo.\nScorciatoia: f +ZOOMPANEL_ZOOMFITSCREEN;Adatta allo schermo.\nScorciatoia: Alt-f ZOOMPANEL_ZOOMIN;Ingrandisci.\nScorciatoia: + ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - @@ -1331,6 +1320,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1346,6 +1336,7 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1365,9 +1356,12 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1408,7 +1402,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1583,6 +1577,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1614,23 +1623,29 @@ !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. !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1643,6 +1658,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1651,8 +1672,9 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 @@ -1712,9 +1734,18 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White @@ -1723,10 +1754,10 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1738,6 +1769,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1766,57 +1799,55 @@ !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1838,6 +1869,15 @@ !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. @@ -1866,7 +1906,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1903,6 +1943,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1916,6 +1958,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -2000,6 +2043,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2165,4 +2212,4 @@ !TP_WAVELET_TON;Toning !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru rawtherapee-5.3/rtdata/languages/Japanese rawtherapee-5.4/rtdata/languages/Japanese --- rawtherapee-5.3/rtdata/languages/Japanese 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Japanese 2018-03-20 11:04:15.000000000 +0000 @@ -40,6 +40,7 @@ ABOUT_TAB_SPLASH;スプラッシュ ADJUSTER_RESET_TO_DEFAULT;デフォルト値に戻す BATCHQUEUE_AUTOSTART;オートスタート +BATCHQUEUE_AUTOSTARTHINT;新しいrawファイルが送られて来たら自動的に現像処理を開始します BATCHQUEUE_DESTFILENAME;パスとファイル名 BATCH_PROCESSING;バッチ処理 CURVEEDITOR_AXIS_IN;I: @@ -210,12 +211,7 @@ FILEBROWSER_SHOWTRASHHINT;ゴミ箱の内容を表示\nショートカット: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;カラー・ラベルのない画像を表示\nショートカット: Alt-0 FILEBROWSER_SHOWUNRANKHINT;ランクなし画像を表示\nショートカット: 0 -FILEBROWSER_STARTPROCESSING;処理開始 -FILEBROWSER_STARTPROCESSINGHINT;キューにある画像の処理を開始\n\nショートカット:Ctrl+s -FILEBROWSER_STOPPROCESSING;処理中止 -FILEBROWSER_STOPPROCESSINGHINT;キューにある画像の処理を中止\n\nショートカット:Ctrl+s FILEBROWSER_THUMBSIZE;サムネイルのサイズ -FILEBROWSER_TOOLTIP_STOPPROCESSING;新しいrawファイルが送られて来たら自動的に現像処理を開始します FILEBROWSER_UNRANK_TOOLTIP;ランクなし\nショートカット: Shift-0 FILEBROWSER_ZOOMINHINT;サムネイルサイズの拡大\nショートカット: +\n\nシングル・エディタ・タブのショートカット: Alt-+ FILEBROWSER_ZOOMOUTHINT;サムネイルサイズの縮小\nショートカット: -\n\nシングル・エディタ・タブのショートカット: Alt-- @@ -430,7 +426,6 @@ HISTORY_MSG_170;自然な彩度 - カーブ HISTORY_MSG_171;L*a*b* LC カーブ HISTORY_MSG_172;LCの適用をレッドと肌色トーンだけに制限 -HISTORY_MSG_173;輝度ノイズ 細部の復元 HISTORY_MSG_174;CIE色の見えモデル2002 HISTORY_MSG_175;CAM02 - 色順応量 HISTORY_MSG_176;CAM02 - 観視の暗い周囲環境 @@ -460,7 +455,6 @@ HISTORY_MSG_200;CAM02 - CIECAM02 Q でトーンマッピング HISTORY_MSG_201;色差 レッド/グリーン HISTORY_MSG_202;色差 ブルー/イエロー -HISTORY_MSG_203;ノイズ低減 - 方式 HISTORY_MSG_204;LMMSE 拡張処理 HISTORY_MSG_205;CAM02 ホット/バッドピクセル HISTORY_MSG_206;CAT02 - 自動で順応 @@ -512,7 +506,6 @@ HISTORY_MSG_253;CbDL アーティファクトを軽減 HISTORY_MSG_254;CbDL 肌色の色相 HISTORY_MSG_255;ノイズ低減 - メディアン -HISTORY_MSG_256;ノイズ低減 - フィルターの種類 HISTORY_MSG_257;カラートーン調整 HISTORY_MSG_258;カラートーン調整 - カラーのカーブ HISTORY_MSG_259;カラートーン調整 - 不透明度のカーブ @@ -553,7 +546,6 @@ HISTORY_MSG_294;フィルムシミュレーション - 強さ HISTORY_MSG_295;フィルムシミュレーション - フィルム HISTORY_MSG_296;輝度ノイズ低減のカーブ -HISTORY_MSG_297;ノイズ低減 - 質 HISTORY_MSG_298;デッドピクセルフィルター HISTORY_MSG_299;色ノイズ低減のカーブ HISTORY_MSG_300;- @@ -767,8 +759,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;幅 = %1, 高さ = %2 NAVIGATOR_XY_NA;x = n/a, y = n/a -OPTIONS_DEFIMG_MISSING;rawではない画像のデフォルプロファイルが見つからないか、設定されていません\n\nプロファイル・ディレクトリを確認してください、存在しないか破損しているかもしれません\n\nデフォルト設定値が使用されます -OPTIONS_DEFRAW_MISSING;raw画像のデフォル・プロファイルが見つからないか、設定されていません\n\nプロファイル・ディレクトリを確認してください、存在しないか破損しているかもしれません\n\nデフォルト設定値が使用されます PARTIALPASTE_BASICGROUP;基本設定 PARTIALPASTE_CACORRECTION;色収差補正 PARTIALPASTE_CHANNELMIXER;チャンネル・ミキサー @@ -881,7 +871,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;ダークフレーム PREFERENCES_DARKFRAMEFOUND;検出 PREFERENCES_DARKFRAMESHOTS;ショット PREFERENCES_DARKFRAMETEMPLATES;テンプレート @@ -895,15 +884,12 @@ PREFERENCES_DIROTHER;他 PREFERENCES_DIRSELECTDLG;起動時の画像ディレクトリ選択... PREFERENCES_DIRSOFTWARE;インストール・ディレクトリ -PREFERENCES_EDITORCMDLINE;その他・コマンド入力 PREFERENCES_EDITORLAYOUT;編集 レイアウト PREFERENCES_EXPAUT;高度 PREFERENCES_EXTERNALEDITOR;外部エディタ PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザでの一行のツールバー (低解像度表示用に選択解除) PREFERENCES_FILEFORMAT;ファイル形式 -PREFERENCES_FILMSIMULATION;フィルムシミュレーション -PREFERENCES_FLATFIELD;フラットフィールド PREFERENCES_FLATFIELDFOUND;検出 PREFERENCES_FLATFIELDSDIR;フラットフィールド・ディレクトリ PREFERENCES_FLATFIELDSHOTS;ショット @@ -1053,7 +1039,7 @@ PROGRESSBAR_LOADING;画像読み込み中... PROGRESSBAR_LOADINGTHUMBS;サムネイルの読み込み... PROGRESSBAR_LOADJPEG;JPEGファイル読み込み中... -PROGRESSBAR_LOADPNG;;PNGファイル読み込み中... +PROGRESSBAR_LOADPNG;PNGファイル読み込み中... PROGRESSBAR_LOADTIFF;TIFFファイル読み込み中... PROGRESSBAR_NOIMAGES;画像が見つかりません PROGRESSBAR_PROCESSING;画像処理中... @@ -1297,60 +1283,54 @@ TP_DEFRINGE_LABEL;フリンジ低減 TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 -TP_DIRPYRDENOISE_ABM;色ノイズだけ -TP_DIRPYRDENOISE_AUT;自動(分割方式) -TP_DIRPYRDENOISE_AUTO;自動(分割方式) -TP_DIRPYRDENOISE_AUTO_TOOLTIP;色ノイズ低減の効果を確認して下さい\n注意:設定値の計算はあくまで平均的なもので、かなり主観的でです -TP_DIRPYRDENOISE_BLUE;色差 ブルー/イエロー -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います -TP_DIRPYRDENOISE_CCCURVE;色ノイズ低減のカーブ -TP_DIRPYRDENOISE_CHROMA;色(マスター) -TP_DIRPYRDENOISE_CHROMAFR;色ノイズ -TP_DIRPYRDENOISE_CTYPE;色ノイズの調整法 -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(多分割方式)\nプレビュー画像には反映されません-保存画像だけに反映されます。但し、タイルサイズとその中心をプレビューサイズとその中心にマッチさせる〝プレビュー”方式を使えば、効果がどれ位か予測がつきます。\n画像をタイル状に分割し(タイル数は画像サイズ次第で、10~70枚になります)、各タイルにあった色ノイズ低減の設定を自動で行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います -TP_DIRPYRDENOISE_CUR;カーブ -TP_DIRPYRDENOISE_CURVEEDITOR_CC;色度 -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;色度のスライダーの値を全て増やします(乗数)\nこれは色度に応じて色ノイズの低減効果の強弱を調節するカーブです。例えば、色度の低い部分で低減効果を高めるとか、色度の高い部分で低減効果を緩める、という具合です。 -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;‘輝度’の位置でノイズ低減の強さを加減します +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;自動(多分割方式) +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;自動(分割方式) +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;色ノイズ低減の効果を確認して下さい\n注意:設定値の計算はあくまで平均的なもので、かなり主観的でです +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;色差 ブルー/イエロー +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;色ノイズ低減のカーブ +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色ノイズ +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;手動 +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;色(マスター) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;色ノイズの調整法 +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;手動\n画像全体に作用します\nノイズ低減の設定を手動で行います\n\n自動(分割方式)\n画像全体に作用します\n画像を9つに分割して、そこから全体の色ノイズ低減に適した設定を自動的に行います\n\n自動(多分割方式)\nプレビュー画像には反映されません-保存画像だけに反映されます。但し、タイルサイズとその中心をプレビューサイズとその中心にマッチさせる〝プレビュー”方式を使えば、効果がどれ位か予測がつきます。\n画像をタイル状に分割し(タイル数は画像サイズ次第で、10~70枚になります)、各タイルにあった色ノイズ低減の設定を自動で行います\n\n自動(プレビュー方式)\n画像全体に作用します\nプレビューで見えている画像の一部を使って全体の色ノイズ低減に適した設定を自動で行います +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;自動(プレビュー方式) +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;プレビュー方式 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;ウェーブレット変換後、プレビューで見える部分画像で残ったノイズのレベルを表示します\n\n>300以上 非常にノイズが多い\n100~300 ノイズが多い\n50~100 ノイズが少ない\n50以下 ノイズが非常に少ない\n\n算出値はRGBとL*a*b*モードでは異なります。RGBモードは輝度と色を完全に切り離すことが出来ないので、算出値の精度は劣ります。 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;プレビューのサイズ=%1, 中心: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;プレビューのノイズ: 中間色度=%1 高色度=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;プレビューのノイズ: 中間色度= - 高色度= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;色差 レッド/グリーン TP_DIRPYRDENOISE_ENH;強化モード TP_DIRPYRDENOISE_ENH_TOOLTIP;ノイズ低減の効果を髙めますが、代わりに演算時間が約20%増えます。 -TP_DIRPYRDENOISE_GAMMA;ガンマ -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;ガンマは、トーンの範囲全体でノイズ低減の量を変化させます。値が大きいほど明るいトーンに効果を及ぼし、値が小さいほどシャドウをターゲットにします -TP_DIRPYRDENOISE_LAB;L*a*b* -TP_DIRPYRDENOISE_LABEL;ノイズ低減 -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;輝度カーブ -TP_DIRPYRDENOISE_LDETAIL;輝度 細部の復元 -TP_DIRPYRDENOISE_LM;輝度のみ -TP_DIRPYRDENOISE_LPLABM;加重平均 L* (少なめ) + a*b* (普通) -TP_DIRPYRDENOISE_LTYPE;輝度ノイズの調整法 -TP_DIRPYRDENOISE_LUMA;輝度 -TP_DIRPYRDENOISE_LUMAFR;輝度ノイズ -TP_DIRPYRDENOISE_MAN;手動 -TP_DIRPYRDENOISE_MANU;手動 -TP_DIRPYRDENOISE_MED;メディアンフィルター -TP_DIRPYRDENOISE_MEDMETHOD;方式 -TP_DIRPYRDENOISE_MEDTYPE;フィルターの種類 -TP_DIRPYRDENOISE_METHOD;方式 -TP_DIRPYRDENOISE_METHOD11;ノイズ低減の質 -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;ノイズの状態に応じて低減効果の質を選べます:1-標準 2-高い\n2の方がノイズ低減効果は高くなりますが、その分処理時間が増えます。 -TP_DIRPYRDENOISE_METHOD_TOOLTIP;raw画像は、RGBまたはL*a*b*方式のいずれかを使用することができます。\n\nraw以外の画像は、選択にかかわらずL*a*b*方式が採用されます -TP_DIRPYRDENOISE_METM_TOOLTIP;フィルタリングの方式で、"輝度のみ"と"L*a*b*"を選択した場合、メディアンフィルタリングはノイズ低減行程でウェーブレット変換が行われた直後に適用されます\n"RGB"モードの場合は、ノイズ低減行程の最後で適用されます -TP_DIRPYRDENOISE_NOISELABEL;プレビューのノイズ: 中間色度=%1 高色度=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;プレビューのノイズ: 中間色度= - 高色度= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;ウェーブレット変換後、プレビューで見える部分画像で残ったノイズのレベルを表示します\n\n>300以上 非常にノイズが多い\n100~300 ノイズが多い\n50~100 ノイズが少ない\n50以下 ノイズが非常に少ない\n\n算出値はRGBとL*a*b*モードでは異なります。RGBモードは輝度と色を完全に切り離すことが出来ないので、算出値の精度は劣ります。 -TP_DIRPYRDENOISE_PASSES;フィルタリングの繰り返し回数 -TP_DIRPYRDENOISE_PON;自動(多分割方式) -TP_DIRPYRDENOISE_PRE;自動(プレビュー方式) -TP_DIRPYRDENOISE_PREV;プレビュー方式 -TP_DIRPYRDENOISE_PREVLABEL;プレビューのサイズ=%1, 中心: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;色差 レッド/グリーン -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;標準 -TP_DIRPYRDENOISE_SHALBI;高い +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;輝度ノイズの調整法 +TP_DIRPYRDENOISE_LUMINANCE_CURVE;輝度カーブ +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;輝度 細部の復元 +TP_DIRPYRDENOISE_LUMINANCE_FRAME;輝度ノイズ +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;輝度 +TP_DIRPYRDENOISE_MAIN_COLORSPACE;方式 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;ノイズ低減 +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;raw画像は、RGBまたはL*a*b*方式のいずれかを使用することができます。\n\nraw以外の画像は、選択にかかわらずL*a*b*方式が採用されます +TP_DIRPYRDENOISE_MAIN_GAMMA;ガンマ +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;ガンマは、トーンの範囲全体でノイズ低減の量を変化させます。値が大きいほど明るいトーンに効果を及ぼし、値が小さいほどシャドウをターゲットにします +TP_DIRPYRDENOISE_MAIN_MODE;ノイズ低減の質 +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;高い +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;標準 +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;ノイズの状態に応じて低減効果の質を選べます:1-標準 2-高い\n2の方がノイズ低減効果は高くなりますが、その分処理時間が増えます。 +TP_DIRPYRDENOISE_MEDIAN_METHOD;方式 +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;色ノイズだけ +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;メディアンフィルター +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;輝度のみ +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;フィルタリングの方式で、"輝度のみ"と"L*a*b*"を選択した場合、メディアンフィルタリングはノイズ低減行程でウェーブレット変換が行われた直後に適用されます\n"RGB"モードの場合は、ノイズ低減行程の最後で適用されます +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;加重平均 L* (少なめ) + a*b* (普通) +TP_DIRPYRDENOISE_MEDIAN_PASSES;フィルタリングの繰り返し回数 +TP_DIRPYRDENOISE_MEDIAN_TYPE;フィルターの種類 TP_DIRPYRDENOISE_SLI;スライダー -TP_DIRPYRDENOISE_TILELABEL;タイルのサイズ=%1, 中心位置: X座標=%2 Y座標=%3 TP_DIRPYREQUALIZER_ALGO;肌色の範囲 TP_DIRPYREQUALIZER_ALGO_TOOLTIP;ファイン:撮影の肌色に近い部分に働くアルゴリズム、他の色への影響を最小限に抑えます\n広範: アーティファクトの増加を避けるアルゴリズムです TP_DIRPYREQUALIZER_ARTIF;アーティファクトを軽減 @@ -1866,8 +1846,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;新規ディテール ウィンドウを開く ZOOMPANEL_ZOOM100;100%にズーム\nショートカット: z -ZOOMPANEL_ZOOMFITCROPSCREEN;切り抜き画像を画面に合わせる\nショートカット: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカット: f +ZOOMPANEL_ZOOMFITCROPSCREEN;切り抜き画像を画面に合わせる\nショートカット: f +ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカット: Alt-f ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: + ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - @@ -1875,6 +1855,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !DONT_SHOW_AGAIN;Don't show this message again. !DYNPROFILEEDITOR_DELETE;Delete !DYNPROFILEEDITOR_EDIT;Edit @@ -1885,6 +1866,7 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_PIPELINE;Processing pipeline !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) @@ -1894,8 +1876,13 @@ !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !GENERAL_APPLY;Apply !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_407;Retinex - Method !HISTORY_MSG_408;Retinex - Radius !HISTORY_MSG_409;Retinex - Contrast @@ -1961,6 +1948,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1992,16 +1994,33 @@ !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. !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_LANG;Language !PREFERENCES_MONINTENT;Default rendering intent @@ -2022,9 +2041,18 @@ !PREFERENCES_THEME;Theme !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White @@ -2033,23 +2061,38 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !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_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_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_BPC;Black Point Compensation !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_RAWCACORR_CASTR;Strength !TP_RAW_1PASSMEDIUM;1-Pass (Medium) @@ -2062,7 +2105,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -2099,6 +2142,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -2112,6 +2157,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* @@ -2193,5 +2239,9 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". diff -Nru rawtherapee-5.3/rtdata/languages/Latvian rawtherapee-5.4/rtdata/languages/Latvian --- rawtherapee-5.3/rtdata/languages/Latvian 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Latvian 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Rādīt attēlus ar 5 zvaigznēm FILEBROWSER_SHOWTRASHHINT;Rādīt atkritni FILEBROWSER_SHOWUNRANKHINT;Rādīt nevērtētus attēlus -FILEBROWSER_STARTPROCESSING;Sākt apstrādi -FILEBROWSER_STARTPROCESSINGHINT;Sākt attēlu rindas apstrādi/saglabāšanu -FILEBROWSER_STOPPROCESSING;Apturēt apstrādi -FILEBROWSER_STOPPROCESSINGHINT;Apturēt attēlu apstrādi FILEBROWSER_THUMBSIZE;Sīktēlu izmērs FILEBROWSER_ZOOMINHINT;Palielināt sīktēlus FILEBROWSER_ZOOMOUTHINT;Samazināt sīktēlus @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Cita PREFERENCES_DIRSELECTDLG;Izvēlies attēlu mapi sākumam... PREFERENCES_DIRSOFTWARE;Uzstādīšanas mape -PREFERENCES_EDITORCMDLINE;Cita komandrinda PREFERENCES_EXTERNALEDITOR;Ārējais redaktors PREFERENCES_FBROWSEROPTS;Failu pārlūka iespējas PREFERENCES_FILEFORMAT;Faila formāts @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Magyar rawtherapee-5.4/rtdata/languages/Magyar --- rawtherapee-5.3/rtdata/languages/Magyar 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Magyar 2018-03-20 11:04:15.000000000 +0000 @@ -7,6 +7,7 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Alaphelyzetbe állítás BATCHQUEUE_AUTOSTART;Auto start +BATCHQUEUE_AUTOSTARTHINT;Új kép érkezése esetén a feldolgozás automatikus indítása. BATCH_PROCESSING;Kötegelt feldolgozás CURVEEDITOR_CURVE;Görbe CURVEEDITOR_CURVES;Görbék @@ -143,12 +144,7 @@ FILEBROWSER_SHOWTRASHHINT;A kuka tartalmának mutatása FILEBROWSER_SHOWUNCOLORHINT;Színcímke nélküli képek megjelenítése.\nGyorsbillentyű: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Meg nem jelölt képek mutatása -FILEBROWSER_STARTPROCESSING;Feldolgozás indítása -FILEBROWSER_STARTPROCESSINGHINT;A sorban álló képek feldolgozásának elindítása -FILEBROWSER_STOPPROCESSING;Feldolgozás leállítása -FILEBROWSER_STOPPROCESSINGHINT;A sorban álló képek feldolgozásának leállítása FILEBROWSER_THUMBSIZE;Bélyegméret -FILEBROWSER_TOOLTIP_STOPPROCESSING;Új kép érkezése esetén a feldolgozás automatikus indítása. FILEBROWSER_ZOOMINHINT;Növelés FILEBROWSER_ZOOMOUTHINT;Csökkentés GENERAL_ABOUT;Névjegy @@ -493,7 +489,6 @@ PREFERENCES_CUSTPROFBUILDHINT;Executable (or script) file called when a new initial profile should be generated for an image.\nReceives command line params to allow a rules based .pp3 generation:\n[Path raw/JPG] [Path default profile] [f-no] [exposure in secs] [focal length in mm] [ISO] [Lens] [Camera] PREFERENCES_CUSTPROFBUILDPATH;Indítóállomány útvonala PREFERENCES_CUTOVERLAYBRUSH;Vágás maszkjának színe/áttetszősége -PREFERENCES_DARKFRAME;Fekete referenciakép (dark frame) PREFERENCES_DARKFRAMEFOUND;Találat PREFERENCES_DARKFRAMESHOTS;kép PREFERENCES_DARKFRAMETEMPLATES;sablonok @@ -505,13 +500,11 @@ PREFERENCES_DIROTHER;Más PREFERENCES_DIRSELECTDLG;Képek könyvtára induláskor... PREFERENCES_DIRSOFTWARE;Telepítés helye -PREFERENCES_EDITORCMDLINE;Egyéb parancssor PREFERENCES_EDITORLAYOUT;Szerkesztési mód PREFERENCES_EXTERNALEDITOR;Külső képszerkesztő program PREFERENCES_FBROWSEROPTS;Állományböngésző beállításai PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Egysoros állományböngésző eszköztár (alacsony felbontás esetén hagyd üresen) PREFERENCES_FILEFORMAT;Állományformátum -PREFERENCES_FLATFIELD;Flat Field PREFERENCES_FLATFIELDFOUND;Találat PREFERENCES_FLATFIELDSDIR;Flat Fields könyvtár PREFERENCES_FLATFIELDSHOTS;kép @@ -653,10 +646,10 @@ TP_DEFRINGE_LABEL;Színihiba-javítás (defringe) TP_DEFRINGE_RADIUS;Sugár TP_DEFRINGE_THRESHOLD;Küszöb -TP_DIRPYRDENOISE_CHROMA;Színzaj -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_LABEL;Zajcsökkentés -TP_DIRPYRDENOISE_LUMA;Luminancia +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Színzaj +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Zajcsökkentés +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma TP_DIRPYREQUALIZER_LABEL;Kontraszt részletek szerint TP_DIRPYREQUALIZER_LUMACOARSEST;Durva részletek TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontraszt- @@ -865,7 +858,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;(Új) lupe megnyitása ZOOMPANEL_ZOOM100;Nagyítás 100%-ra z -ZOOMPANEL_ZOOMFITSCREEN;Képernyő méretéhez igazítás f +ZOOMPANEL_ZOOMFITSCREEN;Képernyő méretéhez igazítás Alt-f ZOOMPANEL_ZOOMIN;Nagyítás + ZOOMPANEL_ZOOMOUT;Kicsinyítés - @@ -874,6 +867,7 @@ !!!!!!!!!!!!!!!!!!!!!!!!! !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -891,6 +885,7 @@ !DYNPROFILEEDITOR_PROFILE;Processing Profile !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps @@ -937,6 +932,7 @@ !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. @@ -948,7 +944,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -978,7 +974,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -1030,7 +1026,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1071,7 +1067,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1246,6 +1242,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1285,9 +1296,9 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1304,8 +1315,10 @@ !NAVIGATOR_S;S: !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 !PARTIALPASTE_COLORTONING;Color toning @@ -1314,6 +1327,8 @@ !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_GRADIENT;Graduated filter !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1321,9 +1336,9 @@ !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1344,6 +1359,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1359,8 +1380,9 @@ !PREFERENCES_D65;6500K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 !PREFERENCES_FLUOF11;Fluorescent F11 @@ -1447,6 +1469,15 @@ !PROGRESSBAR_NOIMAGES;No images found !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1455,8 +1486,8 @@ !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1600,14 +1631,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1619,6 +1650,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1648,64 +1681,60 @@ !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1720,6 +1749,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 !TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 @@ -1804,6 +1835,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PCVIGNETTE_FEATHER;Feather !TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. @@ -1836,7 +1876,7 @@ !TP_RAW_DCB;DCB !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1844,7 +1884,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps !TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. @@ -1883,6 +1923,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1896,6 +1938,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1984,6 +2027,10 @@ !TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity mode allows to vary the contribution of R, G and B channels to the luminosity of the image, without altering image color. !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple @@ -2164,4 +2211,4 @@ !TP_WBALANCE_WATER1;UnderWater 1 !TP_WBALANCE_WATER2;UnderWater 2 !TP_WBALANCE_WATER_HEADER;UnderWater -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru rawtherapee-5.3/rtdata/languages/Nederlands rawtherapee-5.4/rtdata/languages/Nederlands --- rawtherapee-5.3/rtdata/languages/Nederlands 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Nederlands 2018-03-20 11:04:15.000000000 +0000 @@ -22,6 +22,7 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Terug naar beginwaarde BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Start verwerking automatisch wanneer nieuwe foto arriveert BATCHQUEUE_DESTFILENAME;Pad en bestandsnaam BATCH_PROCESSING;Batch-verwerking CURVEEDITOR_AXIS_IN;I: @@ -208,12 +209,7 @@ FILEBROWSER_SHOWTRASHHINT;Toon inhoud prullenbak\nSneltoets: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Toon foto's zonder kleurlabel.\nSneltoets: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Toon foto's zonder sterwaardering.\nSneltoets: 0 -FILEBROWSER_STARTPROCESSING;Start verwerking -FILEBROWSER_STARTPROCESSINGHINT;Start verwerking van bestanden in verwerkingsrij -FILEBROWSER_STOPPROCESSING;Stop verwerking -FILEBROWSER_STOPPROCESSINGHINT;Stop verwerking van bestanden in verwerkingsrij FILEBROWSER_THUMBSIZE;Miniaturen -FILEBROWSER_TOOLTIP_STOPPROCESSING;Start verwerking automatisch wanneer nieuwe foto arriveert FILEBROWSER_UNRANK_TOOLTIP;Verwijder sterwaardering\nSneltoets: Shift-0 FILEBROWSER_ZOOMINHINT;Groter FILEBROWSER_ZOOMOUTHINT;Kleiner @@ -431,7 +427,6 @@ HISTORY_MSG_170;Levendigheid curve HISTORY_MSG_171;L*a*b* - LC curve HISTORY_MSG_172;L*a*b* - Beperk LC -HISTORY_MSG_173;RO - Luminantie Detail HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 toepassing HISTORY_MSG_176;CAM02 - Weergave omgeving @@ -461,7 +456,6 @@ HISTORY_MSG_200;CAM02 - Tonemapping HISTORY_MSG_201;RO - Chromin. rood-groen HISTORY_MSG_202;RO - Chromin. blauw-geel -HISTORY_MSG_203;RO - Methode HISTORY_MSG_204;LMMSE Verbetering HISTORY_MSG_205;CAM02 hete/dode pixels HISTORY_MSG_206;CAT02 - Opname Lum. Auto @@ -513,7 +507,6 @@ HISTORY_MSG_253;DC - Verminder artefacten HISTORY_MSG_254;DC - Huidtint HISTORY_MSG_255;DC - Algoritme -HISTORY_MSG_256;RO - Mediaan Type HISTORY_MSG_257;Kleurtint HISTORY_MSG_258;KT - Kleur curve HISTORY_MSG_259;KT - Dekking @@ -554,7 +547,6 @@ HISTORY_MSG_294;Film - Sterkte HISTORY_MSG_295;Film - Film HISTORY_MSG_296;RO - Luminantie curve -HISTORY_MSG_297;RO - Kwaliteit HISTORY_MSG_298;Dode pixels filter HISTORY_MSG_299;RO - Chrominantie curve HISTORY_MSG_300;- @@ -846,8 +838,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Breedte: %1, Hoogte: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Het standaard profiel voor non-raw foto's kan niet worden gevonden of is niet ingesteld.\n\nControleer de map met de profielen, deze kan missen of beschadigd zijn.\n\nDe standaard waarden zullen worden gebruikt. -OPTIONS_DEFRAW_MISSING;Het standaard profiel voor raw foto's kan niet worden gevonden of is niet ingesteld.\n\nControleer de map met de profielen, deze kan missen of beschadigd zijn.\n\nDe standaard waarden zullen worden gebruikt. PARTIALPASTE_BASICGROUP;Basisinstellingen PARTIALPASTE_CACORRECTION;C/A-correctie PARTIALPASTE_CHANNELMIXER;Kleurkanaal mixer @@ -966,7 +956,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Donkerframe PREFERENCES_DARKFRAMEFOUND;Gevonden PREFERENCES_DARKFRAMESHOTS;foto's PREFERENCES_DARKFRAMETEMPLATES;sjablonen @@ -980,15 +969,12 @@ PREFERENCES_DIROTHER;Anders PREFERENCES_DIRSELECTDLG;Selecteer standaardmap bij opstarten... PREFERENCES_DIRSOFTWARE;Installatiemap -PREFERENCES_EDITORCMDLINE;Andere editor, geef pad PREFERENCES_EDITORLAYOUT;Bewerkingsvenster PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externe editor PREFERENCES_FBROWSEROPTS;Opties bestandsnavigator PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Enkele rij navigator werkbalk (de-activeer voor lage resolutie) PREFERENCES_FILEFORMAT;Bestandstype -PREFERENCES_FILMSIMULATION;Film Simuleren -PREFERENCES_FLATFIELD;Vlakveldopname (tbv. vignetteringscorrectie) PREFERENCES_FLATFIELDFOUND;Gevonden PREFERENCES_FLATFIELDSDIR;Vlakveldmap PREFERENCES_FLATFIELDSHOTS;foto's @@ -1184,8 +1170,6 @@ SAVEDLG_TIFFUNCOMPRESSED;Geen compressie SAVEDLG_WARNFILENAME;Bestandsnaam wordt SHCSELECTOR_TOOLTIP;Klik op de rechtermuisknop om\nde 3 knoppen te verschuiven -SOFTPROOF_GAMUTCHECK_TOOLTIP;Toont in grijs de pixels die buiten het kleurengamma vallen van het uitvoerprofiel -SOFTPROOF_TOOLTIP;Proefafdruk\nSimuleert grafische weergave op basis van het ICM uitvoerprofiel. Voral bruikbaar voor het simuleren van afdrukken. THRESHOLDSELECTOR_B;Onderkant THRESHOLDSELECTOR_BL;Onderkant-links THRESHOLDSELECTOR_BR;Onderkant-rechts @@ -1405,69 +1389,63 @@ TP_DEFRINGE_LABEL;Verzachten (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Straal TP_DEFRINGE_THRESHOLD;Drempel -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 zacht -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 zacht -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Alleen chroma -TP_DIRPYRDENOISE_AUT;Automatisch algemeen -TP_DIRPYRDENOISE_AUTO;Automatisch algemeen -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Probeert chroma ruis te bepalen\nWees voorzichtig, deze berekening is een gemiddelde en kan subjectief zijn! -TP_DIRPYRDENOISE_BLUE;Chrominantie Blauw & Geel -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nVoorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. -TP_DIRPYRDENOISE_CCCURVE;Chrominantie curve -TP_DIRPYRDENOISE_CHROMA;Chrominantie (master) -TP_DIRPYRDENOISE_CHROMAFR;Chrominantie -TP_DIRPYRDENOISE_CTYPE;Auto methode -TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nAutomatisch multi-zones\nGeen voorbeeld - werkt alleen bij opslaan. Gebruik de "Voorbeeld" methode om een idee te krijgen van het verwachte resultaat door de tegelgrootte en het centrum van het voorbeeld te matchen.\nDe afbeelding is verdeeld in tegels (10 tot 70 afhankelijk van de afbeeldingsgrootte) en van elke tegel wordt de eigen chroma ruisonderdrukking bepaald.\n\Voorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. -TP_DIRPYRDENOISE_CUR;Curve -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Vergroot (vermenigvuldigt) de waarde van alle chrominantie schuifbalken.\nMet deze curve kun je de sterkte aanpassen van de chromatische ruisonderdrukking. Bijvoorbeeld door de werking te vergroten in gebieden met lage verzadiging en te verminderen in gebieden met hoge verzadiging. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Luminantie ruisonderdrukking. Werkt niet lineair maar modulerend +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zone +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisch algemeen +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Probeert chroma ruis te bepalen\nWees voorzichtig, deze berekening is een gemiddelde en kan subjectief zijn! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominantie Blauw & Geel +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominantie curve +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominantie +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Handmatig +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominantie (master) +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Auto methode +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nVoorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Handmatig\nWerkt op de hele afbeelding.\nDe instellingen voor ruisonderdrukking moeten zelf worden bepaald.\n\nAutomatisch algemeen\nWerkt op de hele afbeelding.\n9 gebieden worden gebruikt om de chroma ruisonderdrukking te bepalen.\n\nAutomatisch multi-zones\nGeen voorbeeld - werkt alleen bij opslaan. Gebruik de "Voorbeeld" methode om een idee te krijgen van het verwachte resultaat door de tegelgrootte en het centrum van het voorbeeld te matchen.\nDe afbeelding is verdeeld in tegels (10 tot 70 afhankelijk van de afbeeldingsgrootte) en van elke tegel wordt de eigen chroma ruisonderdrukking bepaald.\n\Voorbeeld\nWerkt op de hele afbeelding.\nHet deel van de afbeelding dat zichtbaar is in het voorbeeld wordt gebruikt om de chroma ruisonderdrukking te bepalen. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Voorbeeld multi-zone +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Voorbeeld +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Voorbeeld grootte=%1, Centrum: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominantie Rood & Groen TP_DIRPYRDENOISE_ENH;Verbeteren TP_DIRPYRDENOISE_ENH_TOOLTIP;Verbetert de ruisonderdrukking, maar vergroot de verwerkingstijd met ongeveer 20% -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varieert de mate van ruisonderdrukking over het bereik van tinten. Kleinere waarden beperken zich tot schaduwen, terwijl grotere waarden het bereik oprekken tot heldere tinten -TP_DIRPYRDENOISE_LAB;L*a*b* -TP_DIRPYRDENOISE_LABEL;Ruisonderdrukking -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminantie curve -TP_DIRPYRDENOISE_LDETAIL;Luminantie Detail -TP_DIRPYRDENOISE_LM;Alleen Luminantie -TP_DIRPYRDENOISE_LPLABM;Gewogen L* (weinig) + a*b* (normaal) -TP_DIRPYRDENOISE_LTYPE;Type gereedschap -TP_DIRPYRDENOISE_LUMA;Luminantie -TP_DIRPYRDENOISE_LUMAFR;Luminantie -TP_DIRPYRDENOISE_MAN;Handmatig -TP_DIRPYRDENOISE_MANU;Handmatig -TP_DIRPYRDENOISE_MED;Mediaan filter -TP_DIRPYRDENOISE_MEDMETHOD;Methode -TP_DIRPYRDENOISE_MEDTYPE;Type -TP_DIRPYRDENOISE_METHOD;Methode -TP_DIRPYRDENOISE_METHOD11;Kwaliteit -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Voor raw afbeeldingen kan RGB of Lab methode worden gebruikt.\n\nVoor niet-raw afbeeldingen zal altijd de Lab methode worden gebruikt, ongeacht de geselecteerde methode. -TP_DIRPYRDENOISE_METM_TOOLTIP;De "Alleen Luminantie" en "L*a*b*" methodes worden meteen na de wavelet stap uitgevoerd bij het onderdrukken van ruis.\nDe "RGB" methode, wordt echter als laatste stap uitgevoerd bij ruisonderdrukking. -TP_DIRPYRDENOISE_MET_TOOLTIP;Gebruik een mediaan filter van gewenste venster grootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandeld 5 pixels in een 3×3 pixel venster.\n3×3: behandeld 9 pixels in een 3×3 pixel venster.\n5×5 zacht: behandeld 13 pixels in een 5×5 pixel venster.\n5×5: behandeld 25 pixels in een 5×5 pixel venster.\n7×7: behandeld 49 pixels in een 7×7 pixel venster.\n9×9: behandeld 81 pixels in a 9×9 pixel venster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. -TP_DIRPYRDENOISE_NOISELABEL;Voorbeeld ruis: Gemiddeld=%1 Hoog=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Voorbeeld ruis: Gemiddeld= - Hoog= - -TP_DIRPYRDENOISE_NRESID_TOOLTIP;Toont de overgebleven ruisniveaus van het zichtbare deel van de afbeelding in het voorbeeld na wavelet.\n\n>300 Veel ruis\n100-300 Gemiddeld ruis\n50-100 Weinig ruis\n<50 Zeer weinig ruis\n\nVoorzichtig, de waarden zullen verschillen tussen RGB en L*a*b* mode. De RGB waarden zijn minder accuraat omdat de RGB mode luminantie en chrominantie niet volledig scheidt. +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Type gereedschap +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminantie curve +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminantie Detail +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminantie +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminantie +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Methode +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Ruisonderdrukking +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Voor raw afbeeldingen kan RGB of Lab methode worden gebruikt.\n\nVoor niet-raw afbeeldingen zal altijd de Lab methode worden gebruikt, ongeacht de geselecteerde methode. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varieert de mate van ruisonderdrukking over het bereik van tinten. Kleinere waarden beperken zich tot schaduwen, terwijl grotere waarden het bereik oprekken tot heldere tinten +TP_DIRPYRDENOISE_MAIN_MODE;Kwaliteit +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hoog +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standaard +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;De kwaliteit kan worden aangepast aan de hoeveelheid ruis. \nHoog verbetert de ruisonderdrukking, maar verlengt de verwerkingstijd +TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Alleen chroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Mediaan filter +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Alleen Luminantie +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;De "Alleen Luminantie" en "L*a*b*" methodes worden meteen na de wavelet stap uitgevoerd bij het onderdrukken van ruis.\nDe "RGB" methode, wordt echter als laatste stap uitgevoerd bij ruisonderdrukking. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Gewogen L* (weinig) + a*b* (normaal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Mediaan herhalingen +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Het gebruik van drie mediaan filter herhalingen met een 3×3 venster grootte geeft meestal een beter resultaat dan het gebruik van één mediaan filter herhaling met eeen 7×7 venster grootte. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Type +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Gebruik een mediaan filter van gewenste venster grootte. Hoe groter het venster hoe langer het duurt.\n\n3×3 zacht: behandeld 5 pixels in een 3×3 pixel venster.\n3×3: behandeld 9 pixels in een 3×3 pixel venster.\n5×5 zacht: behandeld 13 pixels in een 5×5 pixel venster.\n5×5: behandeld 25 pixels in een 5×5 pixel venster.\n7×7: behandeld 49 pixels in een 7×7 pixel venster.\n9×9: behandeld 81 pixels in a 9×9 pixel venster.\n\nSoms is het mogelijk om een betere kwaliteit te krijgen door het uitvoeren van meerdere herhalingen met een kleiner venster dan één uitvoering met een groter venster. TP_DIRPYRDENOISE_PASSE;Herhalingen -TP_DIRPYRDENOISE_PASSES;Mediaan herhalingen -TP_DIRPYRDENOISE_PASSES_TOOLTIP;Het gebruik van drie mediaan filter herhalingen met een 3×3 venster grootte geeft meestal een beter resultaat dan het gebruik van één mediaan filter herhaling met eeen 7×7 venster grootte. -TP_DIRPYRDENOISE_PON;Auto multi-zone -TP_DIRPYRDENOISE_PRE;Voorbeeld multi-zone -TP_DIRPYRDENOISE_PREV;Voorbeeld -TP_DIRPYRDENOISE_PREVLABEL;Voorbeeld grootte=%1, Centrum: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Chrominantie Rood & Groen -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standaard -TP_DIRPYRDENOISE_SHALBI;Hoog TP_DIRPYRDENOISE_SLI;Schuifbalk -TP_DIRPYRDENOISE_TILELABEL;Tegel grootte=%1, Centrum: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 zacht +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 zacht +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Algoritme Huid TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fijn: behoud de kleuren van de huid, minimaliseert de actie op andere kleuren\nGroot: vermijd artefacten TP_DIRPYREQUALIZER_ARTIF;Verminder artefacten @@ -2130,8 +2108,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Open (nieuw) detailvenster ZOOMPANEL_ZOOM100;Zoom naar 100%\nSneltoets: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Maak uitsnede passend in het scherm\nSneltoets: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Passend in venster\nSneltoets: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Maak uitsnede passend in het scherm\nSneltoets: f +ZOOMPANEL_ZOOMFITSCREEN;Passend in venster\nSneltoets: Alt-f ZOOMPANEL_ZOOMIN;Zoom in\nSneltoets: + ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - @@ -2139,8 +2117,15 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !DONT_SHOW_AGAIN;Don't show this message again. +!EXIFPANEL_SHOWALL;Show all +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_475;PS - Equalize channel !HISTORY_MSG_476;CAM02 - Temp out @@ -2155,31 +2140,96 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters !LENSPROFILE_CORRECTION_LCPFILE;LCP File !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !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. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_LANG;Language !PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file !PREFERENCES_PROFILESAVELOCATION;Processing profile saving location !PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now !PREFERENCES_THEME;Theme +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!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_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel !TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels. +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. +!TP_RAW_RCD;RCD !TP_RETINEX_GAINOFFS;Gain and Offset (brightness) !TP_RETINEX_GAINTRANSMISSION;Gain transmission !TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Norsk BM" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Norsk BM" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Norsk BM" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Norsk BM" 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Vis bilder rangert med 5 stjerne FILEBROWSER_SHOWTRASHHINT;Vis innholdet i søpla FILEBROWSER_SHOWUNRANKHINT;Vis unrangerte bilder -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Begynn prosessering/lagring av bilder i køen -FILEBROWSER_STOPPROCESSING;Stopp prosesseringen -FILEBROWSER_STOPPROCESSINGHINT;Stopp prosesseringen av bilder FILEBROWSER_THUMBSIZE;Thumbnail størrelse FILEBROWSER_ZOOMINHINT;Øk thumbnail størrelse FILEBROWSER_ZOOMOUTHINT;Reduser thumbnail størrelse @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Annen PREFERENCES_DIRSELECTDLG;Velg bildemappe ved oppstart... PREFERENCES_DIRSOFTWARE;Installasjons-mappe -PREFERENCES_EDITORCMDLINE;Annen kommandolinje PREFERENCES_EXTERNALEDITOR;Ekstern editor PREFERENCES_FBROWSEROPTS;Filfremviser-innstillinger PREFERENCES_FILEFORMAT;Filformat @@ -426,7 +421,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -462,6 +459,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -556,7 +554,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -574,6 +571,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -672,7 +670,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -702,7 +700,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -754,7 +752,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -795,7 +793,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -970,6 +968,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1021,6 +1034,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1030,8 +1045,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1060,8 +1073,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1087,6 +1102,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1106,13 +1123,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1137,6 +1154,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1154,18 +1177,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1291,6 +1313,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1301,8 +1332,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1447,14 +1478,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1466,6 +1497,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1503,68 +1536,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1594,6 +1622,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1715,6 +1745,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1764,7 +1803,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1772,7 +1811,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1812,6 +1851,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1825,6 +1866,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1934,6 +1976,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2160,7 +2206,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Polish rawtherapee-5.4/rtdata/languages/Polish --- rawtherapee-5.3/rtdata/languages/Polish 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Polish 2018-03-20 11:04:15.000000000 +0000 @@ -15,6 +15,7 @@ ABOUT_TAB_SPLASH;Ekran powitalny ADJUSTER_RESET_TO_DEFAULT;Przywróć domyślne BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Rozpocznij przetwarzanie automatycznie gdy pojawi się nowe zadanie. BATCHQUEUE_DESTFILENAME;Ścieżka i nazwa pliku BATCH_PROCESSING;Przetwarzanie wsadowe CURVEEDITOR_CURVE;Krzywa @@ -178,12 +179,7 @@ FILEBROWSER_SHOWTRASHHINT;Pokazuje zawartość kosza.\nSkrót: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Pokazuje zdjęcia bez kolorowej etykiety.\nSkrót: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Pokazuje nieocenione zdjęcia.\nSkrót: 0 -FILEBROWSER_STARTPROCESSING;Rozpocznij przetwarzanie -FILEBROWSER_STARTPROCESSINGHINT;Rozpoczyna przetwarzanie/zapisywanie plików z kolejki. -FILEBROWSER_STOPPROCESSING;Zatrzymaj przetwarzanie -FILEBROWSER_STOPPROCESSINGHINT;Zatrzymuje przetwarzanie zdjęć. FILEBROWSER_THUMBSIZE;Rozmiar minaturek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Rozpocznij przetwarzanie automatycznie gdy pojawi się nowe zadanie. FILEBROWSER_UNRANK_TOOLTIP;Usuń ocenę.\nSkrót: Shift-0 FILEBROWSER_ZOOMINHINT;Zwiększa rozmiar miniaturek.\n\nSkróty:\n+ - Tryb wielu zakładek,\nAlt-+ - Tryb pojedyńczej zakładki. FILEBROWSER_ZOOMOUTHINT;Zmniejsza rozmiar miniaturek.\n\nSkróty:\n- - Tryb wielu zakładek,\nAlt-- - Tryb pojedyńczej zakładki. @@ -390,7 +386,6 @@ HISTORY_MSG_170;Jaskrawość - Krzywa HH HISTORY_MSG_171;L*a*b* - Krzywa LC HISTORY_MSG_172;L*a*b* - Ogranicz LC -HISTORY_MSG_173;RS - Szczegóły luminancji HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptacja CAT02 HISTORY_MSG_176;CAM02 - Otoczenie @@ -420,7 +415,6 @@ HISTORY_MSG_200;CAMO2 - Tone mapping HISTORY_MSG_201;RS - Chrominancja - R&G HISTORY_MSG_202;RS - Chrominancja - B&Y -HISTORY_MSG_203;RS - Metoda HISTORY_MSG_204;Kroki poprawy LMMSE HISTORY_MSG_205;CAM02 - Gorące/uszkodzone px HISTORY_MSG_206;CAT02 - Auto luminancja sceny @@ -472,7 +466,6 @@ HISTORY_MSG_253;KwgPS - Redukcja błędów HISTORY_MSG_254;KwgPS - Odcienie skóry HISTORY_MSG_255;RS - Filtr mediana -HISTORY_MSG_256;RS - Wielkość okna mediana HISTORY_MSG_257;Koloryzacja HISTORY_MSG_258;Koloryzacja - Kolor HISTORY_MSG_259;Koloryzacja - Przezroczystość @@ -513,7 +506,6 @@ HISTORY_MSG_294;Symulacja Kliszy - Siła HISTORY_MSG_295;Symulacja Kliszy - Klisza HISTORY_MSG_296;RS - Modulacja luminancji -HISTORY_MSG_297;RS - Jakość HISTORY_MSG_298;Filtrowanie martwych pikseli HISTORY_NEWSNAPSHOT;Nowa migawka HISTORY_NEWSNAPSHOT_TOOLTIP;Skrót: Alt-s @@ -616,8 +608,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Szerokość: %1, Wysokość: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Nie znaleziono domyślnego profilu dla plików innych niż raw, lub profil nie jest ustawiony.\n\nProszę sprawdz folder z profilami - możliwe że został skasowany bądź uszkodzony.\n\nDomyślne wewnętrzne ustawienia zostaną użyte. -OPTIONS_DEFRAW_MISSING;Nie znaleziono domyślnego profilu dla plików raw, lub profil nie jest ustawiony.\n\nProszę sprawdz folder z profilami - możliwe że został skasowany bądź uszkodzony.\n\nDomyślne wewnętrzne ustawienia zostaną użyte. PARTIALPASTE_BASICGROUP;Podstawowe ustawienia PARTIALPASTE_CACORRECTION;Korekcja aberacji chr. PARTIALPASTE_CHANNELMIXER;Mieszacz kanałów @@ -714,7 +704,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Czarna klatka PREFERENCES_DARKFRAMEFOUND;Znaleziono PREFERENCES_DARKFRAMESHOTS;zdjęć(ia) PREFERENCES_DARKFRAMETEMPLATES;szablonów(ny) @@ -726,14 +715,11 @@ PREFERENCES_DIROTHER;Inny PREFERENCES_DIRSELECTDLG;Wybierz katalog z obrazami po uruchomieniu... PREFERENCES_DIRSOFTWARE;Katalog instalacyjny -PREFERENCES_EDITORCMDLINE;Inna linia poleceń PREFERENCES_EDITORLAYOUT;Układ edytora PREFERENCES_EXTERNALEDITOR;Zewnętrzny edytor PREFERENCES_FBROWSEROPTS;Opcje przeglądarki plików PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Pojedynczy wiersz paska narzędzi (odznaczyć dla niskich rozdzielczości) PREFERENCES_FILEFORMAT;Format pliku -PREFERENCES_FILMSIMULATION;Symulacja kliszy -PREFERENCES_FLATFIELD;Puste pole PREFERENCES_FLATFIELDFOUND;Znaleziono PREFERENCES_FLATFIELDSDIR;Katalog z pustymi polami PREFERENCES_FLATFIELDSHOTS;kadry @@ -1085,33 +1071,32 @@ TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promień TP_DEFRINGE_THRESHOLD;Próg -TP_DIRPYRDENOISE_BLUE;Chrominancja - Błękit-żółć -TP_DIRPYRDENOISE_CHROMA;Chrominancja - Główna -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje działanie usuwania szumów luminancji +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominancja - Błękit-żółć +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominancja - Główna +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominancja - Czerwień-zieleń TP_DIRPYRDENOISE_ENH;Tryb ulepszony TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakość usuwania szumów kosztem około 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma skupia siłę redukcji szumów na danym predziale zakresu tonalnego. Mniejsze wartości gamma powodują skupienie na ciemniejszych barwach, natomiast większe wartości rozciągną zakres działania również na barwy jasne. -TP_DIRPYRDENOISE_LABEL;Redukcja szumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Krzywa luminancji -TP_DIRPYRDENOISE_LDETAIL;Szczegółowość luminancji -TP_DIRPYRDENOISE_LM;Tylko luminancja -TP_DIRPYRDENOISE_LUMA;Luminacja -TP_DIRPYRDENOISE_MED;Filtr Mediana -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana -TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana -TP_DIRPYRDENOISE_METHOD;Metoda -TP_DIRPYRDENOISE_METHOD11;Jakość -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Dla obrazów raw można używać metody RGB oraz L*a*b*.\n\nDla obrazów nie-raw metoda L*a*b* zostanie użyta niezależnie od wyboru. -TP_DIRPYRDENOISE_METM_TOOLTIP;Przy użyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. -TP_DIRPYRDENOISE_PASSES;Liczba powtórzeń mediana -TP_DIRPYRDENOISE_RED;Chrominancja - Czerwień-zieleń -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standardowa -TP_DIRPYRDENOISE_SHALBI;Wysoka +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krzywa luminancji +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Szczegółowość luminancji +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminacja +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcja szumu +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Dla obrazów raw można używać metody RGB oraz L*a*b*.\n\nDla obrazów nie-raw metoda L*a*b* zostanie użyta niezależnie od wyboru. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma skupia siłę redukcji szumów na danym predziale zakresu tonalnego. Mniejsze wartości gamma powodują skupienie na ciemniejszych barwach, natomiast większe wartości rozciągną zakres działania również na barwy jasne. +TP_DIRPYRDENOISE_MAIN_MODE;Jakość +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Wysoka +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standardowa +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Jakość może zostać dopasowana do wzoru szumów. Ustawienie "wysoka" ulepsza odszumianie około 20% wzrostu czasu przetwarzania. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr Mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Tylko luminancja +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Przy użyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. +TP_DIRPYRDENOISE_MEDIAN_PASSES;Liczba powtórzeń mediana +TP_DIRPYRDENOISE_MEDIAN_TYPE;Rodzaj mediana TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skóry TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcień skóry @@ -1449,8 +1434,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otwórz (nową) lupę ZOOMPANEL_ZOOM100;Powiększ do 100%\nSkrót: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Dopasuj kadr do ekranu\nSkrót: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Dopasuj cały obraz do ekranu\nSkrót: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Dopasuj kadr do ekranu\nSkrót: f +ZOOMPANEL_ZOOMFITSCREEN;Dopasuj cały obraz do ekranu\nSkrót: Alt-f ZOOMPANEL_ZOOMIN;Przybliż\nSkrót: + ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - @@ -1458,6 +1443,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1473,6 +1459,7 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1492,8 +1479,13 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1667,6 +1659,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1698,18 +1705,24 @@ !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. !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_EQUALIZER;Wavelet levels +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1721,6 +1734,12 @@ !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1729,6 +1748,8 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. @@ -1789,9 +1810,18 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White @@ -1800,51 +1830,52 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !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? @@ -1859,6 +1890,15 @@ !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1875,7 +1915,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1912,6 +1952,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1925,6 +1967,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* @@ -2006,6 +2049,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Polish (Latin Characters)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Polish (Latin Characters)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Polish (Latin Characters)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Polish (Latin Characters)" 2018-03-20 11:04:15.000000000 +0000 @@ -15,6 +15,7 @@ ABOUT_TAB_SPLASH;Ekran powitalny ADJUSTER_RESET_TO_DEFAULT;Przywroc domyslne BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Rozpocznij przetwarzanie automatycznie gdy pojawi sie nowe zadanie. BATCHQUEUE_DESTFILENAME;Sciezka i nazwa pliku BATCH_PROCESSING;Przetwarzanie wsadowe CURVEEDITOR_CURVE;Krzywa @@ -178,12 +179,7 @@ FILEBROWSER_SHOWTRASHHINT;Pokazuje zawartosc kosza.\nSkrot: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Pokazuje zdjecia bez kolorowej etykiety.\nSkrot: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Pokazuje nieocenione zdjecia.\nSkrot: 0 -FILEBROWSER_STARTPROCESSING;Rozpocznij przetwarzanie -FILEBROWSER_STARTPROCESSINGHINT;Rozpoczyna przetwarzanie/zapisywanie plikow z kolejki. -FILEBROWSER_STOPPROCESSING;Zatrzymaj przetwarzanie -FILEBROWSER_STOPPROCESSINGHINT;Zatrzymuje przetwarzanie zdjec. FILEBROWSER_THUMBSIZE;Rozmiar minaturek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Rozpocznij przetwarzanie automatycznie gdy pojawi sie nowe zadanie. FILEBROWSER_UNRANK_TOOLTIP;Usun ocene.\nSkrot: Shift-0 FILEBROWSER_ZOOMINHINT;Zwieksza rozmiar miniaturek.\n\nSkroty:\n+ - Tryb wielu zakladek,\nAlt-+ - Tryb pojedynczej zakladki. FILEBROWSER_ZOOMOUTHINT;Zmniejsza rozmiar miniaturek.\n\nSkroty:\n- - Tryb wielu zakladek,\nAlt-- - Tryb pojedynczej zakladki. @@ -390,7 +386,6 @@ HISTORY_MSG_170;Jaskrawosc - Krzywa HH HISTORY_MSG_171;L*a*b* - Krzywa LC HISTORY_MSG_172;L*a*b* - Ogranicz LC -HISTORY_MSG_173;RS - Szczegoly luminancji HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptacja CAT02 HISTORY_MSG_176;CAM02 - Otoczenie @@ -420,7 +415,6 @@ HISTORY_MSG_200;CAMO2 - Tone mapping HISTORY_MSG_201;RS - Chrominancja - R&G HISTORY_MSG_202;RS - Chrominancja - B&Y -HISTORY_MSG_203;RS - Metoda HISTORY_MSG_204;Kroki poprawy LMMSE HISTORY_MSG_205;CAM02 - Gorace/uszkodzone px HISTORY_MSG_206;CAT02 - Auto luminancja sceny @@ -472,7 +466,6 @@ HISTORY_MSG_253;KwgPS - Redukcja bledow HISTORY_MSG_254;KwgPS - Odcienie skory HISTORY_MSG_255;RS - Filtr mediana -HISTORY_MSG_256;RS - Wielkosc okna mediana HISTORY_MSG_257;Koloryzacja HISTORY_MSG_258;Koloryzacja - Kolor HISTORY_MSG_259;Koloryzacja - Przezroczystosc @@ -513,7 +506,6 @@ HISTORY_MSG_294;Symulacja Kliszy - Sila HISTORY_MSG_295;Symulacja Kliszy - Klisza HISTORY_MSG_296;RS - Modulacja luminancji -HISTORY_MSG_297;RS - Jakosc HISTORY_MSG_298;Filtrowanie martwych pikseli HISTORY_NEWSNAPSHOT;Nowa migawka HISTORY_NEWSNAPSHOT_TOOLTIP;Skrot: Alt-s @@ -616,8 +608,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Szerokosc: %1, Wysokosc: %2 NAVIGATOR_XY_NA;x: --, y: -- -OPTIONS_DEFIMG_MISSING;Nie znaleziono domyslnego profilu dla plikow innych niz raw, lub profil nie jest ustawiony.\n\nProsze sprawdz folder z profilami - mozliwe ze zostal skasowany badz uszkodzony.\n\nDomyslne wewnetrzne ustawienia zostana uzyte. -OPTIONS_DEFRAW_MISSING;Nie znaleziono domyslnego profilu dla plikow raw, lub profil nie jest ustawiony.\n\nProsze sprawdz folder z profilami - mozliwe ze zostal skasowany badz uszkodzony.\n\nDomyslne wewnetrzne ustawienia zostana uzyte. PARTIALPASTE_BASICGROUP;Podstawowe ustawienia PARTIALPASTE_CACORRECTION;Korekcja aberacji chr. PARTIALPASTE_CHANNELMIXER;Mieszacz kanalow @@ -714,7 +704,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Czarna klatka PREFERENCES_DARKFRAMEFOUND;Znaleziono PREFERENCES_DARKFRAMESHOTS;zdjec(ia) PREFERENCES_DARKFRAMETEMPLATES;szablonow(ny) @@ -726,14 +715,11 @@ PREFERENCES_DIROTHER;Inny PREFERENCES_DIRSELECTDLG;Wybierz katalog z obrazami po uruchomieniu... PREFERENCES_DIRSOFTWARE;Katalog instalacyjny -PREFERENCES_EDITORCMDLINE;Inna linia polecen PREFERENCES_EDITORLAYOUT;Uklad edytora PREFERENCES_EXTERNALEDITOR;Zewnetrzny edytor PREFERENCES_FBROWSEROPTS;Opcje przegladarki plikow PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Pojedynczy wiersz paska narzedzi (odznaczyc dla niskich rozdzielczosci) PREFERENCES_FILEFORMAT;Format pliku -PREFERENCES_FILMSIMULATION;Symulacja kliszy -PREFERENCES_FLATFIELD;Puste pole PREFERENCES_FLATFIELDFOUND;Znaleziono PREFERENCES_FLATFIELDSDIR;Katalog z pustymi polami PREFERENCES_FLATFIELDSHOTS;kadry @@ -1085,33 +1071,32 @@ TP_DEFRINGE_LABEL;Usuwanie widma TP_DEFRINGE_RADIUS;Promien TP_DEFRINGE_THRESHOLD;Prog -TP_DIRPYRDENOISE_BLUE;Chrominancja - Blekit-zolc -TP_DIRPYRDENOISE_CHROMA;Chrominancja - Glowna -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Moduluje dzialanie usuwania szumow luminancji +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominancja - Blekit-zolc +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominancja - Glowna +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominancja - Czerwien-zielen TP_DIRPYRDENOISE_ENH;Tryb ulepszony TP_DIRPYRDENOISE_ENH_TOOLTIP;Ulepsza jakosc usuwania szumow kosztem okolo 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma skupia sile redukcji szumow na danym predziale zakresu tonalnego. Mniejsze wartosci gamma powoduja skupienie na ciemniejszych barwach, natomiast wieksze wartosci rozciagna zakres dzialania rowniez na barwy jasne. -TP_DIRPYRDENOISE_LABEL;Redukcja szumu -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Krzywa luminancji -TP_DIRPYRDENOISE_LDETAIL;Szczegolowosc luminancji -TP_DIRPYRDENOISE_LM;Tylko luminancja -TP_DIRPYRDENOISE_LUMA;Luminacja -TP_DIRPYRDENOISE_MED;Filtr Mediana -TP_DIRPYRDENOISE_MEDMETHOD;Metoda mediana -TP_DIRPYRDENOISE_MEDTYPE;Rodzaj mediana -TP_DIRPYRDENOISE_METHOD;Metoda -TP_DIRPYRDENOISE_METHOD11;Jakosc -TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Jakosc moze zostac dopasowana do wzoru szumow. Ustawienie "wysoka" ulepsza odszumianie okolo 20% wzrostu czasu przetwarzania. -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Dla obrazow raw mozna uzywac metody RGB oraz L*a*b*.\n\nDla obrazow nie-raw metoda L*a*b* zostanie uzyta niezaleznie od wyboru. -TP_DIRPYRDENOISE_METM_TOOLTIP;Przy uzyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. -TP_DIRPYRDENOISE_PASSES;Liczba powtorzen mediana -TP_DIRPYRDENOISE_RED;Chrominancja - Czerwien-zielen -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standardowa -TP_DIRPYRDENOISE_SHALBI;Wysoka +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Krzywa luminancji +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Szczegolowosc luminancji +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminacja +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcja szumu +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Dla obrazow raw mozna uzywac metody RGB oraz L*a*b*.\n\nDla obrazow nie-raw metoda L*a*b* zostanie uzyta niezaleznie od wyboru. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma skupia sile redukcji szumow na danym predziale zakresu tonalnego. Mniejsze wartosci gamma powoduja skupienie na ciemniejszych barwach, natomiast wieksze wartosci rozciagna zakres dzialania rowniez na barwy jasne. +TP_DIRPYRDENOISE_MAIN_MODE;Jakosc +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Wysoka +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standardowa +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;Jakosc moze zostac dopasowana do wzoru szumow. Ustawienie "wysoka" ulepsza odszumianie okolo 20% wzrostu czasu przetwarzania. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Metoda mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtr Mediana +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Tylko luminancja +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Przy uzyciu metod "tylko luminancja" oraz "L*a*b*", filtrowanie mediana zostanie wykonane prosto po funkcji falki w procesie odszumiania.\nW trybie "RGB" filtrowanie to zostanie wykonana pod koniec calego procesu. +TP_DIRPYRDENOISE_MEDIAN_PASSES;Liczba powtorzen mediana +TP_DIRPYRDENOISE_MEDIAN_TYPE;Rodzaj mediana TP_DIRPYREQUALIZER_ALGO;Zakres odcieni skory TP_DIRPYREQUALIZER_ALGO_TOOLTIP;- TP_DIRPYREQUALIZER_HUESKIN;Odcien skory @@ -1449,8 +1434,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otworz (nowa) lupe ZOOMPANEL_ZOOM100;Powieksz do 100%\nSkrot: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Dopasuj kadr do ekranu\nSkrot: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Dopasuj caly obraz do ekranu\nSkrot: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Dopasuj kadr do ekranu\nSkrot: f +ZOOMPANEL_ZOOMFITSCREEN;Dopasuj caly obraz do ekranu\nSkrot: Alt-f ZOOMPANEL_ZOOMIN;Przybliz\nSkrot: + ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - @@ -1458,6 +1443,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1473,6 +1459,7 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1492,8 +1479,13 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTORY_MSG_166;Exposure - Reset +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control @@ -1667,6 +1659,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1698,18 +1705,24 @@ !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. !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_EQUALIZER;Wavelet levels +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1721,6 +1734,12 @@ !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1729,6 +1748,8 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. @@ -1789,9 +1810,18 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White @@ -1800,51 +1830,52 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !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? @@ -1859,6 +1890,15 @@ !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_PRSHARPENING_LABEL;Post-Resize Sharpening !TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions. @@ -1875,7 +1915,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1912,6 +1952,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1925,6 +1967,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* @@ -2006,6 +2049,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Portugues (Brasil)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Portugues (Brasil)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Portugues (Brasil)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Portugues (Brasil)" 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Exibir imagens classificadas como 5 estrelas FILEBROWSER_SHOWTRASHHINT;Exibir conteúdo da lixeira FILEBROWSER_SHOWUNRANKHINT;Exibir imagens não classificadas -FILEBROWSER_STARTPROCESSING;Iniciar Processamento -FILEBROWSER_STARTPROCESSINGHINT;Iniciar processamento/salvar imagens da lista -FILEBROWSER_STOPPROCESSING;Parar processamento -FILEBROWSER_STOPPROCESSINGHINT;Para o processamento das imagens FILEBROWSER_THUMBSIZE;Tamanho das Miniaturas FILEBROWSER_ZOOMINHINT;Aumentar Tamanho das Miniaturas FILEBROWSER_ZOOMOUTHINT;Diminuir Tamanho das Miniaturas @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Outro PREFERENCES_DIRSELECTDLG;selecionar diretório de imagem na inicialização... PREFERENCES_DIRSOFTWARE;Diretório de instalação -PREFERENCES_EDITORCMDLINE;Outra Linha de Comando PREFERENCES_EXTERNALEDITOR;Editor externo PREFERENCES_FBROWSEROPTS;Opções do navegador de arquivos PREFERENCES_FILEFORMAT;Formato de arquivo @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Russian rawtherapee-5.4/rtdata/languages/Russian --- rawtherapee-5.3/rtdata/languages/Russian 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Russian 2018-03-20 11:04:15.000000000 +0000 @@ -5,6 +5,7 @@ #05 2010-11-01 Ilia Popov #06 2012-07-17 Roman Milanskij #07 2014-02-12 Kostia (Kildor) Romanov +#07 2018-02-10 Kostia (Kildor) Romanov ABOUT_TAB_BUILD;Версия ABOUT_TAB_CREDITS;Авторы @@ -13,8 +14,11 @@ ABOUT_TAB_SPLASH;Заставка ADJUSTER_RESET_TO_DEFAULT;Сбросить настройки BATCHQUEUE_AUTOSTART;Автостарт +BATCHQUEUE_AUTOSTARTHINT;Автоматически запускать обработку при добавлении файла в очередь BATCHQUEUE_DESTFILENAME;Имя файла и путь к нему BATCH_PROCESSING;Пакетная обработка +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_CURVE;Кривая CURVEEDITOR_CURVES;Кривые CURVEEDITOR_CUSTOM;Произвольный @@ -35,6 +39,16 @@ CURVEEDITOR_TOOLTIPSAVE;Сохранить тоновую кривую CURVEEDITOR_TYPE;Тип: DIRBROWSER_FOLDERS;Папки +DONT_SHOW_AGAIN;Больше не показывать это сообщение. +DYNPROFILEEDITOR_DELETE;Удалить +DYNPROFILEEDITOR_EDIT;Редактировать +DYNPROFILEEDITOR_EDIT_RULE;Редактировать правило подбора +DYNPROFILEEDITOR_ENTRY_TOOLTIP;Сопоставление нечувствительно к регистру.\nИспользуйте префикс "re:"\nчтоб ввести регулярное выражение. +DYNPROFILEEDITOR_MOVE_DOWN;Вниз +DYNPROFILEEDITOR_MOVE_UP;Вверх +DYNPROFILEEDITOR_NEW;Новый +DYNPROFILEEDITOR_NEW_RULE;Создать правило подбора +DYNPROFILEEDITOR_PROFILE;Профиль обработки EDITWINDOW_TITLE;Редактор EXIFFILTER_APERTURE;Диафрагма EXIFFILTER_CAMERA;Камера @@ -69,7 +83,7 @@ EXPORT_BYPASS_RAW_DCB_ITERATIONS;Пропустить [raw] DCB-проходы EXPORT_BYPASS_RAW_DF;Пропустить [raw] Темновой кадр EXPORT_BYPASS_RAW_FF;Пропустить [raw] Плоское поле -EXPORT_BYPASS_RAW_GREENTHRESH;Пропустить [raw] Уравновешивание зеленого +EXPORT_BYPASS_RAW_GREENTHRESH;Пропустить [raw] Выравнивание зеленого EXPORT_BYPASS_RAW_LINENOISE;Пропустить [raw] Фильтр линейного шума EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Пропустить [raw] шаги LMMSE улучшения EXPORT_BYPASS_SHARPENEDGE;Пропустить контурное повышение резкости @@ -144,7 +158,7 @@ FILEBROWSER_POPUPUNRANK;Снять рейтинг FILEBROWSER_POPUPUNTRASH;Удалить из корзины FILEBROWSER_QUERYBUTTONHINT;Очистить поисковой запрос -FILEBROWSER_QUERYHINT;Введите часть искомого имени файла или список разделённый запятыми (пробелы значимы).\nНапример 1001,1005,1042 \n\nCtrl-F для переключения на диалог поиска текста.\nEnter для начала поиска.\nShift-Esc для снятия фокуса +FILEBROWSER_QUERYHINT;Введите часть искомого имени файла или список разделённый запятыми (пробелы значимы).\nНапример 1001,1005,1042\nИсключите поисковый запрос добавив перед ним !=\nНапример !=1001,1004,1199\n\nCtrl-F для переключения на диалог поиска текста.\nEnter для начала поиска.\nEsc для очистки поля\nShift-Esc для снятия фокуса FILEBROWSER_QUERYLABEL; Найти: FILEBROWSER_RANK1_TOOLTIP;Рейтинг 1 *\nГорячая клавиша: Shift-1 FILEBROWSER_RANK2_TOOLTIP;Рейтинг 2 *\nГорячая клавиша: Shift-2 @@ -152,6 +166,7 @@ FILEBROWSER_RANK4_TOOLTIP;Рейтинг 4 *\nГорячая клавиша: Shift-4 FILEBROWSER_RANK5_TOOLTIP;Рейтинг 5 *\nГорячая клавиша: Shift-5 FILEBROWSER_RENAMEDLGLABEL;Переименовать файл +FILEBROWSER_RESETDEFAULTPROFILE;Применить профиль по умолчанию FILEBROWSER_SELECTDARKFRAME;Выбрать темновой кадр... FILEBROWSER_SELECTFLATFIELD;Выбрать плоское поле... FILEBROWSER_SHOWCOLORLABEL1HINT;Показать изображения, отмеченные Красным.\nГорячая клавиша: Alt-1 @@ -163,6 +178,7 @@ FILEBROWSER_SHOWEDITEDHINT;Показать измененные изображения.\nГорячая клавиша: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Показать не измененные изображения.\nГорячая клавиша: 6 FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-i +FILEBROWSER_SHOWNOTTRASHHINT;Показать только неудалённые изображения. FILEBROWSER_SHOWRANK1HINT;Показать изображения с рейтингом 1.\nГорячая клавиша: 1 FILEBROWSER_SHOWRANK2HINT;Показать изображения с рейтингом 2.\nГорячая клавиша: 2 FILEBROWSER_SHOWRANK3HINT;Показать изображения с рейтингом 3.\nГорячая клавиша: 3 @@ -173,17 +189,19 @@ FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-t FILEBROWSER_SHOWUNCOLORHINT;Показать изображения без цветовой метки.\nГорячая клавиша: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Показать изображения без рейтинга\nГорячая клавиша: 0 -FILEBROWSER_STARTPROCESSING;Начать обработку -FILEBROWSER_STARTPROCESSINGHINT;Запуск обработки помещенных в очередь изображений -FILEBROWSER_STOPPROCESSING;Остановить обработку -FILEBROWSER_STOPPROCESSINGHINT;Отмена обработки изображений FILEBROWSER_THUMBSIZE;Размер эскиза -FILEBROWSER_TOOLTIP_STOPPROCESSING;Автоматически запускать обработку при добавлении файла в очередь FILEBROWSER_UNRANK_TOOLTIP;Удалить рейтинг\nГорячая клавиша: Shift-~ FILEBROWSER_ZOOMINHINT;Увеличить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-+ FILEBROWSER_ZOOMOUTHINT;Уменьшить размер эскиза\nГорячая клавиша: +\n\nГорячая клавиша в режиме Одиночного редактора: Alt-- +FILECHOOSER_FILTER_ANY;Все файлы +FILECHOOSER_FILTER_COLPROF;Цветовые профили +FILECHOOSER_FILTER_CURVE;Файлы кривых +FILECHOOSER_FILTER_LCP;Файлы коррекции объектива +FILECHOOSER_FILTER_TIFF;Файлы TIFF GENERAL_ABOUT;О программе GENERAL_AFTER;После +GENERAL_APPLY;Применить +GENERAL_ASIMAGE;Как снимок GENERAL_AUTO;Автоматический GENERAL_BEFORE;До GENERAL_CANCEL;Отмена @@ -198,16 +216,18 @@ GENERAL_NO;Нет GENERAL_NONE;Нет GENERAL_OK;OK +GENERAL_OPEN;Открыть GENERAL_PORTRAIT;Портретный GENERAL_SAVE;Сохранить +GENERAL_SLIDER;Ползунок GENERAL_UNCHANGED;(не менялось) GENERAL_WARNING;Внимание HISTOGRAM_TOOLTIP_B;Показать/скрыть синий канал гистограммы HISTOGRAM_TOOLTIP_BAR;Показать/скрыть панель отображения RGB\nНажмите правую кнопку мыши на предпросмотре изображения, чтобы заблокировать/разблокировать его HISTOGRAM_TOOLTIP_CHRO;Показать/скрыть хроматическую гистограмму -HISTOGRAM_TOOLTIP_FULL;Переключить полную (вкл) или отмасштабированную (выкл) гистограмму +HISTOGRAM_TOOLTIP_FULL;Переключить полную (выкл) или отмасштабированную (вкл) гистограмму HISTOGRAM_TOOLTIP_G;Показать/скрыть зелёный канал гистограммы -HISTOGRAM_TOOLTIP_L;Показать/скрыть CIELAB канал гистограммы +HISTOGRAM_TOOLTIP_L;Показать/скрыть CIELAB гистограмму HISTOGRAM_TOOLTIP_R;Показать/скрыть красный канал гистограммы HISTOGRAM_TOOLTIP_RAW;Показать/скрыть Raw гистограмму HISTORY_CHANGED;Изменено @@ -227,8 +247,8 @@ HISTORY_MSG_11;Тоновая кривая 1 HISTORY_MSG_12;Автоматические уровни HISTORY_MSG_13;Обрезка экспозиции -HISTORY_MSG_14;Lab: Яркость -HISTORY_MSG_15;Lab: Контраст +HISTORY_MSG_14;L*a*b*: Яркость +HISTORY_MSG_15;L*a*b*: Контраст HISTORY_MSG_16;Освещенность: Уровень чёрного HISTORY_MSG_17;Освещенность: Сжатие светов HISTORY_MSG_18;Освещенность: Сжатие теней @@ -240,8 +260,8 @@ HISTORY_MSG_24;Резкость: Только контуры HISTORY_MSG_25;Резкость: Радиус определения контуров HISTORY_MSG_26;Резкость: Допуск определения контуров -HISTORY_MSG_27;Резкость: Управление ореолом -HISTORY_MSG_28;Резкость: Величина ореола +HISTORY_MSG_27;Резкость: Управление ореолами +HISTORY_MSG_28;Резкость: Величина ореолов HISTORY_MSG_29;Резкость: Метод HISTORY_MSG_30;Деконволюция: Радиус HISTORY_MSG_31;Деконволюция: Значение @@ -291,7 +311,7 @@ HISTORY_MSG_75;Масштабирование: Способ HISTORY_MSG_76;Метаданные Exif HISTORY_MSG_77;Метаданные IPTC -HISTORY_MSG_78;Масштаб: Данные +HISTORY_MSG_78;- HISTORY_MSG_79;Масштаб: Ширина HISTORY_MSG_80;Масштаб: Высота HISTORY_MSG_81;Масштабирование @@ -303,12 +323,12 @@ HISTORY_MSG_87;Импульсное подавление шума HISTORY_MSG_88;Импульсное ПШ: порог HISTORY_MSG_89;Подавление шума -HISTORY_MSG_90;ПШ - яркость -HISTORY_MSG_91;ПШ - цветность -HISTORY_MSG_92;ПШ - гамма +HISTORY_MSG_90;ПШ: яркость +HISTORY_MSG_91;ПШ: цветность +HISTORY_MSG_92;ПШ: гамма HISTORY_MSG_93;КпУД: значение HISTORY_MSG_94;Контраст по уровням деталей -HISTORY_MSG_95;Lab: Насыщенность +HISTORY_MSG_95;L*a*b*: Насыщенность HISTORY_MSG_96;Кривая 'a' HISTORY_MSG_97;Кривая 'b' HISTORY_MSG_98;Демозаик @@ -316,7 +336,7 @@ HISTORY_MSG_100;Насыщенность HISTORY_MSG_101;HSV: Цветовой тон HISTORY_MSG_102;HSV: Насыщенность -HISTORY_MSG_103;HSV: Яркость +HISTORY_MSG_103;HSV: Яркость HISTORY_MSG_104;Эквалайзер HSV HISTORY_MSG_105;Подавление ореолов HISTORY_MSG_106;Подавление ореолов: радиус @@ -324,16 +344,16 @@ HISTORY_MSG_108;Порог компрессии засветов HISTORY_MSG_109;Изменение размера рамки HISTORY_MSG_110;Масштабирование относится к -HISTORY_MSG_111;Lab: Избегать сдвига цвета +HISTORY_MSG_111;L*a*b*: Избегать сдвига цвета HISTORY_MSG_112;--неиспользуемый-- -HISTORY_MSG_113;Lab: Защита тонов +HISTORY_MSG_113;L*a*b*: Защита тонов HISTORY_MSG_114;Проходы DCB HISTORY_MSG_115;Проходы подавления ложного цвета HISTORY_MSG_116;Расширенная DCB HISTORY_MSG_117;(raw) Коррекция красных ХА HISTORY_MSG_118;(raw) Коррекция синих ХА HISTORY_MSG_119;Фильтр линейного шума -HISTORY_MSG_120;Равновесие зеленого +HISTORY_MSG_120;Выравнивание зеленого HISTORY_MSG_121;(raw) Авто ХА HISTORY_MSG_122;Авто темновой кадр HISTORY_MSG_123;Файл темнового кадра @@ -356,21 +376,21 @@ HISTORY_MSG_140;Ур. черного: Зеленый 2 HISTORY_MSG_141;Ур. черного: Зеленые вместе HISTORY_MSG_142;РК: Проходы -HISTORY_MSG_143;РК: Количество -HISTORY_MSG_144;Микроконтраст: Количество +HISTORY_MSG_143;РК: Величина +HISTORY_MSG_144;Микроконтраст: Величина HISTORY_MSG_145;Микроконтраст: Равномерность HISTORY_MSG_146;Резкость контуров HISTORY_MSG_147;РК: Только освещенность HISTORY_MSG_148;Микроконтраст HISTORY_MSG_149;Микроконтраст: матрица 3×3 HISTORY_MSG_150;Пост-демозаик шумоподавление -HISTORY_MSG_151;Резонанс -HISTORY_MSG_152;Рез: Пастельные тона -HISTORY_MSG_153;Рез: Насыщенные тона -HISTORY_MSG_154;Рез: Сохр. оттенки кожи -HISTORY_MSG_155;Рез: Избегать сдвига цветов -HISTORY_MSG_156;Рез: Связь пастельных/насыщенных -HISTORY_MSG_157;Рез: Уровень пастельных/насыщенных +HISTORY_MSG_151;Красочность +HISTORY_MSG_152;Красочность: Пастельные тона +HISTORY_MSG_153;Красочность: Насыщенные тона +HISTORY_MSG_154;Красочность: Сохр. оттенки кожи +HISTORY_MSG_155;Красочность: Избегать сдвига цветов +HISTORY_MSG_156;Красочность: Связь пастельных/насыщенных +HISTORY_MSG_157;Красочность: Уровень пастельных/насыщенных HISTORY_MSG_158;ТК: Интенсивность HISTORY_MSG_159;ТК: Учет контуров HISTORY_MSG_160;ТК: Масштаб @@ -379,13 +399,14 @@ HISTORY_MSG_163;Кривая RGB: Красный HISTORY_MSG_164;Кривая RGB: Зелёный HISTORY_MSG_165;Кривая RGB: Синий +HISTORY_MSG_166;Сброс экспозиции HISTORY_MSG_167;Демозаик HISTORY_MSG_168;Кривая 'ЦЦ' HISTORY_MSG_169;Кривая 'ЦО' -HISTORY_MSG_170;Рез: кривая +HISTORY_MSG_170;Красочность: кривая HISTORY_MSG_171;Кривая 'ЯЦ' -HISTORY_MSG_172;LAB: Ограничение 'ЯЦ' -HISTORY_MSG_173;ПШ: Детализация яркости +HISTORY_MSG_172;L*a*b*: Ограничение 'ЯЦ' +HISTORY_MSG_173;ПШ: Восстановление деталей HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02: Адаптация CAT02 HISTORY_MSG_176;CAM02: Условия просмотра @@ -415,7 +436,7 @@ HISTORY_MSG_200;CAM02: Тональное отображение HISTORY_MSG_201;ПШ: Цветность К,З HISTORY_MSG_202;ПШ: Цветность С,Ж -HISTORY_MSG_203;ПШ: Метод +HISTORY_MSG_203;ПШ: Пространство HISTORY_MSG_204;Шагов улучшения LMMSE HISTORY_MSG_205;CAM02: Горячие/битые пиксели HISTORY_MSG_206;CAT02: Автояркость сцены @@ -463,6 +484,22 @@ HISTORY_MSG_249;КпУД: Порог HISTORY_MSG_250;ПШ: Улучшенный HISTORY_MSG_251;Ч&Б: Алгоритм +HISTORY_MSG_277;--неиспользуемый-- +HISTORY_MSG_300;- +HISTORY_MSG_488;Отображение тонов HDR +HISTORY_MSG_489;HDR: Порог +HISTORY_MSG_490;HDR: Величина +HISTORY_MSG_491;Баланс белого +HISTORY_MSG_492;Кривые RGB +HISTORY_MSG_493;Настройки L*a*b* +HISTORY_MSG_HISTMATCHING;Автоподбор тоновой кривой +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Лок.контраст: Величина +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Лок.контраст: Тёмные тона +HISTORY_MSG_LOCALCONTRAST_ENABLED;Лок.контраст +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Лок.контраст: Светлые тона +HISTORY_MSG_LOCALCONTRAST_RADIUS;Лок.контраст: Радиус +HISTORY_MSG_METADATA_MODE;Режим копирования метаданных +HISTORY_MSG_TM_FATTAL_ANCHOR;HDR: Точка привязки HISTORY_NEWSNAPSHOT;Добавить HISTORY_NEWSNAPSHOT_TOOLTIP;Горячая клавиша: Alt-s HISTORY_SNAPSHOT;Снимок @@ -484,6 +521,10 @@ IPTCPANEL_RESETHINT;Сбросить профиль на значения по умолчанию IPTCPANEL_SOURCE;Источник IPTCPANEL_TITLE;Название +LENSPROFILE_CORRECTION_AUTOMATCH;Автоподбор параметров коррекции +LENSPROFILE_CORRECTION_LCPFILE;Файл LCP +LENSPROFILE_CORRECTION_MANUAL;Ручные параметры коррекции +LENSPROFILE_LENS_WARNING;Внимание: кроп-фактор используемый для анализа объектива больше чем кроп-фактор камеры, результаты могут быть не верны. MAIN_BUTTON_FULLSCREEN;Полный экран MAIN_BUTTON_NAVNEXT_TOOLTIP;Перейти к следующему изображению относительно открытого в редакторе\nГорячая клавиша: Shift+F4\n\nПерейти к следущему изображению относительно выбранного в файловом браузере\nгорячая клавиша F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Перейти к предыдущему изображению относительно открытого в редакторе\nгорячая клавиша: Shift+F4\n\nПерейти к предыдущему изображению относительно выбранного в файловом браузере\nгорячая клавиша F4 @@ -491,6 +532,7 @@ MAIN_BUTTON_PREFERENCES;Настройки MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Поместить текущее изображение в очередь на обработку.\nГорячая клавиша Ctrl+B MAIN_BUTTON_SAVE_TOOLTIP;Сохранить текущее изображение.\nГорячая клавиша Ctrl+S +MAIN_BUTTON_SENDTOEDITOR;Редактировать изображение во внешнем редакторе. MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Редактировать изображение во внешнем редакторе.\nГорячая клавиша Ctrl+E MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Показать/скрыть все боковые панели.\nГорячая клавиша m MAIN_BUTTON_UNFULLSCREEN;Оконный режим @@ -517,6 +559,8 @@ MAIN_MSG_QOVERWRITE;Вы хотите перезаписать его? MAIN_MSG_SETPATHFIRST;Прежде необходимо установить целевой каталог в настройках\nчтоб использовать эту функцию! MAIN_MSG_WRITEFAILED;Не удалось записать\n\n"%1".\n\nУбедитесь, что каталог существует и у вас есть права на запись в него. +MAIN_TAB_ADVANCED;Дополнительные +MAIN_TAB_ADVANCED_TOOLTIP;Горячая клавиша: Alt-w MAIN_TAB_COLOR;Цвет MAIN_TAB_COLOR_TOOLTIP;Горячая клавиша: Alt-C MAIN_TAB_DETAIL;Детализация @@ -527,6 +571,7 @@ MAIN_TAB_EXPOSURE;Экспозиция MAIN_TAB_EXPOSURE_TOOLTIP;Горячая клавиша: Alt-E MAIN_TAB_FILTER;Фильтр +MAIN_TAB_INSPECT;Предпросмотр MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Метаданные MAIN_TAB_METADATA_TOOLTIP;Горячая клавиша: Alt-M @@ -538,23 +583,33 @@ MAIN_TOOLTIP_BACKCOLOR1;Фоновый цвет предпросмотра: Черный\nГорячая клавиша: 9 MAIN_TOOLTIP_BACKCOLOR2;Фоновый цвет предпросмотра: Белый\nГорячая клавиша: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Заблокировать / Разблокировать предыдущий вид\n\nЗаблокировать: сохраняет предыдущий вид неизменным.\nПолезно для оценки общего эффекта от применения нескольких инструментов.\nК тому же, сравнения могут быть произведены на любом состоянии истории\n\nРазблокировать: предыдущий вид будет следовать сразу за следующим, показывая состояние изображения до применения текущего инструмента. +MAIN_TOOLTIP_HIDEHP;Показать/скрыть левую панель (включая историю).\nГорячая клавиша l MAIN_TOOLTIP_INDCLIPPEDH;Индикатор пересветов.\nГорячая клавиша: < MAIN_TOOLTIP_INDCLIPPEDS;Индикатор затемнений.\nГорячая клавиша: > MAIN_TOOLTIP_PREVIEWB;Просмотреть канал синего.\nГорячая клавиша: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Просмотреть Маску резкости.\nГорячая клавиша: Shift-F\n\nБолее точна на изображениях с небольшой глубиной резкости, малым шумом и при большем приближении изображения\n\nДля улучшения определения на шумных изображениях используйте на маленьком зуме 10-30%\n\nПредпросмотр просчитывается медленнее со включенной маской резкости. +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Просмотреть Маску резкости.\nГорячая клавиша: Shift-F\n\nБолее точна на изображениях с небольшой глубиной резкости, малым шумом и при большем приближении изображения\n\nДля улучшения определения на шумных изображениях используйте на маленьком зуме 10-30% MAIN_TOOLTIP_PREVIEWG;Просмотреть канал зеленого.\nГорячая клавиша: g MAIN_TOOLTIP_PREVIEWL;Просмотреть Световую составляющую.\nГорячая клавиша: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Просмотреть канал красного.\nГорячая клавиша: r MAIN_TOOLTIP_QINFO;Информация об изображении.\nГорячая клавиша i -MAIN_TOOLTIP_SHOWHIDELP1;Показать/скрыть левую панель l -MAIN_TOOLTIP_SHOWHIDERP1;Показать/скрыть правую панель Alt-l -MAIN_TOOLTIP_SHOWHIDETP1;Показать/скрыть верхнюю панель Shift-L +MAIN_TOOLTIP_SHOWHIDELP1;Показать/скрыть левую панель\nГорячая клавиша: l +MAIN_TOOLTIP_SHOWHIDERP1;Показать/скрыть правую панель\nГорячая клавиша: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Показать/скрыть верхнюю панель\nГорячая клавиша: Shift-L MAIN_TOOLTIP_THRESHOLD;Порог -MAIN_TOOLTIP_TOGGLE;Включить режим "до/после".\nГорячая клавиша b -NAVIGATOR_XY_FULL;Ширина = %1, Высота = %2 -NAVIGATOR_XY_NA;x = н/д, y = н/д -OPTIONS_DEFIMG_MISSING;Профиль по умолчанию для не-raw снимков не найден или не установлен.\n\nПожалуйста, проверьте папку с профилями, она может отсутствовать или быть повреждена.\n\nБудут использованы значения по умолчанию. -OPTIONS_DEFRAW_MISSING;Профиль по умолчанию для raw снимков не найден или не установлен.\n\nПожалуйста, проверьте папку с профилями, она может отсутствовать или быть повреждена.\n\nБудут использованы значения по умолчанию. +MAIN_TOOLTIP_TOGGLE;Включить режим "до/после".\nГорячая клавиша Shift-B +NAVIGATOR_B;B: +NAVIGATOR_G;G: +NAVIGATOR_H;H: +NAVIGATOR_LAB_A;a*: +NAVIGATOR_LAB_B;b*: +NAVIGATOR_LAB_L;L*: +NAVIGATOR_NA; -- +NAVIGATOR_R;R: +NAVIGATOR_S;S: +NAVIGATOR_V;V: +NAVIGATOR_XY_FULL;Ширина: %1, Высота: %2 +NAVIGATOR_XY_NA;x: --, y: -- +PARTIALPASTE_ADVANCEDGROUP;Дополнительные параметры PARTIALPASTE_BASICGROUP;Базовые настройки PARTIALPASTE_CACORRECTION;Коррекция C/A PARTIALPASTE_CHANNELMIXER;Смешение каналов @@ -586,9 +641,11 @@ PARTIALPASTE_ICMSETTINGS;Параметры ICM PARTIALPASTE_IMPULSEDENOISE;Подавление импульсного шума PARTIALPASTE_IPTCINFO;Данные IPTC -PARTIALPASTE_LABCURVE;Настройка Lab +PARTIALPASTE_LABCURVE;Настройка L*a*b* PARTIALPASTE_LENSGROUP;Параметры связанные с объективом PARTIALPASTE_LENSPROFILE;Профиль коррекции объектива +PARTIALPASTE_LOCALCONTRAST;Локальный контраст +PARTIALPASTE_METADATA;Режим метаданных PARTIALPASTE_METAGROUP;Настройка метаданных PARTIALPASTE_PCVIGNETTE;Фильтр виньетирования PARTIALPASTE_PERSPECTIVE;Перспектива @@ -611,7 +668,8 @@ PARTIALPASTE_SHARPENEDGE;Края PARTIALPASTE_SHARPENING;Повышение резкости PARTIALPASTE_SHARPENMICRO;Микроконтраст -PARTIALPASTE_VIBRANCE;Резонанс +PARTIALPASTE_TM_FATTAL;Отображение тонов HDR +PARTIALPASTE_VIBRANCE;Красочность PARTIALPASTE_VIGNETTING;Коррекция виньетирования PARTIALPASTE_WHITEBALANCE;Баланс белого PREFERENCES_ADD;Добавить @@ -634,6 +692,11 @@ PREFERENCES_CIEART_LABEL;Использовать числа с плавающей запятой вместо двойной точности PREFERENCES_CIEART_TOOLTIP;Если включено, вычисления CIECAM02 будут выполняться в формате плавающей запятой с одинарной точностью вместо использования двойной точности. Это обеспечит небольшое увеличение скорости с несущественной потерей качества. PREFERENCES_CLIPPINGIND;Индикация пересветов/затемнений +PREFERENCES_CURVEBBOXPOS;Позиция кнопок для копирования и вставки кривых +PREFERENCES_CURVEBBOXPOS_ABOVE;Выше +PREFERENCES_CURVEBBOXPOS_BELOW;Ниже +PREFERENCES_CURVEBBOXPOS_LEFT;Слева +PREFERENCES_CURVEBBOXPOS_RIGHT;Справа PREFERENCES_CUSTPROFBUILD;Создание собственного профиля обработки PREFERENCES_CUSTPROFBUILDHINT;Исполняемый (или скриптовой) файл, вызываемый, когда для изображения должен быть сгенерирован новый профиль обработки.\n\nПуть к коммуникационному файлу (стиля *.ini) будет добавлен как параметр. Он содержит различные параметры, требуемые для скрипта и значения Exif фотографии для возможности генерации профиля основанной на правилах.\n\nВнимание: Необходимо использовать двойные кавычки при необходимости, если вы используете пути, содержащие пробелы. PREFERENCES_CUSTPROFBUILDKEYFORMAT;Формат ключей @@ -642,28 +705,26 @@ PREFERENCES_CUSTPROFBUILDPATH;Путь к исполняемому файлу PREFERENCES_CUTOVERLAYBRUSH; Цвет/прозрачность маски обрезки PREFERENCES_D50;5000K +PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Темновой кадр PREFERENCES_DARKFRAMEFOUND;Найдено PREFERENCES_DARKFRAMESHOTS;снимков PREFERENCES_DARKFRAMETEMPLATES;шаблонов PREFERENCES_DATEFORMAT;Формат даты -PREFERENCES_DATEFORMATHINT;Вы можете использовать следующие элементы форматирования:\n%y: год\n%m: месяц\n%d: день\n\nНапример, венгерский формат даты такой:\n%y/%m/%d +PREFERENCES_DATEFORMATHINT;Вы можете использовать следующие элементы форматирования:\n%y: год\n%m: месяц\n%d: день\n\nНапример, ISO 8601 требует использовать следующий формат даты:\n%y-%m-%d PREFERENCES_DIRDARKFRAMES;Каталог размещения темновых кадров PREFERENCES_DIRHOME;Домашний каталог PREFERENCES_DIRLAST;Последний каталог PREFERENCES_DIROTHER;Другой PREFERENCES_DIRSELECTDLG;Каталог, открываемый при запуске программы PREFERENCES_DIRSOFTWARE;Каталог установки -PREFERENCES_EDITORCMDLINE;Другой (путь к исполняемому файлу) PREFERENCES_EDITORLAYOUT;Тип редактора PREFERENCES_EXTERNALEDITOR;Внешний редактор PREFERENCES_FBROWSEROPTS;Настройки -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Однорядная панель обозревателя файлов (отключите для экранов с низким разрешением) +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Однорядная панель обозревателя файлов\n(отключите для экранов с низким разрешением) PREFERENCES_FILEFORMAT;Формат файлов -PREFERENCES_FLATFIELD;Плоское поле PREFERENCES_FLATFIELDFOUND;Найдено PREFERENCES_FLATFIELDSDIR;Папка с файлами плоских полей PREFERENCES_FLATFIELDSHOTS;снимков @@ -685,12 +746,13 @@ PREFERENCES_HISTOGRAMPOSITIONLEFT;Гистограмма на левой панели PREFERENCES_HLTHRESHOLD;Порог срабатывания пересветов PREFERENCES_ICCDIR;Каталог ICC профилей -PREFERENCES_IMPROCPARAMS;Обработка по умолчанию +PREFERENCES_IMPROCPARAMS;Профиль обработки по умолчанию PREFERENCES_INTENT_ABSOLUTE;Абсолютное колориметрическое PREFERENCES_INTENT_PERCEPTUAL;Перцепционное PREFERENCES_INTENT_RELATIVE;Относительное колориметрическое PREFERENCES_INTENT_SATURATION;По насыщенности PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Показывать встроенную миниатюру если файл не отредактирован +PREFERENCES_LANG;Язык PREFERENCES_LANGAUTODETECT;Использовать язык ОС PREFERENCES_MENUGROUPEXTPROGS;Группа "Открыть с помощью" PREFERENCES_MENUGROUPFILEOPERATIONS;Группа "Действия с файлами" @@ -699,13 +761,15 @@ PREFERENCES_MENUGROUPRANK;Группа "Рейтинг" PREFERENCES_MENUOPTIONS;Настройки контекстного меню PREFERENCES_METADATA;Метаданные +PREFERENCES_MONITOR;Монитор PREFERENCES_MULTITAB;Много вкладок PREFERENCES_MULTITABDUALMON;Много вкладок, на втором мониторе (если возможно) +PREFERENCES_NOISE;Подавление шумов PREFERENCES_OUTDIR;Каталог для сохранения изображений PREFERENCES_OUTDIRFOLDER;Сохранять в каталог PREFERENCES_OUTDIRFOLDERHINT;Сохранение изображений в выбранный каталог PREFERENCES_OUTDIRTEMPLATE;Использовать шаблон -PREFERENCES_OUTDIRTEMPLATEHINT;Вы можете использовать следующие элементы форматирования:\n%f, %d1, %d2, …, %p1, %p2, …, %r, %s1, %s2, …\n\nЭлементы соответствуют различным элементам в пути к RAW-файлу, некоторым атрибутам файла или индексу в очереди обработки.\n\nНапример, если был открыт файл /home/tom/image/02-09-2006/dsc0012.nef, элементы форматирования будут выглядеть так:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r заменится на рейтинг фотографии, либо '0' при пустом, либо на 'x' если фотография находится в корзине.\n\n%s1, %s2 и т.д. заменятся на индекс фотографии в очереди обработки, дополненный нулями до 1-9 символов. Индекс сбрасывается при старте и увеличивается на единицу при обработке фотографии.\nЕсли вы хотите сохранять изображения в каталоге с оригиналом, введите:\n%p1/%f\n\nЕсли вы хотите сохранять изображения в каталоге "converted" в каталоге оригинального файла, введите строку:\n%p1/converted/%f\nДля сохранения изображений в папке "/home/tom/photos/converted/2010-10-31", напишите:\n%p2/converted/%d1/%f +PREFERENCES_OUTDIRTEMPLATEHINT;Вы можете использовать следующие элементы форматирования:\n%f, %d1, %d2, …, %p1, %p2, …, %r, %s1, %s2, …\n\nЭлементы соответствуют различным элементам в пути к RAW-файлу, некоторым атрибутам файла или индексу в очереди пакетной обработки.\n\nНапример, если был открыт файл /home/tom/image/2006-02-09/dsc0012.nef, элементы форматирования будут выглядеть так:\n%d4 = home\n%d3 = tom\n%d2 = photos\n%d1 = 2006-02-09\n%f = dsc0042\n%p1 = /home/tom/photos/2010-10-31/\n%p2 = /home/tom/photos/\n%p3 = /home/tom/\n%p4 = /home/\n\n%r заменится на рейтинг фотографии, либо '0' при пустом, либо на 'x' если фотография находится в корзине.\n\n%s1, %s2 и т.д. заменятся на индекс фотографии в очереди обработки, дополненный нулями до 1-9 символов. Индекс сбрасывается при старте и увеличивается на единицу при обработке фотографии.\nЕсли вы хотите сохранять изображения в каталоге с оригиналом, введите:\n%p1/%f\n\nЕсли вы хотите сохранять изображения в каталоге "converted" в каталоге оригинального файла, введите строку:\n%p1/converted/%f\nДля сохранения изображений в папке "/home/tom/photos/converted/2006-02-09", напишите:\n%p2/converted/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Показывать информацию поверх миниатюр PREFERENCES_OVERWRITEOUTPUTFILE;Перезаписывать существующие файлы PREFERENCES_PANFACTORLABEL;Коэффициент @@ -713,6 +777,10 @@ PREFERENCES_PARSEDEXTADD;Добавить PREFERENCES_PARSEDEXTADDHINT;Введите расширение и нажмите на эту кнопку, чтобы добавить его в список PREFERENCES_PARSEDEXTDELHINT;Удаление выбранных расширений из списка +PREFERENCES_PREVDEMO;Метод демозаика для превью +PREFERENCES_PREVDEMO_FAST;Быстрый +PREFERENCES_PREVDEMO_LABEL;Метод демозаика, используемый для превью при масштабе < 100% +PREFERENCES_PREVDEMO_SIDECAR;Как в PP3 PREFERENCES_PROFILEHANDLING;Профиль обработки PREFERENCES_PROFILELOADPR;Приоритет загрузки профиля обработки PREFERENCES_PROFILEPRCACHE;загружать из кэша @@ -722,7 +790,7 @@ PREFERENCES_PROPERTY;Свойство PREFERENCES_PSPATH;Каталог установки Adobe Photoshop PREFERENCES_RGBDTL_LABEL;Максимальное количество потоков для подавления шума -PREFERENCES_RGBDTL_TOOLTIP;Подавление шума требует в среднем 128М оперативной памяти для изображения в 10MPix или 512M для 40MPix и дополнительно 128MB на поток. Чем больше потоков будет запущено одновременно, тем быстрее будет расчёт. Оставьте 0 чтоб использовать максимально возможное количество потоков. +PREFERENCES_RGBDTL_TOOLTIP;Оставьте 0 чтоб использовать максимально возможное количество потоков. Чем больше потоков будет запущено одновременно, тем быстрее будет расчёт. Требования к памяти указаны в RawPedia PREFERENCES_SELECTFONT;Выбрать шрифт PREFERENCES_SELECTLANG;Выбрать язык PREFERENCES_SELECTTHEME;Выбрать тему @@ -734,16 +802,18 @@ PREFERENCES_SINGLETAB;Одна вкладка редактирования PREFERENCES_SINGLETABVERTAB;Одна вкладка редактирования, вертикальная панель вкладок PREFERENCES_SND_BATCHQUEUEDONE;Пакетная обработка завершена -PREFERENCES_SND_HELP;Введите имя файла, либо оставьте поле пустым (без звука). В Windows можно использовать "SystemDefault", "SystemAsterisk" и т.д. для системных звуков. +PREFERENCES_SND_HELP;Введите имя файла, либо оставьте поле пустым (без звука). \nДля использования системных звуков в Windows можно использовать "SystemDefault", "SystemAsterisk", в Linux "complete", "window-attention" и т.д. PREFERENCES_SND_LNGEDITPROCDONE;Обработка в редакторе завершена PREFERENCES_SND_TRESHOLDSECS;после, секунд PREFERENCES_STARTUPIMDIR;Каталог изображений при запуске PREFERENCES_TAB_BROWSER;Файловый браузер PREFERENCES_TAB_COLORMGR;Управление цветом -PREFERENCES_TAB_GENERAL;Основные настройки +PREFERENCES_TAB_DYNAMICPROFILE;Динамические профили +PREFERENCES_TAB_GENERAL;Основное PREFERENCES_TAB_IMPROC;Обработка изображения PREFERENCES_TAB_PERFORMANCE;Производительность PREFERENCES_TAB_SOUND;Звуки +PREFERENCES_THEME;Тема PREFERENCES_TP_LABEL;Панель инструментов: PREFERENCES_TP_USEICONORTEXT;Использовать иконки вместо текста PREFERENCES_TP_VSCROLLBAR;Спрятать вертикальную полосу прокрутки @@ -808,7 +878,7 @@ THRESHOLDSELECTOR_T;Верх THRESHOLDSELECTOR_TL;Верхний левый THRESHOLDSELECTOR_TR;Верхний правый -TOOLBAR_TOOLTIP_CROP;Кадрирование\nгорячая клавиша: C\nДля перемещения области зажмите Shift и переносите мышью. +TOOLBAR_TOOLTIP_CROP;Кадрирование\nгорячая клавиша: C\nДля перемещения области обрезки зажмите Shift и перетаскивайте мышью. TOOLBAR_TOOLTIP_HAND;Инструмент "Рука"\nГорячая клавиша: H TOOLBAR_TOOLTIP_STRAIGHTEN;Выравнивание / Точный поворот\nГорячая клавиша: S\n\nУкажите вертикаль или горизонталь проведя направляющую по рисунку. Угол поворота будет показан возле направляющей. Осью поворота является геометрический центр изображения. TOOLBAR_TOOLTIP_WB;Указать белую точку\nГорячая клавиша: W @@ -825,7 +895,7 @@ TP_BWMIX_CURVEEDITOR2;Кривая "После" TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Тональная кривая после конверсии в Ч/Б, в конце обработки. TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Тональная кривая сразу перед конверсией в Ч/Б.\nМожет учитывать цветовые компоненты. -TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Модифицирует яркость как функцию от цвета.\nУчитывает предельные значения, способные вызывать искажения +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Модифицирует яркость как функцию от цвета.\nУчтите что предельные значения могут вызывать искажения. TP_BWMIX_FILTER;Цветовой фильтр TP_BWMIX_FILTER_BLUE;Синий TP_BWMIX_FILTER_BLUEGREEN;Синий-Зелёный @@ -863,6 +933,10 @@ TP_BWMIX_SET_ORTHOCHRO;Ортохроматический TP_BWMIX_SET_PANCHRO;Панхроматический TP_BWMIX_SET_PORTRAIT;Портретный +TP_BWMIX_SET_RGBABS;Абсолютный RGB +TP_BWMIX_SET_RGBREL;Относительный RGB +TP_BWMIX_SET_ROYGCBPMABS;Абсолютный ROYGCBPM +TP_BWMIX_SET_ROYGCBPMREL;Относительный ROYGCBPM TP_BWMIX_TCMODE_FILMLIKE;Ч&Б плёнка TP_BWMIX_TCMODE_SATANDVALBLENDING;Ч&Б насыщенность+значение TP_BWMIX_TCMODE_STANDARD;Ч&Б Стандарт @@ -877,8 +951,8 @@ TP_CHMIXER_RED;Красный TP_CHROMATABERR_LABEL;Хроматические аберрации TP_COARSETRAF_TOOLTIP_HFLIP;Горизонтальное зеркальное отражение -TP_COARSETRAF_TOOLTIP_ROTLEFT;Повернуть влево -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Повернуть вправо +TP_COARSETRAF_TOOLTIP_ROTLEFT;Повернуть влево\n\nГорячие клавиши:\n[ - режим множественных редакторов,\nAlt-[ - режим одного редактора +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Повернуть вправо\n\nГорячие клавиши:\n] - режим множественных редакторов,\nAlt-] - режим одного редактора TP_COARSETRAF_TOOLTIP_VFLIP;Вертикальное зеркальное отражение TP_COLORAPP_ADAPTSCENE;Яркость обстановки TP_COLORAPP_ADAPTSCENE_TOOLTIP;Абсолютная освещённость места и объекта съёмки (кд/м²).\n1) Высчитывается из данных Exif:\nВыдержка − Значение ISO − Значение F − Внутрикамерная коррекция выдержки.\n2) Высчитывается из точки белого в raw и значения компенсации экспозиции RT. @@ -890,31 +964,31 @@ TP_COLORAPP_ALGO_JC;Светимость + Цвет (JC) TP_COLORAPP_ALGO_JS;Светимость + Насыщенность (JS) TP_COLORAPP_ALGO_QM;Яркость + Красочность (QM) -TP_COLORAPP_ALGO_TOOLTIP;Позволяет выбирать между всеми парамерами или их подмножествами. +TP_COLORAPP_ALGO_TOOLTIP;Позволяет выбирать между всеми параметрами или их подмножествами. TP_COLORAPP_BADPIXSL;Фильтр горячих/битых пикселей TP_COLORAPP_BADPIXSL_TOOLTIP;Подавляет горячие/битые (слишком яркие) пиксели.\n0: без эффекта\n1: средний (медианный)\n2: гауссиан.\n\nЭти искажения возникают в связи с ограничениями CIECAM02. Иначе настройте изображение для уменьшения очень тёмных теней. TP_COLORAPP_BRIGHT;Яркость (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Яркость в модели CIECAM02 берёт в расчёт яркость белого и отличается от яркости в моделях Lab и RGB. +TP_COLORAPP_BRIGHT_TOOLTIP;Яркость в модели CIECAM02 берёт в расчёт яркость белого и отличается от яркости в моделях L*a*b* и RGB. TP_COLORAPP_CHROMA;Цвет (C) TP_COLORAPP_CHROMA_M;Красочность (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Красочность в модели CIECAM02 отличается от красочности в моделях Lab и RGB. +TP_COLORAPP_CHROMA_M_TOOLTIP;Красочность в модели CIECAM02 отличается от красочности в моделях L*a*b* и RGB. TP_COLORAPP_CHROMA_S;Насыщенность (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Насыщенность в модели CIECAM02 отличается от насыщенности в моделях Lab и RGB. -TP_COLORAPP_CHROMA_TOOLTIP;Цвет в модели CIECAM02 отличается от цвета в моделях Lab и RGB. +TP_COLORAPP_CHROMA_S_TOOLTIP;Насыщенность в модели CIECAM02 отличается от насыщенности в моделях L*a*b* и RGB. +TP_COLORAPP_CHROMA_TOOLTIP;Цвет в модели CIECAM02 отличается от цвета в моделях L*a*b* и RGB. TP_COLORAPP_CIECAT_DEGREE;Адаптация CAT02 TP_COLORAPP_CONTRAST;Контраст (J) TP_COLORAPP_CONTRAST_Q;Контраст (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Контраст в модели CIECAM02 для слайдера Q. Он отличается от контраста в моделях Lab и RGB. -TP_COLORAPP_CONTRAST_TOOLTIP;Контраст в модели CIECAM02 для слайдера J. Он отличается от контраста в моделях Lab и RGB. +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Контраст в модели CIECAM02 для слайдера Q. Он отличается от контраста в моделях L*a*b* и RGB. +TP_COLORAPP_CONTRAST_TOOLTIP;Контраст в модели CIECAM02 для слайдера J. Он отличается от контраста в моделях L*a*b* и RGB. TP_COLORAPP_CURVEEDITOR1;Тональная кривая 1 -TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Показывает яркостную гистограмму L (Lab) перед CIECAM02.\nЕсли стоит галка "Показывать кривые в CIECAM02", показывает гистограмму J или Q после CIECAM02.\n\nJ и Q не отображаются в главной гистограмме.\n\nИтоговый вывод смотрите на основной гистограмме. +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Показывает яркостную гистограмму L (L*a*b*) перед CIECAM02.\nЕсли стоит галка "Показывать кривые в CIECAM02", показывает гистограмму J или Q после CIECAM02.\n\nJ и Q не отображаются в главной гистограмме.\n\nИтоговый вывод смотрите на основной гистограмме. TP_COLORAPP_CURVEEDITOR2;Тональная кривая 2 TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Использование аналогично второй кривой в разделе экспозиции. TP_COLORAPP_CURVEEDITOR3;Цветовая кривая -TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Позволяет настроить цвет (C), насыщенность (S) или красочность (M).\n\nПоказывает гистограмму насыщенности (Lab) перед CIECAM02.\nЕсли стоит галка "Показывать кривые в CIECAM02", показывает в гистограмме значения C, s или M. C, s и M не показываются в основной гистограмме.\nИтоговый вывод смотрите на основной гистограмме. +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Позволяет настроить цвет (C), насыщенность (S) или красочность (M).\n\nПоказывает гистограмму насыщенности (L*a*b*) перед CIECAM02.\nЕсли стоит галка "Показывать кривые в CIECAM02", показывает в гистограмме значения C, s или M. C, s и M не показываются в основной гистограмме.\nИтоговый вывод смотрите на основной гистограмме. TP_COLORAPP_DATACIE;Показывать кривые в CIECAM02 -TP_COLORAPP_GAMUT;Контроль гаммы (Lab) -TP_COLORAPP_GAMUT_TOOLTIP;Позволяет контролировать гамму в режиме Lab. +TP_COLORAPP_GAMUT;Контроль гаммы (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Позволяет контролировать гамму в режиме L*a*b*. TP_COLORAPP_HUE;Цвет (h) TP_COLORAPP_MODEL;Модель точки белого TP_COLORAPP_SHARPCIE;--неиспользуемый-- @@ -924,13 +998,16 @@ TP_CROP_GTEPASSPORT;Биометрический паспорт TP_CROP_GTFRAME;Рамка TP_CROP_GTGRID;Сетка +TP_CROP_GTHARMMEANS;Гармоническое среднее TP_CROP_GTNONE;Нет TP_CROP_GTRULETHIRDS;Правило третей +TP_CROP_GTTRIANGLE1;Золотые треугольники 1 +TP_CROP_GTTRIANGLE2;Золотые треугольники 2 TP_CROP_GUIDETYPE;Тип направляющей: TP_CROP_H;Высота TP_CROP_LABEL;Кадрирование TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; Включить режим обрезки +TP_CROP_SELECTCROP;Включить режим обрезки TP_CROP_W;Ширина TP_CROP_X;x TP_CROP_Y;y @@ -939,20 +1016,44 @@ TP_DEFRINGE_LABEL;Подавление ореолов TP_DEFRINGE_RADIUS;Радиус TP_DEFRINGE_THRESHOLD;Порог -TP_DIRPYRDENOISE_BLUE;Цветность: синий-жёлтый -TP_DIRPYRDENOISE_CHROMA;Цветность +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Автоматический глобальный +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Цветность: синий-жёлтый +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Кривая цветности +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Цветность +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Ручной +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Цветность +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Метод +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Превью +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Цветность: красный-зелёный TP_DIRPYRDENOISE_ENH;Улучшенный режим TP_DIRPYRDENOISE_ENH_TOOLTIP;Улучшает качество шумоподавления путём увеличения времени обработки на 20%. -TP_DIRPYRDENOISE_GAMMA;Гамма -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Значение гаммы изменяет диапазон тонов для подавления шума. Уменьшение значения влияет на тени, увеличение расширит эффект на более светлые тона. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Подавление шума -TP_DIRPYRDENOISE_LDETAIL;Детализация яркости -TP_DIRPYRDENOISE_LUMA;Яркость -TP_DIRPYRDENOISE_METHOD;Метод -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Для raw-изображений можно использовать как режим RGB так и Lab.\n\nДля не-raw будет использован Lab режим вне зависимости от выбора. -TP_DIRPYRDENOISE_RED;Цветность: красный-зелёный -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LABEL;Подавление шумов +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Контроль яркости +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Кривая яркости +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Детализация яркости +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Яркость +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Яркость +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Цветовое пространство +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Подавление шума +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Для raw-изображений можно использовать как режим RGB так и L*a*b*.\n\nДля не-raw будет использован L*a*b* режим вне зависимости от выбора. +TP_DIRPYRDENOISE_MAIN_GAMMA;Гамма +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Значение гаммы изменяет диапазон тонов для подавления шума. Уменьшение значения влияет на тени, увеличение расширит эффект на более светлые тона. +TP_DIRPYRDENOISE_MAIN_MODE;Режим +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Агрессивный +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Осторожный +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Осторожный" сохраняет низкочастотные структуры цветности, в то время как "агрессивный" уничтожает их. +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_SLI;Ползунок +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 мягкий +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 мягкий +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Диапазон цветов кожи TP_DIRPYREQUALIZER_LABEL;Контраст по уровню деталей TP_DIRPYREQUALIZER_LUMACOARSEST;Крупные TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Контраст- @@ -963,11 +1064,12 @@ TP_DISTORTION_AMOUNT;Величина TP_DISTORTION_LABEL;Дисторсия TP_EPD_EDGESTOPPING;Определение контуров +TP_EPD_GAMMA;Гамма TP_EPD_LABEL;Тональная компрессия TP_EPD_REWEIGHTINGITERATES;Перевзвешивание проходов TP_EPD_SCALE;Масштаб TP_EPD_STRENGTH;Интенсивность -TP_EPD_TOOLTIP;Тональная компрессия возможна в режиме Lab (по умолчанию) и CIECAM02.\n\n.Для использования модели тональной компрессии CIECAM02 включите следующие настройки:\n1. CIECAM02\n2. Алгоритм Яркость+Красочность (QM)\n3. Тональная компрессия, использующая яркость CIECAM02 (Q). +TP_EPD_TOOLTIP;Тональная компрессия возможна в режиме L*a*b* (по умолчанию) и CIECAM02.\nВ режиме L*a*b* тональная компрессия также может быть использована для остаточного изображения Вейвлетов.\n\n.Для использования модели тональной компрессии CIECAM02 включите следующие настройки:\n1. CIECAM02\n2. Алгоритм Яркость+Красочность (QM)\n3. Тональная компрессия, использующая яркость CIECAM02 (Q). TP_EXPOSURE_AUTOLEVELS;Автоуровни TP_EXPOSURE_AUTOLEVELS_TIP;Переключение выполнения автоуровней для автоматической установки параметров экспозиции на основе анализа изображения TP_EXPOSURE_BLACKLEVEL;Уровень чёрного @@ -982,14 +1084,21 @@ TP_EXPOSURE_CURVEEDITOR2;Тональная кривая 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Для понимания того, как достичь лучших результов, используя две кривые, прочтите следующий раздел Руководства:\nИнструменты → Вкладка "Экспозиция" → Экспозиция → Тональная кривая TP_EXPOSURE_EXPCOMP;Компенсация экспозиции +TP_EXPOSURE_HISTMATCHING;Автоопределение тоновой кривой +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Автоматическая настройка ползунков и кривых (исключая компенсацию экспозиции) для соответствия с встроенной миниатюрой JPEG. TP_EXPOSURE_LABEL;Экспозиция TP_EXPOSURE_SATURATION;Насыщенность TP_EXPOSURE_TCMODE_FILMLIKE;Плёнка TP_EXPOSURE_TCMODE_LABEL1;Режим кривой 1 TP_EXPOSURE_TCMODE_LABEL2;Режим кривой 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Светимость +TP_EXPOSURE_TCMODE_PERCEPTUAL;Субъективный TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Насыщенность+значение TP_EXPOSURE_TCMODE_STANDARD;Стандарт TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Средневзвешенный стандарт +TP_FILMSIMULATION_LABEL;Имитация плёнки +TP_FILMSIMULATION_STRENGTH;Сила +TP_FILMSIMULATION_ZEROCLUTSFOUND;Настройте каталог с файлами HaldCLUT в настройках TP_FLATFIELD_AUTOSELECT;Автоматический выбор TP_FLATFIELD_BLURRADIUS;Радиус размытия TP_FLATFIELD_BLURTYPE;Тип размытия @@ -1029,6 +1138,7 @@ TP_HSVEQUALIZER_VAL;V TP_ICM_BLENDCMSMATRIX;Смешивать засветы с матрицей TP_ICM_BLENDCMSMATRIX_TOOLTIP;Включить восстановление пересветов во время использования профилей ICC на основе LUT +TP_ICM_BPC;Компенсация точки чёрного TP_ICM_DCPILLUMINANT;Источник света TP_ICM_DCPILLUMINANT_INTERPOLATED;Интерполированный TP_ICM_INPUTCAMERA;По умолчанию для камеры @@ -1084,7 +1194,7 @@ TP_LABCURVE_CURVEEDITOR_LH;ЯО TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Яркость в соответствии с оттенком.\nL=f(H) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Яркость в соответствии с яркостью.\nL=f(L) -TP_LABCURVE_LABEL;Кривые Lab +TP_LABCURVE_LABEL;Кривые L*a*b* TP_LABCURVE_LCREDSK;Ограничить применение кривой ЯЦ TP_LABCURVE_LCREDSK_TIP;Если включено, то кривая яркости от цвета применится лишь для тонов кожи и красных оттенков.\nИначе применится для всех тонов TP_LABCURVE_RSTPROTECTION;Защита красного и тонов кожи @@ -1096,6 +1206,16 @@ TP_LENSPROFILE_USECA;Корректировать ХА TP_LENSPROFILE_USEDIST;Корректировать дисторсию TP_LENSPROFILE_USEVIGN;Корректировать виньетирование +TP_LOCALCONTRAST_AMOUNT;Величина +TP_LOCALCONTRAST_DARKNESS;Тёмные тона +TP_LOCALCONTRAST_LABEL;Локальный контраст +TP_LOCALCONTRAST_LIGHTNESS;Светлые тона +TP_LOCALCONTRAST_RADIUS;Радиус +TP_METADATA_EDIT;Применить изменения +TP_METADATA_MODE;Режим копирования метаданных +TP_METADATA_STRIP;Удалить всё +TP_METADATA_TUNNEL;Скопировать неизменённо +TP_NEUTRAL;Сбросить TP_NEUTRAL_TIP;Сбросить настройки выдержки на средние значения TP_PCVIGNETTE_FEATHER;Размытие TP_PCVIGNETTE_FEATHER_TOOLTIP;Размытие:\n0=только углы, 50=наполовину к центру, 100=к центру. @@ -1120,19 +1240,36 @@ TP_RAWEXPOS_LINEAR;Коррекция точки белого TP_RAWEXPOS_PRESER;Сохранение пересветов TP_RAWEXPOS_TWOGREEN;Два зеленых совместно +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Расширенный DCB TP_RAW_DCBITERATIONS;Количество итераций DCB TP_RAW_DMETHOD;Метод TP_RAW_DMETHOD_PROGRESSBAR;Демозаик %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Улучшение демозаика... -TP_RAW_DMETHOD_TOOLTIP;Внимание: Методы IGV и LMMSE предназначены для фотографий с высокими значениями ISO. +TP_RAW_DMETHOD_TOOLTIP;Внимание: Методы IGV и LMMSE предназначены для фотографий с высокими значениями ISO чтобы избежать искажения детализации и цветов картинки при подавлении шума. Сдвиг пикселей предназначен для файлов Pentax/Sony, с поддержкой этого режима. Он сбрасывается на AMaZE для обычных файлов. +TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Шагов подавления ложных цветов: +TP_RAW_FAST;Быстрый +TP_RAW_HD;Порог +TP_RAW_HD_TOOLTIP;Низкие значения делают обнаружение мёртвых/горячих пикселей более агрессивным, но ложные срабатывания могут приводить к артефактам. Если вы заметили какие-либо артефакты, появляющиеся при включении фильтра, постепенно увеличивайте пороговое значение, пока они не исчезнут. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV TP_RAW_LABEL;Демозаик +TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;Шагов улучшения LMMSE TP_RAW_LMMSE_TOOLTIP;Добавляет гамму (шаг 1), вычисляет среднее (шаги 2-4) и уточняет демозаик (шаги 5-6) для уменьшения искажений и улучшения соотношения сигнала к шуму. +TP_RAW_MONO;Моно +TP_RAW_NONE;Нет (Показать структуру сенсора) +TP_RAW_PIXELSHIFT;Сдвиг пикселей +TP_RAW_RCD;RCD +TP_RAW_SENSOR_BAYER_LABEL;Сенсор с матрицей Байера +TP_RAW_SENSOR_XTRANS_LABEL;Сенсор с матрицей X-Trans +TP_RAW_VNG4;VNG4 TP_RESIZE_APPLIESTO;Применить к: TP_RESIZE_CROPPEDAREA;Кадрированной области -TP_RESIZE_FITBOX;Ограничивающей рамке +TP_RESIZE_FITBOX;Ограничивающую рамку TP_RESIZE_FULLIMAGE;Полному изображению TP_RESIZE_H;В: TP_RESIZE_HEIGHT;высоту @@ -1144,6 +1281,10 @@ TP_RESIZE_SPECIFY;Задать: TP_RESIZE_W;Ш: TP_RESIZE_WIDTH;ширину +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Яркость в зависимости от яркости L=f(L)\nКорректирует сырые данные для уменьшения ореолов и артефактов. +TP_RETINEX_CURVEEDITOR_LH;Сила=f(H) +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Канал TP_RGBCURVES_GREEN;G @@ -1163,7 +1304,7 @@ TP_SHADOWSHLIGHTS_SHADOWS;Тени TP_SHADOWSHLIGHTS_SHARPMASK;Маска резкости TP_SHADOWSHLIGHTS_SHTONALW;Уровень -TP_SHARPENEDGE_AMOUNT;Количество +TP_SHARPENEDGE_AMOUNT;Величина TP_SHARPENEDGE_LABEL;Края TP_SHARPENEDGE_PASSES;Подходы TP_SHARPENEDGE_THREE;Только освещенность @@ -1182,10 +1323,13 @@ TP_SHARPENING_RLD_ITERATIONS;Повторений TP_SHARPENING_THRESHOLD;Порог TP_SHARPENING_USM;Маска размытия -TP_SHARPENMICRO_AMOUNT;Количество +TP_SHARPENMICRO_AMOUNT;Величина TP_SHARPENMICRO_LABEL;Микроконтраст TP_SHARPENMICRO_MATRIX;Матрица 3×3 вместо 5×5 TP_SHARPENMICRO_UNIFORMITY;Равномерность +TP_TM_FATTAL_AMOUNT;Величина +TP_TM_FATTAL_LABEL;Отображение тонов HDR +TP_TM_FATTAL_THRESHOLD;Порог TP_VIBRANCE_AVOIDCOLORSHIFT;Избегать сдвига цветов TP_VIBRANCE_CURVEEDITOR_SKINTONES;ОО TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Оттенки кожи @@ -1194,7 +1338,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Красный/Желтый TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Желтый TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Оттенок в соответствии с оттенком -TP_VIBRANCE_LABEL;Резонанс +TP_VIBRANCE_LABEL;Красочность TP_VIBRANCE_PASTELS;Пастельные тона TP_VIBRANCE_PASTSATTOG;Связать пастельные и насыщенные тона TP_VIBRANCE_PROTECTSKINS;Сохранить оттенки кожи @@ -1210,6 +1354,8 @@ TP_VIGNETTING_LABEL;Виньетирование TP_VIGNETTING_RADIUS;Радиус TP_VIGNETTING_STRENGTH;Степень +TP_WAVELET_STREN;Сила +TP_WAVELET_STRENGTH;Сила TP_WBALANCE_AUTO;Автоматический TP_WBALANCE_CAMERA;Камера TP_WBALANCE_CLOUDY;Облачно @@ -1258,32 +1404,23 @@ TP_WBALANCE_WATER_HEADER;Подводный ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Новое окно детального просмотра -ZOOMPANEL_ZOOM100;Масштаб 100% z -ZOOMPANEL_ZOOMFITSCREEN;По размерам окна f -ZOOMPANEL_ZOOMIN;Приблизить + -ZOOMPANEL_ZOOMOUT;Удалить - +ZOOMPANEL_ZOOM100;Масштаб 100%\nГорячая клавиша: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Уместить кадрированное изображение по размеру экрану\nГорячая клавиша: f +ZOOMPANEL_ZOOMFITSCREEN;Уместить изображение по размерам окна\nГорячая клавиша: Alt-f +ZOOMPANEL_ZOOMIN;Приблизить\nГорячая клавиша: + +ZOOMPANEL_ZOOMOUT;Отдалить\nГорячая клавиша: - !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!CURVEEDITOR_AXIS_IN;I: +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_LEFT_TAN;LT: -!CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. -!DONT_SHOW_AGAIN;Don't show this message again. -!DYNPROFILEEDITOR_DELETE;Delete -!DYNPROFILEEDITOR_EDIT;Edit -!DYNPROFILEEDITOR_EDIT_RULE;Edit Dynamic Profile Rule -!DYNPROFILEEDITOR_ENTRY_TOOLTIP;The matching is case insensitive.\nUse the "re:" prefix to enter\na regular expression. -!DYNPROFILEEDITOR_MOVE_DOWN;Move Down -!DYNPROFILEEDITOR_MOVE_UP;Move Up -!DYNPROFILEEDITOR_NEW;New -!DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule -!DYNPROFILEEDITOR_PROFILE;Processing Profile !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1291,26 +1428,15 @@ !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !FILEBROWSER_POPUPRANK0;Unrank -!FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. -!FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles -!FILECHOOSER_FILTER_CURVE;Curve files -!FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles !FILECHOOSER_FILTER_SAME;Same format as current photo -!FILECHOOSER_FILTER_TIFF;TIFF files -!GENERAL_APPLY;Apply -!GENERAL_ASIMAGE;As Image -!GENERAL_OPEN;Open !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. -!HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1331,7 +1457,6 @@ !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity -!HISTORY_MSG_277;--unused-- !HISTORY_MSG_278;CT - Preserve luminance !HISTORY_MSG_279;CT - Shadows !HISTORY_MSG_280;CT - Highlights @@ -1351,10 +1476,9 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve -!HISTORY_MSG_300;- !HISTORY_MSG_301;NR - Luma control !HISTORY_MSG_302;NR - Chroma method !HISTORY_MSG_303;NR - Chroma method @@ -1526,6 +1650,7 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1551,28 +1676,12 @@ !IPTCPANEL_TITLEHINT;Enter a short verbal and human readable name for the image, this may be the file name. !IPTCPANEL_TRANSREFERENCE;Job ID !IPTCPANEL_TRANSREFERENCEHINT;Enter a number or identifier needed for workflow control or tracking. -!LENSPROFILE_CORRECTION_AUTOMATCH;Auto-matched correction parameters -!LENSPROFILE_CORRECTION_LCPFILE;LCP File -!LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters -!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. -!MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -!MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l !MONITOR_PROFILE_SYSTEM;System default -!NAVIGATOR_B;B: -!NAVIGATOR_G;G: -!NAVIGATOR_H;H: -!NAVIGATOR_LAB_A;a*: -!NAVIGATOR_LAB_B;b*: -!NAVIGATOR_LAB_L;L*: -!NAVIGATOR_NA; -- -!NAVIGATOR_R;R: -!NAVIGATOR_S;S: -!NAVIGATOR_V;V: +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation @@ -1582,9 +1691,8 @@ !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1597,16 +1705,17 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation -!PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons -!PREFERENCES_CURVEBBOXPOS_ABOVE;Above -!PREFERENCES_CURVEBBOXPOS_BELOW;Below -!PREFERENCES_CURVEBBOXPOS_LEFT;Left -!PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!PREFERENCES_D50_OLD;5000K +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 @@ -1619,7 +1728,6 @@ !PREFERENCES_INSPECT_LABEL;Inspect !PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximum number of cached images !PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. -!PREFERENCES_LANG;Language !PREFERENCES_LEVAUTDN;Denoising level !PREFERENCES_LEVDN;Cell size !PREFERENCES_LISS;Auto multi-zone smoothing @@ -1628,19 +1736,13 @@ !PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MIN;Mini (100x115) !PREFERENCES_MONINTENT;Default rendering intent -!PREFERENCES_MONITOR;Monitor !PREFERENCES_MONPROFILE;Default color profile !PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. !PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -!PREFERENCES_PREVDEMO;Preview Demosaic Method -!PREFERENCES_PREVDEMO_FAST;Fast -!PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: -!PREFERENCES_PREVDEMO_SIDECAR;As in PP3 !PREFERENCES_PRINTER;Printer (Soft-Proofing) !PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file !PREFERENCES_PROFILESAVELOCATION;Processing profile saving location @@ -1658,8 +1760,6 @@ !PREFERENCES_SIMPLAUT;Tool mode !PREFERENCES_SMA;Small (250x287) !PREFERENCES_STDAUT;Standard -!PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme !PREFERENCES_TIMAX;High !PREFERENCES_TINB;Number of tiles !PREFERENCES_TISTD;Standard @@ -1669,14 +1769,19 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool -!TP_BWMIX_SET_RGBABS;Absolute RGB -!TP_BWMIX_SET_RGBREL;Relative RGB -!TP_BWMIX_SET_ROYGCBPMABS;Absolute ROYGCBPM -!TP_BWMIX_SET_ROYGCBPMREL;Relative ROYGCBPM !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located @@ -1713,14 +1818,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1732,6 +1837,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1757,58 +1864,27 @@ !TP_COLORTONING_TWOBY;Special a* and b* !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. !TP_COLORTONING_TWOSTD;Standard chroma -!TP_CROP_GTHARMMEANS;Harmonic Means -!TP_CROP_GTTRIANGLE1;Golden Triangles 1 -!TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High -!TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 -!TP_DIRPYREQUALIZER_ALGO;Skin Color Range +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts !TP_DIRPYREQUALIZER_HUESKIN;Skin hue @@ -1817,15 +1893,9 @@ !TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. !TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. !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_EPD_GAMMA;Gamma -!TP_EXPOSURE_TCMODE_LUMINANCE;Luminance -!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points !TP_EXPOS_WHITEPOINT_LABEL;Raw White Points -!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 -!TP_FILMSIMULATION_ZEROCLUTSFOUND;Set HaldCLUT directory in Preferences !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;Baseline exposure @@ -1834,13 +1904,11 @@ !TP_ICM_APPLYHUESATMAP_TOOLTIP;Employ the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_APPLYLOOKTABLE_TOOLTIP;Employ the embedded DCP look table. The setting is only available if the selected DCP has one. -!TP_ICM_BPC;Black Point Compensation !TP_ICM_DCPILLUMINANT_TOOLTIP;Select which embedded DCP illuminant to employ. Default is "interpolated" which is a mix between the two based on white balance. The setting is only available if a dual-illuminant DCP with interpolation support is selected. !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. -!TP_NEUTRAL;Reset !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1858,21 +1926,8 @@ !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAW_1PASSMEDIUM;1-Pass (Medium) !TP_RAW_3PASSBEST;3-Pass (Best) -!TP_RAW_AHD;AHD -!TP_RAW_AMAZE;AMaZE -!TP_RAW_DCB;DCB -!TP_RAW_EAHD;EAHD -!TP_RAW_FAST;Fast -!TP_RAW_HD;Threshold -!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear. -!TP_RAW_HPHD;HPHD -!TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. -!TP_RAW_LMMSE;LMMSE -!TP_RAW_MONO;Mono -!TP_RAW_NONE;None (Shows sensor pattern) -!TP_RAW_PIXELSHIFT;Pixel Shift +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask !TP_RAW_PIXELSHIFTEPERISO;ISO adaption @@ -1905,6 +1960,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1918,19 +1975,12 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red -!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. -!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix -!TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL !TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b* !TP_RETINEX_CONTEDIT_LH;Hue equalizer !TP_RETINEX_CONTEDIT_MAP;Mask equalizer -!TP_RETINEX_CURVEEDITOR_CD;L=f(L) -!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. -!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H) !TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method. -!TP_RETINEX_CURVEEDITOR_MAP;L=f(L) !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! !TP_RETINEX_EQUAL;Equalizer !TP_RETINEX_FREEGAMMA;Free gamma @@ -2002,6 +2052,7 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_ANCHOR;Anchor !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2147,8 +2198,6 @@ !TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected. !TP_WAVELET_SKY;Sky targetting/protection !TP_WAVELET_SKY_TOOLTIP;At -100 sky-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 sky-tones are protected while all other tones are affected. -!TP_WAVELET_STREN;Strength -!TP_WAVELET_STRENGTH;Strength !TP_WAVELET_SUPE;Extra !TP_WAVELET_THR;Shadows threshold !TP_WAVELET_THRESHOLD;Highlight levels @@ -2167,4 +2216,3 @@ !TP_WAVELET_TON;Toning !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Serbian (Cyrilic Characters)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Serbian (Cyrilic Characters)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Serbian (Cyrilic Characters)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Serbian (Cyrilic Characters)" 2018-03-20 11:04:15.000000000 +0000 @@ -7,6 +7,7 @@ ABOUT_TAB_SPLASH;Увод ADJUSTER_RESET_TO_DEFAULT;Врати на подразумевано BATCHQUEUE_AUTOSTART;Сам започни +BATCHQUEUE_AUTOSTARTHINT;Покреће обраду фотографија када их закажете BATCHQUEUE_DESTFILENAME;Путања и име датотеке BATCH_PROCESSING;обрада CURVEEDITOR_CURVE;Кривуља @@ -154,12 +155,7 @@ FILEBROWSER_SHOWTRASHHINT;Приказује слике у смећу FILEBROWSER_SHOWUNCOLORHINT;Приказује слике које нису означене бојом Alt-0 FILEBROWSER_SHOWUNRANKHINT;Прикажи неоцењене слике -FILEBROWSER_STARTPROCESSING;Започни обраду -FILEBROWSER_STARTPROCESSINGHINT;Почиње обраду и чување заказаних слика -FILEBROWSER_STOPPROCESSING;Заустави обраду -FILEBROWSER_STOPPROCESSINGHINT;Зауставља обраду слика FILEBROWSER_THUMBSIZE;Преглед -FILEBROWSER_TOOLTIP_STOPPROCESSING;Покреће обраду фотографија када их закажете FILEBROWSER_UNRANK_TOOLTIP;Неоцењено.\nПречица: Shift-0 FILEBROWSER_ZOOMINHINT;Увећава преглед FILEBROWSER_ZOOMOUTHINT;Умањује преглед @@ -367,7 +363,6 @@ HISTORY_MSG_170;Жив - крива HISTORY_MSG_171;„LC“ крива HISTORY_MSG_172;Лаб - Забрани LC -HISTORY_MSG_173;УШ - Детаљи луминансе HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 адаптација HISTORY_MSG_176;CAM02 - Околина приказа @@ -397,7 +392,6 @@ HISTORY_MSG_200;CAM02 - Мапирање тонова HISTORY_MSG_201;УШ - Хроминанса Ц,З HISTORY_MSG_202;УШ - Хроминанса П,Y -HISTORY_MSG_203;УШ - Начин HISTORY_MSG_204;LMMSE кораци побољшања HISTORY_MSG_205;CAM02 - Врући/лош пиксели HISTORY_MSG_206;CAT02 - Аутоматска луминанса кадра @@ -540,8 +534,6 @@ MAIN_TOOLTIP_TOGGLE;Приказује слику пре и после обраде Б NAVIGATOR_XY_FULL;Ширина = %1, Висина = %2 NAVIGATOR_XY_NA;x = ○, y = ○ -OPTIONS_DEFIMG_MISSING;Није пронађен или доступан подразумевани профил за слике које нису у сировом формату.\n\nПроверите фасциклу са профилима, можда не постоји или је оштећена.\n\nБиће коришћене подразумеване вредности. -OPTIONS_DEFRAW_MISSING;Није пронађен или доступан подразумевани профил за слике у сировом формату.\n\nПроверите фасциклу са профилима, можда не постоји или је оштећена.\n\nБиће коришћене подразумеване вредности. PARTIALPASTE_BASICGROUP;Основна подешавања PARTIALPASTE_CACORRECTION;Исправљање аберација PARTIALPASTE_CHANNELMIXER;Мешање канала @@ -631,7 +623,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Тамни кадар PREFERENCES_DARKFRAMEFOUND;Нађен PREFERENCES_DARKFRAMESHOTS;снимака PREFERENCES_DARKFRAMETEMPLATES;шаблони @@ -643,13 +634,11 @@ PREFERENCES_DIROTHER;Неки други PREFERENCES_DIRSELECTDLG;Бира одређени директоријум са сликама... PREFERENCES_DIRSOFTWARE;Директоријум са инсталацијом -PREFERENCES_EDITORCMDLINE;Произвољна наредба PREFERENCES_EDITORLAYOUT;Размештај програма PREFERENCES_EXTERNALEDITOR;Спољни уређивач PREFERENCES_FBROWSEROPTS;Опције разгледача датотеке PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Прикажи алатке у једном реду PREFERENCES_FILEFORMAT;Формат датотеке -PREFERENCES_FLATFIELD;Равно поље PREFERENCES_FLATFIELDFOUND;Нађено PREFERENCES_FLATFIELDSDIR;Директоријум за равна поља PREFERENCES_FLATFIELDSHOTS;снимака @@ -960,19 +949,19 @@ TP_DEFRINGE_LABEL;Уклаљање ореола TP_DEFRINGE_RADIUS;Полупречник TP_DEFRINGE_THRESHOLD;Праг -TP_DIRPYRDENOISE_BLUE;Хроминанса: Плава-Жута -TP_DIRPYRDENOISE_CHROMA;Боја +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Хроминанса: Плава-Жута +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Боја +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Хроминанса - црвена-зелена TP_DIRPYRDENOISE_ENH;Побољшани режим TP_DIRPYRDENOISE_ENH_TOOLTIP;Повећава квалитет уклањања шума на уштрб око 20% времена за обраду. -TP_DIRPYRDENOISE_GAMMA;Гама -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Гама утиче на јачину уклањања шума преко опсег тонова. Мања вредност ће утицати на сенке, већа ће повећати овај ефекат и на светлије тонове. -TP_DIRPYRDENOISE_LABEL;Дирекционо пирамидно уклањање шума -TP_DIRPYRDENOISE_LDETAIL;Детаљи луминансе -TP_DIRPYRDENOISE_LUMA;Луминанса -TP_DIRPYRDENOISE_METHOD;Начин -TP_DIRPYRDENOISE_METHOD_TOOLTIP;За рав слике можете користити РГБ или Лаб режиме.\n\nЗа остале слике се користи Лаб, без обзира на избор. -TP_DIRPYRDENOISE_RED;Хроминанса - црвена-зелена -TP_DIRPYRDENOISE_RGB;РГБ +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Детаљи луминансе +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Луминанса +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Начин +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Дирекционо пирамидно уклањање шума +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;РГБ +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;За рав слике можете користити РГБ или Лаб режиме.\n\nЗа остале слике се користи Лаб, без обзира на избор. +TP_DIRPYRDENOISE_MAIN_GAMMA;Гама +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Гама утиче на јачину уклањања шума преко опсег тонова. Мања вредност ће утицати на сенке, већа ће повећати овај ефекат и на светлије тонове. TP_DIRPYREQUALIZER_LABEL;Детаљни ниво контраста TP_DIRPYREQUALIZER_LUMACOARSEST;грубо TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Контраст- @@ -1280,7 +1269,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Отвара нови прозор са детаљима ZOOMPANEL_ZOOM100;Повећава преглед на 100% z -ZOOMPANEL_ZOOMFITSCREEN;Уклапа слику у величину прозора Ф +ZOOMPANEL_ZOOMFITSCREEN;Уклапа слику у величину прозора Alt-Ф ZOOMPANEL_ZOOMIN;Увећава приказ слике + ZOOMPANEL_ZOOMOUT;Умањује приказ слике - @@ -1288,6 +1277,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1306,6 +1296,7 @@ !DYNPROFILEEDITOR_PROFILE;Processing Profile !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1338,12 +1329,15 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1384,7 +1378,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1559,6 +1553,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1589,9 +1598,9 @@ !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !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. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: @@ -1604,19 +1613,25 @@ !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1629,6 +1644,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1637,8 +1658,9 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 @@ -1700,8 +1722,17 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_BL;Bottom-left !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. @@ -1715,10 +1746,10 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1730,6 +1761,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1758,55 +1791,51 @@ !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1817,6 +1846,8 @@ !TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1840,6 +1871,15 @@ !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1867,7 +1907,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1904,6 +1944,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1917,6 +1959,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -2001,6 +2044,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2166,4 +2213,4 @@ !TP_WAVELET_TON;Toning !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Serbian (Latin Characters)" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Serbian (Latin Characters)" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/languages/Serbian (Latin Characters)" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/languages/Serbian (Latin Characters)" 2018-03-20 11:04:15.000000000 +0000 @@ -7,6 +7,7 @@ ABOUT_TAB_SPLASH;Uvod ADJUSTER_RESET_TO_DEFAULT;Vrati na podrazumevano BATCHQUEUE_AUTOSTART;Sam započni +BATCHQUEUE_AUTOSTARTHINT;Pokreće obradu fotografija kada ih zakažete BATCHQUEUE_DESTFILENAME;Putanja i ime datoteke BATCH_PROCESSING;obrada CURVEEDITOR_CURVE;Krivulja @@ -154,12 +155,7 @@ FILEBROWSER_SHOWTRASHHINT;Prikazuje slike u smeću FILEBROWSER_SHOWUNCOLORHINT;Prikazuje slike koje nisu označene bojom Alt-0 FILEBROWSER_SHOWUNRANKHINT;Prikaži neocenjene slike -FILEBROWSER_STARTPROCESSING;Započni obradu -FILEBROWSER_STARTPROCESSINGHINT;Počinje obradu i čuvanje zakazanih slika -FILEBROWSER_STOPPROCESSING;Zaustavi obradu -FILEBROWSER_STOPPROCESSINGHINT;Zaustavlja obradu slika FILEBROWSER_THUMBSIZE;Pregled -FILEBROWSER_TOOLTIP_STOPPROCESSING;Pokreće obradu fotografija kada ih zakažete FILEBROWSER_UNRANK_TOOLTIP;Neocenjeno.\nPrečica: Shift-0 FILEBROWSER_ZOOMINHINT;Uvećava pregled FILEBROWSER_ZOOMOUTHINT;Umanjuje pregled @@ -367,7 +363,6 @@ HISTORY_MSG_170;Živ - kriva HISTORY_MSG_171;„LC“ kriva HISTORY_MSG_172;Lab - Zabrani LC -HISTORY_MSG_173;UŠ - Detalji luminanse HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 adaptacija HISTORY_MSG_176;CAM02 - Okolina prikaza @@ -397,7 +392,6 @@ HISTORY_MSG_200;CAM02 - Mapiranje tonova HISTORY_MSG_201;UŠ - Hrominansa C,Z HISTORY_MSG_202;UŠ - Hrominansa P,Y -HISTORY_MSG_203;UŠ - Način HISTORY_MSG_204;LMMSE koraci poboljšanja HISTORY_MSG_205;CAM02 - Vrući/loš pikseli HISTORY_MSG_206;CAT02 - Automatska luminansa kadra @@ -540,8 +534,6 @@ MAIN_TOOLTIP_TOGGLE;Prikazuje sliku pre i posle obrade B NAVIGATOR_XY_FULL;Širina = %1, Visina = %2 NAVIGATOR_XY_NA;x = ○, y = ○ -OPTIONS_DEFIMG_MISSING;Nije pronađen ili dostupan podrazumevani profil za slike koje nisu u sirovom formatu.\n\nProverite fasciklu sa profilima, možda ne postoji ili je oštećena.\n\nBiće korišćene podrazumevane vrednosti. -OPTIONS_DEFRAW_MISSING;Nije pronađen ili dostupan podrazumevani profil za slike u sirovom formatu.\n\nProverite fasciklu sa profilima, možda ne postoji ili je oštećena.\n\nBiće korišćene podrazumevane vrednosti. PARTIALPASTE_BASICGROUP;Osnovna podešavanja PARTIALPASTE_CACORRECTION;Ispravljanje aberacija PARTIALPASTE_CHANNELMIXER;Mešanje kanala @@ -631,7 +623,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Tamni kadar PREFERENCES_DARKFRAMEFOUND;Nađen PREFERENCES_DARKFRAMESHOTS;snimaka PREFERENCES_DARKFRAMETEMPLATES;šabloni @@ -643,13 +634,11 @@ PREFERENCES_DIROTHER;Neki drugi PREFERENCES_DIRSELECTDLG;Bira određeni direktorijum sa slikama... PREFERENCES_DIRSOFTWARE;Direktorijum sa instalacijom -PREFERENCES_EDITORCMDLINE;Proizvoljna naredba PREFERENCES_EDITORLAYOUT;Razmeštaj programa PREFERENCES_EXTERNALEDITOR;Spoljni uređivač PREFERENCES_FBROWSEROPTS;Opcije razgledača datoteke PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Prikaži alatke u jednom redu PREFERENCES_FILEFORMAT;Format datoteke -PREFERENCES_FLATFIELD;Ravno polje PREFERENCES_FLATFIELDFOUND;Nađeno PREFERENCES_FLATFIELDSDIR;Direktorijum za ravna polja PREFERENCES_FLATFIELDSHOTS;snimaka @@ -960,19 +949,19 @@ TP_DEFRINGE_LABEL;Uklaljanje oreola TP_DEFRINGE_RADIUS;Poluprečnik TP_DEFRINGE_THRESHOLD;Prag -TP_DIRPYRDENOISE_BLUE;Hrominansa: Plava-Žuta -TP_DIRPYRDENOISE_CHROMA;Boja +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Hrominansa: Plava-Žuta +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Boja +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Hrominansa - crvena-zelena TP_DIRPYRDENOISE_ENH;Poboljšani režim TP_DIRPYRDENOISE_ENH_TOOLTIP;Povećava kvalitet uklanjanja šuma na uštrb oko 20% vremena za obradu. -TP_DIRPYRDENOISE_GAMMA;Gama -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gama utiče na jačinu uklanjanja šuma preko opseg tonova. Manja vrednost će uticati na senke, veća će povećati ovaj efekat i na svetlije tonove. -TP_DIRPYRDENOISE_LABEL;Direkciono piramidno uklanjanje šuma -TP_DIRPYRDENOISE_LDETAIL;Detalji luminanse -TP_DIRPYRDENOISE_LUMA;Luminansa -TP_DIRPYRDENOISE_METHOD;Način -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Za rav slike možete koristiti RGB ili Lab režime.\n\nZa ostale slike se koristi Lab, bez obzira na izbor. -TP_DIRPYRDENOISE_RED;Hrominansa - crvena-zelena -TP_DIRPYRDENOISE_RGB;RGB +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detalji luminanse +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminansa +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Način +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Direkciono piramidno uklanjanje šuma +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Za rav slike možete koristiti RGB ili Lab režime.\n\nZa ostale slike se koristi Lab, bez obzira na izbor. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gama +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gama utiče na jačinu uklanjanja šuma preko opseg tonova. Manja vrednost će uticati na senke, veća će povećati ovaj efekat i na svetlije tonove. TP_DIRPYREQUALIZER_LABEL;Detaljni nivo kontrasta TP_DIRPYREQUALIZER_LUMACOARSEST;grubo TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- @@ -1280,7 +1269,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otvara novi prozor sa detaljima ZOOMPANEL_ZOOM100;Povećava pregled na 100% z -ZOOMPANEL_ZOOMFITSCREEN;Uklapa sliku u veličinu prozora F +ZOOMPANEL_ZOOMFITSCREEN;Uklapa sliku u veličinu prozora Alt-f ZOOMPANEL_ZOOMIN;Uvećava prikaz slike + ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - @@ -1288,6 +1277,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -1306,6 +1296,7 @@ !DYNPROFILEEDITOR_PROFILE;Processing Profile !EDIT_OBJECT_TOOLTIP;Displays a widget on the preview window which lets you adjust this tool. !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels !EXPORT_PIPELINE;Processing pipeline @@ -1338,12 +1329,15 @@ !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -1384,7 +1378,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1559,6 +1553,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1589,9 +1598,9 @@ !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !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. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: @@ -1604,19 +1613,25 @@ !NAVIGATOR_R;R: !NAVIGATOR_S;S: !NAVIGATOR_V;V: +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1629,6 +1644,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1637,8 +1658,9 @@ !PREFERENCES_D50_OLD;5000K !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert -!PREFERENCES_FILMSIMULATION;Film Simulation !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Same thumbnail height between the Filmstrip and the File Browser !PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Having separate thumbnail size will require more processing time each time you'll switch between the single Editor tab and the File Browser. !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 @@ -1700,8 +1722,17 @@ !PREFERENCES_WLTWO;Two levels !PREFERENCES_WLZER;No !PROFILEPANEL_PDYNAMIC;Dynamic -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_BL;Bottom-left !TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen enabled:\nClick in the preview with left mouse button to add a color picker\nDrag it around while pressing the left mouse button\nDelete the color picker with a right mouse button click\nDelete all color pickers with Shift + Right mouse button click\nRight click away from any color picker to go back to the Hand tool !TP_BWMIX_FILTER_TOOLTIP;The color filter simulates shots taken with a colored filter placed in front of the lens. Colored filters reduce the transmission of specific color ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. @@ -1715,10 +1746,10 @@ !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1730,6 +1761,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1758,55 +1791,51 @@ !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1817,6 +1846,8 @@ !TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts in the transitions between skin colors (hue, chroma, luma) and the rest of the image. !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_EPD_GAMMA;Gamma +!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_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1840,6 +1871,15 @@ !TP_ICM_SAVEREFERENCE;Save Reference Image !TP_ICM_SAVEREFERENCE_APPLYWB;Apply white balance !TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Generally, apply the white balance when saving images to create ICC profiles, and do not apply the white balance to create DCP profiles. +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_PREPROCESS_DEADPIXFILT;Dead pixel filter !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter @@ -1867,7 +1907,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -1904,6 +1944,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1917,6 +1959,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -2001,6 +2044,10 @@ !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2166,4 +2213,4 @@ !TP_WAVELET_TON;Toning !TP_WBALANCE_TEMPBIAS;AWB temperature bias !TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias". -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru rawtherapee-5.3/rtdata/languages/Slovak rawtherapee-5.4/rtdata/languages/Slovak --- rawtherapee-5.3/rtdata/languages/Slovak 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Slovak 2018-03-20 11:04:15.000000000 +0000 @@ -4,6 +4,7 @@ ADJUSTER_RESET_TO_DEFAULT;Resetovať na predvolené nastavenia BATCHQUEUE_AUTOSTART;Auto štart +BATCHQUEUE_AUTOSTARTHINT;Začať spracovanie automaticky, keď príde nová úloha BATCH_PROCESSING;Dávkové spracovanie CURVEEDITOR_CUSTOM;Vlastné CURVEEDITOR_DARKS;Tiene @@ -75,12 +76,7 @@ FILEBROWSER_SHOWRANK5HINT;Ukázať obrázky triedy 5 hviezda FILEBROWSER_SHOWTRASHHINT;Zobraziť obsah koša FILEBROWSER_SHOWUNRANKHINT;Zobraziť obrázky bez triedy -FILEBROWSER_STARTPROCESSING;Začať spracovanie -FILEBROWSER_STARTPROCESSINGHINT;Začať spracovanie/ukladanie obrázkov v rade -FILEBROWSER_STOPPROCESSING;Zastaviť spracovanie -FILEBROWSER_STOPPROCESSINGHINT;Zastaviť spracovanie obrázkov FILEBROWSER_THUMBSIZE;Veľkosť zmenšenín -FILEBROWSER_TOOLTIP_STOPPROCESSING;Začať spracovanie automaticky, keď príde nová úloha FILEBROWSER_ZOOMINHINT;Zväčšiť veľkosť zmenšenín FILEBROWSER_ZOOMOUTHINT;Zmenšiť veľkosť zmenšenín GENERAL_ABOUT;O programe @@ -293,7 +289,6 @@ PREFERENCES_DIROTHER;Iný PREFERENCES_DIRSELECTDLG;Vybrať adresár s obrázkami pri spustení... PREFERENCES_DIRSOFTWARE;Inštalačný adresár -PREFERENCES_EDITORCMDLINE;Iný príkazový riadok PREFERENCES_EDITORLAYOUT;Rozloženie editora PREFERENCES_EXTERNALEDITOR;Externý editor PREFERENCES_FBROWSEROPTS;Voľby prehliadača súborov @@ -399,10 +394,10 @@ TP_CROP_W;Š TP_CROP_X;x TP_CROP_Y;y -TP_DIRPYRDENOISE_CHROMA;Farebnosť -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_LABEL;Redukcia šumu pomocou smerovej pyramídy -TP_DIRPYRDENOISE_LUMA;Svietivosť +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Farebnosť +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Svietivosť +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukcia šumu pomocou smerovej pyramídy +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma TP_DIRPYREQUALIZER_LABEL;Vyrovnávač smerovej pyramídy TP_DIRPYREQUALIZER_LUMACOARSEST;Najhrubšie TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Kontrast- @@ -504,7 +499,7 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otvoriť (nové) okno s detailom ZOOMPANEL_ZOOM100;Priblíženie na 100% z -ZOOMPANEL_ZOOMFITSCREEN;Prispôsobiť obrazovke f +ZOOMPANEL_ZOOMFITSCREEN;Prispôsobiť obrazovke Alt-f ZOOMPANEL_ZOOMIN;Priblížiť + ZOOMPANEL_ZOOMOUT;Oddialiť - @@ -518,6 +513,7 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: @@ -543,6 +539,7 @@ !EDIT_PIPETTE_TOOLTIP;To add an adjustment point to the curve, hold the Ctrl key while left-clicking the desired spot in the image preview.\nTo adjust the point, hold the Ctrl key while left-clicking the corresponding area in the preview, then let go of Ctrl (unless you desire fine control) and while still holding the left mouse button move the mouse up or down to move that point up or down in the curve. !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -648,6 +645,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. @@ -735,7 +733,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -765,7 +763,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -817,7 +815,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -858,7 +856,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1033,6 +1031,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1078,6 +1091,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1087,8 +1102,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1115,8 +1128,10 @@ !NAVIGATOR_S;S: !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1141,6 +1156,8 @@ !PARTIALPASTE_HSVEQUALIZER;HSV equalizer !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1160,13 +1177,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles !PREFERENCES_AUTLISSTD;High @@ -1188,6 +1205,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1205,17 +1228,16 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1333,6 +1355,15 @@ !PROGRESSBAR_NOIMAGES;No images found !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1341,8 +1372,8 @@ !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1487,14 +1518,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1506,6 +1537,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1543,64 +1576,60 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1623,6 +1652,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1735,6 +1766,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1776,7 +1816,7 @@ !TP_RAW_DCB;DCB !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1784,7 +1824,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1824,6 +1864,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1837,6 +1879,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1943,6 +1986,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2166,4 +2213,4 @@ !TP_WBALANCE_WATER1;UnderWater 1 !TP_WBALANCE_WATER2;UnderWater 2 !TP_WBALANCE_WATER_HEADER;UnderWater -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f diff -Nru rawtherapee-5.3/rtdata/languages/Suomi rawtherapee-5.4/rtdata/languages/Suomi --- rawtherapee-5.3/rtdata/languages/Suomi 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Suomi 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Näytä 5 tähden kuvat FILEBROWSER_SHOWTRASHHINT;Näytä roskakorin sisältö FILEBROWSER_SHOWUNRANKHINT;Näytä arvostelemattomat kuvat -FILEBROWSER_STARTPROCESSING;Aloita käsittely -FILEBROWSER_STARTPROCESSINGHINT;Aloita jonossa olevien kuvien käsittely -FILEBROWSER_STOPPROCESSING;Lopeta käsittely -FILEBROWSER_STOPPROCESSINGHINT;Lopeta jonossa olevien kuvien käsittely FILEBROWSER_THUMBSIZE;Esikatselun koko FILEBROWSER_ZOOMINHINT;Kasvata esikatselukuvien kokoa FILEBROWSER_ZOOMOUTHINT;Pienennä esikatselukuvien kokoa @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Muu PREFERENCES_DIRSELECTDLG;Valitse kuvahakemisto käynnistettäessä... PREFERENCES_DIRSOFTWARE;Asennushakemisto -PREFERENCES_EDITORCMDLINE;Muu komentorivi PREFERENCES_EXTERNALEDITOR;Ulkoinen ohjelma PREFERENCES_FBROWSEROPTS;Näytettävät tiedot PREFERENCES_FILEFORMAT;Tallennuksen asetukset @@ -428,7 +423,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -464,6 +461,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -558,7 +556,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -576,6 +573,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -674,7 +672,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -704,7 +702,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -756,7 +754,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -797,7 +795,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -972,6 +970,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1023,6 +1036,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1032,8 +1047,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1062,8 +1075,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1089,6 +1104,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1108,13 +1125,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1139,6 +1156,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1156,18 +1179,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1293,6 +1315,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1302,8 +1333,8 @@ !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1448,14 +1479,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1467,6 +1498,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1504,68 +1537,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1595,6 +1623,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1716,6 +1746,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1765,7 +1804,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1773,7 +1812,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1813,6 +1852,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1826,6 +1867,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1935,6 +1977,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2161,7 +2207,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/languages/Swedish rawtherapee-5.4/rtdata/languages/Swedish --- rawtherapee-5.3/rtdata/languages/Swedish 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Swedish 2018-03-20 11:04:15.000000000 +0000 @@ -10,6 +10,7 @@ ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;Återställ till standard BATCHQUEUE_AUTOSTART;Autostart +BATCHQUEUE_AUTOSTARTHINT;Starta behandlingen automatiskt när en ny bild kommer in BATCHQUEUE_DESTFILENAME;Sökväg och filnamn BATCH_PROCESSING;Batchbehandling CURVEEDITOR_AXIS_IN;I: @@ -178,12 +179,7 @@ FILEBROWSER_SHOWTRASHHINT;Visa innehållet i papperskorgen FILEBROWSER_SHOWUNCOLORHINT;Visa bilder utan färgetikett\nKortkommando: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Visa icke-betygsatta bilder -FILEBROWSER_STARTPROCESSING;Starta behandlingen -FILEBROWSER_STARTPROCESSINGHINT;Starta behandlingen och spara bilderna i behandlingskön -FILEBROWSER_STOPPROCESSING;Avbryt behandlingen -FILEBROWSER_STOPPROCESSINGHINT;Avbryt behandlingen av bilderna FILEBROWSER_THUMBSIZE;Miniatyrbildens storlek -FILEBROWSER_TOOLTIP_STOPPROCESSING;Starta behandlingen automatiskt när en ny bild kommer in FILEBROWSER_UNRANK_TOOLTIP;Ta bort betyg\nKortkommando: Shift-0 FILEBROWSER_ZOOMINHINT;Förstora miniatyrbilderna.\nKortkommando: +\nKortkommado i enkelbildsläget: Alt-+ FILEBROWSER_ZOOMOUTHINT;Förminska miniatyrbilderna.\nKortkommando: -\nKortkommado i enkelbildsläget: Alt-- @@ -401,7 +397,6 @@ HISTORY_MSG_170;Lyster-kurvan HISTORY_MSG_171;'LC'-kurvan HISTORY_MSG_172;Begränsa LC till röda färger och hudtoner -HISTORY_MSG_173;Brusreducering - Luminansdetalj HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Cat02-anpassning HISTORY_MSG_176;CAM02 - Vyns mörka omgivning @@ -431,7 +426,6 @@ HISTORY_MSG_200;CAM02 - Tonmappning HISTORY_MSG_201;NR - Krominans röd-grön HISTORY_MSG_202;NR - Krominans blå-gul -HISTORY_MSG_203;Brusreducering - metod HISTORY_MSG_204;LMMSE förbättringssteg HISTORY_MSG_205;CAM02 - Heta/dåliga pixlar HISTORY_MSG_206;CAT02 - Anpassa automatiskt till bilden @@ -483,7 +477,6 @@ HISTORY_MSG_253;CbDL Reducera artefakter HISTORY_MSG_254;CbDL - Nyans på hudtoner HISTORY_MSG_255;CbDL - Algoritm -HISTORY_MSG_256;NR - Median HISTORY_MSG_258;CT - Färgkurva HISTORY_MSG_259;CT - Opacitetskurva HISTORY_MSG_260;CT - a*[b*] opacitet @@ -521,7 +514,6 @@ HISTORY_MSG_294;Filmsimulering - Styrka HISTORY_MSG_295;Filmsimulering - Film HISTORY_MSG_296;NR - Luminanskurva -HISTORY_MSG_297;NR - Kvalitet HISTORY_MSG_298;Filter för döda pixlar HISTORY_MSG_299;NR - Krominanskurva HISTORY_MSG_300;- @@ -756,8 +748,6 @@ NAVIGATOR_V;V: NAVIGATOR_XY_FULL;Bredd = %1, Höjd = %2 NAVIGATOR_XY_NA;x = -, y = - -OPTIONS_DEFIMG_MISSING;Standardprofilen för icke-råbilder kunde inte hittas eller är inte angiven.\n\nVar vänlig kontrollera din profilmapp: den kanske ej finns eller är skadad.\n\nInterna värden kommer att användas som standard. -OPTIONS_DEFRAW_MISSING;Standardprofilen för råbilder kunde inte hittas eller är den ej angiven.\n\nVar vänlig kontrollera din profilmapp: kanske finns den ej eller är filen skadad.\n\nInterna värden kommer att användas som standard. PARTIALPASTE_BASICGROUP;Grundläggande inställningar PARTIALPASTE_CACORRECTION;Reducera kromatiska abberationer PARTIALPASTE_CHANNELMIXER;Kanalmixer @@ -870,7 +860,6 @@ PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K -PREFERENCES_DARKFRAME;Svartbild PREFERENCES_DARKFRAMEFOUND;Hittade PREFERENCES_DARKFRAMESHOTS;bilder PREFERENCES_DARKFRAMETEMPLATES;mallar @@ -884,15 +873,12 @@ PREFERENCES_DIROTHER;Annan PREFERENCES_DIRSELECTDLG;Välj bildkatalog vid uppstart... PREFERENCES_DIRSOFTWARE;Installationskatalog -PREFERENCES_EDITORCMDLINE;Annan kommandorad PREFERENCES_EDITORLAYOUT;Layout för redigeringsvyn PREFERENCES_EXPAUT;Expert PREFERENCES_EXTERNALEDITOR;Externt bildredigeringsprogram PREFERENCES_FBROWSEROPTS;Inställningar för filvyn/miniatyrbilderna PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Filvyns verktygsrad som en rad (avmarkera för lågupplösta skärmar) PREFERENCES_FILEFORMAT;Filformat -PREFERENCES_FILMSIMULATION;Filmsimulering -PREFERENCES_FLATFIELD;Plattfält PREFERENCES_FLATFIELDFOUND;Hittade PREFERENCES_FLATFIELDSDIR;Plattfältskatalog PREFERENCES_FLATFIELDSHOTS;bilder @@ -1075,8 +1061,6 @@ SAVEDLG_TIFFUNCOMPRESSED;Okomprimerad TIFF SAVEDLG_WARNFILENAME;Filen kommer att heta SHCSELECTOR_TOOLTIP;Klicka på höger musknapp för att återställa\nde tre reglagens positioner -SOFTPROOF_GAMUTCHECK_TOOLTIP;Om aktiverad så indikeras i grått de pixlar som hamnar utanför utprofilens tonomfång. -SOFTPROOF_TOOLTIP;Färggodkännande\nOm aktiverad så kan du simulera renderingen som skapas av utprofilen från ICM-verktyget. Användbar för att simulera utskrifter. THRESHOLDSELECTOR_B;Nederst THRESHOLDSELECTOR_BL;Nederst till vänster THRESHOLDSELECTOR_BR;Nederst till höger @@ -1291,57 +1275,51 @@ TP_DEFRINGE_LABEL;Fyll ut överstrålning TP_DEFRINGE_RADIUS;Radie TP_DEFRINGE_THRESHOLD;Tröskelvärde -TP_DIRPYRDENOISE_3X3;3×3 -TP_DIRPYRDENOISE_3X3_SOFT;3×3 mjuk -TP_DIRPYRDENOISE_5X5;5×5 -TP_DIRPYRDENOISE_5X5_SOFT;5×5 mjuk -TP_DIRPYRDENOISE_7X7;7×7 -TP_DIRPYRDENOISE_9X9;9×9 -TP_DIRPYRDENOISE_ABM;Endast chroma -TP_DIRPYRDENOISE_AUT;Automatisk global -TP_DIRPYRDENOISE_AUTO;Automatisk global -TP_DIRPYRDENOISE_AUTO_TOOLTIP;Försök att utvärdera chroma-bruset\nVar försiktig, den här beräkningen görs på genomsnittet och är tämligen subjektiv! -TP_DIRPYRDENOISE_BLUE;Krominans - Blå-Gul -TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manuell\nVerkar på hela bilden.\nDu kontrollerar brusreduceringen manuellt.\n\nAutomatisk global\nVerkar på hela bilden.\n9 zoner används för att beräkna en global kroma-brusreducering.\n\nFörhandsgranskning\nVerkar på hela bilden.\nDen synliga delen av förhandsgranskningen används för att beräkna en global kroma-brusreducering. -TP_DIRPYRDENOISE_CCCURVE;Krominans-kurva -TP_DIRPYRDENOISE_CHROMA;Kroma -TP_DIRPYRDENOISE_CHROMAFR;Krominans -TP_DIRPYRDENOISE_CTYPE;Metod -TP_DIRPYRDENOISE_CUR;Kurva -TP_DIRPYRDENOISE_CURVEEDITOR_CC;Kroma -TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Öka (multiplicera) värdet av alla krominansreglage.\nDen här kurvan låter dig justera styrkan för den kromatiska brusreduceringen som en funktion av kromaticit, till exempel för att öka mängden i området med låg mättnad och för att minska det i de områden med hög mättnad. -TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulerar verkan av brusreduceringen för 'Luminans' +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatisk global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Försök att utvärdera chroma-bruset\nVar försiktig, den här beräkningen görs på genomsnittet och är tämligen subjektiv! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Krominans - Blå-Gul +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Krominans-kurva +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Krominans +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manuell +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Kroma +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Metod +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuell\nVerkar på hela bilden.\nDu kontrollerar brusreduceringen manuellt.\n\nAutomatisk global\nVerkar på hela bilden.\n9 zoner används för att beräkna en global kroma-brusreducering.\n\nFörhandsgranskning\nVerkar på hela bilden.\nDen synliga delen av förhandsgranskningen används för att beräkna en global kroma-brusreducering. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Förhandsgranska multi-zon +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Förhandsgranska +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Förhandsgranska storlek=%1, Centrum: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Förhandsgranska brus: Medel=%1 Hög=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Förhandsgranska brus: Medel= - Hög= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile-storlek=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Krominans - Röd-Grön TP_DIRPYRDENOISE_ENH;Förbättrat läge TP_DIRPYRDENOISE_ENH_TOOLTIP;Ökar kvaliteten på brusreduceringen till priset av 20 % längre beräkningstid -TP_DIRPYRDENOISE_GAMMA;Gamma -TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varierar brusreduceringens styrka över hela skalan av toner. Mindre värden riktar sig mot de mörka partierna i bilden, medan större värden utökar effekten till högdagrarna. -TP_DIRPYRDENOISE_LAB;Lab -TP_DIRPYRDENOISE_LABEL;Brusreducering -TP_DIRPYRDENOISE_LABM;L*a*b* -TP_DIRPYRDENOISE_LCURVE;Luminans-kurva -TP_DIRPYRDENOISE_LDETAIL;Luminansdetalj -TP_DIRPYRDENOISE_LM;Endast luminans -TP_DIRPYRDENOISE_LPLABM;Viktad L* (litet) + a*b* (normal) -TP_DIRPYRDENOISE_LTYPE;Luminanskontroll -TP_DIRPYRDENOISE_LUMA;Luminans -TP_DIRPYRDENOISE_LUMAFR;Luminans -TP_DIRPYRDENOISE_MAN;Manuell -TP_DIRPYRDENOISE_MANU;Manuell -TP_DIRPYRDENOISE_METHOD;Metod -TP_DIRPYRDENOISE_METHOD11;Kvalitet -TP_DIRPYRDENOISE_METHOD_TOOLTIP;För råfiler kan antingen RGB- eller Labmetoder användas.\n\nFör icke-råfiler kommer Labmetoden att användas, oavsett vad som är valt. -TP_DIRPYRDENOISE_NOISELABEL;Förhandsgranska brus: Medel=%1 Hög=%2 -TP_DIRPYRDENOISE_NOISELABELEMPTY;Förhandsgranska brus: Medel= - Hög= - -TP_DIRPYRDENOISE_PRE;Förhandsgranska multi-zon -TP_DIRPYRDENOISE_PREV;Förhandsgranska -TP_DIRPYRDENOISE_PREVLABEL;Förhandsgranska storlek=%1, Centrum: Px=%2 Py=%3 -TP_DIRPYRDENOISE_RED;Krominans - Röd-Grön -TP_DIRPYRDENOISE_RGB;RGB -TP_DIRPYRDENOISE_RGBM;RGB -TP_DIRPYRDENOISE_SHAL;Standard -TP_DIRPYRDENOISE_SHALBI;Hög +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanskontroll +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminans-kurva +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminansdetalj +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminans +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminans +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metod +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;Lab +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Brusreducering +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;För råfiler kan antingen RGB- eller Labmetoder användas.\n\nFör icke-råfiler kommer Labmetoden att användas, oavsett vad som är valt. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varierar brusreduceringens styrka över hela skalan av toner. Mindre värden riktar sig mot de mörka partierna i bilden, medan större värden utökar effekten till högdagrarna. +TP_DIRPYRDENOISE_MAIN_MODE;Kvalitet +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Hög +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Standard +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Endast chroma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Endast luminans +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Viktad L* (litet) + a*b* (normal) TP_DIRPYRDENOISE_SLI;Reglage -TP_DIRPYRDENOISE_TILELABEL;Tile-storlek=%1, Center: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 mjuk +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 mjuk +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 TP_DIRPYREQUALIZER_ALGO;Algoritm för hudtoner TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fin: närmre hudens färger, minimerar inverkan på andra färger\nStor: undvik än mer artefakter TP_DIRPYREQUALIZER_ARTIF;Reducera artefakter @@ -1874,8 +1852,8 @@ ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Öppna (nytt) detaljfönster. ZOOMPANEL_ZOOM100;Förstora till 100%.\nKortkommando: z -ZOOMPANEL_ZOOMFITCROPSCREEN;Anpassa beskärningen till skärmen\nKortkommando: Alt-f -ZOOMPANEL_ZOOMFITSCREEN;Passa till skärmen.\nKortkommando: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Anpassa beskärningen till skärmen\nKortkommando: f +ZOOMPANEL_ZOOMFITSCREEN;Passa till skärmen.\nKortkommando: Alt-f ZOOMPANEL_ZOOMIN;Förstora.\nKortkommando: + ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - @@ -1883,6 +1861,7 @@ ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: !CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click on a node to select it.\nRight-click on empty space to de-select the node. @@ -1896,16 +1875,22 @@ !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_PIPELINE;Processing pipeline !EXPORT_USE_FAST_PIPELINE;Dedicated (full processing on resized image) !EXPORT_USE_FAST_PIPELINE_TIP;Use a dedicated processing pipeline for images in Fast Export mode, that trades speed for quality. Resizing of the image is done as early as possible, instead of doing it at the end like in the normal pipeline. The speedup can be significant, but be prepared to see artifacts and a general degradation of output quality. !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +!GENERAL_SLIDER;Slider !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. +!HISTORY_MSG_173;NR - Detail recovery +!HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_288;Flat Field - Clip control !HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_310;W - Residual - Sky tar/prot !HISTORY_MSG_313;W - Chroma - Sat/past !HISTORY_MSG_316;W - Gamut - Skin tar/prot @@ -1954,6 +1939,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. !IPTCPANEL_COPYRIGHT;Copyright notice @@ -1984,15 +1984,32 @@ !LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters !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. !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_COLORTONING;Color toning !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_D50_OLD;5000K +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2. !PREFERENCES_LANG;Language @@ -2011,31 +2028,48 @@ !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_THEME;Theme !PROFILEPANEL_PDYNAMIC;Dynamic +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !TP_CBDL_METHOD;Process located !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* blending", "RGB sliders" and "RGB curves" use interpolated color blending.\n"Color balance (Shadows/Midtones/Highlights)" and "Saturation 2 colors" use direct colors.\n\nThe Black-and-White tool can be enabled when using any color toning method, which allows for color toning. !TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable. -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_LABEL;Noise Reduction +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected. !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_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_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. @@ -2043,6 +2077,15 @@ !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_RAW_1PASSMEDIUM;1-Pass (Medium) !TP_RAW_3PASSBEST;3-Pass (Best) !TP_RAW_AHD;AHD @@ -2053,7 +2096,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LMMSE;LMMSE !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) @@ -2090,6 +2133,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -2103,6 +2148,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_VNG4;VNG4 !TP_RETINEX_CONTEDIT_MAP;Mask equalizer !TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. @@ -2127,6 +2173,10 @@ !TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction. !TP_RETINEX_VIEW_MASK;Mask !TP_RETINEX_VIEW_METHOD_TOOLTIP;Standard - Normal display.\nMask - Displays the mask.\nUnsharp mask - Displays the image with a high radius unsharp mask.\nTransmission - Auto/Fixed - Displays the file transmission-map, before any action on contrast and brightness.\n\nAttention: the mask does not correspond to reality, but is amplified to make it more visible. +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_WAVELET_CBENAB;Toning and Color Balance !TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted !TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colors.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. diff -Nru rawtherapee-5.3/rtdata/languages/Turkish rawtherapee-5.4/rtdata/languages/Turkish --- rawtherapee-5.3/rtdata/languages/Turkish 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/languages/Turkish 2018-03-20 11:04:15.000000000 +0000 @@ -58,10 +58,6 @@ FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star FILEBROWSER_SHOWTRASHHINT;Show content of the trash FILEBROWSER_SHOWUNRANKHINT;Show unranked images -FILEBROWSER_STARTPROCESSING;Start Processing -FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue -FILEBROWSER_STOPPROCESSING;Stop processing -FILEBROWSER_STOPPROCESSINGHINT;Stop processing of images FILEBROWSER_THUMBSIZE;Thumb. size FILEBROWSER_ZOOMINHINT;Increase thumbnail size FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size @@ -249,7 +245,6 @@ PREFERENCES_DIROTHER;Diğer PREFERENCES_DIRSELECTDLG;Başlangıç görüntü dizinini seç... PREFERENCES_DIRSOFTWARE;Kurulum dizini -PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;Dosya gezgini seçenekleri PREFERENCES_FILEFORMAT;Dosya biçimi @@ -427,7 +422,9 @@ !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash !BATCHQUEUE_AUTOSTART;Auto-start +!BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name +!BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s !BATCH_PROCESSING;Batch Processing !CURVEEDITOR_AXIS_IN;I: !CURVEEDITOR_AXIS_LEFT_TAN;LT: @@ -463,6 +460,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_METADATAFILTER;Enable metadata filters +!EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_DEFRINGE;Bypass Defringe @@ -557,7 +555,6 @@ !FILEBROWSER_SHOWRECENTLYSAVEDHINT;Show saved images.\nShortcut: Alt-7 !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 -!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files !FILECHOOSER_FILTER_COLPROF;Color profiles @@ -575,6 +572,7 @@ !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_SLIDER;Slider !GENERAL_UNCHANGED;(Unchanged) !GENERAL_WARNING;Warning !GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP. @@ -673,7 +671,7 @@ !HISTORY_MSG_170;Vibrance - HH curve !HISTORY_MSG_171;L*a*b* - LC curve !HISTORY_MSG_172;L*a*b* - Restrict LC -!HISTORY_MSG_173;NR - Luminance detail +!HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 adaptation !HISTORY_MSG_176;CAM02 - Viewing surround @@ -703,7 +701,7 @@ !HISTORY_MSG_200;CAM02 - Tone mapping !HISTORY_MSG_201;NR - Chrominance - R&G !HISTORY_MSG_202;NR - Chrominance - B&Y -!HISTORY_MSG_203;NR - Method +!HISTORY_MSG_203;NR - Color space !HISTORY_MSG_204;LMMSE enhancement steps !HISTORY_MSG_205;CAM02 - Hot/bad pixel filter !HISTORY_MSG_206;CAT02 - Auto scene luminosity @@ -755,7 +753,7 @@ !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue !HISTORY_MSG_255;NR - Median filter -!HISTORY_MSG_256;NR - Median type +!HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve !HISTORY_MSG_259;CT - Opacity curve @@ -796,7 +794,7 @@ !HISTORY_MSG_294;Film Simulation - Strength !HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve -!HISTORY_MSG_297;NR - Quality +!HISTORY_MSG_297;NR - Mode !HISTORY_MSG_298;Dead pixel filter !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -971,6 +969,21 @@ !HISTORY_MSG_485;Lens Correction !HISTORY_MSG_486;Lens Correction - Camera !HISTORY_MSG_487;Lens Correction - Lens +!HISTORY_MSG_488;HDR Tone Mapping +!HISTORY_MSG_489;HDR TM - Threshold +!HISTORY_MSG_490;HDR TM - Amount +!HISTORY_MSG_491;White Balance +!HISTORY_MSG_492;RGB Curves +!HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount +!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness +!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast +!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness +!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius +!HISTORY_MSG_METADATA_MODE;Metadata copy mode +!HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITYHINT;Enter the name of the city pictured in this image. @@ -1022,6 +1035,8 @@ !MAIN_MSG_SETPATHFIRST;You first have to set a target path in Preferences in order to use this function! !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. !MAIN_MSG_WRITEFAILED;Failed to write\n"%1"\n\nMake sure that the folder exists and that you have write permission to it. +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w !MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c !MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d !MAIN_TAB_EXPORT; Fast Export @@ -1031,8 +1046,6 @@ !MAIN_TAB_RAW;Raw !MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -!MAIN_TAB_WAVELET;Wavelet -!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: White\nShortcut: 9 @@ -1061,8 +1074,10 @@ !NAVIGATOR_V;V: !NAVIGATOR_XY_FULL;Width: %1, Height: %2 !NAVIGATOR_XY_NA;x: --, y: -- -!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. -!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. +!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead. +!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead. +!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings !PARTIALPASTE_CHANNELMIXER;Channel mixer !PARTIALPASTE_CHANNELMIXERBW;Black-and-white !PARTIALPASTE_COLORAPP;CIECAM02 @@ -1088,6 +1103,8 @@ !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction !PARTIALPASTE_LABCURVE;L*a*b* adjustments !PARTIALPASTE_LENSPROFILE;Profiled lens correction +!PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter @@ -1107,13 +1124,13 @@ !PARTIALPASTE_RAW_FALSECOLOR;False color suppression !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!PARTIALPASTE_RAW_PIXELSHIFT;PixelShift +!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast +!PARTIALPASTE_TM_FATTAL;HDR Tone mapping !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add !PREFERENCES_AUTLISLOW;Low !PREFERENCES_AUTLISMAX;Max - Average of all tiles @@ -1138,6 +1155,12 @@ !PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs !PREFERENCES_CLUTSDIR;HaldCLUT directory !PREFERENCES_CMMBPC;Black point compensation +!PREFERENCES_CROP;Crop editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop +!PREFERENCES_CROP_GUIDES_FRAME;Frame +!PREFERENCES_CROP_GUIDES_FULL;Original +!PREFERENCES_CROP_GUIDES_NONE;None !PREFERENCES_CURVEBBOXPOS;Position of curve copy & paste buttons !PREFERENCES_CURVEBBOXPOS_ABOVE;Above !PREFERENCES_CURVEBBOXPOS_BELOW;Below @@ -1155,18 +1178,17 @@ !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !PREFERENCES_D65;6500K -!PREFERENCES_DARKFRAME;Dark-Frame !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DAUB_LABEL;Use Daubechies D6 wavelets instead of D4 !PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and Wavelet Levels tools use a Debauchies mother wavelet. If you choose D6 instead of D4 you increase the number of orthogonal Daubechies coefficients and probably increase quality of small-scale levels. There is no memory or processing time difference between the two. !PREFERENCES_DIRDARKFRAMES;Dark-frames directory +!PREFERENCES_DIRECTORIES;Directories +!PREFERENCES_EDITORCMDLINE;Custom command line !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_EXPAUT;Expert !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar\n(de-select for low resolution display) -!PREFERENCES_FILMSIMULATION;Film Simulation -!PREFERENCES_FLATFIELD;Flat-Field !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1292,6 +1314,15 @@ !PROGRESSBAR_PROCESSING_PROFILESAVED;Processing profile saved !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser +!QINFO_FRAMECOUNT;%2 frames +!QINFO_HDR;HDR / %2 frame(s) +!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s) +!SAMPLEFORMAT_0;Unknown data format +!SAMPLEFORMAT_1;Unsigned 8 bits +!SAMPLEFORMAT_2;Unsigned 16 bits +!SAMPLEFORMAT_4;LogLuv 24 bits +!SAMPLEFORMAT_8;LogLuv 32 bits +!SAMPLEFORMAT_16;32 bits floating point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling @@ -1301,8 +1332,8 @@ !SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved horizontally and vertically.\n\nBalanced:\nJ:a:b 4:2:2\nh/v 2/1\nChroma halved horizontally.\n\nBest quality:\nJ:a:b 4:4:4\nh/v 1/1\nNo chroma subsampling. !SAVEDLG_WARNFILENAME;File will be named !SHCSELECTOR_TOOLTIP;Click right mouse button to reset the position of those 3 sliders. -!SOFTPROOF_GAMUTCHECK_TOOLTIP;If active, indicates in grey the pixels which have out of gamut colors from the output profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate de rendering generated by the output profile of the ICM tool. Most useful for simulating printing outputs. +!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled. +!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set. !THRESHOLDSELECTOR_B;Bottom !THRESHOLDSELECTOR_BL;Bottom-left !THRESHOLDSELECTOR_BR;Bottom-right @@ -1447,14 +1478,14 @@ !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode !TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation -!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. !TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] !TP_COLORAPP_WBRT;WB [RT] + [output] !TP_COLORAPP_YB;Yb% (mean luminance) !TP_COLORAPP_YBSCENE;Yb% (mean luminance) -!TP_COLORAPP_YBSCENE_TOOLTIP;if auto enable, Yb is calculated from the mean value of actual image luminance +!TP_COLORAPP_YBSCENE_TOOLTIP;if auto is enabled, Yb is calculated from the mean value of the actual image's luminance !TP_COLORTONING_AB;o C/L !TP_COLORTONING_AUTOSAT;Automatic !TP_COLORTONING_BALANCE;Balance @@ -1466,6 +1497,8 @@ !TP_COLORTONING_HUE;Hue !TP_COLORTONING_LAB;L*a*b* blending !TP_COLORTONING_LABEL;Color Toning +!TP_COLORTONING_LABGRID;L*a*b* color correction grid +!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_LUMAMODE_TOOLTIP;If enabled, when you change color (red, green, cyan, blue, etc.) the luminance of each pixel is preserved. @@ -1503,68 +1536,63 @@ !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold -!TP_DIRPYRDENOISE_3X3;3×3 -!TP_DIRPYRDENOISE_3X3_SOFT;3×3 soft -!TP_DIRPYRDENOISE_5X5;5×5 -!TP_DIRPYRDENOISE_5X5_SOFT;5×5 soft -!TP_DIRPYRDENOISE_7X7;7×7 -!TP_DIRPYRDENOISE_9X9;9×9 -!TP_DIRPYRDENOISE_ABM;Chroma only -!TP_DIRPYRDENOISE_AUT;Automatic global -!TP_DIRPYRDENOISE_AUTO;Automatic global -!TP_DIRPYRDENOISE_AUTO_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! -!TP_DIRPYRDENOISE_BLUE;Chrominance - Blue-Yellow -!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve -!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master -!TP_DIRPYRDENOISE_CHROMAFR;Chrominance -!TP_DIRPYRDENOISE_CTYPE;Method -!TP_DIRPYRDENOISE_CTYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. -!TP_DIRPYRDENOISE_CUR;Curve -!TP_DIRPYRDENOISE_CURVEEDITOR_CC;Chroma -!TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. -!TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP;Modulates action of 'Luminance' denoise +!TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Automatic global +!TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Try to evaluate chroma noise\nBe careful, this calculation is average, and is quite subjective ! +!TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Chrominance - Blue-Yellow +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Chrominance curve +!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation. +!TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Chrominance +!TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +!TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Chrominance - Master +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Method +!TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nAutomatic multi-zones\nNo preview - works only during saving, but using the "Preview" method by matching the tile size and center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings. +!TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Preview multi-zones +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Preview +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Preview size=%1, Center: Px=%2 Py=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Preview noise: Mean=%1 High=%2 +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Preview noise: Mean= - High= - +!TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Chrominance - Red-Green !TP_DIRPYRDENOISE_ENH;Enhanced mode !TP_DIRPYRDENOISE_ENH_TOOLTIP;Increases noise reduction quality at the expense of a 20% processing time increase. -!TP_DIRPYRDENOISE_GAMMA;Gamma -!TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. -!TP_DIRPYRDENOISE_LAB;L*a*b* !TP_DIRPYRDENOISE_LABEL;Noise Reduction -!TP_DIRPYRDENOISE_LABM;L*a*b* -!TP_DIRPYRDENOISE_LCURVE;Luminance curve -!TP_DIRPYRDENOISE_LDETAIL;Luminance - Detail -!TP_DIRPYRDENOISE_LM;Luminance only -!TP_DIRPYRDENOISE_LPLABM;Weighted L* (little) + a*b* (normal) -!TP_DIRPYRDENOISE_LTYPE;Luminance control -!TP_DIRPYRDENOISE_LUMA;Luminance -!TP_DIRPYRDENOISE_LUMAFR;Luminance -!TP_DIRPYRDENOISE_MAN;Manual -!TP_DIRPYRDENOISE_MANU;Manual -!TP_DIRPYRDENOISE_MED;Median Filter -!TP_DIRPYRDENOISE_MEDMETHOD;Median method -!TP_DIRPYRDENOISE_MEDTYPE;Median type -!TP_DIRPYRDENOISE_METHOD;Method -!TP_DIRPYRDENOISE_METHOD11;Quality -!TP_DIRPYRDENOISE_METHOD11_TOOLTIP;Quality can be adapted to the noise pattern. A setting of "high" increases the noise reduction effect at a cost of extended processing time. -!TP_DIRPYRDENOISE_METHOD_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. -!TP_DIRPYRDENOISE_METM_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. -!TP_DIRPYRDENOISE_MET_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. -!TP_DIRPYRDENOISE_NOISELABEL;Preview noise: Mean=%1 High=%2 -!TP_DIRPYRDENOISE_NOISELABELEMPTY;Preview noise: Mean= - High= - -!TP_DIRPYRDENOISE_NRESID_TOOLTIP;Displays the remaining noise levels of the part of the image visible in the preview after wavelet.\n\n>300 Very noisy\n100-300 Noisy\n50-100 A little noisy\n<50 Very low noise\n\nBeware, the values will differ between RGB and L*a*b* mode. The RGB values are less accurate because the RGB mode does not completely separate luminance and chrominance. -!TP_DIRPYRDENOISE_PASSES;Median iterations -!TP_DIRPYRDENOISE_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. -!TP_DIRPYRDENOISE_PON;Auto multi-zones -!TP_DIRPYRDENOISE_PRE;Preview multi-zones -!TP_DIRPYRDENOISE_PREV;Preview -!TP_DIRPYRDENOISE_PREVLABEL;Preview size=%1, Center: Px=%2 Py=%3 -!TP_DIRPYRDENOISE_RED;Chrominance - Red-Green -!TP_DIRPYRDENOISE_RGB;RGB -!TP_DIRPYRDENOISE_RGBM;RGB -!TP_DIRPYRDENOISE_SHAL;Standard -!TP_DIRPYRDENOISE_SHALBI;High +!TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminance control +!TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminance curve +!TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detail recovery +!TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminance +!TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminance +!TP_DIRPYRDENOISE_MAIN_COLORSPACE;Color space +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +!TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;For raw images either RGB or L*a*b* methods can be used.\n\nFor non-raw images the L*a*b* method will be used, regardless of the selection. +!TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +!TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varies noise reduction strength across the range of tones. Smaller values will target shadows, while larger values will stretch the effect to the brighter tones. +!TP_DIRPYRDENOISE_MAIN_MODE;Mode +!TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressive +!TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservative +!TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservative" preserves low frequency chroma patterns, while "aggressive" obliterates them. +!TP_DIRPYRDENOISE_MEDIAN_METHOD;Median method +!TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Median Filter +!TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Luminance only +!TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +!TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;When using the "Luminance only" and "L*a*b*" methods, median filtering will be performed just after the wavelet step in the noise reduction pipeline.\nWhen using the "RGB" mode, it will be performed at the very end of the noise reduction pipeline. +!TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Weighted L* (little) + a*b* (normal) +!TP_DIRPYRDENOISE_MEDIAN_PASSES;Median iterations +!TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;Applying three median filter iterations with a 3×3 window size often leads to better results than using one median filter iteration with a 7×7 window size. +!TP_DIRPYRDENOISE_MEDIAN_TYPE;Median type +!TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Apply a median filter of the desired window size. The larger the window's size, the longer it takes.\n\n3×3 soft: treats 5 pixels in a 3×3 pixel window.\n3×3: treats 9 pixels in a 3×3 pixel window.\n5×5 soft: treats 13 pixels in a 5×5 pixel window.\n5×5: treats 25 pixels in a 5×5 pixel window.\n7×7: treats 49 pixels in a 7×7 pixel window.\n9×9: treats 81 pixels in a 9×9 pixel window.\n\nSometimes it is possible to achieve higher quality running several iterations with a smaller window size than one iteration with a larger one. !TP_DIRPYRDENOISE_SLI;Slider -!TP_DIRPYRDENOISE_TILELABEL;Tile size=%1, Center: Tx=%2 Ty=%3 +!TP_DIRPYRDENOISE_TYPE_3X3;3×3 +!TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 soft +!TP_DIRPYRDENOISE_TYPE_5X5;5×5 +!TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 soft +!TP_DIRPYRDENOISE_TYPE_7X7;7×7 +!TP_DIRPYRDENOISE_TYPE_9X9;9×9 !TP_DIRPYREQUALIZER_ALGO;Skin Color Range !TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts. !TP_DIRPYREQUALIZER_ARTIF;Reduce artifacts @@ -1594,6 +1622,8 @@ !TP_EXPOSURE_CURVEEDITOR1;Tone curve 1 !TP_EXPOSURE_CURVEEDITOR2;Tone curve 2 !TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Please refer to the "Exposure > Tone Curves" RawPedia article to learn how to achieve the best results by using two tone curves. +!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_EXPOSURE_SATURATION;Saturation !TP_EXPOSURE_TCMODE_FILMLIKE;Film-like !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 @@ -1715,6 +1745,15 @@ !TP_LENSPROFILE_USECA;Chromatic aberration correction !TP_LENSPROFILE_USEDIST;Distortion correction !TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LOCALCONTRAST_AMOUNT;Amount +!TP_LOCALCONTRAST_DARKNESS;Darkness level +!TP_LOCALCONTRAST_LABEL;Local Contrast +!TP_LOCALCONTRAST_LIGHTNESS;Lightness level +!TP_LOCALCONTRAST_RADIUS;Radius +!TP_METADATA_EDIT;Apply modifications +!TP_METADATA_MODE;Metadata copy mode +!TP_METADATA_STRIP;Strip all metadata +!TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset !TP_NEUTRAL_TIP;Resets exposure sliders to neutral values.\nApplies to the same controls that Auto Levels applies to, regardless of whether you used Auto Levels or not. !TP_PCVIGNETTE_FEATHER;Feather @@ -1764,7 +1803,7 @@ !TP_RAW_DCBITERATIONS;Number of DCB iterations !TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... !TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaicing refinement... -!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to aid in noise reduction without leading to maze patterns, posterization or a washed-out look.\nPixel Shift is for Pentax/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1772,7 +1811,7 @@ !TP_RAW_HPHD;HPHD !TP_RAW_IGV;IGV !TP_RAW_IMAGENUM;Sub-image -!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts. !TP_RAW_LABEL;Demosaicing !TP_RAW_LMMSE;LMMSE !TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps @@ -1812,6 +1851,8 @@ !TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal !TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical !TP_RAW_PIXELSHIFTNREADISO;nRead +!TP_RAW_PIXELSHIFTONEGREEN;Use one green instead of average +!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. !TP_RAW_PIXELSHIFTPRNU;PRNU (%) !TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Red&Blue weight !TP_RAW_PIXELSHIFTSHOWMOTION;Show motion mask @@ -1825,6 +1866,7 @@ !TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue !TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green !TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red +!TP_RAW_RCD;RCD !TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix !TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster. !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix @@ -1934,6 +1976,10 @@ !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_TM_FATTAL_AMOUNT;Amount +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;HDR Tone Mapping +!TP_TM_FATTAL_THRESHOLD;Threshold !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2160,7 +2206,7 @@ !ZOOMPANEL_100;(100%) !ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window !ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f -!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: f +!ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: Alt-f !ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + !ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff -Nru rawtherapee-5.3/rtdata/options/options.lin rawtherapee-5.4/rtdata/options/options.lin --- rawtherapee-5.3/rtdata/options/options.lin 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/options/options.lin 2018-03-20 11:04:15.000000000 +0000 @@ -6,14 +6,14 @@ [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be usefull if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache datas in a single place, # an external HD for example MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff -Nru rawtherapee-5.3/rtdata/options/options.osx rawtherapee-5.4/rtdata/options/options.osx --- rawtherapee-5.3/rtdata/options/options.osx 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/options/options.osx 2018-03-20 11:04:15.000000000 +0000 @@ -2,18 +2,18 @@ # After the first run, all the parameters will be available in this global option file # or in a new local option file, depending on the MultiUser value below -# Most ot the options are modifiable through the Preference window +# Most of the options are modifiable through the Preference window [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be usefull if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache datas in a single place, # an external HD for example MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff -Nru rawtherapee-5.3/rtdata/options/options.win rawtherapee-5.4/rtdata/options/options.win --- rawtherapee-5.3/rtdata/options/options.win 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/options/options.win 2018-03-20 11:04:15.000000000 +0000 @@ -2,11 +2,11 @@ # After the first run, all the parameters will be available in this global option file # or in a new local option file, depending on the MultiUser value below -# Most ot the options are modifiable through the Preference window +# Most of the options are modifiable through the Preference window [General] # Setting MultiUser to false will use the application's installation directory as cache directory, -# which can be usefull if you want to keep the application and all the cache datas in a single place, +# which can be useful if you want to keep the application and all the cache datas in a single place, # an external HD for example MultiUser=true # Windows users should not use the system theme : some composed widget won't be usable @@ -14,8 +14,8 @@ [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO High.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO High.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO High.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO High.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,70 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=0 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=true +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=1;0;0;1;1; +Curve2=0; + +[Directional Pyramid Denoising] +Enabled=true +Enhance=false +Median=true +Luma=50 +Ldetail=60 +Method=Lab +LMethod=SLI +CMethod=AUT +C2Method=AUTO +SMethod=shal +MedMethod=55 +RGBMethod=soft +MethodMed=Lpab +Redchro=0 +Bluechro=0 +Gamma=1.7 +Passes=1 +LCurve=0 +CCCurve=0 + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[RAW Bayer] +Method=lmmse +CcSteps=2 +LMMSEIterations=2 + +[RAW X-Trans] +Method=1-pass (medium) +CcSteps=2 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,40 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=0 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=true +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=0; +Curve2=0; + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,62 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=0 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=true +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=0; +Curve2=0; + +[Directional Pyramid Denoising] +Enabled=true +Enhance=false +Median=false +Luma=0 +Ldetail=0 +Chroma=0 +Method=Lab +LMethod=SLI +CMethod=AUT +C2Method=AUTO +SMethod=shal +MedMethod=55 +RGBMethod=soft +MethodMed=Lpab +Redchro=0 +Bluechro=0 +Gamma=1.7 +Passes=1 +LCurve=0 +CCCurve=0 + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Default ISO High.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Default ISO High.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Default ISO High.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Default ISO High.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -[Version] -AppVersion=5.1 -Version=326 - -[Exposure] -Auto=true -Clip=0.02 -Saturation=0 -CurveMode=Perceptual -CurveMode2=Perceptual -Curve=0; -Curve2=0; - -[Retinex] -Enabled=false - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Sharpening] -Enabled=false - -[Vibrance] -Enabled=false - -[SharpenEdge] -Enabled=false - -[SharpenMicro] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 -TemperatureBias=0 - -[Color appearance] -Enabled=false - -[Impulse Denoising] -Enabled=false - -[Defringing] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Median=true -Auto=false -Luma=40 -Ldetail=80 -Method=Lab -LMethod=SLI -CMethod=MAN -C2Method=AUTO -SMethod=shal -MedMethod=soft -RGBMethod=soft -MethodMed=Lpab -Gamma=1.7 -Passes=1 - -[EPD] -Enabled=false - -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=false - -[Color Management] -InputProfile=(cameraICC) -ToneCurve=false -ApplyLookTable=false -ApplyBaselineExposureOffset=true -ApplyHueSatMap=true -BlendCMSMatrix=false -DCPIlluminant=0 -WorkingProfile=ProPhoto -OutputProfile=RT_sRGB -OutputProfileIntent=Relative -OutputBPC=true -Gammafree=default -Freegamma=false -GammaValue=2.2200000000000002 -GammaSlope=4.5 - -[Wavelet] -Enabled=false - -[Directional Pyramid Equalizer] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -DarkFrame=/szeva -DarkFrameAuto=false -FlatFieldFile=/szeva -FlatFieldAutoSelect=false -CA=true -HotPixelFilter=false -DeadPixelFilter=false -HotDeadPixelThresh=100 -PreExposure=1 -PrePreserv=0 - -[RAW Bayer] -Method=lmmse -ImageNum=1 -CcSteps=0 -PreBlack0=0 -PreBlack1=0 -PreBlack2=0 -PreBlack3=0 -PreTwoGreen=true -LineDenoise=0 -GreenEqThreshold=0 -DCBIterations=2 -DCBEnhance=true -LMMSEIterations=2 - -[RAW X-Trans] -Method=3-pass (best) -CcSteps=0 -PreBlackRed=0 -PreBlackGreen=0 -PreBlackBlue=0 - diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Default ISO Medium.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Default ISO Medium.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Default ISO Medium.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Default ISO Medium.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,184 +0,0 @@ -[Version] -AppVersion=5.1 -Version=326 - -[Exposure] -Auto=true -Clip=0.02 -Saturation=0 -CurveMode=Perceptual -CurveMode2=Perceptual -Curve=0; -Curve2=0; - -[Retinex] -Enabled=false - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Sharpening] -Enabled=true -Method=usm -Radius=0.75 -Amount=200 -Threshold=20;80;2000;1200; -OnlyEdges=false -EdgedetectionRadius=1.9 -EdgeTolerance=1800 -HalocontrolEnabled=false -HalocontrolAmount=85 -DeconvRadius=0.75 -DeconvAmount=75 -DeconvDamping=20 -DeconvIterations=30 - -[Vibrance] -Enabled=false - -[SharpenEdge] -Enabled=false - -[SharpenMicro] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 -TemperatureBias=0 - -[Color appearance] -Enabled=false - -[Impulse Denoising] -Enabled=false - -[Defringing] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Median=false -Auto=false -Luma=0 -Ldetail=80 -Method=Lab -LMethod=SLI -CMethod=MAN -C2Method=AUTO -SMethod=shal -MedMethod=soft -RGBMethod=soft -MethodMed=Lonly -Gamma=1.7 -Passes=1 - -[EPD] -Enabled=false - -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=false - -[Color Management] -InputProfile=(cameraICC) -ToneCurve=false -ApplyLookTable=false -ApplyBaselineExposureOffset=true -ApplyHueSatMap=true -BlendCMSMatrix=false -DCPIlluminant=0 -WorkingProfile=ProPhoto -OutputProfile=RT_sRGB -OutputProfileIntent=Relative -OutputBPC=true -Gammafree=default -Freegamma=false -GammaValue=2.2200000000000002 -GammaSlope=4.5 - -[Wavelet] -Enabled=false - -[Directional Pyramid Equalizer] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -DarkFrame=/szeva -DarkFrameAuto=false -FlatFieldFile=/szeva -FlatFieldAutoSelect=false -CA=true -HotPixelFilter=false -DeadPixelFilter=false -HotDeadPixelThresh=100 -PreExposure=1 -PrePreserv=0 - -[RAW Bayer] -Method=amaze -ImageNum=1 -CcSteps=0 -PreBlack0=0 -PreBlack1=0 -PreBlack2=0 -PreBlack3=0 -PreTwoGreen=true -LineDenoise=0 -GreenEqThreshold=0 -DCBIterations=2 -DCBEnhance=true -LMMSEIterations=2 - -[RAW X-Trans] -Method=3-pass (best) -CcSteps=0 -PreBlackRed=0 -PreBlackGreen=0 -PreBlackBlue=0 - diff -Nru rawtherapee-5.3/rtdata/profiles/Default.pp3 rawtherapee-5.4/rtdata/profiles/Default.pp3 --- rawtherapee-5.3/rtdata/profiles/Default.pp3 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/profiles/Default.pp3 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -[Version] -AppVersion=5.1 -Version=326 - -[Exposure] -Auto=true -Clip=0.02 -Saturation=0 -CurveMode=Perceptual -CurveMode2=Perceptual -Curve=0; -Curve2=0; - -[Retinex] -Enabled=false - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Sharpening] -Enabled=true -Method=usm -Radius=0.5 -Amount=200 -Threshold=20;80;2000;1200; -OnlyEdges=false -EdgedetectionRadius=1.9 -EdgeTolerance=1800 -HalocontrolEnabled=false -HalocontrolAmount=85 -DeconvRadius=0.75 -DeconvAmount=75 -DeconvDamping=20 -DeconvIterations=30 - -[Vibrance] -Enabled=false - -[SharpenEdge] -Enabled=false - -[SharpenMicro] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 -TemperatureBias=0 - -[Color appearance] -Enabled=false - -[Impulse Denoising] -Enabled=false - -[Defringing] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=false - -[EPD] -Enabled=false - -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=false - -[Color Management] -InputProfile=(cameraICC) -ToneCurve=false -ApplyLookTable=false -ApplyBaselineExposureOffset=true -ApplyHueSatMap=true -BlendCMSMatrix=false -DCPIlluminant=0 -WorkingProfile=ProPhoto -OutputProfile=RT_sRGB -OutputProfileIntent=Relative -OutputBPC=true -Gammafree=default -Freegamma=false -GammaValue=2.2200000000000002 -GammaSlope=4.5 - -[Wavelet] -Enabled=false - -[Directional Pyramid Equalizer] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -DarkFrame=/szeva -DarkFrameAuto=false -FlatFieldFile=/szeva -FlatFieldAutoSelect=false -CA=true -HotPixelFilter=false -DeadPixelFilter=false -HotDeadPixelThresh=100 -PreExposure=1 -PrePreserv=0 - -[RAW Bayer] -Method=amaze -ImageNum=1 -CcSteps=0 -PreBlack0=0 -PreBlack1=0 -PreBlack2=0 -PreBlack3=0 -PreTwoGreen=true -LineDenoise=0 -GreenEqThreshold=0 -DCBIterations=2 -DCBEnhance=true -LMMSEIterations=2 - -[RAW X-Trans] -Method=3-pass (best) -CcSteps=0 -PreBlackRed=0 -PreBlackGreen=0 -PreBlackBlue=0 - diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO High.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - -[RAW] -CA=true - -[RAW Bayer] -Method=pixelshift -PixelShiftMotion=0 -PixelShiftMotionCorrection=5 -PixelShiftMotionCorrectionMethod=2 -pixelShiftStddevFactorGreen=5 -pixelShiftStddevFactorRed=5 -pixelShiftStddevFactorBlue=5 -PixelShiftEperIso=2.8999999999999999 -PixelShiftNreadIso=0 -PixelShiftPrnu=1 -PixelShiftSigma=10 -PixelShiftSum=3 -PixelShiftRedBlueWeight=0.69999999999999996 -pixelShiftAutomatic=true -pixelShiftHoleFill=true -pixelShiftGreen=true -pixelShiftBlur=true -pixelShiftSmoothFactor=0.69999999999999996 -pixelShiftLmmse=true -pixelShiftNonGreenCross=false diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO Low.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - -[Sharpening] -Enabled=true -Method=rld -DeconvRadius=0.75 -DeconvAmount=75 -DeconvDamping=0 -DeconvIterations=30 - -[SharpenMicro] -Enabled=true -Matrix=false -Strength=20 -Uniformity=50 - -[RAW] -CA=true - -[RAW Bayer] -Method=pixelshift -PixelShiftMotion=0 -PixelShiftMotionCorrection=5 -PixelShiftMotionCorrectionMethod=1 -pixelShiftStddevFactorGreen=5 -pixelShiftStddevFactorRed=5 -pixelShiftStddevFactorBlue=5 -PixelShiftEperIso=0 -PixelShiftNreadIso=0 -PixelShiftPrnu=1 -PixelShiftSigma=1 -PixelShiftSum=3 -PixelShiftRedBlueWeight=0.69999999999999996 -pixelShiftAutomatic=true -pixelShiftHoleFill=true -pixelShiftGreen=true -pixelShiftBlur=true -pixelShiftSmoothFactor=0.69999999999999996 -pixelShiftLmmse=false -pixelShiftNonGreenCross=true diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS ISO Medium.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - -[RAW] -CA=true - -[RAW Bayer] -Method=pixelshift -PixelShiftMotion=0 -PixelShiftMotionCorrection=5 -PixelShiftMotionCorrectionMethod=2 -pixelShiftStddevFactorGreen=5 -pixelShiftStddevFactorRed=5 -pixelShiftStddevFactorBlue=5 -PixelShiftEperIso=2 -PixelShiftNreadIso=0 -PixelShiftPrnu=1 -PixelShiftSigma=5 -PixelShiftSum=3 -PixelShiftRedBlueWeight=0.69999999999999996 -pixelShiftAutomatic=true -pixelShiftHoleFill=true -pixelShiftGreen=true -pixelShiftBlur=true -pixelShiftSmoothFactor=0.69999999999999996 -pixelShiftNonGreenCross=true diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3" 2017-09-30 19:31:22.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pentax Pixel Shift/PS No Motion.pp3" 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - -[Sharpening] -Enabled=true -Method=rld -DeconvRadius=0.75 -DeconvAmount=75 -DeconvDamping=0 -DeconvIterations=30 - -[SharpenMicro] -Enabled=true -Matrix=false -Strength=20 -Uniformity=50 - -[RAW] -CA=true - -[RAW Bayer] -Method=pixelshift -PixelShiftMotion=0 -PixelShiftMotionCorrection=5 -PixelShiftMotionCorrectionMethod=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO High.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO High.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO High.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO High.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,28 @@ +[Version] +AppVersion=5.0-r1-gtk3-503-g9e1fc78 +Version=326 + +[RAW] +CA=true + +[RAW Bayer] +Method=pixelshift +PixelShiftMotion=0 +PixelShiftMotionCorrection=5 +PixelShiftMotionCorrectionMethod=2 +pixelShiftStddevFactorGreen=5 +pixelShiftStddevFactorRed=5 +pixelShiftStddevFactorBlue=5 +PixelShiftEperIso=2.8999999999999999 +PixelShiftNreadIso=0 +PixelShiftPrnu=1 +PixelShiftSigma=10 +PixelShiftSum=3 +PixelShiftRedBlueWeight=0.69999999999999996 +pixelShiftAutomatic=true +pixelShiftHoleFill=true +pixelShiftGreen=true +pixelShiftBlur=true +pixelShiftSmoothFactor=0.69999999999999996 +pixelShiftLmmse=true +pixelShiftNonGreenCross=false diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO Low.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO Low.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO Low.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO Low.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,42 @@ +[Version] +AppVersion=5.0-r1-gtk3-503-g9e1fc78 +Version=326 + +[Sharpening] +Enabled=true +Method=rld +DeconvRadius=0.75 +DeconvAmount=75 +DeconvDamping=0 +DeconvIterations=30 + +[SharpenMicro] +Enabled=true +Matrix=false +Strength=20 +Uniformity=50 + +[RAW] +CA=true + +[RAW Bayer] +Method=pixelshift +PixelShiftMotion=0 +PixelShiftMotionCorrection=5 +PixelShiftMotionCorrectionMethod=1 +pixelShiftStddevFactorGreen=5 +pixelShiftStddevFactorRed=5 +pixelShiftStddevFactorBlue=5 +PixelShiftEperIso=0 +PixelShiftNreadIso=0 +PixelShiftPrnu=1 +PixelShiftSigma=1 +PixelShiftSum=3 +PixelShiftRedBlueWeight=0.69999999999999996 +pixelShiftAutomatic=true +pixelShiftHoleFill=true +pixelShiftGreen=true +pixelShiftBlur=true +pixelShiftSmoothFactor=0.69999999999999996 +pixelShiftLmmse=false +pixelShiftNonGreenCross=true diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,27 @@ +[Version] +AppVersion=5.0-r1-gtk3-503-g9e1fc78 +Version=326 + +[RAW] +CA=true + +[RAW Bayer] +Method=pixelshift +PixelShiftMotion=0 +PixelShiftMotionCorrection=5 +PixelShiftMotionCorrectionMethod=2 +pixelShiftStddevFactorGreen=5 +pixelShiftStddevFactorRed=5 +pixelShiftStddevFactorBlue=5 +PixelShiftEperIso=2 +PixelShiftNreadIso=0 +PixelShiftPrnu=1 +PixelShiftSigma=5 +PixelShiftSum=3 +PixelShiftRedBlueWeight=0.69999999999999996 +pixelShiftAutomatic=true +pixelShiftHoleFill=true +pixelShiftGreen=true +pixelShiftBlur=true +pixelShiftSmoothFactor=0.69999999999999996 +pixelShiftNonGreenCross=true diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS No Motion.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS No Motion.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Pixel Shift/PS No Motion.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Pixel Shift/PS No Motion.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,26 @@ +[Version] +AppVersion=5.0-r1-gtk3-503-g9e1fc78 +Version=326 + +[Sharpening] +Enabled=true +Method=rld +DeconvRadius=0.75 +DeconvAmount=75 +DeconvDamping=0 +DeconvIterations=30 + +[SharpenMicro] +Enabled=true +Matrix=false +Strength=20 +Uniformity=50 + +[RAW] +CA=true + +[RAW Bayer] +Method=pixelshift +PixelShiftMotion=0 +PixelShiftMotionCorrection=5 +PixelShiftMotionCorrectionMethod=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO High.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO High.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO High.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO High.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,71 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=90 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=false +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=1;0;0;0.11;0.09;0.32;0.43;0.66;0.87;1;1; +Curve2=0; + +[Directional Pyramid Denoising] +Enabled=true +Enhance=false +Median=true +Luma=50 +Ldetail=60 +Chroma=0 +Method=Lab +LMethod=SLI +CMethod=AUT +C2Method=AUTO +SMethod=shal +MedMethod=55 +RGBMethod=soft +MethodMed=Lpab +Redchro=0 +Bluechro=0 +Gamma=1.7 +Passes=1 +LCurve=0 +CCCurve=0 + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[RAW Bayer] +Method=lmmse +CcSteps=2 +LMMSEIterations=2 + +[RAW X-Trans] +Method=1-pass (medium) +CcSteps=2 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO Low.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO Low.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO Low.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO Low.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,40 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=90 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=false +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=1;0;0;0.11;0.09;0.32;0.43;0.66;0.87;1;1; +Curve2=0; + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO Medium.pp3" "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO Medium.pp3" --- "/tmp/tmptaSwZe/1AnLPM3uo8/rawtherapee-5.3/rtdata/profiles/Standard Film Curve - ISO Medium.pp3" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmptaSwZe/SPx4Nw99AD/rawtherapee-5.4/rtdata/profiles/Standard Film Curve - ISO Medium.pp3" 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,62 @@ +[Version] +AppVersion=5.3-544-gc2e7d924 +Version=330 + +[HLRecovery] +Enabled=true +Method=Blend + +[Exposure] +Auto=false +Clip=0.02 +Compensation=0 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=90 +HighlightComprThreshold=33 +ShadowCompr=50 +HistogramMatching=false +CurveMode=FilmLike +CurveMode2=WeightedStd +Curve=1;0;0;0.11;0.09;0.32;0.43;0.66;0.87;1;1; +Curve2=0; + +[Directional Pyramid Denoising] +Enabled=true +Enhance=false +Median=false +Luma=0 +Ldetail=0 +Chroma=0 +Method=Lab +LMethod=SLI +CMethod=AUT +C2Method=AUTO +SMethod=shal +MedMethod=soft +RGBMethod=soft +MethodMed=Lonly +Redchro=0 +Bluechro=0 +Gamma=1.7 +Passes=1 +LCurve=0 +CCCurve=0 + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[RAW] +CA=true + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 diff -Nru rawtherapee-5.3/rtdata/themes/RawTherapee-GTK3-_19.css rawtherapee-5.4/rtdata/themes/RawTherapee-GTK3-_19.css --- rawtherapee-5.3/rtdata/themes/RawTherapee-GTK3-_19.css 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/themes/RawTherapee-GTK3-_19.css 2018-03-20 11:04:15.000000000 +0000 @@ -500,3 +500,26 @@ #PartialPasteHeaderSep { color: #D8D8D8; } + + +#MyFileChooserButton { + padding-left: 3px; + padding-right: 3px; +} + +/* Better on/off state separation for text toggle buttons, e.g. auto-levels or histogram matching. */ +GtkToggleButton.button.text-button { + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} + +GtkToggleButton.button.text-button:hover { + background-image: linear-gradient(to bottom, rgba(128,128,128,.3), rgba(64,64,64,.3)); +} + +GtkToggleButton.button.text-button:checked { + background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.4)); +} + +GtkToggleButton.button.text-button:hover:checked { + background-image: linear-gradient(to bottom, rgba(48,48,48,.3), rgba(0,0,0,.3)); +} diff -Nru rawtherapee-5.3/rtdata/themes/RawTherapee-GTK3-20_.css rawtherapee-5.4/rtdata/themes/RawTherapee-GTK3-20_.css --- rawtherapee-5.3/rtdata/themes/RawTherapee-GTK3-20_.css 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/themes/RawTherapee-GTK3-20_.css 2018-03-20 11:04:15.000000000 +0000 @@ -324,6 +324,23 @@ padding: 4px; } +/* Better on/off state separation for text toggle buttons, e.g. auto-levels or histogram matching. */ +button.text-button.toggle { + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} + +button.text-button.toggle:hover { + background-image: linear-gradient(to bottom, rgba(128,128,128,.3), rgba(64,64,64,.3)); +} + +button.text-button.toggle:checked { + background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.4)); +} + +button.text-button.toggle:hover:checked { + background-image: linear-gradient(to bottom, rgba(48,48,48,.3), rgba(0,0,0,.3)); +} + separator { color: #363636; margin: 5px; @@ -446,6 +463,11 @@ min-height: 10px; } +/* FlowBoxChild */ +flowboxchild:selected { + background-color: inherit; +} + #HistogramPanel { margin: 0; padding: 0; @@ -903,3 +925,13 @@ #PartialPasteHeaderSep { background-color: #D8D8D8; } + +/* All MyFileChooserButtons */ +button#MyFileChooserButton { + padding: 2px; + margin: 2px; +} + +#ToolPanelNotebook button { + margin: 0px; +} diff -Nru rawtherapee-5.3/rtdata/themes/TooWaBlue-GTK3-20_.css rawtherapee-5.4/rtdata/themes/TooWaBlue-GTK3-20_.css --- rawtherapee-5.3/rtdata/themes/TooWaBlue-GTK3-20_.css 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtdata/themes/TooWaBlue-GTK3-20_.css 2018-03-20 11:04:15.000000000 +0000 @@ -2,7 +2,7 @@ This file is part of RawTherapee. Copyright (c) 2016-2017 TooWaBoo - Version 2.56 - requires RT 5.0 (Gtk+ >= 3.20) + Version 2.62 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -213,10 +213,6 @@ padding-left: 0.91667em; } -#BatchQueueButtons { - margin-top: 0.66667em; -} - frame > label { margin: 0; padding: 0.5em 0; @@ -425,7 +421,7 @@ } paned.vertical > separator { - background-image: image(@bg-dark-grey); + background-image: image(@bg-dark-grey); background-color: @bg-light-grey; min-height: 0.5em; border-top: 1px solid @bg-light-grey; @@ -463,6 +459,9 @@ background-color: @view-grid-border; margin: 0.33334em 0; } +#MyFileChooserButton separator { + background-color: transparent; +} #PlacesPaned .view.separator { color: @border-color; @@ -634,6 +633,11 @@ background-image: none; } +#BatchQueueButtonsMainContainer scale:disabled slider, +#BatchQueueButtonsMainContainer scale:disabled trough { + background-color: shade(@bg-light-grey,.85); +} + /*** end ***************************************************************************************/ /*** Progressbar *******************************************************************************/ @@ -884,12 +888,15 @@ border-radius: 0; } +#MetaPanelNotebook > stack > box:nth-child(1) > :nth-child(1) { + border: 0.08334em solid @bg-dark-grey; +} #MetaPanelNotebook > stack > box:nth-child(2) > scrolledwindow scrolledwindow { background-color: @bg-dark-grey; padding: 0; margin: 0; } -#MetaPanelNotebook .view { +#MetaPanelNotebook > stack > box:nth-child(2) .view { border: 0.08334em solid @bg-dark-grey; padding: 0.16667em; margin: 0; @@ -1036,9 +1043,8 @@ } #EditorTopPanel > box:nth-child(9) > button.image-button { - min-width: 0; - padding-left: 0.25em; - padding-right: 0.25em; + min-width: 1.05em; + padding: 0; } /*Button editor bottom*/ @@ -1182,7 +1188,7 @@ padding: 0.08334em; border: 0.08334em solid @accent-color; } -.csd entry > window > frame > border { +entry > window > frame > border { margin: 0.08334em; } /* end */ @@ -1190,15 +1196,14 @@ /*** end ***************************************************************************************/ /*** Popover *** Context menu filechooser ******************************************************/ -.csd popover.background { - box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey; -} + popover.background { background-color: @bg-dark-grey; border: 0.08334em solid @accent-color; border-radius: 0; padding: 0; margin: 0; + box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey; } popover.background > box { padding: 0; @@ -1221,6 +1226,51 @@ } /** end ****************************************************************************************/ +/*** Switch ***********************************************************************************/ +switch { + min-height: 2.16667em; + min-width: 11em; + margin: 0; + padding: 0; + border-radius: 0.2em; + background-image: none; + box-shadow: inset 0.08334em 0.08334em rgba(0, 0, 0, 0.08), 0 0.08334em rgba(242, 242, 242, 0.1); + border: 0.08334em solid @bg-entry-border; + background-color: @bg-scale-entry; + margin-bottom: 0.5em; +} + +switch slider { + border: 0.08334em solid @bg-entry-border; + background-color: shade (@bg-light-grey, .85); + background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); + border: 0.08334em solid @bg-entry-border; + box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.1); + border-radius: 0.2em 0 0 0.2em; +} +switch:checked slider{ + border-radius: 0 0.2em 0.2em 0; +} + +switch:hover slider { + background-color: shade (@bg-light-grey, .65); + background-image: linear-gradient(to bottom, rgba(125,125,125,.4), rgba(60,60,60,.4)); +} + +switch:checked { + background-color: @accent-color2; + color: @headline-big; +} + +switch:disabled:not(:checked) { + box-shadow: none; + background-image: none; + background-color: shade (@bg-light-grey, .85); +} + + +/** end ****************************************************************************************/ + /*** Buttons ***********************************************************************************/ button { min-height: 2.16667em; @@ -1240,6 +1290,21 @@ margin: 0 0.5em;/* x */ } +#PrefNotebook > stack > :nth-child(5) combobox { + /* margin: 0.16667em 0; */ + margin: 2px 0; +} +#PrefNotebook > stack > :nth-child(2) #MyFileChooserButton { + /* margin: 0.25em 0.33334em; */ + margin: 3px 5px; +} + +filechooser button image, +#MyFileChooserButton image { + opacity: .8; + -gtk-icon-style: symbolic; +} + #MainNotebook > header > grid > button, button.flat { border: 0.08334em solid transparent; @@ -1336,6 +1401,7 @@ /**/ /* Button base format for Toolbox and dialogs */ +#ToolPanelNotebook > stack > box > box > combobox .combo, dialog button, #MyExpander button, #BatchQueueButtonsMainContainer button { @@ -1344,11 +1410,15 @@ padding: 0 0.375em; margin: 0.08334em 0; } +#MyExpander #MyFileChooserButton + button.image-button{ + min-width: 1.66667em; + padding: 0; +} combobox .combo, dialog combobox .combo, #ToolPanelNotebook combobox .combo, #BatchQueueButtonsMainContainer combobox .combo { - padding: 0 0.208334em; + padding: 0 0.26667em; } /**/ @@ -1363,7 +1433,7 @@ #MyExpander combobox + label */ { margin-left: 0.16667em; } -#MyExpander label + filechooserbutton, + #MyExpander label + * > button:not(.flat).Left, #MyExpander label + combobox:not(:first-child):not(:only-child), #MyExpander label + button:not(.flat):not(spinbutton) { @@ -1433,13 +1503,6 @@ } /**/ -/* Queue */ -#BatchQueueButtons button { - min-height: 2.16667em; - min-width: 10em; -} -/**/ - /* View & Filechooser Buttons */ dialog .view button, window .view button { @@ -1614,6 +1677,10 @@ margin: 0; min-height: 2em; } +#PrefNotebook checkbox, +#PrefNotebook checkbutton { + min-height: 1.6667em; +} check, radio { @@ -1627,7 +1694,7 @@ box-shadow: none; background-repeat: no-repeat; -gtk-icon-shadow: none; - color: @text-color; + color: @text-color; } radiobutton label, checkbutton label { diff -Nru rawtherapee-5.3/rtengine/alignedbuffer.h rawtherapee-5.4/rtengine/alignedbuffer.h --- rawtherapee-5.3/rtengine/alignedbuffer.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/alignedbuffer.h 2018-03-20 11:04:15.000000000 +0000 @@ -18,12 +18,14 @@ */ #ifndef _ALIGNEDBUFFER_ #define _ALIGNEDBUFFER_ + #include #include -#include #include -#include -#include "../rtgui/threadutils.h" + +inline size_t padToAlignment(size_t size, size_t align = 16) { + return align * ((size + align - 1) / align); +} // Aligned buffer that should be faster template class AlignedBuffer @@ -111,7 +113,6 @@ } if (real) { - //data = (T*)( (uintptr_t)real + (alignment-((uintptr_t)real)%alignment) ); data = (T*)( ( uintptr_t(real) + uintptr_t(alignment - 1)) / alignment * alignment); inUse = true; } else { @@ -142,51 +143,4 @@ } }; -// Multi processor version, use with OpenMP -template class AlignedBufferMP -{ -private: - MyMutex mtx; - std::vector*> buffers; - size_t size; - -public: - explicit AlignedBufferMP(size_t sizeP) - { - size = sizeP; - } - - ~AlignedBufferMP() - { - for (size_t i = 0; i < buffers.size(); i++) { - delete buffers[i]; - } - } - - AlignedBuffer* acquire() - { - MyMutex::MyLock lock(mtx); - - // Find available buffer - for (size_t i = 0; i < buffers.size(); i++) { - if (!buffers[i]->inUse) { - buffers[i]->inUse = true; - return buffers[i]; - } - } - - // Add new buffer if nothing is free - AlignedBuffer* buffer = new AlignedBuffer(size); - buffers.push_back(buffer); - - return buffer; - } - - void release(AlignedBuffer* buffer) - { - MyMutex::MyLock lock(mtx); - - buffer->inUse = false; - } -}; #endif diff -Nru rawtherapee-5.3/rtengine/amaze_demosaic_RT.cc rawtherapee-5.4/rtengine/amaze_demosaic_RT.cc --- rawtherapee-5.3/rtengine/amaze_demosaic_RT.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/amaze_demosaic_RT.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,14 +38,14 @@ namespace rtengine { -SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue) +void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue) { BENCHFUN volatile double progress = 0.0; if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE))); plistener->setProgress (0.0); } @@ -105,7 +105,7 @@ }; //gaussian on 5x5 alt quincunx, sigma=1.5 constexpr float gausseven[2] = {0.13719494435797422f, 0.05640252782101291f}; - //guassian on quincunx grid + //gaussian on quincunx grid constexpr float gquinc[4] = {0.169917f, 0.108947f, 0.069855f, 0.0287182f}; typedef struct { @@ -223,13 +223,19 @@ // fill inner part for (int rr = rrmin; rr < rrmax; rr++) { int row = rr + top; - - for (int cc = ccmin; cc < ccmax; cc += 4) { + int cc = ccmin; + for (; cc < ccmax - 3; cc += 4) { int indx1 = rr * ts + cc; vfloat tempv = LVFU(rawData[row][cc + left]) / c65535v; STVF(cfa[indx1], tempv ); STVF(rgbgreen[indx1], tempv ); } + for (; cc < ccmax; ++cc) { + int indx1 = rr * ts + cc; + float temp = rawData[row][cc + left] / 65535.f; + cfa[indx1] = temp; + rgbgreen[indx1] = temp; + } } //fill lower border diff -Nru rawtherapee-5.3/rtengine/boxblur.h rawtherapee-5.4/rtengine/boxblur.h --- rawtherapee-5.3/rtengine/boxblur.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/boxblur.h 2018-03-20 11:04:15.000000000 +0000 @@ -34,8 +34,6 @@ template void boxblur (T** src, A** dst, int radx, int rady, int W, int H) { - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //box blur image; box range = (radx,rady) AlignedBuffer* buffer = new AlignedBuffer (W * H); @@ -123,10 +121,8 @@ } -template SSEFUNCTION void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H) +template void boxblur (T** src, A** dst, T* buffer, int radx, int rady, int W, int H) { - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //box blur image; box range = (radx,rady) float* temp = buffer; @@ -313,13 +309,8 @@ } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -template SSEFUNCTION void boxblur (T* src, A* dst, A* buffer, int radx, int rady, int W, int H) +template 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) float* temp = buffer; @@ -505,490 +496,7 @@ } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -template void boxvar (T* src, T* dst, int radx, int rady, int W, int H) -{ - - AlignedBuffer buffer1(W * H); - AlignedBuffer buffer2(W * H); - float* tempave = buffer1.data; - float* tempsqave = buffer2.data; - - AlignedBufferMP buffer3(H); - - //float image_ave = 0; - - //box blur image channel; box size = 2*box+1 - //horizontal blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - int len = radx + 1; - tempave[row * W + 0] = src[row * W + 0] / len; - tempsqave[row * W + 0] = SQR(src[row * W + 0]) / len; - - for (int j = 1; j <= radx; j++) { - tempave[row * W + 0] += src[row * W + j] / len; - tempsqave[row * W + 0] += SQR(src[row * W + j]) / len; - } - - for (int col = 1; col <= radx; col++) { - tempave[row * W + col] = (tempave[row * W + col - 1] * len + src[row * W + col + radx]) / (len + 1); - tempsqave[row * W + col] = (tempsqave[row * W + col - 1] * len + SQR(src[row * W + col + radx])) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - tempave[row * W + col] = tempave[row * W + col - 1] + (src[row * W + col + radx] - src[row * W + col - radx - 1]) / len; - tempsqave[row * W + col] = tempsqave[row * W + col - 1] + (SQR(src[row * W + col + radx]) - SQR(src[row * W + col - radx - 1])) / len; - } - - for (int col = W - radx; col < W; col++) { - tempave[row * W + col] = (tempave[row * W + col - 1] * len - src[row * W + col - radx - 1]) / (len - 1); - tempsqave[row * W + col] = (tempsqave[row * W + col - 1] * len - SQR(src[row * W + col - radx - 1])) / (len - 1); - len --; - } - } - - //vertical blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - AlignedBuffer* pBuf3 = buffer3.acquire(); - T* tempave2 = (T*)pBuf3->data; - - int len = rady + 1; - tempave2[0] = tempave[0 * W + col] / len; - dst[0 * W + col] = tempsqave[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - tempave2[0] += tempave[i * W + col] / len; - dst[0 * W + col] += tempsqave[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - tempave2[row] = (tempave2[(row - 1)] * len + tempave[(row + rady) * W + col]) / (len + 1); - dst[row * W + col] = (dst[(row - 1) * W + col] * len + tempsqave[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - tempave2[row] = tempave2[(row - 1)] + (tempave[(row + rady) * W + col] - tempave[(row - rady - 1) * W + col]) / len; - dst[row * W + col] = dst[(row - 1) * W + col] + (tempsqave[(row + rady) * W + col] - tempsqave[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - tempave2[row] = (tempave2[(row - 1)] * len - tempave[(row - rady - 1) * W + col]) / (len - 1); - dst[row * W + col] = (dst[(row - 1) * W + col] * len - tempsqave[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - - //now finish off - for (int row = 0; row < H; row++) { - dst[row * W + col] = fabs(dst[row * W + col] - SQR(tempave2[row])); - //image_ave += src[row*W+col]; - } - - buffer3.release(pBuf3); - } - - //image_ave /= (W*H); -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -template void boxdev (T* src, T* dst, 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) - - AlignedBuffer* buffer1 = new AlignedBuffer (W * H); - float* temp = buffer1->data; - - AlignedBuffer* buffer2 = new AlignedBuffer (W * H); - float* tempave = buffer2->data; - - if (radx == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = src[row * W + col]; - } - } else { - //horizontal blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - int len = radx + 1; - temp[row * W + 0] = (float)src[row * W + 0] / len; - - for (int j = 1; j <= radx; j++) { - temp[row * W + 0] += (float)src[row * W + j] / len; - } - - for (int col = 1; col <= radx; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len + src[row * W + col + radx]) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - temp[row * W + col] = temp[row * W + col - 1] + ((float)(src[row * W + col + radx] - src[row * W + col - radx - 1])) / len; - } - - for (int col = W - radx; col < W; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len - src[row * W + col - radx - 1]) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - for (int col = 0; col < W; col++) { - tempave[row * W + col] = temp[row * W + col]; - } - } - } else { - //vertical blur -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = rady + 1; - tempave[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - tempave[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - tempave[row * W + col] = (tempave[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - tempave[row * W + col] = tempave[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - tempave[row * W + col] = (tempave[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //box blur absolute deviation - - - if (radx == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = fabs(src[row * W + col] - tempave[row * W + col]); - } - } else { - //horizontal blur -//OpenMP here -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - int len = radx + 1; - temp[row * W + 0] = fabs(src[row * W + 0] - tempave[row * W + 0]) / len; - - for (int j = 1; j <= radx; j++) { - temp[row * W + 0] += fabs(src[row * W + j] - tempave[row * W + j]) / len; - } - - for (int col = 1; col <= radx; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len + fabs(src[row * W + col + radx] - tempave[row * W + col + radx])) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - temp[row * W + col] = temp[row * W + col - 1] + (fabs(src[row * W + col + radx] - tempave[row * W + col + radx]) - \ - fabs(src[row * W + col - radx - 1] - tempave[row * W + col - radx - 1])) / len; - } - - for (int col = W - radx; col < W; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len - fabs(src[row * W + col - radx - 1] - tempave[row * W + col - radx - 1])) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row * W + col] = temp[row * W + col]; - } - } else { - //vertical blur -//OpenMP here -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - - delete buffer1; - delete buffer2; - -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -template void boxsqblur (T* src, A* dst, 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) - - AlignedBuffer* buffer = new AlignedBuffer (W * H); - float* temp = buffer->data; - - if (radx == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - temp[row * W + col] = SQR(src[row * W + col]); - } - } else { - //horizontal blur -//OpenMP here -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) { - int len = radx + 1; - temp[row * W + 0] = SQR((float)src[row * W + 0]) / len; - - for (int j = 1; j <= radx; j++) { - temp[row * W + 0] += SQR((float)src[row * W + j]) / len; - } - - for (int col = 1; col <= radx; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len + SQR(src[row * W + col + radx])) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - temp[row * W + col] = temp[row * W + col - 1] + ((float)(SQR(src[row * W + col + radx]) - SQR(src[row * W + col - radx - 1]))) / len; - } - - for (int col = W - radx; col < W; col++) { - temp[row * W + col] = (temp[row * W + col - 1] * len - SQR(src[row * W + col - radx - 1])) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row * W + col] = temp[row * W + col]; - } - } else { - //vertical blur -//OpenMP here -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - - delete buffer; - -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -template void boxcorrelate (T* src, A* dst, int dx, int dy, 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) - - AlignedBuffer* buffer = new AlignedBuffer (W * H); - float* temp = buffer->data; - - if (radx == 0) { - for (int row = 0; row < H; row++) { - int rr = min(H - 1, max(0, row + dy)); - - for (int col = 0; col < W; col++) { - int cc = min(W - 1, max(0, col + dx)); - temp[row * W + col] = dy > 0 ? (src[row * W + col]) * (src[rr * W + cc]) : 0; - } - } - } else { - //horizontal blur - for (int row = 0; row < H; row++) { - int len = radx + 1; - int rr = min(H - 1, max(0, row + dy)); - int cc = min(W - 1, max(0, 0 + dx)); - temp[row * W + 0] = ((float)src[row * W + 0]) * (src[rr * W + cc]) / len; - - for (int j = 1; j <= radx; j++) { - int cc = min(W - 1, max(0, j + dx)); - temp[row * W + 0] += ((float)src[row * W + j]) * (src[rr * W + cc]) / len; - } - - for (int col = 1; col <= radx; col++) { - int cc = min(W - 1, max(0, col + dx + radx)); - temp[row * W + col] = (temp[row * W + col - 1] * len + (src[row * W + col + radx]) * (src[rr * W + cc])) / (len + 1); - len ++; - } - - for (int col = radx + 1; col < W - radx; col++) { - int cc = min(W - 1, max(0, col + dx + radx)); - int cc1 = min(W - 1, max(0, col + dx - radx - 1)); - temp[row * W + col] = temp[row * W + col - 1] + ((float)((src[row * W + col + radx]) * (src[rr * W + cc]) - - (src[row * W + col - radx - 1]) * (src[rr * W + cc1]))) / len; - } - - for (int col = W - radx; col < W; col++) { - int cc1 = min(W - 1, max(0, col + dx - radx - 1)); - temp[row * W + col] = (temp[row * W + col - 1] * len - (src[row * W + col - radx - 1]) * (src[rr * W + cc1])) / (len - 1); - len --; - } - } - } - - if (rady == 0) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 0; row < H; row++) - for (int col = 0; col < W; col++) { - dst[row * W + col] = temp[row * W + col]; - } - } else { - //vertical blur -//OpenMP here -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int col = 0; col < W; col++) { - int len = rady + 1; - dst[0 * W + col] = temp[0 * W + col] / len; - - for (int i = 1; i <= rady; i++) { - dst[0 * W + col] += temp[i * W + col] / len; - } - - for (int row = 1; row <= rady; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len + temp[(row + rady) * W + col]) / (len + 1); - len ++; - } - - for (int row = rady + 1; row < H - rady; row++) { - dst[row * W + col] = dst[(row - 1) * W + col] + (temp[(row + rady) * W + col] - temp[(row - rady - 1) * W + col]) / len; - } - - for (int row = H - rady; row < H; row++) { - dst[row * W + col] = (dst[(row - 1) * W + col] * len - temp[(row - rady - 1) * W + col]) / (len - 1); - len --; - } - } - } - - delete buffer; - -} - - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -template SSEFUNCTION void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp) +template void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1131,7 +639,5 @@ } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } #endif /* _BOXBLUR_H_ */ diff -Nru rawtherapee-5.3/rtengine/CA_correct_RT.cc rawtherapee-5.4/rtengine/CA_correct_RT.cc --- rawtherapee-5.3/rtengine/CA_correct_RT.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/CA_correct_RT.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,7 @@ // pfMatr - matrix with coefficients // pfVect - vector with free members // pfSolution - vector with system solution -// pfMatr becames trianglular after function call +// pfMatr becomes triangular after function call // pfVect changes after function call // // Developer: Henry Guennadi Levkin @@ -218,18 +218,18 @@ // Main algorithm: Tile loop calculating correction parameters per tile #pragma omp for collapse(2) schedule(dynamic) nowait for (int top = -border ; top < height; top += ts - border2) - for (int left = -border; left < width; left += ts - border2) { + for (int left = -border; left < width - (W & 1); left += ts - border2) { memset(buffer, 0, buffersize); const int vblock = ((top + border) / (ts - border2)) + 1; const int hblock = ((left + border) / (ts - border2)) + 1; const int bottom = min(top + ts, height + border); - const int right = min(left + ts, width + border); + const int right = min(left + ts, width - (W & 1) + border); const int rr1 = bottom - top; const int cc1 = right - left; const int rrmin = top < 0 ? border : 0; const int rrmax = bottom > height ? height - top : rr1; const int ccmin = left < 0 ? border : 0; - const int ccmax = right > width ? width - left : cc1; + const int ccmax = (right > width - (W & 1)) ? width - (W & 1) - left : cc1; // rgb from input CFA data // rgb values should be floating point numbers between 0 and 1 @@ -755,20 +755,20 @@ #pragma omp for schedule(dynamic) collapse(2) nowait for (int top = -border; top < height; top += ts - border2) - for (int left = -border; left < width; left += ts - border2) { + for (int left = -border; left < width - (W & 1); left += ts - border2) { memset(buffer, 0, buffersize); float lblockshifts[2][2]; const int vblock = ((top + border) / (ts - border2)) + 1; const int hblock = ((left + border) / (ts - border2)) + 1; const int bottom = min(top + ts, height + border); - const int right = min(left + ts, width + border); + const int right = min(left + ts, width - (W & 1) + border); const int rr1 = bottom - top; const int cc1 = right - left; const int rrmin = top < 0 ? border : 0; const int rrmax = bottom > height ? height - top : rr1; const int ccmin = left < 0 ? border : 0; - const int ccmax = right > width ? width - left : cc1; + const int ccmax = (right > width - (W & 1)) ? width - (W & 1) - left : cc1; // rgb from input CFA data // rgb values should be floating point number between 0 and 1 @@ -824,7 +824,7 @@ } if (rrmax < rr1) { - for (int rr = 0; rr < border; rr++) + for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) for (int cc = ccmin; cc < ccmax; cc++) { int c = FC(rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][left + cc]) / 65535.f; @@ -845,7 +845,7 @@ if (ccmax < cc1) { for (int rr = rrmin; rr < rrmax; rr++) - for (int cc = 0; cc < border; cc++) { + for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { int c = FC(rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(top + rr)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { @@ -867,8 +867,8 @@ } if (rrmax < rr1 && ccmax < cc1) { - for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; cc++) { + for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) + for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { int c = FC(rr, cc); rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { @@ -879,7 +879,7 @@ if (rrmin > 0 && ccmax < cc1) { for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; cc++) { + for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { int c = FC(rr, cc); rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(border2 - rr)][(width - cc - 2)]) / 65535.f; if ((c & 1) == 0) { @@ -889,7 +889,7 @@ } if (rrmax < rr1 && ccmin > 0) { - for (int rr = 0; rr < border; rr++) + for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) for (int cc = 0; cc < border; cc++) { int c = FC(rr, cc); rgb[c][((rrmax + rr)*ts + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(border2 - cc)]) / 65535.f; @@ -1145,7 +1145,7 @@ STC2VFU(rawData[row][col], LVFU(RawDataTmp[indx])); } #endif - for(; col < width; col += 2, indx++) { + for(; col < width - (W & 1); col += 2, indx++) { rawData[row][col] = RawDataTmp[indx]; } } diff -Nru rawtherapee-5.3/rtengine/camconst.cc rawtherapee-5.4/rtengine/camconst.cc --- rawtherapee-5.3/rtengine/camconst.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/camconst.cc 2018-03-20 11:04:15.000000000 +0000 @@ -184,7 +184,7 @@ js = (cJSON *)cJSON_; CameraConst *cc = new CameraConst; - cc->make_model = Glib::ustring(make_model); + cc->make_model = make_model; ji = cJSON_GetObjectItem(js, "dcraw_matrix"); @@ -739,7 +739,7 @@ key += " "; key += model; key = key.uppercase(); - std::map::iterator it; + std::map::iterator it; it = mCameraConstants.find(key); if (it == mCameraConstants.end()) { diff -Nru rawtherapee-5.3/rtengine/camconst.h rawtherapee-5.4/rtengine/camconst.h --- rawtherapee-5.3/rtengine/camconst.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/camconst.h 2018-03-20 11:04:15.000000000 +0000 @@ -17,7 +17,7 @@ class CameraConst { private: - Glib::ustring make_model; + std::string make_model; short dcraw_matrix[12]; int raw_crop[4]; int raw_mask[8][4]; @@ -48,7 +48,7 @@ class CameraConstantsStore { private: - std::map mCameraConstants; + std::map mCameraConstants; CameraConstantsStore(); bool parse_camera_constants_file(Glib::ustring filename); diff -Nru rawtherapee-5.3/rtengine/camconst.json rawtherapee-5.4/rtengine/camconst.json --- rawtherapee-5.3/rtengine/camconst.json 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/camconst.json 2018-03-20 11:04:15.000000000 +0000 @@ -512,7 +512,7 @@ { // Quality B, some missing scaling factors are safely guessed "make_model": "Canon EOS 6D Mark II", "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 usefull 120,44,6264x4180 + "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 ], "ranges": { @@ -1209,7 +1209,7 @@ "make_model": "FUJIFILM GFX 50S", "dcraw_matrix": [ 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 ], // DNGv9.9 D65 //"dcraw_matrix": [ 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 ], // copy from X-A3 DNGv9.8 D65 - "raw_crop": [ 0, 0, 8280, 6208 ], // full raw 9216X6210 - usefull 8280x6208 + "raw_crop": [ 0, 0, 8280, 6208 ], // full raw 9216X6210 - useful 8280x6208 //"raw_crop": [ 6, 6, 8264, 6200 ], // fuji official JPEG 8256X6192 10,11,9,8 - experimental crop to match with official "ranges": { "white": 16000 } }, @@ -1266,6 +1266,12 @@ }, { // Quality B + "make_model": "FUJIFILM X-E3", + "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG v10 D65 + "ranges": { "white": 16100 } + }, + + { // Quality B "make_model": "FUJIFILM X-PRO1", "dcraw_matrix": [ 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 ], // DNG_v9.4 D65 "ranges": { "white": 4080 } @@ -1996,7 +2002,7 @@ "make_model": [ "RICOH PENTAX K-70", "PENTAX K-70" ], //"dcraw_matrix": [ 8050,-2061,-1264,-4359,12953,1515,-1096,1965,6075 ], // PENTAX DNG D65 "dcraw_matrix": [ 8766,-3149,-747,-3976,11943,2292,-517,1259,5552 ], // Adobe DNGv9.8 D65 - "raw_crop": [ 58, 28, 6022, 4020 ], // full frame 6080x4064, usefull raw frame 56,28,6080,4049, official DNG raw_crop 58,28,6080,4052, official jpeg crop 58+8,28+4 6000x4000 + "raw_crop": [ 58, 28, 6022, 4020 ], // full frame 6080x4064, useful raw frame 56,28,6080,4049, official DNG raw_crop 58,28,6080,4052, official jpeg crop 58+8,28+4 6000x4000 //"raw_crop": [ 62, 28, 6000, 4000 ], // matched to official jpeg crop 58+8,28+4 6000x4000 "ranges": { "white": [ @@ -2015,7 +2021,7 @@ { // Quality B, Intemediate ISO samples missing. Pentax_DNG WLtags are after BL sutraction and not valid "make_model": [ "RICOH PENTAX KP", "PENTAX KP" ], "dcraw_matrix": [ 7357,-2031,-1320,-4842,13555,1349,-1538,2416,5736 ], // Adobe DNGv9.12 D65 - "raw_crop": [ 52, 28, 6032, 4030 ], // full frame 6112x4060, usefull raw frame 52,28,6084,4049, official DNG raw_crop 54,28,6082,4060 + "raw_crop": [ 52, 28, 6032, 4030 ], // full frame 6112x4060, useful raw frame 52,28,6084,4049, official DNG raw_crop 54,28,6082,4060 "ranges": { "white": [ { "iso": 100, "levels": 16300 }, // 16383 @@ -2239,12 +2245,6 @@ "ranges": { "black": 512, "white": 16300 } }, - { // Quality A - "make_model": "Sony ILCE-7M2", - "dcraw_matrix": [ 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 ], // DNGv8.7.1 - "ranges": { "black": 512, "white": 16300 } - }, - { // Quality A, correction for frame width "make_model": "Sony ILCE-7R", "dcraw_matrix": [ 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 ], @@ -2252,6 +2252,12 @@ "ranges": { "black": 512, "white": 16300 } }, + { // Quality A + "make_model": "Sony ILCE-7M2", + "dcraw_matrix": [ 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 ], // DNGv8.7.1 + "ranges": { "black": 512, "white": 16300 } + }, + { // Quality B, correction for frame width, crop modes covered "make_model": [ "Sony ILCE-7RM2", "Sony DSC-RX1RM2" ], "dcraw_matrix": [ 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 ], // DNG_v9.1.1 D65 @@ -2259,6 +2265,35 @@ "ranges": { "black": 512, "white": 16300 } }, + { // 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 } + "ranges": { + "black": 512, + "white": [ + { "iso": [ 50, 64 ], "levels": 16100 }, // typical compressed 16372, non compressed 16383, LongEx iso50,16150 , 16275 + { "iso": [ 80, 100, 125, 160 ], "levels": 16200 }, // typical compressed 16372, non compressed 16383, LongEx iso50,16150 , 16275 + { "iso": [ 200, 250, 320, 400, 500, 640, 800, 1000, 1250 ], "levels": 16200 }, // compressed 16372, non compressed 16383, LongExp 16275 + { "iso": [ 1600, 2000, 2500, 3200, 4000, 5000 ], "levels": 16200 }, // compressed 16372, non compressed 16383, LongExp 16275 + { "iso": [ 6400, 8000, 10000, 12800 ], "levels": 16200 }, // compressed 16372, non compressed 16365-16375-16383, LongExp 16275 + { "iso": [ 16000, 20000, 25600 ], "levels": 16100 }, // 16275-16340-16372, nc 16375-16325-16280, LongExp 16210 + { "iso": [ 32000, 40000, 51200 ], "levels": 16100 }, // 16210-16340-16372, nc 16330, LongExp 16210 + { "iso": [ 64000, 80000, 102400 ], "levels": 16100 }, // g16340 , nc 16330, LongExp 16210 + { "iso": [ 128000, 160000, 204800 ], "levels": 16000 } // r16275, g16340, nc 16330, LongExp 16330-16370 + ] + } + + }, + + { // Quality C, + "make_model": "Sony ILCE-7RM3", + "dcraw_matrix": [ 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 ], // DNG_v10.1 D65 + "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage + "ranges": { "black": 512, "white": 16300 } + }, + { // 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 @@ -2286,7 +2321,7 @@ }, { // Quality C, No proper color data, beta samples, frame set to official jpeg, - "make_model": "XIAOYI M1", + "make_model": [ "XIAOYI M1", "YI TECHNOLOGY M1" ], "dcraw_matrix": [ 7158,-1911,-606,-3603,10669,2530,-659,1236,5530 ], // XIAO YI DNG D65 "raw_crop": [ 4, 3, 5192, 3896 ], // full raw 5200x3902, official jpeg 5184X3888 "ranges": { diff -Nru rawtherapee-5.3/rtengine/ciecam02.cc rawtherapee-5.4/rtengine/ciecam02.cc --- rawtherapee-5.3/rtengine/ciecam02.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ciecam02.cc 2018-03-20 11:04:15.000000000 +0000 @@ -30,7 +30,6 @@ #undef CLIPD #define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0) #define MAXR(a,b) ((a) > (b) ? (a) : (b)) -#define pow_F(a,b) (xexpf(b*xlogf(a))) namespace rtengine { @@ -609,31 +608,31 @@ } void Ciecam02::calculate_abfloat ( float &aa, float &bb, float h, float e, float t, float nbb, float a ) { - float2 sincosval = xsincosf ((h * rtengine::RT_PI) / 180.0f); + float2 sincosval = xsincosf(h * rtengine::RT_PI_F_180); float sinh = sincosval.x; float cosh = sincosval.y; float x = (a / nbb) + 0.305f; - float p3 = 1.05f; - bool swapValues = fabs ( sinh ) > fabs ( cosh ); + constexpr float p3 = 1.05f; + const bool swapValues = fabs(sinh) > fabs(cosh); if (swapValues) { - std::swap (sinh, cosh); + std::swap(sinh, cosh); } float c1 = 1.f; float c2 = sinh / cosh; if (swapValues) { - std::swap (c1, c2); + std::swap(c1, c2); } - float div = ((e / (t * cosh)) - (-0.31362f - (p3 * 0.15681f)) * c1 - ((0.01924f - (p3 * 4.49038f)) * (c2))); + float div = ((e / (t * cosh)) - (-0.31362f - (p3 * 0.15681f)) * c1 - ((0.01924f - (p3 * 4.49038f)) * c2)); // for large values of t the above calculation can change its sign which results in a hue shift of 180 degree // so we have to check the sign to avoid this shift. // Additionally it seems useful to limit the minimum value of div // I limited it, but I'm sure the actual limit is not the best one - if (signf (div) != signf (cosh) || fabsf (div) <= fabsf (cosh) * 2.f) { + if (signf(div) != signf(cosh) || fabsf(div) <= fabsf(cosh) * 2.f) { div = cosh * 2.f; } @@ -641,7 +640,7 @@ bb = (aa * sinh) / cosh; if (swapValues) { - std::swap (aa, bb); + std::swap(aa, bb); } } #ifdef __SSE2__ @@ -780,7 +779,7 @@ void Ciecam02::xyz2jchqms_ciecam02 ( double &J, double &C, double &h, double &Q, double &M, double &s, double &aw, double &fl, double &wh, double x, double y, double z, double xw, double yw, double zw, - double yb, double la, double f, double c, double nc, double pilotd, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d) + double c, double nc, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d) { double r, g, b; double rw, gw, bw; @@ -1008,9 +1007,18 @@ bp = MAXR (bp, 0.0f); } - rpa = nonlinear_adaptationfloat ( rp, fl ); - gpa = nonlinear_adaptationfloat ( gp, fl ); - bpa = nonlinear_adaptationfloat ( bp, fl ); +#ifdef __SSE2__ + vfloat pv = _mm_setr_ps(rp, gp, bp, 1.f); + vfloat fv = F2V(fl); + vfloat outv = nonlinear_adaptationfloat(pv, fv); + rpa = outv[0]; + gpa = outv[1]; + bpa = outv[2]; +#else + rpa = nonlinear_adaptationfloat(rp, fl); + gpa = nonlinear_adaptationfloat(gp, fl); + bpa = nonlinear_adaptationfloat(bp, fl); +#endif ca = rpa - ((12.0f * gpa) - bpa) / 11.0f; cb = (0.11111111f) * (rpa + gpa - (2.0f * bpa)); @@ -1040,8 +1048,8 @@ void Ciecam02::jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, double C, double h, - double xw, double yw, double zw, double yb, double la, - double f, double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw ) + double xw, double yw, double zw, + double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw ) { double r, g, b; double rc, gc, bc; @@ -1075,7 +1083,7 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float f, float c, float nc, int gamu, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw) + float c, float nc, int gamu, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw) { float r, g, b; float rc, gc, bc; @@ -1085,32 +1093,49 @@ float a, ca, cb; float e, t; gamu = 1; - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, gamu ); - e = ((961.53846f) * nc * ncb) * (xcosf ( ((h * rtengine::RT_PI) / 180.0f) + 2.0f ) + 3.8f); - a = pow_F ( J / 100.0f, 1.0f / (c * cz) ) * aw; - t = pow_F ( 10.f * C / (sqrtf ( J ) * pow1), 1.1111111f ); - - calculate_abfloat ( ca, cb, h, e, t, nbb, a ); - Aab_to_rgbfloat ( rpa, gpa, bpa, a, ca, cb, nbb ); - - rp = inverse_nonlinear_adaptationfloat ( rpa, fl ); - gp = inverse_nonlinear_adaptationfloat ( gpa, fl ); - bp = inverse_nonlinear_adaptationfloat ( bpa, fl ); + xyz_to_cat02float(rw, gw, bw, xw, yw, zw, gamu); + e = ((961.53846f) * nc * ncb) * (xcosf(h * rtengine::RT_PI_F_180 + 2.0f) + 3.8f); - hpe_to_xyzfloat ( x, y, z, rp, gp, bp ); - xyz_to_cat02float ( rc, gc, bc, x, y, z, gamu ); +#ifdef __SSE2__ + vfloat powinv1 = _mm_setr_ps(J / 100.0f, 10.f * C / (sqrtf(J) * pow1), 1.f, 1.f); + vfloat powinv2 = _mm_setr_ps(1.0f / (c * cz), 1.1111111f, 1.f, 1.f); + vfloat powoutv = pow_F(powinv1, powinv2); + a = powoutv[0] * aw; + t = powoutv[1]; +#else + a = pow_F(J / 100.0f, 1.0f / (c * cz)) * aw; + t = pow_F(10.f * C / (sqrtf(J) * pow1), 1.1111111f); +#endif + + calculate_abfloat(ca, cb, h, e, t, nbb, a); + Aab_to_rgbfloat(rpa, gpa, bpa, a, ca, cb, nbb); + +#ifdef __SSE2__ + vfloat pav = _mm_setr_ps(rpa, gpa, bpa, 1.f); + vfloat fv = F2V(fl); + vfloat outv = inverse_nonlinear_adaptationfloat(pav, fv); + rp = outv[0]; + gp = outv[1]; + bp = outv[2]; +#else + rp = inverse_nonlinear_adaptationfloat(rpa, fl); + gp = inverse_nonlinear_adaptationfloat(gpa, fl); + bp = inverse_nonlinear_adaptationfloat(bpa, fl); +#endif + hpe_to_xyzfloat(x, y, z, rp, gp, bp); + xyz_to_cat02float(rc, gc, bc, x, y, z, gamu); r = rc / (((yw * d) / rw) + (1.0f - d)); g = gc / (((yw * d) / gw) + (1.0f - d)); b = bc / (((yw * d) / bw) + (1.0f - d)); - cat02_to_xyzfloat ( x, y, z, r, g, b, gamu ); + cat02_to_xyzfloat(x, y, z, r, g, b, gamu); } #ifdef __SSE2__ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat f, vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz) + vfloat nc, vfloat pow1, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz) { vfloat r, g, b; vfloat rc, gc, bc; diff -Nru rawtherapee-5.3/rtengine/ciecam02.h rawtherapee-5.4/rtengine/ciecam02.h --- rawtherapee-5.3/rtengine/ciecam02.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ciecam02.h 2018-03-20 11:04:15.000000000 +0000 @@ -82,19 +82,18 @@ static void jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, double C, double h, double xw, double yw, double zw, - double yb, double la, - double f, double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw); + double c, double nc, int gamu, double n, double nbb, double ncb, double fl, double cz, double d, double aw); static void jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float f, float c, float nc, int gamu, float n, float nbb, float ncb, float fl, float cz, float d, float aw ); + float c, float nc, int gamu, float n, float nbb, float ncb, float fl, float cz, float d, float aw ); #ifdef __SSE2__ static void jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J, vfloat C, vfloat h, vfloat xw, vfloat yw, vfloat zw, - vfloat f, vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz ); + vfloat nc, vfloat n, vfloat nbb, vfloat ncb, vfloat fl, vfloat d, vfloat aw, vfloat reccmcz ); #endif /** * Forward transform from XYZ to CIECAM02 JCh. @@ -115,8 +114,7 @@ double &Q, double &M, double &s, double &aw, double &fl, double &wh, double x, double y, double z, double xw, double yw, double zw, - double yb, double la, - double f, double c, double nc, double pilotd, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d ); + double c, double nc, int gamu, double n, double nbb, double ncb, double pfl, double cz, double d ); static void xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, float fl, diff -Nru rawtherapee-5.3/rtengine/cJSON.c rawtherapee-5.4/rtengine/cJSON.c --- rawtherapee-5.3/rtengine/cJSON.c 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/cJSON.c 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,8 @@ static int cJSON_strcasecmp(const char *s1,const char *s2) { - if (!s1) return (s1==s2)?0:1;if (!s2) return 1; + if (!s1) return (s1==s2)?0:1; + if (!s2) return 1; for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0; return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); } @@ -107,7 +108,7 @@ } n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ - + item->valuedouble=n; item->valueint=(int)n; item->type=cJSON_Number; @@ -156,12 +157,12 @@ { const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; if (*str!='\"') {ep=str;return 0;} /* not a string! */ - + while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ - + out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ if (!out) return 0; - + ptr=str+1;ptr2=out; while (*ptr!='\"' && *ptr) { @@ -190,13 +191,22 @@ } len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; - + +#if defined( __GNUC__ ) && __GNUC__ >= 7// silence warning +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif + switch (len) { case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 1: *--ptr2 =(uc | firstByteMark[len]); } + +#if defined( __GNUC__ ) && __GNUC__ >= 7 +#pragma GCC diagnostic pop +#endif ptr2+=len; break; default: *ptr2++=*ptr; break; @@ -215,10 +225,10 @@ static char *print_string_ptr(const char *str) { const char *ptr;char *ptr2,*out;int len=0;unsigned char token; - + if (!str) return cJSON_strdup(""); ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} - + out=(char*)cJSON_malloc(len+3); if (!out) return 0; @@ -351,7 +361,7 @@ char *out=0,*ptr,*ret;int len=5; cJSON *child=item->child; int numentries=0,i=0,fail=0; - + /* How many entries in the array? */ while (child) numentries++,child=child->next; /* Explicitly handle numentries==0 */ @@ -374,7 +384,7 @@ if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; child=child->next; } - + /* If we didn't fail, try to malloc the output string */ if (!fail) out=(char*)cJSON_malloc(len); /* If that fails, we fail. */ @@ -387,7 +397,7 @@ cJSON_free(entries); return 0; } - + /* Compose the output array. */ *out='['; ptr=out+1;*ptr=0; @@ -399,7 +409,7 @@ } cJSON_free(entries); *ptr++=']';*ptr++=0; - return out; + return out; } /* Build an object from the text. */ @@ -407,11 +417,11 @@ { cJSON *child; if (*value!='{') {ep=value;return 0;} /* not an object! */ - + item->type=cJSON_Object; value=skip(value+1); if (*value=='}') return value+1; /* empty array. */ - + item->child=child=cJSON_New_Item(); if (!item->child) return 0; value=skip(parse_string(child,skip(value))); @@ -420,7 +430,7 @@ if (*value!=':') {ep=value;return 0;} /* fail! */ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; - + while (*value==',') { cJSON *new_item; @@ -433,7 +443,7 @@ value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ if (!value) return 0; } - + if (*value=='}') return value+1; /* end of array */ ep=value;return 0; /* malformed. */ } @@ -474,7 +484,7 @@ if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; child=child->next; } - + /* Try to allocate the output string */ if (!fail) out=(char*)cJSON_malloc(len); if (!out) fail=1; @@ -486,7 +496,7 @@ cJSON_free(names);cJSON_free(entries); return 0; } - + /* Compose the output: */ *out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0; for (i=0;ichild;while (c && which>0) c=c->next,which--;if (!c) return 0; - if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} +cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) { + cJSON *c=array->child; + while (c && which>0) c=c->next,which--; + if (!c) return 0; + if (c->prev) c->prev->next=c->next; + if (c->next) c->next->prev=c->prev; + if (c==array->child) array->child=c->next;c->prev=c->next=0; + return c; +} void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} @@ -593,4 +611,4 @@ else *into++=*json++; // All other characters. } *into=0; // and null-terminate. -} \ No newline at end of file +} diff -Nru rawtherapee-5.3/rtengine/cJSON.h rawtherapee-5.4/rtengine/cJSON.h --- rawtherapee-5.3/rtengine/cJSON.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/cJSON.h 2018-03-20 11:04:15.000000000 +0000 @@ -104,7 +104,7 @@ extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); -/* Remove/Detatch items from Arrays/Objects. */ +/* Remove/Detach items from Arrays/Objects. */ extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which); extern void cJSON_DeleteItemFromArray(cJSON *array, int which); extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string); diff -Nru rawtherapee-5.3/rtengine/clutstore.cc rawtherapee-5.4/rtengine/clutstore.cc --- rawtherapee-5.3/rtengine/clutstore.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/clutstore.cc 2018-03-20 11:04:15.000000000 +0000 @@ -52,7 +52,7 @@ rtengine::procparams::ColorManagementParams icm; icm.working = working_color_space; - img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), icm, rtengine::procparams::RAWParams()); + img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), rtengine::procparams::RAWParams()); if (!working_color_space.empty()) { img_src.convertColorSpace(img_float.get(), icm, curr_wb); diff -Nru rawtherapee-5.3/rtengine/CMakeLists.txt rawtherapee-5.4/rtengine/CMakeLists.txt --- rawtherapee-5.3/rtengine/CMakeLists.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/CMakeLists.txt 2018-03-20 11:04:15.000000000 +0000 @@ -72,6 +72,7 @@ imageio.cc improccoordinator.cc improcfun.cc + impulse_denoise.cc init.cc iplab2rgb.cc ipresize.cc @@ -105,6 +106,7 @@ rawimage.cc rawimagesource.cc refreshmap.cc + rt_algo.cc rtthumbnail.cc shmap.cc simpleprocess.cc @@ -112,12 +114,18 @@ stdimagesource.cc utils.cc rtlensfun.cc + tmo_fattal02.cc + iplocalcontrast.cc + histmatching.cc ) if(LENSFUN_HAS_LOAD_DIRECTORY) set_source_files_properties(rtlensfun.cc PROPERTIES COMPILE_DEFINITIONS RT_LENSFUN_HAS_LOAD_DIRECTORY) endif() +if(WITH_BENCHMARK) + add_definitions(-DBENCHMARK) +endif() if(NOT WITH_SYSTEM_KLT) set(RTENGINESOURCEFILES ${RTENGINESOURCEFILES} diff -Nru rawtherapee-5.3/rtengine/color.cc rawtherapee-5.4/rtengine/color.cc --- rawtherapee-5.3/rtengine/color.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/color.cc 2018-03-20 11:04:15.000000000 +0000 @@ -25,8 +25,6 @@ #include "opthelper.h" #include "iccstore.h" -#define pow_F(a,b) (xexpf(b*xlogf(a))) - using namespace std; namespace rtengine @@ -36,6 +34,7 @@ cmsToneCurve* Color::linearGammaTRC; LUTf Color::cachef; +LUTf Color::cachefy; LUTf Color::gamma2curve; LUTf Color::gammatab; @@ -57,21 +56,6 @@ LUTf Color::gammatab_145_3; LUTf Color::igammatab_145_3; -// Wikipedia sRGB: Unlike most other RGB color spaces, the sRGB gamma cannot be expressed as a single numerical value. -// The overall gamma is approximately 2.2, consisting of a linear (gamma 1.0) section near black, and a non-linear section elsewhere involving a 2.4 exponent -// and a gamma (slope of log output versus log input) changing from 1.0 through about 2.3. -const double Color::sRGBGamma = 2.2; -const double Color::sRGBGammaCurve = 2.4; - -const double Color::eps_max = 580.40756; //(MAXVALF* 216.0f/24389.0); -const double Color::eps = 216.0f / 24389.0; //0.008856 -const double Color::kappa = 24389.0 / 27.0; //903.29630; - -const float Color::D50x = 0.9642f; //0.96422; -const float Color::D50z = 0.8249f; //0.82521; -const double Color::u0 = 4.0 * D50x / (D50x + 15 + 3 * D50z); -const double Color::v0 = 9.0 / (D50x + 15 + 3 * D50z); -const double Color::epskap = 8.0; /* * Munsell Lch correction * Copyright (c) 2011 Jacques Desmis @@ -139,6 +123,7 @@ constexpr auto maxindex = 65536; cachef(maxindex, LUT_CLIP_BELOW); + cachefy(maxindex, LUT_CLIP_BELOW); gammatab(maxindex, 0); gammatabThumb(maxindex, 0); @@ -184,6 +169,23 @@ #pragma omp section #endif { + int i = 0; + int epsmaxint = eps_max; + + for (; i <= epsmaxint; i++) + { + cachefy[i] = 327.68 * (kappa * i / MAXVALF); + } + + for(; i < maxindex; i++) + { + cachefy[i] = 327.68 * (116.0 * std::cbrt((double)i / MAXVALF) - 16.0); + } + } +#ifdef _OPENMP + #pragma omp section +#endif + { for (int i = 0; i < maxindex; i++) { gammatab_srgb[i] = gammatab_srgb1[i] = gamma2(i / 65535.0); @@ -362,150 +364,141 @@ } } -void Color::rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace) -{ - double xyz_rgb[3][3]; - const double ep = 216.0 / 24389.0; - const double ka = 24389.0 / 27.0; - - double var_R = r / 65535.0; - double var_G = g / 65535.0; - double var_B = b / 65535.0; - - Glib::ustring profileCalc; - profileCalc = "sRGB"; //default +void Color::rgb2lab01 (const Glib::ustring &profile, const Glib::ustring &profileW, float r, float g, float b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace) +{ // do not use this function in a loop. It really eats processing time caused by Glib::ustring comparisons - if (workingSpace) { - profileCalc = profileW; //display working - } - - else {// if you want display = output space - if (profile == "RT_sRGB" || profile == "RT_sRGB_gBT709" || profile == "RT_sRGB_g10") { - profileCalc = "sRGB"; - } + Glib::ustring profileCalc = "sRGB"; //default - if (profile == "ProPhoto" || profile == "RT_Large_gBT709" || profile == "RT_Large_g10" || profile == "RT_Large_gsRGB") { - profileCalc = "ProPhoto"; - } - - if (profile == "AdobeRGB1998" || profile == "RT_Medium_gsRGB") { - profileCalc = "Adobe RGB"; - } - - if (profile == "WideGamutRGB") { - profileCalc = "WideGamut"; - } - } - - if (workingSpace) {//display working + if (workingSpace) {//display working profile + profileCalc = profileW; if (profileW == "sRGB") { //apply sRGB inverse gamma - if ( var_R > 0.04045 ) { - var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (r > 0.04045f) { + r = pow_F(((r + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_R = var_R / 12.92; + r /= 12.92f; } - if ( var_G > 0.04045 ) { - var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (g > 0.04045f) { + g = pow_F(((g + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_G = var_G / 12.92; + g /= 12.92f; } - if ( var_B > 0.04045 ) { - var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (b > 0.04045f) { + b = pow_F(((b + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_B = var_B / 12.92; + b /= 12.92f; } } else if (profileW == "ProPhoto") { // apply inverse gamma 1.8 - var_R = pow ( var_R, 1.8); - var_G = pow ( var_G, 1.8); - var_B = pow ( var_B, 1.8); + r = pow_F(r, 1.8f); + g = pow_F(g, 1.8f); + b = pow_F(b, 1.8f); + } else if (profile == "Rec2020") { + if (r > 0.0795f) { + r = pow_F(((r + 0.0954f) / 1.0954f), 2.2f); + } else { + r /= 4.5f; + } + + if (g > 0.0795f) { + g = pow_F(((g + 0.0954f) / 1.0954f), 2.2f); + } else { + g /= 4.5f; + } + + if (b > 0.0795f) { + b = pow_F(((b + 0.0954f) / 1.0954f), 2.2f); + } else { + b /= 4.5f; + } } else { // apply inverse gamma 2.2 - var_R = pow ( var_R, 2.2); - var_G = pow ( var_G, 2.2); - var_B = pow ( var_B, 2.2); + r = pow_F(r, 2.2f); + g = pow_F(g, 2.2f); + b = pow_F(b, 2.2f); + } + } else { //display output profile + if (profile == "RT_sRGB" || profile == "RT_sRGB_gBT709" || profile == "RT_sRGB_g10") { + // use default "sRGB" + } else if (profile == "ProPhoto" || profile == "RT_Large_gBT709" || profile == "RT_Large_g10" || profile == "RT_Large_gsRGB") { + profileCalc = "ProPhoto"; + } else if (profile == "AdobeRGB1998" || profile == "RT_Medium_gsRGB") { + profileCalc = "Adobe RGB"; + } else if (profile == "WideGamutRGB") { + profileCalc = "WideGamut"; } - } else { //display outout profile if (profile == "RT_sRGB" || profile == "RT_Large_gsRGB" || profile == "RT_Medium_gsRGB") { //apply sRGB inverse gamma - if ( var_R > 0.04045 ) { - var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (r > 0.04045f) { + r = pow_F(((r + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_R = var_R / 12.92; + r /= 12.92f; } - if ( var_G > 0.04045 ) { - var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (g > 0.04045f) { + g = pow_F(((g + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_G = var_G / 12.92; + g /= 12.92f; } - if ( var_B > 0.04045 ) { - var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); + if (b > 0.04045f) { + b = pow_F(((b + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_B = var_B / 12.92; + b /= 12.92f; } - } - - else if (profile == "RT_sRGB_gBT709" || profile == "RT_Large_gBT709") { // - if ( var_R > 0.0795 ) { - var_R = pow ( ( ( var_R + 0.0954 ) / 1.0954 ), 2.2); + } else if (profile == "RT_sRGB_gBT709" || profile == "RT_Large_gBT709" || profile == "Rec2020") { + if (r > 0.0795f) { + r = pow_F(((r + 0.0954f) / 1.0954f), 2.2f); } else { - var_R = var_R / 4.5; + r /= 4.5f; } - if ( var_G > 0.0795 ) { - var_G = pow ( ( ( var_G + 0.0954 ) / 1.0954 ), 2.2); + if (g > 0.0795f) { + g = pow_F(((g + 0.0954f) / 1.0954f), 2.2f); } else { - var_G = var_G / 4.5; + g /= 4.5f; } - if ( var_B > 0.0795 ) { - var_B = pow ( ( ( var_B + 0.0954 ) / 1.0954 ), 2.2); + if (b > 0.0795f) { + b = pow_F(((b + 0.0954f) / 1.0954f), 2.2f); } else { - var_B = var_B / 4.5; + b /= 4.5f; } } else if (profile == "ProPhoto") { // apply inverse gamma 1.8 - var_R = pow ( var_R, 1.8); - var_G = pow ( var_G, 1.8); - var_B = pow ( var_B, 1.8); - } else if (profile == "RT_sRGB_g10" || profile == "RT_Large_g10") { // apply inverse gamma 1.8 + r = pow_F(r, 1.8f); + g = pow_F(g, 1.8f); + b = pow_F(b, 1.8f); + } else if (profile == "RT_sRGB_g10" || profile == "RT_Large_g10") { + // gamma 1.0, do nothing - var_R = pow ( var_R, 1.); - var_G = pow ( var_G, 1.); - var_B = pow ( var_B, 1.); - } + } else {// apply inverse gamma 2.2 - else {// apply inverse gamma 2.2 - var_R = pow ( var_R, 2.2); - var_G = pow ( var_G, 2.2); - var_B = pow ( var_B, 2.2); + r = pow_F(r, 2.2f); + g = pow_F(g, 2.2f); + b = pow_F(b, 2.2f); } } - // TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileW); + const TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix(profileCalc); - TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileCalc); + const float xyz_rgb[3][3] = { {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; - for (int m = 0; m < 3; m++) - for (int n = 0; n < 3; n++) { - xyz_rgb[m][n] = wprof[m][n]; - } + const float var_X = (xyz_rgb[0][0] * r + xyz_rgb[0][1] * g + xyz_rgb[0][2] * b) / Color::D50x; + const float var_Y = (xyz_rgb[1][0] * r + xyz_rgb[1][1] * g + xyz_rgb[1][2] * b); + const float var_Z = (xyz_rgb[2][0] * r + xyz_rgb[2][1] * g + xyz_rgb[2][2] * b) / Color::D50z; - double varxx, varyy, varzz; - double var_X = ( xyz_rgb[0][0] * var_R + xyz_rgb[0][1] * var_G + xyz_rgb[0][2] * var_B ) / Color::D50x; - double var_Y = ( xyz_rgb[1][0] * var_R + xyz_rgb[1][1] * var_G + xyz_rgb[1][2] * var_B ) ; - double var_Z = ( xyz_rgb[2][0] * var_R + xyz_rgb[2][1] * var_G + xyz_rgb[2][2] * var_B ) / Color::D50z; + const float varxx = var_X > epsf ? xcbrtf(var_X) : (kappaf * var_X + 16.f) / 116.f ; + const float varyy = var_Y > epsf ? xcbrtf(var_Y) : (kappaf * var_Y + 16.f) / 116.f ; + const float varzz = var_Z > epsf ? xcbrtf(var_Z) : (kappaf * var_Z + 16.f) / 116.f ; - varxx = var_X > ep ? cbrt(var_X) : ( ka * var_X + 16.0) / 116.0 ; - varyy = var_Y > ep ? cbrt(var_Y) : ( ka * var_Y + 16.0) / 116.0 ; - varzz = var_Z > ep ? cbrt(var_Z) : ( ka * var_Z + 16.0) / 116.0 ; - LAB_l = ( 116 * varyy ) - 16; - LAB_a = 500 * ( varxx - varyy ); - LAB_b = 200 * ( varyy - varzz ); + LAB_l = var_Y > epsf ? (xcbrtf(var_Y) * 116.f) - 16.f : kappaf * var_Y; + LAB_a = 500.f * (varxx - varyy); + LAB_b = 200.f * (varyy - varzz); } @@ -555,44 +548,6 @@ } } -void Color::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; - - l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f) - - if (fabsf(C) < 0.65535f) { // 0.00001f * 65535.f - h = 0.f; - s = 0.f; - } else { - - if (l <= 0.5f) { - s = (M - m) / (M + m); - } else { - s = (M - m) / (131070.f - M - m); // 131070.f = 2.f * 65535.f - } - - if ( r == M ) { - h = (g - b); - } else if ( g == M ) { - h = (2.f * C) + (b - r); - } else { - h = (4.f * C) + (r - g); - } - - h /= (6.f * C); - - if ( h < 0.f ) { - h += 1.f; - } else if ( h > 1.f ) { - h -= 1.f; - } - } -} - #ifdef __SSE2__ void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l) { @@ -611,9 +566,8 @@ h /= (F2V(6.f) * C); vfloat onev = F2V(1.f); h = vself(vmaskf_lt(h, ZEROV), h + onev, h); - h = vself(vmaskf_gt(h, onev), h - onev, h); - vmask zeromask = vmaskf_lt(vabsf(C), F2V(0.65535f)); + vmask zeromask = vmaskf_lt(C, F2V(0.65535f)); h = vself(zeromask, ZEROV, h); s = vself(zeromask, ZEROV, s); } @@ -699,28 +653,6 @@ } } -void Color::hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b) -{ - - if (s == 0.f) { - r = g = b = 65535.f * l; // achromatic - } else { - float m2; - - if (l <= 0.5f) { - m2 = l * (1.f + s); - } else { - m2 = l + s - l * s; - } - - float m1 = 2.f * l - m2; - - r = 65535.f * hue2rgbfloat (m1, m2, h * 6.f + 2.f); - g = 65535.f * hue2rgbfloat (m1, m2, h * 6.f); - b = 65535.f * hue2rgbfloat (m1, m2, h * 6.f - 2.f); - } -} - #ifdef __SSE2__ void Color::hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b) { @@ -809,6 +741,36 @@ } } +void Color::rgb2hsv01(float r, float g, float b, float &h, float &s, float &v) +{ + + const float minVal = min(r, g, b); + v = max(r, g, b); + const float delta = v - minVal; + + h = 0.f; + + if (delta < 0.00001f) { + s = 0.f; + } else { + s = delta / (v == 0.f ? 1.f : v); + + if (r == v) { + h = (g - b) / delta; + } else if (g == v) { + h = 2.f + (b - r) / delta; + } else if (b == v) { + h = 4.f + (r - g) / delta; + } + + h /= 6.f; + + if (h < 0.f) { + h += 1.f; + } + } +} + void Color::hsv2rgb (float h, float s, float v, float &r, float &g, float &b) { @@ -1526,9 +1488,9 @@ void Color::interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom, - bool chr, bool lum, float chromat, float luma, const float r1, const float g1, const float b1, + float chromat, float luma, const float r1, const float g1, const float b1, const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, - int toDo, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo) + const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo) { float X1, Y1, Z1, X2, Y2, Z2, X, Y, Z, XL, YL, ZL; float L1 = 0.f, L2, LL, a_1 = 0.f, b_1 = 0.f, a_2 = 0.f, b_2 = 0.f, a_L, b_L; @@ -1620,7 +1582,7 @@ Color::xyz2rgb(X, Y, Z, ro, go, bo, rgb_xyz);// ro go bo in gamut } -void Color::calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma) +void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma) { //from Dcraw (D.Coffin) int i; @@ -1746,7 +1708,7 @@ float LL = L / 327.68f; float aa = a / 327.68f; float bb = b / 327.68f; - float fy = (0.00862069f * LL) + 0.137932f; // (L+16)/116 + float fy = (c1By116 * LL) + c16By116; // (L+16)/116 float fx = (0.002f * aa) + fy; float fz = fy - (0.005f * bb); x = 65535.0f * f2xyz(fx) * D50x; @@ -1757,7 +1719,7 @@ void Color::L2XYZ(float L, float &x, float &y, float &z) // for black & white { float LL = L / 327.68f; - float fy = (0.00862069f * LL) + 0.137932f; // (L+16)/116 + float fy = (c1By116 * LL) + c16By116; // (L+16)/116 float fxz = 65535.f * f2xyz(fy); x = fxz * D50x; z = fxz * D50z; @@ -1772,7 +1734,7 @@ L /= c327d68; a /= c327d68; b /= c327d68; - vfloat fy = F2V(0.00862069f) * L + F2V(0.137932f); + vfloat fy = F2V(c1By116) * L + F2V(c16By116); vfloat fx = F2V(0.002f) * a + fy; vfloat fz = fy - (F2V(0.005f) * b); vfloat c65535 = F2V(65535.f); @@ -1785,6 +1747,69 @@ } #endif // __SSE2__ +void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width) +{ + +#ifdef __SSE2__ + vfloat maxvalfv = F2V(MAXVALF); + vfloat c500v = F2V(500.f); + vfloat c200v = F2V(200.f); +#endif + int i = 0; +#ifdef __SSE2__ + 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 xv = F2V(wp[0][0]) * rv + F2V(wp[0][1]) * gv + F2V(wp[0][2]) * bv; + const vfloat yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv; + const vfloat zv = F2V(wp[2][0]) * rv + F2V(wp[2][1]) * gv + F2V(wp[2][2]) * bv; + + vmask maxMask = vmaskf_gt(vmaxf(xv, vmaxf(yv, zv)), maxvalfv); + if (_mm_movemask_ps((vfloat)maxMask)) { + // 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 x = xv[k]; + float y = yv[k]; + float z = zv[k]; + float fx = (x <= 65535.f ? cachef[x] : (327.68f * xcbrtf(x / MAXVALF))); + float fy = (y <= 65535.f ? cachef[y] : (327.68f * xcbrtf(y / MAXVALF))); + float fz = (z <= 65535.f ? cachef[z] : (327.68f * xcbrtf(z / MAXVALF))); + + L[i + k] = (y <= 65535.0f ? cachefy[y] : 327.68f * (116.f * xcbrtf(y / MAXVALF) - 16.f)); + a[i + k] = (500.f * (fx - fy) ); + b[i + k] = (200.f * (fy - fz) ); + } + } else { + const vfloat fx = cachef[xv]; + const vfloat fy = cachef[yv]; + const vfloat fz = cachef[zv]; + + STVFU(L[i], cachefy[yv]); + STVFU(a[i], c500v * (fx - fy)); + STVFU(b[i], c200v * (fy - fz)); + } + } +#endif + for(;i < width; ++i) { + const float rv = R[i]; + const float gv = G[i]; + const float bv = B[i]; + float x = wp[0][0] * rv + wp[0][1] * gv + wp[0][2] * bv; + float y = wp[1][0] * rv + wp[1][1] * gv + wp[1][2] * bv; + float z = wp[2][0] * rv + wp[2][1] * gv + wp[2][2] * bv; + float fx, fy, fz; + + fx = (x <= 65535.0f ? cachef[x] : (327.68f * xcbrtf(x / MAXVALF))); + fy = (y <= 65535.0f ? cachef[y] : (327.68f * xcbrtf(y / MAXVALF))); + fz = (z <= 65535.0f ? cachef[z] : (327.68f * xcbrtf(z / MAXVALF))); + + L[i] = (y <= 65535.0f ? cachefy[y] : 327.68f * (116.f * xcbrtf(y / MAXVALF) - 16.f)); + a[i] = 500.0f * (fx - fy); + b[i] = 200.0f * (fy - fz); + } +} + void Color::XYZ2Lab(float X, float Y, float Z, float &L, float &a, float &b) { @@ -1797,14 +1822,14 @@ fy = (y <= 65535.0f ? cachef[y] : (327.68f * xcbrtf(y / MAXVALF))); fz = (z <= 65535.0f ? cachef[z] : (327.68f * xcbrtf(z / MAXVALF))); - L = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; + L = (y <= 65535.0f ? cachefy[y] : 327.68f * (116.f * xcbrtf(y / MAXVALF) - 16.f)); a = (500.0f * (fx - fy) ); b = (200.0f * (fy - fz) ); } void Color::Lab2Yuv(float L, float a, float b, float &Y, float &u, float &v) { - float fy = (0.00862069 * L / 327.68) + 0.137932; // (L+16)/116 + float fy = (c1By116 * L / 327.68) + c16By116; // (L+16)/116 float fx = (0.002 * a / 327.68) + fy; float fz = fy - (0.005 * b / 327.68); float LL = L / 327.68; @@ -1833,7 +1858,7 @@ float fy = (Y <= 65535.0 ? cachef[Y] : (327.68 * std::cbrt(Y / MAXVALF))); float fz = (Z <= 65535.0 ? cachef[Z] : (327.68 * std::cbrt(Z / MAXVALF))); - L = (116.0 * fy - 5242.88); //5242.88=16.0*327.68; + L = (Y <= 65535.0f ? cachefy[Y] : 327.68f * (116.f * xcbrtf(Y / MAXVALF) - 16.f)); a = (500.0 * (fx - fy) ); b = (200.0 * (fy - fz) ); } @@ -2302,7 +2327,7 @@ float bprov1 = Chprov1 * sincosval.x; //conversion Lab RGB to limit Lab values - this conversion is useful before Munsell correction - float fy = (0.00862069f * Lprov1 ) + 0.137932f; + float fy = (c1By116 * Lprov1 ) + c16By116; float fx = (0.002f * aprov1) + fy; float fz = fy - (0.005f * bprov1); @@ -2422,7 +2447,7 @@ float bprov1 = Chprov1 * sincosval.x; //conversion Lab RGB to limit Lab values - this conversion is useful before Munsell correction - float fy = (0.00862069f * Lprov1 ) + 0.137932f; + float fy = (c1By116 * Lprov1 ) + c16By116; float fx = (0.002f * aprov1) + fy; float fz = fy - (0.005f * bprov1); @@ -2531,7 +2556,7 @@ float bprov1 = Chprov1 * sincosval.x; //conversion Lab RGB to limit Lab values - this conversion is useful before Munsell correction - float fy = (0.00862069f * Lprov1 ) + 0.137932f; + float fy = (c1By116 * Lprov1 ) + c16By116; float fx = (0.002f * aprov1) + fy; float fz = fy - (0.005f * bprov1); @@ -2604,7 +2629,7 @@ * const double wip[3][3]: matrix for working profile * bool multiThread : parallelize the loop */ -SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3], bool multiThread ) +void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3]) { #ifdef _DEBUG MyTime t1e, t2e; diff -Nru rawtherapee-5.3/rtengine/color.h rawtherapee-5.4/rtengine/color.h --- rawtherapee-5.3/rtengine/color.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/color.h 2018-03-20 11:04:15.000000000 +0000 @@ -120,15 +120,36 @@ ID_DOWN /// Interpolate color by decreasing the hue value, crossing the lower limit } eInterpolationDirection; - const static double sRGBGamma; // standard average gamma - const static double sRGBGammaCurve; // 2.4 in the curve - const static double eps, eps_max, kappa, epskap; - const static float D50x, D50z; - const static double u0, v0; + // Wikipedia sRGB: Unlike most other RGB color spaces, the sRGB gamma cannot be expressed as a single numerical value. + // The overall gamma is approximately 2.2, consisting of a linear (gamma 1.0) section near black, and a non-linear section elsewhere involving a 2.4 exponent + // and a gamma (slope of log output versus log input) changing from 1.0 through about 2.3. + constexpr static double sRGBGamma = 2.2; + constexpr static double sRGBGammaCurve = 2.4; + + constexpr static double eps = 216.0 / 24389.0; //0.008856 + constexpr static double eps_max = MAXVALF * eps; //580.40756; + constexpr static double kappa = 24389.0 / 27.0; //903.29630; + constexpr static double kappaInv = 27.0 / 24389.0; + constexpr static double epsilonExpInv3 = 6.0 / 29.0; + + constexpr static float epsf = eps; + constexpr static float kappaf = kappa; + constexpr static float kappaInvf = kappaInv; + constexpr static float epsilonExpInv3f = epsilonExpInv3; + + constexpr static float D50x = 0.9642f; //0.96422; + constexpr static float D50z = 0.8249f; //0.82521; + constexpr static double u0 = 4.0 * D50x / (D50x + 15 + 3 * D50z); + constexpr static double v0 = 9.0 / (D50x + 15 + 3 * D50z); + constexpr static double epskap = 8.0; + + constexpr static float c1By116 = 1.0 / 116.0; + constexpr static float c16By116 = 16.0 / 116.0; static cmsToneCurve* linearGammaTRC; static LUTf cachef; + static LUTf cachefy; static LUTf gamma2curve; // look-up tables for the standard srgb gamma and its inverse (filled by init()) @@ -184,16 +205,16 @@ * @brief Convert red/green/blue to hue/saturation/luminance * @param profile output profile name * @param profileW working profile name - * @param r red channel [0 ; 65535] - * @param g green channel [0 ; 65535] - * @param b blue channel [0 ; 65535] + * @param r red channel [0 ; 1] + * @param g green channel [0 ; 1] + * @param b blue channel [0 ; 1] * @param L Lab L channel [0 ; 1] (return value) - * @param a Lab a channel [0 ; 1] (return value) + * @param a Lab a channel [0 ; 1] (return value) * @param b Lab b channel [0; 1] (return value) * @param workingSpace true: compute the Lab value using the Working color space ; false: use the Output color space */ - static void rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace); - + // do not use this function in a loop. It really eats processing time caused by Glib::ustring comparisons + static void rgb2lab01 (const Glib::ustring &profile, const Glib::ustring &profileW, float r, float g, float b, float &LAB_l, float &LAB_a, float &LAB_b, bool workingSpace); /** * @brief Convert red/green/blue to hue/saturation/luminance @@ -205,7 +226,64 @@ * @param l luminance channel [0; 1] (return value) */ static void rgb2hsl (float r, float g, float b, float &h, float &s, float &l); - static void rgb2hslfloat (float r, float g, float b, float &h, float &s, float &l); + + 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; + + l = (M + m) * 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); + } else { + s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f + } + } + } + + 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; + + l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f) + + if (C < 0.65535f) { // 0.00001f * 65535.f + h = 0.f; + s = 0.f; + } else { + + if (l <= 0.5f) { + s = C / (M + m); + } else { + s = C / (131070.f - (M + m)); // 131070.f = 2.f * 65535.f + } + + if ( r == M ) { + h = (g - b); + } else if ( g == M ) { + h = (2.f * C) + (b - r); + } else { + h = (4.f * C) + (r - g); + } + + h /= (6.f * C); + + if ( h < 0.f ) { + h += 1.f; + } + } + } + #ifdef __SSE2__ static void rgb2hsl (vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l); #endif @@ -220,7 +298,29 @@ * @param b blue channel [0 ; 65535] (return value) */ static void hsl2rgb (float h, float s, float l, float &r, float &g, float &b); - static void hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b); + + static inline void hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b) + { + + if (s == 0.f) { + r = g = b = 65535.f * l; // achromatic + } else { + float m2; + + if (l <= 0.5f) { + m2 = l * (1.f + s); + } else { + m2 = l + s - l * s; + } + + float m1 = 2.f * l - m2; + + r = 65535.f * hue2rgbfloat (m1, m2, h * 6.f + 2.f); + g = 65535.f * hue2rgbfloat (m1, m2, h * 6.f); + b = 65535.f * hue2rgbfloat (m1, m2, h * 6.f - 2.f); + } + } + #ifdef __SSE2__ static void hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b); #endif @@ -248,17 +348,24 @@ */ static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v); + /** + * @brief Convert red green blue to hue saturation value + * @param r red channel [0 ; 1] + * @param g green channel [0 ; 1] + * @param b blue channel [0 ; 1] + * @param h hue channel [0 ; 1] (return value) + * @param s saturation channel [0 ; 1] (return value) + * @param v value channel [0 ; 1] (return value) + */ + static void rgb2hsv01 (float r, float g, float b, float &h, float &s, float &v); + static inline float rgb2s(float r, float g, float b) // fast version if only saturation is needed { float var_Min = min(r, g, b); float var_Max = max(r, g, b); float del_Max = var_Max - var_Min; - if (del_Max < 0.00001f) { - return 0.f; - } else { - return del_Max / var_Max; - } + return del_Max / (var_Max == 0.f ? 1.f : var_Max); } static inline bool rgb2hsvdcp(float r, float g, float b, float &h, float &s, float &v) @@ -298,6 +405,30 @@ } } + static inline void rgb2hsvtc(float r, float g, float b, float &h, float &s, float &v) + { + const float var_Min = min(r, g, b); + const float var_Max = max(r, g, b); + const float del_Max = var_Max - var_Min; + + v = var_Max / 65535.f; + + if (del_Max < 0.00001f) { + h = 0.f; + s = 0.f; + } else { + s = del_Max / var_Max; + + if (r == var_Max) { + h = (g < b ? 6.f : 0.f) + (g - b) / del_Max; + } else if (g == var_Max) { + h = 2.f + (b - r) / del_Max; + } else { /*if ( b == var_Max ) */ + h = 4.f + (r - g) / del_Max; + } + } + } + /** * @brief Convert hue saturation value in red green blue * @param h hue channel [0 ; 1] @@ -312,14 +443,14 @@ static inline void hsv2rgbdcp (float h, float s, float v, float &r, float &g, float &b) { // special version for dcp which saves 1 division (in caller) and six multiplications (inside this function) - int sector = h; // sector 0 to 5, floor() is very slow, and h is always >0 - float f = h - sector; // fractional part of h + const int sector = h; // sector 0 to 5, floor() is very slow, and h is always > 0 + const float f = h - sector; // fractional part of h v *= 65535.f; - float vs = v * s; - float p = v - vs; - float q = v - f * vs; - float t = p + v - q; + const float vs = v * s; + const float p = v - vs; + const float q = v - f * vs; + const float t = p + v - q; switch (sector) { case 1: @@ -475,7 +606,7 @@ * @param b channel [-42000 ; +42000] ; can be more than 42000 (return value) */ static void XYZ2Lab(float x, float y, float z, float &L, float &a, float &b); - + static void RGB2Lab(float *X, float *Y, float *Z, float *L, float *a, float *b, const float wp[3][3], int width); /** * @brief Convert Lab in Yuv @@ -576,27 +707,21 @@ */ static inline double f2xyz(double f) { - const double epsilonExpInv3 = 6.0 / 29.0; - const double kappaInv = 27.0 / 24389.0; // inverse of kappa - return (f > epsilonExpInv3) ? f * f * f : (116. * f - 16.) * kappaInv; } static inline float f2xyz(float f) { - const float epsilonExpInv3 = 0.20689655f; // 6.0f/29.0f; - const float kappaInv = 0.0011070565f; // 27.0f/24389.0f; // inverse of kappa - - return (f > epsilonExpInv3) ? f * f * f : (116.f * f - 16.f) * kappaInv; + return (f > epsilonExpInv3f) ? f * f * f : (116.f * f - 16.f) * kappaInvf; } #ifdef __SSE2__ static inline vfloat f2xyz(vfloat f) { - const vfloat epsilonExpInv3 = F2V(0.20689655f); // 6.0f/29.0f; - const vfloat kappaInv = F2V(0.0011070565f); // 27.0f/24389.0f; // inverse of kappa + const vfloat epsilonExpInv3v = F2V(epsilonExpInv3f); + const vfloat kappaInvv = F2V(kappaInvf); vfloat res1 = f * f * f; - vfloat res2 = (F2V(116.f) * f - F2V(16.f)) * kappaInv; - return vself(vmaskf_gt(f, epsilonExpInv3), res1, res2); + vfloat res2 = (F2V(116.f) * f - F2V(16.f)) * kappaInvv; + return vself(vmaskf_gt(f, epsilonExpInv3v), res1, res2); } #endif @@ -733,7 +858,7 @@ * @param go green channel of output color [0 ; 65535] (return value) * @param bo blue channel of output color [0 ; 65535] (return value) */ - static void interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom, bool chr, bool lum, float chromat, float luma, const float r1, const float g1, const float b1, const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, int channels, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo); + static void interpolateRGBColor (float realL, float iplow, float iphigh, int algm, const float balance, int twoc, int metchrom, float chromat, float luma, const float r1, const float g1, const float b1, const float xl, const float yl, const float zl, const float x2, const float y2, const float z2, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float &ro, float &go, float &bo); /** @@ -898,7 +1023,7 @@ * gamma4 used in ip2Lab2rgb [0 ; 1], usually near 0.03(return value) * gamma5 used in ip2Lab2rgb [0 ; 1], usually near 0.5 (return value) */ - static void calcGamma (double pwr, double ts, int mode, int imax, GammaValues &gamma); + static void calcGamma (double pwr, double ts, int mode, GammaValues &gamma); /** @@ -1247,7 +1372,7 @@ * @param CC chroma before [0 ; 180] * @param corectionHuechroma hue correction depending on chromaticity (saturation), in radians [0 ; 0.45] (return value) * @param correctlum hue correction depending on luminance (brightness, contrast,...), in radians [0 ; 0.45] (return value) - * @param munsDbgInfo (Debug target only) object to collect informations + * @param munsDbgInfo (Debug target only) object to collect information */ #ifdef _DEBUG @@ -1310,7 +1435,7 @@ * @param wip matrix for working profile * @param multiThread whether to parallelize the loop or not */ - static void LabGamutMunsell (float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3], bool multiThread ); + static void LabGamutMunsell (float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3]); /* @@ -1647,7 +1772,7 @@ //hr=translate Hue Lab value (-Pi +Pi) in approximative hr (hsv values) (0 1) [red 1/6 yellow 1/6 green 1/6 cyan 1/6 blue 1/6 magenta 1/6 ] // with multi linear correspondances (I expect there is no error !!) double hr = 0.0; - //allways put h between 0 and 1 + //always put h between 0 and 1 if (HH >= 0.f && HH < 0.6f ) { hr = 0.11666 * double(HH) + 0.93; //hr 0.93 1.00 full red diff -Nru rawtherapee-5.3/rtengine/colortemp.cc rawtherapee-5.4/rtengine/colortemp.cc --- rawtherapee-5.3/rtengine/colortemp.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/colortemp.cc 2018-03-20 11:04:15.000000000 +0000 @@ -24,11 +24,6 @@ #include "sleef.c" #include "settings.h" -#undef CLIPD -#define CLIPD(a) ((a)>0.0?((a)<1.0?(a):1.0):0.0) -#define CLIPQQ(a) ((a)>0?((a)<250?(a):250):0) -#define MAXR(a,b) ((a) > (b) ? (a) : (b)) - namespace rtengine { @@ -70,48 +65,22 @@ {0.000001251141, 0.00000045181, 0.000000} }; -ColorTemp::ColorTemp (double t, double g, double e, const Glib::ustring &m) : temp(t), green(g), equal(e), method(m) +ColorTemp::ColorTemp (double t, double g, double e, const std::string &m) : temp(t), green(g), equal(e), method(m) { - clip (temp, green, equal); } void ColorTemp::clip (double &temp, double &green) { - - if (temp < MINTEMP) { - temp = MINTEMP; - } else if (temp > MAXTEMP) { - temp = MAXTEMP; - } - - if (green < MINGREEN) { - green = MINGREEN; - } else if (green > MAXGREEN) { - green = MAXGREEN; - } + temp = rtengine::LIM(temp, MINTEMP, MAXTEMP); + green = rtengine::LIM(green, MINGREEN, MAXGREEN); } void ColorTemp::clip (double &temp, double &green, double &equal) { - - if (temp < MINTEMP) { - temp = MINTEMP; - } else if (temp > MAXTEMP) { - temp = MAXTEMP; - } - - if (green < MINGREEN) { - green = MINGREEN; - } else if (green > MAXGREEN) { - green = MAXGREEN; - } - - if(equal < MINEQUAL) { - equal = MINEQUAL; - } else if(equal > MAXEQUAL) { - equal = MAXEQUAL; - } + temp = rtengine::LIM(temp, MINTEMP, MAXTEMP); + green = rtengine::LIM(green, MINGREEN, MAXGREEN); + equal = rtengine::LIM(equal, MINEQUAL, MAXEQUAL); } ColorTemp::ColorTemp (double mulr, double mulg, double mulb, double e) : equal(e), method("Custom") @@ -122,7 +91,7 @@ void ColorTemp::mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const { - double maxtemp = double(MAXTEMP), mintemp = double(MINTEMP); + double maxtemp = MAXTEMP, mintemp = MINTEMP; double tmpr, tmpg, tmpb; temp = (maxtemp + mintemp) / 2; @@ -354,6 +323,37 @@ 55.72, 51.97, 54.72, 57.46, 58.89, 60.33 }; +const std::map ColorTemp::spectMap = { + {"Daylight", Daylight5300_spect}, + {"Cloudy", Cloudy6200_spect}, + {"Shade", Shade7600_spect}, + {"Tungsten", A2856_spect}, + {"Fluo F1", FluoF1_spect}, + {"Fluo F2", FluoF2_spect}, + {"Fluo F3", FluoF3_spect}, + {"Fluo F4", FluoF4_spect}, + {"Fluo F5", FluoF5_spect}, + {"Fluo F6", FluoF6_spect}, + {"Fluo F7", FluoF7_spect}, + {"Fluo F8", FluoF8_spect}, + {"Fluo F9", FluoF9_spect}, + {"Fluo F10", FluoF10_spect}, + {"Fluo F11", FluoF11_spect}, + {"Fluo F12", FluoF12_spect}, + {"HMI Lamp", HMI_spect}, + {"GTI Lamp", GTI_spect}, + {"JudgeIII Lamp", JudgeIII_spect}, + {"Solux Lamp 3500K", Solux3500_spect}, + {"Solux Lamp 4100K", Solux4100_spect}, + {"Solux Lamp 4700K", Solux4700_spect}, + {"NG Solux Lamp 4700K", NG_Solux4700_spect}, + {"LED LSI Lumelex 2040", NG_LEDLSI2040_spect}, + {"LED CRS SP12 WWMR16", NG_CRSSP12WWMR16_spect}, + {"Flash 5500K", Flash5500_spect}, + {"Flash 6000K", Flash6000_spect}, + {"Flash 6500K", Flash6500_spect} + }; + // Data for Color ==> CRI (Color Rendering Index and Palette // actually 20 color that must be good enough for CRI @@ -844,10 +844,7 @@ * Gunter Wyszecki and W. S. Stiles, John Wiley & Sons, 1982, pp. 227, 228. */ //adaptation to RT by J.Desmis -#include -/* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */ -#define LERP(a,b,c) (((b) - (a)) * (c) + (a)) int ColorTemp::XYZtoCorColorTemp(double x0, double y0, double z0, double &temp) const { @@ -922,13 +919,13 @@ } if (i == 31) { - return(-1); /* bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue */ + return -1; /* bad XYZ input, color temp would be less than minimum of 1666.7 degrees, or too far towards blue */ } di = di / sqrt(1.0 + uvt[i ].t * uvt[i ].t); dm = dm / sqrt(1.0 + uvt[i - 1].t * uvt[i - 1].t); p = dm / (dm - di); /* p = interpolation parameter, 0.0 : i-1, 1.0 : i */ - p = 1.0 / (LERP(rt[i - 1], rt[i], p)); + p = 1.0 / rtengine::intp(p, rt[i], rt[i - 1]); temp = p; return 0; /* success */ } @@ -970,12 +967,12 @@ double D = adap; //white destination Wd : RT use always D50 - cam_dest[0] = CAT02[0][0] * whiteD50p[0] + CAT02[0][1] * whiteD50p[1] + CAT02[0][2] * whiteD50p[2]; //Cone reponse RoD + cam_dest[0] = CAT02[0][0] * whiteD50p[0] + CAT02[0][1] * whiteD50p[1] + CAT02[0][2] * whiteD50p[2]; //Cone response RoD cam_dest[1] = CAT02[1][0] * whiteD50p[0] + CAT02[1][1] * whiteD50p[1] + CAT02[1][2] * whiteD50p[2]; //GaD cam_dest[2] = CAT02[2][0] * whiteD50p[0] + CAT02[2][1] * whiteD50p[1] + CAT02[2][2] * whiteD50p[2]; //BeD //origin white Ws : A, D65, custom, etc. - cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone reponse RoS + cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone response RoS cam_orig[1] = CAT02[1][0] * Xw + CAT02[1][1] * Yw + CAT02[1][2] * Zw; cam_orig[2] = CAT02[2][0] * Xw + CAT02[2][1] * Yw + CAT02[2][2] * Zw; @@ -1025,192 +1022,15 @@ } -void ColorTemp::temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz) +void ColorTemp::temp2mulxyz (double temp, const std::string &method, double &Xxyz, double &Zxyz) { - double xD, yD, x_D, y_D, interm; double x, y, z; - if (method == "Daylight" ) { - spectrum_to_xyz_preset(Daylight5300_spect, x, y, z); - } else if(method == "Cloudy" ) { - spectrum_to_xyz_preset(Cloudy6200_spect, x, y, z); - } else if(method == "Shade" ) { - spectrum_to_xyz_preset(Shade7600_spect, x, y, z); - } else if(method == "Tungsten" ) { - spectrum_to_xyz_preset(A2856_spect, x, y, z); - } else if(method == "Fluo F1" ) { - spectrum_to_xyz_preset(FluoF1_spect, x, y, z); - } else if(method == "Fluo F2" ) { - spectrum_to_xyz_preset(FluoF2_spect, x, y, z); - } else if(method == "Fluo F3" ) { - spectrum_to_xyz_preset(FluoF3_spect, x, y, z); - } else if(method == "Fluo F4" ) { - spectrum_to_xyz_preset(FluoF4_spect, x, y, z); - } else if(method == "Fluo F5" ) { - spectrum_to_xyz_preset(FluoF5_spect, x, y, z); - } else if(method == "Fluo F6" ) { - spectrum_to_xyz_preset(FluoF6_spect, x, y, z); - } else if(method == "Fluo F7" ) { - spectrum_to_xyz_preset(FluoF7_spect, x, y, z); - } else if(method == "Fluo F8" ) { - spectrum_to_xyz_preset(FluoF8_spect, x, y, z); - } else if(method == "Fluo F9" ) { - spectrum_to_xyz_preset(FluoF9_spect, x, y, z); - } else if(method == "Fluo F10" ) { - spectrum_to_xyz_preset(FluoF10_spect, x, y, z); - } else if(method == "Fluo F11" ) { - spectrum_to_xyz_preset(FluoF11_spect, x, y, z); - } else if(method == "Fluo F12" ) { - spectrum_to_xyz_preset(FluoF12_spect, x, y, z); - } else if(method == "HMI Lamp" ) { - spectrum_to_xyz_preset(HMI_spect, x, y, z); - } else if(method == "GTI Lamp" ) { - spectrum_to_xyz_preset(GTI_spect, x, y, z); - } else if(method == "JudgeIII Lamp" ) { - spectrum_to_xyz_preset(JudgeIII_spect, x, y, z); - } else if(method == "Solux Lamp 3500K" ) { - spectrum_to_xyz_preset(Solux3500_spect, x, y, z); - } else if(method == "Solux Lamp 4100K" ) { - spectrum_to_xyz_preset(Solux4100_spect, x, y, z); - } else if(method == "Solux Lamp 4700K" ) { - spectrum_to_xyz_preset(Solux4700_spect, x, y, z); - } else if(method == "NG Solux Lamp 4700K" ) { - spectrum_to_xyz_preset(NG_Solux4700_spect, x, y, z); - } else if(method == "LED LSI Lumelex 2040") { - spectrum_to_xyz_preset(NG_LEDLSI2040_spect, x, y, z); - } else if(method == "LED CRS SP12 WWMR16" ) { - spectrum_to_xyz_preset(NG_CRSSP12WWMR16_spect, x, y, z); - } else if(method == "Flash 5500K" ) { - spectrum_to_xyz_preset(Flash5500_spect, x, y, z); - } else if(method == "Flash 6000K" ) { - spectrum_to_xyz_preset(Flash6000_spect, x, y, z); - } else if(method == "Flash 6500K" ) { - spectrum_to_xyz_preset(Flash6500_spect, x, y, z); - } else { - // otherwise we use the Temp+Green generic solution - if (tem <= INITIALBLACKBODY) { - // if temperature is between 2000K and 4000K we use blackbody, because there will be no Daylight reference below 4000K... - // of course, the previous version of RT used the "magical" but wrong formula of U.Fuchs (Ufraw). - spectrum_to_xyz_blackbody(tem, x, y, z); - } else { - // from 4000K up to 25000K: using the D illuminant (daylight) which is standard - double m1, m2; - - if (tem <= 7000) { - x_D = -4.6070e9 / (tem * tem * tem) + 2.9678e6 / (tem * tem) + 0.09911e3 / tem + 0.244063; - } else if (tem <= 25000) { - x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040; - } else /*if (tem > 25000)*/ { - x_D = -2.0064e9 / (tem * tem * tem) + 1.9018e6 / (tem * tem) + 0.24748e3 / tem + 0.237040 - ((tem - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !) - } - - y_D = -3.0 * x_D * x_D + 2.87 * x_D - 0.275; - //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D - //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) - interm = (0.0241 + 0.2562 * x_D - 0.734 * y_D); - m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm; - m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm; - spectrum_to_xyz_daylight(m1, m2, x, y, z); - xD = x; - yD = y; - } - - } - - xD = x; - yD = y; - - double X = xD / yD; - double Z = (1.0 - xD - yD) / yD; - Xxyz = X; - Zxyz = Z; - //printf("Xxyz=%f Zxyz=%f\n",Xxyz,Zxyz); -} - -void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const -{ - - clip (temp, green, equal); - - //printf("temp=%d green=%.3f equal=%.3f\n", (int)temp, (float) green, (float) equal); - - //variables for CRI and display Lab, and palette - double xD, yD, x_D, y_D, interm; - double m1, m2; - - double x, y, z; - 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]; - - double XchkLamp[50], YchkLamp[50], ZchkLamp[50]; - double Xcam02Lamp[50], Ycam02Lamp[50], Zcam02Lamp[50]; - const double epsilon = 0.008856; //Lab - 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 xr[50], yr[50], zr[50]; - double fx[50], fy[50], fz[50]; - -// bool palette = false; - // double tempalet; // correlated temperature - // We first test for specially handled methods - if (method == "Daylight" ) { - spectrum_to_xyz_preset(Daylight5300_spect, x, y, z); - } else if(method == "Cloudy" ) { - spectrum_to_xyz_preset(Cloudy6200_spect, x, y, z); - } else if(method == "Shade" ) { - spectrum_to_xyz_preset(Shade7600_spect, x, y, z); - } else if(method == "Tungsten" ) { - spectrum_to_xyz_preset(A2856_spect, x, y, z); - } else if(method == "Fluo F1" ) { - spectrum_to_xyz_preset(FluoF1_spect, x, y, z); - } else if(method == "Fluo F2" ) { - spectrum_to_xyz_preset(FluoF2_spect, x, y, z); - } else if(method == "Fluo F3" ) { - spectrum_to_xyz_preset(FluoF3_spect, x, y, z); - } else if(method == "Fluo F4" ) { - spectrum_to_xyz_preset(FluoF4_spect, x, y, z); - } else if(method == "Fluo F5" ) { - spectrum_to_xyz_preset(FluoF5_spect, x, y, z); - } else if(method == "Fluo F6" ) { - spectrum_to_xyz_preset(FluoF6_spect, x, y, z); - } else if(method == "Fluo F7" ) { - spectrum_to_xyz_preset(FluoF7_spect, x, y, z); - } else if(method == "Fluo F8" ) { - spectrum_to_xyz_preset(FluoF8_spect, x, y, z); - } else if(method == "Fluo F9" ) { - spectrum_to_xyz_preset(FluoF9_spect, x, y, z); - } else if(method == "Fluo F10" ) { - spectrum_to_xyz_preset(FluoF10_spect, x, y, z); - } else if(method == "Fluo F11" ) { - spectrum_to_xyz_preset(FluoF11_spect, x, y, z); - } else if(method == "Fluo F12" ) { - spectrum_to_xyz_preset(FluoF12_spect, x, y, z); - } else if(method == "HMI Lamp" ) { - spectrum_to_xyz_preset(HMI_spect, x, y, z); - } else if(method == "GTI Lamp" ) { - spectrum_to_xyz_preset(GTI_spect, x, y, z); - } else if(method == "JudgeIII Lamp" ) { - spectrum_to_xyz_preset(JudgeIII_spect, x, y, z); - } else if(method == "Solux Lamp 3500K" ) { - spectrum_to_xyz_preset(Solux3500_spect, x, y, z); - } else if(method == "Solux Lamp 4100K" ) { - spectrum_to_xyz_preset(Solux4100_spect, x, y, z); - } else if(method == "Solux Lamp 4700K" ) { - spectrum_to_xyz_preset(Solux4700_spect, x, y, z); - } else if(method == "NG Solux Lamp 4700K" ) { - spectrum_to_xyz_preset(NG_Solux4700_spect, x, y, z); - } else if(method == "LED LSI Lumelex 2040") { - spectrum_to_xyz_preset(NG_LEDLSI2040_spect, x, y, z); - } else if(method == "LED CRS SP12 WWMR16" ) { - spectrum_to_xyz_preset(NG_CRSSP12WWMR16_spect, x, y, z); - } else if(method == "Flash 5500K" ) { - spectrum_to_xyz_preset(Flash5500_spect, x, y, z); - } else if(method == "Flash 6000K" ) { - spectrum_to_xyz_preset(Flash6000_spect, x, y, z); - } else if(method == "Flash 6500K" ) { - spectrum_to_xyz_preset(Flash6500_spect, x, y, z); + const auto iterator = spectMap.find(method); + + if (iterator != spectMap.end()) { + spectrum_to_xyz_preset(iterator->second, x, y, z); } else { // otherwise we use the Temp+Green generic solution if (temp <= INITIALBLACKBODY) { @@ -1219,48 +1039,42 @@ spectrum_to_xyz_blackbody(temp, x, y, z); } else { // from 4000K up to 25000K: using the D illuminant (daylight) which is standard + double x_D, y_D; if (temp <= 7000) { x_D = -4.6070e9 / (temp * temp * temp) + 2.9678e6 / (temp * temp) + 0.09911e3 / temp + 0.244063; } else if (temp <= 25000) { x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040; - } else /*if (temp > 25000)*/ { // above 25000 it's unknown..then I have modified to adjust for underwater - x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040 - ((temp - 25000) / 25000) * 0.025; //Jacques empirical adjustemnt for very high temp (underwater !) + } else /*if (temp > 25000)*/ { + x_D = -2.0064e9 / (temp * temp * temp) + 1.9018e6 / (temp * temp) + 0.24748e3 / temp + 0.237040 - ((temp - 25000) / 25000) * 0.025; //Jacques empirical adjustment for very high temp (underwater !) } - y_D = (-3.0 * x_D * x_D + 2.87 * x_D - 0.275); //modify blue / red action + y_D = -3.0 * x_D * x_D + 2.87 * x_D - 0.275; //modify blue / red action //calculate D -daylight in function of s0, s1, s2 and temp ==> x_D y_D //S(lamda)=So(lambda)+m1*s1(lambda)+m2*s2(lambda) - interm = (0.0241 + 0.2562 * x_D - 0.734 * y_D); - m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm; - m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm; + double interm = 0.0241 + 0.2562 * x_D - 0.734 * y_D; + double m1 = (-1.3515 - 1.7703 * x_D + 5.9114 * y_D) / interm; + double m2 = (0.03 - 31.4424 * x_D + 30.0717 * y_D) / interm; spectrum_to_xyz_daylight(m1, m2, x, y, z); - xD = x; - yD = y; } } - xD = x; - yD = y; + Xxyz = x / y; + Zxyz = (1.0 - x - y) / y; +} + +void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const +{ + clip(temp, green, equal); + double Xwb, Zwb; + temp2mulxyz(temp, method, Xwb, Zwb); + float adj = 1.f; if(equal < 0.9999 || equal > 1.0001 ) { adj = (100.f + ( 1000.f - (1000.f * (float)equal) ) / 20.f) / 100.f; } - //printf("adj=%f\n",adj); - double Xwb = xD / yD; - double Ywb = 1.0; - double Zwb = (1.0 - xD - yD) / yD; - - if (settings->verbose) { - // double u=4*xD/(-2*xD+12*yD+3); - // double v=6*yD/(-2*xD+12*yD+3); - // printf("xD=%f yD=%f u=%f v=%f\n",xD,yD,u,v); - if(settings->CRI_color != 0) { - printf("xD=%f yD=%f === Xwb=%f Ywb=%f Zwb=%f\n", xD, yD, Xwb, Ywb, Zwb); - } - } /*if (isRaw) { rmul = sRGB_xyz[0][0]*X + sRGB_xyz[0][1]*Y + sRGB_xyz[0][2]*Z; @@ -1268,36 +1082,41 @@ bmul = sRGB_xyz[2][0]*X + sRGB_xyz[2][1]*Y + sRGB_xyz[2][2]*Z; } else {*/ //recalculate channels multipliers with new values of XYZ tue to whitebalance - rmul = sRGBd65_xyz[0][0] * Xwb * adj + sRGBd65_xyz[0][1] * Ywb + sRGBd65_xyz[0][2] * Zwb / adj; // Jacques' empirical modification 5/2013 - gmul = sRGBd65_xyz[1][0] * Xwb + sRGBd65_xyz[1][1] * Ywb + sRGBd65_xyz[1][2] * Zwb; - bmul = sRGBd65_xyz[2][0] * Xwb * adj + sRGBd65_xyz[2][1] * Ywb + sRGBd65_xyz[2][2] * Zwb / adj; + rmul = sRGBd65_xyz[0][0] * Xwb * adj + sRGBd65_xyz[0][1] + sRGBd65_xyz[0][2] * Zwb / adj; // Jacques' empirical modification 5/2013 + gmul = sRGBd65_xyz[1][0] * Xwb + sRGBd65_xyz[1][1] + sRGBd65_xyz[1][2] * Zwb; + bmul = sRGBd65_xyz[2][0] * Xwb * adj + sRGBd65_xyz[2][1] + sRGBd65_xyz[2][2] * Zwb / adj; //}; gmul /= green; //printf("rmul=%f gmul=%f bmul=%f\n",rmul, gmul, bmul); - double max = rmul; - - if (gmul > max) { - max = gmul; - } - - if (bmul > max) { - max = bmul; - } + double max = rtengine::max(rmul, gmul, bmul); rmul /= max; gmul /= max; bmul /= max; - // begin CRI_RT : color rendering index RT - adaptation of CRI by J.Desmis - // CRI = 100 for Blackbody and Daylight - // calculate from spectral data values X, Y, Z , for color of colorchecker24 , SG, DC, JDC_468 - //only for lamp different of tungstene - //first calcul with illuminant (choice) - // and calcul with : blackbody at equivalent temp of lamp - if(settings->CRI_color != 0) //activate if CRi_color !=0 + if(settings->CRI_color != 0) { //activate if CRi_color !=0 + // begin CRI_RT : color rendering index RT - adaptation of CRI by J.Desmis + // CRI = 100 for Blackbody and Daylight + // calculate from spectral data values X, Y, Z , for color of colorchecker24 , SG, DC, JDC_468 + // only for lamp different of tungstene + // first calcul with illuminant (choice) + // and calcul with : blackbody at equivalent temp of lamp // CRI_color-1 = dispaly 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]; + + double XchkLamp[50], YchkLamp[50], ZchkLamp[50]; + double Xcam02Lamp[50], Ycam02Lamp[50], Zcam02Lamp[50]; + 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; @@ -1451,7 +1270,7 @@ } if (settings->verbose) { - double correl_temp; + double correl_temp = 0.0; XYZtoCorColorTemp(Xwb, Ywb, Zwb, correl_temp); printf("Correlated temperature (lamp)=%i\n", (int) correl_temp); //use only for lamp...otherwise It give an information!! } @@ -1554,7 +1373,7 @@ bbb[i] = 200.*(fy[i] - fz[i]); } - //display value to verify calculs + //display value to verify calculus if(settings->CRI_color != 0) { printf("Color Number %i\n", numero_color); printf("L_refer=%2.2f a=%2.2f b=%2.2f\n", Lbb[numero_color], abb[numero_color], bbb[numero_color]); diff -Nru rawtherapee-5.3/rtengine/colortemp.h rawtherapee-5.4/rtengine/colortemp.h --- rawtherapee-5.3/rtengine/colortemp.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/colortemp.h 2018-03-20 11:04:15.000000000 +0000 @@ -19,22 +19,20 @@ #ifndef _COLORTEMP_ #define _COLORTEMP_ -#include #include - -#define pow_F(a,b) (xexpf(b*xlogf(a))) +#include +#include namespace rtengine { -#define MINTEMP 1500 -#define MAXTEMP 60000 -#define MINGREEN 0.02 -#define MAXGREEN 10.0 -#define MINEQUAL 0.8 -#define MAXEQUAL 1.5 - -#define INITIALBLACKBODY 4000 +constexpr double MINTEMP = 1500.0; +constexpr double MAXTEMP = 60000.0; +constexpr double MINGREEN = 0.02; +constexpr double MAXGREEN = 10.0; +constexpr double MINEQUAL = 0.8; +constexpr double MAXEQUAL = 1.5; +constexpr double INITIALBLACKBODY = 4000.0; class ColorTemp @@ -49,12 +47,12 @@ static void clip (double &temp, double &green, double &equal); int XYZtoCorColorTemp(double x0, double y0 , double z0, double &temp) const; void temp2mul (double temp, double green, double equal, double& rmul, double& gmul, double& bmul) const; - + const static std::map spectMap; public: ColorTemp () : temp(-1.), green(-1.), equal (1.), method("Custom") {} explicit ColorTemp (double e) : temp(-1.), green(-1.), equal (e), method("Custom") {} - ColorTemp (double t, double g, double e, const Glib::ustring &m); + ColorTemp (double t, double g, double e, const std::string &m); ColorTemp (double mulr, double mulg, double mulb, double e); void update (const double rmul, const double gmul, const double bmul, const double equal, const double tempBias=0.0) @@ -95,7 +93,7 @@ } void mul2temp (const double rmul, const double gmul, const double bmul, const double equal, double& temp, double& green) const; - static void temp2mulxyz (double tem, double gree, const std::string &method, double &Xxyz, double &Zxyz); + static void temp2mulxyz (double tem, const std::string &method, double &Xxyz, double &Zxyz); static void cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, double &CAM02BB01, double &CAM02BB02, double &CAM02BB10, double &CAM02BB11, double &CAM02BB12, double &CAM02BB20, double &CAM02BB21, double &CAM02BB22, double adap ); //static void CAT02 (Imagefloat* baseImg, const ProcParams* params); diff -Nru rawtherapee-5.3/rtengine/cplx_wavelet_level.h rawtherapee-5.4/rtengine/cplx_wavelet_level.h --- rawtherapee-5.3/rtengine/cplx_wavelet_level.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/cplx_wavelet_level.h 2018-03-20 11:04:15.000000000 +0000 @@ -244,7 +244,7 @@ * Applies a Haar filter * */ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(numThreads) if(numThreads>1) #endif @@ -266,11 +266,11 @@ * Applies a Haar filter * */ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for nowait #endif @@ -281,7 +281,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -328,7 +328,7 @@ } #ifdef __SSE2__ -template SSEFUNCTION void wavelet_level::AnalysisFilterSubsampVertical (T * RESTRICT srcbuffer, T * RESTRICT dstLo, T * RESTRICT dstHi, float (* RESTRICT filterLo)[4], float (* RESTRICT filterHi)[4], +template void wavelet_level::AnalysisFilterSubsampVertical (T * RESTRICT srcbuffer, T * RESTRICT dstLo, T * RESTRICT dstHi, float (* RESTRICT filterLo)[4], float (* RESTRICT filterHi)[4], const int taps, const int offset, const int width, const int height, const int row) { @@ -455,7 +455,7 @@ // calculate coefficients int shift = skip * (taps - offset - 1); //align filter with data -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(numThreads) if(numThreads>1) #endif @@ -506,7 +506,7 @@ } #ifdef __SSE2__ -template SSEFUNCTION void wavelet_level::SynthesisFilterSubsampVertical (T * RESTRICT srcLo, T * RESTRICT srcHi, T * RESTRICT dst, float (* RESTRICT filterLo)[4], float (* RESTRICT filterHi)[4], const int taps, const int offset, const int width, const int srcheight, const int dstheight, const float blend) +template void wavelet_level::SynthesisFilterSubsampVertical (T * RESTRICT srcLo, T * RESTRICT srcHi, T * RESTRICT dst, float (* RESTRICT filterLo)[4], float (* RESTRICT filterHi)[4], const int taps, const int offset, const int width, const int srcheight, const int dstheight, const float blend) { /* Basic convolution code @@ -521,7 +521,7 @@ __m128 fourv = _mm_set1_ps(4.f); __m128 srcFactorv = _mm_set1_ps(srcFactor); __m128 dstFactorv = _mm_set1_ps(blend); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(numThreads) if(numThreads>1) #endif @@ -594,7 +594,7 @@ // calculate coefficients int shift = skip * (taps - offset - 1); //align filter with data -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(numThreads) if(numThreads>1) #endif @@ -630,7 +630,7 @@ #endif #ifdef __SSE2__ -template template SSEFUNCTION void wavelet_level::decompose_level(E *src, E *dst, float *filterV, float *filterH, int taps, int offset) +template template void wavelet_level::decompose_level(E *src, E *dst, float *filterV, float *filterH, int taps, int offset) { /* filter along rows and columns */ @@ -644,7 +644,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { @@ -652,7 +652,7 @@ T tmpHi[m_w] ALIGNED64; if(subsamp_out) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -662,7 +662,7 @@ AnalysisFilterSubsampHorizontal (tmpHi, wavcoeffs[2], wavcoeffs[3], filterH, filterH + taps, taps, offset, m_w, m_w2, row / 2); } } else { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -678,7 +678,7 @@ template template void wavelet_level::decompose_level(E *src, E *dst, float *filterV, float *filterH, int taps, int offset) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { @@ -687,7 +687,7 @@ /* filter along rows and columns */ if(subsamp_out) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -697,7 +697,7 @@ AnalysisFilterSubsampHorizontal (tmpHi, wavcoeffs[2], wavcoeffs[3], filterH, filterH + taps, taps, offset, m_w, m_w2, row / 2); } } else { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -714,7 +714,7 @@ #ifdef __SSE2__ -template template SSEFUNCTION void wavelet_level::reconstruct_level(E* tmpLo, E* tmpHi, E * src, E *dst, float *filterV, float *filterH, int taps, int offset, const float blend) +template template void wavelet_level::reconstruct_level(E* tmpLo, E* tmpHi, E * src, E *dst, float *filterV, float *filterH, int taps, int offset, const float blend) { if(memoryAllocationFailed) { return; diff -Nru rawtherapee-5.3/rtengine/curves.cc rawtherapee-5.4/rtengine/curves.cc --- rawtherapee-5.3/rtengine/curves.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/curves.cc 2018-03-20 11:04:15.000000000 +0000 @@ -118,7 +118,7 @@ hash.at(hashSize + 1).higherValue = poly_x.size(); /* - * Uncoment the code below to dump the polygon points and the hash table in files + * Uncomment the code below to dump the polygon points and the hash table in files if (poly_x.size() > 500) { printf("Files generated (%d points)\n", poly_x.size()); FILE* f = fopen ("hash.txt", "wt"); @@ -476,14 +476,10 @@ } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -SSEFUNCTION void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, +void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, - procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, - procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, + const std::vector& curvePoints, + const std::vector& curvePoints2, LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, @@ -1360,7 +1356,7 @@ lut3.reset(); } -void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin) +void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin) { if (pCurve->isIdentity()) { lut1.reset(); @@ -1500,7 +1496,7 @@ */ } -void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin) +void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin) { std::unique_ptr tcurve; @@ -1509,11 +1505,11 @@ } if (tcurve) { - SetXYZ(tcurve.get(), xyz_rgb, rgb_xyz, satur, lumin); + SetXYZ(tcurve.get(), xyz_rgb, satur, lumin); } } -void ColorGradientCurve::SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3]) +void ColorGradientCurve::SetRGB(const Curve *pCurve) { if (pCurve->isIdentity()) { lut1.reset(); @@ -1599,7 +1595,7 @@ */ } -void ColorGradientCurve::SetRGB(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3]) +void ColorGradientCurve::SetRGB(const std::vector &curvePoints) { std::unique_ptr tcurve; @@ -1608,7 +1604,7 @@ } if (tcurve) { - SetRGB(tcurve.get(), xyz_rgb, rgb_xyz); + SetRGB(tcurve.get()); } } @@ -1826,241 +1822,255 @@ return maxslope; } -void PerceptualToneCurve::Apply(float &r, float &g, float &b, PerceptualToneCurveState & state) const +void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float *rc, float *gc, float *bc, const PerceptualToneCurveState &state) const { - float x, y, z; - - if (!state.isProphoto) { - // convert to prophoto space to make sure the same result is had regardless of working color space - float newr = state.Working2Prophoto[0][0] * r + state.Working2Prophoto[0][1] * g + state.Working2Prophoto[0][2] * b; - float newg = state.Working2Prophoto[1][0] * r + state.Working2Prophoto[1][1] * g + state.Working2Prophoto[1][2] * b; - float newb = state.Working2Prophoto[2][0] * r + state.Working2Prophoto[2][1] * g + state.Working2Prophoto[2][2] * b; - r = newr; - g = newg; - b = newb; - } - const AdobeToneCurve& adobeTC = static_cast((const ToneCurve&) * this); - float ar = r; - float ag = g; - float ab = b; - adobeTC.Apply(ar, ag, ab); - - if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) { - // clip fast path, will also avoid strange colors of clipped highlights - r = g = b = 65535.f; - return; - } - - if (ar <= 0.f && ag <= 0.f && ab <= 0.f) { - r = g = b = 0; - return; - } - - // ProPhoto constants for luminance, that is xyz_prophoto[1][] - const float Yr = 0.2880402f; - const float Yg = 0.7118741f; - const float Yb = 0.0000857f; - - // we use the Adobe (RGB-HSV hue-stabilized) curve to decide luminance, which generally leads to a less contrasty result - // compared to a pure luminance curve. We do this to be more compatible with the most popular curves. - float oldLuminance = r * Yr + g * Yg + b * Yb; - float newLuminance = ar * Yr + ag * Yg + ab * Yb; - float Lcoef = newLuminance / oldLuminance; - r = LIM(r * Lcoef, 0.f, 65535.f); - g = LIM(g * Lcoef, 0.f, 65535.f); - b = LIM(b * Lcoef, 0.f, 65535.f); - - // move to JCh so we can modulate chroma based on the global contrast-related chroma scaling factor - Color::Prophotoxyz(r, g, b, x, y, z); - - float J, C, h; - Ciecam02::xyz2jch_ciecam02float( J, C, h, - aw, fl, - x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, - xw, yw, zw, - c, nc, pow1, nbb, ncb, cz, d); + for (size_t i = start; i < end; ++i) { + float r = CLIP(rc[i]); + float g = CLIP(gc[i]); + float b = CLIP(bc[i]); - if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { - // this can happen for dark noise colors or colors outside human gamut. Then we just return the curve's result. if (!state.isProphoto) { - float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; - float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; - float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + // convert to prophoto space to make sure the same result is had regardless of working color space + float newr = state.Working2Prophoto[0][0] * r + state.Working2Prophoto[0][1] * g + state.Working2Prophoto[0][2] * b; + float newg = state.Working2Prophoto[1][0] * r + state.Working2Prophoto[1][1] * g + state.Working2Prophoto[1][2] * b; + float newb = state.Working2Prophoto[2][0] * r + state.Working2Prophoto[2][1] * g + state.Working2Prophoto[2][2] * b; r = newr; g = newg; b = newb; } - return; - } + float ar = r; + float ag = g; + float ab = b; + adobeTC.Apply(ar, ag, ab); + + if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) { + // clip fast path, will also avoid strange colours of clipped highlights + rc[i] = gc[i] = bc[i] = 65535.f; + continue; + } + + if (ar <= 0.f && ag <= 0.f && ab <= 0.f) { + rc[i] = gc[i] = bc[i] = 0; + continue; + } + + // ProPhoto constants for luminance, that is xyz_prophoto[1][] + constexpr float Yr = 0.2880402f; + constexpr float Yg = 0.7118741f; + constexpr float Yb = 0.0000857f; + + // we use the Adobe (RGB-HSV hue-stabilized) curve to decide luminance, which generally leads to a less contrasty result + // compared to a pure luminance curve. We do this to be more compatible with the most popular curves. + const float oldLuminance = r * Yr + g * Yg + b * Yb; + const float newLuminance = ar * Yr + ag * Yg + ab * Yb; + const float Lcoef = newLuminance / oldLuminance; + r = LIM(r * Lcoef, 0.f, 65535.f); + g = LIM(g * Lcoef, 0.f, 65535.f); + b = LIM(b * Lcoef, 0.f, 65535.f); + + // move to JCh so we can modulate chroma based on the global contrast-related chroma scaling factor + float x, y, z; + Color::Prophotoxyz(r, g, b, x, y, z); + + float J, C, h; + Ciecam02::xyz2jch_ciecam02float( J, C, h, + aw, fl, + x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f, + xw, yw, zw, + c, nc, pow1, nbb, ncb, cz, d); + + + if (!isfinite(J) || !isfinite(C) || !isfinite(h)) { + // this can happen for dark noise colours or colours outside human gamut. Then we just return the curve's result. + if (!state.isProphoto) { + float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; + float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; + float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + r = newr; + g = newg; + b = newb; + } + rc[i] = r; + gc[i] = g; + bc[i] = b; - float cmul = state.cmul_contrast; // chroma scaling factor + continue; + } - // depending on color, the chroma scaling factor can be fine-tuned below + float cmul = state.cmul_contrast; // chroma scaling factor - { - // decrease chroma scaling sligthly of extremely saturated colors - float saturated_scale_factor = 0.95f; - const float lolim = 35.f; // lower limit, below this chroma all colors will keep original chroma scaling factor - const float hilim = 60.f; // high limit, above this chroma the chroma scaling factor is multiplied with the saturated scale factor value above - - if (C < lolim) { - // chroma is low enough, don't scale - 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 + // depending on color, the chroma scaling factor can be fine-tuned below - if (x < 0.5f) { - x = 2.f * SQR(x); + { + // decrease chroma scaling slightly of extremely saturated colors + float saturated_scale_factor = 0.95f; + constexpr float lolim = 35.f; // lower limit, below this chroma all colors will keep original chroma scaling factor + constexpr float hilim = 60.f; // high limit, above this chroma the chroma scaling factor is multiplied with the saturated scale factor value above + + if (C < lolim) { + // chroma is low enough, don't scale + 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 + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } + + saturated_scale_factor = (1.f - x) + saturated_scale_factor * x; } else { - x = 1.f - 2.f * SQR(1 - x); + // do nothing, high saturation color, keep scale factor } - saturated_scale_factor = (1.f - x) + saturated_scale_factor * x; - } else { - // do nothing, high saturation color, keep scale factor + cmul *= saturated_scale_factor; } - cmul *= saturated_scale_factor; - } - - { - // increase chroma scaling slightly of shadows - float nL = Color::gamma2curve[newLuminance]; // apply gamma so we make comparison and transition with a more perceptual lightness scale - float dark_scale_factor = 1.20f; - //float dark_scale_factor = 1.0 + state.debug.p2 / 100.0f; - const float lolim = 0.15f; - const float hilim = 0.50f; - - if (nL < lolim) { - // 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 + { + // increase chroma scaling slightly of shadows + float nL = Color::gamma2curve[newLuminance]; // apply gamma so we make comparison and transition with a more perceptual lightness scale + float dark_scale_factor = 1.20f; + //float dark_scale_factor = 1.0 + state.debug.p2 / 100.0f; + constexpr float lolim = 0.15f; + constexpr float hilim = 0.50f; + + if (nL < lolim) { + // 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 + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } - if (x < 0.5f) { - x = 2.f * SQR(x); + dark_scale_factor = dark_scale_factor * (1.0f - x) + x; } else { - x = 1.f - 2.f * SQR(1 - x); + dark_scale_factor = 1.f; } - dark_scale_factor = dark_scale_factor * (1.0f - x) + x; - } else { - dark_scale_factor = 1.f; + cmul *= dark_scale_factor; } - cmul *= dark_scale_factor; - } - - { - // to avoid strange CIECAM02 chroma errors on close-to-shadow-clipping colors we reduce chroma scaling towards 1.0 for black colors - float dark_scale_factor = 1.f / cmul; - const float lolim = 4.f; - const float hilim = 7.f; - - if (J < lolim) { - // do nothing, keep scale factor - } else if (J < hilim) { - // S-curve transition - float x = (J - lolim) / (hilim - lolim); + { + // to avoid strange CIECAM02 chroma errors on close-to-shadow-clipping colors we reduce chroma scaling towards 1.0 for black colors + float dark_scale_factor = 1.f / cmul; + constexpr float lolim = 4.f; + constexpr float hilim = 7.f; + + if (J < lolim) { + // do nothing, keep scale factor + } else if (J < hilim) { + // S-curve transition + float x = (J - lolim) / (hilim - lolim); + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } - if (x < 0.5f) { - x = 2.f * SQR(x); + dark_scale_factor = dark_scale_factor * (1.f - x) + x; } else { - x = 1.f - 2.f * SQR(1 - x); + dark_scale_factor = 1.f; } - dark_scale_factor = dark_scale_factor * (1.f - x) + x; - } else { - dark_scale_factor = 1.f; + cmul *= dark_scale_factor; } - cmul *= dark_scale_factor; - } - - C *= cmul; + C *= cmul; - Ciecam02::jch2xyz_ciecam02float( x, y, z, - J, C, h, - xw, yw, zw, - f, c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw ); + Ciecam02::jch2xyz_ciecam02float( x, y, z, + J, C, h, + xw, yw, zw, + c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw ); + + if (!isfinite(x) || !isfinite(y) || !isfinite(z)) { + // can happen for colours on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result. + if (!state.isProphoto) { + float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; + float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; + float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + r = newr; + g = newg; + b = newb; + } - if (!isfinite(x) || !isfinite(y) || !isfinite(z)) { - // can happen for colors on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result. - if (!state.isProphoto) { - float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; - float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; - float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; - r = newr; - g = newg; - b = newb; + rc[i] = r; + gc[i] = g; + bc[i] = b; + + continue; } - return; - } - - Color::xyz2Prophoto(x, y, z, r, g, b); - r *= 655.35f; - g *= 655.35f; - b *= 655.35f; - r = LIM(r, 0.f, 65535.f); - g = LIM(g, 0.f, 65535.f); - b = LIM(b, 0.f, 65535.f); + Color::xyz2Prophoto(x, y, z, r, g, b); + r *= 655.35f; + g *= 655.35f; + b *= 655.35f; + r = LIM(r, 0.f, 65535.f); + g = LIM(g, 0.f, 65535.f); + b = LIM(b, 0.f, 65535.f); - { - // limit saturation increase in rgb space to avoid severe clipping and flattening in extreme highlights + { + // limit saturation increase in rgb space to avoid severe clipping and flattening in extreme highlights - // we use the RGB-HSV hue-stable "Adobe" curve as reference. For S-curve contrast it increases - // saturation greatly, but desaturates extreme highlights and thus provide a smooth transition to - // the white point. However the desaturation effect is quite strong so we make a weighting - float ah, as, av, h, s, v; - Color::rgb2hsv(ar, ag, ab, ah, as, av); - Color::rgb2hsv(r, g, b, h, s, v); - - float sat_scale = as <= 0.f ? 1.f : s / as; // saturation scale compared to Adobe curve - float keep = 0.2f; - const float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it - const float hilim = 1.20f; - - if (sat_scale < lolim) { - // saturation is low enough, don't desaturate - 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 + // we use the RGB-HSV hue-stable "Adobe" curve as reference. For S-curve contrast it increases + // saturation greatly, but desaturates extreme highlights and thus provide a smooth transition to + // the white point. However the desaturation effect is quite strong so we make a weighting + const float as = Color::rgb2s(ar, ag, ab); + const float s = Color::rgb2s(r, g, b); + + const float sat_scale = as <= 0.f ? 1.f : s / as; // saturation scale compared to Adobe curve + float keep = 0.2f; + constexpr float lolim = 1.00f; // only mix in the Adobe curve if we have increased saturation compared to it + constexpr float hilim = 1.20f; + + if (sat_scale < lolim) { + // saturation is low enough, don't desaturate + 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 + + if (x < 0.5f) { + x = 2.f * SQR(x); + } else { + x = 1.f - 2.f * SQR(1 - x); + } - if (x < 0.5f) { - x = 2.f * SQR(x); + keep = (1.f - x) + keep * x; } else { - x = 1.f - 2.f * SQR(1 - x); + // do nothing, very high increase, keep minimum amount } - keep = (1.f - x) + keep * x; - } else { - // do nothing, very high increase, keep minimum amount + if (keep < 1.f) { + // mix in some of the Adobe curve result + r = intp(keep, r, ar); + g = intp(keep, g, ag); + b = intp(keep, b, ab); + } } - if (keep < 1.f) { - // mix in some of the Adobe curve result - r = r * keep + (1.f - keep) * ar; - g = g * keep + (1.f - keep) * ag; - b = b * keep + (1.f - keep) * ab; + if (!state.isProphoto) { + float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; + float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; + float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; + r = newr; + g = newg; + b = newb; } - } - - if (!state.isProphoto) { - float newr = state.Prophoto2Working[0][0] * r + state.Prophoto2Working[0][1] * g + state.Prophoto2Working[0][2] * b; - float newg = state.Prophoto2Working[1][0] * r + state.Prophoto2Working[1][1] * g + state.Prophoto2Working[1][2] * b; - float newb = state.Prophoto2Working[2][0] * r + state.Prophoto2Working[2][1] * g + state.Prophoto2Working[2][2] * b; - r = newr; - g = newg; - b = newb; + rc[i] = r; + gc[i] = g; + bc[i] = b; } } - float PerceptualToneCurve::cf_range[2]; float PerceptualToneCurve::cf[1000]; float PerceptualToneCurve::f, PerceptualToneCurve::c, PerceptualToneCurve::nc, PerceptualToneCurve::yb, PerceptualToneCurve::la, PerceptualToneCurve::xw, PerceptualToneCurve::yw, PerceptualToneCurve::zw, PerceptualToneCurve::gamut; diff -Nru rawtherapee-5.3/rtengine/curves.h rawtherapee-5.4/rtengine/curves.h --- rawtherapee-5.3/rtengine/curves.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/curves.h 2018-03-20 11:04:15.000000000 +0000 @@ -281,7 +281,7 @@ public: static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr, - procparams::ToneCurveParams::eTCModeId curveMode, const std::vector& curvePoints, procparams::ToneCurveParams::eTCModeId curveMode2, const std::vector& curvePoints2, + const std::vector& curvePoints, const std::vector& curvePoints2, LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2, int skip = 1); @@ -687,10 +687,10 @@ virtual ~ColorGradientCurve() {}; void Reset(); - void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin); - void SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3], float satur, float lumin); - void SetRGB(const Curve *pCurve, const double xyz_rgb[3][3], const double rgb_xyz[3][3]); - void SetRGB(const std::vector &curvePoints, const double xyz_rgb[3][3], const double rgb_xyz[3][3]); + void SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3], float satur, float lumin); + void SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin); + void SetRGB(const Curve *pCurve); + void SetRGB(const std::vector &curvePoints); /** * @brief Get the value of Red, Green and Blue corresponding to the requested index @@ -800,23 +800,16 @@ { public: void Apply(float& r, float& g, float& b) const; -}; -class StandardToneCurvebw : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; -}; -class AdobeToneCurve : public ToneCurve -{ -private: - void RGBTone(float& r, float& g, float& b) const; // helper for tone curve - -public: - void Apply(float& r, float& g, float& b) const; + // Applies the tone curve to `r`, `g`, `b` arrays, starting at `r[start]` + // and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE + // and requires that `r`, `g`, and `b` pointers have the same alignment. + void BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const; }; -class AdobeToneCurvebw : public ToneCurve +class AdobeToneCurve : public ToneCurve { private: void RGBTone(float& r, float& g, float& b) const; // helper for tone curve @@ -831,18 +824,16 @@ void Apply(float& r, float& g, float& b) const; }; -class SatAndValueBlendingToneCurvebw : public ToneCurve -{ -public: - void Apply(float& r, float& g, float& b) const; -}; - class WeightedStdToneCurve : public ToneCurve { private: float Triangle(float refX, float refY, float X2) const; +#ifdef __SSE2__ + vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; +#endif public: void Apply(float& r, float& g, float& b) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const; }; class LuminanceToneCurve : public ToneCurve @@ -881,15 +872,7 @@ public: static void init(); void initApplyState(PerceptualToneCurveState & state, Glib::ustring workingSpace) const; - void Apply(float& r, float& g, float& b, PerceptualToneCurveState & state) const; -}; - -class WeightedStdToneCurvebw : public ToneCurve -{ -private: - float Triangle(float refX, float refY, float X2) const; -public: - void Apply(float& r, float& g, float& b) const; + void BatchApply(const size_t start, const size_t end, float *r, float *g, float *b, const PerceptualToneCurveState &state) const; }; // Standard tone curve @@ -902,15 +885,54 @@ g = lutToneCurve[g]; b = lutToneCurve[b]; } -// Standard tone curve -inline void StandardToneCurvebw::Apply (float& r, float& g, float& b) const -{ +inline void StandardToneCurve::BatchApply( + const size_t start, const size_t end, + float *r, float *g, float *b) const { assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); - r = lutToneCurve[r]; - g = lutToneCurve[g]; - b = lutToneCurve[b]; + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#ifdef __SSE2__ + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + i++; + } + +#ifdef __SSE2__ + for (; i + 3 < end; i += 4) { + __m128 r_val = LVF(r[i]); + __m128 g_val = LVF(g[i]); + __m128 b_val = LVF(b[i]); + STVF(r[i], lutToneCurve[r_val]); + STVF(g[i], lutToneCurve[g_val]); + STVF(b[i], lutToneCurve[b_val]); + } + + // Remainder in non-SSE. + for (; i < end; ++i) { + r[i] = lutToneCurve[r[i]]; + g[i] = lutToneCurve[g[i]]; + b[i] = lutToneCurve[b[i]]; + } +#endif } // Tone curve according to Adobe's reference implementation @@ -943,33 +965,6 @@ } } } -inline void AdobeToneCurvebw::Apply (float& r, float& g, float& b) const -{ - - assert (lutToneCurve); - - if (r >= g) { - if (g > b) { - RGBTone (r, g, b); // Case 1: r >= g > b - } else if (b > r) { - RGBTone (b, r, g); // Case 2: b > r >= g - } else if (b > g) { - RGBTone (r, b, g); // Case 3: r >= b > g - } else { // Case 4: r >= g == b - r = lutToneCurve[r]; - g = lutToneCurve[g]; - b = g; - } - } else { - if (r >= b) { - RGBTone (g, r, b); // Case 5: g > r >= b - } else if (b > g) { - RGBTone (b, g, r); // Case 6: b > g > r - } else { - RGBTone (g, b, r); // Case 7: g >= b > r - } - } -} inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const { @@ -979,14 +974,6 @@ b = lutToneCurve[bold]; g = b + ((r - b) * (gold - bold) / (rold - bold)); } -inline void AdobeToneCurvebw::RGBTone (float& r, float& g, float& b) const -{ - float rold = r, gold = g, bold = b; - - r = lutToneCurve[rold]; - b = lutToneCurve[bold]; - g = b + ((r - b) * (gold - bold) / (rold - bold)); -} // Modifying the Luminance channel only inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const @@ -1019,23 +1006,17 @@ return a1; } -inline float WeightedStdToneCurvebw::Triangle(float a, float a1, float b) const -{ - if (a != b) { - float b1; - float a2 = a1 - a; - - if (b < a) { - b1 = b + a2 * b / a ; - } else { - b1 = b + a2 * (65535.f - b) / (65535.f - a); - } - return b1; - } - - return a1; +#ifdef __SSE2__ +inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const +{ + vfloat a2 = a1 - a; + vmask cmask = vmaskf_lt(b, a); + vfloat b3 = vself(cmask, b, F2V(65535.f) - b); + vfloat a3 = vself(cmask, a, F2V(65535.f) - a); + return b + a2 * b3 / a3; } +#endif // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space @@ -1044,6 +1025,9 @@ assert (lutToneCurve); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); float r1 = lutToneCurve[r]; float g1 = Triangle(r, r1, g); float b1 = Triangle(r, r1, b); @@ -1056,97 +1040,103 @@ float r3 = Triangle(b, b3, r); float g3 = Triangle(b, b3, g); - r = CLIP( r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); + r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); } -inline void WeightedStdToneCurvebw::Apply (float& r, float& g, float& b) const -{ - +inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { assert (lutToneCurve); + assert (lutToneCurve.getClip() & LUT_CLIP_BELOW); + assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE); - float r1 = lutToneCurve[r]; - float g1 = Triangle(r, r1, g); - float b1 = Triangle(r, r1, b); - - float g2 = lutToneCurve[g]; - float r2 = Triangle(g, g2, r); - float b2 = Triangle(g, g2, b); - - float b3 = lutToneCurve[b]; - float r3 = Triangle(b, b3, r); - float g3 = Triangle(b, b3, g); + // All pointers must have the same alignment for SSE usage. In the loop body below, + // we will only check `r`, assuming that the same result would hold for `g` and `b`. + assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16); + assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16); + + size_t i = start; + while (true) { + if (i >= end) { + // If we get to the end before getting to an aligned address, just return. + // (Or, for non-SSE mode, if we get to the end.) + return; +#ifdef __SSE2__ + } else if (reinterpret_cast(&r[i]) % 16 == 0) { + // Otherwise, we get to the first aligned address; go to the SSE part. + break; +#endif + } + Apply(r[i], g[i], b[i]); + i++; + } - r = CLIP( r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); - g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); - b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); -} +#ifdef __SSE2__ + const vfloat c65535v = F2V(65535.f); + const vfloat zd5v = F2V(0.5f); + const vfloat zd25v = F2V(0.25f); -// Tone curve modifying the value channel only, preserving hue and saturation -// values in 0xffff space -inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const -{ + for (; i + 3 < end; i += 4) { + vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = LIMV(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = LIMV(LVF(b[i]), ZEROV, c65535v); + vfloat r1 = lutToneCurve[r_val]; + vfloat g1 = Triangle(r_val, r1, g_val); + vfloat b1 = Triangle(r_val, r1, b_val); - assert (lutToneCurve); + vfloat g2 = lutToneCurve[g_val]; + vfloat r2 = Triangle(g_val, g2, r_val); + vfloat b2 = Triangle(g_val, g2, b_val); - float h, s, v; - float lum = (r + g + b) / 3.f; - //float lum = Color::rgbLuminance(r, g, b); - float newLum = lutToneCurve[lum]; + vfloat b3 = lutToneCurve[b_val]; + vfloat r3 = Triangle(b_val, b3, r_val); + vfloat g3 = Triangle(b_val, b3, g_val); - if (newLum == lum) { - return; + STVF(r[i], LIMV(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v)); + STVF(g[i], LIMV(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v)); + STVF(b[i], LIMV(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v)); } - bool increase = newLum > lum; - - Color::rgb2hsv(r, g, b, h, s, v); - - if (increase) { - // Linearly targeting Value = 1 and Saturation = 0 - float coef = (newLum - lum) / (65535.f - lum); - float dV = (1.f - v) * coef; - s *= 1.f - coef; - Color::hsv2rgb(h, s, v + dV, r, g, b); - } else { - // Linearly targeting Value = 0 - float coef = (lum - newLum) / lum ; - float dV = v * coef; - Color::hsv2rgb(h, s, v - dV, r, g, b); + // Remainder in non-SSE. + for (; i < end; ++i) { + Apply(r[i], g[i], b[i]); } +#endif } -inline void SatAndValueBlendingToneCurvebw::Apply (float& r, float& g, float& b) const +// Tone curve modifying the value channel only, preserving hue and saturation +// values in 0xffff space +inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) const { assert (lutToneCurve); - float h, s, v; - float lum = (r + g + b) / 3.f; - //float lum = Color::rgbLuminance(r, g, b); - float newLum = lutToneCurve[lum]; + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); + + const float lum = (r + g + b) / 3.f; + const float newLum = lutToneCurve[lum]; if (newLum == lum) { return; } - bool increase = newLum > lum; - - Color::rgb2hsv(r, g, b, h, s, v); + float h, s, v; + Color::rgb2hsvtc(r, g, b, h, s, v); - if (increase) { + float dV; + if (newLum > lum) { // Linearly targeting Value = 1 and Saturation = 0 - float coef = (newLum - lum) / (65535.f - lum); - float dV = (1.f - v) * coef; + const float coef = (newLum - lum) / (65535.f - lum); + dV = (1.f - v) * coef; s *= 1.f - coef; - Color::hsv2rgb(h, s, v + dV, r, g, b); } else { // Linearly targeting Value = 0 - float coef = (lum - newLum) / lum ; - float dV = v * coef; - Color::hsv2rgb(h, s, v - dV, r, g, b); + const float coef = (newLum - lum) / lum ; + dV = v * coef; } + Color::hsv2rgbdcp(h, s, v + dV, r, g, b); } } diff -Nru rawtherapee-5.3/rtengine/dcp.cc rawtherapee-5.4/rtengine/dcp.cc --- rawtherapee-5.3/rtengine/dcp.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dcp.cc 2018-03-20 11:04:15.000000000 +0000 @@ -696,7 +696,9 @@ return; } - std::unique_ptr tagDir(ExifManager::parseTIFF(file, false)); + ExifManager exifManager(file, nullptr, true); + exifManager.parseTIFF(false); + std::unique_ptr tagDir(exifManager.roots.at(0)); Tag* tag = tagDir->getTag(toUnderlying(TagKey::CALIBRATION_ILLUMINANT_1)); light_source_1 = @@ -1072,7 +1074,7 @@ float s; float v; - if(Color::rgb2hsvdcp(newr, newg, newb, h , s, v)) { + if (LIKELY(Color::rgb2hsvdcp(newr, newg, newb, h , s, v))) { hsdApply(delta_info, delta_base, h, s, v); diff -Nru rawtherapee-5.3/rtengine/dcraw.cc rawtherapee-5.4/rtengine/dcraw.cc --- rawtherapee-5.3/rtengine/dcraw.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dcraw.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1435,253 +1435,278 @@ void CLASS phase_one_flat_field (int is_float, int nc) { - ushort head[8]; - unsigned wide, high, y, x, c, rend, cend, row, col; - float *mrow, num, mult[4]; - - read_shorts (head, 8); - if (head[2] * head[3] * head[4] * head[5] == 0) return; - wide = head[2] / head[4] + (head[2] % head[4] != 0); - high = head[3] / head[5] + (head[3] % head[5] != 0); - mrow = (float *) calloc (nc*wide, sizeof *mrow); - merror (mrow, "phase_one_flat_field()"); - for (y=0; y < high; y++) { - for (x=0; x < wide; x++) - for (c=0; c < nc; c+=2) { - num = is_float ? getreal(11) : get2()/32768.0; - if (y==0) mrow[c*wide+x] = num; - else mrow[(c+1)*wide+x] = (num - mrow[c*wide+x]) / head[5]; - } - if (y==0) continue; - rend = head[1] + y*head[5]; - for (row = rend-head[5]; - row < raw_height && row < rend && - row < head[1]+head[3]-head[5]; row++) { - for (x=1; x < wide; x++) { - for (c=0; c < nc; c+=2) { - mult[c] = mrow[c*wide+x-1]; - mult[c+1] = (mrow[c*wide+x] - mult[c]) / head[4]; - } - cend = head[0] + x*head[4]; - for (col = cend-head[4]; - col < raw_width && - col < cend && col < head[0]+head[2]-head[4]; col++) { - c = nc > 2 ? FC(row-top_margin,col-left_margin) : 0; - if (!(c & 1)) { - c = RAW(row,col) * mult[c]; - RAW(row,col) = LIM(c,0,65535); - } - for (c=0; c < nc; c+=2) - mult[c] += mult[c+1]; - } - } - for (x=0; x < wide; x++) - for (c=0; c < nc; c+=2) - mrow[c*wide+x] += mrow[(c+1)*wide+x]; + ushort uhead[8]; + + read_shorts (uhead, 8); + if (uhead[2] * uhead[3] * uhead[4] * uhead[5] == 0) { + return; } - } - free (mrow); + const unsigned wide = uhead[2] / uhead[4] + (uhead[2] % uhead[4] != 0); + const unsigned high = uhead[3] / uhead[5] + (uhead[3] % uhead[5] != 0); + const unsigned colLimit = std::min(uhead[0] + uhead[2] - uhead[4], (int)raw_width); + + const float head4 = 1.0 / uhead[4]; + const float head5 = 1.0 / uhead[5]; + + float* mrow = (float *) calloc(nc * wide, sizeof *mrow); + merror(mrow, "phase_one_flat_field()"); + for (unsigned x=0; x < wide; x++) { + for (unsigned c=0; c < nc; c+=2) { + float num = is_float ? getreal(11) : get2() / 32768.f; + mrow[c * wide + x] = num; + } + } + for (unsigned y=1; y < high; y++) { + for (unsigned x=0; x < wide; x++) { + for (unsigned c=0; c < nc; c+=2) { + float num = is_float ? getreal(11) : get2() / 32768.f; + mrow[(c + 1) * wide + x] = (num - mrow[c * wide + x]) * head5; + } + } + const unsigned rend = uhead[1] + y * uhead[5]; + for (unsigned row = rend - uhead[5]; row < raw_height && row < rend && row < uhead[1] + uhead[3] - uhead[5]; row++) { + unsigned cend = uhead[0] + uhead[4]; + const unsigned c0 = FC(row - top_margin, cend - uhead[4] - left_margin); + const unsigned c = nc > 2 ? (c0 & 1) ? FC(row - top_margin, cend - uhead[4] - left_margin + 1) : c0 : 0; + for (unsigned x=1; x < wide; x++, cend += uhead[4]) { + float mult0 = mrow[c * wide + x - 1]; + float mult1 = (mrow[c * wide + x] - mult0) * head4; + if (nc > 2) { + mult0 += (c0 & 1) ? mult1 : 0; + for (unsigned col = cend - uhead[4] + (c0 & 1); col < std::min(colLimit, cend); col += 2) { + unsigned val = RAW(row, col) * mult0; + RAW(row, col) = rtengine::min(val, 65535u); + mult0 += mult1; + mult0 += mult1; // <= this could be reduced to one addition inside the loop, but then the result is not exactly the same as with old code, though it should be even more accurate then + } + } else { + for (unsigned col = cend - uhead[4]; col < std::min(colLimit, cend); col++) { + unsigned val = RAW(row, col) * mult0; + RAW(row, col) = rtengine::min(val, 65535u); + mult0 += mult1; + } + } + } + for (unsigned x = 0; x < wide; x++) { + for (unsigned c = 0; c < nc; c += 2) { + mrow[c * wide + x] += mrow[(c + 1) * wide + x]; + } + } + } + } + free(mrow); } void CLASS phase_one_correct() { - unsigned entries, tag, data, save, col, row, type; - int len, i, j, k, cip, val[4], dev[4], sum, max; - int head[9], diff, mindiff=INT_MAX, off_412=0; - static const signed char dir[12][2] = - { {-1,-1}, {-1,1}, {1,-1}, {1,1}, {-2,0}, {0,-2}, {0,2}, {2,0}, - {-2,-2}, {-2,2}, {2,-2}, {2,2} }; - float poly[8], num, cfrac, frac, mult[2], *yval[2]; - ushort *xval[2]; - int qmult_applied = 0, qlin_applied = 0; + unsigned entries, tag, data, save, col, row, type; + int len, i, j, k, cip, val[4], dev[4], sum, max; + int head[9], diff, mindiff=INT_MAX, off_412=0; + static const signed char dir[12][2] = { {-1,-1}, {-1,1}, {1,-1}, {1,1}, {-2,0}, {0,-2}, {0,2}, {2,0}, {-2,-2}, {-2,2}, {2,-2}, {2,2} }; + float poly[8], num, cfrac, frac, mult[2], *yval[2]; + ushort *xval[2]; + int qmult_applied = 0, qlin_applied = 0; - if (half_size || !meta_length) return; - if (verbose) fprintf (stderr,_("Phase One correction...\n")); - fseek (ifp, meta_offset, SEEK_SET); - order = get2(); - fseek (ifp, 6, SEEK_CUR); - fseek (ifp, meta_offset+get4(), SEEK_SET); - entries = get4(); get4(); - while (entries--) { - tag = get4(); - len = get4(); - data = get4(); - save = ftell(ifp); - fseek (ifp, meta_offset+data, SEEK_SET); - if (tag == 0x419) { /* Polynomial curve */ - for (get4(), i=0; i < 8; i++) - poly[i] = getreal(11); - poly[3] += (ph1.tag_210 - poly[7]) * poly[6] + 1; - for (i=0; i < 0x10000; i++) { - num = (poly[5]*i + poly[3])*i + poly[1]; - curve[i] = LIM(num,0,65535); - } goto apply; /* apply to right half */ - } else if (tag == 0x41a) { /* Polynomial curve */ - for (i=0; i < 4; i++) - poly[i] = getreal(11); - for (i=0; i < 0x10000; i++) { - for (num=0, j=4; j--; ) - num = num * i + poly[j]; - curve[i] = LIM(num+i,0,65535); - } apply: /* apply to whole image */ - for (row=0; row < raw_height; row++) - for (col = (tag & 1)*ph1.split_col; col < raw_width; col++) - RAW(row,col) = curve[RAW(row,col)]; - } else if (tag == 0x400) { /* Sensor defects */ - while ((len -= 8) >= 0) { - col = get2(); - row = get2(); - type = get2(); get2(); - if (col >= raw_width) continue; - if (type == 131 || type == 137) /* Bad column */ - for (row=0; row < raw_height; row++) - if (FC(row-top_margin,col-left_margin) == 1) { - for (sum=i=0; i < 4; i++) - sum += val[i] = raw (row+dir[i][0], col+dir[i][1]); - for (max=i=0; i < 4; i++) { - dev[i] = abs((val[i] << 2) - sum); - if (dev[max] < dev[i]) max = i; - } - RAW(row,col) = (sum - val[max])/3.0 + 0.5; - } else { - for (sum=0, i=8; i < 12; i++) - sum += raw (row+dir[i][0], col+dir[i][1]); - RAW(row,col) = 0.5 + sum * 0.0732233 + - (raw(row,col-2) + raw(row,col+2)) * 0.3535534; - } - else if (type == 129) { /* Bad pixel */ - if (row >= raw_height) continue; - j = (FC(row-top_margin,col-left_margin) != 1) * 4; - for (sum=0, i=j; i < j+8; i++) - sum += raw (row+dir[i][0], col+dir[i][1]); - RAW(row,col) = (sum + 4) >> 3; - } - } - } else if (tag == 0x401) { /* All-color flat fields */ - phase_one_flat_field (1, 2); - } else if (tag == 0x416 || tag == 0x410) { - phase_one_flat_field (0, 2); - } else if (tag == 0x40b) { /* Red+blue flat field */ - phase_one_flat_field (0, 4); - } else if (tag == 0x412) { - fseek (ifp, 36, SEEK_CUR); - diff = abs (get2() - ph1.tag_21a); - if (mindiff > diff) { - mindiff = diff; - off_412 = ftell(ifp) - 38; - } - } else if (tag == 0x41f && !qlin_applied) { /* Quadrant linearization */ - ushort lc[2][2][16], ref[16]; - int qr, qc; - for (qr = 0; qr < 2; qr++) - for (qc = 0; qc < 2; qc++) - for (i = 0; i < 16; i++) - lc[qr][qc][i] = get4(); - for (i = 0; i < 16; i++) { - int v = 0; - for (qr = 0; qr < 2; qr++) - for (qc = 0; qc < 2; qc++) - v += lc[qr][qc][i]; - ref[i] = (v + 2) >> 2; - } - for (qr = 0; qr < 2; qr++) { - for (qc = 0; qc < 2; qc++) { - int cx[19], cf[19]; - for (i = 0; i < 16; i++) { - cx[1+i] = lc[qr][qc][i]; - cf[1+i] = ref[i]; - } - cx[0] = cf[0] = 0; - cx[17] = cf[17] = ((unsigned) ref[15] * 65535) / lc[qr][qc][15]; - cx[18] = cf[18] = 65535; - cubic_spline(cx, cf, 19); - for (row = (qr ? ph1.split_row : 0); - row < (qr ? raw_height : ph1.split_row); row++) - for (col = (qc ? ph1.split_col : 0); - col < (qc ? raw_width : ph1.split_col); col++) - RAW(row,col) = curve[RAW(row,col)]; - } - } - qlin_applied = 1; - } else if (tag == 0x41e && !qmult_applied) { /* Quadrant multipliers */ - float qmult[2][2] = { { 1, 1 }, { 1, 1 } }; - get4(); get4(); get4(); get4(); - qmult[0][0] = 1.0 + getreal(11); - get4(); get4(); get4(); get4(); get4(); - qmult[0][1] = 1.0 + getreal(11); - get4(); get4(); get4(); - qmult[1][0] = 1.0 + getreal(11); - get4(); get4(); get4(); - qmult[1][1] = 1.0 + getreal(11); - for (row=0; row < raw_height; row++) - for (col=0; col < raw_width; col++) { - i = qmult[row >= ph1.split_row][col >= ph1.split_col] * RAW(row,col); - RAW(row,col) = LIM(i,0,65535); - } - qmult_applied = 1; - } else if (tag == 0x431 && !qmult_applied) { /* Quadrant combined */ - ushort lc[2][2][7], ref[7]; - int qr, qc; - for (i = 0; i < 7; i++) - ref[i] = get4(); - for (qr = 0; qr < 2; qr++) - for (qc = 0; qc < 2; qc++) - for (i = 0; i < 7; i++) - lc[qr][qc][i] = get4(); - for (qr = 0; qr < 2; qr++) { - for (qc = 0; qc < 2; qc++) { - int cx[9], cf[9]; - for (i = 0; i < 7; i++) { - cx[1+i] = ref[i]; - cf[1+i] = ((unsigned) ref[i] * lc[qr][qc][i]) / 10000; - } - cx[0] = cf[0] = 0; - cx[8] = cf[8] = 65535; - cubic_spline(cx, cf, 9); - for (row = (qr ? ph1.split_row : 0); - row < (qr ? raw_height : ph1.split_row); row++) - for (col = (qc ? ph1.split_col : 0); - col < (qc ? raw_width : ph1.split_col); col++) - RAW(row,col) = curve[RAW(row,col)]; + if (half_size || !meta_length) { + return; + } + if (verbose) { + fprintf (stderr,_("Phase One correction...\n")); + } + fseek (ifp, meta_offset, SEEK_SET); + order = get2(); + fseek (ifp, 6, SEEK_CUR); + fseek (ifp, meta_offset+get4(), SEEK_SET); + entries = get4(); get4(); + while (entries--) { + tag = get4(); + len = get4(); + data = get4(); + save = ftell(ifp); + fseek (ifp, meta_offset+data, SEEK_SET); + if (tag == 0x419) { /* Polynomial curve */ + for (get4(), i=0; i < 8; i++) { + poly[i] = getreal(11); + } + poly[3] += (ph1.tag_210 - poly[7]) * poly[6] + 1; + for (i=0; i < 0x10000; i++) { + num = (poly[5]*i + poly[3])*i + poly[1]; + curve[i] = LIM(num,0,65535); + } + goto apply; /* apply to right half */ + } else if (tag == 0x41a) { /* Polynomial curve */ + for (i=0; i < 4; i++) { + poly[i] = getreal(11); + } + for (i=0; i < 0x10000; i++) { + for (num=0, j=4; j--;) { + num = num * i + poly[j]; + } + curve[i] = LIM(num+i,0,65535); + } + apply: /* apply to whole image */ + #pragma omp parallel for schedule(dynamic,16) + for (int row=0; row < raw_height; row++) { + for (int col = (tag & 1)*ph1.split_col; col < raw_width; col++) { + RAW(row,col) = curve[RAW(row,col)]; + } + } + } else if (tag == 0x400) { /* Sensor defects */ + while ((len -= 8) >= 0) { + col = get2(); + row = get2(); + type = get2(); + get2(); + if (col >= raw_width) continue; + if (type == 131 || type == 137) { /* Bad column */ + for (row=0; row < raw_height; row++) { + if (FC(row-top_margin,col-left_margin) == 1) { + for (sum=i=0; i < 4; i++) + sum += val[i] = raw (row+dir[i][0], col+dir[i][1]); + for (max=i=0; i < 4; i++) { + dev[i] = abs((val[i] << 2) - sum); + if (dev[max] < dev[i]) max = i; + } + RAW(row,col) = (sum - val[max])/3.0 + 0.5; + } else { + for (sum=0, i=8; i < 12; i++) + sum += raw (row+dir[i][0], col+dir[i][1]); + RAW(row,col) = 0.5 + sum * 0.0732233 + (raw(row,col-2) + raw(row,col+2)) * 0.3535534; + } + } + } else if (type == 129) { /* Bad pixel */ + if (row >= raw_height) continue; + j = (FC(row-top_margin,col-left_margin) != 1) * 4; + for (sum=0, i=j; i < j+8; i++) + sum += raw (row+dir[i][0], col+dir[i][1]); + RAW(row,col) = (sum + 4) >> 3; + } + } + } else if (tag == 0x401) { /* All-color flat fields */ + phase_one_flat_field (1, 2); + } else if (tag == 0x416 || tag == 0x410) { + phase_one_flat_field (0, 2); + } else if (tag == 0x40b) { /* Red+blue flat field */ + phase_one_flat_field (0, 4); + } else if (tag == 0x412) { + fseek (ifp, 36, SEEK_CUR); + diff = abs (get2() - ph1.tag_21a); + if (mindiff > diff) { + mindiff = diff; + off_412 = ftell(ifp) - 38; + } + } else if (tag == 0x41f && !qlin_applied) { /* Quadrant linearization */ + ushort lc[2][2][16], ref[16]; + int qr, qc; + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + for (i = 0; i < 16; i++) + lc[qr][qc][i] = get4(); + for (i = 0; i < 16; i++) { + int v = 0; + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + v += lc[qr][qc][i]; + ref[i] = (v + 2) >> 2; + } + for (qr = 0; qr < 2; qr++) { + for (qc = 0; qc < 2; qc++) { + int cx[19], cf[19]; + for (i = 0; i < 16; i++) { + cx[1+i] = lc[qr][qc][i]; + cf[1+i] = ref[i]; + } + cx[0] = cf[0] = 0; + cx[17] = cf[17] = ((unsigned) ref[15] * 65535) / lc[qr][qc][15]; + cx[18] = cf[18] = 65535; + cubic_spline(cx, cf, 19); + #pragma omp parallel for schedule(dynamic,16) + for (int row = (qr ? ph1.split_row : 0); row < (qr ? raw_height : ph1.split_row); row++) + for (int col = (qc ? ph1.split_col : 0); col < (qc ? raw_width : ph1.split_col); col++) + RAW(row,col) = curve[RAW(row,col)]; + } + } + qlin_applied = 1; + } else if (tag == 0x41e && !qmult_applied) { /* Quadrant multipliers */ + float qmult[2][2] = { { 1, 1 }, { 1, 1 } }; + get4(); get4(); get4(); get4(); + qmult[0][0] = 1.0 + getreal(11); + get4(); get4(); get4(); get4(); get4(); + qmult[0][1] = 1.0 + getreal(11); + get4(); get4(); get4(); + qmult[1][0] = 1.0 + getreal(11); + get4(); get4(); get4(); + qmult[1][1] = 1.0 + getreal(11); + #pragma omp parallel for schedule(dynamic,16) + for (int row=0; row < raw_height; row++) { + for (int col=0; col < raw_width; col++) { + int i = qmult[row >= ph1.split_row][col >= ph1.split_col] * RAW(row,col); + RAW(row,col) = LIM(i,0,65535); + } + } + qmult_applied = 1; + } else if (tag == 0x431 && !qmult_applied) { /* Quadrant combined */ + ushort lc[2][2][7], ref[7]; + int qr, qc; + for (i = 0; i < 7; i++) + ref[i] = get4(); + for (qr = 0; qr < 2; qr++) + for (qc = 0; qc < 2; qc++) + for (i = 0; i < 7; i++) + lc[qr][qc][i] = get4(); + for (qr = 0; qr < 2; qr++) { + for (qc = 0; qc < 2; qc++) { + int cx[9], cf[9]; + for (i = 0; i < 7; i++) { + cx[1+i] = ref[i]; + cf[1+i] = ((unsigned) ref[i] * lc[qr][qc][i]) / 10000; + } + cx[0] = cf[0] = 0; + cx[8] = cf[8] = 65535; + cubic_spline(cx, cf, 9); + for (row = (qr ? ph1.split_row : 0); row < (qr ? raw_height : ph1.split_row); row++) + for (col = (qc ? ph1.split_col : 0); col < (qc ? raw_width : ph1.split_col); col++) + RAW(row,col) = curve[RAW(row,col)]; + } + } + qmult_applied = 1; + qlin_applied = 1; } - } - qmult_applied = 1; - qlin_applied = 1; + fseek (ifp, save, SEEK_SET); + } + if (off_412) { + fseek (ifp, off_412, SEEK_SET); + for (i=0; i < 9; i++) + head[i] = get4() & 0x7fff; + yval[0] = (float *) calloc (head[1]*head[3] + head[2]*head[4], 6); + merror (yval[0], "phase_one_correct()"); + yval[1] = (float *) (yval[0] + head[1]*head[3]); + xval[0] = (ushort *) (yval[1] + head[2]*head[4]); + xval[1] = (ushort *) (xval[0] + head[1]*head[3]); + get2(); + for (i=0; i < 2; i++) + for (j=0; j < head[i+1]*head[i+3]; j++) + yval[i][j] = getreal(11); + for (i=0; i < 2; i++) + for (j=0; j < head[i+1]*head[i+3]; j++) + xval[i][j] = get2(); + for (row=0; row < raw_height; row++) + for (col=0; col < raw_width; col++) { + cfrac = (float) col * head[3] / raw_width; + cfrac -= cip = cfrac; + num = RAW(row,col) * 0.5; + for (i=cip; i < cip+2; i++) { + for (k=j=0; j < head[1]; j++) + if (num < xval[0][k = head[1]*i+j]) + break; + frac = (j == 0 || j == head[1]) ? 0 : (xval[0][k] - num) / (xval[0][k] - xval[0][k-1]); + mult[i-cip] = yval[0][k-1] * frac + yval[0][k] * (1-frac); + } + i = ((mult[0] * (1-cfrac) + mult[1] * cfrac) * row + num) * 2; + RAW(row,col) = LIM(i,0,65535); + } + free (yval[0]); } - fseek (ifp, save, SEEK_SET); - } - if (off_412) { - fseek (ifp, off_412, SEEK_SET); - for (i=0; i < 9; i++) head[i] = get4() & 0x7fff; - yval[0] = (float *) calloc (head[1]*head[3] + head[2]*head[4], 6); - merror (yval[0], "phase_one_correct()"); - yval[1] = (float *) (yval[0] + head[1]*head[3]); - xval[0] = (ushort *) (yval[1] + head[2]*head[4]); - xval[1] = (ushort *) (xval[0] + head[1]*head[3]); - get2(); - for (i=0; i < 2; i++) - for (j=0; j < head[i+1]*head[i+3]; j++) - yval[i][j] = getreal(11); - for (i=0; i < 2; i++) - for (j=0; j < head[i+1]*head[i+3]; j++) - xval[i][j] = get2(); - for (row=0; row < raw_height; row++) - for (col=0; col < raw_width; col++) { - cfrac = (float) col * head[3] / raw_width; - cfrac -= cip = cfrac; - num = RAW(row,col) * 0.5; - for (i=cip; i < cip+2; i++) { - for (k=j=0; j < head[1]; j++) - if (num < xval[0][k = head[1]*i+j]) break; - frac = (j == 0 || j == head[1]) ? 0 : - (xval[0][k] - num) / (xval[0][k] - xval[0][k-1]); - mult[i-cip] = yval[0][k-1] * frac + yval[0][k] * (1-frac); - } - i = ((mult[0] * (1-cfrac) + mult[1] * cfrac) * row + num) * 2; - RAW(row,col) = LIM(i,0,65535); - } - free (yval[0]); - } } void CLASS phase_one_load_raw() @@ -1725,9 +1750,35 @@ vbits -= nbits; return c; } -#define ph1_bits(n) ph1_bithuff(n,0) + +inline unsigned CLASS ph1_bithuff_t::operator() (int nbits) +{ +/*RT static UINT64 bitbuf=0; */ +/*RT static int vbits=0; */ + + if (vbits < nbits) { + bitbuf = bitbuf << 32 | get4(); + vbits += 32; + } + unsigned c = bitbuf << (64-vbits) >> (64-nbits); + vbits -= nbits; + return c; +} + +inline unsigned CLASS ph1_bithuff_t::operator() () +{ +/*RT static UINT64 bitbuf=0; */ +/*RT static int vbits=0; */ + return bitbuf = vbits = 0; +} + + +#define ph1_init() ph1_bithuff() +#define ph1_bits(n) ph1_bithuff(n) +#define hb_bits(n) ph1_bithuff(n,0) #define ph1_huff(h) ph1_bithuff(*h,h+1) +#ifndef MYFILE_MMAP void CLASS phase_one_load_raw_c() { static const int length[] = { 8,7,6,9,11,10,5,12,14,13 }; @@ -1751,9 +1802,10 @@ read_shorts ((ushort *) rblack[0], raw_width*2); for (i=0; i < 256; i++) curve[i] = i*i / 3.969 + 0.5; + ph1_bithuff_t ph1_bithuff(this, ifp, order); for (row=0; row < raw_height; row++) { fseek (ifp, data_offset + offset[row], SEEK_SET); - ph1_bits(-1); + ph1_init(); pred[0] = pred[1] = 0; for (col=0; col < raw_width; col++) { if (col >= (raw_width & -8)) @@ -1781,7 +1833,92 @@ free (pixel); maximum = 0xfffc - ph1.black; } +#else +void CLASS phase_one_load_raw_c() +{ + static const int length[] = { 8,7,6,9,11,10,5,12,14,13 }; + + int *offset = (int *)calloc(raw_width * 2 + raw_height * 4, 2); + fseek(ifp, strip_offset, SEEK_SET); + for (int row = 0; row < raw_height; row++) { + offset[row] = get4(); + } + + short (*cblack)[2] = (short (*)[2]) (offset + raw_height); + fseek(ifp, ph1.black_col, SEEK_SET); + if (ph1.black_col) { + read_shorts ((ushort *) cblack[0], raw_height * 2); + } + + short (*rblack)[2] = cblack + raw_height; + fseek(ifp, ph1.black_row, SEEK_SET); + if (ph1.black_row) { + read_shorts ((ushort *) rblack[0], raw_width * 2); + } + + for (int i = 0; i < 256; i++) { + curve[i] = i * i / 3.969 + 0.5; + } + +#ifdef _OPENMP +#pragma omp parallel +#endif +{ + int len[2], pred[2]; + IMFILE ifpthr = *ifp; + ifpthr.plistener = nullptr; + +#ifdef _OPENMP +#pragma omp master +#endif +{ + ifpthr.plistener = ifp->plistener; +} + + ph1_bithuff_t ph1_bithuff(this, &ifpthr, order); +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int row = 0; row < raw_height; row++) { + const int shift = 2 * (ph1.format != 8); + fseek(&ifpthr, data_offset + offset[row], SEEK_SET); + ph1_init(); + pred[0] = pred[1] = 0; + for (int col = 0; col < raw_width; col++) { + if (col >= (raw_width & -8)) { + len[0] = len[1] = 14; + } else if ((col & 7) == 0) { + for (int i = 0; i < 2; i++) { + int j; + for (j = 0; j < 5 && !ph1_bits(1); j++) + ; + if (j--) { + len[i] = length[j * 2 + ph1_bits(1)]; + } + } + } + + int i = len[col & 1]; + ushort pixel; + if (i == 14) { + pixel = pred[col & 1] = ph1_bits(16); + } else { + pixel = pred[col & 1] += ph1_bits(i) + 1 - (1 << (i - 1)); + } + if (ph1.format == 5 && pixel < 256) { + pixel = curve[pixel]; + } + int rawVal = (pixel << shift) - ph1.black + cblack[row][col >= ph1.split_col] + rblack[col][row >= ph1.split_row]; + RAW(row,col) = std::max(rawVal, 0); + } + } +} + free(offset); + maximum = 0xfffc - ph1.black; +} +#endif void CLASS parse_hasselblad_gain() { /* @@ -1814,7 +1951,7 @@ Data block format. Seems to differ depending on sensor type. For tested H4D-50 and H3D-31: 10 16 bit signed values per row value 0: a correction factor (k) used on even columns, where the new pixel value is - calulated as follows: + calculated as follows: new_value = old_value + (2 * ((k * (old_value_on_row_above-256)) / 32767) - 2) note the connection to the value on the row above, seems to be some sort of signal leakage correction. @@ -1886,7 +2023,7 @@ TODO: - Support all gain tag formats - The 0x19 tag varies a bit between models. We don't have parsers for all models. - - The reference model used was during inital reverse-engineering was a H4D-50, + - The reference model used was during initial reverse-engineering was a H4D-50, we probably support the Hasselblads with Kodak 31, 39, 40 and 50 megapixels well, but more work is needed for Kodak 16 and 22, Dalsa 60 and Sony 50. - Apply bad column(?) data (hbd.unknown1) @@ -2122,7 +2259,8 @@ if (!ljpeg_start (&jh, 0)) return; order = 0x4949; - ph1_bits(-1); + 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; @@ -2134,7 +2272,7 @@ for (s=0; s < tiff_samples*2; s+=2) { FORC(2) len[c] = ph1_huff(jh.huff[0]); FORC(2) { - diff[s+c] = ph1_bits(len[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; @@ -2211,6 +2349,37 @@ && (unsigned) (col-left_margin) < width) derror(); } + +// RT +void CLASS sony_arq_load_raw() +{ + static unsigned frame2pos[] = { 0, 1, 3, 2 }; + int row, col, bits=0; + ushort samples[4]; + unsigned frame = frame2pos[shot_select]; + + while (1 << ++bits < maximum); + for (row=0; row < ((frame < 2) ? 1 : raw_height); row++) { + for (col=0; col < ((row == 0) ? raw_width : 1); col++) { + RAW(row,col) = 0; + } + } + for (row=0; row < raw_height; row++) { + int r = row + (frame & 1); + for (col=0; col < raw_width; col++) { + int c = col + ((frame >> 1) & 1); + read_shorts(samples, 4); + if (r < raw_height && c < raw_width) { + RAW(r,c) = samples[(2 * (r & 1)) + (c & 1)]; + if ((RAW(r,c) >>= load_flags) >> bits + && (unsigned) (row-top_margin) < height + && (unsigned) (col-left_margin) < width) derror(); + } + } + } +} + + void CLASS sinar_4shot_load_raw() { ushort *pixel; @@ -2354,6 +2523,7 @@ void CLASS panasonic_load_raw() { + pana_bits_t pana_bits(ifp,load_flags); int row, col, i, j, sh=0, pred[2], nonz[2]; pana_bits(0); @@ -3121,22 +3291,23 @@ int row, col, c, i, dir, op[4], len[4]; order = 0x4949; + ph1_bithuff_t ph1_bithuff(this, ifp, order); for (row=0; row < raw_height; row++) { fseek (ifp, strip_offset+row*4, SEEK_SET); fseek (ifp, data_offset+get4(), SEEK_SET); - ph1_bits(-1); + hb_bits(-1); FORC4 len[c] = row < 2 ? 7:4; for (col=0; col < raw_width; col+=16) { - dir = ph1_bits(1); - FORC4 op[c] = ph1_bits(2); + dir = hb_bits(1); + FORC4 op[c] = hb_bits(2); FORC4 switch (op[c]) { - case 3: len[c] = ph1_bits(4); break; + case 3: len[c] = hb_bits(4); break; case 2: len[c]--; break; case 1: len[c]++; } for (c=0; c < 16; c+=2) { i = len[((c & 1) << 1) | (c >> 3)]; - RAW(row,col+c) = ((signed) ph1_bits(i) << (32-i) >> (32-i)) + + RAW(row,col+c) = ((signed) hb_bits(i) << (32-i) >> (32-i)) + (dir ? RAW(row+(~c | -2),col+c) : col ? RAW(row,col+(c | -2)) : 128); if (c == 14) c = -1; } @@ -3178,27 +3349,28 @@ fseek (ifp, 9, SEEK_CUR); opt = fgetc(ifp); init = (get2(),get2()); + ph1_bithuff_t ph1_bithuff(this, ifp, order); for (row=0; row < raw_height; row++) { fseek (ifp, (data_offset-ftell(ifp)) & 15, SEEK_CUR); - ph1_bits(-1); + hb_bits(-1); mag = 0; pmode = 7; FORC(6) ((ushort *)lent)[c] = row < 2 ? 7:4; prow[ row & 1] = &RAW(row-1,1-((row & 1) << 1)); // green prow[~row & 1] = &RAW(row-2,0); // red and blue for (tab=0; tab+15 < raw_width; tab+=16) { if (~opt & 4 && !(tab & 63)) { - i = ph1_bits(2); - mag = i < 3 ? mag-'2'+"204"[i] : ph1_bits(12); + i = hb_bits(2); + mag = i < 3 ? mag-'2'+"204"[i] : hb_bits(12); } if (opt & 2) - pmode = 7 - 4*ph1_bits(1); - else if (!ph1_bits(1)) - pmode = ph1_bits(3); - if (opt & 1 || !ph1_bits(1)) { - FORC4 len[c] = ph1_bits(2); + pmode = 7 - 4*hb_bits(1); + else if (!hb_bits(1)) + pmode = hb_bits(3); + if (opt & 1 || !hb_bits(1)) { + FORC4 len[c] = hb_bits(2); FORC4 { i = ((row & 1) << 1 | (c & 1)) % 3; - len[c] = len[c] < 3 ? lent[i][0]-'1'+"120"[len[c]] : ph1_bits(4); + len[c] = len[c] < 3 ? lent[i][0]-'1'+"120"[len[c]] : hb_bits(4); lent[i][0] = lent[i][1]; lent[i][1] = len[c]; } @@ -3209,7 +3381,7 @@ ? (tab ? RAW(row,tab-2+(col & 1)) : init) : (prow[col & 1][col-'4'+"0224468"[pmode]] + prow[col & 1][col-'4'+"0244668"[pmode]] + 1) >> 1; - diff = ph1_bits (i = len[c >> 2]); + diff = hb_bits (i = len[c >> 2]); if (diff >> (i-1)) diff -= 1 << i; diff = diff * (mag*2+1) + mag; RAW(row,col) = pred + diff; @@ -3679,7 +3851,7 @@ short * CLASS foveon_make_curve (double max, double mul, double filt) { short *curve; - unsigned i, size; + size_t i, size; double x; if (!filt) filt = 0.8; @@ -4139,7 +4311,6 @@ } } } else { - #pragma omp parallel for for (int row=0; row < height; row++) for (int col=0; col < width; col++) @@ -4207,7 +4378,7 @@ //} /* - Seach from the current directory up to the root looking for + Search from the current directory up to the root looking for a ".badpixels" file, and fix those pixels now. */ //void CLASS bad_pixels (const char *cfname) @@ -5326,7 +5497,8 @@ for (c=i=2; (ushort) c != 0xbbbb && i < len; i++) c = c << 8 | fgetc(ifp); while ((i+=4) < len-5) - if (get4() == 257 && (i=len) && (c = (get4(),fgetc(ifp))) < 3) + if (get4() == 257 && (i=len) && (c = (get4(),fgetc(ifp))) < 3 && strcmp(make,"Canon")) + // don't use this tag for Canon cameras as it's known to give wrong orientation some times flip = "065"[c]-'0'; } if (tag == 0x10 && type == 4) @@ -6244,6 +6416,16 @@ free (buf); } + /* RT -- do not use CameraCalibration matrices for DNGs - see #4129 */ + for (j=0; j < 4; j++) { + ab[j] = 1; + for (i=0; i < 4; i++) { + cc[0][j][i] = i == j; + cc[1][j][i] = i == j; + } + } + /* RT end */ + for (i=0; i < colors; i++) FORCC cc[cm_D65][i][c] *= ab[i]; if (use_cm) { @@ -6260,6 +6442,9 @@ } if (!use_cm) FORCC pre_mul[c] /= cc[cm_D65][c][c]; + + RT_from_adobe_dng_converter = !strncmp(software, "Adobe DNG Converter", 19); + return 0; } @@ -6371,6 +6556,17 @@ if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*7 > raw_width*raw_height) load_raw = &CLASS olympus_load_raw; + // ------- RT ------- + if (!strncmp(make,"SONY",4) && + !strncmp(model,"ILCE-7RM3",9) && + tiff_samples == 4 && + tiff_ifd[raw].bytes == raw_width*raw_height*tiff_samples*2) { + load_raw = &CLASS sony_arq_load_raw; + colors = 3; + is_raw = 4; + filters = 0x94949494; + } + // ------------------ } break; case 6: case 7: case 99: @@ -8106,13 +8302,13 @@ { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, { "Sony DSLR-A390", 0, 0, { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, - { "Sony DSLR-A450", 0, 0xfeb, + { "Sony DSLR-A450", 0, 0, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, - { "Sony DSLR-A580", 0, 0xfeb, + { "Sony DSLR-A580", 0, 0, { 5932,-1492,-411,-4813,12285,2856,-741,1524,6739 } }, - { "Sony DSLR-A500", 0, 0xfeb, + { "Sony DSLR-A500", 0, 0, { 6046,-1127,-278,-5574,13076,2786,-691,1419,7625 } }, - { "Sony DSLR-A5", 0, 0xfeb, + { "Sony DSLR-A5", 0, 0, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, { "Sony DSLR-A700", 0, 0, { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, @@ -9540,7 +9736,13 @@ } dng_skip: if ((use_camera_matrix & (use_camera_wb || dng_version)) - && cmatrix[0][0] > 0.125) { + && cmatrix[0][0] > 0.125 + && !RT_from_adobe_dng_converter /* RT -- do not use the embedded + * matrices for DNGs coming from the + * Adobe DNG Converter, to ensure + * consistency of WB values between + * DNG-converted and original raw + * files. See #4129 */) { memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -9556,7 +9758,7 @@ adobe_coeff (make, model); if(!strncmp(make, "Leica", 5) && !strncmp(model, "SL",2)) adobe_coeff (make, model); - if(!strncmp(make, "XIAOYI", 6) && !strncmp(model, "M1",2)) + if((!strncmp(make, "XIAOYI", 6) || !strncmp(make, "YI", 2)) && !strncmp(model, "M1",2)) adobe_coeff (make, model); if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) diff -Nru rawtherapee-5.3/rtengine/dcraw.h rawtherapee-5.4/rtengine/dcraw.h --- rawtherapee-5.3/rtengine/dcraw.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dcraw.h 2018-03-20 11:04:15.000000000 +0000 @@ -58,9 +58,8 @@ ,RT_whitelevel_from_constant(0) ,RT_blacklevel_from_constant(0) ,RT_matrix_from_constant(0) + ,RT_from_adobe_dng_converter(false) ,getbithuff(this,ifp,zero_after_ff) - ,ph1_bithuff(this,ifp,order) - ,pana_bits(ifp,load_flags) { memset(&hbd, 0, sizeof(hbd)); aber[0]=aber[1]=aber[2]=aber[3]=1; @@ -69,7 +68,6 @@ greybox[0]=greybox[1]=0; greybox[2]=greybox[3]= UINT_MAX; } - //int main (int argc, const char **argv); protected: int exif_base, ciff_base, ciff_len; IMFILE *ifp; @@ -154,6 +152,7 @@ int RT_whitelevel_from_constant; int RT_blacklevel_from_constant; int RT_matrix_from_constant; + bool RT_from_adobe_dng_converter; float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; @@ -285,8 +284,8 @@ void fuji_extend_red(ushort *linebuf[_ltotal], int line_width); void fuji_extend_green(ushort *linebuf[_ltotal], int line_width); void fuji_extend_blue(ushort *linebuf[_ltotal], int line_width); -void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line); -void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line); +void xtrans_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); +void fuji_bayer_decode_block(struct fuji_compressed_block* info, const struct fuji_compressed_params *params); void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur_block, INT64 raw_offset, unsigned dsize); void fuji_compressed_load_raw(); void fuji_decode_loop(const struct fuji_compressed_params* common_info, int count, INT64* raw_block_offsets, unsigned *block_sizes); @@ -316,19 +315,45 @@ // ph1_bithuff(int nbits, ushort *huff); class ph1_bithuff_t { public: - ph1_bithuff_t(DCraw *p,IMFILE *&i,short &o):parent(p),order(o),ifp(i),bitbuf(0),vbits(0){} + ph1_bithuff_t(DCraw *p, IMFILE *i, short &o):parent(p),order(o),ifp(i),bitbuf(0),vbits(0){} unsigned operator()(int nbits, ushort *huff); + unsigned operator()(int nbits); + unsigned operator()(); + ushort get2() { + uchar str[2] = { 0xff,0xff }; + fread (str, 1, 2, ifp); + if (order == 0x4949) { /* "II" means little-endian */ + return str[0] | str[1] << 8; + } else { /* "MM" means big-endian */ + return str[0] << 8 | str[1]; + } + } private: - unsigned get4(){ - return parent->get4(); + inline unsigned get4() { + unsigned val = 0xffffff; + uchar* str = (uchar*)&val; + fread (str, 1, 4, ifp); + if (order == 0x4949) { +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + return val; +#else + return str[0] | str[1] << 8 | str[2] << 16 | str[3] << 24; +#endif + } else { +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + return str[0] << 24 | str[1] << 16 | str[2] << 8 | str[3]; +#else + return val; +#endif + } } + DCraw *parent; short ℴ - IMFILE *&ifp; + IMFILE* const ifp; UINT64 bitbuf; int vbits; }; -ph1_bithuff_t ph1_bithuff; void phase_one_load_raw_c(); void hasselblad_correct(); @@ -341,18 +366,16 @@ void packed_load_raw(); void nokia_load_raw(); -// pana_bits(int nbits); class pana_bits_t{ public: - pana_bits_t(IMFILE *&i,unsigned &u):ifp(i),load_flags(u),vbits(0){} + pana_bits_t(IMFILE *i, unsigned &u): ifp(i), load_flags(u), vbits(0) {} unsigned operator()(int nbits); private: - IMFILE *&ifp; + IMFILE *ifp; unsigned &load_flags; uchar buf[0x4000]; int vbits; }; -pana_bits_t pana_bits; void canon_rmf_load_raw(); void panasonic_load_raw(); @@ -386,6 +409,7 @@ void sony_load_raw(); void sony_arw_load_raw(); void sony_arw2_load_raw(); +void sony_arq_load_raw(); // RT void smal_decode_segment (unsigned seg[2][2], int holes); void smal_v6_load_raw(); diff -Nru rawtherapee-5.3/rtengine/dcraw.patch rawtherapee-5.4/rtengine/dcraw.patch --- rawtherapee-5.3/rtengine/dcraw.patch 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dcraw.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,4218 +0,0 @@ ---- dcraw.c 2016-11-01 01:07:55 +0000 -+++ dcraw.cc 2016-11-01 14:54:02 +0000 -@@ -1,3 +1,16 @@ -+/*RT*/#include -+/*RT*/#include -+/*RT*/#undef MAX -+/*RT*/#undef MIN -+/*RT*/#undef ABS -+/*RT*/#include "rt_math.h" -+/*RT*/#define NO_LCMS -+/*RT*/#define NO_JPEG -+/*RT*/#define NO_JASPER -+/*RT*/#define LOCALTIME -+/*RT*/#define DJGPP -+ -+#include "opthelper.h" - /* - dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net -@@ -29,17 +42,17 @@ - #define _GNU_SOURCE - #endif - #define _USE_MATH_DEFINES --#include --#include -+#include -+#include - #include --#include --#include --#include --#include --#include --#include --#include --#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include - #include - - #if defined(DJGPP) || defined(__MINGW32__) -@@ -54,7 +67,6 @@ - #ifdef WIN32 - #include - #include --#pragma comment(lib, "ws2_32.lib") - #define snprintf _snprintf - #define strcasecmp stricmp - #define strncasecmp strnicmp -@@ -89,89 +101,38 @@ - #define _(String) (String) - #endif - --#if !defined(uchar) --#define uchar unsigned char --#endif --#if !defined(ushort) --#define ushort unsigned short --#endif -+#define ushort UshORt -+typedef unsigned char uchar; -+typedef unsigned short ushort; - -+#include "dcraw.h" - /* -- All global variables are defined here, and all functions that -+ RT All global variables are defined here, and all functions that - access them are prefixed with "CLASS". Note that a thread-safe - C++ class cannot have non-const static local variables. - */ --FILE *ifp, *ofp; --short order; --const char *ifname; --char *meta_data, xtrans[6][6], xtrans_abs[6][6]; --char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64]; --float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len; --time_t timestamp; --off_t strip_offset, data_offset; --off_t thumb_offset, meta_offset, profile_offset; --unsigned shot_order, kodak_cbpp, exif_cfa, unique_id; --unsigned thumb_length, meta_length, profile_length; --unsigned thumb_misc, *oprof, fuji_layout, shot_select=0, multi_out=0; --unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; --unsigned black, maximum, mix_green, raw_color, zero_is_bad; --unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error; --unsigned tile_width, tile_length, gpsdata[32], load_flags; --unsigned flip, tiff_flip, filters, colors; --ushort raw_height, raw_width, height, width, top_margin, left_margin; --ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height; --ushort *raw_image, (*image)[4], cblack[4102]; --ushort white[8][8], curve[0x10000], cr2_slice[3], sraw_mul[4]; --double pixel_aspect, aber[4]={1,1,1,1}, gamm[6]={ 0.45,4.5,0,0,0,0 }; --float bright=1, user_mul[4]={0,0,0,0}, threshold=0; --int mask[8][4]; --int half_size=0, four_color_rgb=0, document_mode=0, highlight=0; --int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=1; --int output_color=1, output_bps=8, output_tiff=0, med_passes=0; --int no_auto_bright=0; --unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX }; --float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; --const double xyz_rgb[3][3] = { /* XYZ from RGB */ -+ -+const double 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 } }; - const float d65_white[3] = { 0.950456, 1, 1.088754 }; --int histogram[4][0x2000]; --void (*write_thumb)(), (*write_fun)(); --void (*load_raw)(), (*thumb_load_raw)(); --jmp_buf failure; -- --struct decode { -- struct decode *branch[2]; -- int leaf; --} first_decode[2048], *second_decode, *free_decode; -- --struct tiff_ifd { -- int width, height, bps, comp, phint, offset, flip, samples, bytes; -- int tile_width, tile_length; -- float shutter; --} tiff_ifd[10]; -- --struct ph1 { -- int format, key_off, tag_21a; -- int black, split_col, black_col, split_row, black_row; -- float tag_210; --} ph1; - --#define CLASS -+/* RT: Removed unused structs */ -+#define CLASS DCraw:: - - #define FORC(cnt) for (c=0; c < cnt; c++) - #define FORC3 FORC(3) - #define FORC4 FORC(4) - #define FORCC FORC(colors) - --#define SQR(x) ((x)*(x)) -+#define SQR(x) rtengine::SQR(x) - #define ABS(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31)) --#define MIN(a,b) ((a) < (b) ? (a) : (b)) --#define MAX(a,b) ((a) > (b) ? (a) : (b)) --#define LIM(x,min,max) MAX(min,MIN(x,max)) --#define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) --#define CLIP(x) LIM((int)(x),0,65535) -+#define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b)) -+#define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b)) -+#define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max)) -+#define ULIM(x,y,z) rtengine::median(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z)) -+#define CLIP(x) rtengine::CLIP(x) - #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } - - /* -@@ -247,6 +208,7 @@ - - if (filters == 1) return filter[(row+top_margin)&15][(col+left_margin)&15]; - if (filters == 9) return xtrans[(row+6) % 6][(col+6) % 6]; -+ - return FC(row,col); - } - -@@ -289,6 +251,7 @@ - fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp)); - } - data_error++; -+/*RT Issue 2467 longjmp (failure, 1);*/ - } - - ushort CLASS sget2 (uchar *s) -@@ -362,7 +325,7 @@ - { - if (fread (pixel, 2, count, ifp) < count) derror(); - if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) -- swab (pixel, pixel, count*2); -+ swab ((char*)pixel, (char*)pixel, count*2); - } - - void CLASS cubic_spline (const int *x_, const int *y_, const int len) -@@ -589,13 +552,13 @@ - return 0; - } - --unsigned CLASS getbithuff (int nbits, ushort *huff) -+inline unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) - { -- static unsigned bitbuf=0; -- static int vbits=0, reset=0; -+/*RT static unsigned bitbuf=0; */ -+/*RT static int vbits=0, reset=0; */ - unsigned c; - -- if (nbits > 25) return 0; -+ if (UNLIKELY(nbits > 25)) return 0; - if (nbits < 0) - return bitbuf = vbits = reset = 0; - if (nbits == 0 || vbits < 0) return 0; -@@ -805,9 +768,13 @@ - FORC(2) free (huff[c]); - } - -+/* -+ Not a full implementation of Lossless JPEG, just -+ enough to decode Canon, Kodak and Adobe DNG images. -+ */ - struct jhead { -- int algo, bits, high, wide, clrs, sraw, psv, restart, vpred[6]; -- ushort quant[64], idct[64], *huff[20], *free[20], *row; -+ int bits, high, wide, clrs, sraw, psv, restart, vpred[6]; -+ ushort *huff[6], *free[4], *row; - }; - - int CLASS ljpeg_start (struct jhead *jh, int info_only) -@@ -828,9 +795,9 @@ - switch (tag) { - case 0xffc3: - jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; -- case 0xffc1: -+ case 0xffc1: - case 0xffc0: -- jh->algo = tag & 0xff; -+ jh->algo = tag & 0xff; - jh->bits = data[0]; - jh->high = data[1] << 8 | data[2]; - jh->wide = data[3] << 8 | data[4]; -@@ -862,7 +829,7 @@ - FORC(4) jh->huff[2+c] = jh->huff[1]; - FORC(jh->sraw) jh->huff[1+c] = jh->huff[0]; - } -- jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4); -+ jh->row = (ushort *) calloc (2 * jh->wide*jh->clrs, 4); - merror (jh->row, "ljpeg_start()"); - return zero_after_ff = 1; - } -@@ -874,7 +841,7 @@ - free (jh->row); - } - --int CLASS ljpeg_diff (ushort *huff) -+inline int CLASS ljpeg_diff (ushort *huff) - { - int len, diff; - -@@ -901,7 +868,7 @@ - } - getbits(-1); - } -- FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1); -+ FORC3 row[c] = (jh->row + ((jrow & 1) + 1) * (jh->wide*jh->clrs*((jrow+c) & 1))); - for (col=0; col < jh->wide; col++) - FORC(jh->clrs) { - diff = ljpeg_diff (jh->huff[c]); -@@ -909,8 +876,7 @@ - pred = spred; - else if (col) pred = row[0][-jh->clrs]; - else pred = (jh->vpred[c] += diff) - diff; -- if (jrow && col) switch (jh->psv) { -- case 1: break; -+ if (jh->psv != 1 && jrow && col) switch (jh->psv) { - case 2: pred = row[1][0]; break; - case 3: pred = row[1][-jh->clrs]; break; - case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break; -@@ -919,7 +885,7 @@ - case 7: pred = (pred + row[1][0]) >> 1; break; - default: pred = 0; - } -- if ((**row = pred + diff) >> jh->bits) derror(); -+ if (UNLIKELY((**row = pred + diff) >> jh->bits)) derror(); - if (c <= jh->sraw) spred = **row; - row[0]++; row[1]++; - } -@@ -928,22 +894,38 @@ - - void CLASS lossless_jpeg_load_raw() - { -- int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0; - struct jhead jh; -- ushort *rp; -+ int row=0, col=0; - - if (!ljpeg_start (&jh, 0)) return; -- jwide = jh.wide * jh.clrs; -- -- for (jrow=0; jrow < jh.high; jrow++) { -- rp = ljpeg_row (jrow, &jh); -+ int jwide = jh.wide * jh.clrs; -+ ushort *rp[2]; -+ rp[0] = ljpeg_row (0, &jh); -+ -+ for (int jrow=0; jrow < jh.high; jrow++) { -+#ifdef _OPENMP -+#pragma omp parallel sections -+#endif -+{ -+#ifdef _OPENMP -+ #pragma omp section -+#endif -+ { -+ if(jrow < jh.high - 1) -+ rp[(jrow + 1)&1] = ljpeg_row (jrow + 1, &jh); -+ } -+#ifdef _OPENMP -+ #pragma omp section -+#endif -+ { - if (load_flags & 1) - row = jrow & 1 ? height-1-jrow/2 : jrow/2; -- for (jcol=0; jcol < jwide; jcol++) { -- val = curve[*rp++]; -+ for (int jcol=0; jcol < jwide; jcol++) { -+ int val = curve[*rp[jrow&1]++]; - if (cr2_slice[0]) { -- jidx = jrow*jwide + jcol; -- i = jidx / (cr2_slice[1]*raw_height); -+ int jidx = jrow*jwide + jcol; -+ int i = jidx / (cr2_slice[1]*raw_height); -+ int j; - if ((j = i >= cr2_slice[0])) - i = cr2_slice[0]; - jidx -= i * (cr2_slice[1]*raw_height); -@@ -956,6 +938,8 @@ - if (++col >= raw_width) - col = (row++,0); - } -+ } -+} - } - ljpeg_end (&jh); - } -@@ -1124,8 +1108,7 @@ - if (++col >= tile_width || col >= raw_width) - row += 1 + (col = 0); - } -- } -- } -+ } } - fseek (ifp, save+4, SEEK_SET); - if ((tcol += tile_width) >= raw_width) - trow += tile_length + (tcol = 0); -@@ -1332,14 +1315,14 @@ - int i, nz; - char tail[424]; - -- fseek (ifp, -sizeof tail, SEEK_END); -+ fseek (ifp, -(int)sizeof tail, SEEK_END); - fread (tail, 1, sizeof tail, ifp); - for (nz=i=0; i < sizeof tail; i++) - if (tail[i]) nz++; - return nz > 20; - } - --void CLASS jpeg_thumb(); -+/*RT void CLASS jpeg_thumb(); */ - - void CLASS ppm_thumb() - { -@@ -1701,10 +1684,10 @@ - } - } - --unsigned CLASS ph1_bithuff (int nbits, ushort *huff) -+unsigned CLASS ph1_bithuff_t::operator() (int nbits, ushort *huff) - { -- static UINT64 bitbuf=0; -- static int vbits=0; -+/*RT static UINT64 bitbuf=0; */ -+/*RT static int vbits=0; */ - unsigned c; - - if (nbits == -1) -@@ -1779,6 +1762,338 @@ - maximum = 0xfffc - ph1.black; - } - -+void CLASS parse_hasselblad_gain() -+{ -+ /* -+ Reverse-engineer's notes: -+ -+ The Hasselblad gain tag (0x19 in makernotes) is only available in the 3FR format and -+ is applied and removed when Hasselblad Phocus converts it to the FFF format. It's -+ always 0x300000 bytes large regardless of (tested) model, not all space in it is -+ used though. -+ -+ It contains individual calibration information from the factory to tune the sensor -+ performance. -+ -+ There is more calibration data in the tag than what is applied in conversion to FFF, -+ I've only cared to figure out the data which is actually used, but have some leads on -+ remaining info. -+ -+ The format is not equal between all models. Due to lack of 3FR files (harder to get -+ than FFF) only a subset of the models have been reverse-engineered. -+ -+ The header space is 512 bytes and is a mix of 16 and 32 bit values. Offset to blocks -+ are 32 bit values, but all information seems to be encoded in 16 bit values. Many -+ values in the header can be zeroed with no effect on FFF conversion, and their -+ meaning, if any, have not been further investigated. -+ -+ Formats: -+ hdr16[22] = raw width -+ hdr16[23] = raw height -+ hdr32[24] = offset to level corr block -+ Data block format. Seems to differ depending on sensor type. For tested H4D-50 -+ and H3D-31: 10 16 bit signed values per row -+ value 0: a correction factor (k) used on even columns, where the new pixel value is -+ calulated as follows: -+ new_value = old_value + (2 * ((k * (old_value_on_row_above-256)) / 32767) - 2) -+ note the connection to the value on the row above, seems to be some sort of signal -+ leakage correction. -+ value 1: same as value 0 but using old value on row below instead of above -+ value 2-3: same as value 0-1 but for odd columns -+ value 4-9: has some effect if non-zero (probably similar to the others) but not -+ investigated which, as it's seems to be always zero for the tested cameras. -+ -+ hdr32[25] = probably offset to "bad/unreliable pixels" info, always 512 as it starts -+ directly after the header. Not applied in FFF conversion (at least -+ typically). -+ Data block format guess: raw_height packets of -+ -+ -+ hdr32[27] = offset to unknown data (bad colulmns?), of the form: -+ <0> -+ packet: . -+ -+ hdr32[34] = curves offset, seems to be A/D curves (one per channel) on newer models -+ and some sort of a film curve on older. Not applied in FFF conversion. -+ -+ hdr32[36] = flatfield correction, not available in older models. Data format: -+ <1><11 * 2 pad> -+ packet: -+ -+ The header pad is not zeroed and might seem to contain some sort of -+ information, but it makes no difference if set to zero. See -+ hasselblad_correct() how the flatfield is applied. -+ -+ Applied in FFF conversion is levels, flatfield correction, and the bad columns(?) -+ data. A/D curves are surprisingly not applied, maybe pre-applied in hardware and -+ only available as information? Levels are applied before flatfield, further -+ ordering has not been investigated. -+ -+ Not all combinations/models have been tested so there may be gaps. -+ -+ Most clipped pixels in a 3FR is at 65535, but there's also some at 65534. Both -+ are set to 65535 when calibrated, while 65533 is treated as a normal value. In -+ the calibration process smaller values can be scaled to 65534 (which should -+ not be seen as clipped). -+ */ -+ -+ ushort raw_h, count, ch_count, u16; -+ int i, offset; -+ off_t base; -+ -+ base = ftell(ifp); -+ fseek(ifp, 2 * 23, SEEK_CUR); -+ raw_h = get2(); -+ fseek(ifp, 48, SEEK_CUR); -+ offset = get4(); -+ hbd.levels = offset ? base + offset : 0; -+ fseek(ifp, 8, SEEK_CUR); -+ offset = get4(); -+ hbd.unknown1 = offset ? base + offset : 0; -+ fseek(ifp, 32, SEEK_CUR); -+ offset = get4(); -+ hbd.flatfield = offset ? base + offset : 0; -+} -+ -+void CLASS hasselblad_correct() -+{ -+ unsigned col, row; -+ -+ /* -+ -+ This function applies 3FR calibration data. At the time of writing it supports a -+ subset, so here's a todo list: -+ -+ TODO: -+ - Support all gain tag formats -+ - The 0x19 tag varies a bit between models. We don't have parsers for all models. -+ - The reference model used was during inital reverse-engineering was a H4D-50, -+ we probably support the Hasselblads with Kodak 31, 39, 40 and 50 megapixels -+ well, but more work is needed for Kodak 16 and 22, Dalsa 60 and Sony 50. -+ - Apply bad column(?) data (hbd.unknown1) -+ - It was left out in this initial release since the effect is very small. -+ - Apply black(?) data, tag 0x1a and 0x1b is not parsed, it has however marginal -+ effect (at least for shorter exposures) so it's not too important. -+ -+ While there are things to do, the current implementation supports the most -+ important aspects, the faltfield and levels calibrations applied can have strong -+ visible effects. -+ -+ */ -+ -+ if (hbd.levels) { -+ int i; -+ fseek(ifp, hbd.levels, SEEK_SET); -+ /* skip the first set (not used as we don't apply on first/last row), we look at it though to see if -+ the levels format is one that we support (there are other formats on some models which is not -+ supported here) */ -+ short test[10]; -+ for (i = 0; i < 10; i++) test[i] = (short)get2(); -+ if (test[5] == 0 && test[6] == 0 && test[7] == 0 && test[8] == 0 && test[9] == 0) { -+ int corr[4]; -+ ushort *row_above = (ushort *)malloc(sizeof(ushort) * raw_width); // we need to cache row above as we write new values as we go -+ for (col = 0; col < raw_width; col++) row_above[col] = RAW(0,col); -+ for (row = 1; row < raw_height-1; row++) { -+ for (i = 0; i < 4; i++) corr[i] = (short)get2(); -+ fseek(ifp, 6 * 2, SEEK_CUR); -+ for (col = 0; col < raw_width; col++) { -+ unsigned v = RAW(row,col); -+ if (v >= 65534) { -+ v = 65535; -+ } else { -+ if (corr[((col & 1)<<1)+0] && row_above[col] > black) v += 2 * ((corr[((col & 1)<<1)+0] * (row_above[col]-(int)black)) / 32767) - 2; -+ if (corr[((col & 1)<<1)+1] && RAW(row+1,col) > black) v += 2 * ((corr[((col & 1)<<1)+1] * (RAW(row+1,col)-(int)black)) / 32767) - 2; -+ } -+ row_above[col] = RAW(row,col); -+ RAW(row,col) = CLIP(v); -+ } -+ } -+ free(row_above); -+ } -+ } -+ -+ if (hbd.flatfield) { -+ int bw, bh, ffrows, ffcols, i, c; -+ ushort ref[4], ref_max; -+ fseek(ifp, hbd.flatfield, SEEK_SET); -+ get2(); -+ bw = get2(); -+ bh = get2(); -+ ffcols = get2(); -+ ffrows = get2(); -+ fseek(ifp, hbd.flatfield + 16 * 2, SEEK_SET); -+ -+ ushort *ffmap = (ushort *)malloc(sizeof(*ffmap) * 4 * ffcols * ffrows); -+ for (i = 0; i < 4 * ffcols * ffrows; i++) ffmap[i] = get2(); -+ -+ /* Get reference values from center of field. This seems to be what Phocus does too, -+ but haven't cared to figure out exactly at which coordinate */ -+ i = 4 * (ffcols * ffrows / 2 + ffcols / 2); -+ ref[0] = ffmap[i+0]; -+ ref[1] = ffmap[i+1]; -+ ref[3] = ffmap[i+2]; // G2 = index 3 in dcraw, 2 in 3FR -+ ref[2] = ffmap[i+3]; -+ ref_max = 0; -+ FORC4 if (ref[c] > ref_max) ref_max = ref[c]; -+ if (ref_max == 0) ref[0] = ref[1] = ref[2] = ref[3] = ref_max = 10000; -+ -+ /* Convert measured flatfield values to actual multipliers. The measured flatfield -+ can have vignetting which should be normalized, only color cast should be corrected. */ -+ for (i = 0; i < 4 * ffcols * ffrows; i += 4) { -+ double base, min = 65535.0, max = 0; -+ double cur[4]; -+ cur[0] = (double)ffmap[i+0] / ref[0]; -+ cur[1] = (double)ffmap[i+1] / ref[1]; -+ cur[3] = (double)ffmap[i+2] / ref[3]; // G2 index differs in dcraw and 3FR -+ cur[2] = (double)ffmap[i+3] / ref[2]; -+ FORC4 { -+ if (cur[c] < min) min = cur[c]; -+ if (cur[c] > max) max = cur[c]; -+ } -+ if (max == 0) max = 1.0; -+ base = (cur[0]+cur[1]+cur[2]+cur[3])/(max*4); -+ FORC4 cur[c] = cur[c] == 0 ? 1.0 : (base * max) / cur[c]; -+ /* convert to integer multiplier and store back to ffmap, we limit -+ range to 4 (16384*4) which should be fine for flatfield */ -+ FORC4 { -+ cur[c] *= 16384.0; -+ if (cur[c] > 65535.0) cur[c] = 65535.0; -+ ffmap[i+c] = (ushort)cur[c]; -+ } -+ } -+ -+ // of the cameras we've tested we know the exact placement of the flatfield map -+ int row_offset, col_offset; -+ switch (raw_width) { -+ case 8282: // 50 megapixel Kodak -+ row_offset = 21; -+ col_offset = 71; -+ break; -+ default: -+ /* Default case for camera models we've not tested. We center the map, which may -+ not be exactly where it should be but close enough for the smooth flatfield */ -+ row_offset = (raw_height - bh * ffrows) / 2; -+ col_offset = (raw_width - bw * ffcols) / 2; -+ break; -+ } -+ -+ /* -+ Concerning smoothing between blocks in the map Phocus makes it only vertically, -+ probably because it's simpler and faster. Looking at actual flatfield data it seems -+ like it's better to smooth in both directions. Possibly flatfield could be used for -+ correcting tiling on Dalsa sensors (H4D-60) like partly done in Phase One IIQ format, -+ and then sharp edges may be beneficial at least at the tiling seams, but at the time -+ of writing I've had no H4D-60 3FR files to test with to verify that. -+ -+ Meanwhile we do both vertical and horizontal smoothing/blurring. -+ */ -+ -+ /* pre-calculate constants for blurring. We probably should make a more efficient -+ blur than this, but this does not need any buffer and makes nice-looking -+ radial gradients */ -+ ushort *corners_weight = (ushort *)malloc(bw*bh*9*sizeof(*corners_weight)); -+ const int corners_mix[9][4][2] = { { {0,0}, {0,1}, {1,0}, {1,1} }, -+ { {0,1}, {1,1}, {-1,-1}, {-1,-1} }, -+ { {0,1}, {0,2}, {1,1}, {1,2} }, -+ { {1,0}, {1,1}, {-1,-1}, {-1,-1} }, -+ { {1,1}, {-1,-1}, {-1,-1}, {-1,-1} }, -+ { {1,1}, {1,2}, {-1,-1}, {-1,-1} }, -+ { {1,0}, {1,1}, {2,0}, {2,1} }, -+ { {1,1}, {2,1}, {-1,-1}, {-1,-1} }, -+ { {1,1}, {1,2}, {2,1}, {2,2} } }; -+ const ushort corners_shift[9] = { 2, 1, 2, 1, 0, 1, 2, 1, 2 }; -+ for (row = 0; row < bh; row++) { -+ const ushort maxdist = bw < bh ? bw/2-1 : bh/2-1; -+ const unsigned bwu = (unsigned)bw; -+ const unsigned bhu = (unsigned)bh; -+ const unsigned corners[9][2] = {{0,0}, {0,bwu/2}, {0,bwu-1}, -+ {bhu/2,0},{bhu/2,bwu/2},{bhu/2,bwu-1}, -+ {bhu-1,0},{bhu-1,bwu/2},{bhu-1,bwu-1}}; -+ for (col = 0; col < bw; col++) { -+ for (i = 0; i < 9; i++) { -+ ushort dist = (ushort)sqrt(abs(corners[i][0] - row) * abs(corners[i][0] - row) + abs(corners[i][1] - col) * abs(corners[i][1] - col)); -+ ushort weight = dist > maxdist ? 0 : maxdist - dist; -+ corners_weight[9*(row*bw+col)+i] = weight; -+ } -+ } -+ } -+ -+ // apply flatfield -+#pragma omp parallel for -+ for (int row = 0; row < raw_height; row++) { -+ int ffs, cur_ffr, i, c; -+ if (row < row_offset) { -+ cur_ffr = row_offset; -+ ffs = 0; -+ } else if (row >= row_offset + ffrows * bh) { -+ cur_ffr = row_offset + (ffrows-1) * bh; -+ ffs = 4 * ffcols * (ffrows-1); -+ } else { -+ cur_ffr = row_offset + bh * ((row - row_offset) / bh); -+ ffs = 4 * ffcols * ((row - row_offset) / bh); -+ } -+ int next_ffc = 0, cur_ffc = col_offset; -+ int ffc = ffs; -+ ushort *cur[3][3]; // points to local ffmap entries with center at cur[1][1] -+ for (int col = 0; col < raw_width; col++) { -+ if (col == next_ffc) { -+ int rowsub = ffs == 0 ? 0 : ffcols*4; -+ int rowadd = ffs == 4 * ffcols * (ffrows-1) ? 0 : ffcols * 4; -+ int colsub = ffc == ffs ? 0 : 4; -+ int coladd = ffc == ffs + 4 * (ffcols-1) ? 0 : 4; -+ if (col != 0) cur_ffc = next_ffc; -+ else next_ffc += col_offset; -+ next_ffc += bw; -+ -+ cur[0][0] = &ffmap[ffc-rowsub-colsub]; -+ cur[0][1] = &ffmap[ffc-rowsub]; -+ cur[0][2] = &ffmap[ffc-rowsub+coladd]; -+ -+ cur[1][0] = &ffmap[ffc-colsub]; -+ cur[1][1] = &ffmap[ffc]; -+ cur[1][2] = &ffmap[ffc+coladd]; -+ -+ cur[2][0] = &ffmap[ffc+rowadd-colsub]; -+ cur[2][1] = &ffmap[ffc+rowadd]; -+ cur[2][2] = &ffmap[ffc+rowadd+coladd]; -+ -+ ffc += 4; -+ if (ffc == ffs + 4 * ffcols) next_ffc += raw_width; // last col in map, avoid stepping further -+ } -+ unsigned v = RAW(row,col); -+ if (v > black && v < 65535) { -+ c = FC(row,col); -+ unsigned x = col < cur_ffc ? 0 : col - cur_ffc; -+ unsigned y = row < cur_ffr ? 0 : row - cur_ffr; -+ if (x >= bw) x = bw-1; -+ if (y >= bh) y = bh-1; -+ unsigned wsum = 0; -+ unsigned mul = 0; -+ for (i = 0; i < 9; i++) { -+ ushort cw = corners_weight[9*(y*bw+x)+i]; -+ if (cw) { -+ unsigned m = 0; -+ int j; -+ for (j = 0; j < 1 << corners_shift[i]; j++) { -+ int cr = corners_mix[i][j][0], cc = corners_mix[i][j][1]; -+ m += cur[cr][cc][c]; -+ } -+ m >>= corners_shift[i]; -+ mul += m * cw; -+ wsum += cw; -+ } -+ } -+ mul /= wsum; -+ v = black + ((v-black) * mul) / 16384; -+ RAW(row,col) = v > 65535 ? 65535 : v; -+ } -+ } -+ } -+ free(ffmap); -+ free(corners_weight); -+ } -+} -+ - void CLASS hasselblad_load_raw() - { - struct jhead jh; -@@ -2002,10 +2317,10 @@ - maximum = curve[0x3ff]; - } - --unsigned CLASS pana_bits (int nbits) -+unsigned CLASS pana_bits_t::operator() (int nbits) - { -- static uchar buf[0x4000]; -- static int vbits; -+/*RT static uchar buf[0x4000]; */ -+/*RT static int vbits;*/ - int byte; - - if (!nbits) return vbits=0; -@@ -2188,7 +2503,7 @@ - - void CLASS kodak_radc_load_raw() - { -- static const char src[] = { -+ static const signed char src[] = { - 1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8, - 1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8, - 2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8, -@@ -2294,11 +2609,11 @@ - METHODDEF(boolean) - fill_input_buffer (j_decompress_ptr cinfo) - { -- static uchar jpeg_buffer[4096]; -+/*RT static uchar jpeg_buffer[4096]; */ - size_t nbytes; - - nbytes = fread (jpeg_buffer, 1, 4096, ifp); -- swab (jpeg_buffer, jpeg_buffer, nbytes); -+ swab ((char*)jpeg_buffer, (char*)jpeg_buffer, nbytes); - cinfo->src->next_input_byte = jpeg_buffer; - cinfo->src->bytes_in_buffer = nbytes; - return TRUE; -@@ -2648,10 +2963,9 @@ - maximum = (1 << (thumb_misc & 31)) - 1; - } - --void CLASS sony_decrypt (unsigned *data, int len, int start, int key) -+void CLASS sony_decrypt_t::operator()(unsigned *data, int len, int start, int key) - { -- static unsigned pad[128], p; -- -+/*RT static unsigned pad[128], p;*/ - if (start) { - for (p=0; p < 4; p++) - pad[p] = key = key * 48828125 + 1; -@@ -2736,11 +3050,13 @@ - bit += 7; - } - for (i=0; i < 16; i++, col+=2) -- RAW(row,col) = curve[pix[i] << 1] >> 2; -+ RAW(row,col) = curve[pix[i] << 1]; // >> 2; RT: disabled shifting to avoid precision loss - col -= col & 1 ? 1:31; - } - } - free (data); -+ maximum = curve[0x7ff << 1]; // RT: fix maximum. -+ maximum = 16300; // RT: conservative white level tested on various ARW2 cameras. This constant was set in 2013-12-17, may need re-evaluation in the future. - } - - void CLASS samsung_load_raw() -@@ -2905,7 +3221,10 @@ - diff = diff ? -diff : 0x80; - if (ftell(ifp) + 12 >= seg[1][1]) - diff = 0; -- raw_image[pix] = pred[pix & 1] += diff; -+ if(pix>=raw_width*raw_height) -+ derror(); -+ else -+ raw_image[pix] = pred[pix & 1] += diff; - if (!(pix & 1) && HOLE(pix / raw_width)) pix += 2; - } - maximum = 0xff; -@@ -3038,7 +3357,7 @@ - - void CLASS foveon_decoder (unsigned size, unsigned code) - { -- static unsigned huff[1024]; -+/*RT static unsigned huff[1024];*/ - struct decode *cur; - int i, len; - -@@ -3135,7 +3454,7 @@ - pred[c] += diff[dindex->leaf]; - if (pred[c] >> 16 && ~pred[c] >> 16) derror(); - } -- FORC3 image[row*width+col][c] = pred[c]; -+ FORC3 image[row*width+col][c] = pred[c] < 0 ? 0 : pred[c]; - } - } - } -@@ -3746,6 +4065,8 @@ - if (load_raw == &CLASS phase_one_load_raw || - load_raw == &CLASS phase_one_load_raw_c) - phase_one_correct(); -+ if (load_raw == &CLASS hasselblad_load_raw) // RT -+ hasselblad_correct(); // RT - if (fuji_width) { - for (row=0; row < raw_height-top_margin*2; row++) { - for (col=0; col < fuji_width << !fuji_layout; col++) { -@@ -3761,10 +4082,13 @@ - } - } - } else { -- for (row=0; row < height; row++) -- for (col=0; col < width; col++) -+ -+#pragma omp parallel for -+ for (int row=0; row < height; row++) -+ for (int col=0; col < width; col++) - BAYER2(row,col) = RAW(row+top_margin,col+left_margin); - } -+ - if (mask[0][3] > 0) goto mask_set; - if (load_raw == &CLASS canon_load_raw || - load_raw == &CLASS lossless_jpeg_load_raw) { -@@ -3808,127 +4132,127 @@ - } - } - --void CLASS remove_zeroes() --{ -- unsigned row, col, tot, n, r, c; -- -- for (row=0; row < height; row++) -- for (col=0; col < width; col++) -- if (BAYER(row,col) == 0) { -- tot = n = 0; -- for (r = row-2; r <= row+2; r++) -- for (c = col-2; c <= col+2; c++) -- if (r < height && c < width && -- FC(r,c) == FC(row,col) && BAYER(r,c)) -- tot += (n++,BAYER(r,c)); -- if (n) BAYER(row,col) = tot/n; -- } --} -+//void CLASS remove_zeroes() -+//{ -+// unsigned row, col, tot, n, r, c; -+// -+// for (row=0; row < height; row++) -+// for (col=0; col < width; col++) -+// if (BAYER(row,col) == 0) { -+// tot = n = 0; -+// for (r = row-2; r <= row+2; r++) -+// for (c = col-2; c <= col+2; c++) -+// if (r < height && c < width && -+// FC(r,c) == FC(row,col) && BAYER(r,c)) -+// tot += (n++,BAYER(r,c)); -+// if (n) BAYER(row,col) = tot/n; -+// } -+//} - - /* - Seach from the current directory up to the root looking for - a ".badpixels" file, and fix those pixels now. - */ --void CLASS bad_pixels (const char *cfname) --{ -- FILE *fp=0; -- char *fname, *cp, line[128]; -- int len, time, row, col, r, c, rad, tot, n, fixed=0; -- -- if (!filters) return; -- if (cfname) -- fp = fopen (cfname, "r"); -- else { -- for (len=32 ; ; len *= 2) { -- fname = (char *) malloc (len); -- if (!fname) return; -- if (getcwd (fname, len-16)) break; -- free (fname); -- if (errno != ERANGE) return; -- } --#if defined(WIN32) || defined(DJGPP) -- if (fname[1] == ':') -- memmove (fname, fname+2, len-2); -- for (cp=fname; *cp; cp++) -- if (*cp == '\\') *cp = '/'; --#endif -- cp = fname + strlen(fname); -- if (cp[-1] == '/') cp--; -- while (*fname == '/') { -- strcpy (cp, "/.badpixels"); -- if ((fp = fopen (fname, "r"))) break; -- if (cp == fname) break; -- while (*--cp != '/'); -- } -- free (fname); -- } -- if (!fp) return; -- while (fgets (line, 128, fp)) { -- cp = strchr (line, '#'); -- if (cp) *cp = 0; -- if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue; -- if ((unsigned) col >= width || (unsigned) row >= height) continue; -- if (time > timestamp) continue; -- for (tot=n=0, rad=1; rad < 3 && n==0; rad++) -- for (r = row-rad; r <= row+rad; r++) -- for (c = col-rad; c <= col+rad; c++) -- if ((unsigned) r < height && (unsigned) c < width && -- (r != row || c != col) && fcol(r,c) == fcol(row,col)) { -- tot += BAYER2(r,c); -- n++; -- } -- BAYER2(row,col) = tot/n; -- if (verbose) { -- if (!fixed++) -- fprintf (stderr,_("Fixed dead pixels at:")); -- fprintf (stderr, " %d,%d", col, row); -- } -- } -- if (fixed) fputc ('\n', stderr); -- fclose (fp); --} -- --void CLASS subtract (const char *fname) --{ -- FILE *fp; -- int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col; -- ushort *pixel; -- -- if (!(fp = fopen (fname, "rb"))) { -- perror (fname); return; -- } -- if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1; -- while (!error && nd < 3 && (c = fgetc(fp)) != EOF) { -- if (c == '#') comment = 1; -- if (c == '\n') comment = 0; -- if (comment) continue; -- if (isdigit(c)) number = 1; -- if (number) { -- if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0'; -- else if (isspace(c)) { -- number = 0; nd++; -- } else error = 1; -- } -- } -- if (error || nd < 3) { -- fprintf (stderr,_("%s is not a valid PGM file!\n"), fname); -- fclose (fp); return; -- } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) { -- fprintf (stderr,_("%s has the wrong dimensions!\n"), fname); -- fclose (fp); return; -- } -- pixel = (ushort *) calloc (width, sizeof *pixel); -- merror (pixel, "subtract()"); -- for (row=0; row < height; row++) { -- fread (pixel, 2, width, fp); -- for (col=0; col < width; col++) -- BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0); -- } -- free (pixel); -- fclose (fp); -- memset (cblack, 0, sizeof cblack); -- black = 0; --} -+//void CLASS bad_pixels (const char *cfname) -+//{ -+// FILE *fp=0; -+// char *fname, *cp, line[128]; -+// int len, time, row, col, r, c, rad, tot, n, fixed=0; -+// -+// if (!filters) return; -+// if (cfname) -+// fp = fopen (cfname, "r"); -+// else { -+// for (len=32 ; ; len *= 2) { -+// fname = (char *) malloc (len); -+// if (!fname) return; -+// if (getcwd (fname, len-16)) break; -+// free (fname); -+// if (errno != ERANGE) return; -+// } -+//#if defined(WIN32) || defined(DJGPP) -+// if (fname[1] == ':') -+// memmove (fname, fname+2, len-2); -+// for (cp=fname; *cp; cp++) -+// if (*cp == '\\') *cp = '/'; -+//#endif -+// cp = fname + strlen(fname); -+// if (cp[-1] == '/') cp--; -+// while (*fname == '/') { -+// strcpy (cp, "/.badpixels"); -+// if ((fp = fopen (fname, "r"))) break; -+// if (cp == fname) break; -+// while (*--cp != '/'); -+// } -+// free (fname); -+// } -+// if (!fp) return; -+// while (fgets (line, 128, fp)) { -+// cp = strchr (line, '#'); -+// if (cp) *cp = 0; -+// if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue; -+// if ((unsigned) col >= width || (unsigned) row >= height) continue; -+// if (time > timestamp) continue; -+// for (tot=n=0, rad=1; rad < 3 && n==0; rad++) -+// for (r = row-rad; r <= row+rad; r++) -+// for (c = col-rad; c <= col+rad; c++) -+// if ((unsigned) r < height && (unsigned) c < width && -+// (r != row || c != col) && fcol(r,c) == fcol(row,col)) { -+// tot += BAYER2(r,c); -+// n++; -+// } -+// BAYER2(row,col) = tot/n; -+// if (verbose) { -+// if (!fixed++) -+// fprintf (stderr,_("Fixed dead pixels at:")); -+// fprintf (stderr, " %d,%d", col, row); -+// } -+// } -+// if (fixed) fputc ('\n', stderr); -+// fclose (fp); -+//} -+ -+//void CLASS subtract (const char *fname) -+//{ -+// FILE *fp; -+// int dim[3]={0,0,0}, comment=0, number=0, error=0, nd=0, c, row, col; -+// ushort *pixel; -+// -+// if (!(fp = fopen (fname, "rb"))) { -+// perror (fname); return; -+// } -+// if (fgetc(fp) != 'P' || fgetc(fp) != '5') error = 1; -+// while (!error && nd < 3 && (c = fgetc(fp)) != EOF) { -+// if (c == '#') comment = 1; -+// if (c == '\n') comment = 0; -+// if (comment) continue; -+// if (isdigit(c)) number = 1; -+// if (number) { -+// if (isdigit(c)) dim[nd] = dim[nd]*10 + c -'0'; -+// else if (isspace(c)) { -+// number = 0; nd++; -+// } else error = 1; -+// } -+// } -+// if (error || nd < 3) { -+// fprintf (stderr,_("%s is not a valid PGM file!\n"), fname); -+// fclose (fp); return; -+// } else if (dim[0] != width || dim[1] != height || dim[2] != 65535) { -+// fprintf (stderr,_("%s has the wrong dimensions!\n"), fname); -+// fclose (fp); return; -+// } -+// pixel = (ushort *) calloc (width, sizeof *pixel); -+// merror (pixel, "subtract()"); -+// for (row=0; row < height; row++) { -+// fread (pixel, 2, width, fp); -+// for (col=0; col < width; col++) -+// BAYER(row,col) = MAX (BAYER(row,col) - ntohs(pixel[col]), 0); -+// } -+// free (pixel); -+// fclose (fp); -+// memset (cblack, 0, sizeof cblack); -+// black = 0; -+//} - - void CLASS gamma_curve (double pwr, double ts, int mode, int imax) - { -@@ -4093,94 +4417,94 @@ - } - #endif - --void CLASS hat_transform (float *temp, float *base, int st, int size, int sc) --{ -- int i; -- for (i=0; i < sc; i++) -- temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)]; -- for (; i+sc < size; i++) -- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)]; -- for (; i < size; i++) -- temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))]; --} -- --void CLASS wavelet_denoise() --{ -- float *fimg=0, *temp, thold, mul[2], avg, diff; -- int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2]; -- ushort *window[4]; -- static const float noise[] = -- { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 }; -- -- if (verbose) fprintf (stderr,_("Wavelet denoising...\n")); -- -- while (maximum << scale < 0x10000) scale++; -- maximum <<= --scale; -- black <<= scale; -- FORC4 cblack[c] <<= scale; -- if ((size = iheight*iwidth) < 0x15550000) -- fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg); -- merror (fimg, "wavelet_denoise()"); -- temp = fimg + size*3; -- if ((nc = colors) == 3 && filters) nc++; -- FORC(nc) { /* denoise R,G1,B,G3 individually */ -- for (i=0; i < size; i++) -- fimg[i] = 256 * sqrt(image[i][c] << scale); -- for (hpass=lev=0; lev < 5; lev++) { -- lpass = size*((lev & 1)+1); -- for (row=0; row < iheight; row++) { -- hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev); -- for (col=0; col < iwidth; col++) -- fimg[lpass + row*iwidth + col] = temp[col] * 0.25; -- } -- for (col=0; col < iwidth; col++) { -- hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev); -- for (row=0; row < iheight; row++) -- fimg[lpass + row*iwidth + col] = temp[row] * 0.25; -- } -- thold = threshold * noise[lev]; -- for (i=0; i < size; i++) { -- fimg[hpass+i] -= fimg[lpass+i]; -- if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold; -- else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold; -- else fimg[hpass+i] = 0; -- if (hpass) fimg[i] += fimg[hpass+i]; -- } -- hpass = lpass; -- } -- for (i=0; i < size; i++) -- image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000); -- } -- if (filters && colors == 3) { /* pull G1 and G3 closer together */ -- for (row=0; row < 2; row++) { -- mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1]; -- blk[row] = cblack[FC(row,0) | 1]; -- } -- for (i=0; i < 4; i++) -- window[i] = (ushort *) fimg + width*i; -- for (wlast=-1, row=1; row < height-1; row++) { -- while (wlast < row+1) { -- for (wlast++, i=0; i < 4; i++) -- window[(i+3) & 3] = window[i]; -- for (col = FC(wlast,1) & 1; col < width; col+=2) -- window[2][col] = BAYER(wlast,col); -- } -- thold = threshold/512; -- for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) { -- avg = ( window[0][col-1] + window[0][col+1] + -- window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 ) -- * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5; -- avg = avg < 0 ? 0 : sqrt(avg); -- diff = sqrt(BAYER(row,col)) - avg; -- if (diff < -thold) diff += thold; -- else if (diff > thold) diff -= thold; -- else diff = 0; -- BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5); -- } -- } -- } -- free (fimg); --} -+//void CLASS hat_transform (float *temp, float *base, int st, int size, int sc) -+//{ -+// int i; -+// for (i=0; i < sc; i++) -+// temp[i] = 2*base[st*i] + base[st*(sc-i)] + base[st*(i+sc)]; -+// for (; i+sc < size; i++) -+// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(i+sc)]; -+// for (; i < size; i++) -+// temp[i] = 2*base[st*i] + base[st*(i-sc)] + base[st*(2*size-2-(i+sc))]; -+//} -+ -+//void CLASS wavelet_denoise() -+//{ -+// float *fimg=0, *temp, thold, mul[2], avg, diff; -+// int scale=1, size, lev, hpass, lpass, row, col, nc, c, i, wlast, blk[2]; -+// ushort *window[4]; -+// static const float noise[] = -+// { 0.8002,0.2735,0.1202,0.0585,0.0291,0.0152,0.0080,0.0044 }; -+// -+// if (verbose) fprintf (stderr,_("Wavelet denoising...\n")); -+// -+// while (maximum << scale < 0x10000) scale++; -+// maximum <<= --scale; -+// black <<= scale; -+// FORC4 cblack[c] <<= scale; -+// if ((size = iheight*iwidth) < 0x15550000) -+// fimg = (float *) malloc ((size*3 + iheight + iwidth) * sizeof *fimg); -+// merror (fimg, "wavelet_denoise()"); -+// temp = fimg + size*3; -+// if ((nc = colors) == 3 && filters) nc++; -+// FORC(nc) { /* denoise R,G1,B,G3 individually */ -+// for (i=0; i < size; i++) -+// fimg[i] = 256 * sqrt(image[i][c] << scale); -+// for (hpass=lev=0; lev < 5; lev++) { -+// lpass = size*((lev & 1)+1); -+// for (row=0; row < iheight; row++) { -+// hat_transform (temp, fimg+hpass+row*iwidth, 1, iwidth, 1 << lev); -+// for (col=0; col < iwidth; col++) -+// fimg[lpass + row*iwidth + col] = temp[col] * 0.25; -+// } -+// for (col=0; col < iwidth; col++) { -+// hat_transform (temp, fimg+lpass+col, iwidth, iheight, 1 << lev); -+// for (row=0; row < iheight; row++) -+// fimg[lpass + row*iwidth + col] = temp[row] * 0.25; -+// } -+// thold = threshold * noise[lev]; -+// for (i=0; i < size; i++) { -+// fimg[hpass+i] -= fimg[lpass+i]; -+// if (fimg[hpass+i] < -thold) fimg[hpass+i] += thold; -+// else if (fimg[hpass+i] > thold) fimg[hpass+i] -= thold; -+// else fimg[hpass+i] = 0; -+// if (hpass) fimg[i] += fimg[hpass+i]; -+// } -+// hpass = lpass; -+// } -+// for (i=0; i < size; i++) -+// image[i][c] = CLIP(SQR(fimg[i]+fimg[lpass+i])/0x10000); -+// } -+// if (filters && colors == 3) { /* pull G1 and G3 closer together */ -+// for (row=0; row < 2; row++) { -+// mul[row] = 0.125 * pre_mul[FC(row+1,0) | 1] / pre_mul[FC(row,0) | 1]; -+// blk[row] = cblack[FC(row,0) | 1]; -+// } -+// for (i=0; i < 4; i++) -+// window[i] = (ushort *) fimg + width*i; -+// for (wlast=-1, row=1; row < height-1; row++) { -+// while (wlast < row+1) { -+// for (wlast++, i=0; i < 4; i++) -+// window[(i+3) & 3] = window[i]; -+// for (col = FC(wlast,1) & 1; col < width; col+=2) -+// window[2][col] = BAYER(wlast,col); -+// } -+// thold = threshold/512; -+// for (col = (FC(row,0) & 1)+1; col < width-1; col+=2) { -+// avg = ( window[0][col-1] + window[0][col+1] + -+// window[2][col-1] + window[2][col+1] - blk[~row & 1]*4 ) -+// * mul[row & 1] + (window[1][col] + blk[row & 1]) * 0.5; -+// avg = avg < 0 ? 0 : sqrt(avg); -+// diff = sqrt(BAYER(row,col)) - avg; -+// if (diff < -thold) diff += thold; -+// else if (diff > thold) diff -= thold; -+// else diff = 0; -+// BAYER(row,col) = CLIP(SQR(avg+diff) + 0.5); -+// } -+// } -+// } -+// free (fimg); -+//} - - void CLASS scale_colors() - { -@@ -4238,7 +4562,7 @@ - if (pre_mul[3] == 0) pre_mul[3] = colors < 4 ? pre_mul[1] : 1; - dark = black; - sat = maximum; -- if (threshold) wavelet_denoise(); -+// if (threshold) wavelet_denoise(); - maximum -= black; - for (dmin=DBL_MAX, dmax=c=0; c < 4; c++) { - if (dmin > pre_mul[c]) -@@ -4344,776 +4668,440 @@ - if (half_size) filters = 0; - } - --void CLASS border_interpolate (int border) --{ -- unsigned row, col, y, x, f, c, sum[8]; -- -- for (row=0; row < height; row++) -- for (col=0; col < width; col++) { -- if (col==border && row >= border && row < height-border) -- col = width-border; -- memset (sum, 0, sizeof sum); -- for (y=row-1; y != row+2; y++) -- for (x=col-1; x != col+2; x++) -- if (y < height && x < width) { -- f = fcol(y,x); -- sum[f] += image[y*width+x][f]; -- sum[f+4]++; -- } -- f = fcol(row,col); -- FORCC if (c != f && sum[c+4]) -- image[row*width+col][c] = sum[c] / sum[c+4]; -- } --} -- --void CLASS lin_interpolate() --{ -- int code[16][16][32], size=16, *ip, sum[4]; -- int f, c, i, x, y, row, col, shift, color; -- ushort *pix; -- -- if (verbose) fprintf (stderr,_("Bilinear interpolation...\n")); -- if (filters == 9) size = 6; -- border_interpolate(1); -- for (row=0; row < size; row++) -- for (col=0; col < size; col++) { -- ip = code[row][col]+1; -- f = fcol(row,col); -- memset (sum, 0, sizeof sum); -- for (y=-1; y <= 1; y++) -- for (x=-1; x <= 1; x++) { -- shift = (y==0) + (x==0); -- color = fcol(row+y,col+x); -- if (color == f) continue; -- *ip++ = (width*y + x)*4 + color; -- *ip++ = shift; -- *ip++ = color; -- sum[color] += 1 << shift; -- } -- code[row][col][0] = (ip - code[row][col]) / 3; -- FORCC -- if (c != f) { -- *ip++ = c; -- *ip++ = 256 / sum[c]; -- } -- } -- for (row=1; row < height-1; row++) -- for (col=1; col < width-1; col++) { -- pix = image[row*width+col]; -- ip = code[row % size][col % size]; -- memset (sum, 0, sizeof sum); -- for (i=*ip++; i--; ip+=3) -- sum[ip[2]] += pix[ip[0]] << ip[1]; -- for (i=colors; --i; ip+=2) -- pix[ip[0]] = sum[ip[0]] * ip[1] >> 8; -- } --} -- --/* -- This algorithm is officially called: -- -- "Interpolation using a Threshold-based variable number of gradients" -- -- described in http://scien.stanford.edu/pages/labsite/1999/psych221/projects/99/tingchen/algodep/vargra.html -- -- I've extended the basic idea to work with non-Bayer filter arrays. -- Gradients are numbered clockwise from NW=0 to W=7. -- */ --void CLASS vng_interpolate() --{ -- static const signed char *cp, terms[] = { -- -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01, -- -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01, -- -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03, -- -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06, -- -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04, -- -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01, -- -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40, -- -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11, -- -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11, -- -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22, -- -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44, -- -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10, -- -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04, -- +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40, -- +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20, -- +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08, -- +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20, -- +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44, -- +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60, -- +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80, -- +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40, -- +1,+0,+2,+1,0,0x10 -- }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 }; -- ushort (*brow[5])[4], *pix; -- int prow=8, pcol=2, *ip, *code[16][16], gval[8], gmin, gmax, sum[4]; -- int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; -- int g, diff, thold, num, c; -- -- lin_interpolate(); -- if (verbose) fprintf (stderr,_("VNG interpolation...\n")); -- -- if (filters == 1) prow = pcol = 16; -- if (filters == 9) prow = pcol = 6; -- ip = (int *) calloc (prow*pcol, 1280); -- merror (ip, "vng_interpolate()"); -- for (row=0; row < prow; row++) /* Precalculate for VNG */ -- for (col=0; col < pcol; col++) { -- code[row][col] = ip; -- for (cp=terms, t=0; t < 64; t++) { -- y1 = *cp++; x1 = *cp++; -- y2 = *cp++; x2 = *cp++; -- weight = *cp++; -- grads = *cp++; -- color = fcol(row+y1,col+x1); -- if (fcol(row+y2,col+x2) != color) continue; -- diag = (fcol(row,col+1) == color && fcol(row+1,col) == color) ? 2:1; -- if (abs(y1-y2) == diag && abs(x1-x2) == diag) continue; -- *ip++ = (y1*width + x1)*4 + color; -- *ip++ = (y2*width + x2)*4 + color; -- *ip++ = weight; -- for (g=0; g < 8; g++) -- if (grads & 1< gval[g]) gmin = gval[g]; -- if (gmax < gval[g]) gmax = gval[g]; -- } -- if (gmax == 0) { -- memcpy (brow[2][col], pix, sizeof *image); -- continue; -- } -- thold = gmin + (gmax >> 1); -- memset (sum, 0, sizeof sum); -- color = fcol(row,col); -- for (num=g=0; g < 8; g++,ip+=2) { /* Average the neighbors */ -- if (gval[g] <= thold) { -- FORCC -- if (c == color && ip[1]) -- sum[c] += (pix[c] + pix[ip[1]]) >> 1; -- else -- sum[c] += pix[ip[0] + c]; -- num++; -- } -- } -- FORCC { /* Save to buffer */ -- t = pix[color]; -- if (c != color) -- t += (sum[c] - sum[color]) / num; -- brow[2][col][c] = CLIP(t); -- } -- } -- if (row > 3) /* Write buffer to image */ -- memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image); -- for (g=0; g < 4; g++) -- brow[(g-1) & 3] = brow[g]; -- } -- memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image); -- memcpy (image[(row-1)*width+2], brow[1]+2, (width-4)*sizeof *image); -- free (brow[4]); -- free (code[0][0]); --} -- --/* -- Patterned Pixel Grouping Interpolation by Alain Desbiolles --*/ --void CLASS ppg_interpolate() --{ -- int dir[5] = { 1, width, -1, -width, 1 }; -- int row, col, diff[2], guess[2], c, d, i; -- ushort (*pix)[4]; -- -- border_interpolate(3); -- if (verbose) fprintf (stderr,_("PPG interpolation...\n")); -- --/* Fill in the green layer with gradients and pattern recognition: */ -- for (row=3; row < height-3; row++) -- for (col=3+(FC(row,3) & 1), c=FC(row,col); col < width-3; col+=2) { -- pix = image + row*width+col; -- for (i=0; (d=dir[i]) > 0; i++) { -- guess[i] = (pix[-d][1] + pix[0][c] + pix[d][1]) * 2 -- - pix[-2*d][c] - pix[2*d][c]; -- diff[i] = ( ABS(pix[-2*d][c] - pix[ 0][c]) + -- ABS(pix[ 2*d][c] - pix[ 0][c]) + -- ABS(pix[ -d][1] - pix[ d][1]) ) * 3 + -- ( ABS(pix[ 3*d][1] - pix[ d][1]) + -- ABS(pix[-3*d][1] - pix[-d][1]) ) * 2; -- } -- d = dir[i = diff[0] > diff[1]]; -- pix[0][1] = ULIM(guess[i] >> 2, pix[d][1], pix[-d][1]); -- } --/* Calculate red and blue for each green pixel: */ -- for (row=1; row < height-1; row++) -- for (col=1+(FC(row,2) & 1), c=FC(row,col+1); col < width-1; col+=2) { -- pix = image + row*width+col; -- for (i=0; (d=dir[i]) > 0; c=2-c, i++) -- pix[0][c] = CLIP((pix[-d][c] + pix[d][c] + 2*pix[0][1] -- - pix[-d][1] - pix[d][1]) >> 1); -- } --/* Calculate blue for red pixels and vice versa: */ -- for (row=1; row < height-1; row++) -- for (col=1+(FC(row,1) & 1), c=2-FC(row,col); col < width-1; col+=2) { -- pix = image + row*width+col; -- for (i=0; (d=dir[i]+dir[i+1]) > 0; i++) { -- diff[i] = ABS(pix[-d][c] - pix[d][c]) + -- ABS(pix[-d][1] - pix[0][1]) + -- ABS(pix[ d][1] - pix[0][1]); -- guess[i] = pix[-d][c] + pix[d][c] + 2*pix[0][1] -- - pix[-d][1] - pix[d][1]; -- } -- if (diff[0] != diff[1]) -- pix[0][c] = CLIP(guess[diff[0] > diff[1]] >> 1); -- else -- pix[0][c] = CLIP((guess[0]+guess[1]) >> 2); -- } --} -- --void CLASS cielab (ushort rgb[3], short lab[3]) --{ -- int c, i, j, k; -- float r, xyz[3]; -- static float cbrt[0x10000], xyz_cam[3][4]; -- -- if (!rgb) { -- for (i=0; i < 0x10000; i++) { -- r = i / 65535.0; -- cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0; -- } -- for (i=0; i < 3; i++) -- for (j=0; j < colors; j++) -- for (xyz_cam[i][j] = k=0; k < 3; k++) -- xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i]; -- return; -- } -- xyz[0] = xyz[1] = xyz[2] = 0.5; -- FORCC { -- xyz[0] += xyz_cam[0][c] * rgb[c]; -- xyz[1] += xyz_cam[1][c] * rgb[c]; -- xyz[2] += xyz_cam[2][c] * rgb[c]; -- } -- xyz[0] = cbrt[CLIP((int) xyz[0])]; -- xyz[1] = cbrt[CLIP((int) xyz[1])]; -- xyz[2] = cbrt[CLIP((int) xyz[2])]; -- lab[0] = 64 * (116 * xyz[1] - 16); -- lab[1] = 64 * 500 * (xyz[0] - xyz[1]); -- lab[2] = 64 * 200 * (xyz[1] - xyz[2]); --} -- --#define TS 512 /* Tile Size */ --#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6] -- --/* -- Frank Markesteijn's algorithm for Fuji X-Trans sensors -- */ --void CLASS xtrans_interpolate (int passes) --{ -- int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol; -- int val, ndir, pass, hm[8], avg[4], color[3][8]; -- static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 }, -- patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 }, -- { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } }, -- dir[4] = { 1,TS,TS+1,TS-1 }; -- short allhex[3][3][2][8], *hex; -- ushort min, max, sgrow, sgcol; -- ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4]; -- short (*lab) [TS][3], (*lix)[3]; -- float (*drv)[TS][TS], diff[6], tr; -- char (*homo)[TS][TS], *buffer; -- -- if (verbose) -- fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes); -- -- cielab (0,0); -- ndir = 4 << (passes > 1); -- buffer = (char *) malloc (TS*TS*(ndir*11+6)); -- merror (buffer, "xtrans_interpolate()"); -- rgb = (ushort(*)[TS][TS][3]) buffer; -- lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6)); -- drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6)); -- homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6)); -- --/* Map a green hexagon around each non-green pixel and vice versa: */ -- for (row=0; row < 3; row++) -- for (col=0; col < 3; col++) -- for (ng=d=0; d < 10; d+=2) { -- g = fcol(row,col) == 1; -- if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++; -- if (ng == 4) { sgrow = row; sgcol = col; } -- if (ng == g+1) FORC(8) { -- v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1]; -- h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1]; -- allhex[row][col][0][c^(g*2 & d)] = h + v*width; -- allhex[row][col][1][c^(g*2 & d)] = h + v*TS; -- } -- } -- --/* Set green1 and green3 to the minimum and maximum allowed values: */ -- for (row=2; row < height-2; row++) -- for (min=~(max=0), col=2; col < width-2; col++) { -- if (fcol(row,col) == 1 && (min=~(max=0))) continue; -- pix = image + row*width + col; -- hex = allhex[row % 3][col % 3][0]; -- if (!max) FORC(6) { -- val = pix[hex[c]][1]; -- if (min > val) min = val; -- if (max < val) max = val; -- } -- pix[0][1] = min; -- pix[0][3] = max; -- switch ((row-sgrow) % 3) { -- case 1: if (row < height-3) { row++; col--; } break; -- case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--; -- } -- } -- -- for (top=3; top < height-19; top += TS-16) -- for (left=3; left < width-19; left += TS-16) { -- mrow = MIN (top+TS, height-3); -- mcol = MIN (left+TS, width-3); -- for (row=top; row < mrow; row++) -- for (col=left; col < mcol; col++) -- memcpy (rgb[0][row-top][col-left], image[row*width+col], 6); -- FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb); -- --/* Interpolate green horizontally, vertically, and along both diagonals: */ -- for (row=top; row < mrow; row++) -- for (col=left; col < mcol; col++) { -- if ((f = fcol(row,col)) == 1) continue; -- pix = image + row*width + col; -- hex = allhex[row % 3][col % 3][0]; -- color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) - -- 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]); -- color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 + -- 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]); -- FORC(2) color[1][2+c] = -- 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 * -- (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]); -- FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] = -- LIM(color[1][c] >> 8,pix[0][1],pix[0][3]); -- } -- -- for (pass=0; pass < passes; pass++) { -- if (pass == 1) -- memcpy (rgb+=4, buffer, 4*sizeof *rgb); -- --/* Recalculate green from interpolated values of closer pixels: */ -- if (pass) { -- for (row=top+2; row < mrow-2; row++) -- for (col=left+2; col < mcol-2; col++) { -- if ((f = fcol(row,col)) == 1) continue; -- pix = image + row*width + col; -- hex = allhex[row % 3][col % 3][1]; -- for (d=3; d < 6; d++) { -- rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left]; -- val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1] -- - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f]; -- rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]); -- } -- } -- } -- --/* Interpolate red and blue values for solitary green pixels: */ -- for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3) -- for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) { -- rix = &rgb[0][row-top][col-left]; -- h = fcol(row,col+1); -- memset (diff, 0, sizeof diff); -- for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) { -- for (c=0; c < 2; c++, h^=2) { -- g = 2*rix[0][1] - rix[i< 1) -- diff[d] += SQR (rix[i< 1 && (d & 1)) -- if (diff[d-1] < diff[d]) -- FORC(2) color[c*2][d] = color[c*2][d-1]; -- if (d < 2 || (d & 1)) { -- FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2); -- rix += TS*TS; -- } -- } -- } -- --/* Interpolate red for blue pixels and vice versa: */ -- for (row=top+3; row < mrow-3; row++) -- for (col=left+3; col < mcol-3; col++) { -- if ((f = 2-fcol(row,col)) == 1) continue; -- rix = &rgb[0][row-top][col-left]; -- c = (row-sgrow) % 3 ? TS:1; -- h = 3 * (c ^ TS ^ 1); -- for (d=0; d < 4; d++, rix += TS*TS) { -- i = d > 1 || ((d ^ c) & 1) || -- ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) < -- 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h; -- rix[0][f] = CLIP((rix[i][f] + rix[-i][f] + -- 2*rix[0][1] - rix[i][1] - rix[-i][1])/2); -- } -- } -- --/* Fill in red and blue for 2x2 blocks of green: */ -- for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3) -- for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) { -- rix = &rgb[0][row-top][col-left]; -- hex = allhex[row % 3][col % 3][1]; -- for (d=0; d < ndir; d+=2, rix += TS*TS) -- if (hex[d] + hex[d+1]) { -- g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1]; -- for (c=0; c < 4; c+=2) rix[0][c] = -- CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3); -- } else { -- g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1]; -- for (c=0; c < 4; c+=2) rix[0][c] = -- CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2); -- } -- } -- } -- rgb = (ushort(*)[TS][TS][3]) buffer; -- mrow -= top; -- mcol -= left; -- --/* Convert to CIELab and differentiate in all directions: */ -- for (d=0; d < ndir; d++) { -- for (row=2; row < mrow-2; row++) -- for (col=2; col < mcol-2; col++) -- cielab (rgb[d][row][col], lab[row][col]); -- for (f=dir[d & 3],row=3; row < mrow-3; row++) -- for (col=3; col < mcol-3; col++) { -- lix = &lab[row][col]; -- g = 2*lix[0][0] - lix[f][0] - lix[-f][0]; -- drv[d][row][col] = SQR(g) -- + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232)) -- + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580)); -- } -- } -- --/* Build homogeneity maps from the derivatives: */ -- memset(homo, 0, ndir*TS*TS); -- for (row=4; row < mrow-4; row++) -- for (col=4; col < mcol-4; col++) { -- for (tr=FLT_MAX, d=0; d < ndir; d++) -- if (tr > drv[d][row][col]) -- tr = drv[d][row][col]; -- tr *= 8; -- for (d=0; d < ndir; d++) -- for (v=-1; v <= 1; v++) -- for (h=-1; h <= 1; h++) -- if (drv[d][row+v][col+h] <= tr) -- homo[d][row][col]++; -- } -- --/* Average the most homogenous pixels for the final result: */ -- if (height-top < TS+4) mrow = height-top+2; -- if (width-left < TS+4) mcol = width-left+2; -- for (row = MIN(top,8); row < mrow-8; row++) -- for (col = MIN(left,8); col < mcol-8; col++) { -- for (d=0; d < ndir; d++) -- for (hm[d]=0, v=-2; v <= 2; v++) -- for (h=-2; h <= 2; h++) -- hm[d] += homo[d][row+v][col+h]; -- for (d=0; d < ndir-4; d++) -- if (hm[d] < hm[d+4]) hm[d ] = 0; else -- if (hm[d] > hm[d+4]) hm[d+4] = 0; -- for (max=hm[0],d=1; d < ndir; d++) -- if (max < hm[d]) max = hm[d]; -- max -= max >> 3; -- memset (avg, 0, sizeof avg); -- for (d=0; d < ndir; d++) -- if (hm[d] >= max) { -- FORC3 avg[c] += rgb[d][row][col][c]; -- avg[3]++; -- } -- FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3]; -- } -- } -- free(buffer); -- border_interpolate(8); --} --#undef fcol -- --/* -- Adaptive Homogeneity-Directed interpolation is based on -- the work of Keigo Hirakawa, Thomas Parks, and Paul Lee. -- */ --void CLASS ahd_interpolate() --{ -- int i, j, top, left, row, col, tr, tc, c, d, val, hm[2]; -- static const int dir[4] = { -1, 1, -TS, TS }; -- unsigned ldiff[2][4], abdiff[2][4], leps, abeps; -- ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4]; -- short (*lab)[TS][TS][3], (*lix)[3]; -- char (*homo)[TS][TS], *buffer; -- -- if (verbose) fprintf (stderr,_("AHD interpolation...\n")); -- -- cielab (0,0); -- border_interpolate(5); -- buffer = (char *) malloc (26*TS*TS); -- merror (buffer, "ahd_interpolate()"); -- rgb = (ushort(*)[TS][TS][3]) buffer; -- lab = (short (*)[TS][TS][3])(buffer + 12*TS*TS); -- homo = (char (*)[TS][TS]) (buffer + 24*TS*TS); -- -- for (top=2; top < height-5; top += TS-6) -- for (left=2; left < width-5; left += TS-6) { -- --/* Interpolate green horizontally and vertically: */ -- for (row=top; row < top+TS && row < height-2; row++) { -- col = left + (FC(row,left) & 1); -- for (c = FC(row,col); col < left+TS && col < width-2; col+=2) { -- pix = image + row*width+col; -- val = ((pix[-1][1] + pix[0][c] + pix[1][1]) * 2 -- - pix[-2][c] - pix[2][c]) >> 2; -- rgb[0][row-top][col-left][1] = ULIM(val,pix[-1][1],pix[1][1]); -- val = ((pix[-width][1] + pix[0][c] + pix[width][1]) * 2 -- - pix[-2*width][c] - pix[2*width][c]) >> 2; -- rgb[1][row-top][col-left][1] = ULIM(val,pix[-width][1],pix[width][1]); -- } -- } --/* Interpolate red and blue, and convert to CIELab: */ -- for (d=0; d < 2; d++) -- for (row=top+1; row < top+TS-1 && row < height-3; row++) -- for (col=left+1; col < left+TS-1 && col < width-3; col++) { -- pix = image + row*width+col; -- rix = &rgb[d][row-top][col-left]; -- lix = &lab[d][row-top][col-left]; -- if ((c = 2 - FC(row,col)) == 1) { -- c = FC(row+1,col); -- val = pix[0][1] + (( pix[-1][2-c] + pix[1][2-c] -- - rix[-1][1] - rix[1][1] ) >> 1); -- rix[0][2-c] = CLIP(val); -- val = pix[0][1] + (( pix[-width][c] + pix[width][c] -- - rix[-TS][1] - rix[TS][1] ) >> 1); -- } else -- val = rix[0][1] + (( pix[-width-1][c] + pix[-width+1][c] -- + pix[+width-1][c] + pix[+width+1][c] -- - rix[-TS-1][1] - rix[-TS+1][1] -- - rix[+TS-1][1] - rix[+TS+1][1] + 1) >> 2); -- rix[0][c] = CLIP(val); -- c = FC(row,col); -- rix[0][c] = pix[0][c]; -- cielab (rix[0],lix[0]); -- } --/* Build homogeneity maps from the CIELab images: */ -- memset (homo, 0, 2*TS*TS); -- for (row=top+2; row < top+TS-2 && row < height-4; row++) { -- tr = row-top; -- for (col=left+2; col < left+TS-2 && col < width-4; col++) { -- tc = col-left; -- for (d=0; d < 2; d++) { -- lix = &lab[d][tr][tc]; -- for (i=0; i < 4; i++) { -- ldiff[d][i] = ABS(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]); -- } -- } -- leps = MIN(MAX(ldiff[0][0],ldiff[0][1]), -- MAX(ldiff[1][2],ldiff[1][3])); -- abeps = MIN(MAX(abdiff[0][0],abdiff[0][1]), -- MAX(abdiff[1][2],abdiff[1][3])); -- for (d=0; d < 2; d++) -- for (i=0; i < 4; i++) -- if (ldiff[d][i] <= leps && abdiff[d][i] <= abeps) -- homo[d][tr][tc]++; -- } -- } --/* Combine the most homogenous pixels for the final result: */ -- for (row=top+3; row < top+TS-3 && row < height-5; row++) { -- tr = row-top; -- for (col=left+3; col < left+TS-3 && col < width-5; col++) { -- tc = col-left; -- for (d=0; d < 2; d++) -- for (hm[d]=0, i=tr-1; i <= tr+1; i++) -- for (j=tc-1; j <= tc+1; j++) -- hm[d] += homo[d][i][j]; -- if (hm[0] != hm[1]) -- FORC3 image[row*width+col][c] = rgb[hm[1] > hm[0]][tr][tc][c]; -- else -- FORC3 image[row*width+col][c] = -- (rgb[0][tr][tc][c] + rgb[1][tr][tc][c]) >> 1; -- } -- } -- } -- free (buffer); --} --#undef TS -- --void CLASS median_filter() --{ -- ushort (*pix)[4]; -- int pass, c, i, j, k, med[9]; -- static const uchar opt[] = /* Optimal 9-element median search */ -- { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8, -- 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 }; -- -- for (pass=1; pass <= med_passes; pass++) { -- if (verbose) -- fprintf (stderr,_("Median filter pass %d...\n"), pass); -- for (c=0; c < 3; c+=2) { -- for (pix = image; pix < image+width*height; pix++) -- pix[0][3] = pix[0][c]; -- for (pix = image+width; pix < image+width*(height-1); pix++) { -- if ((pix-image+1) % width < 2) continue; -- for (k=0, i = -width; i <= width; i += width) -- for (j = i-1; j <= i+1; j++) -- med[k++] = pix[j][3] - pix[j][1]; -- for (i=0; i < sizeof opt; i+=2) -- if (med[opt[i]] > med[opt[i+1]]) -- SWAP (med[opt[i]] , med[opt[i+1]]); -- pix[0][c] = CLIP(med[4] + pix[0][1]); -- } -- } -- } --} -- --void CLASS blend_highlights() --{ -- int clip=INT_MAX, row, col, c, i, j; -- static const float trans[2][4][4] = -- { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } }, -- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } }; -- static const float itrans[2][4][4] = -- { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } }, -- { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } }; -- float cam[2][4], lab[2][4], sum[2], chratio; -- -- if ((unsigned) (colors-3) > 1) return; -- if (verbose) fprintf (stderr,_("Blending highlights...\n")); -- FORCC if (clip > (i = 65535*pre_mul[c])) clip = i; -- for (row=0; row < height; row++) -- for (col=0; col < width; col++) { -- FORCC if (image[row*width+col][c] > clip) break; -- if (c == colors) continue; -- FORCC { -- cam[0][c] = image[row*width+col][c]; -- cam[1][c] = MIN(cam[0][c],clip); -- } -- for (i=0; i < 2; i++) { -- FORCC for (lab[i][c]=j=0; j < colors; j++) -- lab[i][c] += trans[colors-3][c][j] * cam[i][j]; -- for (sum[i]=0,c=1; c < colors; c++) -- sum[i] += SQR(lab[i][c]); -- } -- chratio = sqrt(sum[1]/sum[0]); -- for (c=1; c < colors; c++) -- lab[0][c] *= chratio; -- FORCC for (cam[0][c]=j=0; j < colors; j++) -- cam[0][c] += itrans[colors-3][c][j] * lab[0][j]; -- FORCC image[row*width+col][c] = cam[0][c] / colors; -- } --} -- --#define SCALE (4 >> shrink) --void CLASS recover_highlights() --{ -- float *map, sum, wgt, grow; -- int hsat[4], count, spread, change, val, i; -- unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x; -- ushort *pixel; -- static const signed char dir[8][2] = -- { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} }; -- -- if (verbose) fprintf (stderr,_("Rebuilding highlights...\n")); -- -- grow = pow (2, 4-highlight); -- FORCC hsat[c] = 32000 * pre_mul[c]; -- for (kc=0, c=1; c < colors; c++) -- if (pre_mul[kc] < pre_mul[c]) kc = c; -- high = height / SCALE; -- wide = width / SCALE; -- map = (float *) calloc (high, wide*sizeof *map); -- merror (map, "recover_highlights()"); -- FORCC if (c != kc) { -- memset (map, 0, high*wide*sizeof *map); -- for (mrow=0; mrow < high; mrow++) -- for (mcol=0; mcol < wide; mcol++) { -- sum = wgt = count = 0; -- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++) -- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) { -- pixel = image[row*width+col]; -- if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) { -- sum += pixel[c]; -- wgt += pixel[kc]; -- count++; -- } -- } -- if (count == SCALE*SCALE) -- map[mrow*wide+mcol] = sum / wgt; -- } -- for (spread = 32/grow; spread--; ) { -- for (mrow=0; mrow < high; mrow++) -- for (mcol=0; mcol < wide; mcol++) { -- if (map[mrow*wide+mcol]) continue; -- sum = count = 0; -- for (d=0; d < 8; d++) { -- y = mrow + dir[d][0]; -- x = mcol + dir[d][1]; -- if (y < high && x < wide && map[y*wide+x] > 0) { -- sum += (1 + (d & 1)) * map[y*wide+x]; -- count += 1 + (d & 1); -- } -- } -- if (count > 3) -- map[mrow*wide+mcol] = - (sum+grow) / (count+grow); -- } -- for (change=i=0; i < high*wide; i++) -- if (map[i] < 0) { -- map[i] = -map[i]; -- change = 1; -- } -- if (!change) break; -- } -- for (i=0; i < high*wide; i++) -- if (map[i] == 0) map[i] = 1; -- for (mrow=0; mrow < high; mrow++) -- for (mcol=0; mcol < wide; mcol++) { -- for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++) -- for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) { -- pixel = image[row*width+col]; -- if (pixel[c] / hsat[c] > 1) { -- val = pixel[kc] * map[mrow*wide+mcol]; -- if (pixel[c] < val) pixel[c] = CLIP(val); -- } -- } -- } -- } -- free (map); --} --#undef SCALE -+//void CLASS border_interpolate (int border) -+//{ -+// unsigned row, col, y, x, f, c, sum[8]; -+// -+// for (row=0; row < height; row++) -+// for (col=0; col < width; col++) { -+// if (col==border && row >= border && row < height-border) -+// col = width-border; -+// memset (sum, 0, sizeof sum); -+// for (y=row-1; y != row+2; y++) -+// for (x=col-1; x != col+2; x++) -+// if (y < height && x < width) { -+// f = fcol(y,x); -+// sum[f] += image[y*width+x][f]; -+// sum[f+4]++; -+// } -+// f = fcol(row,col); -+// FORCC if (c != f && sum[c+4]) -+// image[row*width+col][c] = sum[c] / sum[c+4]; -+// } -+//} -+ -+/* RT: delete interpolation functions */ -+ -+ -+//void CLASS cielab (ushort rgb[3], short lab[3]) -+//{ -+// int c, i, j, k; -+// float r, xyz[3]; -+// static float cbrt[0x10000], xyz_cam[3][4]; -+// -+// if (!rgb) { -+// for (i=0; i < 0x10000; i++) { -+// r = i / 65535.0; -+// cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0; -+// } -+// for (i=0; i < 3; i++) -+// for (j=0; j < colors; j++) -+// for (xyz_cam[i][j] = k=0; k < 3; k++) -+// xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i]; -+// return; -+// } -+// xyz[0] = xyz[1] = xyz[2] = 0.5; -+// FORCC { -+// xyz[0] += xyz_cam[0][c] * rgb[c]; -+// xyz[1] += xyz_cam[1][c] * rgb[c]; -+// xyz[2] += xyz_cam[2][c] * rgb[c]; -+// } -+// xyz[0] = cbrt[CLIP((int) xyz[0])]; -+// xyz[1] = cbrt[CLIP((int) xyz[1])]; -+// xyz[2] = cbrt[CLIP((int) xyz[2])]; -+// lab[0] = 64 * (116 * xyz[1] - 16); -+// lab[1] = 64 * 500 * (xyz[0] - xyz[1]); -+// lab[2] = 64 * 200 * (xyz[1] - xyz[2]); -+//} -+// -+//#define TS 512 /* Tile Size */ -+//#define fcol(row,col) xtrans[(row+6) % 6][(col+6) % 6] -+// -+///* -+// Frank Markesteijn's algorithm for Fuji X-Trans sensors -+// */ -+//void CLASS xtrans_interpolate (int passes) -+//{ -+// int c, d, f, g, h, i, v, ng, row, col, top, left, mrow, mcol; -+// int val, ndir, pass, hm[8], avg[4], color[3][8]; -+// static const short orth[12] = { 1,0,0,1,-1,0,0,-1,1,0,0,1 }, -+// patt[2][16] = { { 0,1,0,-1,2,0,-1,0,1,1,1,-1,0,0,0,0 }, -+// { 0,1,0,-2,1,0,-2,0,1,1,-2,-2,1,-1,-1,1 } }, -+// dir[4] = { 1,TS,TS+1,TS-1 }; -+// short allhex[3][3][2][8], *hex; -+// ushort min, max, sgrow, sgcol; -+// ushort (*rgb)[TS][TS][3], (*rix)[3], (*pix)[4]; -+// short (*lab) [TS][3], (*lix)[3]; -+// float (*drv)[TS][TS], diff[6], tr; -+// char (*homo)[TS][TS], *buffer; -+// -+// if (verbose) -+// fprintf (stderr,_("%d-pass X-Trans interpolation...\n"), passes); -+// -+// cielab (0,0); -+// ndir = 4 << (passes > 1); -+// buffer = (char *) malloc (TS*TS*(ndir*11+6)); -+// merror (buffer, "xtrans_interpolate()"); -+// rgb = (ushort(*)[TS][TS][3]) buffer; -+// lab = (short (*) [TS][3])(buffer + TS*TS*(ndir*6)); -+// drv = (float (*)[TS][TS]) (buffer + TS*TS*(ndir*6+6)); -+// homo = (char (*)[TS][TS]) (buffer + TS*TS*(ndir*10+6)); -+// -+///* Map a green hexagon around each non-green pixel and vice versa: */ -+// for (row=0; row < 3; row++) -+// for (col=0; col < 3; col++) -+// for (ng=d=0; d < 10; d+=2) { -+// g = fcol(row,col) == 1; -+// if (fcol(row+orth[d],col+orth[d+2]) == 1) ng=0; else ng++; -+// if (ng == 4) { sgrow = row; sgcol = col; } -+// if (ng == g+1) FORC(8) { -+// v = orth[d ]*patt[g][c*2] + orth[d+1]*patt[g][c*2+1]; -+// h = orth[d+2]*patt[g][c*2] + orth[d+3]*patt[g][c*2+1]; -+// allhex[row][col][0][c^(g*2 & d)] = h + v*width; -+// allhex[row][col][1][c^(g*2 & d)] = h + v*TS; -+// } -+// } -+// -+///* Set green1 and green3 to the minimum and maximum allowed values: */ -+// for (row=2; row < height-2; row++) -+// for (min=~(max=0), col=2; col < width-2; col++) { -+// if (fcol(row,col) == 1 && (min=~(max=0))) continue; -+// pix = image + row*width + col; -+// hex = allhex[row % 3][col % 3][0]; -+// if (!max) FORC(6) { -+// val = pix[hex[c]][1]; -+// if (min > val) min = val; -+// if (max < val) max = val; -+// } -+// pix[0][1] = min; -+// pix[0][3] = max; -+// switch ((row-sgrow) % 3) { -+// case 1: if (row < height-3) { row++; col--; } break; -+// case 2: if ((min=~(max=0)) && (col+=2) < width-3 && row > 2) row--; -+// } -+// } -+// -+// for (top=3; top < height-19; top += TS-16) -+// for (left=3; left < width-19; left += TS-16) { -+// mrow = MIN (top+TS, height-3); -+// mcol = MIN (left+TS, width-3); -+// for (row=top; row < mrow; row++) -+// for (col=left; col < mcol; col++) -+// memcpy (rgb[0][row-top][col-left], image[row*width+col], 6); -+// FORC3 memcpy (rgb[c+1], rgb[0], sizeof *rgb); -+// -+///* Interpolate green horizontally, vertically, and along both diagonals: */ -+// for (row=top; row < mrow; row++) -+// for (col=left; col < mcol; col++) { -+// if ((f = fcol(row,col)) == 1) continue; -+// pix = image + row*width + col; -+// hex = allhex[row % 3][col % 3][0]; -+// color[1][0] = 174 * (pix[ hex[1]][1] + pix[ hex[0]][1]) - -+// 46 * (pix[2*hex[1]][1] + pix[2*hex[0]][1]); -+// color[1][1] = 223 * pix[ hex[3]][1] + pix[ hex[2]][1] * 33 + -+// 92 * (pix[ 0 ][f] - pix[ -hex[2]][f]); -+// FORC(2) color[1][2+c] = -+// 164 * pix[hex[4+c]][1] + 92 * pix[-2*hex[4+c]][1] + 33 * -+// (2*pix[0][f] - pix[3*hex[4+c]][f] - pix[-3*hex[4+c]][f]); -+// FORC4 rgb[c^!((row-sgrow) % 3)][row-top][col-left][1] = -+// LIM(color[1][c] >> 8,pix[0][1],pix[0][3]); -+// } -+// -+// for (pass=0; pass < passes; pass++) { -+// if (pass == 1) -+// memcpy (rgb+=4, buffer, 4*sizeof *rgb); -+// -+///* Recalculate green from interpolated values of closer pixels: */ -+// if (pass) { -+// for (row=top+2; row < mrow-2; row++) -+// for (col=left+2; col < mcol-2; col++) { -+// if ((f = fcol(row,col)) == 1) continue; -+// pix = image + row*width + col; -+// hex = allhex[row % 3][col % 3][1]; -+// for (d=3; d < 6; d++) { -+// rix = &rgb[(d-2)^!((row-sgrow) % 3)][row-top][col-left]; -+// val = rix[-2*hex[d]][1] + 2*rix[hex[d]][1] -+// - rix[-2*hex[d]][f] - 2*rix[hex[d]][f] + 3*rix[0][f]; -+// rix[0][1] = LIM(val/3,pix[0][1],pix[0][3]); -+// } -+// } -+// } -+// -+///* Interpolate red and blue values for solitary green pixels: */ -+// for (row=(top-sgrow+4)/3*3+sgrow; row < mrow-2; row+=3) -+// for (col=(left-sgcol+4)/3*3+sgcol; col < mcol-2; col+=3) { -+// rix = &rgb[0][row-top][col-left]; -+// h = fcol(row,col+1); -+// memset (diff, 0, sizeof diff); -+// for (i=1, d=0; d < 6; d++, i^=TS^1, h^=2) { -+// for (c=0; c < 2; c++, h^=2) { -+// g = 2*rix[0][1] - rix[i< 1) -+// diff[d] += SQR (rix[i< 1 && (d & 1)) -+// if (diff[d-1] < diff[d]) -+// FORC(2) color[c*2][d] = color[c*2][d-1]; -+// if (d < 2 || (d & 1)) { -+// FORC(2) rix[0][c*2] = CLIP(color[c*2][d]/2); -+// rix += TS*TS; -+// } -+// } -+// } -+// -+///* Interpolate red for blue pixels and vice versa: */ -+// for (row=top+3; row < mrow-3; row++) -+// for (col=left+3; col < mcol-3; col++) { -+// if ((f = 2-fcol(row,col)) == 1) continue; -+// rix = &rgb[0][row-top][col-left]; -+// c = (row-sgrow) % 3 ? TS:1; -+// h = 3 * (c ^ TS ^ 1); -+// for (d=0; d < 4; d++, rix += TS*TS) { -+// i = d > 1 || ((d ^ c) & 1) || -+// ((ABS(rix[0][1]-rix[c][1])+ABS(rix[0][1]-rix[-c][1])) < -+// 2*(ABS(rix[0][1]-rix[h][1])+ABS(rix[0][1]-rix[-h][1]))) ? c:h; -+// rix[0][f] = CLIP((rix[i][f] + rix[-i][f] + -+// 2*rix[0][1] - rix[i][1] - rix[-i][1])/2); -+// } -+// } -+// -+///* Fill in red and blue for 2x2 blocks of green: */ -+// for (row=top+2; row < mrow-2; row++) if ((row-sgrow) % 3) -+// for (col=left+2; col < mcol-2; col++) if ((col-sgcol) % 3) { -+// rix = &rgb[0][row-top][col-left]; -+// hex = allhex[row % 3][col % 3][1]; -+// for (d=0; d < ndir; d+=2, rix += TS*TS) -+// if (hex[d] + hex[d+1]) { -+// g = 3*rix[0][1] - 2*rix[hex[d]][1] - rix[hex[d+1]][1]; -+// for (c=0; c < 4; c+=2) rix[0][c] = -+// CLIP((g + 2*rix[hex[d]][c] + rix[hex[d+1]][c])/3); -+// } else { -+// g = 2*rix[0][1] - rix[hex[d]][1] - rix[hex[d+1]][1]; -+// for (c=0; c < 4; c+=2) rix[0][c] = -+// CLIP((g + rix[hex[d]][c] + rix[hex[d+1]][c])/2); -+// } -+// } -+// } -+// rgb = (ushort(*)[TS][TS][3]) buffer; -+// mrow -= top; -+// mcol -= left; -+// -+///* Convert to CIELab and differentiate in all directions: */ -+// for (d=0; d < ndir; d++) { -+// for (row=2; row < mrow-2; row++) -+// for (col=2; col < mcol-2; col++) -+// cielab (rgb[d][row][col], lab[row][col]); -+// for (f=dir[d & 3],row=3; row < mrow-3; row++) -+// for (col=3; col < mcol-3; col++) { -+// lix = &lab[row][col]; -+// g = 2*lix[0][0] - lix[f][0] - lix[-f][0]; -+// drv[d][row][col] = SQR(g) -+// + SQR((2*lix[0][1] - lix[f][1] - lix[-f][1] + g*500/232)) -+// + SQR((2*lix[0][2] - lix[f][2] - lix[-f][2] - g*500/580)); -+// } -+// } -+// -+///* Build homogeneity maps from the derivatives: */ -+// memset(homo, 0, ndir*TS*TS); -+// for (row=4; row < mrow-4; row++) -+// for (col=4; col < mcol-4; col++) { -+// for (tr=FLT_MAX, d=0; d < ndir; d++) -+// if (tr > drv[d][row][col]) -+// tr = drv[d][row][col]; -+// tr *= 8; -+// for (d=0; d < ndir; d++) -+// for (v=-1; v <= 1; v++) -+// for (h=-1; h <= 1; h++) -+// if (drv[d][row+v][col+h] <= tr) -+// homo[d][row][col]++; -+// } -+// -+///* Average the most homogenous pixels for the final result: */ -+// if (height-top < TS+4) mrow = height-top+2; -+// if (width-left < TS+4) mcol = width-left+2; -+// for (row = MIN(top,8); row < mrow-8; row++) -+// for (col = MIN(left,8); col < mcol-8; col++) { -+// for (d=0; d < ndir; d++) -+// for (hm[d]=0, v=-2; v <= 2; v++) -+// for (h=-2; h <= 2; h++) -+// hm[d] += homo[d][row+v][col+h]; -+// for (d=0; d < ndir-4; d++) -+// if (hm[d] < hm[d+4]) hm[d ] = 0; else -+// if (hm[d] > hm[d+4]) hm[d+4] = 0; -+// for (max=hm[0],d=1; d < ndir; d++) -+// if (max < hm[d]) max = hm[d]; -+// max -= max >> 3; -+// memset (avg, 0, sizeof avg); -+// for (d=0; d < ndir; d++) -+// if (hm[d] >= max) { -+// FORC3 avg[c] += rgb[d][row][col][c]; -+// avg[3]++; -+// } -+// FORC3 image[(row+top)*width+col+left][c] = avg[c]/avg[3]; -+// } -+// } -+// free(buffer); -+// border_interpolate(8); -+//} -+//#undef fcol -+// -+// -+//#undef TS -+ -+//void CLASS median_filter() -+//{ -+// ushort (*pix)[4]; -+// int pass, c, i, j, k, med[9]; -+// static const uchar opt[] = /* Optimal 9-element median search */ -+// { 1,2, 4,5, 7,8, 0,1, 3,4, 6,7, 1,2, 4,5, 7,8, -+// 0,3, 5,8, 4,7, 3,6, 1,4, 2,5, 4,7, 4,2, 6,4, 4,2 }; -+// -+// for (pass=1; pass <= med_passes; pass++) { -+// if (verbose) -+// fprintf (stderr,_("Median filter pass %d...\n"), pass); -+// for (c=0; c < 3; c+=2) { -+// for (pix = image; pix < image+width*height; pix++) -+// pix[0][3] = pix[0][c]; -+// for (pix = image+width; pix < image+width*(height-1); pix++) { -+// if ((pix-image+1) % width < 2) continue; -+// for (k=0, i = -width; i <= width; i += width) -+// for (j = i-1; j <= i+1; j++) -+// med[k++] = pix[j][3] - pix[j][1]; -+// for (i=0; i < sizeof opt; i+=2) -+// if (med[opt[i]] > med[opt[i+1]]) -+// SWAP (med[opt[i]] , med[opt[i+1]]); -+// pix[0][c] = CLIP(med[4] + pix[0][1]); -+// } -+// } -+// } -+//} -+// -+//void CLASS blend_highlights() -+//{ -+// int clip=INT_MAX, row, col, c, i, j; -+// static const float trans[2][4][4] = -+// { { { 1,1,1 }, { 1.7320508,-1.7320508,0 }, { -1,-1,2 } }, -+// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } }; -+// static const float itrans[2][4][4] = -+// { { { 1,0.8660254,-0.5 }, { 1,-0.8660254,-0.5 }, { 1,0,1 } }, -+// { { 1,1,1,1 }, { 1,-1,1,-1 }, { 1,1,-1,-1 }, { 1,-1,-1,1 } } }; -+// float cam[2][4], lab[2][4], sum[2], chratio; -+// -+// if ((unsigned) (colors-3) > 1) return; -+// if (verbose) fprintf (stderr,_("Blending highlights...\n")); -+// FORCC if (clip > (i = 65535*pre_mul[c])) clip = i; -+// for (row=0; row < height; row++) -+// for (col=0; col < width; col++) { -+// FORCC if (image[row*width+col][c] > clip) break; -+// if (c == colors) continue; -+// FORCC { -+// cam[0][c] = image[row*width+col][c]; -+// cam[1][c] = MIN(cam[0][c],clip); -+// } -+// for (i=0; i < 2; i++) { -+// FORCC for (lab[i][c]=j=0; j < colors; j++) -+// lab[i][c] += trans[colors-3][c][j] * cam[i][j]; -+// for (sum[i]=0,c=1; c < colors; c++) -+// sum[i] += SQR(lab[i][c]); -+// } -+// chratio = sqrt(sum[1]/sum[0]); -+// for (c=1; c < colors; c++) -+// lab[0][c] *= chratio; -+// FORCC for (cam[0][c]=j=0; j < colors; j++) -+// cam[0][c] += itrans[colors-3][c][j] * lab[0][j]; -+// FORCC image[row*width+col][c] = cam[0][c] / colors; -+// } -+//} -+// -+//#define SCALE (4 >> shrink) -+//void CLASS recover_highlights() -+//{ -+// float *map, sum, wgt, grow; -+// int hsat[4], count, spread, change, val, i; -+// unsigned high, wide, mrow, mcol, row, col, kc, c, d, y, x; -+// ushort *pixel; -+// static const signed char dir[8][2] = -+// { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1} }; -+// -+// if (verbose) fprintf (stderr,_("Rebuilding highlights...\n")); -+// -+// grow = pow (2, 4-highlight); -+// FORCC hsat[c] = 32000 * pre_mul[c]; -+// for (kc=0, c=1; c < colors; c++) -+// if (pre_mul[kc] < pre_mul[c]) kc = c; -+// high = height / SCALE; -+// wide = width / SCALE; -+// map = (float *) calloc (high, wide*sizeof *map); -+// merror (map, "recover_highlights()"); -+// FORCC if (c != kc) { -+// memset (map, 0, high*wide*sizeof *map); -+// for (mrow=0; mrow < high; mrow++) -+// for (mcol=0; mcol < wide; mcol++) { -+// sum = wgt = count = 0; -+// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++) -+// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) { -+// pixel = image[row*width+col]; -+// if (pixel[c] / hsat[c] == 1 && pixel[kc] > 24000) { -+// sum += pixel[c]; -+// wgt += pixel[kc]; -+// count++; -+// } -+// } -+// if (count == SCALE*SCALE) -+// map[mrow*wide+mcol] = sum / wgt; -+// } -+// for (spread = 32/grow; spread--; ) { -+// for (mrow=0; mrow < high; mrow++) -+// for (mcol=0; mcol < wide; mcol++) { -+// if (map[mrow*wide+mcol]) continue; -+// sum = count = 0; -+// for (d=0; d < 8; d++) { -+// y = mrow + dir[d][0]; -+// x = mcol + dir[d][1]; -+// if (y < high && x < wide && map[y*wide+x] > 0) { -+// sum += (1 + (d & 1)) * map[y*wide+x]; -+// count += 1 + (d & 1); -+// } -+// } -+// if (count > 3) -+// map[mrow*wide+mcol] = - (sum+grow) / (count+grow); -+// } -+// for (change=i=0; i < high*wide; i++) -+// if (map[i] < 0) { -+// map[i] = -map[i]; -+// change = 1; -+// } -+// if (!change) break; -+// } -+// for (i=0; i < high*wide; i++) -+// if (map[i] == 0) map[i] = 1; -+// for (mrow=0; mrow < high; mrow++) -+// for (mcol=0; mcol < wide; mcol++) { -+// for (row = mrow*SCALE; row < (mrow+1)*SCALE; row++) -+// for (col = mcol*SCALE; col < (mcol+1)*SCALE; col++) { -+// pixel = image[row*width+col]; -+// if (pixel[c] / hsat[c] > 1) { -+// val = pixel[kc] * map[mrow*wide+mcol]; -+// if (pixel[c] < val) pixel[c] = CLIP(val); -+// } -+// } -+// } -+// } -+// free (map); -+//} -+//#undef SCALE - - void CLASS tiff_get (unsigned base, - unsigned *tag, unsigned *type, unsigned *len, unsigned *save) -@@ -5139,7 +5127,7 @@ - } - } - --int CLASS parse_tiff_ifd (int base); -+/*RT int CLASS parse_tiff_ifd (int base);*/ - - void CLASS parse_makernote (int base, int uptag) - { -@@ -5244,6 +5232,11 @@ - tag |= uptag << 16; - if (tag == 2 && strstr(make,"NIKON") && !iso_speed) - iso_speed = (get2(),get2()); -+ if ((tag == 0x25 || tag == 0x28) && strstr(make,"NIKON") && !iso_speed) { // Nikon ISOInfo Tags/ISO & ISO2 -+ uchar iso[1]; -+ fread (iso, 1, 1, ifp); -+ iso_speed = 100 * pow(2,(float)iso[0]/12.0-5); -+ } - if (tag == 4 && len > 26 && len < 35) { - if ((i=(get4(),get2())) != 0x7fff && !iso_speed) - iso_speed = 50 * pow (2, i/32.0 - 4); -@@ -5296,12 +5289,16 @@ - cam_mul[2] = get4() << 2; - } - } -- if (tag == 0x15 && type == 2 && is_raw) -+ //if (tag == 0x15 && type == 2 && is_raw) -+ if (tag == 0x15 && type == 2 && is_raw && strstr(model, "Hasselblad ") != model) // RT: don't overwrite already parsed Hasselblad model - fread (model, 64, 1, ifp); - if (strstr(make,"PENTAX")) { - if (tag == 0x1b) tag = 0x1018; - if (tag == 0x1c) tag = 0x1017; - } -+ if (tag == 0x19 && !strcmp(make,"Hasselblad") && len == 0x300000) { // RT -+ parse_hasselblad_gain(); // RT -+ } // RT - if (tag == 0x1d) - while ((c = fgetc(ifp)) && c != EOF) - serial = serial*10 + (isdigit(c) ? c - '0' : c % 10); -@@ -5491,14 +5488,14 @@ - while (entries--) { - tiff_get (base, &tag, &type, &len, &save); - switch (tag) { -- case 33434: tiff_ifd[tiff_nifds-1].shutter = -- shutter = getreal(type); break; -+ case 33434: tiff_ifd[tiff_nifds-1].shutter = shutter = getreal(type); break; - case 33437: aperture = getreal(type); break; - case 34855: iso_speed = get2(); break; -+ case 34866: if((!iso_speed) || iso_speed == 65535) iso_speed = get4();break; - case 36867: - case 36868: get_timestamp(0); break; - case 37377: if ((expo = -getreal(type)) < 128) -- tiff_ifd[tiff_nifds-1].shutter = -+ tiff_ifd[tiff_nifds-1].shutter = - shutter = pow (2, expo); break; - case 37378: aperture = pow (2, getreal(type)/2); break; - case 37386: focal_len = getreal(type); break; -@@ -5667,28 +5664,33 @@ - } - } - --void CLASS parse_minolta (int base); --int CLASS parse_tiff (int base); -+/*RT void CLASS parse_minolta (int base); */ -+/*RT int CLASS parse_tiff (int base);*/ - - int CLASS parse_tiff_ifd (int base) - { - unsigned entries, tag, type, len, plen=16, save; -- int ifd, use_cm=0, cfa, i, j, c, ima_len=0; -+ int ifd, use_cm=0, cfa, i, j, c, ima_len=0,cm_D65=0; - char software[64], *cbuf, *cp; - uchar cfa_pat[16], cfa_pc[] = { 0,1,2,3 }, tab[256]; -- double cc[4][4], cm[4][3], cam_xyz[4][3], num; -+ double cc[2][4][4]; -+ double cm[2][4][3] = {NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN,NAN}; -+ double cam_xyz[4][3], num; - double ab[]={ 1,1,1,1 }, asn[] = { 0,0,0,0 }, xyz[] = { 1,1,1 }; - unsigned sony_curve[] = { 0,0,0,0,0,4095 }; - unsigned *buf, sony_offset=0, sony_length=0, sony_key=0; - struct jhead jh; -- FILE *sfp; -+/*RT*/ IMFILE *sfp; - - if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) - return 1; - ifd = tiff_nifds++; - for (j=0; j < 4; j++) - for (i=0; i < 4; i++) -- cc[j][i] = i == j; -+ { -+ cc[0][j][i] = i == j; -+ cc[1][j][i] = i == j; -+ } - entries = get2(); - if (entries > 512) return 1; - while (entries--) { -@@ -5758,7 +5760,8 @@ - fgets (make, 64, ifp); - break; - case 272: /* Model */ -- fgets (model, 64, ifp); -+ if (strstr(model, "Hasselblad ") != model) // RT: if Hasselblad, only parse the first model name (otherwise it can change from say Hasselblad CFV-50 to Hasselblad CW (ie the camera body model, not the back model which we are interested in) -+ fgets (model, 64, ifp); - break; - case 280: /* Panasonic RW2 offset */ - if (type != 4) break; -@@ -5818,6 +5821,9 @@ - case 315: /* Artist */ - fread (artist, 64, 1, ifp); - break; -+ case 317: /* Predictor */ -+ tiff_ifd[ifd].predictor = getint(type); -+ break; - case 322: /* TileWidth */ - tiff_ifd[ifd].tile_width = getint(type); - break; -@@ -5833,6 +5839,9 @@ - is_raw = 5; - } - break; -+ case 325: /* TileByteCounts */ -+ tiff_ifd[ifd].bytes = len > 1 ? ftell(ifp) : get4(); -+ break; - case 330: /* SubIFDs */ - if (!strcmp(model,"DSLR-A100") && tiff_ifd[ifd].width == 3872) { - load_raw = &CLASS sony_arw_load_raw; -@@ -5846,6 +5855,9 @@ - fseek (ifp, i+4, SEEK_SET); - } - break; -+ case 339: -+ tiff_ifd[ifd].sample_format = getint(type); -+ break; - case 400: - strcpy (make, "Sarnoff"); - maximum = 0xfff; -@@ -6063,12 +6075,21 @@ - case 61450: - cblack[4] = cblack[5] = MIN(sqrt(len),64); - case 50714: /* BlackLevel */ -- if (!(cblack[4] * cblack[5])) -- cblack[4] = cblack[5] = 1; -- FORC (cblack[4] * cblack[5]) -- cblack[6+c] = getreal(type); -- black = 0; -- break; -+ if(cblack[4] * cblack[5] == 0) { -+ int dblack[] = { 0,0,0,0 }; -+ black = getreal(type); -+ if ((unsigned)(filters+1) < 1000) break; -+ dblack[0] = dblack[1] = dblack[2] = dblack[3] = black; -+ if (colors == 3) -+ filters |= ((filters >> 2 & 0x22222222) | -+ (filters << 2 & 0x88888888)) & filters << 1; -+ FORC4 cblack[filters >> (c << 1) & 3] = dblack[c]; -+ } else { -+ FORC (cblack[4] * cblack[5]) -+ cblack[6+c] = getreal(type); -+ } -+ black = 0; -+ break; - case 50715: /* BlackLevelDeltaH */ - case 50716: /* BlackLevelDeltaV */ - for (num=i=0; i < (len & 0xffff); i++) -@@ -6085,13 +6106,13 @@ - case 50721: /* ColorMatrix1 */ - case 50722: /* ColorMatrix2 */ - FORCC for (j=0; j < 3; j++) -- cm[c][j] = getreal(type); -+ cm[tag-50721][c][j] = getreal(type); - use_cm = 1; - break; - case 50723: /* CameraCalibration1 */ - case 50724: /* CameraCalibration2 */ - for (i=0; i < colors; i++) -- FORCC cc[i][c] = getreal(type); -+ FORCC cc[tag-50723][i][c] = getreal(type); - break; - case 50727: /* AnalogBalance */ - FORCC ab[c] = getreal(type); -@@ -6114,6 +6135,11 @@ - case 50752: - read_shorts (cr2_slice, 3); - break; -+ case 50778: -+ case 50779: -+ if( get2() == 21 ) -+ cm_D65 = (tag-50778); -+ break; - case 50829: /* ActiveArea */ - top_margin = getint(type); - left_margin = getint(type); -@@ -6146,21 +6172,27 @@ - fread (buf, sony_length, 1, ifp); - sony_decrypt (buf, sony_length/4, 1, sony_key); - sfp = ifp; -- if ((ifp = tmpfile())) { -- fwrite (buf, sony_length, 1, ifp); -- fseek (ifp, 0, SEEK_SET); -- parse_tiff_ifd (-sony_offset); -- fclose (ifp); -- } -+/*RT*/ ifp = fopen (buf, sony_length); -+// if ((ifp = tmpfile())) { -+// fwrite (buf, sony_length, 1, ifp); -+// fseek (ifp, 0, SEEK_SET); -+ parse_tiff_ifd (-sony_offset); -+// fclose (ifp); -+// } -+ if(ifp) -+ fclose(ifp); - ifp = sfp; - free (buf); - } -+ - for (i=0; i < colors; i++) -- FORCC cc[i][c] *= ab[i]; -+ FORCC cc[cm_D65][i][c] *= ab[i]; - if (use_cm) { -+ if(cm_D65 == 1 && std::isnan(cm[1][0][0])) -+ cm_D65 = 0; - FORCC for (i=0; i < 3; i++) - for (cam_xyz[c][i]=j=0; j < colors; j++) -- cam_xyz[c][i] += cc[c][j] * cm[j][i] * xyz[i]; -+ cam_xyz[c][i] += cc[cm_D65][c][j] * cm[cm_D65][j][i] * xyz[i]; - cam_xyz_coeff (cmatrix, cam_xyz); - } - if (asn[0]) { -@@ -6168,13 +6200,14 @@ - FORCC cam_mul[c] = 1 / asn[c]; - } - if (!use_cm) -- FORCC pre_mul[c] /= cc[c][c]; -+ FORCC pre_mul[c] /= cc[cm_D65][c][c]; - return 0; - } - - int CLASS parse_tiff (int base) - { - int doff; -+ /*RT*/ if (exif_base == -1) exif_base = base; - - fseek (ifp, base, SEEK_SET); - order = get2(); -@@ -6206,6 +6239,7 @@ - shutter = tiff_ifd[i].shutter; - tiff_ifd[i].shutter = shutter; - } -+ - for (i=0; i < tiff_nifds; i++) { - if (max_samp < tiff_ifd[i].samples) - max_samp = tiff_ifd[i].samples; -@@ -6266,7 +6300,12 @@ - case 8: load_raw = &CLASS eight_bit_load_raw; break; - case 12: if (tiff_ifd[raw].phint == 2) - load_flags = 6; -- load_raw = &CLASS packed_load_raw; break; -+ if(!strncmp(make,"SONY",4) && tiff_ifd[raw].comp == 1) { // hack for some sony cameras which report as 12 bit uncompressed but in fact are 14 bit uncompressed -+ tiff_bps = 14; -+ } else { -+ load_raw = &CLASS packed_load_raw; -+ break; -+ } - case 14: load_flags = 0; - case 16: load_raw = &CLASS unpacked_load_raw; - if (!strncmp(make,"OLYMPUS",7) && -@@ -6305,6 +6344,7 @@ - case 32803: load_raw = &CLASS kodak_65000_load_raw; - } - case 32867: case 34892: break; -+ case 8: break; - default: is_raw = 0; - } - if (!dng_version) -@@ -6390,7 +6430,7 @@ - { - const char *file, *ext; - char *jname, *jfile, *jext; -- FILE *save=ifp; -+/*RT*/ IMFILE *save=ifp; - - ext = strrchr (ifname, '.'); - file = strrchr (ifname, '/'); -@@ -6412,13 +6452,14 @@ - } else - while (isdigit(*--jext)) { - if (*jext != '9') { -- (*jext)++; -+ (*jext)++; - break; - } - *jext = '0'; - } - if (strcmp (jname, ifname)) { -- if ((ifp = fopen (jname, "rb"))) { -+/*RT*/ if ((ifp = fopen (jname))) { -+// if ((ifp = fopen (jname, "rb"))) { - if (verbose) - fprintf (stderr,_("Reading metadata from %s ...\n"), jname); - parse_tiff (12); -@@ -6693,6 +6734,7 @@ - load_raw = ph1.format < 3 ? - &CLASS phase_one_load_raw : &CLASS phase_one_load_raw_c; - maximum = 0xffff; -+ tiff_bps = 16; - strcpy (make, "Phase One"); - if (model[0]) return; - switch (raw_height) { -@@ -6761,7 +6803,11 @@ - order = get2(); - hlen = get4(); - if (get4() == 0x48454150) /* "HEAP" */ -+/*RT*/ { -+/*RT*/ ciff_base = save+hlen; -+/*RT*/ ciff_len = len-hlen; - parse_ciff (save+hlen, len-hlen, 0); -+/*RT*/ } - if (parse_tiff (save+6)) apply_tiff(); - fseek (ifp, save+len, SEEK_SET); - } -@@ -7033,7 +7079,8 @@ - { - static const struct { - const char *prefix; -- short black, maximum, trans[12]; -+ unsigned short black, maximum; // RT: Change to UShort -+ short trans[12]; - } table[] = { - { "AgfaPhoto DC-833m", 0, 0, /* DJC */ - { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, -@@ -7977,12 +8024,12 @@ - { 6596,-2079,-562,-4782,13016,1933,-970,1581,5181 } }, - { "Sony DSC-RX100", 0, 0, - { 8651,-2754,-1057,-3464,12207,1373,-568,1398,4434 } }, -- { "Sony DSC-RX10", 0, 0, /* also RX10M2 */ -+ { "Sony DSC-RX10", 0, 0, - { 6679,-1825,-745,-5047,13256,1953,-1580,2422,5183 } }, - { "Sony DSC-RX1RM2", 0, 0, - { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, - { "Sony DSC-RX1", 0, 0, -- { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, -+ { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, - { "Sony DSLR-A100", 0, 0xfeb, - { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, - { "Sony DSLR-A290", 0, 0, -@@ -8088,6 +8135,33 @@ - } - break; - } -+ if (load_raw == &CLASS sony_arw2_load_raw) { // RT: arw2 scale fix -+ black <<= 2; -+ tiff_bps += 2; -+ } -+ { /* Check for RawTherapee table overrides and extensions */ -+ int black_level, white_level; -+ short trans[12]; -+ if (dcraw_coeff_overrides(make, model, iso_speed, trans, &black_level, &white_level)) { -+ if (black_level > -1) { -+ black = (ushort)black_level; -+ } -+ if (white_level > -1) { -+ maximum = (ushort)white_level; -+ if(tiff_bps > 0) { -+ unsigned compare = ((uint64_t)1 << tiff_bps) - 1; // use uint64_t to avoid overflow if tiff_bps == 32 -+ while(maximum > compare) -+ maximum >>= 1; -+ } -+ } -+ if (trans[0]) { -+ for (j=0; j < 12; j++) { -+ ((double *)cam_xyz)[j] = trans[j] / 10000.0; -+ } -+ cam_xyz_coeff (rgb_cam,cam_xyz); -+ } -+ } -+ } - } - - void CLASS simple_coeff (int index) -@@ -8410,7 +8484,7 @@ - tiff_flip = flip = filters = UINT_MAX; /* unknown */ - raw_height = raw_width = fuji_width = fuji_layout = cr2_slice[0] = 0; - maximum = height = width = top_margin = left_margin = 0; -- cdesc[0] = desc[0] = artist[0] = make[0] = model[0] = model2[0] = 0; -+ cdesc[0] = desc[0] = artist[0] = make[0] = model[0] = model2[0] = model3[0] = 0; - iso_speed = shutter = aperture = focal_len = unique_id = 0; - tiff_nifds = 0; - memset (tiff_ifd, 0, sizeof tiff_ifd); -@@ -8442,13 +8516,20 @@ - fread (head, 1, 32, ifp); - fseek (ifp, 0, SEEK_END); - flen = fsize = ftell(ifp); -- if ((cp = (char *) memmem (head, 32, "MMMM", 4)) || -- (cp = (char *) memmem (head, 32, "IIII", 4))) { -+ /*RT*/ if (fsize<100000) { -+ is_raw = 0; -+ return; -+ } -+ /* RT: changed string constant */ -+ if ((cp = (char *) memmem (head, 32, (char*)"MMMM", 4)) || -+ (cp = (char *) memmem (head, 32, (char*)"IIII", 4))) { - parse_phase_one (cp-head); - if (cp-head && parse_tiff(0)) apply_tiff(); - } else if (order == 0x4949 || order == 0x4d4d) { - if (!memcmp (head+6,"HEAPCCDR",8)) { - data_offset = hlen; -+/*RT*/ ciff_base = hlen; -+/*RT*/ ciff_len = fsize - hlen; - parse_ciff (hlen, flen-hlen, 0); - load_raw = &CLASS canon_load_raw; - } else if (parse_tiff(0)) apply_tiff(); -@@ -8491,9 +8572,10 @@ - parse_fuji (i); - } - load_raw = &CLASS unpacked_load_raw; -- fseek (ifp, 100+28*(shot_select > 0), SEEK_SET); -+ fseek (ifp, 100+28*(shot_select > 0 && shot_select < is_raw), SEEK_SET); - parse_tiff (data_offset = get4()); - parse_tiff (thumb_offset+12); -+/*RT*/ exif_base = thumb_offset+12; - apply_tiff(); - } else if (!memcmp (head,"RIFF",4)) { - fseek (ifp, 0, SEEK_SET); -@@ -8607,9 +8689,10 @@ - if (make[0] == 0) parse_smal (0, flen); - if (make[0] == 0) { - parse_jpeg(0); -- if (!(strncmp(model,"ov",2) && strncmp(model,"RP_OV",5)) && -- !fseek (ifp, -6404096, SEEK_END) && -- fread (head, 1, 32, ifp) && !strcmp(head,"BRCMn")) { -+ //RT fix for the use of fseek below -+ if (!(strncmp(model,"ov",2) && strncmp(model,"RP_OV",5))) { -+ fseek (ifp, -6404096, SEEK_END); -+ if (fread (head, 1, 32, ifp) && !strcmp(head,"BRCMn")) { - strcpy (make, "OmniVision"); - data_offset = ftell(ifp) + 0x8000-32; - width = raw_width; -@@ -8618,6 +8701,7 @@ - filters = 0x16161616; - } else is_raw = 0; - } -+ } - - for (i=0; i < sizeof corp / sizeof *corp; i++) - if (strcasestr (make, corp[i])) /* Simplify company names */ -@@ -8649,7 +8733,7 @@ - if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ - { height = 3124; width = 4688; filters = 0x16161616; } - if (width == 4352 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) -- { width = 4309; filters = 0x16161616; } -+/*RT*/ { width = 4308; filters = 0x16161616; } - if (width >= 4960 && !strncmp(model,"K-5",3)) - { left_margin = 10; width = 4950; filters = 0x16161616; } - if (width == 4736 && !strcmp(model,"K-7")) -@@ -8669,6 +8753,7 @@ - case 0: - case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = &CLASS lossless_dng_load_raw; break; -+ case 8: load_raw = &CLASS deflate_dng_load_raw; break; - case 34892: load_raw = &CLASS lossy_dng_load_raw; break; - default: load_raw = 0; - } -@@ -8725,6 +8810,7 @@ - if (height > width) pixel_aspect = 2; - filters = 0; - simple_coeff(0); -+ adobe_coeff (make, model); - } else if (!strcmp(make,"Canon") && tiff_bps == 15) { - switch (width) { - case 3344: width -= 66; -@@ -9034,24 +9120,53 @@ - if (load_raw == &CLASS lossless_jpeg_load_raw) - load_raw = &CLASS hasselblad_load_raw; - if (raw_width == 7262) { -+ if (!strcmp(model, "H3D")) strcpy(model, "H3D-39"); // RT - height = 5444; - width = 7248; - top_margin = 4; - left_margin = 7; - filters = 0x61616161; -- } else if (raw_width == 7410 || raw_width == 8282) { -- height -= 84; -- width -= 82; -+ } else if (raw_width == 7410) { -+ if (!strcmp(model, "H4D")) strcpy(model, "H4D-40"); // RT -+ height = 5502; -+ width = 7328; - top_margin = 4; - left_margin = 41; - filters = 0x61616161; -+ } else if (raw_width == 6542) { // RT, H3D-31, H3DII-31, H4D-31 -+ if (!strcmp(model, "H3D")) strcpy(model, "H3D-31"); -+ if (!strcmp(model, "H4D")) strcpy(model, "H4D-31"); -+ height = 4904; -+ width = 6524; -+ top_margin = 4; -+ left_margin = 8; -+ } else if (raw_width == 8282) { // RT, H3DII-50, H3DII-50MS, CFV-50, H4D-50 -+ if (!strcmp(model, "H3D")) strcpy(model, "H3DII-50"); -+ if (!strcmp(model, "H4D")) strcpy(model, "H4D-50"); -+ height = 6152; -+ width = 8196; -+ top_margin = 4; -+ left_margin = 44; -+ } else if (raw_width == 8374) { // RT, CFV-50c, H5D-50c, "H5D-50c MS", "H5D-200c MS" -+ if (!strcmp(model, "H5D")) strcpy(model, "H5D-50c"); -+ if (!strcmp(model, "CFV-2")) strcpy(model, "CFV-50c"); -+ height = 6208; -+ width = 8280; -+ top_margin = 96; -+ left_margin = 48; - } else if (raw_width == 9044) { - height = 6716; - width = 8964; - top_margin = 8; - left_margin = 40; -- black += load_flags = 256; -- maximum = 0x8101; -+ // RT: removed black level / maximum adjustment, as it does not seem to be correct when there are clipped highlights. Tested with Hasselblad H4D-60. -+ //black += load_flags = 256; -+ //maximum = 0x8101; -+ } else if (raw_width == 4096) { // RT: CF-22 etc -+ if (!strcmp(model, "H3D")) strcpy(model, "H3D-22"); -+ else if (strstr(model3, "Hasselblad ") == model3) strcpy(model, &model3[11]); -+ if (strstr(model3, "ixpressCF132")) strcpy(model, "CF-22"); // ixpressCF132 / CF132 is same as CF-22, we use the simpler name -+ else if (strstr(model3, "Hasselblad96")) strcpy(model, "CFV"); // popularly called CFV-16 - } else if (raw_width == 4090) { - strcpy (model, "V96C"); - height -= (top_margin = 6); -@@ -9109,6 +9224,7 @@ - filters = 0x16161616; - } - } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { -+ if(raw_width > 0) { // avoid divide by zero - if ((flen - data_offset) / (raw_width*8/7) == raw_height) - load_raw = &CLASS panasonic_load_raw; - if (!load_raw) { -@@ -9126,6 +9242,7 @@ - } - filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" - [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; -+ } - } else if (!strcmp(model,"C770UZ")) { - height = 1718; - width = 2304; -@@ -9201,13 +9318,15 @@ - width -= 6; - } else if (!strcmp(make,"Sony") && raw_width == 7392) { - width -= 30; -- } else if (!strcmp(make,"Sony") && raw_width == 8000) { -- width -= 32; -- if (!strncmp(model,"DSC",3)) { -- tiff_bps = 14; -- load_raw = &CLASS unpacked_load_raw; -- black = 512; -- } -+// this was introduced with update to dcraw 9.27 -+// but led to broken decode for compressed files from Sony DSC-RX1RM2 -+// } else if (!strcmp(make,"Sony") && raw_width == 8000) { -+// width -= 32; -+// if (!strncmp(model,"DSC",3)) { -+// tiff_bps = 14; -+// load_raw = &CLASS unpacked_load_raw; -+// black = 512; -+// } - } else if (!strcmp(model,"DSLR-A100")) { - if (width == 3880) { - height--; -@@ -9357,6 +9476,20 @@ - memcpy (rgb_cam, cmatrix, sizeof cmatrix); - raw_color = 0; - } -+ if(!strncmp(make, "Panasonic", 9) && !strncmp(model, "DMC-LX100",9)) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "Samsung", 7) && !strncmp(model, "GX20",4)) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "Samsung", 7) && !strncmp(model, "NX1",3)) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "Pentax", 6) && (!strncmp(model, "K10D",4) || !strncmp(model, "K-70",4))) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "Leica", 5) && !strncmp(model, "Q",1)) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "Leica", 5) && !strncmp(model, "SL",2)) -+ adobe_coeff (make, model); -+ if(!strncmp(make, "XIAOYI", 6) && !strncmp(model, "M1",2)) -+ adobe_coeff (make, model); - if (raw_color) adobe_coeff (make, model); - if (load_raw == &CLASS kodak_radc_load_raw) - if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -9371,9 +9504,9 @@ - if (raw_width < width ) raw_width = width; - } - if (!tiff_bps) tiff_bps = 12; -- if (!maximum) maximum = (1 << tiff_bps) - 1; -+ if (!maximum) maximum = ((uint64_t)1 << tiff_bps) - 1; // use uint64_t to avoid overflow if tiff_bps == 32 - if (!load_raw || height < 22 || width < 22 || -- tiff_bps > 16 || tiff_samples > 6 || colors > 4) -+ tiff_samples > 6 || colors > 4) - is_raw = 0; - #ifdef NO_JASPER - if (load_raw == &CLASS redcine_load_raw) { -@@ -9402,249 +9535,300 @@ - if (flip == UINT_MAX) flip = 0; - } - --#ifndef NO_LCMS --void CLASS apply_profile (const char *input, const char *output) --{ -- char *prof; -- cmsHPROFILE hInProfile=0, hOutProfile=0; -- cmsHTRANSFORM hTransform; -- FILE *fp; -- unsigned size; -- -- if (strcmp (input, "embed")) -- hInProfile = cmsOpenProfileFromFile (input, "r"); -- else if (profile_length) { -- prof = (char *) malloc (profile_length); -- merror (prof, "apply_profile()"); -- fseek (ifp, profile_offset, SEEK_SET); -- fread (prof, 1, profile_length, ifp); -- hInProfile = cmsOpenProfileFromMem (prof, profile_length); -- free (prof); -- } else -- fprintf (stderr,_("%s has no embedded profile.\n"), ifname); -- if (!hInProfile) return; -- if (!output) -- hOutProfile = cmsCreate_sRGBProfile(); -- else if ((fp = fopen (output, "rb"))) { -- fread (&size, 4, 1, fp); -- fseek (fp, 0, SEEK_SET); -- oprof = (unsigned *) malloc (size = ntohl(size)); -- merror (oprof, "apply_profile()"); -- fread (oprof, 1, size, fp); -- fclose (fp); -- if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) { -- free (oprof); -- oprof = 0; -+//#ifndef NO_LCMS -+//void CLASS apply_profile (const char *input, const char *output) -+//{ -+// char *prof; -+// cmsHPROFILE hInProfile=0, hOutProfile=0; -+// cmsHTRANSFORM hTransform; -+// FILE *fp; -+// unsigned size; -+// -+// if (strcmp (input, "embed")) -+// hInProfile = cmsOpenProfileFromFile (input, "r"); -+// else if (profile_length) { -+// prof = (char *) malloc (profile_length); -+// merror (prof, "apply_profile()"); -+// fseek (ifp, profile_offset, SEEK_SET); -+// fread (prof, 1, profile_length, ifp); -+// hInProfile = cmsOpenProfileFromMem (prof, profile_length); -+// free (prof); -+// } else -+// fprintf (stderr,_("%s has no embedded profile.\n"), ifname); -+// if (!hInProfile) return; -+// if (!output) -+// hOutProfile = cmsCreate_sRGBProfile(); -+// else if ((fp = fopen (output, "rb"))) { -+// fread (&size, 4, 1, fp); -+// fseek (fp, 0, SEEK_SET); -+// oprof = (unsigned *) malloc (size = ntohl(size)); -+// merror (oprof, "apply_profile()"); -+// fread (oprof, 1, size, fp); -+// fclose (fp); -+// if (!(hOutProfile = cmsOpenProfileFromMem (oprof, size))) { -+// free (oprof); -+// oprof = 0; -+// } -+// } else -+// fprintf (stderr,_("Cannot open file %s!\n"), output); -+// if (!hOutProfile) goto quit; -+// if (verbose) -+// fprintf (stderr,_("Applying color profile...\n")); -+// hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16, -+// hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0); -+// cmsDoTransform (hTransform, image, image, width*height); -+// raw_color = 1; /* Don't use rgb_cam with a profile */ -+// cmsDeleteTransform (hTransform); -+// cmsCloseProfile (hOutProfile); -+//quit: -+// cmsCloseProfile (hInProfile); -+//} -+//#endif -+ -+/* RT: DNG Float */ -+ -+#include -+#include -+ -+static void decodeFPDeltaRow(Bytef * src, Bytef * dst, size_t tileWidth, size_t realTileWidth, int bytesps, int factor) { -+ // DecodeDeltaBytes -+ for (size_t col = factor; col < realTileWidth*bytesps; ++col) { -+ src[col] += src[col - factor]; -+ } -+ // Reorder bytes into the image -+ // 16 and 32-bit versions depend on local architecture, 24-bit does not -+ if (bytesps == 3) { -+ for (size_t col = 0; col < tileWidth; ++col) { -+ dst[col*3] = src[col]; -+ dst[col*3 + 1] = src[col + realTileWidth]; -+ dst[col*3 + 2] = src[col + realTileWidth*2]; - } -- } else -- fprintf (stderr,_("Cannot open file %s!\n"), output); -- if (!hOutProfile) goto quit; -- if (verbose) -- fprintf (stderr,_("Applying color profile...\n")); -- hTransform = cmsCreateTransform (hInProfile, TYPE_RGBA_16, -- hOutProfile, TYPE_RGBA_16, INTENT_PERCEPTUAL, 0); -- cmsDoTransform (hTransform, image, image, width*height); -- raw_color = 1; /* Don't use rgb_cam with a profile */ -- cmsDeleteTransform (hTransform); -- cmsCloseProfile (hOutProfile); --quit: -- cmsCloseProfile (hInProfile); -+ } else { -+ union X { uint32_t x; uint8_t c; }; -+ if (((union X){1}).c) { -+ for (size_t col = 0; col < tileWidth; ++col) { -+ for (size_t byte = 0; byte < bytesps; ++byte) -+ dst[col*bytesps + byte] = src[col + realTileWidth*(bytesps-byte-1)]; // Little endian -+ } -+ } else { -+ for (size_t col = 0; col < tileWidth; ++col) { -+ for (size_t byte = 0; byte < bytesps; ++byte) -+ dst[col*bytesps + byte] = src[col + realTileWidth*byte]; -+ } -+ } -+ } -+ - } --#endif - --void CLASS convert_to_rgb() --{ -- int row, col, c, i, j, k; -- ushort *img; -- float out[3], out_cam[3][4]; -- double num, inverse[3][3]; -- static const double xyzd50_srgb[3][3] = -- { { 0.436083, 0.385083, 0.143055 }, -- { 0.222507, 0.716888, 0.060608 }, -- { 0.013930, 0.097097, 0.714022 } }; -- static const double rgb_rgb[3][3] = -- { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; -- static const double adobe_rgb[3][3] = -- { { 0.715146, 0.284856, 0.000000 }, -- { 0.000000, 1.000000, 0.000000 }, -- { 0.000000, 0.041166, 0.958839 } }; -- static const double wide_rgb[3][3] = -- { { 0.593087, 0.404710, 0.002206 }, -- { 0.095413, 0.843149, 0.061439 }, -- { 0.011621, 0.069091, 0.919288 } }; -- static const double prophoto_rgb[3][3] = -- { { 0.529317, 0.330092, 0.140588 }, -- { 0.098368, 0.873465, 0.028169 }, -- { 0.016879, 0.117663, 0.865457 } }; -- static const double aces_rgb[3][3] = -- { { 0.432996, 0.375380, 0.189317 }, -- { 0.089427, 0.816523, 0.102989 }, -- { 0.019165, 0.118150, 0.941914 } }; -- static const double (*out_rgb[])[3] = -- { rgb_rgb, adobe_rgb, wide_rgb, prophoto_rgb, xyz_rgb, aces_rgb }; -- static const char *name[] = -- { "sRGB", "Adobe RGB (1998)", "WideGamut D65", "ProPhoto D65", "XYZ", "ACES" }; -- static const unsigned phead[] = -- { 1024, 0, 0x2100000, 0x6d6e7472, 0x52474220, 0x58595a20, 0, 0, 0, -- 0x61637370, 0, 0, 0x6e6f6e65, 0, 0, 0, 0, 0xf6d6, 0x10000, 0xd32d }; -- unsigned pbody[] = -- { 10, 0x63707274, 0, 36, /* cprt */ -- 0x64657363, 0, 40, /* desc */ -- 0x77747074, 0, 20, /* wtpt */ -- 0x626b7074, 0, 20, /* bkpt */ -- 0x72545243, 0, 14, /* rTRC */ -- 0x67545243, 0, 14, /* gTRC */ -- 0x62545243, 0, 14, /* bTRC */ -- 0x7258595a, 0, 20, /* rXYZ */ -- 0x6758595a, 0, 20, /* gXYZ */ -- 0x6258595a, 0, 20 }; /* bXYZ */ -- static const unsigned pwhite[] = { 0xf351, 0x10000, 0x116cc }; -- unsigned pcurve[] = { 0x63757276, 0, 1, 0x1000000 }; -- -- gamma_curve (gamm[0], gamm[1], 0, 0); -- memcpy (out_cam, rgb_cam, sizeof out_cam); -- raw_color |= colors == 1 || document_mode || -- output_color < 1 || output_color > 6; -- if (!raw_color) { -- oprof = (unsigned *) calloc (phead[0], 1); -- merror (oprof, "convert_to_rgb()"); -- memcpy (oprof, phead, sizeof phead); -- if (output_color == 5) oprof[4] = oprof[5]; -- oprof[0] = 132 + 12*pbody[0]; -- for (i=0; i < pbody[0]; i++) { -- oprof[oprof[0]/4] = i ? (i > 1 ? 0x58595a20 : 0x64657363) : 0x74657874; -- pbody[i*3+2] = oprof[0]; -- oprof[0] += (pbody[i*3+3] + 3) & -4; -- } -- memcpy (oprof+32, pbody, sizeof pbody); -- oprof[pbody[5]/4+2] = strlen(name[output_color-1]) + 1; -- memcpy ((char *)oprof+pbody[8]+8, pwhite, sizeof pwhite); -- pcurve[3] = (short)(256/gamm[5]+0.5) << 16; -- for (i=4; i < 7; i++) -- memcpy ((char *)oprof+pbody[i*3+2], pcurve, sizeof pcurve); -- pseudoinverse ((double (*)[3]) out_rgb[output_color-1], inverse, 3); -- for (i=0; i < 3; i++) -- for (j=0; j < 3; j++) { -- for (num = k=0; k < 3; k++) -- num += xyzd50_srgb[i][k] * inverse[j][k]; -- oprof[pbody[j*3+23]/4+i+2] = num * 0x10000 + 0.5; -- } -- for (i=0; i < phead[0]/4; i++) -- oprof[i] = htonl(oprof[i]); -- strcpy ((char *)oprof+pbody[2]+8, "auto-generated by dcraw"); -- strcpy ((char *)oprof+pbody[5]+12, name[output_color-1]); -- for (i=0; i < 3; i++) -- for (j=0; j < colors; j++) -- for (out_cam[i][j] = k=0; k < 3; k++) -- out_cam[i][j] += out_rgb[output_color-1][i][k] * rgb_cam[k][j]; -+// From DNG SDK dng_utils.h -+static inline uint32_t DNG_HalfToFloat(uint16_t halfValue) { -+ int32_t sign = (halfValue >> 15) & 0x00000001; -+ int32_t exponent = (halfValue >> 10) & 0x0000001f; -+ int32_t mantissa = halfValue & 0x000003ff; -+ if (exponent == 0) { -+ if (mantissa == 0) { -+ // Plus or minus zero -+ return (uint32_t) (sign << 31); -+ } else { -+ // Denormalized number -- renormalize it -+ while (!(mantissa & 0x00000400)) { -+ mantissa <<= 1; -+ exponent -= 1; -+ } -+ exponent += 1; -+ mantissa &= ~0x00000400; -+ } -+ } else if (exponent == 31) { -+ if (mantissa == 0) { -+ // Positive or negative infinity, convert to maximum (16 bit) values. -+ return (uint32_t) ((sign << 31) | ((0x1eL + 127 - 15) << 23) | (0x3ffL << 13)); -+ } else { -+ // Nan -- Just set to zero. -+ return 0; -+ } - } -- if (verbose) -- fprintf (stderr, raw_color ? _("Building histograms...\n") : -- _("Converting to %s colorspace...\n"), name[output_color-1]); -+ // Normalized number -+ exponent += (127 - 15); -+ mantissa <<= 13; -+ // Assemble sign, exponent and mantissa. -+ return (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); -+} - -- memset (histogram, 0, sizeof histogram); -- for (img=image[0], row=0; row < height; row++) -- for (col=0; col < width; col++, img+=4) { -- if (!raw_color) { -- out[0] = out[1] = out[2] = 0; -- FORCC { -- out[0] += out_cam[0][c] * img[c]; -- out[1] += out_cam[1][c] * img[c]; -- out[2] += out_cam[2][c] * img[c]; -- } -- FORC3 img[c] = CLIP((int) out[c]); -- } -- else if (document_mode) -- img[0] = img[fcol(row,col)]; -- FORCC histogram[c][img[c] >> 3]++; -- } -- if (colors == 4 && output_color) colors = 3; -- if (document_mode && filters) colors = 1; --} -- --void CLASS fuji_rotate() --{ -- int i, row, col; -- double step; -- float r, c, fr, fc; -- unsigned ur, uc; -- ushort wide, high, (*img)[4], (*pix)[4]; -+static inline uint32_t DNG_FP24ToFloat(const uint8_t * input) { -+ int32_t sign = (input [0] >> 7) & 0x01; -+ int32_t exponent = (input [0] ) & 0x7F; -+ int32_t mantissa = (((int32_t) input [1]) << 8) | input[2]; -+ if (exponent == 0) { -+ if (mantissa == 0) { -+ // Plus or minus zero -+ return (uint32_t) (sign << 31); -+ } else { -+ // Denormalized number -- renormalize it -+ while (!(mantissa & 0x00010000)) { -+ mantissa <<= 1; -+ exponent -= 1; -+ } -+ exponent += 1; -+ mantissa &= ~0x00010000; -+ } -+ } else if (exponent == 127) { -+ if (mantissa == 0) { -+ // Positive or negative infinity, convert to maximum (24 bit) values. -+ return (uint32_t) ((sign << 31) | ((0x7eL + 128 - 64) << 23) | (0xffffL << 7)); -+ } else { -+ // Nan -- Just set to zero. -+ return 0; -+ } -+ } -+ // Normalized number -+ exponent += (128 - 64); -+ mantissa <<= 7; -+ // Assemble sign, exponent and mantissa. -+ return (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); -+} - -- if (!fuji_width) return; -- if (verbose) -- fprintf (stderr,_("Rotating image 45 degrees...\n")); -- fuji_width = (fuji_width - 1 + shrink) >> shrink; -- step = sqrt(0.5); -- wide = fuji_width / step; -- high = (height - fuji_width) / step; -- img = (ushort (*)[4]) calloc (high, wide*sizeof *img); -- merror (img, "fuji_rotate()"); -- -- for (row=0; row < high; row++) -- for (col=0; col < wide; col++) { -- ur = r = fuji_width + (row-col)*step; -- uc = c = (row+col)*step; -- if (ur > height-2 || uc > width-2) continue; -- fr = r - ur; -- fc = c - uc; -- pix = image + ur*width + uc; -- for (i=0; i < colors; i++) -- img[row*wide+col][i] = -- (pix[ 0][i]*(1-fc) + pix[ 1][i]*fc) * (1-fr) + -- (pix[width][i]*(1-fc) + pix[width+1][i]*fc) * fr; -- } -- free (image); -- width = wide; -- height = high; -- image = img; -- fuji_width = 0; -+static void expandFloats(Bytef * dst, int tileWidth, int bytesps) { -+ if (bytesps == 2) { -+ uint16_t * dst16 = (uint16_t *) dst; -+ uint32_t * dst32 = (uint32_t *) dst; -+ for (int index = tileWidth - 1; index >= 0; --index) { -+ dst32[index] = DNG_HalfToFloat(dst16[index]); -+ } -+ } else if (bytesps == 3) { -+ uint8_t * dst8 = ((uint8_t *) dst) + (tileWidth - 1) * 3; -+ uint32_t * dst32 = (uint32_t *) dst; -+ for (int index = tileWidth - 1; index >= 0; --index, dst8 -= 3) { -+ dst32[index] = DNG_FP24ToFloat(dst8); -+ } -+ } - } - --void CLASS stretch() -+static void copyFloatDataToInt(float * src, ushort * dst, size_t size, float max) { -+ bool negative = false, nan = false; -+ -+#ifdef _OPENMP -+#pragma omp parallel for -+#endif -+ for (size_t i = 0; i < size; ++i) { -+ if (src[i] < 0.0f) { -+ negative = true; -+ src[i] = 0.0f; -+ } else if (std::isnan(src[i])) { -+ nan = true; -+ src[i] = max; -+ } -+ // Copy the data to the integer buffer to build the thumbnail -+ dst[i] = (ushort)src[i]; -+ } -+ if (negative) -+ fprintf(stderr, "DNG Float: Negative data found in input file\n"); -+ if (nan) -+ fprintf(stderr, "DNG Float: NaN data found in input file\n"); -+} -+ -+void CLASS deflate_dng_load_raw() { -+ struct tiff_ifd * ifd = &tiff_ifd[0]; -+ while (ifd < &tiff_ifd[tiff_nifds] && ifd->offset != data_offset) ++ifd; -+ if (ifd == &tiff_ifd[tiff_nifds]) { -+ fprintf(stderr, "DNG Deflate: Raw image not found???\n"); -+ return; -+ } -+ -+ int predFactor; -+ switch(ifd->predictor) { -+ case 3: predFactor = 1; break; -+ case 34894: predFactor = 2; break; -+ case 34895: predFactor = 4; break; -+ default: predFactor = 0; break; -+ } -+ -+ if (ifd->sample_format == 3) { // Floating point data -+ float_raw_image = new float[raw_width * raw_height]; -+ -+#ifdef _OPENMP -+#pragma omp parallel for -+#endif -+ for (size_t i = 0; i < raw_width * raw_height; ++i) -+ float_raw_image[i] = 0.0f; -+ } -+ -+ // NOTE: This reader is based on the official DNG SDK from Adobe. -+ // It assumes tiles without subtiles, but the standard does not say that -+ // subtiles or strips couldn't be used. -+ if (tile_length < INT_MAX) { -+ size_t tilesWide = (raw_width + tile_width - 1) / tile_width; -+ size_t tilesHigh = (raw_height + tile_length - 1) / tile_length; -+ size_t tileCount = tilesWide * tilesHigh; -+ //fprintf(stderr, "%dx%d tiles, %d total\n", tilesWide, tilesHigh, tileCount); -+ size_t tileOffsets[tileCount]; -+ for (size_t t = 0; t < tileCount; ++t) { -+ tileOffsets[t] = get4(); -+ } -+ size_t tileBytes[tileCount]; -+ uLongf maxCompressed = 0; -+ if (tileCount == 1) { -+ tileBytes[0] = maxCompressed = ifd->bytes; -+ } else { -+ fseek(ifp, ifd->bytes, SEEK_SET); -+ for (size_t t = 0; t < tileCount; ++t) { -+ tileBytes[t] = get4(); -+ //fprintf(stderr, "Tile %d at %d, size %d\n", t, tileOffsets[t], tileBytes[t]); -+ if (maxCompressed < tileBytes[t]) -+ maxCompressed = tileBytes[t]; -+ } -+ } -+ uLongf dstLen = tile_width * tile_length * 4; -+ -+#ifdef _OPENMP -+#pragma omp parallel -+#endif - { -- ushort newdim, (*img)[4], *pix0, *pix1; -- int row, col, c; -- double rc, frac; -+ Bytef * cBuffer = new Bytef[maxCompressed]; -+ Bytef * uBuffer = new Bytef[dstLen]; - -- if (pixel_aspect == 1) return; -- if (verbose) fprintf (stderr,_("Stretching the image...\n")); -- if (pixel_aspect < 1) { -- newdim = height / pixel_aspect + 0.5; -- img = (ushort (*)[4]) calloc (width, newdim*sizeof *img); -- merror (img, "stretch()"); -- for (rc=row=0; row < newdim; row++, rc+=pixel_aspect) { -- frac = rc - (c = rc); -- pix0 = pix1 = image[c*width]; -- if (c+1 < height) pix1 += width*4; -- for (col=0; col < width; col++, pix0+=4, pix1+=4) -- FORCC img[row*width+col][c] = pix0[c]*(1-frac) + pix1[c]*frac + 0.5; -+#ifdef _OPENMP -+#pragma omp for collapse(2) nowait -+#endif -+ for (size_t y = 0; y < raw_height; y += tile_length) { -+ for (size_t x = 0; x < raw_width; x += tile_width) { -+ size_t t = (y / tile_length) * tilesWide + (x / tile_width); -+#pragma omp critical -+{ -+ fseek(ifp, tileOffsets[t], SEEK_SET); -+ fread(cBuffer, 1, tileBytes[t], ifp); -+} -+ int err = uncompress(uBuffer, &dstLen, cBuffer, tileBytes[t]); -+ if (err != Z_OK) { -+ fprintf(stderr, "DNG Deflate: Failed uncompressing tile %d, with error %d\n", (int)t, err); -+ } else if (ifd->sample_format == 3) { // Floating point data -+ int bytesps = ifd->bps >> 3; -+ size_t thisTileLength = y + tile_length > raw_height ? raw_height - y : tile_length; -+ size_t thisTileWidth = x + tile_width > raw_width ? raw_width - x : tile_width; -+ for (size_t row = 0; row < thisTileLength; ++row) { -+ Bytef * src = uBuffer + row*tile_width*bytesps; -+ Bytef * dst = (Bytef *)&float_raw_image[(y+row)*raw_width + x]; -+ if (predFactor) -+ decodeFPDeltaRow(src, dst, thisTileWidth, tile_width, bytesps, predFactor); -+ expandFloats(dst, thisTileWidth, bytesps); -+ } -+ } else { // 32-bit Integer data -+ // TODO -+ } -+ } - } -- height = newdim; -- } else { -- newdim = width * pixel_aspect + 0.5; -- img = (ushort (*)[4]) calloc (height, newdim*sizeof *img); -- merror (img, "stretch()"); -- for (rc=col=0; col < newdim; col++, rc+=1/pixel_aspect) { -- frac = rc - (c = rc); -- pix0 = pix1 = image[c]; -- if (c+1 < width) pix1 += 4; -- for (row=0; row < height; row++, pix0+=width*4, pix1+=width*4) -- FORCC img[row*newdim+col][c] = pix0[c]*(1-frac) + pix1[c]*frac + 0.5; -- } -- width = newdim; -- } -- free (image); -- image = img; --} -- --int CLASS flip_index (int row, int col) --{ -- if (flip & 4) SWAP(row,col); -- if (flip & 2) row = iheight - 1 - row; -- if (flip & 1) col = iwidth - 1 - col; -- return row * iwidth + col; -+ -+ delete [] cBuffer; -+ delete [] uBuffer; -+} -+ } -+ -+ if (ifd->sample_format == 3) { // Floating point data -+ copyFloatDataToInt(float_raw_image, raw_image, raw_width*raw_height, maximum); -+ } - } - -+/* RT: removed unused functions */ -+ - struct tiff_tag { - ushort tag, type; - int count; -@@ -9667,594 +9851,11 @@ - char desc[512], make[64], model[64], soft[32], date[20], artist[64]; - }; - --void CLASS tiff_set (struct tiff_hdr *th, ushort *ntag, -- ushort tag, ushort type, int count, int val) --{ -- struct tiff_tag *tt; -- int c; -- -- tt = (struct tiff_tag *)(ntag+1) + (*ntag)++; -- tt->val.i = val; -- if (type == 1 && count <= 4) -- FORC(4) tt->val.c[c] = val >> (c << 3); -- else if (type == 2) { -- count = strnlen((char *)th + val, count-1) + 1; -- if (count <= 4) -- FORC(4) tt->val.c[c] = ((char *)th)[val+c]; -- } else if (type == 3 && count <= 2) -- FORC(2) tt->val.s[c] = val >> (c << 4); -- tt->count = count; -- tt->type = type; -- tt->tag = tag; --} -- --#define TOFF(ptr) ((char *)(&(ptr)) - (char *)th) -- --void CLASS tiff_head (struct tiff_hdr *th, int full) --{ -- int c, psize=0; -- struct tm *t; -- -- memset (th, 0, sizeof *th); -- th->order = htonl(0x4d4d4949) >> 16; -- th->magic = 42; -- th->ifd = 10; -- th->rat[0] = th->rat[2] = 300; -- th->rat[1] = th->rat[3] = 1; -- FORC(6) th->rat[4+c] = 1000000; -- th->rat[4] *= shutter; -- th->rat[6] *= aperture; -- th->rat[8] *= focal_len; -- strncpy (th->desc, desc, 512); -- strncpy (th->make, make, 64); -- strncpy (th->model, model, 64); -- strcpy (th->soft, "dcraw v"DCRAW_VERSION); -- t = localtime (×tamp); -- sprintf (th->date, "%04d:%02d:%02d %02d:%02d:%02d", -- t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); -- strncpy (th->artist, artist, 64); -- if (full) { -- tiff_set (th, &th->ntag, 254, 4, 1, 0); -- tiff_set (th, &th->ntag, 256, 4, 1, width); -- tiff_set (th, &th->ntag, 257, 4, 1, height); -- tiff_set (th, &th->ntag, 258, 3, colors, output_bps); -- if (colors > 2) -- th->tag[th->ntag-1].val.i = TOFF(th->bps); -- FORC4 th->bps[c] = output_bps; -- tiff_set (th, &th->ntag, 259, 3, 1, 1); -- tiff_set (th, &th->ntag, 262, 3, 1, 1 + (colors > 1)); -- } -- tiff_set (th, &th->ntag, 270, 2, 512, TOFF(th->desc)); -- tiff_set (th, &th->ntag, 271, 2, 64, TOFF(th->make)); -- tiff_set (th, &th->ntag, 272, 2, 64, TOFF(th->model)); -- if (full) { -- if (oprof) psize = ntohl(oprof[0]); -- tiff_set (th, &th->ntag, 273, 4, 1, sizeof *th + psize); -- tiff_set (th, &th->ntag, 277, 3, 1, colors); -- tiff_set (th, &th->ntag, 278, 4, 1, height); -- tiff_set (th, &th->ntag, 279, 4, 1, height*width*colors*output_bps/8); -- } else -- tiff_set (th, &th->ntag, 274, 3, 1, "12435867"[flip]-'0'); -- tiff_set (th, &th->ntag, 282, 5, 1, TOFF(th->rat[0])); -- tiff_set (th, &th->ntag, 283, 5, 1, TOFF(th->rat[2])); -- tiff_set (th, &th->ntag, 284, 3, 1, 1); -- tiff_set (th, &th->ntag, 296, 3, 1, 2); -- tiff_set (th, &th->ntag, 305, 2, 32, TOFF(th->soft)); -- tiff_set (th, &th->ntag, 306, 2, 20, TOFF(th->date)); -- tiff_set (th, &th->ntag, 315, 2, 64, TOFF(th->artist)); -- tiff_set (th, &th->ntag, 34665, 4, 1, TOFF(th->nexif)); -- if (psize) tiff_set (th, &th->ntag, 34675, 7, psize, sizeof *th); -- tiff_set (th, &th->nexif, 33434, 5, 1, TOFF(th->rat[4])); -- tiff_set (th, &th->nexif, 33437, 5, 1, TOFF(th->rat[6])); -- tiff_set (th, &th->nexif, 34855, 3, 1, iso_speed); -- tiff_set (th, &th->nexif, 37386, 5, 1, TOFF(th->rat[8])); -- if (gpsdata[1]) { -- tiff_set (th, &th->ntag, 34853, 4, 1, TOFF(th->ngps)); -- tiff_set (th, &th->ngps, 0, 1, 4, 0x202); -- tiff_set (th, &th->ngps, 1, 2, 2, gpsdata[29]); -- tiff_set (th, &th->ngps, 2, 5, 3, TOFF(th->gps[0])); -- tiff_set (th, &th->ngps, 3, 2, 2, gpsdata[30]); -- tiff_set (th, &th->ngps, 4, 5, 3, TOFF(th->gps[6])); -- tiff_set (th, &th->ngps, 5, 1, 1, gpsdata[31]); -- tiff_set (th, &th->ngps, 6, 5, 1, TOFF(th->gps[18])); -- tiff_set (th, &th->ngps, 7, 5, 3, TOFF(th->gps[12])); -- tiff_set (th, &th->ngps, 18, 2, 12, TOFF(th->gps[20])); -- tiff_set (th, &th->ngps, 29, 2, 12, TOFF(th->gps[23])); -- memcpy (th->gps, gpsdata, sizeof th->gps); -- } --} -- --void CLASS jpeg_thumb() --{ -- char *thumb; -- ushort exif[5]; -- struct tiff_hdr th; -- -- thumb = (char *) malloc (thumb_length); -- merror (thumb, "jpeg_thumb()"); -- fread (thumb, 1, thumb_length, ifp); -- fputc (0xff, ofp); -- fputc (0xd8, ofp); -- if (strcmp (thumb+6, "Exif")) { -- memcpy (exif, "\xff\xe1 Exif\0\0", 10); -- exif[1] = htons (8 + sizeof th); -- fwrite (exif, 1, sizeof exif, ofp); -- tiff_head (&th, 0); -- fwrite (&th, 1, sizeof th, ofp); -- } -- fwrite (thumb+2, 1, thumb_length-2, ofp); -- free (thumb); --} -- --void CLASS write_ppm_tiff() --{ -- struct tiff_hdr th; -- uchar *ppm; -- ushort *ppm2; -- int c, row, col, soff, rstep, cstep; -- int perc, val, total, white=0x2000; -- -- perc = width * height * 0.01; /* 99th percentile white level */ -- if (fuji_width) perc /= 2; -- if (!((highlight & ~2) || no_auto_bright)) -- for (white=c=0; c < colors; c++) { -- for (val=0x2000, total=0; --val > 32; ) -- if ((total += histogram[c][val]) > perc) break; -- if (white < val) white = val; -- } -- gamma_curve (gamm[0], gamm[1], 2, (white << 3)/bright); -- iheight = height; -- iwidth = width; -- if (flip & 4) SWAP(height,width); -- ppm = (uchar *) calloc (width, colors*output_bps/8); -- ppm2 = (ushort *) ppm; -- merror (ppm, "write_ppm_tiff()"); -- if (output_tiff) { -- tiff_head (&th, 1); -- fwrite (&th, sizeof th, 1, ofp); -- if (oprof) -- fwrite (oprof, ntohl(oprof[0]), 1, ofp); -- } else if (colors > 3) -- fprintf (ofp, -- "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLTYPE %s\nENDHDR\n", -- width, height, colors, (1 << output_bps)-1, cdesc); -- else -- fprintf (ofp, "P%d\n%d %d\n%d\n", -- colors/2+5, width, height, (1 << output_bps)-1); -- soff = flip_index (0, 0); -- cstep = flip_index (0, 1) - soff; -- rstep = flip_index (1, 0) - flip_index (0, width); -- for (row=0; row < height; row++, soff += rstep) { -- for (col=0; col < width; col++, soff += cstep) -- if (output_bps == 8) -- FORCC ppm [col*colors+c] = curve[image[soff][c]] >> 8; -- else FORCC ppm2[col*colors+c] = curve[image[soff][c]]; -- if (output_bps == 16 && !output_tiff && htons(0x55aa) != 0x55aa) -- swab (ppm2, ppm2, width*colors*2); -- fwrite (ppm, colors*output_bps/8, width, ofp); -- } -- free (ppm); --} -- --int CLASS main (int argc, const char **argv) --{ -- int arg, status=0, quality, i, c; -- int timestamp_only=0, thumbnail_only=0, identify_only=0; -- int user_qual=-1, user_black=-1, user_sat=-1, user_flip=-1; -- int use_fuji_rotate=1, write_to_stdout=0, read_from_stdin=0; -- const char *sp, *bpfile=0, *dark_frame=0, *write_ext; -- char opm, opt, *ofname, *cp; -- struct utimbuf ut; --#ifndef NO_LCMS -- const char *cam_profile=0, *out_profile=0; --#endif -- --#ifndef LOCALTIME -- putenv ((char *) "TZ=UTC"); --#endif --#ifdef LOCALEDIR -- setlocale (LC_CTYPE, ""); -- setlocale (LC_MESSAGES, ""); -- bindtextdomain ("dcraw", LOCALEDIR); -- textdomain ("dcraw"); --#endif -- -- if (argc == 1) { -- printf(_("\nRaw photo decoder \"dcraw\" v%s"), DCRAW_VERSION); -- printf(_("\nby Dave Coffin, dcoffin a cybercom o net\n")); -- printf(_("\nUsage: %s [OPTION]... [FILE]...\n\n"), argv[0]); -- puts(_("-v Print verbose messages")); -- puts(_("-c Write image data to standard output")); -- puts(_("-e Extract embedded thumbnail image")); -- puts(_("-i Identify files without decoding them")); -- puts(_("-i -v Identify files and show metadata")); -- puts(_("-z Change file dates to camera timestamp")); -- puts(_("-w Use camera white balance, if possible")); -- puts(_("-a Average the whole image for white balance")); -- puts(_("-A Average a grey box for white balance")); -- puts(_("-r Set custom white balance")); -- puts(_("+M/-M Use/don't use an embedded color matrix")); -- puts(_("-C Correct chromatic aberration")); -- puts(_("-P Fix the dead pixels listed in this file")); -- puts(_("-K Subtract dark frame (16-bit raw PGM)")); -- puts(_("-k Set the darkness level")); -- puts(_("-S Set the saturation level")); -- puts(_("-n Set threshold for wavelet denoising")); -- puts(_("-H [0-9] Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)")); -- puts(_("-t [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW)")); -- puts(_("-o [0-6] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ,ACES)")); --#ifndef NO_LCMS -- puts(_("-o Apply output ICC profile from file")); -- puts(_("-p Apply camera ICC profile from file or \"embed\"")); --#endif -- puts(_("-d Document mode (no color, no interpolation)")); -- puts(_("-D Document mode without scaling (totally raw)")); -- puts(_("-j Don't stretch or rotate raw pixels")); -- puts(_("-W Don't automatically brighten the image")); -- puts(_("-b Adjust brightness (default = 1.0)")); -- puts(_("-g

Set custom gamma curve (default = 2.222 4.5)")); -- puts(_("-q [0-3] Set the interpolation quality")); -- puts(_("-h Half-size color image (twice as fast as \"-q 0\")")); -- puts(_("-f Interpolate RGGB as four colors")); -- puts(_("-m Apply a 3x3 median filter to R-G and B-G")); -- puts(_("-s [0..N-1] Select one raw image or \"all\" from each file")); -- puts(_("-6 Write 16-bit instead of 8-bit")); -- puts(_("-4 Linear 16-bit, same as \"-6 -W -g 1 1\"")); -- puts(_("-T Write TIFF instead of PPM")); -- puts(""); -- return 1; -- } -- argv[argc] = ""; -- for (arg=1; (((opm = argv[arg][0]) - 2) | 2) == '+'; ) { -- opt = argv[arg++][1]; -- if ((cp = (char *) strchr (sp="nbrkStqmHACg", opt))) -- for (i=0; i < "114111111422"[cp-sp]-'0'; i++) -- if (!isdigit(argv[arg+i][0])) { -- fprintf (stderr,_("Non-numeric argument to \"-%c\"\n"), opt); -- return 1; -- } -- switch (opt) { -- case 'n': threshold = atof(argv[arg++]); break; -- case 'b': bright = atof(argv[arg++]); break; -- case 'r': -- FORC4 user_mul[c] = atof(argv[arg++]); break; -- case 'C': aber[0] = 1 / atof(argv[arg++]); -- aber[2] = 1 / atof(argv[arg++]); break; -- case 'g': gamm[0] = atof(argv[arg++]); -- gamm[1] = atof(argv[arg++]); -- if (gamm[0]) gamm[0] = 1/gamm[0]; break; -- case 'k': user_black = atoi(argv[arg++]); break; -- case 'S': user_sat = atoi(argv[arg++]); break; -- case 't': user_flip = atoi(argv[arg++]); break; -- case 'q': user_qual = atoi(argv[arg++]); break; -- case 'm': med_passes = atoi(argv[arg++]); break; -- case 'H': highlight = atoi(argv[arg++]); break; -- case 's': -- shot_select = abs(atoi(argv[arg])); -- multi_out = !strcmp(argv[arg++],"all"); -- break; -- case 'o': -- if (isdigit(argv[arg][0]) && !argv[arg][1]) -- output_color = atoi(argv[arg++]); --#ifndef NO_LCMS -- else out_profile = argv[arg++]; -- break; -- case 'p': cam_profile = argv[arg++]; --#endif -- break; -- case 'P': bpfile = argv[arg++]; break; -- case 'K': dark_frame = argv[arg++]; break; -- case 'z': timestamp_only = 1; break; -- case 'e': thumbnail_only = 1; break; -- case 'i': identify_only = 1; break; -- case 'c': write_to_stdout = 1; break; -- case 'v': verbose = 1; break; -- case 'h': half_size = 1; break; -- case 'f': four_color_rgb = 1; break; -- case 'A': FORC4 greybox[c] = atoi(argv[arg++]); -- case 'a': use_auto_wb = 1; break; -- case 'w': use_camera_wb = 1; break; -- case 'M': use_camera_matrix = 3 * (opm == '+'); break; -- case 'I': read_from_stdin = 1; break; -- case 'E': document_mode++; -- case 'D': document_mode++; -- case 'd': document_mode++; -- case 'j': use_fuji_rotate = 0; break; -- case 'W': no_auto_bright = 1; break; -- case 'T': output_tiff = 1; break; -- case '4': gamm[0] = gamm[1] = -- no_auto_bright = 1; -- case '6': output_bps = 16; break; -- default: -- fprintf (stderr,_("Unknown option \"-%c\".\n"), opt); -- return 1; -- } -- } -- if (arg == argc) { -- fprintf (stderr,_("No files to process.\n")); -- return 1; -- } -- if (write_to_stdout) { -- if (isatty(1)) { -- fprintf (stderr,_("Will not write an image to the terminal!\n")); -- return 1; -- } --#if defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) -- if (setmode(1,O_BINARY) < 0) { -- perror ("setmode()"); -- return 1; -- } --#endif -- } -- for ( ; arg < argc; arg++) { -- status = 1; -- raw_image = 0; -- image = 0; -- oprof = 0; -- meta_data = ofname = 0; -- ofp = stdout; -- if (setjmp (failure)) { -- if (fileno(ifp) > 2) fclose(ifp); -- if (fileno(ofp) > 2) fclose(ofp); -- status = 1; -- goto cleanup; -- } -- ifname = argv[arg]; -- if (!(ifp = fopen (ifname, "rb"))) { -- perror (ifname); -- continue; -- } -- status = (identify(),!is_raw); -- if (user_flip >= 0) -- flip = user_flip; -- switch ((flip+3600) % 360) { -- case 270: flip = 5; break; -- case 180: flip = 3; break; -- case 90: flip = 6; -- } -- if (timestamp_only) { -- if ((status = !timestamp)) -- fprintf (stderr,_("%s has no timestamp.\n"), ifname); -- else if (identify_only) -- printf ("%10ld%10d %s\n", (long) timestamp, shot_order, ifname); -- else { -- if (verbose) -- fprintf (stderr,_("%s time set to %d.\n"), ifname, (int) timestamp); -- ut.actime = ut.modtime = timestamp; -- utime (ifname, &ut); -- } -- goto next; -- } -- write_fun = &CLASS write_ppm_tiff; -- if (thumbnail_only) { -- if ((status = !thumb_offset)) { -- fprintf (stderr,_("%s has no thumbnail.\n"), ifname); -- goto next; -- } else if (thumb_load_raw) { -- load_raw = thumb_load_raw; -- data_offset = thumb_offset; -- height = thumb_height; -- width = thumb_width; -- filters = 0; -- colors = 3; -- } else { -- fseek (ifp, thumb_offset, SEEK_SET); -- write_fun = write_thumb; -- goto thumbnail; -- } -- } -- if (load_raw == &CLASS kodak_ycbcr_load_raw) { -- height += height & 1; -- width += width & 1; -- } -- if (identify_only && verbose && make[0]) { -- printf (_("\nFilename: %s\n"), ifname); -- printf (_("Timestamp: %s"), ctime(×tamp)); -- printf (_("Camera: %s %s\n"), make, model); -- if (artist[0]) -- printf (_("Owner: %s\n"), artist); -- if (dng_version) { -- printf (_("DNG Version: ")); -- for (i=24; i >= 0; i -= 8) -- printf ("%d%c", dng_version >> i & 255, i ? '.':'\n'); -- } -- printf (_("ISO speed: %d\n"), (int) iso_speed); -- printf (_("Shutter: ")); -- if (shutter > 0 && shutter < 1) -- shutter = (printf ("1/"), 1 / shutter); -- printf (_("%0.1f sec\n"), shutter); -- printf (_("Aperture: f/%0.1f\n"), aperture); -- printf (_("Focal length: %0.1f mm\n"), focal_len); -- printf (_("Embedded ICC profile: %s\n"), profile_length ? _("yes"):_("no")); -- printf (_("Number of raw images: %d\n"), is_raw); -- if (pixel_aspect != 1) -- printf (_("Pixel Aspect Ratio: %0.6f\n"), pixel_aspect); -- if (thumb_offset) -- printf (_("Thumb size: %4d x %d\n"), thumb_width, thumb_height); -- printf (_("Full size: %4d x %d\n"), raw_width, raw_height); -- } else if (!is_raw) -- fprintf (stderr,_("Cannot decode file %s\n"), ifname); -- if (!is_raw) goto next; -- shrink = filters && (half_size || (!identify_only && -- (threshold || aber[0] != 1 || aber[2] != 1))); -- iheight = (height + shrink) >> shrink; -- iwidth = (width + shrink) >> shrink; -- if (identify_only) { -- if (verbose) { -- if (document_mode == 3) { -- top_margin = left_margin = fuji_width = 0; -- height = raw_height; -- width = raw_width; -- } -- iheight = (height + shrink) >> shrink; -- iwidth = (width + shrink) >> shrink; -- if (use_fuji_rotate) { -- if (fuji_width) { -- fuji_width = (fuji_width - 1 + shrink) >> shrink; -- iwidth = fuji_width / sqrt(0.5); -- iheight = (iheight - fuji_width) / sqrt(0.5); -- } else { -- if (pixel_aspect < 1) iheight = iheight / pixel_aspect + 0.5; -- if (pixel_aspect > 1) iwidth = iwidth * pixel_aspect + 0.5; -- } -- } -- if (flip & 4) -- SWAP(iheight,iwidth); -- printf (_("Image size: %4d x %d\n"), width, height); -- printf (_("Output size: %4d x %d\n"), iwidth, iheight); -- printf (_("Raw colors: %d"), colors); -- if (filters) { -- int fhigh = 2, fwide = 2; -- if ((filters ^ (filters >> 8)) & 0xff) fhigh = 4; -- if ((filters ^ (filters >> 16)) & 0xffff) fhigh = 8; -- if (filters == 1) fhigh = fwide = 16; -- if (filters == 9) fhigh = fwide = 6; -- printf (_("\nFilter pattern: ")); -- for (i=0; i < fhigh; i++) -- for (c = i && putchar('/') && 0; c < fwide; c++) -- putchar (cdesc[fcol(i,c)]); -- } -- printf (_("\nDaylight multipliers:")); -- FORCC printf (" %f", pre_mul[c]); -- if (cam_mul[0] > 0) { -- printf (_("\nCamera multipliers:")); -- FORC4 printf (" %f", cam_mul[c]); -- } -- putchar ('\n'); -- } else -- printf (_("%s is a %s %s image.\n"), ifname, make, model); --next: -- fclose(ifp); -- continue; -- } -- if (meta_length) { -- meta_data = (char *) malloc (meta_length); -- merror (meta_data, "main()"); -- } -- if (filters || colors == 1) { -- raw_image = (ushort *) calloc ((raw_height+7), raw_width*2); -- merror (raw_image, "main()"); -- } else { -- image = (ushort (*)[4]) calloc (iheight, iwidth*sizeof *image); -- merror (image, "main()"); -- } -- if (verbose) -- fprintf (stderr,_("Loading %s %s image from %s ...\n"), -- make, model, ifname); -- if (shot_select >= is_raw) -- fprintf (stderr,_("%s: \"-s %d\" requests a nonexistent image!\n"), -- ifname, shot_select); -- fseeko (ifp, data_offset, SEEK_SET); -- if (raw_image && read_from_stdin) -- fread (raw_image, 2, raw_height*raw_width, stdin); -- else (*load_raw)(); -- if (document_mode == 3) { -- top_margin = left_margin = fuji_width = 0; -- height = raw_height; -- width = raw_width; -- } -- iheight = (height + shrink) >> shrink; -- iwidth = (width + shrink) >> shrink; -- if (raw_image) { -- image = (ushort (*)[4]) calloc (iheight, iwidth*sizeof *image); -- merror (image, "main()"); -- crop_masked_pixels(); -- free (raw_image); -- } -- if (zero_is_bad) remove_zeroes(); -- bad_pixels (bpfile); -- if (dark_frame) subtract (dark_frame); -- quality = 2 + !fuji_width; -- if (user_qual >= 0) quality = user_qual; -- i = cblack[3]; -- FORC3 if (i > cblack[c]) i = cblack[c]; -- FORC4 cblack[c] -= i; -- black += i; -- i = cblack[6]; -- FORC (cblack[4] * cblack[5]) -- if (i > cblack[6+c]) i = cblack[6+c]; -- FORC (cblack[4] * cblack[5]) -- cblack[6+c] -= i; -- black += i; -- if (user_black >= 0) black = user_black; -- FORC4 cblack[c] += black; -- if (user_sat > 0) maximum = user_sat; --#ifdef COLORCHECK -- colorcheck(); --#endif -- if (is_foveon) { -- if (document_mode || load_raw == &CLASS foveon_dp_load_raw) { -- for (i=0; i < height*width*4; i++) -- if ((short) image[0][i] < 0) image[0][i] = 0; -- } else foveon_interpolate(); -- } else if (document_mode < 2) -- scale_colors(); -- pre_interpolate(); -- if (filters && !document_mode) { -- if (quality == 0) -- lin_interpolate(); -- else if (quality == 1 || colors > 3) -- vng_interpolate(); -- else if (quality == 2 && filters > 1000) -- ppg_interpolate(); -- else if (filters == 9) -- xtrans_interpolate (quality*2-3); -- else -- ahd_interpolate(); -- } -- if (mix_green) -- for (colors=3, i=0; i < height*width; i++) -- image[i][1] = (image[i][1] + image[i][3]) >> 1; -- if (!is_foveon && colors == 3) median_filter(); -- if (!is_foveon && highlight == 2) blend_highlights(); -- if (!is_foveon && highlight > 2) recover_highlights(); -- if (use_fuji_rotate) fuji_rotate(); --#ifndef NO_LCMS -- if (cam_profile) apply_profile (cam_profile, out_profile); --#endif -- convert_to_rgb(); -- if (use_fuji_rotate) stretch(); --thumbnail: -- if (write_fun == &CLASS jpeg_thumb) -- write_ext = ".jpg"; -- else if (output_tiff && write_fun == &CLASS write_ppm_tiff) -- write_ext = ".tiff"; -- else -- write_ext = ".pgm\0.ppm\0.ppm\0.pam" + colors*5-5; -- ofname = (char *) malloc (strlen(ifname) + 64); -- merror (ofname, "main()"); -- if (write_to_stdout) -- strcpy (ofname,_("standard output")); -- else { -- strcpy (ofname, ifname); -- if ((cp = strrchr (ofname, '.'))) *cp = 0; -- if (multi_out) -- sprintf (ofname+strlen(ofname), "_%0*d", -- snprintf(0,0,"%d",is_raw-1), shot_select); -- if (thumbnail_only) -- strcat (ofname, ".thumb"); -- strcat (ofname, write_ext); -- ofp = fopen (ofname, "wb"); -- if (!ofp) { -- status = 1; -- perror (ofname); -- goto cleanup; -- } -- } -- if (verbose) -- fprintf (stderr,_("Writing data to %s ...\n"), ofname); -- (*write_fun)(); -- fclose(ifp); -- if (ofp != stdout) fclose(ofp); --cleanup: -- if (meta_data) free (meta_data); -- if (ofname) free (ofname); -- if (oprof) free (oprof); -- if (image) free (image); -- if (multi_out) { -- if (++shot_select < is_raw) arg--; -- else shot_select = 0; -- } -- } -- return status; --} -+/* RT: Delete from here */ -+/*RT*/#undef SQR -+/*RT*/#undef MAX -+/*RT*/#undef MIN -+/*RT*/#undef ABS -+/*RT*/#undef LIM -+/*RT*/#undef ULIM -+/*RT*/#undef CLIP diff -Nru rawtherapee-5.3/rtengine/dcrop.cc rawtherapee-5.4/rtengine/dcrop.cc --- rawtherapee-5.3/rtengine/dcrop.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dcrop.cc 2018-03-20 11:04:15.000000000 +0000 @@ -168,7 +168,7 @@ bool needstransform = parent->ipf.needsTransform(); - if (todo & (M_INIT | M_LINDENOISE)) { + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock lock (parent->minit); // Also used in improccoord int tr = getCoarseBitMask (params.coarse); @@ -228,18 +228,18 @@ if (settings->leveldnautsimpl == 1) { if (params.dirpyrDenoise.Cmethod == "MAN" || params.dirpyrDenoise.Cmethod == "PON" ) { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); - parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); + parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw ); } } else { if (params.dirpyrDenoise.C2method == "MANU") { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); - parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); + parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw ); } } if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "PRE") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "PREV")) { PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); - parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); + parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw ); if ((!isDetailWindow) && parent->adnListener && skip == 1 && params.dirpyrDenoise.enabled) { float lowdenoise = 1.f; @@ -434,7 +434,7 @@ Imagefloat *origCropPart = new Imagefloat (crW, crH);//allocate memory Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves - int coordW[3];//coordonate of part of image to mesure noise + int coordW[3];//coordinate of part of image to measure noise int coordH[3]; int begW = 50; int begH = 50; @@ -451,7 +451,7 @@ for (int wcr = 0; wcr <= 2; wcr++) { for (int hcr = 0; hcr <= 2; hcr++) { PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1); - parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw ); + parent->imgsrc->getImage (parent->currWB, tr, origCropPart, ppP, params.toneCurve, params.raw ); // we only need image reduced to 1/4 here for (int ii = 0; ii < crH; ii += 2) { @@ -507,7 +507,7 @@ float multip = 1.f; if (!parent->imgsrc->isRAW()) { - multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good fot gamma=1 + multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good for gamma=1 } float adjustr = 1.f; @@ -613,7 +613,7 @@ // if(params.dirpyrDenoise.Cmethod=="AUT" || params.dirpyrDenoise.Cmethod=="PON") {//reinit origCrop after Auto if ((settings->leveldnautsimpl == 1 && params.dirpyrDenoise.Cmethod == "AUT") || (settings->leveldnautsimpl == 0 && params.dirpyrDenoise.C2method == "AUTO")) { //reinit origCrop after Auto PreviewProps pp (trafx, trafy, trafw * skip, trafh * skip, skip); - parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.icm, params.raw ); + parent->imgsrc->getImage (parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw ); } DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; @@ -653,8 +653,8 @@ if (skip == 1 && denoiseParams.enabled) { int kall = 0; - float chaut, redaut, blueaut, maxredaut, maxblueaut, 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, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); + 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); if (parent->adnListener) { parent->adnListener->noiseChanged (nresi, highresi); @@ -690,6 +690,79 @@ // has to be called after setCropSizes! Tools prior to this point can't handle the Edit mechanism, but that shouldn't be a problem. createBuffer (cropw, croph); + std::unique_ptr fattalCrop; + if ((todo & M_HDR) && params.fattal.enabled) { + Imagefloat *f = origCrop; + int fw = skips(parent->fw, skip); + int fh = skips(parent->fh, skip); + bool need_cropping = false; + bool need_fattal = true; + + if (trafx || trafy || trafw != fw || trafh != fh) { + need_cropping = true; + // fattal needs to work on the full image. So here we get the full + // image from imgsrc, and replace the denoised crop in case + if (!params.dirpyrDenoise.enabled && skip == 1 && parent->fattal_11_dcrop_cache) { + f = parent->fattal_11_dcrop_cache; + need_fattal = false; + } else { + f = new Imagefloat(fw, fh); + fattalCrop.reset(f); + PreviewProps pp (0, 0, parent->fw, parent->fh, skip); + int tr = getCoarseBitMask(params.coarse); + parent->imgsrc->getImage(parent->currWB, tr, f, pp, params.toneCurve, params.raw); + parent->imgsrc->convertColorSpace(f, params.icm, parent->currWB); + + if (params.dirpyrDenoise.enabled) { + // copy the denoised crop + int oy = trafy / skip; + int ox = trafx / skip; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < baseCrop->getHeight(); ++y) { + int dy = oy + y; + for (int x = 0; x < baseCrop->getWidth(); ++x) { + int dx = ox + x; + f->r(dy, dx) = baseCrop->r(y, x); + f->g(dy, dx) = baseCrop->g(y, x); + f->b(dy, dx) = baseCrop->b(y, x); + } + } + } else if (skip == 1) { + parent->fattal_11_dcrop_cache = f; // cache this globally + fattalCrop.release(); + } + } + } + if (need_fattal) { + parent->ipf.ToneMapFattal02(f); + } + + // crop back to the size expected by the rest of the pipeline + if (need_cropping) { + Imagefloat *c = origCrop; + + int oy = trafy / skip; + int ox = trafx / skip; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < trafh; ++y) { + int cy = y + oy; + for (int x = 0; x < trafw; ++x) { + int cx = x + ox; + c->r(y, x) = f->r(cy, cx); + c->g(y, x) = f->g(cy, cx); + c->b(y, x) = f->b(cy, cx); + } + } + baseCrop = c; + } else { + baseCrop = f; + } + } + // transform if (needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) { if (!transCrop) { @@ -763,7 +836,7 @@ if (todo & M_RGBCURVE) { double rrm, ggm, bbm; DCPProfile::ApplyState as; - DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, parent->currWB, as); + DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, as); LUTu histToneCurve; parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, @@ -801,7 +874,6 @@ bool ccutili = parent->ccutili; bool clcutili = parent->clcutili; bool cclutili = parent->cclutili; - bool wavcontlutili = parent->wavcontlutili; LUTu dummy; // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); @@ -921,7 +993,7 @@ params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, wavcontlutili, skip); + parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); } // } @@ -944,7 +1016,6 @@ // end calculation adaptation scene luminosity } - int begh = 0, endh = labnCrop->H; bool execsharp = false; if (skip == 1) { @@ -957,16 +1028,16 @@ if (settings->ciecamfloat) { float d, dj, yb; // not used after this block - parent->ipf.ciecam_02float (cieCrop, float (adap), begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, + parent->ipf.ciecam_02float (cieCrop, float (adap), 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, d, dj, yb, 1); } else { - double dd, dj, yb; // not used after this block + double dd, dj; // not used after this block - parent->ipf.ciecam_02 (cieCrop, adap, begh, endh, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, - dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, dd, dj, yb, 1); + parent->ipf.ciecam_02 (cieCrop, adap, 1, 2, labnCrop, ¶ms, parent->customColCurve1, parent->customColCurve2, parent->customColCurve3, + dummy, dummy, parent->CAMBrightCurveJ, parent->CAMBrightCurveQ, parent->CAMMean, 5, skip, execsharp, dd, dj, 1); } } else { - // CIECAM is disbaled, we free up its image buffer to save some space + // CIECAM is disabled, we free up its image buffer to save some space if (cieCrop) { delete cieCrop; } @@ -1139,6 +1210,7 @@ ory = by1; orw = bw; orh = bh; + ProcParams& params = parent->params; parent->ipf.transCoord (parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh); @@ -1178,6 +1250,8 @@ orh = min (y2 - y1, parent->fh - ory); } + leftBorder = skips (rqx1 - bx1, skip); + upperBorder = skips (rqy1 - by1, skip); PreviewProps cp (orx, ory, orw, orh, skip); int orW, orH; @@ -1189,9 +1263,6 @@ int cw = skips (bw, skip); int ch = skips (bh, skip); - leftBorder = skips (rqx1 - bx1, skip); - upperBorder = skips (rqy1 - by1, skip); - if (settings->verbose) { printf ("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch); } diff -Nru rawtherapee-5.3/rtengine/demosaic_algos.cc rawtherapee-5.4/rtengine/demosaic_algos.cc --- rawtherapee-5.3/rtengine/demosaic_algos.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/demosaic_algos.cc 2018-03-20 11:04:15.000000000 +0000 @@ -37,7 +37,6 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" -//#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include @@ -65,7 +64,7 @@ void RawImageSource::eahd_demosaic () { if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::eahd])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); plistener->setProgress (0.0); } @@ -494,7 +493,7 @@ void RawImageSource::hphd_demosaic () { if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::hphd])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD))); plistener->setProgress (0.0); } @@ -595,7 +594,7 @@ const bool plistenerActive = plistener; if (plistenerActive) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::vng4])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4))); plistener->setProgress (progress); } @@ -893,7 +892,7 @@ if (plistener) { // looks like ppg isn't supported anymore - //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ppg])); + //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::ppg))); plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "xxx")); plistener->setProgress (0.0); } @@ -1201,7 +1200,7 @@ if (plistener) { // this function seems to be unused - //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::jdl])); + //plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::jdl))); plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "xxx")); plistener->setProgress (0.0); } @@ -1315,7 +1314,7 @@ // Adapted to RawTherapee by Jacques Desmis 3/2013 // Improved speed and reduced memory consumption by Ingo Weyrich 2/2015 //TODO Tiles to reduce memory consumption -SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) +void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations) { const int width = winw, height = winh; const int ba = 10; @@ -1397,7 +1396,7 @@ } if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::lmmse])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::LMMSE))); plistener->setProgress (0.0); } @@ -1881,7 +1880,7 @@ gamtab->makeIdentity(); } - array2D (*rgb[3]); + array2D* rgb[3]; rgb[0] = &red; rgb[1] = &green; rgb[2] = &blue; @@ -1947,7 +1946,7 @@ // SSE version by Ingo Weyrich 5/2013 #ifdef __SSE2__ #define CLIPV(a) LIMV(a,zerov,c65535v) -SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) +void RawImageSource::igv_interpolate(int winw, int winh) { static const float eps = 1e-5f, epssq = 1e-5f; //mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero) @@ -1975,7 +1974,7 @@ border_interpolate2(winw, winh, 7); if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::igv])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); plistener->setProgress (0.0); } @@ -2029,7 +2028,8 @@ for (; col < width; col++, indx += 2) { dest1[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT datas col++; - dest2[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT datas + if(col < width) + dest2[indx >> 1] = CLIP(rawData[row][col]); //rawData = RT datas } } @@ -2364,7 +2364,7 @@ border_interpolate2(winw, winh, 7); if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::igv])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); plistener->setProgress (0.0); } @@ -2612,14 +2612,14 @@ #define FORC(cnt) for (c=0; c < cnt; c++) #define FORC3 FORC(3) -void RawImageSource::ahd_demosaic(int winx, int winy, int winw, int winh) +void RawImageSource::ahd_demosaic() { int i, j, k, top, left, row, col, tr, tc, c, d, val, hm[2]; float (*pix)[4], (*rix)[3]; static const int dir[4] = { -1, 1, -TS, TS }; float ldiff[2][4], abdiff[2][4], leps, abeps; float xyz[3], xyz_cam[3][4]; - float (*cbrt); + float* cbrt; float (*rgb)[TS][TS][3]; float (*lab)[TS][TS][3]; float (*lix)[3]; @@ -2639,7 +2639,7 @@ const float d65_white[3] = { 0.950456, 1, 1.088754 }; if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ahd])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD))); plistener->setProgress (0.0); } @@ -2873,7 +2873,7 @@ #ifdef __SSE2__ #define CLIPV(a) LIMV(a,ZEROV,c65535v) #endif -SSEFUNCTION void RawImageSource::refinement(int PassCount) +void RawImageSource::refinement(int PassCount) { MyTime t1e, t2e; t1e.set(); @@ -3702,7 +3702,7 @@ double currentProgress = 0.0; if(plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCB))); plistener->setProgress (currentProgress); } @@ -3861,7 +3861,7 @@ if(!cbrtinit) { for (int i = 0; i < 0x14000; i++) { double r = i / 65535.0; - cbrt[i] = r > 0.008856f ? std::cbrt(r) : 7.787f * r + 16.f / 116.f; + cbrt[i] = r > Color::eps ? std::cbrt(r) : (Color::kappa * r + 16.0) / 116.0; } cbrtinit = true; @@ -3870,8 +3870,7 @@ return; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) - vfloat zd5v = F2V(0.5f); +#ifdef __SSE2__ vfloat c116v = F2V(116.f); vfloat c16v = F2V(16.f); vfloat c500v = F2V(500.f); @@ -3887,17 +3886,17 @@ for(int i = 0; i < height; i++) { int j = 0; -#if defined( __SSE2__ ) && defined( __x86_64__ ) // vectorized LUT access is restricted to __x86_64__ => we have to use the same restriction +#ifdef __SSE2__ for(; j < labWidth - 3; j += 4) { vfloat redv, greenv, bluev; vconvertrgbrgbrgbrgb2rrrrggggbbbb(rgb[i * width + j], redv, greenv, bluev); - vfloat xyz0v = zd5v + redv * xyz_camv[0][0] + greenv * xyz_camv[0][1] + bluev * xyz_camv[0][2]; - vfloat xyz1v = zd5v + redv * xyz_camv[1][0] + greenv * xyz_camv[1][1] + bluev * xyz_camv[1][2]; - vfloat xyz2v = zd5v + redv * xyz_camv[2][0] + greenv * xyz_camv[2][1] + bluev * xyz_camv[2][2]; - xyz0v = cbrt[_mm_cvttps_epi32(xyz0v)]; - xyz1v = cbrt[_mm_cvttps_epi32(xyz1v)]; - xyz2v = cbrt[_mm_cvttps_epi32(xyz2v)]; + vfloat xyz0v = redv * xyz_camv[0][0] + greenv * xyz_camv[0][1] + bluev * xyz_camv[0][2]; + vfloat xyz1v = redv * xyz_camv[1][0] + greenv * xyz_camv[1][1] + bluev * xyz_camv[1][2]; + vfloat xyz2v = redv * xyz_camv[2][0] + greenv * xyz_camv[2][1] + bluev * xyz_camv[2][2]; + xyz0v = cbrt[_mm_cvtps_epi32(xyz0v)]; + xyz1v = cbrt[_mm_cvtps_epi32(xyz1v)]; + xyz2v = cbrt[_mm_cvtps_epi32(xyz2v)]; STVFU(l[i * labWidth + j], c116v * xyz1v - c16v); STVFU(a[i * labWidth + j], c500v * (xyz0v - xyz1v)); @@ -3927,6 +3926,299 @@ } } + +/** +* RATIO CORRECTED DEMOSAICING +* Luis Sanz Rodriguez (luis.sanz.rodriguez(at)gmail(dot)com) +* +* Release 2.3 @ 171125 +* +* Original code from https://github.com/LuisSR/RCD-Demosaicing +* Licensed under the GNU GPL version 3 +*/ +void RawImageSource::rcd_demosaic() +{ + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "rcd")); + plistener->setProgress(0); + } + + int width = W, height = H; + + std::vector cfa(width * height); + std::vector> rgb(width * height); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int row = 0; row < height; row++) { + for (int col = 0, indx = row * width + col; col < width; col++, indx++) { + int c = FC(row, col); + cfa[indx] = rgb[indx][c] = LIM01(rawData[row][col] / 65535.f); + } + } + + if (plistener) { + plistener->setProgress(0.05); + } + // ------------------------------------------------------------------------ +/* RT + int row, col, indx, c; +*/ + int w1 = width, w2 = 2 * width, w3 = 3 * width, w4 = 4 * width; + + //Tolerance to avoid dividing by zero + static const float eps = 1e-5, epssq = 1e-10; + +/* RT + //Gradients + float N_Grad, E_Grad, W_Grad, S_Grad, NW_Grad, NE_Grad, SW_Grad, SE_Grad; + + //Pixel estimation + float N_Est, E_Est, W_Est, S_Est, NW_Est, NE_Est, SW_Est, SE_Est, V_Est, H_Est, P_Est, Q_Est; + + //Directional discrimination + //float V_Stat, H_Stat, P_Stat, Q_Stat; + float VH_Central_Value, VH_Neighbour_Value, PQ_Central_Value, PQ_Neighbour_Value; +*/ + float *VH_Dir, *PQ_Dir; + + //Low pass filter + float *lpf; + + + /** + * STEP 1: Find cardinal and diagonal interpolation directions + */ + + VH_Dir = ( float ( * ) ) calloc( width * height, sizeof *VH_Dir ); //merror ( VH_Dir, "rcd_demosaicing_171117()" ); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int row = 4; row < height - 4; row++ ) { + for (int col = 4, indx = row * width + col; col < width - 4; col++, indx++ ) { + //Calculate h/v local discrimination + float V_Stat = max(epssq, - 18.0f * cfa[indx] * cfa[indx - w1] - 18.0f * cfa[indx] * cfa[indx + w1] - 36.0f * cfa[indx] * cfa[indx - w2] - 36.0f * cfa[indx] * cfa[indx + w2] + 18.0f * cfa[indx] * cfa[indx - w3] + 18.0f * cfa[indx] * cfa[indx + w3] - 2.0f * cfa[indx] * cfa[indx - w4] - 2.0f * cfa[indx] * cfa[indx + w4] + 38.0f * cfa[indx] * cfa[indx] - 70.0f * cfa[indx - w1] * cfa[indx + w1] - 12.0f * cfa[indx - w1] * cfa[indx - w2] + 24.0f * cfa[indx - w1] * cfa[indx + w2] - 38.0f * cfa[indx - w1] * cfa[indx - w3] + 16.0f * cfa[indx - w1] * cfa[indx + w3] + 12.0f * cfa[indx - w1] * cfa[indx - w4] - 6.0f * cfa[indx - w1] * cfa[indx + w4] + 46.0f * cfa[indx - w1] * cfa[indx - w1] + 24.0f * cfa[indx + w1] * cfa[indx - w2] - 12.0f * cfa[indx + w1] * cfa[indx + w2] + 16.0f * cfa[indx + w1] * cfa[indx - w3] - 38.0f * cfa[indx + w1] * cfa[indx + w3] - 6.0f * cfa[indx + w1] * cfa[indx - w4] + 12.0f * cfa[indx + w1] * cfa[indx + w4] + 46.0f * cfa[indx + w1] * cfa[indx + w1] + 14.0f * cfa[indx - w2] * cfa[indx + w2] - 12.0f * cfa[indx - w2] * cfa[indx + w3] - 2.0f * cfa[indx - w2] * cfa[indx - w4] + 2.0f * cfa[indx - w2] * cfa[indx + w4] + 11.0f * cfa[indx - w2] * cfa[indx - w2] - 12.0f * cfa[indx + w2] * cfa[indx - w3] + 2.0f * cfa[indx + w2] * cfa[indx - w4] - 2.0f * cfa[indx + w2] * cfa[indx + w4] + 11.0f * cfa[indx + w2] * cfa[indx + w2] + 2.0f * cfa[indx - w3] * cfa[indx + w3] - 6.0f * cfa[indx - w3] * cfa[indx - w4] + 10.0f * cfa[indx - w3] * cfa[indx - w3] - 6.0f * cfa[indx + w3] * cfa[indx + w4] + 10.0f * cfa[indx + w3] * cfa[indx + w3] + 1.0f * cfa[indx - w4] * cfa[indx - w4] + 1.0f * cfa[indx + w4] * cfa[indx + w4]); + + float H_Stat = max(epssq, - 18.0f * cfa[indx] * cfa[indx - 1] - 18.0f * cfa[indx] * cfa[indx + 1] - 36.0f * cfa[indx] * cfa[indx - 2] - 36.0f * cfa[indx] * cfa[indx + 2] + 18.0f * cfa[indx] * cfa[indx - 3] + 18.0f * cfa[indx] * cfa[indx + 3] - 2.0f * cfa[indx] * cfa[indx - 4] - 2.0f * cfa[indx] * cfa[indx + 4] + 38.0f * cfa[indx] * cfa[indx] - 70.0f * cfa[indx - 1] * cfa[indx + 1] - 12.0f * cfa[indx - 1] * cfa[indx - 2] + 24.0f * cfa[indx - 1] * cfa[indx + 2] - 38.0f * cfa[indx - 1] * cfa[indx - 3] + 16.0f * cfa[indx - 1] * cfa[indx + 3] + 12.0f * cfa[indx - 1] * cfa[indx - 4] - 6.0f * cfa[indx - 1] * cfa[indx + 4] + 46.0f * cfa[indx - 1] * cfa[indx - 1] + 24.0f * cfa[indx + 1] * cfa[indx - 2] - 12.0f * cfa[indx + 1] * cfa[indx + 2] + 16.0f * cfa[indx + 1] * cfa[indx - 3] - 38.0f * cfa[indx + 1] * cfa[indx + 3] - 6.0f * cfa[indx + 1] * cfa[indx - 4] + 12.0f * cfa[indx + 1] * cfa[indx + 4] + 46.0f * cfa[indx + 1] * cfa[indx + 1] + 14.0f * cfa[indx - 2] * cfa[indx + 2] - 12.0f * cfa[indx - 2] * cfa[indx + 3] - 2.0f * cfa[indx - 2] * cfa[indx - 4] + 2.0f * cfa[indx - 2] * cfa[indx + 4] + 11.0f * cfa[indx - 2] * cfa[indx - 2] - 12.0f * cfa[indx + 2] * cfa[indx - 3] + 2.0f * cfa[indx + 2] * cfa[indx - 4] - 2.0f * cfa[indx + 2] * cfa[indx + 4] + 11.0f * cfa[indx + 2] * cfa[indx + 2] + 2.0f * cfa[indx - 3] * cfa[indx + 3] - 6.0f * cfa[indx - 3] * cfa[indx - 4] + 10.0f * cfa[indx - 3] * cfa[indx - 3] - 6.0f * cfa[indx + 3] * cfa[indx + 4] + 10.0f * cfa[indx + 3] * cfa[indx + 3] + 1.0f * cfa[indx - 4] * cfa[indx - 4] + 1.0f * cfa[indx + 4] * cfa[indx + 4]); + + VH_Dir[indx] = V_Stat / (V_Stat + H_Stat); + } + } + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.2); + } + // ------------------------------------------------------------------------- + + /** + * STEP 2: Calculate the low pass filter + */ + + // Step 2.1: Low pass filter incorporating green, red and blue local samples from the raw data + lpf = ( float ( * ) ) calloc( width * height, sizeof *lpf ); //merror ( lpf, "rcd_demosaicing_171125()" ); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for ( int row = 2; row < height - 2; row++ ) { + for ( int col = 2 + (FC( row, 0 ) & 1), indx = row * width + col; col < width - 2; col += 2, indx += 2 ) { + + lpf[indx] = 0.25f * cfa[indx] + 0.125f * ( cfa[indx - w1] + cfa[indx + w1] + cfa[indx - 1] + cfa[indx + 1] ) + 0.0625f * ( cfa[indx - w1 - 1] + cfa[indx - w1 + 1] + cfa[indx + w1 - 1] + cfa[indx + w1 + 1] ); + + } + } + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.4); + } + // ------------------------------------------------------------------------ + + /** + * STEP 3: Populate the green channel + */ + + // Step 3.1: Populate the green channel at blue and red CFA positions +#ifdef _OPENMP + #pragma omp parallel for +#endif + for ( int row = 4; row < height - 4; row++ ) { + for ( int col = 4 + (FC( row, 0 ) & 1), indx = row * width + col; col < width - 4; col += 2, indx += 2 ) { + + // Refined vertical and horizontal local discrimination + float VH_Central_Value = VH_Dir[indx]; + float VH_Neighbourhood_Value = 0.25f * ( VH_Dir[indx - w1 - 1] + VH_Dir[indx - w1 + 1] + VH_Dir[indx + w1 - 1] + VH_Dir[indx + w1 + 1] ); + + float VH_Disc = ( fabs( 0.5f - VH_Central_Value ) < fabs( 0.5f - VH_Neighbourhood_Value ) ) ? VH_Neighbourhood_Value : VH_Central_Value; + + // Cardinal gradients + float N_Grad = eps + fabs( cfa[indx - w1] - cfa[indx + w1] ) + fabs( cfa[indx] - cfa[indx - w2] ) + fabs( cfa[indx - w1] - cfa[indx - w3] ) + fabs( cfa[indx - w2] - cfa[indx - w4] ); + float S_Grad = eps + fabs( cfa[indx + w1] - cfa[indx - w1] ) + fabs( cfa[indx] - cfa[indx + w2] ) + fabs( cfa[indx + w1] - cfa[indx + w3] ) + fabs( cfa[indx + w2] - cfa[indx + w4] ); + float W_Grad = eps + fabs( cfa[indx - 1] - cfa[indx + 1] ) + fabs( cfa[indx] - cfa[indx - 2] ) + fabs( cfa[indx - 1] - cfa[indx - 3] ) + fabs( cfa[indx - 2] - cfa[indx - 4] ); + float E_Grad = eps + fabs( cfa[indx + 1] - cfa[indx - 1] ) + fabs( cfa[indx] - cfa[indx + 2] ) + fabs( cfa[indx + 1] - cfa[indx + 3] ) + fabs( cfa[indx + 2] - cfa[indx + 4] ); + + // Cardinal pixel estimations + float N_Est = cfa[indx - w1] * ( 1.f + ( lpf[indx] - lpf[indx - w2] ) / ( eps + lpf[indx] + lpf[indx - w2] ) ); + float S_Est = cfa[indx + w1] * ( 1.f + ( lpf[indx] - lpf[indx + w2] ) / ( eps + lpf[indx] + lpf[indx + w2] ) ); + float W_Est = cfa[indx - 1] * ( 1.f + ( lpf[indx] - lpf[indx - 2] ) / ( eps + lpf[indx] + lpf[indx - 2] ) ); + float E_Est = cfa[indx + 1] * ( 1.f + ( lpf[indx] - lpf[indx + 2] ) / ( eps + lpf[indx] + lpf[indx + 2] ) ); + + // Vertical and horizontal estimations + float V_Est = ( S_Grad * N_Est + N_Grad * S_Est ) / max(eps, N_Grad + S_Grad ); + float H_Est = ( W_Grad * E_Est + E_Grad * W_Est ) / max(eps, E_Grad + W_Grad ); + + // G@B and G@R interpolation + rgb[indx][1] = LIM( VH_Disc * H_Est + ( 1.f - VH_Disc ) * V_Est, 0.f, 1.f ); + + } + } + + free( lpf ); + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.5); + } + // ------------------------------------------------------------------------ + + /** + * STEP 4: Populate the red and blue channels + */ + + // Step 4.1: Calculate P/Q diagonal local discrimination + PQ_Dir = ( float ( * ) ) calloc( width * height, sizeof *PQ_Dir ); //merror ( PQ_Dir, "rcd_demosaicing_171125()" ); + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for ( int row = 4; row < height - 4; row++ ) { + for ( int col = 4 + (FC( row, 0 ) & 1), indx = row * width + col; col < width - 4; col += 2, indx += 2 ) { + + float P_Stat = max( - 18.f * cfa[indx] * cfa[indx - w1 - 1] - 18.f * cfa[indx] * cfa[indx + w1 + 1] - 36.f * cfa[indx] * cfa[indx - w2 - 2] - 36.f * cfa[indx] * cfa[indx + w2 + 2] + 18.f * cfa[indx] * cfa[indx - w3 - 3] + 18.f * cfa[indx] * cfa[indx + w3 + 3] - 2.f * cfa[indx] * cfa[indx - w4 - 4] - 2.f * cfa[indx] * cfa[indx + w4 + 4] + 38.f * cfa[indx] * cfa[indx] - 70.f * cfa[indx - w1 - 1] * cfa[indx + w1 + 1] - 12.f * cfa[indx - w1 - 1] * cfa[indx - w2 - 2] + 24.f * cfa[indx - w1 - 1] * cfa[indx + w2 + 2] - 38.f * cfa[indx - w1 - 1] * cfa[indx - w3 - 3] + 16.f * cfa[indx - w1 - 1] * cfa[indx + w3 + 3] + 12.f * cfa[indx - w1 - 1] * cfa[indx - w4 - 4] - 6.f * cfa[indx - w1 - 1] * cfa[indx + w4 + 4] + 46.f * cfa[indx - w1 - 1] * cfa[indx - w1 - 1] + 24.f * cfa[indx + w1 + 1] * cfa[indx - w2 - 2] - 12.f * cfa[indx + w1 + 1] * cfa[indx + w2 + 2] + 16.f * cfa[indx + w1 + 1] * cfa[indx - w3 - 3] - 38.f * cfa[indx + w1 + 1] * cfa[indx + w3 + 3] - 6.f * cfa[indx + w1 + 1] * cfa[indx - w4 - 4] + 12.f * cfa[indx + w1 + 1] * cfa[indx + w4 + 4] + 46.f * cfa[indx + w1 + 1] * cfa[indx + w1 + 1] + 14.f * cfa[indx - w2 - 2] * cfa[indx + w2 + 2] - 12.f * cfa[indx - w2 - 2] * cfa[indx + w3 + 3] - 2.f * cfa[indx - w2 - 2] * cfa[indx - w4 - 4] + 2.f * cfa[indx - w2 - 2] * cfa[indx + w4 + 4] + 11.f * cfa[indx - w2 - 2] * cfa[indx - w2 - 2] - 12.f * cfa[indx + w2 + 2] * cfa[indx - w3 - 3] + 2 * cfa[indx + w2 + 2] * cfa[indx - w4 - 4] - 2.f * cfa[indx + w2 + 2] * cfa[indx + w4 + 4] + 11.f * cfa[indx + w2 + 2] * cfa[indx + w2 + 2] + 2.f * cfa[indx - w3 - 3] * cfa[indx + w3 + 3] - 6.f * cfa[indx - w3 - 3] * cfa[indx - w4 - 4] + 10.f * cfa[indx - w3 - 3] * cfa[indx - w3 - 3] - 6.f * cfa[indx + w3 + 3] * cfa[indx + w4 + 4] + 10.f * cfa[indx + w3 + 3] * cfa[indx + w3 + 3] + 1.f * cfa[indx - w4 - 4] * cfa[indx - w4 - 4] + 1.f * cfa[indx + w4 + 4] * cfa[indx + w4 + 4], epssq ); + float Q_Stat = max( - 18.f * cfa[indx] * cfa[indx + w1 - 1] - 18.f * cfa[indx] * cfa[indx - w1 + 1] - 36.f * cfa[indx] * cfa[indx + w2 - 2] - 36.f * cfa[indx] * cfa[indx - w2 + 2] + 18.f * cfa[indx] * cfa[indx + w3 - 3] + 18.f * cfa[indx] * cfa[indx - w3 + 3] - 2.f * cfa[indx] * cfa[indx + w4 - 4] - 2.f * cfa[indx] * cfa[indx - w4 + 4] + 38.f * cfa[indx] * cfa[indx] - 70.f * cfa[indx + w1 - 1] * cfa[indx - w1 + 1] - 12.f * cfa[indx + w1 - 1] * cfa[indx + w2 - 2] + 24.f * cfa[indx + w1 - 1] * cfa[indx - w2 + 2] - 38.f * cfa[indx + w1 - 1] * cfa[indx + w3 - 3] + 16.f * cfa[indx + w1 - 1] * cfa[indx - w3 + 3] + 12.f * cfa[indx + w1 - 1] * cfa[indx + w4 - 4] - 6.f * cfa[indx + w1 - 1] * cfa[indx - w4 + 4] + 46.f * cfa[indx + w1 - 1] * cfa[indx + w1 - 1] + 24.f * cfa[indx - w1 + 1] * cfa[indx + w2 - 2] - 12.f * cfa[indx - w1 + 1] * cfa[indx - w2 + 2] + 16.f * cfa[indx - w1 + 1] * cfa[indx + w3 - 3] - 38.f * cfa[indx - w1 + 1] * cfa[indx - w3 + 3] - 6.f * cfa[indx - w1 + 1] * cfa[indx + w4 - 4] + 12.f * cfa[indx - w1 + 1] * cfa[indx - w4 + 4] + 46.f * cfa[indx - w1 + 1] * cfa[indx - w1 + 1] + 14.f * cfa[indx + w2 - 2] * cfa[indx - w2 + 2] - 12.f * cfa[indx + w2 - 2] * cfa[indx - w3 + 3] - 2.f * cfa[indx + w2 - 2] * cfa[indx + w4 - 4] + 2.f * cfa[indx + w2 - 2] * cfa[indx - w4 + 4] + 11.f * cfa[indx + w2 - 2] * cfa[indx + w2 - 2] - 12.f * cfa[indx - w2 + 2] * cfa[indx + w3 - 3] + 2 * cfa[indx - w2 + 2] * cfa[indx + w4 - 4] - 2.f * cfa[indx - w2 + 2] * cfa[indx - w4 + 4] + 11.f * cfa[indx - w2 + 2] * cfa[indx - w2 + 2] + 2.f * cfa[indx + w3 - 3] * cfa[indx - w3 + 3] - 6.f * cfa[indx + w3 - 3] * cfa[indx + w4 - 4] + 10.f * cfa[indx + w3 - 3] * cfa[indx + w3 - 3] - 6.f * cfa[indx - w3 + 3] * cfa[indx - w4 + 4] + 10.f * cfa[indx - w3 + 3] * cfa[indx - w3 + 3] + 1.f * cfa[indx + w4 - 4] * cfa[indx + w4 - 4] + 1.f * cfa[indx - w4 + 4] * cfa[indx - w4 + 4], epssq ); + + PQ_Dir[indx] = P_Stat / ( P_Stat + Q_Stat ); + + } + } + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.7); + } + // ------------------------------------------------------------------------- + + // Step 4.2: Populate the red and blue channels at blue and red CFA positions +#ifdef _OPENMP + #pragma omp parallel for +#endif + for ( int row = 4; row < height - 4; row++ ) { + for ( int col = 4 + (FC( row, 0 ) & 1), indx = row * width + col, c = 2 - FC( row, col ); col < width - 4; col += 2, indx += 2 ) { + + // Refined P/Q diagonal local discrimination + float PQ_Central_Value = PQ_Dir[indx]; + float PQ_Neighbourhood_Value = 0.25f * ( PQ_Dir[indx - w1 - 1] + PQ_Dir[indx - w1 + 1] + PQ_Dir[indx + w1 - 1] + PQ_Dir[indx + w1 + 1] ); + + float PQ_Disc = ( fabs( 0.5f - PQ_Central_Value ) < fabs( 0.5f - PQ_Neighbourhood_Value ) ) ? PQ_Neighbourhood_Value : PQ_Central_Value; + + // Diagonal gradients + float NW_Grad = eps + fabs( rgb[indx - w1 - 1][c] - rgb[indx + w1 + 1][c] ) + fabs( rgb[indx - w1 - 1][c] - rgb[indx - w3 - 3][c] ) + fabs( rgb[indx][1] - rgb[indx - w2 - 2][1] ); + float NE_Grad = eps + fabs( rgb[indx - w1 + 1][c] - rgb[indx + w1 - 1][c] ) + fabs( rgb[indx - w1 + 1][c] - rgb[indx - w3 + 3][c] ) + fabs( rgb[indx][1] - rgb[indx - w2 + 2][1] ); + float SW_Grad = eps + fabs( rgb[indx + w1 - 1][c] - rgb[indx - w1 + 1][c] ) + fabs( rgb[indx + w1 - 1][c] - rgb[indx + w3 - 3][c] ) + fabs( rgb[indx][1] - rgb[indx + w2 - 2][1] ); + float SE_Grad = eps + fabs( rgb[indx + w1 + 1][c] - rgb[indx - w1 - 1][c] ) + fabs( rgb[indx + w1 + 1][c] - rgb[indx + w3 + 3][c] ) + fabs( rgb[indx][1] - rgb[indx + w2 + 2][1] ); + + // Diagonal colour differences + float NW_Est = rgb[indx - w1 - 1][c] - rgb[indx - w1 - 1][1]; + float NE_Est = rgb[indx - w1 + 1][c] - rgb[indx - w1 + 1][1]; + float SW_Est = rgb[indx + w1 - 1][c] - rgb[indx + w1 - 1][1]; + float SE_Est = rgb[indx + w1 + 1][c] - rgb[indx + w1 + 1][1]; + + // P/Q estimations + float P_Est = ( NW_Grad * SE_Est + SE_Grad * NW_Est ) / max(eps, NW_Grad + SE_Grad ); + float Q_Est = ( NE_Grad * SW_Est + SW_Grad * NE_Est ) / max(eps, NE_Grad + SW_Grad ); + + // R@B and B@R interpolation + rgb[indx][c] = LIM( rgb[indx][1] + ( 1.f - PQ_Disc ) * P_Est + PQ_Disc * Q_Est, 0.f, 1.f ); + + } + } + + free( PQ_Dir ); + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.825); + } + // ------------------------------------------------------------------------- + + // Step 4.3: Populate the red and blue channels at green CFA positions +#ifdef _OPENMP + #pragma omp parallel for +#endif + for ( int row = 4; row < height - 4; row++ ) { + for ( int col = 4 + (FC( row, 1 ) & 1), indx = row * width + col; col < width - 4; col += 2, indx += 2 ) { + + // Refined vertical and horizontal local discrimination + float VH_Central_Value = VH_Dir[indx]; + float VH_Neighbourhood_Value = 0.25f * ( VH_Dir[indx - w1 - 1] + VH_Dir[indx - w1 + 1] + VH_Dir[indx + w1 - 1] + VH_Dir[indx + w1 + 1] ); + + float VH_Disc = ( fabs( 0.5f - VH_Central_Value ) < fabs( 0.5f - VH_Neighbourhood_Value ) ) ? VH_Neighbourhood_Value : VH_Central_Value; + + for ( int c = 0; c <= 2; c += 2 ) { + + // Cardinal gradients + float N_Grad = eps + fabs( rgb[indx][1] - rgb[indx - w2][1] ) + fabs( rgb[indx - w1][c] - rgb[indx + w1][c] ) + fabs( rgb[indx - w1][c] - rgb[indx - w3][c] ); + float S_Grad = eps + fabs( rgb[indx][1] - rgb[indx + w2][1] ) + fabs( rgb[indx + w1][c] - rgb[indx - w1][c] ) + fabs( rgb[indx + w1][c] - rgb[indx + w3][c] ); + float W_Grad = eps + fabs( rgb[indx][1] - rgb[indx - 2][1] ) + fabs( rgb[indx - 1][c] - rgb[indx + 1][c] ) + fabs( rgb[indx - 1][c] - rgb[indx - 3][c] ); + float E_Grad = eps + fabs( rgb[indx][1] - rgb[indx + 2][1] ) + fabs( rgb[indx + 1][c] - rgb[indx - 1][c] ) + fabs( rgb[indx + 1][c] - rgb[indx + 3][c] ); + + // Cardinal colour differences + float N_Est = rgb[indx - w1][c] - rgb[indx - w1][1]; + float S_Est = rgb[indx + w1][c] - rgb[indx + w1][1]; + float W_Est = rgb[indx - 1][c] - rgb[indx - 1][1]; + float E_Est = rgb[indx + 1][c] - rgb[indx + 1][1]; + + // Vertical and horizontal estimations + float V_Est = ( N_Grad * S_Est + S_Grad * N_Est ) / max(eps, N_Grad + S_Grad ); + float H_Est = ( E_Grad * W_Est + W_Grad * E_Est ) / max(eps, E_Grad + W_Grad ); + + // R@G and B@G interpolation + rgb[indx][c] = LIM( rgb[indx][1] + ( 1.f - VH_Disc ) * V_Est + VH_Disc * H_Est, 0.f, 1.f ); + + } + } + } + + free(VH_Dir); + + // RT --------------------------------------------------------------------- + if (plistener) { + plistener->setProgress(0.95); + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int row = 0; row < height; ++row) { + for (int col = 0, idx = row * width + col ; col < width; ++col, ++idx) { + red[row][col] = CLIP(rgb[idx][0] * 65535.f); + green[row][col] = CLIP(rgb[idx][1] * 65535.f); + blue[row][col] = CLIP(rgb[idx][2] * 65535.f); + } + } + + border_interpolate2(width, height, 8); + + if (plistener) { + plistener->setProgress(1); + } + // ------------------------------------------------------------------------- +} + #define fcol(row,col) xtrans[(row)%6][(col)%6] #define isgreen(row,col) (xtrans[(row)%3][(col)%3]&1) diff -Nru rawtherapee-5.3/rtengine/dfmanager.cc rawtherapee-5.4/rtengine/dfmanager.cc --- rawtherapee-5.3/rtengine/dfmanager.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dfmanager.cc 2018-03-20 11:04:15.000000000 +0000 @@ -136,7 +136,7 @@ if( !pathNames.empty() ) { std::list::iterator iName = pathNames.begin(); - ri = new RawImage(*iName); // First file used also for extra pixels informations (width,height, shutter, filters etc.. ) + ri = new RawImage(*iName); // First file used also for extra pixels information (width,height, shutter, filters etc.. ) if( ri->loadRaw(true)) { delete ri; @@ -334,41 +334,36 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) { - auto file = Gio::File::create_for_path (filename); + auto ext = getFileExtension(filename); + + if (ext.empty() || !options.is_extention_enabled(ext)) { + return nullptr; + } + + auto file = Gio::File::create_for_path(filename); if (!file) { return nullptr; } - if (!file->query_exists ()) { + if (!file->query_exists()) { return nullptr; } try { - auto info = file->query_info (); - - if (!info && info->get_file_type () == Gio::FILE_TYPE_DIRECTORY) { - return nullptr; - } + auto info = file->query_info("standard::name,standard::type,standard::is-hidden"); - if (!options.fbShowHidden && info->is_hidden ()) { + if (!info && info->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { return nullptr; } - Glib::ustring ext; - - auto lastdot = info->get_name ().find_last_of ('.'); - if (lastdot != Glib::ustring::npos) { - ext = info->get_name ().substr (lastdot + 1); - } - - if (!options.is_extention_enabled (ext)) { + if (!options.fbShowHidden && info->is_hidden()) { return nullptr; } - RawImage ri (filename); - int res = ri.loadRaw (false); // Read informations about shot + RawImage ri(filename); + int res = ri.loadRaw(false); // Read information about shot if (res != 0) { return nullptr; @@ -378,32 +373,28 @@ if(!pool) { dfInfo n(filename, "", "", 0, 0, 0); - iter = dfList.insert(std::pair< std::string, dfInfo>( "", n ) ); + iter = dfList.emplace("", n); return &(iter->second); } - RawMetaDataLocation rml; - rml.exifBase = ri.get_exifBase(); - rml.ciffBase = ri.get_ciffBase(); - rml.ciffLength = ri.get_ciffLen(); - ImageData idata(filename, &rml); + FramesData idata(filename, std::unique_ptr(new RawMetaDataLocation(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen())), true); /* Files are added in the map, divided by same maker/model,ISO and shutter*/ - std::string key( dfInfo::key(((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed()) ); - iter = dfList.find( key ); + std::string key(dfInfo::key(((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed())); + iter = dfList.find(key); - if( iter == dfList.end() ) { - dfInfo n(filename, ((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS() ); - iter = dfList.insert(std::pair< std::string, dfInfo>( key, n ) ); + if(iter == dfList.end()) { + dfInfo n(filename, ((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); + iter = dfList.emplace(key, n); } else { - while( iter != dfList.end() && iter->second.key() == key && ABS(iter->second.timestamp - idata.getDateTimeAsTS()) > 60 * 60 * 6 ) { // 6 hour difference + while(iter != dfList.end() && iter->second.key() == key && ABS(iter->second.timestamp - idata.getDateTimeAsTS()) > 60 * 60 * 6) { // 6 hour difference ++iter; } - if( iter != dfList.end() ) { - iter->second.pathNames.push_back( filename ); + if(iter != dfList.end()) { + iter->second.pathNames.push_back(filename); } else { dfInfo n(filename, ((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed(), idata.getDateTimeAsTS()); - iter = dfList.insert(std::pair< std::string, dfInfo>( key, n ) ); + iter = dfList.emplace(key, n); } } diff -Nru rawtherapee-5.3/rtengine/diagonalcurves.cc rawtherapee-5.4/rtengine/diagonalcurves.cc --- rawtherapee-5.3/rtengine/diagonalcurves.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/diagonalcurves.cc 2018-03-20 11:04:15.000000000 +0000 @@ -35,11 +35,11 @@ ppn = poly_pn > 65500 ? 65500 : poly_pn; if (ppn < 500) { - hashSize = 100; // Arbitrary cut-off value, but mutliple of 10 + hashSize = 100; // Arbitrary cut-off value, but multiple of 10 } if (ppn < 50) { - hashSize = 10; // Arbitrary cut-off value, but mutliple of 10 + hashSize = 10; // Arbitrary cut-off value, but multiple of 10 } if (p.size() < 3) { diff -Nru rawtherapee-5.3/rtengine/dirpyr_equalizer.cc rawtherapee-5.4/rtengine/dirpyr_equalizer.cc --- rawtherapee-5.3/rtengine/dirpyr_equalizer.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dirpyr_equalizer.cc 2018-03-20 11:04:15.000000000 +0000 @@ -20,38 +20,27 @@ #include #include -#include "curves.h" -#include "labimage.h" -#include "color.h" -#include "mytime.h" #include "improcfun.h" -#include "rawimagesource.h" #include "array2D.h" #include "rt_math.h" #include "opthelper.h" -#ifdef _OPENMP -#include -#endif -#define CLIPI(a) ((a)>0 ?((a)<32768 ?(a):32768):0) #define RANGEFN(i) ((1000.0f / (i + 1000.0f))) -#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000) #define DIRWT(i1,j1,i,j) ( domker[(i1-i)/scale+halfwin][(j1-j)/scale+halfwin] * RANGEFN(fabsf((data_fine[i1][j1]-data_fine[i][j]))) ) namespace rtengine { -static const int maxlevel = 6; -static const float noise = 2000; +constexpr int maxlevel = 6; +constexpr float noise = 2000; //sequence of scales -static const int scales[6] = {1, 2, 4, 8, 16, 32}; +constexpr int scales[maxlevel] = {1, 2, 4, 8, 16, 32}; extern const Settings* settings; //sequence of scales - -SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, float ** dest_a, float ** dest_b, const double * mult, const double dirpyrThreshold, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev) +void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scaleprev) { int lastlevel = maxlevel; @@ -94,10 +83,10 @@ } int level; - float multi[6] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; - float scalefl[6]; + float multi[maxlevel] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + float scalefl[maxlevel]; - for(int lv = 0; lv < 6; lv++) { + for(int lv = 0; lv < maxlevel; lv++) { scalefl[lv] = ((float) scales[lv]) / (float) scaleprev; if(lv >= 1) { @@ -226,12 +215,12 @@ float ** buffer = dirpyrlo[lastlevel - 1]; for(int level = lastlevel - 1; level > 0; level--) { - idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level - 1], buffer, srcwidth, srcheight, level, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice ); + idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level - 1], buffer, srcwidth, srcheight, level, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, b_l, t_l, t_r); } scale = scales[0]; - idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, gamutlab, b_l, t_l, t_r, b_r, choice ); + idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, tmpHue, tmpChr, skinprot, b_l, t_l, t_r); if(skinprot != 0.f) { for (int i = 0; i < srcheight; i++) { @@ -247,7 +236,6 @@ delete [] tmpHue; } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #pragma omp parallel for for (int i = 0; i < srcheight; i++) @@ -259,7 +247,7 @@ -void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scaleprev) +void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, float b_l, float t_l, float t_r, int scaleprev) { int lastlevel = maxlevel; @@ -303,10 +291,10 @@ int level; - float multi[6] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; - float scalefl[6]; + float multi[maxlevel] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + float scalefl[maxlevel]; - for(int lv = 0; lv < 6; lv++) { + for(int lv = 0; lv < maxlevel; lv++) { scalefl[lv] = ((float) scales[lv]) / (float) scaleprev; // if(scalefl[lv] < 1.f) multi[lv] = 1.f; else multi[lv]=(float) mult[lv]; @@ -371,7 +359,6 @@ idirpyr_eq_channelcam(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, multi, dirpyrThreshold, h_p, C_p, skinprot, b_l, t_l, t_r); - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if(execdir) { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -385,20 +372,17 @@ dst[i][j] = src[i][j]; } } - } else + } else { for (int i = 0; i < srcheight; i++) for (int j = 0; j < srcwidth; j++) { dst[i][j] = CLIP( buffer[i][j] ); // TODO: Really a clip necessary? } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + } } - -SSEFUNCTION void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** data_coarse, int width, int height, int level, int scale) +void ImProcFunctions::dirpyr_channel(float ** data_fine, float ** data_coarse, int width, int height, int level, int scale) { - //scale is spacing of directional averaging weights - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // scale is spacing of directional averaging weights // calculate weights, compute directionally weighted average if(level > 1) { @@ -620,9 +604,7 @@ } } -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[6], const double dirpyrThreshold, float ** hue, float ** chrom, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r , int choice) +void ImProcFunctions::idirpyr_eq_channel(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[maxlevel], const double dirpyrThreshold, float ** hue, float ** chrom, const double skinprot, float b_l, float t_l, float t_r) { const float skinprotneg = -skinprot; const float factorHard = (1.f - skinprotneg / 100.f); @@ -635,7 +617,7 @@ offs = -1.f; } - float multbis[6]; + float multbis[maxlevel]; multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult @@ -714,7 +696,7 @@ } -void ImProcFunctions::idirpyr_eq_channelcam(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r) +void ImProcFunctions::idirpyr_eq_channelcam(float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float mult[maxlevel], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r) { const float skinprotneg = -skinprot; @@ -728,7 +710,7 @@ offs = -1.f; } - float multbis[6]; + float multbis[maxlevel]; multbis[level] = mult[level]; //multbis to reduce artifacts for high values mult diff -Nru rawtherapee-5.3/rtengine/dynamicprofile.cc rawtherapee-5.4/rtengine/dynamicprofile.cc --- rawtherapee-5.3/rtengine/dynamicprofile.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dynamicprofile.cc 2018-03-20 11:04:15.000000000 +0000 @@ -72,7 +72,7 @@ } -bool DynamicProfileRule::matches (const rtengine::ImageMetaData *im) const +bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im) const { return (iso (im->getISOSpeed()) && fnumber (im->getFNumber()) diff -Nru rawtherapee-5.3/rtengine/dynamicprofile.h rawtherapee-5.4/rtengine/dynamicprofile.h --- rawtherapee-5.3/rtengine/dynamicprofile.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/dynamicprofile.h 2018-03-20 11:04:15.000000000 +0000 @@ -48,7 +48,7 @@ }; DynamicProfileRule(); - bool matches (const rtengine::ImageMetaData *im) const; + bool matches (const rtengine::FramesMetaData *im) const; bool operator< (const DynamicProfileRule &other) const; int serial_number; diff -Nru rawtherapee-5.3/rtengine/EdgePreservingDecomposition.cc rawtherapee-5.4/rtengine/EdgePreservingDecomposition.cc --- rawtherapee-5.3/rtengine/EdgePreservingDecomposition.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/EdgePreservingDecomposition.cc 2018-03-20 11:04:15.000000000 +0000 @@ -6,7 +6,6 @@ #endif #include "sleef.c" #include "opthelper.h" -#define pow_F(a,b) (xexpf(b*xlogf(a))) #define DIAGONALS 5 #define DIAGONALSP1 6 @@ -43,7 +42,8 @@ } //s is preconditionment of r. Without, direct to r. - float *s = r, rs = 0.0f; + float *s = r; + double rs = 0.0; // use double precision for large summations if(Preconditioner != nullptr) { s = new float[n]; @@ -78,7 +78,7 @@ for(iterate = 0; iterate < MaximumIterates; iterate++) { //Get step size alpha, store ax while at it. - float ab = 0.0f; + double ab = 0.0; // use double precision for large summations Ax(ax, d, Pass); #ifdef _OPENMP #pragma omp parallel for reduction(+:ab) @@ -95,7 +95,7 @@ ab = rs / ab; //Update x and r with this step size. - float rms = 0.0; + double rms = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel for reduction(+:rms) #endif @@ -292,7 +292,7 @@ return true; } -SSEFUNCTION void MultiDiagonalSymmetricMatrix::VectorProduct(float* RESTRICT Product, float* RESTRICT x) +void MultiDiagonalSymmetricMatrix::VectorProduct(float* RESTRICT Product, float* RESTRICT x) { int srm = StartRows[m - 1]; @@ -694,7 +694,7 @@ delete A; } -SSEFUNCTION float *EdgePreservingDecomposition::CreateBlur(float *Source, float Scale, float EdgeStopping, int Iterates, float *Blur, bool UseBlurForEdgeStop) +float *EdgePreservingDecomposition::CreateBlur(float *Source, float Scale, float EdgeStopping, int Iterates, float *Blur, bool UseBlurForEdgeStop) { if(Blur == nullptr) @@ -790,7 +790,7 @@ // checked for race condition here -// a0[] is read and write but adressed by i only +// a0[] is read and write but addressed by i only // a[] is read only // a_w_1 is write only // a_w is write only @@ -885,7 +885,7 @@ return Blur; } -SSEFUNCTION void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scale, float EdgeStopping, float CompressionExponent, float DetailBoost, int Iterates, int Reweightings) +void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scale, float EdgeStopping, float CompressionExponent, float DetailBoost, int Iterates, int Reweightings) { if(w < 300 && h < 300) { // set number of Reweightings to zero for small images (thumbnails). We could try to find a better solution here. Reweightings = 0; diff -Nru rawtherapee-5.3/rtengine/EdgePreservingDecomposition.h rawtherapee-5.4/rtengine/EdgePreservingDecomposition.h --- rawtherapee-5.3/rtengine/EdgePreservingDecomposition.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/EdgePreservingDecomposition.h 2018-03-20 11:04:15.000000000 +0000 @@ -11,7 +11,7 @@ following papers: - Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation - An Iterative Solution Method for Linear Systems of Which the Coefficient - Matrix is a Symetric M-Matrix + Matrix is a Symmetric M-Matrix - Color correction for tone mapping - Wikipedia, the free encyclopedia @@ -89,7 +89,7 @@ and StartRows must strictly increase with its index. The main diagonal for example has start row 0, its subdiagonal has 1, etc. Then, Diagonal[j] is the matrix entry on the diagonal at column j. For efficiency, you're expected to learn this and fill in public Diagonals manually. Symmetric matrices are represented by this class, and all symmetry is handled internally, you - only every worry or think about the lower trianglular (including main diagonal) part of the matrix. + only every worry or think about the lower triangular (including main diagonal) part of the matrix. */ float **Diagonals; char *buffer; diff -Nru rawtherapee-5.3/rtengine/ex1simple.cc rawtherapee-5.4/rtengine/ex1simple.cc --- rawtherapee-5.3/rtengine/ex1simple.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ex1simple.cc 2018-03-20 11:04:15.000000000 +0000 @@ -77,7 +77,7 @@ rtengine::procparams::ProcParams params; params.load (argv[2]); - /* First, simplest scenario. Develope image and save it in a file */ + /* 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. diff -Nru rawtherapee-5.3/rtengine/expo_before_b.cc rawtherapee-5.4/rtengine/expo_before_b.cc --- rawtherapee-5.3/rtengine/expo_before_b.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/expo_before_b.cc 2018-03-20 11:04:15.000000000 +0000 @@ -80,7 +80,7 @@ if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) { // Demosaic to allow calculation of luminosity. if(ri->getSensorType() == ST_BAYER) { - fast_demosaic (0, 0, W, H); + fast_demosaic(); } else { fast_xtrans_interpolate(); } diff -Nru rawtherapee-5.3/rtengine/fast_demo.cc rawtherapee-5.4/rtengine/fast_demo.cc --- rawtherapee-5.3/rtengine/fast_demo.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/fast_demo.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////// // -// Fast demosaicing algorythm +// Fast demosaicing algorithm // // copyright (c) 2008-2010 Emil Martinec // @@ -52,7 +52,7 @@ #endif //LUTf RawImageSource::invGrad = RawImageSource::initInvGrad(); -SSEFUNCTION void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) +void RawImageSource::fast_demosaic() { double progress = 0.0; @@ -62,7 +62,7 @@ //int winw=W, winh=H; if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast])); + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST))); plistener->setProgress (progress); } diff -Nru rawtherapee-5.3/rtengine/ffmanager.cc rawtherapee-5.4/rtengine/ffmanager.cc --- rawtherapee-5.3/rtengine/ffmanager.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ffmanager.cc 2018-03-20 11:04:15.000000000 +0000 @@ -21,6 +21,7 @@ #include "rawimage.h" #include "imagedata.h" #include "median.h" +#include "utils.h" namespace rtengine { @@ -129,7 +130,7 @@ // this may not be necessary, as flatfield is further blurred before being applied to the processed image. if( !pathNames.empty() ) { std::list::iterator iName = pathNames.begin(); - ri = new RawImage(*iName); // First file used also for extra pixels informations (width,height, shutter, filters etc.. ) + ri = new RawImage(*iName); // First file used also for extra pixels information (width, height, shutter, filters etc.. ) if( ri->loadRaw(true)) { delete ri; ri = nullptr; @@ -288,43 +289,36 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool) { - auto file = Gio::File::create_for_path (filename); + auto ext = getFileExtension(filename); + + if (ext.empty() || !options.is_extention_enabled(ext)) { + return nullptr; + } + + auto file = Gio::File::create_for_path(filename); if (!file ) { return nullptr; } - if (!file->query_exists ()) { + if (!file->query_exists()) { return nullptr; } try { - auto info = file->query_info (); - - if (!info || info->get_file_type () == Gio::FILE_TYPE_DIRECTORY) { - return nullptr; - } + auto info = file->query_info("standard::name,standard::type,standard::is-hidden"); - if (!options.fbShowHidden && info->is_hidden ()) { + if (!info || info->get_file_type() == Gio::FILE_TYPE_DIRECTORY) { return nullptr; } - Glib::ustring ext; - - auto lastdot = info->get_name ().find_last_of ('.'); - - if (lastdot != Glib::ustring::npos) { - ext = info->get_name ().substr (lastdot + 1); - } - - if (!options.is_extention_enabled (ext)) { + if (!options.fbShowHidden && info->is_hidden()) { return nullptr; } - - RawImage ri (filename); - int res = ri.loadRaw (false); // Read informations about shot + RawImage ri(filename); + int res = ri.loadRaw(false); // Read information about shot if (res != 0) { return nullptr; @@ -334,32 +328,28 @@ if(!pool) { ffInfo n(filename, "", "", "", 0, 0, 0); - iter = ffList.insert(std::pair< std::string, ffInfo>( "", n ) ); + iter = ffList.emplace("", n); return &(iter->second); } - RawMetaDataLocation rml; - rml.exifBase = ri.get_exifBase(); - rml.ciffBase = ri.get_ciffBase(); - rml.ciffLength = ri.get_ciffLen(); - ImageData idata(filename, &rml); + FramesData idata(filename, std::unique_ptr(new RawMetaDataLocation(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen())), true); /* Files are added in the map, divided by same maker/model,lens and aperture*/ - std::string key( ffInfo::key(idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber()) ); - iter = ffList.find( key ); + std::string key(ffInfo::key(idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber())); + iter = ffList.find(key); - if( iter == ffList.end() ) { + if(iter == ffList.end()) { ffInfo n(filename, idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber(), idata.getDateTimeAsTS()); - iter = ffList.insert(std::pair< std::string, ffInfo>( key, n ) ); + iter = ffList.emplace(key, n); } else { - while( iter != ffList.end() && iter->second.key() == key && ABS(iter->second.timestamp - ri.get_timestamp()) > 60 * 60 * 6 ) { // 6 hour difference + while(iter != ffList.end() && iter->second.key() == key && ABS(iter->second.timestamp - ri.get_timestamp()) > 60 * 60 * 6) { // 6 hour difference ++iter; } - if( iter != ffList.end() ) { - iter->second.pathNames.push_back( filename ); + if(iter != ffList.end()) { + iter->second.pathNames.push_back(filename); } else { ffInfo n(filename, idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber(), idata.getDateTimeAsTS()); - iter = ffList.insert(std::pair< std::string, ffInfo>( key, n ) ); + iter = ffList.emplace(key, n); } } diff -Nru rawtherapee-5.3/rtengine/FTblockDN.cc rawtherapee-5.4/rtengine/FTblockDN.cc --- rawtherapee-5.3/rtengine/FTblockDN.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/FTblockDN.cc 2018-03-20 11:04:15.000000000 +0000 @@ -41,6 +41,7 @@ #ifdef _OPENMP #include #endif +#include "StopWatch.h" #define TS 64 // Tile size #define offset 25 // shift between tiles @@ -71,9 +72,19 @@ extern const Settings* settings; +extern MyMutex *fftwMutex; -void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) + +namespace +{ + +template +void do_median_denoise(float **src, float **dst, float upperBound, int width, int height, ImProcFunctions::Median medianType, int iterations, int numThreads, float **buffer) { + iterations = max(1, iterations); + + typedef ImProcFunctions::Median Median; + int border = 1; switch (medianType) { @@ -110,7 +121,7 @@ // we need a buffer if src == dst or if (src != dst && iterations > 1) if (src == dst || iterations > 1) { - if (buffer == nullptr) { // we didn't get a buufer => create one + if (buffer == nullptr) { // we didn't get a buffer => create one allocBuffer = new float*[height]; for (int i = 0; i < height; ++i) { @@ -154,13 +165,17 @@ switch (medianType) { case Median::TYPE_3X3_SOFT: { for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j] - ); + if (!useUpperBound || medianIn[i][j] <= upperBound) { + medianOut[i][j] = median( + medianIn[i - 1][j], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j] + ); + } else { + medianOut[i][j] = medianIn[i][j]; + } } break; @@ -168,17 +183,21 @@ case Median::TYPE_3X3_STRONG: { for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1] - ); + if (!useUpperBound || medianIn[i][j] <= upperBound) { + medianOut[i][j] = median( + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1] + ); + } else { + medianOut[i][j] = medianIn[i][j]; + } } break; @@ -186,21 +205,25 @@ case Median::TYPE_5X5_SOFT: { for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 2][j] - ); + if (!useUpperBound || medianIn[i][j] <= upperBound) { + medianOut[i][j] = median( + medianIn[i - 2][j], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 2][j] + ); + } else { + medianOut[i][j] = medianIn[i][j]; + } } break; @@ -209,7 +232,7 @@ case Median::TYPE_5X5_STRONG: { #ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { + for (; !useUpperBound && j < width - border - 3; j += 4) { STVFU( medianOut[i][j], median( @@ -245,33 +268,37 @@ #endif for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j - 2], - medianIn[i - 2][j - 1], - medianIn[i - 2][j], - medianIn[i - 2][j + 1], - medianIn[i - 2][j + 2], - medianIn[i - 1][j - 2], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i - 1][j + 2], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 1][j + 2], - medianIn[i + 2][j - 2], - medianIn[i + 2][j - 1], - medianIn[i + 2][j], - medianIn[i + 2][j + 1], - medianIn[i + 2][j + 2] - ); + if (!useUpperBound || medianIn[i][j] <= upperBound) { + medianOut[i][j] = median( + medianIn[i - 2][j - 2], + medianIn[i - 2][j - 1], + medianIn[i - 2][j], + medianIn[i - 2][j + 1], + medianIn[i - 2][j + 2], + medianIn[i - 1][j - 2], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i - 1][j + 2], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 1][j + 2], + medianIn[i + 2][j - 2], + medianIn[i + 2][j - 1], + medianIn[i + 2][j], + medianIn[i + 2][j + 1], + medianIn[i + 2][j + 2] + ); + } else { + medianOut[i][j] = medianIn[i][j]; + } } break; @@ -281,7 +308,7 @@ #ifdef __SSE2__ std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { + for (; !useUpperBound && j < width - border - 3; j += 4) { for (int kk = 0, ii = -border; ii <= border; ++ii) { for (int jj = -border; jj <= border; ++jj, ++kk) { vpp[kk] = LVFU(medianIn[i + ii][j + jj]); @@ -296,13 +323,17 @@ std::array pp; for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + if (!useUpperBound || medianIn[i][j] <= upperBound) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } - } - medianOut[i][j] = median(pp); + medianOut[i][j] = median(pp); + } else { + medianOut[i][j] = medianIn[i][j]; + } } break; @@ -312,7 +343,7 @@ #ifdef __SSE2__ std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { + for (; !useUpperBound && j < width - border - 3; j += 4) { for (int kk = 0, ii = -border; ii <= border; ++ii) { for (int jj = -border; jj <= border; ++jj, ++kk) { vpp[kk] = LVFU(medianIn[i + ii][j + jj]); @@ -327,13 +358,17 @@ std::array pp; for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + if (!useUpperBound || medianIn[i][j] <= upperBound) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } - } - medianOut[i][j] = median(pp); + medianOut[i][j] = median(pp); + } else { + medianOut[i][j] = medianIn[i][j]; + } } for (; j < width; ++j) { @@ -365,8 +400,8 @@ #pragma omp parallel for num_threads(numThreads) if (numThreads>1) #endif - for (int i = border; i < height - border; ++i) { - for (int j = border; j < width - border; ++j) { + for (int i = 0; i < height; ++i) { + for (int j = 0; j < width; ++j) { dst[i][j] = medianOut[i][j]; } } @@ -381,6 +416,21 @@ } } +} // namespace + + +void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) +{ + do_median_denoise(src, dst, 0.f, width, height, medianType, iterations, numThreads, buffer); +} + + +void ImProcFunctions::Median_Denoise(float **src, float **dst, float upperBound, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) +{ + do_median_denoise(src, dst, upperBound, width, height, medianType, iterations, numThreads, buffer); +} + + void ImProcFunctions::Tile_calc(int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip) { @@ -424,8 +474,9 @@ int denoiseNestedLevels = 1; enum nrquality {QUALITY_STANDARD, QUALITY_HIGH}; -SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &nresi, float &highresi) +void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi) { +BENCHFUN //#ifdef _DEBUG MyTime t1e, t2e; t1e.set(); @@ -445,11 +496,10 @@ return; } - static MyMutex FftwMutex; - MyMutex::MyLock lock(FftwMutex); + MyMutex::MyLock lock(*fftwMutex); const nrquality nrQuality = (dnparams.smethod == "shal") ? QUALITY_STANDARD : QUALITY_HIGH;//shrink method - const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / static_cast( settings->nrhigh) : 1.0f; + const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / static_cast(settings->nrhigh) : 1.0f; const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f); const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f); const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV")); @@ -489,15 +539,15 @@ const bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); // init luma noisevarL - const float noiseluma = static_cast( dnparams.luma); - const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? static_cast (SQR(((noiseluma + 1.0) / 125.0) * (10. + (noiseluma + 1.0) / 25.0))) : static_cast (SQR((noiseluma / 125.0) * (1.0 + noiseluma / 25.0))); + const float noiseluma = static_cast(dnparams.luma); + const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? static_cast(SQR(((noiseluma + 1.0) / 125.0) * (10. + (noiseluma + 1.0) / 25.0))) : static_cast(SQR((noiseluma / 125.0) * (1.0 + noiseluma / 25.0))); const bool denoiseLuminance = (noisevarL > 0.00001f); //printf("NL=%f \n",noisevarL); if (useNoiseLCurve || useNoiseCCurve) { int hei = calclum->getHeight(); int wid = calclum->getWidth(); - TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); const float wpi[3][3] = { {static_cast(wprofi[0][0]), static_cast(wprofi[0][1]), static_cast(wprofi[0][2])}, @@ -611,8 +661,9 @@ Color::gammanf2lut(igamcurve, igam, 32768.f, 65535.f); } - const float gain = pow (2.0f, float(expcomp)); - float noisevar_Ldetail = SQR(static_cast(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); + const float gain = pow(2.0f, float(expcomp)); + float params_Ldetail = min(float(dnparams.Ldetail), 99.9f); // max out to avoid div by zero when using noisevar_Ldetail as divisor + float noisevar_Ldetail = SQR(static_cast(SQR(100. - params_Ldetail) + 50.*(100. - params_Ldetail)) * TS * 0.5f); array2D tilemask_in(TS, TS); array2D tilemask_out(TS, TS); @@ -664,7 +715,7 @@ int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - Tile_calc (tilesize, overlap, (options.rgbDenoiseThreadLimit == 0 && !ponder) ? (numTries == 1 ? 0 : 2) : 2, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + Tile_calc(tilesize, overlap, (options.rgbDenoiseThreadLimit == 0 && !ponder) ? (numTries == 1 ? 0 : 2) : 2, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); memoryAllocationFailed = false; const int numtiles = numtiles_W * numtiles_H; @@ -704,8 +755,8 @@ fftwf_plan plan_backward_blox[2]; if (denoiseLuminance) { - float *Lbloxtmp = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof (float))); - float *fLbloxtmp = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof (float))); + float *Lbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + float *fLbloxtmp = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); int nfwd[2] = {TS, TS}; @@ -714,12 +765,12 @@ fftw_r2r_kind bwdkind[2] = {FFTW_REDFT01, FFTW_REDFT01}; // Creating the plans with FFTW_MEASURE instead of FFTW_ESTIMATE speeds up the execute a bit - plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - fftwf_free (Lbloxtmp); - fftwf_free (fLbloxtmp); + plan_forward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, nullptr, 1, TS * TS, fLbloxtmp, nullptr, 1, TS * TS, fwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, nullptr, 1, TS * TS, Lbloxtmp, nullptr, 1, TS * TS, bwdkind, FFTW_MEASURE | FFTW_DESTROY_INPUT); + fftwf_free(Lbloxtmp); + fftwf_free(fLbloxtmp); } #ifndef _OPENMP @@ -732,7 +783,7 @@ numthreads = MIN(numthreads, options.rgbDenoiseThreadLimit); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP denoiseNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); @@ -743,7 +794,7 @@ } if (options.rgbDenoiseThreadLimit > 0) - while(denoiseNestedLevels * numthreads > options.rgbDenoiseThreadLimit) { + while (denoiseNestedLevels * numthreads > options.rgbDenoiseThreadLimit) { denoiseNestedLevels--; } @@ -759,12 +810,12 @@ if (numtiles > 1 && denoiseLuminance) { for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { - LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); - fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + LbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + fLbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } } - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.working); //inverse matrix user select const float wip[3][3] = { {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, @@ -772,7 +823,7 @@ {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); const float wp[3][3] = { {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, @@ -811,19 +862,19 @@ int height = tilebottom - tiletop; int width2 = (width + 1) / 2; float realred, realblue; - float interm_med = static_cast( dnparams.chroma) / 10.0; + float interm_med = static_cast(dnparams.chroma) / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { - intermred = static_cast( dnparams.redchro) / 7.0; //increase slower than linear for more sensit + intermred = static_cast(dnparams.redchro) / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { - intermblue = static_cast( dnparams.bluechro) / 7.0; //increase slower than linear for more sensit + intermblue = static_cast(dnparams.bluechro) / 7.0; //increase slower than linear for more sensit } if (ponder && kall == 2) { @@ -865,7 +916,7 @@ if (!denoiseMethodRgb) { //lab mode //modification Jacques feb 2013 and july 2014 -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -913,7 +964,7 @@ } } } else {//RGB mode -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -948,7 +999,7 @@ } } } else {//image is not raw; use Lab parametrization -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -1037,7 +1088,7 @@ //binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample //the first level only, 7 means subsample the first three levels, etc. //actual implementation only works with subsampling set to 1 - float interm_medT = static_cast( dnparams.chroma) / 10.0; + float interm_medT = static_cast(dnparams.chroma) / 10.0; bool execwavelet = true; if (!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { @@ -1097,7 +1148,7 @@ levwav = min(maxlev2, levwav); // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b); - Ldecomp = new wavelet_decomposition (labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + Ldecomp = new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); if (Ldecomp->memoryAllocationFailed) { memoryAllocationFailed = true; @@ -1108,7 +1159,7 @@ if (!memoryAllocationFailed) { // precalculate madL, because it's used in adecomp and bdecomp int maxlvl = Ldecomp->maxlevel(); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -1134,7 +1185,7 @@ float chmaxresid = 0.f; float chmaxresidtemp = 0.f; - adecomp = new wavelet_decomposition (labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + adecomp = new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); if (adecomp->memoryAllocationFailed) { memoryAllocationFailed = true; @@ -1171,7 +1222,7 @@ delete adecomp; if (!memoryAllocationFailed) { - wavelet_decomposition* bdecomp = new wavelet_decomposition (labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); + wavelet_decomposition* bdecomp = new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); if (bdecomp->memoryAllocationFailed) { memoryAllocationFailed = true; @@ -1233,7 +1284,7 @@ if (!memoryAllocationFailed) { // copy labdn->L to Lin before it gets modified by reconstruction Lin = new array2D(width, height); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -1253,79 +1304,6 @@ } if (!memoryAllocationFailed) { - if ((metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { - float** tmL; - int wid = labdn->W; - int hei = labdn->H; - tmL = new float*[hei]; - - for (int i = 0; i < hei; ++i) { - tmL[i] = new float[wid]; - } - - Median medianTypeL = Median::TYPE_3X3_SOFT; - Median medianTypeAB = Median::TYPE_3X3_SOFT; - - if (dnparams.medmethod == "soft") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_3X3_SOFT; - } else { - medianTypeL = Median::TYPE_3X3_SOFT; - medianTypeAB = Median::TYPE_3X3_SOFT; - } - } else if (dnparams.medmethod == "33") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_3X3_STRONG; - } else { - medianTypeL = Median::TYPE_3X3_SOFT; - medianTypeAB = Median::TYPE_3X3_STRONG; - } - } else if (dnparams.medmethod == "55soft") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_5X5_SOFT; - } else { - medianTypeL = Median::TYPE_3X3_SOFT; - medianTypeAB = Median::TYPE_5X5_SOFT; - } - } else if (dnparams.medmethod == "55") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_5X5_STRONG; - } else { - medianTypeL = Median::TYPE_3X3_STRONG; - medianTypeAB = Median::TYPE_5X5_STRONG; - } - } else if (dnparams.medmethod == "77") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_7X7; - } else { - medianTypeL = Median::TYPE_3X3_STRONG; - medianTypeAB = Median::TYPE_7X7; - } - } else if (dnparams.medmethod == "99") { - if (metchoice != 4) { - medianTypeL = medianTypeAB = Median::TYPE_9X9; - } else { - medianTypeL = Median::TYPE_5X5_SOFT; - medianTypeAB = Median::TYPE_9X9; - } - } - - if (metchoice == 1 || metchoice == 2 || metchoice == 4) { - Median_Denoise(labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); - } - - if (metchoice == 2 || metchoice == 3 || metchoice == 4) { - Median_Denoise(labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); - Median_Denoise(labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); - } - - for (int i = 0; i < hei; ++i) { - delete[] tmL[i]; - } - - delete[] tmL; - } - //wavelet denoised L channel //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1354,19 +1332,19 @@ if (numtiles == 1) { for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { - LbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); - fLbloxArray[i] = reinterpret_cast( fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + LbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); + fLbloxArray[i] = reinterpret_cast(fftwf_malloc(max_numblox_W * TS * TS * sizeof(float))); } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP int masterThread = omp_get_thread_num(); #endif -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP int subThread = masterThread * denoiseNestedLevels + omp_get_thread_num(); #else int subThread = 0; @@ -1376,7 +1354,7 @@ float *fLblox = fLbloxArray[subThread]; float pBuf[width + TS + 2 * blkrad * offset] ALIGNED16; float nbrwt[TS * TS] ALIGNED64; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -1450,7 +1428,7 @@ for (int hblk = 0; hblk < numblox_W; ++hblk) { - RGBtile_denoise (fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); + RGBtile_denoise(fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1465,7 +1443,7 @@ int topproc = (vblk - blkrad) * offset; //add row of blocks to output image tile - RGBoutput_tile_row (Lblox, Ldetail, tilemask_out, height, width, topproc); + RGBoutput_tile_row(Lblox, Ldetail, tilemask_out, height, width, topproc); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1476,7 +1454,7 @@ } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -1488,6 +1466,79 @@ } } + if ((metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { + float** tmL; + int wid = labdn->W; + int hei = labdn->H; + tmL = new float*[hei]; + + for (int i = 0; i < hei; ++i) { + tmL[i] = new float[wid]; + } + + Median medianTypeL = Median::TYPE_3X3_SOFT; + Median medianTypeAB = Median::TYPE_3X3_SOFT; + + if (dnparams.medmethod == "soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_SOFT; + } else { + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_SOFT; + } + } else if (dnparams.medmethod == "33") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_STRONG; + } else { + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_STRONG; + } + } else if (dnparams.medmethod == "55soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_SOFT; + } else { + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_5X5_SOFT; + } + } else if (dnparams.medmethod == "55") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_STRONG; + } else { + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_5X5_STRONG; + } + } else if (dnparams.medmethod == "77") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_7X7; + } else { + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_7X7; + } + } else if (dnparams.medmethod == "99") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_9X9; + } else { + medianTypeL = Median::TYPE_5X5_SOFT; + medianTypeAB = Median::TYPE_9X9; + } + } + + if (metchoice == 1 || metchoice == 2 || metchoice == 4) { + Median_Denoise(labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); + } + + if (metchoice == 2 || metchoice == 3 || metchoice == 4) { + Median_Denoise(labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + Median_Denoise(labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + } + + for (int i = 0; i < hei; ++i) { + delete[] tmL[i]; + } + + delete[] tmL; + } + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // transform denoised "Lab" to output RGB @@ -1540,7 +1591,7 @@ realred /= 100.f; realblue /= 100.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) num_threads(denoiseNestedLevels) #endif @@ -1590,7 +1641,7 @@ } } } else {//RGB mode -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) #endif @@ -1630,7 +1681,7 @@ } } else { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) #endif @@ -1697,7 +1748,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP omp_set_nested(oldNested); #endif @@ -1732,9 +1783,8 @@ fftwf_destroy_plan(plan_backward_blox[0]); fftwf_destroy_plan(plan_forward_blox[1]); fftwf_destroy_plan(plan_backward_blox[1]); - fftwf_cleanup(); } - } while(memoryAllocationFailed && numTries < 2 && (options.rgbDenoiseThreadLimit == 0) && !ponder); + } while (memoryAllocationFailed && numTries < 2 && (options.rgbDenoiseThreadLimit == 0) && !ponder); if (memoryAllocationFailed) { printf("tiled denoise failed due to isufficient memory. Output is not denoised!\n"); @@ -1796,16 +1846,16 @@ } } } - } else { + } else + { #pragma omp for - for (int i = 2; i < hei - 2; ++i) - { + for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), - source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), - source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 + source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), + source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 } } else { for (int j = 2; j < wid - 2; ++j) { @@ -1828,6 +1878,7 @@ } } } + #ifdef _OPENMP #pragma omp for nowait #endif @@ -1854,16 +1905,16 @@ } } } - } else { + } else + { #pragma omp for - for (int i = 2; i < hei - 2; ++i) - { + for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), - source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), - source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 + source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), + source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 } } else { for (int j = 2; j < wid - 2; ++j) { @@ -1914,16 +1965,16 @@ } } } - } else { + } else + { #pragma omp for - for (int i = 2; i < hei - 2; ++i) - { + for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), - source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), - source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 + source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), + source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 } } else { for (int j = 2; j < wid - 2; ++j) { @@ -1992,7 +2043,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT +void ImProcFunctions::RGBtile_denoise(float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT { int blkstart = hblproc * TS * TS; @@ -2025,7 +2076,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) +void ImProcFunctions::RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { const int numblox_W = ceil((static_cast(width)) / (offset)); const float DCTnorm = 1.0f / (4 * TS * TS); //for DCT @@ -2104,7 +2155,7 @@ float ImProcFunctions::Mad(float * DataList, const int datalen) { - if(datalen <= 1) { // Avoid possible buffer underrun + if (datalen <= 1) { // Avoid possible buffer underrun return 0; } @@ -2133,7 +2184,7 @@ float ImProcFunctions::MadRgb(float * DataList, const int datalen) { - if(datalen <= 1) { // Avoid possible buffer underrun + if (datalen <= 1) { // Avoid possible buffer underrun return 0; } @@ -2203,7 +2254,7 @@ chmaxresid = maxresid; } -SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]) { int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); const float eps = 0.01f; @@ -2221,7 +2272,7 @@ } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2236,7 +2287,7 @@ if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2336,7 +2387,7 @@ return (!memoryAllocationFailed); } -SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, +bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb) { int maxlvl = WaveletCoeffs_L.maxlevel(); @@ -2360,7 +2411,7 @@ } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2376,7 +2427,7 @@ if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2395,7 +2446,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2499,7 +2550,7 @@ } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2514,7 +2565,7 @@ } if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2554,7 +2605,7 @@ } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2568,7 +2619,7 @@ } if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2592,7 +2643,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, +void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge) { @@ -2682,7 +2733,7 @@ } -SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, +void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) @@ -2797,10 +2848,10 @@ } -SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, int level, - int W_ab, int H_ab, int skip_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, - float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, bool autoch, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, - float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread) +void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, + int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, + float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, + float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) { //simple wavelet shrinkage @@ -2860,7 +2911,7 @@ } } - const float reduc = (schoice == 2) ? static_cast( settings->nrhigh) : 1.f; + const float reduc = (schoice == 2) ? static_cast(settings->nrhigh) : 1.f; for (int dir = 1; dir < 4; ++dir) { float mada, madb; @@ -2916,8 +2967,8 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, - wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, bool autoch, - float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread) + wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, + float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb) { int maxlvl = levwav; @@ -2927,19 +2978,17 @@ int Wlvl_ab = WaveletCoeffs_a.level_W(lvl); int Hlvl_ab = WaveletCoeffs_a.level_H(lvl); - int skip_ab = WaveletCoeffs_a.level_stride(lvl); - float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl); float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl); - ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, lvl, Wlvl_ab, Hlvl_ab, - skip_ab, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevar_abr, noisevar_abb, noi, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, - autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread); + ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, Wlvl_ab, Hlvl_ab, + noisevarlum, noisevarchrom, noisevarhue, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, + schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb); } } -SSEFUNCTION void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope) +void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoiseParams & dnparams, bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope) { gam = dnparams.gamma; gamthresh = 0.001f; @@ -2962,7 +3011,7 @@ } } -void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) +void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc) { float reducdelta = 1.f; @@ -3041,7 +3090,7 @@ delta *= 0.15f; } else if (chaut < 650.f) { delta *= 0.1f; - } else /*if (chaut >= 650.f)*/ { + } else { /*if (chaut >= 650.f)*/ delta *= 0.07f; } @@ -3079,7 +3128,7 @@ delta *= 0.3f; } else if (chaut < 650.f) { delta *= 0.2f; - } else /*if (chaut >= 650.f)*/ { + } else { /*if (chaut >= 650.f)*/ delta *= 0.15f; } @@ -3104,7 +3153,7 @@ } -SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread) +void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat * provicalc, const bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread) { if ((settings->leveldnautsimpl == 1 && dnparams.Cmethod == "MAN") || (settings->leveldnautsimpl == 0 && dnparams.C2method == "MANU")) { //nothing to do @@ -3117,7 +3166,7 @@ float** bcalc; hei = provicalc->getHeight(); wid = provicalc->getWidth(); - TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); const float wpi[3][3] = { {static_cast(wprofi[0][0]), static_cast(wprofi[0][1]), static_cast(wprofi[0][2])}, @@ -3143,7 +3192,7 @@ bcalc[i] = new float[wid]; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3169,7 +3218,7 @@ bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); - const float gain = pow (2.0f, float(expcomp)); + const float gain = pow(2.0f, float(expcomp)); int tilesize; int overlap; @@ -3188,11 +3237,11 @@ //always no Tiles int kall = 0; - Tile_calc (tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + Tile_calc(tilesize, overlap, kall, imwidth, imheight, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); const float wp[3][3] = { {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, @@ -3235,23 +3284,20 @@ noisevarhue[i] = new float[(width + 1) / 2]; } - // init luma noisevarL - float noisevarab_b, noisevarab_r; - float realred, realblue; - float interm_med = static_cast( dnparams.chroma) / 10.0; + float interm_med = static_cast(dnparams.chroma) / 10.0; float intermred, intermblue; if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { - intermred = static_cast( dnparams.redchro) / 7.0; //increase slower than linear for more sensit + intermred = static_cast(dnparams.redchro) / 7.0; //increase slower than linear for more sensit } if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { - intermblue = static_cast( dnparams.bluechro) / 7.0; //increase slower than linear for more sensit + intermblue = static_cast(dnparams.bluechro) / 7.0; //increase slower than linear for more sensit } realred = interm_med + intermred; @@ -3266,11 +3312,10 @@ realblue = 0.001f; } - //TODO: implement using AlignedBufferMP //fill tile from image; convert RGB to "luma/chroma" if (isRAW) {//image is raw; use channel differences for chroma channels -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3323,7 +3368,7 @@ #endif } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3341,7 +3386,7 @@ if (!denoiseMethodRgb) { //lab mode, modification Jacques feb 2013 and july 2014 -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3467,8 +3512,6 @@ //and whether to subsample the image after wavelet filtering. Subsampling is coded as //binary 1 or 0 for each level, eg subsampling = 0 means no subsampling, 1 means subsample //the first level only, 7 means subsample the first three levels, etc. - noisevarab_r = SQR(realred) + 0.01f; - noisevarab_b = SQR(realblue) + 0.01f; wavelet_decomposition* adecomp; wavelet_decomposition* bdecomp; @@ -3480,25 +3523,23 @@ } const int levwav = 5; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel sections if (multiThread) #endif { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp section #endif { - adecomp = new wavelet_decomposition (labdn->data + datalen, labdn->W, labdn->H, levwav, 1); + adecomp = new wavelet_decomposition(labdn->data + datalen, labdn->W, labdn->H, levwav, 1); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp section #endif { - bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1); + bdecomp = new wavelet_decomposition(labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1); } } - const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV")); - if (comptlevel == 0) { WaveletDenoiseAll_info( @@ -3508,11 +3549,6 @@ noisevarlum, noisevarchrom, noisevarhue, - width, - height, - noisevarab_r, - noisevarab_b, - labdn, chaut, Nb, redaut, @@ -3522,7 +3558,6 @@ minredaut, minblueaut, schoice, - autoch, chromina, sigma, lumema, @@ -3538,8 +3573,7 @@ chau, chred, chblue, - denoiseMethodRgb, - multiThread + denoiseMethodRgb ); // Enhance mode } diff -Nru rawtherapee-5.3/rtengine/fujicompressed.cc rawtherapee-5.4/rtengine/fujicompressed.cc --- rawtherapee-5.3/rtengine/fujicompressed.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/fujicompressed.cc 2018-03-20 11:04:15.000000000 +0000 @@ -534,7 +534,7 @@ fuji_extend_generic (linebuf, line_width, _B2, _B4); } -void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct fuji_compressed_params *params, int cur_line) +void CLASS xtrans_decode_block (struct fuji_compressed_block* info, const struct fuji_compressed_params *params) { int r_even_pos = 0, r_odd_pos = 1; int g_even_pos = 0, g_odd_pos = 1; @@ -699,8 +699,7 @@ } } -void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const struct fuji_compressed_params *params, - int cur_line) +void CLASS fuji_bayer_decode_block (struct fuji_compressed_block *info, const struct fuji_compressed_params *params) { int r_even_pos = 0, r_odd_pos = 1; int g_even_pos = 0, g_odd_pos = 1; @@ -867,9 +866,9 @@ for (cur_line = 0; cur_line < fuji_total_lines; cur_line++) { if (fuji_raw_type == 16) { - xtrans_decode_block (&info, info_common, cur_line); + xtrans_decode_block (&info, info_common); } else { - fuji_bayer_decode_block (&info, info_common, cur_line); + fuji_bayer_decode_block (&info, info_common); } // copy data from line buffers and advance diff -Nru rawtherapee-5.3/rtengine/gauss.cc rawtherapee-5.4/rtengine/gauss.cc --- rawtherapee-5.3/rtengine/gauss.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/gauss.cc 2018-03-20 11:04:15.000000000 +0000 @@ -229,7 +229,7 @@ } #ifdef __SSE2__ -template SSEFUNCTION void gaussVertical3 (T** src, T** dst, int W, int H, const float c0, const float c1) +template void gaussVertical3 (T** src, T** dst, int W, int H, const float c0, const float c1) { vfloat Tv = F2V(0.f), Tm1v, Tp1v; vfloat Tv1 = F2V(0.f), Tm1v1, Tp1v1; @@ -314,7 +314,7 @@ #ifdef __SSE2__ // fast gaussian approximation if the support window is large -template SSEFUNCTION void gaussHorizontalSse (T** src, T** dst, const int W, const int H, const float sigma) +template void gaussHorizontalSse (T** src, T** dst, const int W, const int H, const float sigma) { double b1, b2, b3, B, M[3][3]; calculateYvVFactors(sigma, b1, b2, b3, B, M); @@ -474,7 +474,7 @@ } #ifdef __SSE2__ -template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, const int W, const int H, const float sigma) +template void gaussVerticalSse (T** src, T** dst, const int W, const int H, const float sigma) { double b1, b2, b3, B, M[3][3]; calculateYvVFactors(sigma, b1, b2, b3, B, M); @@ -617,7 +617,7 @@ #endif #ifdef __SSE2__ -template SSEFUNCTION void gaussVerticalSsemult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, const float sigma) +template void gaussVerticalSsemult (T** RESTRICT src, T** RESTRICT dst, const int W, const int H, const float sigma) { double b1, b2, b3, B, M[3][3]; calculateYvVFactors(sigma, b1, b2, b3, B, M); @@ -758,7 +758,7 @@ } } -template SSEFUNCTION void gaussVerticalSsediv (T** RESTRICT src, T** RESTRICT dst, T** divBuffer, const int W, const int H, const float sigma) +template void gaussVerticalSsediv (T** src, T** dst, T** divBuffer, const int W, const int H, const float sigma) { double b1, b2, b3, B, M[3][3]; calculateYvVFactors(sigma, b1, b2, b3, B, M); diff -Nru rawtherapee-5.3/rtengine/helpersse2.h rawtherapee-5.4/rtengine/helpersse2.h --- rawtherapee-5.3/rtengine/helpersse2.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/helpersse2.h 2018-03-20 11:04:15.000000000 +0000 @@ -29,29 +29,13 @@ typedef __m128i vint2; // -#ifdef __GNUC__ -#if (!defined(WIN32) || defined( __x86_64__ )) #define LVF(x) _mm_load_ps((float*)&x) #define LVFU(x) _mm_loadu_ps(&x) #define STVF(x,y) _mm_store_ps(&x,y) #define STVFU(x,y) _mm_storeu_ps(&x,y) #define LVI(x) _mm_load_si128((__m128i*)&x) -#else // there is a bug in gcc 4.7.x when using openmp and aligned memory and -O3, also need to map the aligned functions to unaligned functions for WIN32 builds -#define LVF(x) _mm_loadu_ps((float*)&x) -#define LVFU(x) _mm_loadu_ps(&x) -#define STVF(x,y) _mm_storeu_ps(&x,y) -#define STVFU(x,y) _mm_storeu_ps(&x,y) -#define LVI(x) _mm_loadu_si128((__m128i*)&x) -#endif -#else -#define LVF(x) _mm_load_ps((float*)&x) -#define LVFU(x) _mm_loadu_ps(&x) -#define STVF(x,y) _mm_store_ps(&x,y) -#define STVFU(x,y) _mm_storeu_ps(&x,y) -#define LVI(x) _mm_load_si128((__m128i*)&x) -#endif -#if defined(__x86_64__) && defined(__AVX__) +#ifdef __AVX__ #define PERMUTEPS(a,mask) _mm_permute_ps(a,mask) #else #define PERMUTEPS(a,mask) _mm_shuffle_ps(a,a,mask) @@ -67,7 +51,7 @@ // Store a vector of 4 floats in a[0],a[2],a[4] and a[6] -#if defined(__x86_64__) && defined(__SSE4_1__) +#ifdef __SSE4_1__ // SSE4.1 => use _mm_blend_ps instead of _mm_set_epi32 and vself #define STC2VFU(a,v) {\ __m128 TST1V = _mm_loadu_ps(&a);\ diff -Nru rawtherapee-5.3/rtengine/hilite_recon.cc rawtherapee-5.4/rtengine/hilite_recon.cc --- rawtherapee-5.3/rtengine/hilite_recon.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/hilite_recon.cc 2018-03-20 11:04:15.000000000 +0000 @@ -35,7 +35,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int W, int box ) +void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int W, int box ) { //box blur image channel; box size = 2*box+1 //horizontal blur diff -Nru rawtherapee-5.3/rtengine/histmatching.cc rawtherapee-5.4/rtengine/histmatching.cc --- rawtherapee-5.3/rtengine/histmatching.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/histmatching.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,326 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include "rawimagesource.h" +#include "rtthumbnail.h" +#include "curves.h" +#include "color.h" +#include "rt_math.h" +#include "iccstore.h" +#include "../rtgui/mydiagonalcurve.h" +#include "improcfun.h" +#include "StopWatch.h" +#include + + +namespace rtengine { + +extern const Settings *settings; + +namespace { + +struct CdfInfo { + std::vector cdf; + int min_val; + int max_val; + + CdfInfo(): cdf(256), min_val(-1), max_val(-1) {} +}; + + +CdfInfo getCdf(const IImage8 &img) +{ + CdfInfo ret; + + for (int y = 0; y < img.getHeight(); ++y) { + for (int x = 0; x < img.getWidth(); ++x) { + int lum = LIM(0, int(Color::rgbLuminance(float(img.r(y, x)), float(img.g(y, x)), float(img.b(y, x)))), 255); + ++ret.cdf[lum]; + } + } + + int sum = 0; + for (size_t i = 0; i < ret.cdf.size(); ++i) { + if (ret.cdf[i] > 0) { + if (ret.min_val < 0) { + ret.min_val = i; + } + ret.max_val = i; + } + sum += ret.cdf[i]; + ret.cdf[i] = sum; + } + + return ret; +} + + +int findMatch(int val, const std::vector &cdf, int j) +{ + if (cdf[j] <= val) { + for (; j < int(cdf.size()); ++j) { + if (cdf[j] == val) { + return j; + } else if (cdf[j] > val) { + return (cdf[j] - val <= val - cdf[j-1] ? j : j-1); + } + } + return 255; + } else { + for (; j >= 0; --j) { + if (cdf[j] == val) { + return j; + } else if (cdf[j] < val) { + return (val - cdf[j] <= cdf[j+1] - val ? j : j+1); + } + } + return 0; + } +} + + +void mappingToCurve(const std::vector &mapping, std::vector &curve) +{ + curve.clear(); + + const int npoints = 8; + int idx = 15; + for (; idx < int(mapping.size()); ++idx) { + if (mapping[idx] >= idx) { + break; + } + } + if (idx == int(mapping.size())) { + for (idx = 1; idx < int(mapping.size()); ++idx) { + if (mapping[idx] >= idx) { + break; + } + } + } + int step = std::max(int(mapping.size())/npoints, 1); + + auto coord = [](int v) -> double { return double(v)/255.0; }; + auto doit = + [&](int start, int stop, int step, bool addstart) -> void + { + int prev = start; + if (addstart && mapping[start] >= 0) { + curve.push_back(coord(start)); + curve.push_back(coord(mapping[start])); + } + for (int i = start; i < stop; ++i) { + int v = mapping[i]; + if (v < 0) { + continue; + } + bool change = i > 0 && v != mapping[i-1]; + int diff = i - prev; + if ((change && std::abs(diff - step) <= 1) || diff > step * 2) { + curve.push_back(coord(i)); + curve.push_back(coord(v)); + prev = i; + } + } + }; + + curve.push_back(0.0); + curve.push_back(0.0); + + int start = 0; + while (start < idx && (mapping[start] < 0 || start < idx / 2)) { + ++start; + } + + doit(start, idx, idx > step ? step : idx / 2, true); + doit(idx, int(mapping.size()), step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); + + if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { + curve.pop_back(); + curve.pop_back(); + } + + curve.push_back(1.0); + curve.push_back(1.0); + + if (curve.size() < 4) { + curve = { DCT_Linear }; // not enough points, fall back to linear + } else { + curve.insert(curve.begin(), DCT_Spline); + } +} + +} // namespace + + +void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, std::vector &outCurve) +{ + BENCHFUN + + if (settings->verbose) { + std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; + } + + const auto same_profile = + [](const ColorManagementParams &a, const ColorManagementParams &b) -> bool + { + return (a.input == b.input + && a.toneCurve == b.toneCurve + && a.applyLookTable == b.applyLookTable + && a.applyBaselineExposureOffset == b.applyBaselineExposureOffset + && a.applyHueSatMap == b.applyHueSatMap + && a.dcpIlluminant == b.dcpIlluminant); + }; + + if (!histMatchingCache.empty() && same_profile(histMatchingParams, cp)) { + if (settings->verbose) { + std::cout << "tone curve found in cache" << std::endl; + } + outCurve = histMatchingCache; + return; + } + + outCurve = { DCT_Linear }; + + int fw, fh; + getFullSize(fw, fh, TR_NONE); + int skip = 3; + + if (settings->verbose) { + std::cout << "histogram matching: full raw image size is " << fw << "x" << fh << std::endl; + } + + ProcParams neutral; + neutral.icm = cp; + neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); + neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + neutral.icm.output = "sRGB"; + neutral.icm.gamma = "default"; + neutral.icm.freegamma = false; + + std::unique_ptr source; + { + RawMetaDataLocation rml; + eSensorType sensor_type; + int w, h; + std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true)); + if (!thumb) { + if (settings->verbose) { + std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; + } + histMatchingCache = outCurve; + histMatchingParams = cp; + return; + } + skip = LIM(skip * fh / h, 6, 10); // adjust the skip factor -- the larger the thumbnail, the less we should skip to get a good match + source.reset(thumb->quickProcessImage(neutral, fh / skip, TI_Nearest)); + + if (settings->verbose) { + std::cout << "histogram matching: extracted embedded thumbnail" << std::endl; + } + } + + std::unique_ptr target; + { + RawMetaDataLocation rml; + eSensorType sensor_type; + double scale; + int w = fw / skip, h = fh / skip; + std::unique_ptr thumb(Thumbnail::loadFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, false, true)); + if (!thumb) { + if (settings->verbose) { + std::cout << "histogram matching: raw decoding failed, generating a neutral curve" << std::endl; + } + histMatchingCache = outCurve; + histMatchingParams = cp; + return; + } + target.reset(thumb->processImage(neutral, sensor_type, fh / skip, TI_Nearest, getMetaData(), scale, false, true)); + + int sw = source->getWidth(), sh = source->getHeight(); + int tw = target->getWidth(), th = target->getHeight(); + float thumb_ratio = float(std::max(sw, sh)) / float(std::min(sw, sh)); + float target_ratio = float(std::max(tw, th)) / float(std::min(tw, th)); + int cx = 0, cy = 0; + if (std::abs(thumb_ratio - target_ratio) > 0.01) { + if (thumb_ratio > target_ratio) { + // crop the height + int ch = th - (tw * float(sh) / float(sw)); + cy += ch / 2; + th -= ch; + } else { + // crop the width + int cw = tw - (th * float(sw) / float(sh)); + cx += cw / 2; + tw -= cw; + } + if (settings->verbose) { + std::cout << "histogram matching: cropping target to get an aspect ratio of " << round(thumb_ratio * 100)/100.0 << ":1, new size is " << tw << "x" << th << std::endl; + } + + if (cx || cy) { + Image8 *tmp = new Image8(tw, th); +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < th; ++y) { + for (int x = 0; x < tw; ++x) { + tmp->r(y, x) = target->r(y+cy, x+cx); + tmp->g(y, x) = target->g(y+cy, x+cx); + tmp->b(y, x) = target->b(y+cy, x+cx); + } + } + target.reset(tmp); + } + } + + if (settings->verbose) { + std::cout << "histogram matching: generated neutral rendering" << std::endl; + } + } + if (target->getWidth() != source->getWidth() || target->getHeight() != source->getHeight()) { + Image8 *tmp = new Image8(source->getWidth(), source->getHeight()); + target->resizeImgTo(source->getWidth(), source->getHeight(), TI_Nearest, tmp); + target.reset(tmp); + } + CdfInfo scdf = getCdf(*source); + CdfInfo tcdf = getCdf(*target); + + std::vector mapping; + int j = 0; + for (int i = 0; i < int(tcdf.cdf.size()); ++i) { + j = findMatch(tcdf.cdf[i], scdf.cdf, j); + if (i >= tcdf.min_val && i <= tcdf.max_val && j >= scdf.min_val && j <= scdf.max_val) { + mapping.push_back(j); + } else { + mapping.push_back(-1); + } + } + + mappingToCurve(mapping, outCurve); + + if (settings->verbose) { + std::cout << "histogram matching: generated curve with " << outCurve.size()/2 << " control points" << std::endl; + } + + histMatchingCache = outCurve; + histMatchingParams = cp; +} + +} // namespace rtengine diff -Nru rawtherapee-5.3/rtengine/iccstore.cc rawtherapee-5.4/rtengine/iccstore.cc --- rawtherapee-5.3/rtengine/iccstore.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/iccstore.cc 2018-03-20 11:04:15.000000000 +0000 @@ -333,6 +333,10 @@ } defaultMonitorProfile = settings->monitorProfile; + + // initialize the alarm colours for lcms gamut checking -- we use bright green + cmsUInt16Number cms_alarm_codes[cmsMAXCHANNELS] = { 0, 65535, 65535 }; + cmsSetAlarmCodes(cms_alarm_codes); } cmsHPROFILE workingSpace(const Glib::ustring& name) const @@ -501,7 +505,9 @@ ) ||( type==ICCStore::ProfileType::OUTPUT - && (cmsGetDeviceClass(profile.second) == cmsSigDisplayClass || cmsGetDeviceClass(profile.second) == cmsSigOutputClass) + && (cmsGetDeviceClass(profile.second) == cmsSigDisplayClass + || cmsGetDeviceClass(profile.second) == cmsSigInputClass + || cmsGetDeviceClass(profile.second) == cmsSigOutputClass) && cmsGetColorSpace(profile.second) == cmsSigRgbData ) ) { @@ -572,6 +578,7 @@ void setDefaultMonitorProfileName(const Glib::ustring &name) { + MyMutex::MyLock lock(mutex); defaultMonitorProfile = name; } @@ -807,8 +814,8 @@ double ts = icm.slpos; double slope = icm.slpos == 0 ? eps : icm.slpos; - int mode = 0, imax = 0; - Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 + int mode = 0; + Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 ga[4] = g_a[3] * ts; //printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4); ga[0] = icm.gampos; diff -Nru rawtherapee-5.3/rtengine/iccstore.h rawtherapee-5.4/rtengine/iccstore.h --- rawtherapee-5.3/rtengine/iccstore.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/iccstore.h 2018-03-20 11:04:15.000000000 +0000 @@ -34,7 +34,7 @@ namespace procparams { - class ColorManagementParams; + struct ColorManagementParams; } diff -Nru rawtherapee-5.3/rtengine/icons.cc rawtherapee-5.4/rtengine/icons.cc --- rawtherapee-5.3/rtengine/icons.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/icons.cc 2018-03-20 11:04:15.000000000 +0000 @@ -86,7 +86,7 @@ return Glib::ustring(); } -void setPaths (const Options& options) +void setPaths () { // TODO: Forcing the Dark theme, so reading the icon set files is useless for now... diff -Nru rawtherapee-5.3/rtengine/icons.h rawtherapee-5.4/rtengine/icons.h --- rawtherapee-5.3/rtengine/icons.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/icons.h 2018-03-20 11:04:15.000000000 +0000 @@ -26,7 +26,7 @@ { Glib::ustring findIconAbsolutePath (const Glib::ustring& iconName); -void setPaths (const Options& options); +void setPaths (); } diff -Nru rawtherapee-5.3/rtengine/iimage.h rawtherapee-5.4/rtengine/iimage.h --- rawtherapee-5.3/rtengine/iimage.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/iimage.h 2018-03-20 11:04:15.000000000 +0000 @@ -28,6 +28,7 @@ #include "coord2d.h" #include "procparams.h" #include "color.h" +#include "../rtgui/threadutils.h" #define TR_NONE 0 #define TR_R90 1 @@ -125,6 +126,11 @@ { dst = src * 257; } +template<> +inline void ImageDatas::convertTo(float src, float& dst) const +{ + dst = std::isnan(src) ? 0.f : src; +} // -------------------------------------------------------------------- // Planar order classes @@ -1750,7 +1756,7 @@ * @param compression is the amount of compression (0-6), -1 corresponds to the default * @param bps can be 8 or 16 depending on the bits per pixels the output file will have @return the error code, 0 if none */ - virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) = 0; + virtual int saveAsPNG (Glib::ustring fname, int bps = -1) = 0; /** @brief Saves the image to file in a jpg format. * @param fname is the name of the file * @param quality is the quality of the jpeg (0...100), set it to -1 to use default diff -Nru rawtherapee-5.3/rtengine/image16.cc rawtherapee-5.4/rtengine/image16.cc --- rawtherapee-5.3/rtengine/image16.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/image16.cc 2018-03-20 11:04:15.000000000 +0000 @@ -137,17 +137,22 @@ { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; - - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; + + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; @@ -325,50 +330,50 @@ return imgfloat; } -// Parallized transformation; create transform with cmsFLAGS_NOCACHE! -void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) -{ - // LittleCMS cannot parallelize planar Lab float images - // so build temporary buffers to allow multi processor execution -#ifdef _OPENMP - #pragma omp parallel -#endif - { - AlignedBuffer bufferLab(width * 3); - AlignedBuffer bufferRGB(width * 3); - -#ifdef _OPENMP - #pragma omp for schedule(static) -#endif - - for (int y = cy; y < cy + height; y++) - { - unsigned short *pRGB, *pR, *pG, *pB; - float *pLab, *pL, *pa, *pb; - - pLab= bufferLab.data; - pL = labImage.L[y] + cx; - pa = labImage.a[y] + cx; - pb = labImage.b[y] + cx; - - for (int x = 0; x < width; x++) { - *(pLab++) = *(pL++) / 327.68f; - *(pLab++) = *(pa++) / 327.68f; - *(pLab++) = *(pb++) / 327.68f; - } - - cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); - - pRGB = bufferRGB.data; - pR = r(y - cy); - pG = g(y - cy); - pB = b(y - cy); - - for (int x = 0; x < width; x++) { - *(pR++) = *(pRGB++); - *(pG++) = *(pRGB++); - *(pB++) = *(pRGB++); - } - } // End of parallelization - } -} +// // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! +// void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) +// { +// // LittleCMS cannot parallelize planar Lab float images +// // so build temporary buffers to allow multi processor execution +// #ifdef _OPENMP +// #pragma omp parallel +// #endif +// { +// AlignedBuffer bufferLab(width * 3); +// AlignedBuffer bufferRGB(width * 3); + +// #ifdef _OPENMP +// #pragma omp for schedule(static) +// #endif + +// for (int y = cy; y < cy + height; y++) +// { +// unsigned short *pRGB, *pR, *pG, *pB; +// float *pLab, *pL, *pa, *pb; + +// pLab= bufferLab.data; +// pL = labImage.L[y] + cx; +// pa = labImage.a[y] + cx; +// pb = labImage.b[y] + cx; + +// for (int x = 0; x < width; x++) { +// *(pLab++) = *(pL++) / 327.68f; +// *(pLab++) = *(pa++) / 327.68f; +// *(pLab++) = *(pb++) / 327.68f; +// } + +// cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); + +// pRGB = bufferRGB.data; +// pR = r(y - cy); +// pG = g(y - cy); +// pB = b(y - cy); + +// for (int x = 0; x < width; x++) { +// *(pR++) = *(pRGB++); +// *(pG++) = *(pRGB++); +// *(pB++) = *(pRGB++); +// } +// } // End of parallelization +// } +// } diff -Nru rawtherapee-5.3/rtengine/image16.h rawtherapee-5.4/rtengine/image16.h --- rawtherapee-5.3/rtengine/image16.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/image16.h 2018-03-20 11:04:15.000000000 +0000 @@ -75,9 +75,9 @@ { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) + virtual int saveAsPNG (Glib::ustring fname, int bps = -1) { - return savePNG (fname, compression, bps); + return savePNG (fname, bps); } virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) { @@ -96,7 +96,7 @@ delete this; } - void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); + /* void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); */ }; } diff -Nru rawtherapee-5.3/rtengine/image8.cc rawtherapee-5.4/rtengine/image8.cc --- rawtherapee-5.3/rtengine/image8.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/image8.cc 2018-03-20 11:04:15.000000000 +0000 @@ -97,17 +97,22 @@ void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, PreviewProps pp, bool first, procparams::ToneCurveParams hrp) { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; diff -Nru rawtherapee-5.3/rtengine/image8.h rawtherapee-5.4/rtengine/image8.h --- rawtherapee-5.3/rtengine/image8.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/image8.h 2018-03-20 11:04:15.000000000 +0000 @@ -70,9 +70,9 @@ { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) + virtual int saveAsPNG (Glib::ustring fname, int bps = -1) { - return savePNG (fname, compression, bps); + return savePNG (fname, bps); } virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) { diff -Nru rawtherapee-5.3/rtengine/imagedata.cc rawtherapee-5.4/rtengine/imagedata.cc --- rawtherapee-5.3/rtengine/imagedata.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imagedata.cc 2018-03-20 11:04:15.000000000 +0000 @@ -18,9 +18,14 @@ */ #include #include +#include #include "imagedata.h" #include "iptcpairs.h" +#include "imagesource.h" +#include "rt_math.h" +#pragma GCC diagnostic warning "-Wextra" +#define PRINT_HDR_PS_DETECTION 0 using namespace rtengine; @@ -40,87 +45,25 @@ } -ImageMetaData* ImageMetaData::fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml) +FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) { - - return new ImageData (fname, rml); + return new FramesData (fname, std::move(rml), firstFrameOnly); } -ImageData::ImageData (Glib::ustring fname, RawMetaDataLocation* ri) : iso_speed(0), aperture(0.), shutter(0.) +FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir) + : frameRootDir(frameRootDir_), iptc(nullptr), time(), timeStamp(), iso_speed(0), aperture(0.), focal_len(0.), focal_len35mm(0.), focus_dist(0.f), + shutter(0.), expcomp(0.), make("Unknown"), model("Unknown"), orientation("Unknown"), lens("Unknown"), + sampleFormat(IIOSF_UNKNOWN), isPixelShift(false), isHDR(false) { memset (&time, 0, sizeof(time)); - root = nullptr; - iptc = nullptr; - - if (ri && (ri->exifBase >= 0 || ri->ciffBase >= 0)) { - FILE* f = g_fopen (fname.c_str (), "rb"); - - if (f) { - if (ri->exifBase >= 0) { - root = rtexif::ExifManager::parse (f, ri->exifBase); - - if (root) { - rtexif::Tag* t = root->getTag (0x83BB); - - if (t) { - iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); - } - } - } else if (ri->ciffBase >= 0) { - root = rtexif::ExifManager::parseCIFF (f, ri->ciffBase, ri->ciffLength); - } - - fclose (f); - extractInfo (); - } - } else if (hasJpegExtension(fname)) { - FILE* f = g_fopen (fname.c_str (), "rb"); - - if (f) { - root = rtexif::ExifManager::parseJPEG (f); - extractInfo (); - fclose (f); - FILE* ff = g_fopen (fname.c_str (), "rb"); - iptc = iptc_data_new_from_jpeg_file (ff); - fclose (ff); - } - } else if (hasTiffExtension(fname)) { - FILE* f = g_fopen (fname.c_str (), "rb"); - - if (f) { - root = rtexif::ExifManager::parseTIFF (f); - fclose (f); - extractInfo (); - - if (root) { - rtexif::Tag* t = root->getTag (0x83BB); - - if (t) { - iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); - } - } - } - } else { - root = new rtexif::TagDirectory (); - shutter = 0; - aperture = 0; - iso_speed = 0; - lens = "Unknown"; - make = "Unknown"; - model = "Unknown"; - orientation = "Unknown"; - expcomp = 0; - focal_len = 0; - } -} - -void ImageData::extractInfo () -{ - if (!root) { + if (!frameRootDir) { return; } + rtexif::Tag* tag; + rtexif::TagDirectory* newFrameRootDir = frameRootDir; + memset(&time, 0, sizeof(time)); timeStamp = 0; iso_speed = 0; @@ -136,8 +79,18 @@ orientation.clear(); lens.clear(); - if (root->getTag("Make")) { - make = root->getTag ("Make")->valueToString(); + tag = newFrameRootDir->findTag("Make"); + if (!tag) { + newFrameRootDir = rootDir; + tag = newFrameRootDir->findTag("Make"); + if (!tag) { + // For some raw files (like Canon's CR2 files), the metadata are contained in the first root directory + newFrameRootDir = firstRootDir; + tag = newFrameRootDir->findTag("Make"); + } + } + if (tag) { + make = tag->valueToString(); // Same dcraw treatment for (const auto& corp : { "Canon", @@ -169,8 +122,9 @@ make.erase(make.find_last_not_of(' ') + 1); } - if (root->getTag("Model")) { - model = root->getTag("Model")->valueToString(); + tag = newFrameRootDir->findTagUpward("Model"); + if (tag) { + model = tag->valueToString(); } if (!model.empty()) { @@ -202,61 +156,68 @@ model = "Unknown"; } - if (root->getTag ("Orientation")) { - orientation = root->getTag ("Orientation")->valueToString (); + tag = newFrameRootDir->findTagUpward("Orientation"); + if (tag) { + orientation = tag->valueToString (); } - rtexif::TagDirectory* exif = nullptr; + tag = newFrameRootDir->findTagUpward("MakerNote"); + rtexif::TagDirectory* mnote = nullptr; + if (tag) { + mnote = tag->getDirectory(); + } - if (root->getTag ("Exif")) { - exif = root->getTag ("Exif")->getDirectory (); + rtexif::TagDirectory* exif = nullptr; + tag = newFrameRootDir->findTagUpward("Exif"); + if (tag) { + exif = tag->getDirectory (); } if (exif) { // standard exif tags - if (exif->getTag ("ShutterSpeedValue")) { - shutter = exif->getTag ("ShutterSpeedValue")->toDouble (); + if ((tag = exif->getTag ("ShutterSpeedValue"))) { + shutter = tag->toDouble (); } - if (exif->getTag ("ExposureTime")) { - shutter = exif->getTag ("ExposureTime")->toDouble (); + if ((tag = exif->getTag ("ExposureTime"))) { + shutter = tag->toDouble (); } - if (exif->getTag ("ApertureValue")) { - aperture = exif->getTag ("ApertureValue")->toDouble (); + if ((tag = exif->getTag ("ApertureValue"))) { + aperture = tag->toDouble (); } - if (exif->getTag ("FNumber")) { - aperture = exif->getTag ("FNumber")->toDouble (); + if ((tag = exif->getTag ("FNumber"))) { + aperture = tag->toDouble (); } - if (exif->getTag ("ExposureBiasValue")) { - expcomp = exif->getTag ("ExposureBiasValue")->toDouble (); + if ((tag = exif->getTag ("ExposureBiasValue"))) { + expcomp = tag->toDouble (); } - if (exif->getTag ("FocalLength")) { - focal_len = exif->getTag ("FocalLength")->toDouble (); + if ((tag = exif->getTag ("FocalLength"))) { + focal_len = tag->toDouble (); } - if (exif->getTag ("FocalLengthIn35mmFilm")) { - focal_len35mm = exif->getTag ("FocalLengthIn35mmFilm")->toDouble (); + if ((tag = exif->getTag ("FocalLengthIn35mmFilm"))) { + focal_len35mm = tag->toDouble (); } // Focus distance from EXIF or XMP. MakerNote ones are scattered and partly encrypted int num = -3, denom = -3; - // First try, offical EXIF. Set by Adobe on some DNGs - rtexif::Tag* pDst = exif->getTag("SubjectDistance"); + // First try, official EXIF. Set by Adobe on some DNGs + tag = exif->getTag("SubjectDistance"); - if (pDst) { + if (tag) { int num, denom; - pDst->toRational(num, denom); + tag->toRational(num, denom); } else { // Second try, XMP data char sXMPVal[64]; - if (root->getXMPTagValue("aux:ApproximateFocusDistance", sXMPVal)) { + if (newFrameRootDir->getXMPTagValue("aux:ApproximateFocusDistance", sXMPVal)) { sscanf(sXMPVal, "%d/%d", &num, &denom); } } @@ -269,12 +230,12 @@ } } - if (exif->getTag ("ISOSpeedRatings")) { - iso_speed = exif->getTag ("ISOSpeedRatings")->toDouble (); + if ((tag = exif->getTag ("ISOSpeedRatings"))) { + iso_speed = tag->toDouble (); } - if (exif->getTag ("DateTimeOriginal")) { - if (sscanf ((const char*)exif->getTag("DateTimeOriginal")->getValue(), "%d:%d:%d %d:%d:%d", &time.tm_year, &time.tm_mon, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec) == 6) { + if ((tag = exif->getTag ("DateTimeOriginal"))) { + if (sscanf ((const char*)tag->getValue(), "%d:%d:%d %d:%d:%d", &time.tm_year, &time.tm_mon, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec) == 6) { time.tm_year -= 1900; time.tm_mon -= 1; time.tm_isdst = -1; @@ -282,14 +243,14 @@ } } - rtexif::Tag *snTag = exif->findTag ("SerialNumber"); + tag = exif->findTag ("SerialNumber"); - if(!snTag) { - snTag = exif->findTag ("InternalSerialNumber"); + if(!tag) { + tag = exif->findTag ("InternalSerialNumber"); } - if ( snTag ) { - serial = snTag->valueToString(); + if (tag) { + serial = tag->valueToString(); } // guess lens... @@ -313,12 +274,10 @@ } if (lens == "Unknown") { - rtexif::Tag* mnoteTag = root->findTag("MakerNote"); - if (mnoteTag) { - rtexif::TagDirectory* mnote = mnoteTag->getDirectory(); + if (mnote) { - if (mnote && !make.compare (0, 5, "NIKON")) { + if (!make.compare (0, 5, "NIKON")) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { rtexif::Tag* isoTag = mnote->getTagP("ISOInfo/ISO"); @@ -406,7 +365,7 @@ } } } - } else if (mnote && !make.compare (0, 5, "Canon")) { + } else if (!make.compare (0, 5, "Canon")) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { rtexif::Tag* baseIsoTag = mnote->getTagP("CanonShotInfo/BaseISO"); @@ -440,7 +399,7 @@ } } } - } else if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) { + } else if (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX"))) { // ISO at max value supported, check manufacturer specific if (iso_speed == 65535 || iso_speed == 0) { rtexif::Tag* baseIsoTag = mnote->getTag("ISO"); @@ -475,7 +434,7 @@ if (mnote->getTag ("LensID")) { lens = mnote->getTag ("LensID")->valueToString (); } - } else if (mnote && !make.compare (0, 7, "OLYMPUS")) { + } else if (!make.compare (0, 7, "OLYMPUS")) { if (mnote->getTag ("Equipment")) { rtexif::TagDirectory* eq = mnote->getTag ("Equipment")->getDirectory (); @@ -504,31 +463,193 @@ } } } + + rtexif::Tag* t = newFrameRootDir->getTag(0x83BB); + if (t) { + iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); + } + + + // ----------------------- Special file type detection (HDR, PixelShift) ------------------------ + + + uint16 bitspersample = 0, samplesperpixel = 0, sampleformat = 0, photometric = 0, compression = 0; + const rtexif::Tag* const bps = frameRootDir->findTag("BitsPerSample"); + const rtexif::Tag* const spp = frameRootDir->findTag("SamplesPerPixel"); + const rtexif::Tag* const sf = frameRootDir->findTag("SampleFormat"); + const rtexif::Tag* const pi = frameRootDir->findTag("PhotometricInterpretation"); + const rtexif::Tag* const c = frameRootDir->findTag("Compression"); + + if (mnote && (!make.compare (0, 6, "PENTAX") || (!make.compare (0, 5, "RICOH") && !model.compare (0, 6, "PENTAX")))) { + const rtexif::Tag* const hdr = mnote->findTag("HDR"); + if (hdr) { + if (hdr->toInt() > 0 && hdr->toInt(2) > 0) { + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> \"HDR\" tag found\n"); +#endif + } + } else { + const rtexif::Tag* const dm = mnote->findTag("DriveMode"); + if (dm) { + char buffer[60]; + dm->toString(buffer, 3); + buffer[3] = 0; + if (!strcmp(buffer, "HDR")) { + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> DriveMode = \"HDR\"\n"); +#endif + } + } + } + + if (!isHDR) { + const rtexif::Tag* const q = mnote->findTag("Quality"); + if (q && q->toInt() == 7) { + isPixelShift = true; +#if PRINT_HDR_PS_DETECTION + printf("PixelShift detected ! -> \"Quality\" = 7\n"); +#endif + } + } + } + + sampleFormat = IIOSF_UNKNOWN; + + if (!sf) + /* + * WARNING: This is a dirty hack! + * We assume that files which doesn't contain the TIFFTAG_SAMPLEFORMAT tag + * (which is the case with uncompressed TIFFs produced by RT!) are RGB files, + * but that may be not true. --- Hombre + */ + { + sampleformat = SAMPLEFORMAT_UINT; + } else { + sampleformat = sf->toInt(); + } + + if ( + !bps + || !spp + || !pi + ) { + return; + } + + bitspersample = bps->toInt(); + samplesperpixel = spp->toInt(); + + photometric = pi->toInt(); + if (photometric == PHOTOMETRIC_LOGLUV) { + if (!c) { + compression = COMPRESSION_NONE; + } else { + compression = c->toInt(); + } + } + + if (photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_MINISBLACK) { + if (sampleformat == SAMPLEFORMAT_INT || sampleformat == SAMPLEFORMAT_UINT) { + if (bitspersample == 8) { + sampleFormat = IIOSF_UNSIGNED_CHAR; + } else if (bitspersample <= 16) { + sampleFormat = IIOSF_UNSIGNED_SHORT; + } + } else if (sampleformat == SAMPLEFORMAT_IEEEFP) { + /* + * Not yet supported + * + if (bitspersample==16) { + sampleFormat = IIOSF_HALF; + isHDR = true; + }*/ + if (bitspersample == 32) { + sampleFormat = IIOSF_FLOAT; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } + } + } else if (photometric == PHOTOMETRIC_CFA) { + if (sampleformat == SAMPLEFORMAT_IEEEFP) { + sampleFormat = IIOSF_FLOAT; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } else if (sampleformat == SAMPLEFORMAT_INT || sampleformat == SAMPLEFORMAT_UINT) { + if (bitspersample == 8) { // shouldn't occur... + sampleFormat = IIOSF_UNSIGNED_CHAR; + } else if (bitspersample <= 16) { + sampleFormat = IIOSF_UNSIGNED_SHORT; + } + } + } else if (photometric == 34892 || photometric == 32892 /* Linear RAW (see DNG spec ; 32892 seem to be a flaw from Sony's ARQ files) */) { + if (sampleformat == SAMPLEFORMAT_IEEEFP) { + sampleFormat = IIOSF_FLOAT; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } else if (sampleformat == SAMPLEFORMAT_INT || sampleformat == SAMPLEFORMAT_UINT) { + if (bitspersample == 8) { // shouldn't occur... + sampleFormat = IIOSF_UNSIGNED_CHAR; + } else if (bitspersample <= 16) { + sampleFormat = IIOSF_UNSIGNED_SHORT; + if (mnote && (!make.compare (0, 4, "SONY")) && bitspersample >= 12 && samplesperpixel == 4) { + isPixelShift = true; +#if PRINT_HDR_PS_DETECTION + printf("PixelShift detected ! -> \"Make\" = SONY, bitsPerPixel > 8, samplesPerPixel == 4\n"); +#endif + } + } + } + } else if (photometric == PHOTOMETRIC_LOGLUV) { + if (compression == COMPRESSION_SGILOG24) { + sampleFormat = IIOSF_LOGLUV24; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } else if (compression == COMPRESSION_SGILOG) { + sampleFormat = IIOSF_LOGLUV32; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); +#endif + } + } } -ImageData::~ImageData () +FrameData::~FrameData () { - delete root; - if (iptc) { iptc_data_free (iptc); } } -const procparams::IPTCPairs ImageData::getIPTCData () const +procparams::IPTCPairs FrameData::getIPTCData () const +{ + return getIPTCData(iptc); +} + +procparams::IPTCPairs FrameData::getIPTCData (IptcData* iptc_) { procparams::IPTCPairs iptcc; - if (!iptc) { + if (!iptc_) { return iptcc; } unsigned char buffer[2100]; for (int i = 0; i < 16; i++) { - IptcDataSet* ds = iptc_data_get_next_dataset (iptc, nullptr, IPTC_RECORD_APP_2, strTags[i].tag); + IptcDataSet* ds = iptc_data_get_next_dataset (iptc_, nullptr, IPTC_RECORD_APP_2, strTags[i].tag); if (ds) { iptc_dataset_get_data (ds, buffer, 2100); @@ -543,7 +664,7 @@ IptcDataSet* ds = nullptr; std::vector keywords; - while ((ds = iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) { + while ((ds = iptc_data_get_next_dataset (iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS))) { iptc_dataset_get_data (ds, buffer, 2100); keywords.push_back (to_utf8((char*)buffer)); } @@ -552,7 +673,7 @@ ds = nullptr; std::vector suppCategories; - while ((ds = iptc_data_get_next_dataset (iptc, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) { + while ((ds = iptc_data_get_next_dataset (iptc_, ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY))) { iptc_dataset_get_data (ds, buffer, 2100); suppCategories.push_back (to_utf8((char*)buffer)); iptc_dataset_unref (ds); @@ -562,10 +683,266 @@ return iptcc; } + +bool FrameData::getPixelShift () const +{ + return isPixelShift; +} +bool FrameData::getHDR () const +{ + return isHDR; +} +IIOSampleFormat FrameData::getSampleFormat () const +{ + return sampleFormat; +} +rtexif::TagDirectory* FrameData::getExifData () const +{ + return frameRootDir; +} +bool FrameData::hasExif () const +{ + return frameRootDir && frameRootDir->getCount(); +} +bool FrameData::hasIPTC () const +{ + return iptc; +} +tm FrameData::getDateTime () const +{ + return time; +} +time_t FrameData::getDateTimeAsTS () const +{ + return timeStamp; +} +int FrameData::getISOSpeed () const +{ + return iso_speed; +} +double FrameData::getFNumber () const +{ + return aperture; +} +double FrameData::getFocalLen () const +{ + return focal_len; +} +double FrameData::getFocalLen35mm () const +{ + return focal_len35mm; +} +float FrameData::getFocusDist () const +{ + return focus_dist; +} +double FrameData::getShutterSpeed () const +{ + return shutter; +} +double FrameData::getExpComp () const +{ + return expcomp; +} +std::string FrameData::getMake () const +{ + return make; +} +std::string FrameData::getModel () const +{ + return model; +} +std::string FrameData::getLens () const +{ + return lens; +} +std::string FrameData::getSerialNumber () const +{ + return serial; +} +std::string FrameData::getOrientation () const +{ + return orientation; +} + + + +void FramesData::setDCRawFrameCount (unsigned int frameCount) +{ + dcrawFrameCount = frameCount; +} + +unsigned int FramesData::getRootCount () const +{ + return roots.size(); +} + +unsigned int FramesData::getFrameCount () const +{ + return dcrawFrameCount ? dcrawFrameCount : frames.size(); +} + +FrameData *FramesData::getFrameData (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame); +} + +bool FramesData::getPixelShift (unsigned int frame) const +{ + // So far only Pentax and Sony provide multi-frame HDR file. + // Only the first frame contains the HDR tag + // If more brand have to be supported, this rule may need + // to evolve + + //return frames.at(frame)->getPixelShift (); + return frames.empty() || frame >= frames.size() ? false : frames.at(0)->getPixelShift (); +} +bool FramesData::getHDR (unsigned int frame) const +{ + // So far only Pentax provide multi-frame HDR file. + // Only the first frame contains the HDR tag + // If more brand have to be supported, this rule may need + // to evolve + + //return frames.at(frame)->getHDR (); + return frames.empty() || frame >= frames.size() ? false : frames.at(0)->getHDR (); +} + +IIOSampleFormat FramesData::getSampleFormat (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? IIOSF_UNKNOWN : frames.at(frame)->getSampleFormat (); +} + +rtexif::TagDirectory* FramesData::getFrameExifData (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? nullptr : frames.at(frame)->getExifData (); +} + +rtexif::TagDirectory* FramesData::getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const +{ + rtexif::TagDirectory *td = nullptr; + if (frames.empty()) { + return nullptr; + } + if (imgSource && rawParams) { + eSensorType sensorType = imgSource->getSensorType(); + unsigned int imgNum = 0; + if (sensorType == ST_BAYER) { + imgNum = rtengine::LIM(rawParams->bayersensor.imageNum, 0, frames.size() - 1); + /* + // might exist someday ? + } else if (sensorType == ST_FUJI_XTRANS) { + imgNum = rtengine::LIM(rawParams->xtranssensor.imageNum, 0, frames.size() - 1); + } else if (sensorType == ST_NONE && !imgSource->isRAW()) { + // standard image multiframe support should come here (when implemented in GUI) + */ + } + + td = getFrameExifData (imgNum); + rtexif::Tag* makeTag; + if (td && (makeTag = td->findTag("Make", true))) { + td = makeTag->getParent(); + } else { + td = getRootExifData(0); + } + } + return td; +} + +rtexif::TagDirectory* FramesData::getRootExifData (unsigned int root) const +{ + return roots.empty() || root >= roots.size() ? nullptr : roots.at(root); +} + +procparams::IPTCPairs FramesData::getIPTCData (unsigned int frame) const +{ + if (frame < frames.size() && frames.at(frame)->hasIPTC()) { + return frames.at(frame)->getIPTCData(); + } else { + if (iptc) { + return FrameData::getIPTCData(iptc); + } else { + procparams::IPTCPairs emptyPairs; + return emptyPairs; + } + } +} + +bool FramesData::hasExif (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? false : frames.at(frame)->hasExif (); +} +bool FramesData::hasIPTC (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? false : frames.at(frame)->hasIPTC (); +} + +tm FramesData::getDateTime (unsigned int frame) const +{ + if (frames.empty() || frame >= frames.size() ) { + return {}; + } else { + return frames.at(frame)->getDateTime (); + } +} +time_t FramesData::getDateTimeAsTS(unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0 : frames.at(frame)->getDateTimeAsTS (); +} +int FramesData::getISOSpeed (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0 : frames.at(frame)->getISOSpeed (); +} +double FramesData::getFNumber (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFNumber (); +} +double FramesData::getFocalLen (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFocalLen (); +} +double FramesData::getFocalLen35mm (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFocalLen35mm (); +} +float FramesData::getFocusDist (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0.f : frames.at(frame)->getFocusDist (); +} +double FramesData::getShutterSpeed (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getShutterSpeed (); +} +double FramesData::getExpComp (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getExpComp (); +} +std::string FramesData::getMake (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getMake (); +} +std::string FramesData::getModel (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getModel (); +} +std::string FramesData::getLens (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getLens (); +} +std::string FramesData::getSerialNumber (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getSerialNumber (); +} +std::string FramesData::getOrientation (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getOrientation (); +} + + //------inherited functions--------------// -std::string ImageMetaData::apertureToString (double aperture) +std::string FramesMetaData::apertureToString (double aperture) { char buffer[256]; @@ -573,7 +950,7 @@ return buffer; } -std::string ImageMetaData::shutterToString (double shutter) +std::string FramesMetaData::shutterToString (double shutter) { char buffer[256]; @@ -587,7 +964,7 @@ return buffer; } -std::string ImageMetaData::expcompToString (double expcomp, bool maskZeroexpcomp) +std::string FramesMetaData::expcompToString (double expcomp, bool maskZeroexpcomp) { char buffer[256]; @@ -605,7 +982,7 @@ } } -double ImageMetaData::shutterFromString (std::string s) +double FramesMetaData::shutterFromString (std::string s) { size_t i = s.find_first_of ('/'); @@ -617,7 +994,7 @@ } } -double ImageMetaData::apertureFromString (std::string s) +double FramesMetaData::apertureFromString (std::string s) { return atof (s.c_str()); @@ -685,3 +1062,99 @@ } } + +FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) : + iptc(nullptr), dcrawFrameCount (0) +{ + if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) { + FILE* f = g_fopen (fname.c_str (), "rb"); + + if (f) { + const bool has_rml_exif_base = rml->exifBase >= 0; + rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); + + if (has_rml_exif_base) { + if (exifManager.f && exifManager.rml) { + if (exifManager.rml->exifBase >= 0) { + exifManager.parseRaw (); + + } else if (exifManager.rml->ciffBase >= 0) { + exifManager.parseCIFF (); + } + } + + // copying roots + roots = exifManager.roots; + + // creating FrameData + for (auto currFrame : exifManager.frames) { + FrameData* fd = new FrameData(currFrame, currFrame->getRoot(), roots.at(0)); + + frames.push_back(fd); + } + for (auto currRoot : roots) { + rtexif::Tag* t = currRoot->getTag(0x83BB); + + if (t && !iptc) { + iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); + break; + } + } + } + fclose (f); + } + } else if (hasJpegExtension(fname)) { + FILE* f = g_fopen (fname.c_str (), "rb"); + + if (f) { + rtexif::ExifManager exifManager (f, std::move(rml), true); + if (exifManager.f) { + exifManager.parseJPEG (); + roots = exifManager.roots; + for (auto currFrame : exifManager.frames) { + FrameData* fd = new FrameData(currFrame, currFrame->getRoot(), roots.at(0)); + frames.push_back(fd); + } + rewind (exifManager.f); // Not sure this is necessary + iptc = iptc_data_new_from_jpeg_file (exifManager.f); + } + fclose (f); + } + } else if (hasTiffExtension(fname)) { + FILE* f = g_fopen (fname.c_str (), "rb"); + + if (f) { + rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); + + exifManager.parseTIFF(); + roots = exifManager.roots; + + // creating FrameData + for (auto currFrame : exifManager.frames) { + FrameData* fd = new FrameData(currFrame, currFrame->getRoot(), roots.at(0)); + + frames.push_back(fd); + } + for (auto currRoot : roots) { + rtexif::Tag* t = currRoot->getTag(0x83BB); + + if (t && !iptc) { + iptc = iptc_data_new_from_data ((unsigned char*)t->getValue (), (unsigned)t->getValueSize ()); + break; + } + } + fclose (f); + } + } +} + +FramesData::~FramesData () +{ + for (auto currRoot : roots) { + delete currRoot; + } + + if (iptc) { + iptc_data_free (iptc); + } +} diff -Nru rawtherapee-5.3/rtengine/imagedata.h rawtherapee-5.4/rtengine/imagedata.h --- rawtherapee-5.3/rtengine/imagedata.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imagedata.h 2018-03-20 11:04:15.000000000 +0000 @@ -31,11 +31,11 @@ namespace rtengine { -class ImageData : public ImageMetaData +class FrameData { protected: - rtexif::TagDirectory* root; + rtexif::TagDirectory* frameRootDir; IptcData* iptc; struct tm time; @@ -49,84 +49,84 @@ std::string make, model, serial; std::string orientation; std::string lens; + IIOSampleFormat sampleFormat; - void extractInfo (); + // each frame has the knowledge of "being an" + // or "being part of an" HDR or PS image + bool isPixelShift; + bool isHDR; public: - ImageData (Glib::ustring fname, RawMetaDataLocation* rml = nullptr); - virtual ~ImageData (); + FrameData (rtexif::TagDirectory* frameRootDir, rtexif::TagDirectory* rootDir, rtexif::TagDirectory* firstRootDir); + virtual ~FrameData (); - const rtexif::TagDirectory* getExifData () const - { - return root; - } - const procparams::IPTCPairs getIPTCData () const; - - bool hasExif () const - { - return root && root->getCount(); - } - bool hasIPTC () const - { - return iptc; - } - - struct tm getDateTime () const { - return time; - } - time_t getDateTimeAsTS() const - { - return timeStamp; - } - int getISOSpeed () const - { - return iso_speed; - } - double getFNumber () const - { - return aperture; - } - double getFocalLen () const - { - return focal_len; - } - double getFocalLen35mm () const - { - return focal_len35mm; - } - float getFocusDist () const - { - return focus_dist; - } - double getShutterSpeed () const - { - return shutter; - } - double getExpComp () const - { - return expcomp; - } - std::string getMake () const - { - return make; - } - std::string getModel () const - { - return model; - } - std::string getLens () const - { - return lens; - } - std::string getSerialNumber () const - { - return serial; - } - std::string getOrientation () const - { - return orientation; - } + bool getPixelShift () const; + bool getHDR () const; + IIOSampleFormat getSampleFormat () const; + rtexif::TagDirectory* getExifData () const; + procparams::IPTCPairs getIPTCData () const; + static procparams::IPTCPairs getIPTCData (IptcData* iptc_); + bool hasExif () const; + bool hasIPTC () const; + tm getDateTime () const; + time_t getDateTimeAsTS () const; + int getISOSpeed () const; + double getFNumber () const; + double getFocalLen () const; + double getFocalLen35mm () const; + float getFocusDist () const; + double getShutterSpeed () const; + double getExpComp () const; + std::string getMake () const; + std::string getModel () const; + std::string getLens () const; + std::string getSerialNumber () const; + std::string getOrientation () const; }; + +class FramesData : public FramesMetaData { +private: + // frame's root IFD, can be a file root IFD or a SUB-IFD + std::vector frames; + // root IFD in the file + std::vector roots; + IptcData* iptc; + unsigned int dcrawFrameCount; + +public: + FramesData (const Glib::ustring& fname, std::unique_ptr rml = nullptr, bool firstFrameOnly = false); + ~FramesData (); + + void setDCRawFrameCount (unsigned int frameCount); + unsigned int getRootCount () const; + unsigned int getFrameCount () const; + FrameData *getFrameData (unsigned int frame) const; + bool getPixelShift (unsigned int frame = 0) const; + bool getHDR (unsigned int frame = 0) const; + IIOSampleFormat getSampleFormat (unsigned int frame = 0) const; + rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const; + rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const; + rtexif::TagDirectory* getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const; + procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const; + bool hasExif (unsigned int frame = 0) const; + bool hasIPTC (unsigned int frame = 0) const; + tm getDateTime (unsigned int frame = 0) const; + time_t getDateTimeAsTS (unsigned int frame = 0) const; + int getISOSpeed (unsigned int frame = 0) const; + double getFNumber (unsigned int frame = 0) const; + double getFocalLen (unsigned int frame = 0) const; + double getFocalLen35mm (unsigned int frame = 0) const; + float getFocusDist (unsigned int frame = 0) const; + double getShutterSpeed (unsigned int frame = 0) const; + double getExpComp (unsigned int frame = 0) const; + std::string getMake (unsigned int frame = 0) const; + std::string getModel (unsigned int frame = 0) const; + std::string getLens (unsigned int frame = 0) const; + std::string getSerialNumber (unsigned int frame = 0) const; + std::string getOrientation (unsigned int frame = 0) const; +}; + + } #endif diff -Nru rawtherapee-5.3/rtengine/imagefloat.cc rawtherapee-5.4/rtengine/imagefloat.cc --- rawtherapee-5.3/rtengine/imagefloat.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imagefloat.cc 2018-03-20 11:04:15.000000000 +0000 @@ -57,35 +57,38 @@ float* sbuffer = (float*) buffer; for (int i = 0; i < width; i++) { - r(row, i) = sbuffer[ix]; + r(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[0]) { minValue[0] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[0]) { maxValue[0] = sbuffer[ix]; - } ++ix; + } } + ++ix; - g(row, i) = sbuffer[ix]; + g(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[1]) { minValue[1] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[1]) { maxValue[1] = sbuffer[ix]; - } ++ix; + } } + ++ix; - b(row, i) = sbuffer[ix]; + b(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[2]) { minValue[2] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[2]) { maxValue[2] = sbuffer[ix]; - } ++ix; + } } + ++ix; } break; @@ -154,10 +157,24 @@ int ix = 0; float* sbuffer = (float*) buffer; + // agriggio -- assume the image is normalized to [0, 65535] for (int i = 0; i < width; i++) { - sbuffer[ix++] = r(row, i); - sbuffer[ix++] = g(row, i); - sbuffer[ix++] = b(row, i); + sbuffer[ix++] = r(row, i) / 65535.f; + sbuffer[ix++] = g(row, i) / 65535.f; + sbuffer[ix++] = b(row, i) / 65535.f; + } + } else if (bps == 16) { + unsigned short *sbuffer = (unsigned short *)buffer; + for (int i = 0, ix = 0; i < width; i++) { + sbuffer[ix++] = CLIP(r(row, i)); + sbuffer[ix++] = CLIP(g(row, i)); + sbuffer[ix++] = CLIP(b(row, i)); + } + } else if (bps == 8) { + for (int i = 0, ix = 0; i < width; i++) { + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(r(row, i))); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(g(row, i))); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(b(row, i))); } } } @@ -175,17 +192,22 @@ { // compute channel multipliers - double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); - float rm = drm, gm = dgm, bm = dbm; - - rm = 1.0 / rm; - gm = 1.0 / gm; - bm = 1.0 / bm; - float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; - rm /= mul_lum; - gm /= mul_lum; - bm /= mul_lum; + float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { + double drm, dgm, dbm; + ctemp.getMultipliers (drm, dgm, dbm); + rm = drm; + gm = dgm; + bm = dbm; + + rm = 1.0 / rm; + gm = 1.0 / gm; + bm = 1.0 / bm; + float mul_lum = 0.299 * rm + 0.587 * gm + 0.114 * bm; + rm /= mul_lum; + gm /= mul_lum; + bm /= mul_lum; + } int sx1, sy1, sx2, sy2; @@ -510,4 +532,52 @@ } } // End of parallelization } +} + +// Parallelized transformation; create transform with cmsFLAGS_NOCACHE! +void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy) +{ + // LittleCMS cannot parallelize planar Lab float images + // so build temporary buffers to allow multi processor execution +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer bufferLab(width * 3); + AlignedBuffer bufferRGB(width * 3); + +#ifdef _OPENMP + #pragma omp for schedule(static) +#endif + + for (int y = cy; y < cy + height; y++) + { + float *pRGB, *pR, *pG, *pB; + float *pLab, *pL, *pa, *pb; + + pLab= bufferLab.data; + pL = labImage.L[y] + cx; + pa = labImage.a[y] + cx; + pb = labImage.b[y] + cx; + + for (int x = 0; x < width; x++) { + *(pLab++) = *(pL++) / 327.68f; + *(pLab++) = *(pa++) / 327.68f; + *(pLab++) = *(pb++) / 327.68f; + } + + cmsDoTransform (hTransform, bufferLab.data, bufferRGB.data, width); + + pRGB = bufferRGB.data; + pR = r(y - cy); + pG = g(y - cy); + pB = b(y - cy); + + for (int x = 0; x < width; x++) { + *(pR++) = *(pRGB++); + *(pG++) = *(pRGB++); + *(pB++) = *(pRGB++); + } + } // End of parallelization + } } diff -Nru rawtherapee-5.3/rtengine/imagefloat.h rawtherapee-5.4/rtengine/imagefloat.h --- rawtherapee-5.3/rtengine/imagefloat.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imagefloat.h 2018-03-20 11:04:15.000000000 +0000 @@ -79,9 +79,9 @@ { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int compression = -1, int bps = -1) + virtual int saveAsPNG (Glib::ustring fname, int bps = -1) { - return savePNG (fname, compression, bps); + return savePNG (fname, bps); } virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) { @@ -106,6 +106,7 @@ void calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist); void ExecCMSTransform(cmsHTRANSFORM hTransform); + void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); }; } diff -Nru rawtherapee-5.3/rtengine/imageformat.h rawtherapee-5.4/rtengine/imageformat.h --- rawtherapee-5.3/rtengine/imageformat.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/imageformat.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,54 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Jean-Christophe Frisch + * + * 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 . + */ +#ifndef _IMAGEFORMAT_ +#define _IMAGEFORMAT_ + +namespace rtengine +{ + +//NB: Update the associated strings in languages files when updating the following enum +// Look for "SAMPLEFORMAT_" +typedef enum IIO_Sample_Format { + IIOSF_UNKNOWN = 0, // Unknown or Unsupported file type; Has to remain 0 + //IIOSF_SIGNED_INT , // Not yet supported + IIOSF_UNSIGNED_CHAR = 1 << 0, + IIOSF_UNSIGNED_SHORT = 1 << 1, + //IIOSF_HALF , // OpenEXR & NVidia's Half Float, not yet supported + IIOSF_LOGLUV24 = 1 << 2, + IIOSF_LOGLUV32 = 1 << 3, + IIOSF_FLOAT = 1 << 4 +} IIOSampleFormat; + +typedef enum IIO_Sample_Arrangement { + IIOSA_UNKNOWN, // Unknown or Unsupported file type + IIOSA_CHUNKY, + IIOSA_PLANAR +} IIOSampleArrangement; + +typedef enum SensorType { + ST_NONE, // use this value if the image is already demosaiced (i.e. not a raw file) + ST_BAYER, + ST_FUJI_XTRANS, + ST_FOVEON, + //ST_FUJI_EXR +} eSensorType; + +} + +#endif diff -Nru rawtherapee-5.3/rtengine/imageio.cc rawtherapee-5.4/rtengine/imageio.cc --- rawtherapee-5.3/rtengine/imageio.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imageio.cc 2018-03-20 11:04:15.000000000 +0000 @@ -75,15 +75,6 @@ return f; } -Glib::ustring to_utf8 (const std::string& str) -{ - try { - return Glib::locale_to_utf8 (str); - } catch (Glib::Error&) { - return Glib::convert_with_fallback (str, "UTF-8", "ISO-8859-1", "?"); - } -} - } Glib::ustring ImageIO::errorMsg[6] = {"Success", "Cannot read file.", "Invalid header.", "Error while reading header.", "File reading error", "Image format not supported."}; @@ -136,13 +127,19 @@ iptc = iptc_data_new (); + const unsigned char utf8Esc[] = {0x1B, '%', 'G'}; + IptcDataSet * ds = iptc_dataset_new (); + iptc_dataset_set_tag (ds, IPTC_RECORD_OBJECT_ENV, IPTC_TAG_CHARACTER_SET); + iptc_dataset_set_data (ds, utf8Esc, 3, IPTC_DONT_VALIDATE); + iptc_data_add_dataset (iptc, ds); + iptc_dataset_unref (ds); + for (rtengine::procparams::IPTCPairs::const_iterator i = iptcc.begin(); i != iptcc.end(); ++i) { if (i->first == "Keywords" && !(i->second.empty())) { for (unsigned int j = 0; j < i->second.size(); j++) { IptcDataSet * ds = iptc_dataset_new (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_KEYWORDS); - std::string loc = to_utf8(i->second.at(j)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(static_cast(64), loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(j).c_str(), min(static_cast(64), i->second.at(j).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -152,8 +149,7 @@ for (unsigned int j = 0; j < i->second.size(); j++) { IptcDataSet * ds = iptc_dataset_new (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, IPTC_TAG_SUPPL_CATEGORY); - std::string loc = to_utf8(i->second.at(j)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(static_cast(32), loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(j).c_str(), min(static_cast(32), i->second.at(j).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -165,8 +161,7 @@ if (i->first == strTags[j].field && !(i->second.empty())) { IptcDataSet * ds = iptc_dataset_new (); iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2, strTags[j].tag); - std::string loc = to_utf8(i->second.at(0)); - iptc_dataset_set_data (ds, (unsigned char*)loc.c_str(), min(strTags[j].size, loc.size()), IPTC_DONT_VALIDATE); + iptc_dataset_set_data (ds, (unsigned char*)i->second.at(0).c_str(), min(strTags[j].size, i->second.at(0).bytes()), IPTC_DONT_VALIDATE); iptc_data_add_dataset (iptc, ds); iptc_dataset_unref (ds); } @@ -308,6 +303,11 @@ return IMIO_HEADERERROR; } + // silence the warning about "invalid" sRGB profiles -- see #4260 +#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) + png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); +#endif + png_infop info = png_create_info_struct (png); png_infop end_info = png_create_info_struct (png); @@ -356,6 +356,22 @@ png_set_strip_alpha(png); } + // reading the embedded ICC profile if any + if (png_get_valid(png, info, PNG_INFO_iCCP)) { + png_charp name; + int compression_type; +#if PNG_LIBPNG_VER < 10500 + png_charp profdata; +#else + png_bytep profdata; +#endif + png_uint_32 proflen; + png_get_iCCP(png, info, &name, &compression_type, &profdata, &proflen); + embProfile = cmsOpenProfileFromMem(profdata, proflen); + loadedProfileData = new char[proflen]; + memcpy(loadedProfileData, profdata, proflen); + } + //setting gamma double gamma; @@ -773,7 +789,7 @@ * effective minimum and maximum values */ if (options.rtSettings.verbose) { - printf("Informations of \"%s\":\n", fname.c_str()); + printf("Information of \"%s\":\n", fname.c_str()); uint16 tiffDefaultScale, tiffBaselineExposure, tiffLinearResponseLimit; if (TIFFGetField(in, TIFFTAG_DEFAULTSCALE, &tiffDefaultScale)) { printf(" DefaultScale: %d\n", tiffDefaultScale); @@ -819,7 +835,6 @@ allocate (width, height); - float minValue[3] = {0.f, 0.f, 0.f}, maxValue[3] = {0.f, 0.f, 0.f}; unsigned char* linebuffer = new unsigned char[TIFFScanlineSize(in) * (samplesperpixel == 1 ? 3 : 1)]; for (int row = 0; row < height; row++) { @@ -845,33 +860,13 @@ } } - if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT)) { - setScanline (row, linebuffer, bitspersample, minValue, maxValue); - } else { - setScanline (row, linebuffer, bitspersample, nullptr, nullptr); - } + setScanline (row, linebuffer, bitspersample, nullptr, nullptr); if (pl && !(row % 100)) { pl->setProgress ((double)(row + 1) / height); } } - if (sampleFormat & (IIOSF_FLOAT | IIOSF_LOGLUV24 | IIOSF_LOGLUV32)) { -#ifdef _DEBUG - - if (options.rtSettings.verbose) - printf("Normalizing \"%s\" image \"%s\" whose mini/maxi values are:\n Red: minimum value=%0.5f / maximum value=%0.5f\n Green: minimum value=%0.5f / maximum value=%0.5f\n Blue: minimum value=%0.5f / maximum value=%0.5f\n", - getType(), fname.c_str(), - minValue[0], maxValue[0], minValue[1], - maxValue[1], minValue[2], maxValue[2] - ); - -#endif - float minVal = rtengine::min(minValue[0], minValue[1], minValue[2]); - float maxVal = rtengine::max(maxValue[0], maxValue[1], maxValue[2]); - normalizeFloat(minVal, maxVal); - } - TIFFClose(in); delete [] linebuffer; @@ -905,7 +900,78 @@ return IMIO_SUCCESS; } -int ImageIO::savePNG (Glib::ustring fname, int compression, volatile int bps) + +namespace { + +// Taken from Darktable -- src/imageio/format/png.c +// +/* Write EXIF data to PNG file. + * Code copied from DigiKam's libs/dimg/loaders/pngloader.cpp. + * The EXIF embedding is defined by ImageMagicK. + * It is documented in the ExifTool page: + * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PNG.html + * + * ..and in turn copied from ufraw. thanks to udi and colleagues + * for making useful code much more readable and discoverable ;) + */ + +void PNGwriteRawProfile(png_struct *ping, png_info *ping_info, const char *profile_type, guint8 *profile_data, png_uint_32 length) +{ + png_textp text; + long i; + guint8 *sp; + png_charp dp; + png_uint_32 allocated_length, description_length; + + const guint8 hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + text = static_cast(png_malloc(ping, sizeof(png_text))); + description_length = strlen(profile_type); + allocated_length = length * 2 + (length >> 5) + 20 + description_length; + + text[0].text = static_cast(png_malloc(ping, allocated_length)); + text[0].key = static_cast(png_malloc(ping, 80)); + text[0].key[0] = '\0'; + + g_strlcat(text[0].key, "Raw profile type ", 80); + g_strlcat(text[0].key, profile_type, 80); + + sp = profile_data; + dp = text[0].text; + *dp++ = '\n'; + + g_strlcpy(dp, profile_type, allocated_length); + + dp += description_length; + *dp++ = '\n'; + *dp = '\0'; + + g_snprintf(dp, allocated_length - strlen(text[0].text), "%8lu ", static_cast(length)); + + dp += 8; + + for(i = 0; i < long(length); i++) + { + if(i % 36 == 0) *dp++ = '\n'; + + *(dp++) = hex[((*sp >> 4) & 0x0f)]; + *(dp++) = hex[((*sp++) & 0x0f)]; + } + + *dp++ = '\n'; + *dp = '\0'; + text[0].text_length = (dp - text[0].text); + text[0].compression = -1; + + if(text[0].text_length <= allocated_length) png_set_text(ping, ping_info, text, 1); + + png_free(ping, text[0].text); + png_free(ping, text[0].key); + png_free(ping, text); +} + +} // namespace + +int ImageIO::savePNG (Glib::ustring fname, volatile int bps) { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -929,6 +995,11 @@ return IMIO_HEADERERROR; } + // silence the warning about "invalid" sRGB profiles -- see #4260 +#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) + png_set_option(png, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); +#endif + png_infop info = png_create_info_struct(png); if (!info) { @@ -945,7 +1016,9 @@ png_set_write_fn (png, file, png_write_data, png_flush); - png_set_compression_level(png, compression); + png_set_filter(png, 0, PNG_FILTER_PAETH); + png_set_compression_level(png, 6); + png_set_compression_strategy(png, 3); int width = getWidth (); int height = getHeight (); @@ -957,6 +1030,38 @@ png_set_IHDR(png, info, width, height, bps, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); + if (profileData) { +#if PNG_LIBPNG_VER < 10500 + png_charp profdata = reinterpret_cast(profileData); +#else + png_bytep profdata = reinterpret_cast(profileData); +#endif + png_set_iCCP(png, info, const_cast("icc"), 0, profdata, profileLength); + } + + { + // buffer for the exif and iptc + unsigned int bufferSize; + unsigned char* buffer = nullptr; // buffer will be allocated in createTIFFHeader + unsigned char* iptcdata = nullptr; + unsigned int iptclen = 0; + + if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + iptcdata = nullptr; + } + + int size = rtexif::ExifManager::createPNGMarker(exifRoot, exifChange, width, height, bps, (char*)iptcdata, iptclen, buffer, bufferSize); + + if (iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + } + if (buffer && size) { + PNGwriteRawProfile(png, info, "exif", buffer, size); + delete[] buffer; + } + } + int rowlen = width * 3 * bps / 8; unsigned char *row = new unsigned char [rowlen]; @@ -1119,13 +1224,13 @@ int bytes = 0; if (!error && (bytes = iptc_jpeg_ps3_save_iptc (nullptr, 0, iptcdata, size, buffer, 65532)) < 0) { - if (iptcdata) { - iptc_data_free_buf (iptc, iptcdata); - } - error = true; } + if (iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + } + if (!error) { jpeg_write_marker(&cinfo, JPEG_APP0 + 13, buffer, bytes); } @@ -1210,188 +1315,220 @@ int lineWidth = width * 3 * bps / 8; unsigned char* linebuffer = new unsigned char[lineWidth]; -// TODO the following needs to be looked into - do we really need two ways to write a Tiff file ? - if (exifRoot && uncompressed) { - FILE *file = g_fopen_withBinaryAndLock (fname); + // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): + const char *mode = !exifRoot ? "w" : (exifRoot->getOrder() == rtexif::INTEL ? "wl" : "wb"); +#ifdef WIN32 + FILE *file = g_fopen_withBinaryAndLock (fname); + int fileno = _fileno(file); + int osfileno = _get_osfhandle(fileno); + TIFF* out = TIFFFdOpen (osfileno, fname.c_str(), mode); +#else + TIFF* out = TIFFOpen(fname.c_str(), mode); + int fileno = TIFFFileno (out); +#endif - if (!file) { - delete [] linebuffer; - return IMIO_CANNOTWRITEFILE; - } + if (!out) { + delete [] linebuffer; + return IMIO_CANNOTWRITEFILE; + } - if (pl) { - pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); - pl->setProgress (0.0); - } + if (pl) { + pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); + pl->setProgress (0.0); + } - // buffer for the exif and iptc - unsigned int bufferSize; - unsigned char* buffer = nullptr; // buffer will be allocated in createTIFFHeader - unsigned char* iptcdata = nullptr; - unsigned int iptclen = 0; + bool applyExifPatch = false; - if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen) && iptcdata) { - iptc_data_free_buf (iptc, iptcdata); - iptcdata = nullptr; + if (exifRoot) { + rtexif::TagDirectory* cl = (const_cast (exifRoot))->clone (nullptr); + + // ------------------ remove some unknown top level tags which produce warnings when opening a tiff (might be useless) ----------------- + + rtexif::Tag *removeTag = cl->getTag (0x9003); + + if (removeTag) { + removeTag->setKeep (false); } - int size = rtexif::ExifManager::createTIFFHeader (exifRoot, exifChange, width, height, bps, profileData, profileLength, (char*)iptcdata, iptclen, buffer, bufferSize); + removeTag = cl->getTag (0x9211); - if (iptcdata) { - iptc_data_free_buf (iptc, iptcdata); + if (removeTag) { + removeTag->setKeep (false); } - // The maximum lenght is strangely not the same than for the JPEG file... - // Which maximum length is the good one ? - if (size > 0 && size <= static_cast(bufferSize)) { - fwrite (buffer, size, 1, file); + // ------------------ Apply list of change ----------------- + + for (auto currExifChange : exifChange) { + cl->applyChange (currExifChange.first, currExifChange.second); } -#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ - bool needsReverse = bps == 16 && exifRoot->getOrder() == rtexif::MOTOROLA; -#else - bool needsReverse = bps == 16 && exifRoot->getOrder() == rtexif::INTEL; -#endif + rtexif::Tag *tag = cl->getTag (TIFFTAG_EXIFIFD); - for (int i = 0; i < height; i++) { - getScanline (i, linebuffer, bps); + if (tag && tag->isDirectory()) { + rtexif::TagDirectory *exif = tag->getDirectory(); - if (needsReverse) - for (int i = 0; i < lineWidth; i += 2) { - char c = linebuffer[i]; - linebuffer[i] = linebuffer[i + 1]; - linebuffer[i + 1] = c; - } + if (exif) { + int exif_size = exif->calculateSize(); + unsigned char *buffer = new unsigned char[exif_size + 8]; + // TIFFOpen writes out the header and sets file pointer at position 8 - fwrite (linebuffer, lineWidth, 1, file); + exif->write (8, buffer); - if (pl && !(i % 100)) { - pl->setProgress ((double)(i + 1) / height); + write (fileno, buffer + 8, exif_size); + + delete [] buffer; + // let libtiff know that scanlines or any other following stuff should go + // at a different offset: + TIFFSetWriteOffset (out, exif_size + 8); + TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + applyExifPatch = true; } } - if(buffer) { - delete [] buffer; - } + //TODO Even though we are saving EXIF IFD - MakerNote still comes out screwed. - if (ferror(file)) { - writeOk = false; + if ((tag = cl->getTag (TIFFTAG_MODEL)) != nullptr) { + TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); } - fclose (file); - } else { - // little hack to get libTiff to use proper byte order (see TIFFClienOpen()): - const char *mode = !exifRoot ? "w" : (exifRoot->getOrder() == rtexif::INTEL ? "wl" : "wb"); -#ifdef WIN32 - FILE *file = g_fopen_withBinaryAndLock (fname); - int fileno = _fileno(file); - int osfileno = _get_osfhandle(fileno); - TIFF* out = TIFFFdOpen (osfileno, fname.c_str(), mode); -#else - TIFF* out = TIFFOpen(fname.c_str(), mode); - int fileno = TIFFFileno (out); -#endif + if ((tag = cl->getTag (TIFFTAG_MAKE)) != nullptr) { + TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); + } - if (!out) { - delete [] linebuffer; - return IMIO_CANNOTWRITEFILE; + if ((tag = cl->getTag (TIFFTAG_DATETIME)) != nullptr) { + TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); } - if (pl) { - pl->setProgressStr ("PROGRESSBAR_SAVETIFF"); - pl->setProgress (0.0); + if ((tag = cl->getTag (TIFFTAG_ARTIST)) != nullptr) { + TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); } - if (exifRoot) { - rtexif::Tag *tag = exifRoot->getTag (TIFFTAG_EXIFIFD); + if ((tag = cl->getTag (TIFFTAG_COPYRIGHT)) != nullptr) { + TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); + } - if (tag && tag->isDirectory()) { - rtexif::TagDirectory *exif = tag->getDirectory(); + delete cl; + } - if (exif) { - int exif_size = exif->calculateSize(); - unsigned char *buffer = new unsigned char[exif_size + 8]; - // TIFFOpen writes out the header and sets file pointer at position 8 - - exif->write (8, buffer); - - write (fileno, buffer + 8, exif_size); - - delete [] buffer; - // let libtiff know that scanlines or any other following stuff should go - // at a different offset: - TIFFSetWriteOffset (out, exif_size + 8); - TIFFSetField (out, TIFFTAG_EXIFIFD, 8); - } - } + unsigned char* iptcdata = nullptr; + unsigned int iptclen = 0; -//TODO Even though we are saving EXIF IFD - MakerNote still comes out screwed. + if (iptc && iptc_data_save (iptc, &iptcdata, &iptclen)) { + if (iptcdata) { + iptc_data_free_buf (iptc, iptcdata); + iptcdata = nullptr; + } + } - if ((tag = exifRoot->getTag (TIFFTAG_MODEL)) != nullptr) { - TIFFSetField (out, TIFFTAG_MODEL, tag->getValue()); - } +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::MOTOROLA; +#else + bool needsReverse = exifRoot && exifRoot->getOrder() == rtexif::INTEL; +#endif + if (iptcdata) { + rtexif::Tag iptcTag(nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); + iptcTag.initLongArray((char*)iptcdata, iptclen); + if (needsReverse) { + unsigned char *ptr = iptcTag.getValue(); + for (int a = 0; a < iptcTag.getCount(); ++a) { + unsigned char cc; + cc = ptr[3]; + ptr[3] = ptr[0]; + ptr[0] = cc; + cc = ptr[2]; + ptr[2] = ptr[1]; + ptr[1] = cc; + ptr += 4; + } + } + TIFFSetField (out, TIFFTAG_RICHTIFFIPTC, iptcTag.getCount(), (long*)iptcTag.getValue()); + iptc_data_free_buf (iptc, iptcdata); + } + + TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " RTVERSION); + TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); + TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); + TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, height); + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_ADOBE_DEFLATE); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); - if ((tag = exifRoot->getTag (TIFFTAG_MAKE)) != nullptr) { - TIFFSetField (out, TIFFTAG_MAKE, tag->getValue()); - } + if (!uncompressed) { + TIFFSetField (out, TIFFTAG_PREDICTOR, bps == 32 ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); + } + if (profileData) { + TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); + } - if ((tag = exifRoot->getTag (TIFFTAG_DATETIME)) != nullptr) { - TIFFSetField (out, TIFFTAG_DATETIME, tag->getValue()); - } + for (int row = 0; row < height; row++) { + getScanline (row, linebuffer, bps); - if ((tag = exifRoot->getTag (TIFFTAG_ARTIST)) != nullptr) { - TIFFSetField (out, TIFFTAG_ARTIST, tag->getValue()); + if(needsReverse && !uncompressed && bps == 32) { + for(int i = 0; i < lineWidth; i += 4) { + char temp = linebuffer[i]; + linebuffer[i] = linebuffer[i + 3]; + linebuffer[i + 3] = temp; + temp = linebuffer[i + 1]; + linebuffer[i + 1] = linebuffer[i + 2]; + linebuffer[i + 2] = temp; } + } - if ((tag = exifRoot->getTag (TIFFTAG_COPYRIGHT)) != nullptr) { - TIFFSetField (out, TIFFTAG_COPYRIGHT, tag->getValue()); - } + if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { + TIFFClose (out); + delete [] linebuffer; + return IMIO_CANNOTWRITEFILE; + } + if (pl && !(row % 100)) { + pl->setProgress ((double)(row + 1) / height); } + } - TIFFSetField (out, TIFFTAG_SOFTWARE, "RawTherapee " RTVERSION); - TIFFSetField (out, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField (out, TIFFTAG_IMAGELENGTH, height); - TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); - TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, height); - TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); - TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_DEFLATE); - - if (!uncompressed) { - TIFFSetField (out, TIFFTAG_PREDICTOR, PREDICTOR_NONE); - } - - if (profileData) { - TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); - } - - for (int row = 0; row < height; row++) { - getScanline (row, linebuffer, bps); - - if (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { - TIFFClose (out); - delete [] linebuffer; - return IMIO_CANNOTWRITEFILE; - } + if (TIFFFlush(out) != 1) { + writeOk = false; + } - if (pl && !(row % 100)) { - pl->setProgress ((double)(row + 1) / height); + /************************************************************************************************************ + * + * Hombre: This is a dirty hack to update the Exif tag data type to 0x0004 so that Windows can understand it. + * libtiff will set this data type to 0x000d and doesn't provide any mechanism to update it before + * dumping to the file. + * + */ + if (applyExifPatch) { + unsigned char b[10]; + uint16 tagCount = 0; + lseek(fileno, 4, SEEK_SET); + read(fileno, b, 4); + uint32 ifd0Offset = rtexif::sget4(b, exifRoot->getOrder()); + lseek(fileno, ifd0Offset, SEEK_SET); + read(fileno, b, 2); + tagCount = rtexif::sget2(b, exifRoot->getOrder()); + for (size_t i = 0; i < tagCount ; ++i) { + uint16 tagID = 0; + read(fileno, b, 2); + tagID = rtexif::sget2(b, exifRoot->getOrder()); + if (tagID == 0x8769) { + rtexif::sset2(4, b, exifRoot->getOrder()); + write(fileno, b, 2); + break; + } else { + read(fileno, b, 10); } } + } + /************************************************************************************************************/ - if (TIFFFlush(out) != 1) { - writeOk = false; - } - TIFFClose (out); + TIFFClose (out); #ifdef WIN32 - fclose (file); + fclose (file); #endif - } delete [] linebuffer; diff -Nru rawtherapee-5.3/rtengine/imageio.h rawtherapee-5.4/rtengine/imageio.h --- rawtherapee-5.3/rtengine/imageio.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imageio.h 2018-03-20 11:04:15.000000000 +0000 @@ -29,6 +29,7 @@ #define IMIO_CANNOTWRITEFILE 7 #include "rtengine.h" +#include "imageformat.h" #include #include "procparams.h" #include @@ -43,31 +44,6 @@ class ProgressListener; class Imagefloat; -typedef enum IIO_Sample_Format { - IIOSF_UNKNOWN = 0, // Unknown or Unsupported file type; Has to remain 0 - //IIOSF_SIGNED_INT , // Not yet supported - IIOSF_UNSIGNED_CHAR = 1 << 0, - IIOSF_UNSIGNED_SHORT = 1 << 1, - //IIOSF_HALF , // OpenEXR & NVidia's Half Float, not yet supported - IIOSF_LOGLUV24 = 1 << 2, - IIOSF_LOGLUV32 = 1 << 3, - IIOSF_FLOAT = 1 << 4 -} IIOSampleFormat; - -typedef enum IIO_Sample_Arrangement { - IIOSA_UNKNOWN, // Unknown or Unsupported file type - IIOSA_CHUNKY, - IIOSA_PLANAR -} IIOSampleArrangement; - -typedef enum SensorType { - ST_NONE, // use this value if the image is already demosaiced (i.e. not a raw file) - ST_BAYER, - ST_FUJI_XTRANS, - ST_FOVEON, - //ST_FUJI_EXR -} eSensorType; - class ImageIO : virtual public ImageDatas { @@ -160,7 +136,7 @@ int loadJPEGFromMemory (const char* buffer, int bufsize); int loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps); - int savePNG (Glib::ustring fname, int compression = -1, volatile int bps = -1); + int savePNG (Glib::ustring fname, volatile int bps = -1); int saveJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3); int saveTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false); diff -Nru rawtherapee-5.3/rtengine/imagesource.h rawtherapee-5.4/rtengine/imagesource.h --- rawtherapee-5.3/rtengine/imagesource.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/imagesource.h 2018-03-20 11:04:15.000000000 +0000 @@ -57,7 +57,7 @@ double redAWBMul, greenAWBMul, blueAWBMul; // local copy of the multipliers, to avoid recomputing the values cmsHPROFILE embProfile; Glib::ustring fileName; - ImageData* idata; + FramesData* idata; ImageMatrices imatrices; double dirpyrdenoiseExpComp; @@ -66,26 +66,26 @@ embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {} virtual ~ImageSource () {} - virtual int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false) = 0; + virtual int load (const Glib::ustring &fname) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {}; virtual void demosaic (const RAWParams &raw) {}; - virtual void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; + virtual void retinex (const ColorManagementParams& cmp, const RetinexParams &deh, const ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; virtual void retinexPrepareCurves (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; - virtual void retinexPrepareBuffers (ColorManagementParams cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; + virtual void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; virtual void HLRecovery_Global (ToneCurveParams hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; - virtual void MSR(LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; + virtual void MSR (LabImage* lab, LUTf & mapcurve, bool &mapcontlutili, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {}; - virtual bool IsrgbSourceModified() const = 0; // tracks whether cached rgb output of demosaic has been modified + virtual bool isRGBSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified - virtual void setCurrentFrame(unsigned int frameNum) = 0; - virtual int getFrameCount() = 0; + virtual void setCurrentFrame (unsigned int frameNum) = 0; + virtual int getFrameCount () = 0; // use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat* - virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hlp, const ColorManagementParams &cmp, const RAWParams &raw) = 0; + virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hlp, const RAWParams &raw) = 0; virtual eSensorType getSensorType () const = 0; // true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource virtual bool isWBProviderReady () = 0; @@ -107,10 +107,10 @@ return 0; } - virtual ImageData* getImageData () = 0; + virtual FrameData* getImageData (unsigned int frameNum) = 0; virtual ImageMatrices* getImageMatrices () = 0; - virtual bool isRAW() const = 0; - virtual DCPProfile* getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as) + virtual bool isRAW () const = 0; + virtual DCPProfile* getDCP (const ColorManagementParams &cmp, DCPProfile::ApplyState &as) { return nullptr; }; @@ -137,6 +137,13 @@ histGreenRaw.clear(); histBlueRaw.clear(); // only some sources will supply this } + + // for RAW files, compute a tone curve using histogram matching on the embedded thumbnail + virtual void getAutoMatchedToneCurve(const ColorManagementParams &cp, std::vector &outCurve) + { + outCurve = { 0.0 }; + } + double getDirPyrDenoiseExpComp ( ) { return dirpyrdenoiseExpComp; @@ -150,7 +157,7 @@ { return embProfile; } - virtual const ImageMetaData* getMetaData () + virtual const FramesMetaData* getMetaData () { return idata; } diff -Nru rawtherapee-5.3/rtengine/improccoordinator.cc rawtherapee-5.4/rtengine/improccoordinator.cc --- rawtherapee-5.3/rtengine/improccoordinator.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/improccoordinator.cc 2018-03-20 11:04:15.000000000 +0000 @@ -33,7 +33,7 @@ extern const Settings* settings; ImProcCoordinator::ImProcCoordinator () - : orig_prev (nullptr), oprevi (nullptr), oprevl (nullptr), nprevl (nullptr), previmg (nullptr), workimg (nullptr), + : orig_prev (nullptr), oprevi (nullptr), oprevl (nullptr), nprevl (nullptr), fattal_11_dcrop_cache(nullptr), previmg (nullptr), workimg (nullptr), ncie (nullptr), imgsrc (nullptr), shmap (nullptr), lastAwbEqual (0.), lastAwbTempBias (0.0), ipf (¶ms, true), monitorIntent (RI_RELATIVE), softProof (false), gamutCheck (false), scale (10), highDetailPreprocessComputed (false), highDetailRawComputed (false), allocated (false), bwAutoR (-9000.f), bwAutoG (-9000.f), bwAutoB (-9000.f), CAMMean (NAN), @@ -90,7 +90,7 @@ pW (-1), pH (-1), plistener (nullptr), imageListener (nullptr), aeListener (nullptr), acListener (nullptr), abwListener (nullptr), awbListener (nullptr), frameCountListener (nullptr), imageTypeListener (nullptr), actListener (nullptr), adnListener (nullptr), awavListener (nullptr), dehaListener (nullptr), hListener (nullptr), resultValid (false), lastOutputProfile ("BADFOOD"), lastOutputIntent (RI__COUNT), lastOutputBPC (false), thread (nullptr), changeSinceLast (0), updaterRunning (false), destroying (false), utili (false), autili (false), - butili (false), ccutili (false), cclutili (false), clcutili (false), opautili (false), wavcontlutili (false), colourToningSatLimit (0.f), colourToningSatLimitOpacity (0.f) + butili (false), ccutili (false), cclutili (false), clcutili (false), opautili (false), wavcontlutili (false), colourToningSatLimit (0.f), colourToningSatLimitOpacity (0.f), highQualityComputed (false) {} void ImProcCoordinator::assign (ImageSource* imgsrc) @@ -111,6 +111,10 @@ mProcessing.lock(); mProcessing.unlock(); freeAll (); + if (fattal_11_dcrop_cache) { + delete fattal_11_dcrop_cache; + fattal_11_dcrop_cache = nullptr; + } std::vector toDel = crops; @@ -167,14 +171,14 @@ if ( !highDetailNeeded ) { // if below 100% magnification, take a fast path - if (rp.bayersensor.method != RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::none] && rp.bayersensor.method != RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono]) { - rp.bayersensor.method = RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast]; + if (rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) && rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE)) { + rp.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); } //bayerrp.all_enhance = false; - if (rp.xtranssensor.method != RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::none] && rp.xtranssensor.method != RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::mono]) { - rp.xtranssensor.method = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::fast]; + if (rp.xtranssensor.method != RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE) && rp.xtranssensor.method != RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE)) { + rp.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); } rp.bayersensor.ccSteps = 0; @@ -195,11 +199,7 @@ imgsrc->preprocess ( rp, params.lensProf, params.coarse ); imgsrc->getRAWHistogram ( histRedRaw, histGreenRaw, histBlueRaw ); - if (highDetailNeeded) { - highDetailPreprocessComputed = true; - } else { - highDetailPreprocessComputed = false; - } + highDetailPreprocessComputed = highDetailNeeded; } /* @@ -220,8 +220,8 @@ if ( (todo & M_RAW) || (!highDetailRawComputed && highDetailNeeded) - || ( params.toneCurve.hrenabled && params.toneCurve.method != "Color" && imgsrc->IsrgbSourceModified()) - || (!params.toneCurve.hrenabled && params.toneCurve.method == "Color" && imgsrc->IsrgbSourceModified())) { + || ( params.toneCurve.hrenabled && params.toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) + || (!params.toneCurve.hrenabled && params.toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { if (settings->verbose) { if (imgsrc->getSensorType() == ST_BAYER) { @@ -265,22 +265,7 @@ } } - - // Updating toneCurve.hrenabled if necessary - // It has to be done there, because the next 'if' statement will use the value computed here - if (todo & M_AUTOEXP) { - if (params.toneCurve.autoexp) {// this enabled HLRecovery - if (ToneCurveParams::HLReconstructionNecessary (histRedRaw, histGreenRaw, histBlueRaw) && !params.toneCurve.hrenabled) { - // switching params.toneCurve.hrenabled to true -> shouting in listener's ears! - params.toneCurve.hrenabled = true; - - // forcing INIT to be done, to reconstruct HL again - todo |= M_INIT; - } - } - } - - if (todo & (M_INIT | M_LINDENOISE)) { + if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { MyMutex::MyLock initLock (minit); // Also used in crop window imgsrc->HLRecovery_Global ( params.toneCurve); // this handles Color HLRecovery @@ -292,7 +277,9 @@ currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { currWB = imgsrc->getWB (); } else if (params.wb.method == "Auto") { if (lastAwbEqual != params.wb.equal || lastAwbTempBias != params.wb.tempBias) { @@ -316,10 +303,12 @@ currWB = autoWB; } - params.wb.temperature = currWB.getTemp (); - params.wb.green = currWB.getGreen (); + if (params.wb.enabled) { + params.wb.temperature = currWB.getTemp (); + params.wb.green = currWB.getGreen (); + } - if (params.wb.method == "Auto" && awbListener) { + if (params.wb.method == "Auto" && awbListener && params.wb.enabled) { awbListener->WBChanged (params.wb.temperature, params.wb.green); } @@ -333,7 +322,7 @@ // Tells to the ImProcFunctions' tools what is the preview scale, which may lead to some simplifications ipf.setScale (scale); - imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw); + imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.raw); denoiseInfoStore.valid = false; //ColorTemp::CAT02 (orig_prev, ¶ms) ; // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); @@ -370,7 +359,7 @@ calclum->b(ii>>1,jj>>1) = orig_prev->b(ii,jj); } } - imgsrc->convertColorSpace(calclum, params.icm, currWB);//claculate values after colorspace conversion + imgsrc->convertColorSpace(calclum, params.icm, currWB);//calculate values after colorspace conversion } int kall=1; @@ -385,25 +374,32 @@ readyphase++; + if ((todo & M_HDR) && params.fattal.enabled) { + if (fattal_11_dcrop_cache) { + delete fattal_11_dcrop_cache; + fattal_11_dcrop_cache = nullptr; + } + ipf.ToneMapFattal02(orig_prev); + if (oprevi != orig_prev) { + delete oprevi; + } + } + oprevi = orig_prev; + progress ("Rotate / Distortion...", 100 * readyphase / numofphases); // Remove transformation if unneeded bool needstransform = ipf.needsTransform(); - - if (!needstransform && ! ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) && orig_prev != oprevi) { - delete oprevi; - oprevi = orig_prev; - } - + if ((needstransform || ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled)) ) { - if (!oprevi || oprevi == orig_prev) { - oprevi = new Imagefloat (pW, pH); - } + assert(oprevi); + Imagefloat *op = oprevi; + oprevi = new Imagefloat (pW, pH); if (needstransform) - ipf.transform (orig_prev, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, + ipf.transform (op, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, imgsrc->getMetaData(), imgsrc->getRotateDegree(), false); else { - orig_prev->copyData (oprevi); + op->copyData (oprevi); } } @@ -443,13 +439,31 @@ LUTu aehist; int aehistcompr; imgsrc->getAutoExpHistogram (aehist, aehistcompr); - ipf.getAutoExp (aehist, aehistcompr, imgsrc->getDefGain(), params.toneCurve.clip, params.toneCurve.expcomp, + ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh); if (aeListener) aeListener->autoExpChanged (params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.hrenabled); } + if (params.toneCurve.histmatching) { + imgsrc->getAutoMatchedToneCurve(params.icm, params.toneCurve.curve); + + if (params.toneCurve.autoexp) { + params.toneCurve.expcomp = 0.0; + } + + params.toneCurve.autoexp = false; + params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; + params.toneCurve.curve2 = { 0 }; + params.toneCurve.brightness = 0; + params.toneCurve.contrast = 0; + params.toneCurve.black = 0; + + if (aeListener) { + aeListener->autoMatchedToneCurveChanged(params.toneCurve.curveMode, params.toneCurve.curve); + } + } } progress ("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); @@ -461,7 +475,7 @@ CurveFactory::complexCurve (params.toneCurve.expcomp, params.toneCurve.black / 65535.0, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, params.toneCurve.shcompr, params.toneCurve.brightness, params.toneCurve.contrast, - params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2, + params.toneCurve.curve, params.toneCurve.curve2, vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, 1); CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); @@ -478,13 +492,7 @@ {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; - params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili); + params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); CurveFactory::curveToning (params.colorToning.cl2curve, cl2Toningcurve, scale == 1 ? 1 : 16); } @@ -500,7 +508,7 @@ int satPR = 30; int indi = 0; - if (params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (oprevi, moyS, eqty);//return image : mean saturation and standard dev of saturation @@ -556,7 +564,7 @@ double bbm = 33.; DCPProfile::ApplyState as; - DCPProfile *dcpProf = imgsrc->getDCP (params.icm, currWB, as); + DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, shmap, params.toneCurve.saturation, rCurve, gCurve, bCurve, colourToningSatLimit, colourToningSatLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, beforeToneCurveBW, afterToneCurveBW, rrm, ggm, bbm, bwAutoR, bwAutoG, bwAutoB, params.toneCurve.expcomp, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh, dcpProf, as, histToneCurve); @@ -706,7 +714,7 @@ int kall = 0; progress ("Wavelet...", 100 * readyphase / numofphases); // ipf.ip_wavelet(nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, scale); - ipf.ip_wavelet (nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, wavcontlutili, scale); + ipf.ip_wavelet (nprevl, nprevl, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, scale); } @@ -732,10 +740,21 @@ CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, lhist16CAM, histLCAM, lhist16CCAM, histCCAM, customColCurve1, customColCurve2, customColCurve3, 1); - float fnum = imgsrc->getMetaData()->getFNumber (); // F number - float fiso = imgsrc->getMetaData()->getISOSpeed () ; // ISO - float fspeed = imgsrc->getMetaData()->getShutterSpeed () ; // Speed - double fcomp = imgsrc->getMetaData()->getExpComp (); // Compensation +/- + + const FramesMetaData* metaData = imgsrc->getMetaData(); + int imgNum = 0; + if (imgsrc->isRAW()) { + if (imgsrc->getSensorType() == ST_BAYER) { + imgNum = rtengine::LIM(params.raw.bayersensor.imageNum, 0, metaData->getFrameCount() - 1); + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + //imgNum = rtengine::LIM(params.raw.xtranssensor.imageNum, 0, metaData->getFrameCount() - 1); + } + } + + float fnum = metaData->getFNumber (imgNum); // F number + float fiso = metaData->getISOSpeed (imgNum) ; // ISO + float fspeed = metaData->getShutterSpeed (imgNum) ; // Speed + double fcomp = metaData->getExpComp (imgNum); // Compensation +/- double adap; if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong @@ -748,8 +767,6 @@ // end calculation adaptation scene luminosity } - int begh = 0; - int endh = pH; float d, dj, yb; bool execsharp = false; @@ -770,7 +787,7 @@ CAMBrightCurveJ.dirty = true; CAMBrightCurveQ.dirty = true; - ipf.ciecam_02float (ncie, float (adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, dj, yb, 1); + ipf.ciecam_02float (ncie, float (adap), pW, 2, nprevl, ¶ms, customColCurve1, customColCurve2, customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, scale, execsharp, d, dj, yb, 1); if ((params.colorappearance.autodegree || params.colorappearance.autodegreeout) && acListener && params.colorappearance.enabled) { acListener->autoCamChanged (100.* (double)d, 100.* (double)dj); @@ -1214,7 +1231,7 @@ currWB = ColorTemp(); // = no white balance } - imgsrc->getImage (currWB, tr, im, pp, ppar.toneCurve, ppar.icm, ppar.raw); + imgsrc->getImage (currWB, tr, im, pp, ppar.toneCurve, ppar.raw); ImProcFunctions ipf (&ppar, true); if (ipf.needsTransform()) { @@ -1256,21 +1273,20 @@ } } - Image16* im16 = im->to16(); - delete im; - int imw, imh; double tmpScale = ipf.resizeScale (¶ms, fW, fH, imw, imh); if (tmpScale != 1.0) { - Image16* tempImage = new Image16 (imw, imh); - ipf.resize (im16, tempImage, tmpScale); - delete im16; - im16 = tempImage; + Imagefloat* tempImage = new Imagefloat (imw, imh); + ipf.resize (im, tempImage, tmpScale); + delete im; + im = tempImage; } - im16->saveTIFF (fname, 16, true); - delete im16; + im->setMetadata (imgsrc->getMetaData()->getRootExifData ()); + + im->saveTIFF (fname, 16, true); + delete im; if (plistener) { plistener->setProgressState (false); @@ -1360,7 +1376,8 @@ void ImProcCoordinator::endUpdateParams (ProcEvent change) { - endUpdateParams ( refreshmap[ (int)change] ); + int action = RefreshMapper::getInstance()->getAction(change); + endUpdateParams(action); } void ImProcCoordinator::endUpdateParams (int changeFlags) @@ -1371,5 +1388,26 @@ startProcessing (); } +bool ImProcCoordinator::getHighQualComputed() { + // this function may only be called from detail windows + if(!highQualityComputed) { + if(options.prevdemo == PD_Sidecar) { + // we already have high quality preview + setHighQualComputed(); + } else { + for (size_t i = 0; i < crops.size() - 1; ++i) { // -1, because last entry is the freshly created detail window + if (crops[i]->get_skip() == 1 ) { // there is at least one crop with skip == 1 => we already have high quality preview + setHighQualComputed(); + break; + } + } + } + } + return highQualityComputed; +} + +void ImProcCoordinator::setHighQualComputed() { + highQualityComputed = true; +} } diff -Nru rawtherapee-5.3/rtengine/improccoordinator.h rawtherapee-5.4/rtengine/improccoordinator.h --- rawtherapee-5.3/rtengine/improccoordinator.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/improccoordinator.h 2018-03-20 11:04:15.000000000 +0000 @@ -57,6 +57,7 @@ Imagefloat *oprevi; LabImage *oprevl; LabImage *nprevl; + Imagefloat *fattal_11_dcrop_cache; // global cache for ToneMapFattal02 used in 1:1 detail windows (except when denoise is active) Image8 *previmg; // displayed image in monitor color space, showing the output profile as well (soft-proofing enabled, which then correspond to workimg) or not Image8 *workimg; // internal image in output color space for analysis CieImage *ncie; @@ -211,6 +212,7 @@ void process (); float colourToningSatLimit; float colourToningSatLimitOpacity; + bool highQualityComputed; public: @@ -265,7 +267,8 @@ void getCamWB (double& temp, double& green); void getSpotWB (int x, int y, int rectSize, double& temp, double& green); void getAutoCrop (double ratio, int &x, int &y, int &w, int &h); - + bool getHighQualComputed(); + void setHighQualComputed(); void setMonitorProfile (const Glib::ustring& profile, RenderingIntent intent); void getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const; void setSoftProofing (bool softProof, bool gamutCheck); diff -Nru rawtherapee-5.3/rtengine/improcfun.cc rawtherapee-5.4/rtengine/improcfun.cc --- rawtherapee-5.3/rtengine/improcfun.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/improcfun.cc 2018-03-20 11:04:15.000000000 +0000 @@ -23,12 +23,12 @@ #include #endif +#include "alignedbuffer.h" #include "rtengine.h" #include "improcfun.h" #include "curves.h" #include "mytime.h" #include "iccstore.h" -#include "impulse_denoise.h" #include "imagesource.h" #include "rtthumbnail.h" #include "utils.h" @@ -40,7 +40,6 @@ #include "improccoordinator.h" #include "clutstore.h" #include "ciecam02.h" -//#define BENCHMARK #include "StopWatch.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -48,6 +47,210 @@ #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) +namespace { + +using namespace rtengine; +// begin of helper function for rgbProc() +void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + +#ifdef __SSE2__ + vfloat cr = F2V(0.299f); + vfloat cg = F2V(0.587f); + vfloat cb = F2V(0.114f); +#endif + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vfloat bv = LVF(btemp[ti * tileSize + tj]); + + //shadow tone curve + vfloat Yv = cr * rv + cg * gv + cb * bv; + vfloat tonefactorv = shtonecurve(Yv); + STVF(rtemp[ti * tileSize + tj], rv * tonefactorv); + STVF(gtemp[ti * tileSize + tj], gv * tonefactorv); + STVF(btemp[ti * tileSize + tj], bv * tonefactorv); + } +#endif + for (; j < tW; j++, tj++) { + + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; + + //shadow tone curve + float Y = (0.299f * r + 0.587f * g + 0.114f * b); + float tonefactor = shtonecurve[Y]; + rtemp[ti * tileSize + tj] = rtemp[ti * tileSize + tj] * tonefactor; + gtemp[ti * tileSize + tj] = gtemp[ti * tileSize + tj] * tonefactor; + btemp[ti * tileSize + tj] = btemp[ti * tileSize + tj] * tonefactor; + } + } +} + +void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, float exp_scale, float comp, float hlrange) { + +#ifdef __SSE2__ + vfloat threev = F2V(3.f); + vfloat maxvalfv = F2V(MAXVALF); +#endif + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vfloat bv = LVF(btemp[ti * tileSize + tj]); + + //TODO: proper treatment of out-of-gamut colors + //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; + vmask maxMask = vmaskf_ge(vmaxf(rv, vmaxf(gv, bv)), maxvalfv); + if(_mm_movemask_ps((vfloat)maxMask)) { + for (int k = 0; k < 4; ++k) { + float r = rtemp[ti * tileSize + tj + k]; + float g = gtemp[ti * tileSize + tj + k]; + float b = btemp[ti * tileSize + tj + k]; + float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + + (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; + + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + rtemp[ti * tileSize + tj + k] = r * tonefactor; + gtemp[ti * tileSize + tj + k] = g * tonefactor; + btemp[ti * tileSize + tj + k] = b * tonefactor; + } + } else { + vfloat tonefactorv = (hltonecurve.cb(rv) + hltonecurve.cb(gv) + hltonecurve.cb(bv)) / threev; + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + STVF(rtemp[ti * tileSize + tj], rv * tonefactorv); + STVF(gtemp[ti * tileSize + tj], gv * tonefactorv); + STVF(btemp[ti * tileSize + tj], bv * tonefactorv); + } + } +#endif + for (; j < tW; j++, tj++) { + + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; + + //TODO: proper treatment of out-of-gamut colors + //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; + float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + + (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + + (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; + + // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place + rtemp[ti * tileSize + tj] = r * tonefactor; + gtemp[ti * tileSize + tj] = g * tonefactor; + btemp[ti * tileSize + tj] = b * tonefactor; + } + } +} + +void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + // this is a hack to avoid the blue=>black bug (Issue 2141) + for (int i = istart, ti = 0; i < tH; i++, ti++) { + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + vfloat rv = LVF(rtemp[ti * tileSize + tj]); + vfloat gv = LVF(gtemp[ti * tileSize + tj]); + vmask zeromask = vorm(vmaskf_eq(rv, ZEROV), vmaskf_eq(gv, ZEROV)); + if(_mm_movemask_ps((vfloat)zeromask)) { + for (int k = 0; k < 4; ++k) { + float r = rtemp[ti * tileSize + tj + k]; + float g = gtemp[ti * tileSize + tj + k]; + if (r == 0.0f || g == 0.0f) { + float b = btemp[ti * tileSize + tj + k]; + float h, s, v; + Color::rgb2hsv (r, g, b, h, s, v); + s *= 0.99f; + Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj + k], gtemp[ti * tileSize + tj + k], btemp[ti * tileSize + tj + k]); + } + } + } + } +#endif + for (; j < tW; j++, tj++) { + float r = rtemp[ti * tileSize + tj]; + float g = gtemp[ti * tileSize + tj]; + + if (r == 0.0f || g == 0.0f) { + float b = btemp[ti * tileSize + tj]; + float h, s, v; + Color::rgb2hsv (r, g, b, h, s, v); + s *= 0.99f; + Color::hsv2rgb (h, s, v, rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } +} + +void customToneCurve(const ToneCurve &customToneCurve, ToneCurveParams::TcMode curveMode, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, PerceptualToneCurveState ptcApplyState) { + + if (curveMode == ToneCurveParams::TcMode::STD) { // Standard + const StandardToneCurve& userToneCurve = static_cast (customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); + } + } else if (curveMode == ToneCurveParams::TcMode::FILMLIKE) { // Adobe like + const AdobeToneCurve& userToneCurve = static_cast (customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels + const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted + const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); + } + } else if (curveMode == ToneCurveParams::TcMode::LUMINANCE) { // apply the curve to the luminance channel + const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve); + + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + rtemp[ti * tileSize + tj] = CLIP (rtemp[ti * tileSize + tj]); + gtemp[ti * tileSize + tj] = CLIP (gtemp[ti * tileSize + tj]); + btemp[ti * tileSize + tj] = CLIP (btemp[ti * tileSize + tj]); + userToneCurve.Apply(rtemp[ti * tileSize + tj], gtemp[ti * tileSize + tj], btemp[ti * tileSize + tj]); + } + } + } else if (curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { // apply curve while keeping color appearance constant + const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve); + for (int i = istart, ti = 0; i < tH; i++, ti++) { + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize], ptcApplyState); + } + } +} + +void fillEditFloat(float *editIFloatTmpR, float *editIFloatTmpG, float *editIFloatTmpB, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + editIFloatTmpR[ti * tileSize + tj] = Color::gamma2curve[rtemp[ti * tileSize + tj]] / 65535.f; + editIFloatTmpG[ti * tileSize + tj] = Color::gamma2curve[gtemp[ti * tileSize + tj]] / 65535.f; + editIFloatTmpB[ti * tileSize + tj] = Color::gamma2curve[btemp[ti * tileSize + tj]] / 65535.f; + } + } +} +// end of helper function for rgbProc() + +} + namespace rtengine { @@ -97,18 +300,26 @@ if (softProof) { cmsHPROFILE oprof = nullptr; + RenderingIntent outIntent; + + flags = cmsFLAGS_SOFTPROOFING | cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; if (!settings->printerProfile.empty()) { oprof = ICCStore::getInstance()->getProfile (settings->printerProfile); + if (settings->printerBPC) { + flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + outIntent = settings->printerIntent; + } else { + oprof = ICCStore::getInstance()->getProfile(params->icm.output); + if (params->icm.outputBPC) { + flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + outIntent = params->icm.outputIntent; } if (oprof) { // NOCACHE is for thread safety, NOOPTIMIZE for precision - flags = cmsFLAGS_SOFTPROOFING | cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; - - if (settings->printerBPC) { - flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; - } if (gamutCheck) { flags |= cmsFLAGS_GAMUTCHECK; @@ -118,7 +329,7 @@ iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_8, oprof, - monitorIntent, settings->printerIntent, + monitorIntent, outIntent, flags ); @@ -126,6 +337,17 @@ softProofCreated = true; } } + } else if (gamutCheck) { + flags = cmsFLAGS_GAMUTCHECK | cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + if (settings->monitorBPC) { + flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + + monitorTransform = cmsCreateProofingTransform(iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_8, monitor, monitorIntent, monitorIntent, flags); + + if (monitorTransform) { + softProofCreated = true; + } } if (!softProofCreated) { @@ -208,9 +430,9 @@ } // Copyright (c) 2012 Jacques Desmis -void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, +void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3, - LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, double &yb, int rtt) + LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, int rtt) { if (params->colorappearance.enabled) { //int lastskip; @@ -256,7 +478,6 @@ int width = lab->W, height = lab->H; float minQ = 10000.f; float maxQ = -1000.f; - float w_h; float a_w; float c_; float f_l; @@ -276,9 +497,9 @@ bool ciedata = params->colorappearance.datacie; - ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB - ColorTemp::temp2mulxyz (params->colorappearance.tempout, params->colorappearance.greenout, "Custom", Xwout, Zwout); - ColorTemp::temp2mulxyz (params->colorappearance.tempsc, params->colorappearance.greensc, "Custom", Xwsc, Zwsc); + ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB + ColorTemp::temp2mulxyz (params->colorappearance.tempout, "Custom", Xwout, Zwout); + ColorTemp::temp2mulxyz (params->colorappearance.tempsc, "Custom", Xwsc, Zwsc); //viewing condition for surrsrc if (params->colorappearance.surrsrc == "Average") { @@ -440,11 +661,11 @@ } // extracting datas from 'params' to avoid cache flush (to be confirmed) - ColorAppearanceParams::eTCModeId curveMode = params->colorappearance.curveMode; - ColorAppearanceParams::eTCModeId curveMode2 = params->colorappearance.curveMode2; + ColorAppearanceParams::TcMode curveMode = params->colorappearance.curveMode; + ColorAppearanceParams::TcMode curveMode2 = params->colorappearance.curveMode2; bool hasColCurve1 = bool (customColCurve1); bool hasColCurve2 = bool (customColCurve2); - ColorAppearanceParams::eCTCModeId curveMode3 = params->colorappearance.curveMode3; + ColorAppearanceParams::CtcMode curveMode3 = params->colorappearance.curveMode3; bool hasColCurve3 = bool (customColCurve3); @@ -502,7 +723,7 @@ hist16Q[CLIP ((int) (32768.f * sqrt ((koef * (lab->L[i][j])) / 32768.f)))]++; //for brightness Q : approximation for Q=wh*sqrt(J/100) J not equal L } - sum += koef * lab->L[i][j]; //evaluate mean J to calcualte Yb + sum += koef * lab->L[i][j]; //evaluate mean J to calculate Yb } //mean=(sum/((endh-begh)*width))/327.68f;//for Yb for all image...if one day "pipette" we can adapt Yb for each zone @@ -607,7 +828,7 @@ #ifndef _DEBUG - #pragma omp parallel default(shared) firstprivate(lab,xw1,xw2,yw1,yw2,zw1,zw2,pilot,jli,chr,yb,la,yb2,la2,fl,nc,f,c, height,width,begh, endh,nc2,f2,c2, alg,algepd, gamu, highlight, rstprotection, pW, scale) + #pragma omp parallel default(shared) firstprivate(lab,xw1,xw2,yw1,yw2,zw1,zw2,pilot,jli,chr,yb,la,yb2,la2,fl,nc,f,c, height,width,nc2,f2,c2, alg,algepd, gamu, highlight, rstprotection, pW, scale) #endif { //matrix for current working space @@ -653,20 +874,18 @@ Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - yb, la, - f, c, nc, pilot, gamu, n, nbb, ncb, pfl, cz, d ); + c, nc, gamu, n, nbb, ncb, pfl, cz, d ); Jpro = J; Cpro = C; hpro = h; Qpro = Q; Mpro = M; spro = s; - w_h = wh + epsil; a_w = aw; c_ = c; f_l = fl; - // we cannot have all algoritms with all chroma curves + // we cannot have all algorithms with all chroma curves if (alg == 1) { // Lightness saturation if (Jpro > 99.9f) { @@ -805,7 +1024,7 @@ } if (hasColCurve1) {//curve 1 with Lightness and Brightness - if (curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { /* float Jj=(float) Jpro*327.68; float Jold=Jj; const Lightcurve& userColCurve = static_cast(customColCurve1); @@ -843,8 +1062,8 @@ } t1L = true; - } else if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms will be different + } else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { + //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algorithms will be different float coef = ((aw + 4.f) * (4.f / c)) / 100.f; float Qanc = Qpro; float Qq = (float) Qpro * 327.68f * (1.f / coef); @@ -891,7 +1110,7 @@ } if (hasColCurve2) {//curve 2 with Lightness and Brightness - if (curveMode2 == ColorAppearanceParams::TC_MODE_LIGHT) { + if (curveMode2 == ColorAppearanceParams::TcMode::LIGHT) { float Jj = (float) Jpro * 327.68; float Jold = Jj; /* @@ -934,7 +1153,7 @@ Jpro = 1.; } - } else if (curveMode2 == ColorAppearanceParams::TC_MODE_BRIGHT) { // + } else if (curveMode2 == ColorAppearanceParams::TcMode::BRIGHT) { // float Qanc = Qpro; float coef = ((aw + 4.f) * (4.f / c)) / 100.f; float Qq = (float) Qpro * 327.68f * (1.f / coef); @@ -992,7 +1211,7 @@ } if (hasColCurve3) {//curve 3 with chroma saturation colorfullness - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { double parsat = 0.8; //0.68; double coef = 327.68 / parsat; float Cc = (float) Cpro * coef; @@ -1016,7 +1235,7 @@ } // Cpro=Cc/coef; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { // + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { // double parsat = 0.8; //0.6 double coef = 327.68 / parsat; float Ss = (float) spro * coef; @@ -1036,7 +1255,7 @@ Cpro = (spro * spro * Qpro) / (10000.0); c1s = 1; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { // + } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { // double parsat = 0.8; //0.68; double coef = 327.68 / parsat; float Mm = (float) Mpro * coef; @@ -1121,21 +1340,21 @@ int libr = 0; int colch = 0; - if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { brli = 70.0; libr = 1; - } else if (curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + } else if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { brli = 327.; libr = 0; } - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { chsacol = 400.;//327.; colch = 0; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { chsacol = 450.0; colch = 1; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { chsacol = 400.;//327.0; colch = 2; } @@ -1180,8 +1399,7 @@ Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz, J, C, h, xw2, yw2, zw2, - yb2, la2, - f2, c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj); x = (float)xx * 655.35; y = (float)yy * 655.35; z = (float)zz * 655.35; @@ -1268,11 +1486,6 @@ //if(params->dirpyrequalizer.enabled) if(execsharp) { if (params->dirpyrequalizer.enabled) { if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { - float b_l = static_cast (params->dirpyrequalizer.hueskin.value[0]) / 100.0f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.value[1]) / 100.0f; - float b_r = static_cast (params->dirpyrequalizer.hueskin.value[2]) / 100.0f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.value[3]) / 100.0f; - float artifact = (float) settings->artifact_cbdl; if (artifact > 6.f) { @@ -1286,14 +1499,14 @@ float chrom = 50.f; { int hotbad = 0; - ImProcFunctions::badpixcam (ncie, artifact, 5, 2, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL + ImProcFunctions::badpixcam (ncie, artifact, 5, 2, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL } } } if (params->colorappearance.badpixsl > 0) if (execsharp) { int mode = params->colorappearance.badpixsl; - ImProcFunctions::badpixcam (ncie, 3.4, 5, mode, 0, 0, 0, 0, 0, 0, 1);//for bad pixels CIECAM + ImProcFunctions::badpixcam (ncie, 3.4, 5, mode, 0, 0, 1);//for bad pixels CIECAM } if (params->sharpenMicro.enabled)if (execsharp) { @@ -1312,12 +1525,10 @@ // if (params->dirpyrequalizer.algo=="FI") choice=0; // else if(params->dirpyrequalizer.algo=="LA") choice=1; if (rtt == 1) { - float b_l = static_cast (params->dirpyrequalizer.hueskin.value[0]) / 100.0f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.value[1]) / 100.0f; - float b_r = static_cast (params->dirpyrequalizer.hueskin.value[2]) / 100.0f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.value[3]) / 100.0f; - int choice = 0; //not disabled in case of ! always 0 - dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale); //contrast by detail adapted to CIECAM + float b_l = static_cast (params->dirpyrequalizer.hueskin.getBottomLeft()) / 100.0f; + float t_l = static_cast (params->dirpyrequalizer.hueskin.getTopLeft()) / 100.0f; + float t_r = static_cast (params->dirpyrequalizer.hueskin.getTopRight()) / 100.0f; + dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM } } @@ -1347,14 +1558,14 @@ || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { if (params->epd.enabled && params->colorappearance.tonecie && algepd) { - ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); + ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale ); } //EPDToneMapCIE adapted to CIECAM #ifndef _DEBUG - #pragma omp parallel default(shared) firstprivate(lab,xw2,yw2,zw2,chr,yb,la2,yb2, height,width,begh, endh, nc2,f2,c2, gamu, highlight,pW) + #pragma omp parallel default(shared) firstprivate(lab,xw2,yw2,zw2,chr,yb,la2,yb2, height,width, nc2,f2,c2, gamu, highlight,pW) #endif { TMatrix wiprofa = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); @@ -1390,21 +1601,21 @@ int libr = 0; int colch = 0; - if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { brli = 70.0; libr = 1; - } else if (curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + } else if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { brli = 327.; libr = 0; } - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { chsacol = 400.;//327.; colch = 0; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { chsacol = 450.0; colch = 1; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { chsacol = 400.;//327.0; colch = 2; } @@ -1449,8 +1660,7 @@ Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz, ncie->J_p[i][j], ncie->C_p[i][j], ncie->h_p[i][j], xw2, yw2, zw2, - yb2, la2, - f2, c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, nj, nbbj, ncbj, flj, czj, dj, awj); x = (float)xx * 655.35; y = (float)yy * 655.35; z = (float)zz * 655.35; @@ -1521,7 +1731,7 @@ // Copyright (c) 2012 Jacques Desmis -void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, +void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve2, const ColorAppearance & customColCurve3, LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt) { @@ -1563,9 +1773,9 @@ || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)); - ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB - ColorTemp::temp2mulxyz (params->colorappearance.tempout, params->colorappearance.greenout, "Custom", Xwout, Zwout); - ColorTemp::temp2mulxyz (params->colorappearance.tempsc, params->colorappearance.greensc, "Custom", Xwsc, Zwsc); + ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB + ColorTemp::temp2mulxyz (params->colorappearance.tempout, "Custom", Xwout, Zwout); + ColorTemp::temp2mulxyz (params->colorappearance.tempsc, "Custom", Xwsc, Zwsc); //viewing condition for surrsrc if (params->colorappearance.surrsrc == "Average") { @@ -1765,14 +1975,14 @@ const float rstprotection = 100. - params->colorappearance.rstprotection; // extracting datas from 'params' to avoid cache flush (to be confirmed) - const ColorAppearanceParams::eTCModeId curveMode = params->colorappearance.curveMode; + const ColorAppearanceParams::TcMode curveMode = params->colorappearance.curveMode; const bool hasColCurve1 = bool (customColCurve1); - const bool t1L = hasColCurve1 && curveMode == ColorAppearanceParams::TC_MODE_LIGHT; + const bool t1L = hasColCurve1 && curveMode == ColorAppearanceParams::TcMode::LIGHT; - const ColorAppearanceParams::eTCModeId curveMode2 = params->colorappearance.curveMode2; + const ColorAppearanceParams::TcMode curveMode2 = params->colorappearance.curveMode2; const bool hasColCurve2 = bool (customColCurve2); - const ColorAppearanceParams::eCTCModeId curveMode3 = params->colorappearance.curveMode3; + const ColorAppearanceParams::CtcMode curveMode3 = params->colorappearance.curveMode3; const bool hasColCurve3 = bool (customColCurve3); bool needJ = (alg == 0 || alg == 1 || alg == 3); @@ -1792,8 +2002,7 @@ hist16Q.clear(); } - float sum = 0.f; -// float sumQ = 0.f; + double sum = 0.0; // use double precision for large summations #ifdef _OPENMP const int numThreads = min (max (width * height / 65536, 1), omp_get_max_threads()); @@ -1813,7 +2022,6 @@ hist16Qthr.clear(); } - // #pragma omp for reduction(+:sum,sumQ) #pragma omp for reduction(+:sum) @@ -1978,11 +2186,12 @@ const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f ); float nj, nbbj, ncbj, czj, awj, flj; Ciecam02::initcam2float (gamu, yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); +#ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); +#endif const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f ); const float epsil = 0.0001f; - const float w_h = wh + epsil; const float coefQ = 32767.f / wh; const float a_w = aw; const float c_ = c; @@ -2226,7 +2435,7 @@ } if (hasColCurve1) {//curve 1 with Lightness and Brightness - if (curveMode == ColorAppearanceParams::TC_MODE_LIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { float Jj = (float) Jpro * 327.68f; float Jold = Jj; float Jold100 = (float) Jpro; @@ -2255,8 +2464,8 @@ if (Jpro < 1.f) { Jpro = 1.f; } - } else if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms will be different + } else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { + //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algorithms will be different float coef = ((aw + 4.f) * (4.f / c)) / 100.f; float Qanc = Qpro; float Qq = (float) Qpro * 327.68f * (1.f / coef); @@ -2299,7 +2508,7 @@ } if (hasColCurve2) {//curve 2 with Lightness and Brightness - if (curveMode2 == ColorAppearanceParams::TC_MODE_LIGHT) { + if (curveMode2 == ColorAppearanceParams::TcMode::LIGHT) { float Jj = (float) Jpro * 327.68f; float Jold = Jj; float Jold100 = (float) Jpro; @@ -2337,7 +2546,7 @@ Jpro = 1.f; } - } else if (curveMode2 == ColorAppearanceParams::TC_MODE_BRIGHT) { // + } else if (curveMode2 == ColorAppearanceParams::TcMode::BRIGHT) { // float Qanc = Qpro; float coef = ((aw + 4.f) * (4.f / c)) / 100.f; @@ -2394,7 +2603,7 @@ } if (hasColCurve3) {//curve 3 with chroma saturation colorfullness - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; float Cc = (float) Cpro * coef; @@ -2417,7 +2626,7 @@ Cpro = 50.f; } */ - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { // + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { // float parsat = 0.8f; //0.6 float coef = 327.68f / parsat; float Ss = (float) spro * coef; @@ -2434,7 +2643,7 @@ Color::skinredfloat (Jpro, hpro, Ss, Sold, dred, protect_red, sk, rstprotection, ko, spro); Qpro = ( 4.0f / c ) * sqrtf ( Jpro / 100.0f ) * ( aw + 4.0f ) ; Cpro = (spro * spro * Qpro) / (10000.0f); - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_COLORF) { // + } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { // float parsat = 0.8f; //0.68; float coef = 327.68f / parsat; float Mm = (float) Mpro * coef; @@ -2504,10 +2713,10 @@ float colch; //update histogram - if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { brli = 70.0f; libr = Q; //40.0 to 100.0 approximative factor for Q - 327 for J - } else { /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ + } else { /*if(curveMode == ColorAppearanceParams::TCMode::LIGHT)*/ brli = 327.f; libr = J; //327 for J } @@ -2515,13 +2724,13 @@ posl = (int) (libr * brli); hist16JCAM[posl]++; - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { chsacol = 400.f;//327 colch = C; //450.0 approximative factor for s 320 for M - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { chsacol = 450.0f; colch = s; - } else { /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ + } else { /*if(curveMode3 == ColorAppearanceParams::CTCMode::COLORF)*/ chsacol = 400.0f;//327 colch = M; } @@ -2544,7 +2753,7 @@ Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, J, C, h, xw2, yw2, zw2, - f2, c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x, y, z; x = xx * 655.35f; y = yy * 655.35f; @@ -2555,10 +2764,9 @@ // gamut control in Lab mode; I must study how to do with cIECAM only if (gamu == 1) { - float HH, Lprov1, Chprov1; + float Lprov1, Chprov1; Lprov1 = Ll / 327.68f; Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f; - HH = xatan2f (bb, aa); float2 sincosval; if (Chprov1 == 0.0f) { @@ -2605,7 +2813,7 @@ Ciecam02::jch2xyz_ciecam02float ( x, y, z, LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]), F2V (xw2), F2V (yw2), F2V (zw2), - F2V (f2), F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); + F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); STVF (xbuffer[k], x * c655d35); STVF (ybuffer[k], y * c655d35); STVF (zbuffer[k], z * c655d35); @@ -2695,7 +2903,7 @@ -//all this treatments reduce artefacts, but can leed to slighty different results +//all this treatments reduce artifacts, but can lead to slighty different results if (params->defringe.enabled) if (execsharp) { @@ -2707,10 +2915,6 @@ //if(params->dirpyrequalizer.enabled) if(execsharp) { if (params->dirpyrequalizer.enabled) { if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { //remove artifacts by gaussian blur - skin control - float b_l = static_cast (params->dirpyrequalizer.hueskin.value[0]) / 100.0f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.value[1]) / 100.0f; - float b_r = static_cast (params->dirpyrequalizer.hueskin.value[2]) / 100.0f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.value[3]) / 100.0f; float artifact = (float) settings->artifact_cbdl; if (artifact > 6.f) { @@ -2724,7 +2928,7 @@ int hotbad = 0; float chrom = 50.f; lab->deleteLab(); - ImProcFunctions::badpixcam (ncie, artifact, 5, 2, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL + ImProcFunctions::badpixcam (ncie, artifact, 5, 2, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL lab->reallocLab(); } } @@ -2733,7 +2937,7 @@ if (params->colorappearance.badpixsl > 0) if (execsharp) { int mode = params->colorappearance.badpixsl; lab->deleteLab(); - ImProcFunctions::badpixcam (ncie, 3.0, 10, mode, 0, 0, 0, 0, 0, 0, 1);//for bad pixels CIECAM + ImProcFunctions::badpixcam (ncie, 3.0, 10, mode, 0, 0, 1);//for bad pixels CIECAM lab->reallocLab(); } @@ -2761,13 +2965,11 @@ // else if(params->dirpyrequalizer.algo=="LA") choice=1; if (rtt == 1) { - float b_l = static_cast (params->dirpyrequalizer.hueskin.value[0]) / 100.0f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.value[1]) / 100.0f; - float b_r = static_cast (params->dirpyrequalizer.hueskin.value[2]) / 100.0f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.value[3]) / 100.0f; - int choice = 0; // I have not suppress this statement in case of !! always to 0 + float b_l = static_cast (params->dirpyrequalizer.hueskin.getBottomLeft()) / 100.0f; + float t_l = static_cast (params->dirpyrequalizer.hueskin.getTopLeft()) / 100.0f; + float t_r = static_cast (params->dirpyrequalizer.hueskin.getTopRight()) / 100.0f; lab->deleteLab(); - dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale); //contrast by detail adapted to CIECAM + dirpyr_equalizercam (ncie, ncie->sh_p, ncie->sh_p, ncie->W, ncie->H, ncie->h_p, ncie->C_p, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, true, b_l, t_l, t_r, scale); //contrast by detail adapted to CIECAM lab->reallocLab(); } @@ -2810,7 +3012,7 @@ if (epdEnabled && params->colorappearance.tonecie && algepd) { lab->deleteLab(); - ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); + ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale ); lab->reallocLab(); } @@ -2857,10 +3059,10 @@ float libr; float colch; - if (curveMode == ColorAppearanceParams::TC_MODE_BRIGHT) { + if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { brli = 70.0f; libr = ncie->Q_p[i][j]; //40.0 to 100.0 approximative factor for Q - 327 for J - } else { /*if(curveMode == ColorAppearanceParams::TC_MODE_LIGHT)*/ + } else { /*if(curveMode == ColorAppearanceParams::TCMode::LIGHT)*/ brli = 327.f; libr = ncie->J_p[i][j]; //327 for J } @@ -2868,13 +3070,13 @@ posl = (int) (libr * brli); hist16JCAM[posl]++; - if (curveMode3 == ColorAppearanceParams::TC_MODE_CHROMA) { + if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { chsacol = 400.f;//327.f; colch = ncie_C_p; - } else if (curveMode3 == ColorAppearanceParams::TC_MODE_SATUR) { + } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { chsacol = 450.0f; colch = 100.f * sqrtf (ncie_C_p / ncie->Q_p[i][j]); - } else { /*if(curveMode3 == ColorAppearanceParams::TC_MODE_COLORF)*/ + } else { /*if(curveMode3 == ColorAppearanceParams::CTCMode::COLORF)*/ chsacol = 400.f;//327.0f; colch = ncie->M_p[i][j]; } @@ -2894,7 +3096,7 @@ Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], xw2, yw2, zw2, - f2, c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x = (float)xx * 655.35f; float y = (float)yy * 655.35f; float z = (float)zz * 655.35f; @@ -2949,7 +3151,7 @@ Ciecam02::jch2xyz_ciecam02float ( x, y, z, LVF (Jbuffer[k]), LVF (Cbuffer[k]), LVF (hbuffer[k]), F2V (xw2), F2V (yw2), F2V (zw2), - F2V (f2), F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); + F2V (nc2), F2V (pow1n), F2V (nbbj), F2V (ncbj), F2V (flj), F2V (dj), F2V (awj), F2V (reccmcz)); x *= c655d35; y *= c655d35; z *= c655d35; @@ -3127,8 +3329,6 @@ } bool processSH = params->sh.enabled && shmap && (params->sh.highlights > 0 || params->sh.shadows > 0); - bool processLCE = params->sh.enabled && shmap && params->sh.localcontrast > 0; - double lceamount = params->sh.localcontrast / 200.0; TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); @@ -3166,7 +3366,8 @@ {wprof[2][0], wprof[2][1], wprof[2][2]} }; - bool mixchannels = (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || + bool mixchannels = params->chmixer.enabled && + (params->chmixer.red[0] != 100 || params->chmixer.red[1] != 0 || params->chmixer.red[2] != 0 || params->chmixer.green[0] != 0 || params->chmixer.green[1] != 100 || params->chmixer.green[2] != 0 || params->chmixer.blue[0] != 0 || params->chmixer.blue[1] != 0 || params->chmixer.blue[2] != 100); @@ -3179,9 +3380,9 @@ FlatCurveType sCurveType = (FlatCurveType)params->hsvequalizer.scurve.at (0); FlatCurveType vCurveType = (FlatCurveType)params->hsvequalizer.vcurve.at (0); FlatCurveType bwlCurveType = (FlatCurveType)params->blackwhite.luminanceCurve.at (0); - bool hCurveEnabled = hCurveType > FCT_Linear; - bool sCurveEnabled = sCurveType > FCT_Linear; - bool vCurveEnabled = vCurveType > FCT_Linear; + bool hCurveEnabled = params->hsvequalizer.enabled && hCurveType > FCT_Linear; + bool sCurveEnabled = params->hsvequalizer.enabled && sCurveType > FCT_Linear; + bool vCurveEnabled = params->hsvequalizer.enabled && vCurveType > FCT_Linear; bool bwlCurveEnabled = bwlCurveType > FCT_Linear; // TODO: We should create a 'skip' value like for CurveFactory::complexsgnCurve (rtengine/curves.cc) @@ -3270,30 +3471,31 @@ const float hlrange = 65536.0 - shoulder; const bool isProPhoto = (params->icm.working == "ProPhoto"); // extracting datas from 'params' to avoid cache flush (to be confirmed) - ToneCurveParams::eTCModeId curveMode = params->toneCurve.curveMode; - ToneCurveParams::eTCModeId curveMode2 = params->toneCurve.curveMode2; + ToneCurveParams::TcMode curveMode = params->toneCurve.curveMode; + ToneCurveParams::TcMode curveMode2 = params->toneCurve.curveMode2; bool highlight = params->toneCurve.hrenabled;//Get the value if "highlight reconstruction" is activated bool hasToneCurve1 = bool (customToneCurve1); bool hasToneCurve2 = bool (customToneCurve2); - BlackWhiteParams::eTCModeId beforeCurveMode = params->blackwhite.beforeCurveMode; - BlackWhiteParams::eTCModeId afterCurveMode = params->blackwhite.afterCurveMode; + BlackWhiteParams::TcMode beforeCurveMode = params->blackwhite.beforeCurveMode; + BlackWhiteParams::TcMode afterCurveMode = params->blackwhite.afterCurveMode; bool hasToneCurvebw1 = bool (customToneCurvebw1); bool hasToneCurvebw2 = bool (customToneCurvebw2); PerceptualToneCurveState ptc1ApplyState, ptc2ApplyState; - if (hasToneCurve1 && curveMode == ToneCurveParams::TC_MODE_PERCEPTUAL) { + if (hasToneCurve1 && curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve1); userToneCurve.initApplyState (ptc1ApplyState, params->icm.working); } - if (hasToneCurve2 && curveMode2 == ToneCurveParams::TC_MODE_PERCEPTUAL) { + if (hasToneCurve2 && curveMode2 == ToneCurveParams::TcMode::PERCEPTUAL) { const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve2); userToneCurve.initApplyState (ptc2ApplyState, params->icm.working); } - bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve); + bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve) && params->colorToning.method != "LabGrid"; + bool hasColorToningLabGrid = params->colorToning.enabled && params->colorToning.method == "LabGrid"; // float satLimit = float(params->colorToning.satProtectionThreshold)/100.f*0.7f+0.3f; // float satLimitOpacity = 1.f-(float(params->colorToning.saturatedOpacity)/100.f); float strProtect = (float (params->colorToning.strength) / 100.f); @@ -3328,17 +3530,17 @@ } */ - float RedLow = (100.f + float (params->colorToning.redlow)) / 100.f; //printf("Rel=%f\n",RedLow); - float GreenLow = (100.f + float (params->colorToning.greenlow)) / 100.f; //printf("Gre=%f\n",GreenLow); - float BlueLow = (100.f + float (params->colorToning.bluelow)) / 100.f; //printf("Blu=%f\n",BlueLow); - float RedMed = (100.f + float (params->colorToning.redmed)) / 100.f; - float GreenMed = (100.f + float (params->colorToning.greenmed)) / 100.f; - float BlueMed = (100.f + float (params->colorToning.bluemed)) / 100.f; - float RedHigh = (100.f + float (params->colorToning.redhigh)) / 100.f; //printf("RedH=%f\n",RedHigh); - float GreenHigh = (100.f + float (params->colorToning.greenhigh)) / 100.f; - float BlueHigh = (100.f + float (params->colorToning.bluehigh)) / 100.f; - float SatLow = float (params->colorToning.shadowsColSat.value[0]) / 100.f; - float SatHigh = float (params->colorToning.hlColSat.value[0]) / 100.f; + float RedLow = params->colorToning.redlow / 100.f; + float GreenLow = params->colorToning.greenlow / 100.f; + float BlueLow = params->colorToning.bluelow / 100.f; + float RedMed = params->colorToning.redmed / 100.f; + float GreenMed = params->colorToning.greenmed / 100.f; + float BlueMed = params->colorToning.bluemed / 100.f; + float RedHigh = params->colorToning.redhigh / 100.f; + float GreenHigh = params->colorToning.greenhigh / 100.f; + float BlueHigh = params->colorToning.bluehigh / 100.f; + float SatLow = float (params->colorToning.shadowsColSat.getBottom()) / 100.f; + float SatHigh = float (params->colorToning.hlColSat.getBottom()) / 100.f; float Balan = float (params->colorToning.balance); @@ -3430,28 +3632,28 @@ #pragma omp parallel if (multiThread) #endif { - char *buffer; + size_t perChannelSizeBytes = padToAlignment(sizeof (float) * TS * TS + 4 * 64); + AlignedBuffer buffer(3 * perChannelSizeBytes); char *editIFloatBuffer = nullptr; char *editWhateverBuffer = nullptr; - buffer = (char *) malloc (3 * sizeof (float) * TS * TS + 20 * 64 + 63); - char *data; - data = (char*) ( ( uintptr_t (buffer) + uintptr_t (63)) / 64 * 64); - - float *rtemp = (float (*))data; - float *gtemp = (float (*)) ((char*)rtemp + sizeof (float) * TS * TS + 4 * 64); - float *btemp = (float (*)) ((char*)gtemp + sizeof (float) * TS * TS + 8 * 64); + float *rtemp = buffer.data; + float *gtemp = &rtemp[perChannelSizeBytes / sizeof(float)]; + float *btemp = >emp[perChannelSizeBytes / sizeof(float)]; int istart; int jstart; int tW; int tH; + // zero out the buffers + memset(rtemp, 0, 3 * perChannelSizeBytes); + // Allocating buffer for the PipetteBuffer float *editIFloatTmpR = nullptr, *editIFloatTmpG = nullptr, *editIFloatTmpB = nullptr, *editWhateverTmp = nullptr; if (editImgFloat) { editIFloatBuffer = (char *) malloc (3 * sizeof (float) * TS * TS + 20 * 64 + 63); - data = (char*) ( ( uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); + char *data = (char*) ( ( uintptr_t (editIFloatBuffer) + uintptr_t (63)) / 64 * 64); editIFloatTmpR = (float (*))data; editIFloatTmpG = (float (*)) ((char*)editIFloatTmpR + sizeof (float) * TS * TS + 4 * 64); @@ -3460,7 +3662,7 @@ if (editWhatever) { editWhateverBuffer = (char *) malloc (sizeof (float) * TS * TS + 20 * 64 + 63); - data = (char*) ( ( uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); + char *data = (char*) ( ( uintptr_t (editWhateverBuffer) + uintptr_t (63)) / 64 * 64); editWhateverTmp = (float (*))data; } @@ -3513,7 +3715,7 @@ } } - if (processSH || processLCE) { + if (processSH) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -3521,66 +3723,25 @@ float g = gtemp[ti * TS + tj]; float b = btemp[ti * TS + tj]; - double mapval = 1.0 + shmap->map[i][j]; - double factor = 1.0; - if (processSH) { - if (mapval > h_th) { - factor = (h_th + (100.0 - shHighlights) * (mapval - h_th) / 100.0) / mapval; - } else if (mapval < s_th) { - factor = (s_th - (100.0 - shShadows) * (s_th - mapval) / 100.0) / mapval; - } - } + float mapval = 1.f + shmap->map[i][j]; + float factor = 1.f; - if (processLCE) { - double sub = lceamount * (mapval - factor * (r * lumimul[0] + g * lumimul[1] + b * lumimul[2])); - rtemp[ti * TS + tj] = factor * r - sub; - gtemp[ti * TS + tj] = factor * g - sub; - btemp[ti * TS + tj] = factor * b - sub; - } else { - rtemp[ti * TS + tj] = factor * r; - gtemp[ti * TS + tj] = factor * g; - btemp[ti * TS + tj] = factor * b; + if (mapval > h_th) { + factor = (h_th + (100.0 - shHighlights) * (mapval - h_th) / 100.0) / mapval; + } else if (mapval < s_th) { + factor = (s_th - (100.0 - shShadows) * (s_th - mapval) / 100.0) / mapval; } - } - } - } - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - //TODO: proper treatment of out-of-gamut colors - //float tonefactor = hltonecurve[(0.299f*r+0.587f*g+0.114f*b)]; - float tonefactor = ((r < MAXVALF ? hltonecurve[r] : CurveFactory::hlcurve (exp_scale, comp, hlrange, r) ) + - (g < MAXVALF ? hltonecurve[g] : CurveFactory::hlcurve (exp_scale, comp, hlrange, g) ) + - (b < MAXVALF ? hltonecurve[b] : CurveFactory::hlcurve (exp_scale, comp, hlrange, b) ) ) / 3.0; - - // note: tonefactor includes exposure scaling, that is here exposure slider and highlight compression takes place - rtemp[ti * TS + tj] = r * tonefactor; - gtemp[ti * TS + tj] = g * tonefactor; - btemp[ti * TS + tj] = b * tonefactor; + rtemp[ti * TS + tj] = factor * r; + gtemp[ti * TS + tj] = factor * g; + btemp[ti * TS + tj] = factor * b; + } } } - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - //shadow tone curve - float Y = (0.299f * r + 0.587f * g + 0.114f * b); - float tonefactor = shtonecurve[Y]; - rtemp[ti * TS + tj] = rtemp[ti * TS + tj] * tonefactor; - gtemp[ti * TS + tj] = gtemp[ti * TS + tj] * tonefactor; - btemp[ti * TS + tj] = btemp[ti * TS + tj] * tonefactor; - } - } + highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange); + shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); if (dcpProf) { dcpProf->step2ApplyTile (rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); @@ -3588,22 +3749,10 @@ for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - // clip out of gamut colors, without distorting color too bad - if (r < 0) { - r = 0; - } - - if (g < 0) { - g = 0; - } - - if (b < 0) { - b = 0; - } + // clip out of gamut colors, without distorting colour too bad + float r = std::max(rtemp[ti * TS + tj], 0.f); + float g = std::max(gtemp[ti * TS + tj], 0.f); + float b = std::max(btemp[ti * TS + tj], 0.f); if (r > 65535 || g > 65535 || b > 65535) { filmlike_clip (&r, &g, &b); @@ -3615,149 +3764,53 @@ } } - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { + if (histToneCurveThr) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { - //brightness/contrast - rtemp[ti * TS + tj] = tonecurve[ rtemp[ti * TS + tj] ]; - gtemp[ti * TS + tj] = tonecurve[ gtemp[ti * TS + tj] ]; - btemp[ti * TS + tj] = tonecurve[ btemp[ti * TS + tj] ]; + //brightness/contrast + rtemp[ti * TS + tj] = tonecurve[ rtemp[ti * TS + tj] ]; + gtemp[ti * TS + tj] = tonecurve[ gtemp[ti * TS + tj] ]; + btemp[ti * TS + tj] = tonecurve[ btemp[ti * TS + tj] ]; - if (histToneCurveThr) { int y = CLIP (lumimulf[0] * Color::gamma2curve[rtemp[ti * TS + tj]] + lumimulf[1] * Color::gamma2curve[gtemp[ti * TS + tj]] + lumimulf[2] * Color::gamma2curve[btemp[ti * TS + tj]]); histToneCurveThr[y >> histToneCurveCompression]++; } } - } - - if (editID == EUID_ToneCurve1) { // filling the pipette buffer + } else { for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; + int j = jstart, tj = 0; +#ifdef __SSE2__ + for (; j < tW - 3; j+=4, tj+=4) { + //brightness/contrast + STVF(rtemp[ti * TS + tj], tonecurve(LVF(rtemp[ti * TS + tj]))); + STVF(gtemp[ti * TS + tj], tonecurve(LVF(gtemp[ti * TS + tj]))); + STVF(btemp[ti * TS + tj], tonecurve(LVF(btemp[ti * TS + tj]))); + } +#endif + for (; j < tW; j++, tj++) { + //brightness/contrast + rtemp[ti * TS + tj] = tonecurve[rtemp[ti * TS + tj]]; + gtemp[ti * TS + tj] = tonecurve[gtemp[ti * TS + tj]]; + btemp[ti * TS + tj] = tonecurve[btemp[ti * TS + tj]]; } } } - if (hasToneCurve1) { - if (curveMode == ToneCurveParams::TC_MODE_STD) { // Standard - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TC_MODE_FILMLIKE) { // Adobe like - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TC_MODE_SATANDVALBLENDING) { // apply the curve on the saturation and value channels - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve1); - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TC_MODE_WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve1); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TC_MODE_LUMINANCE) { // apply the curve to the luminance channel - const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve1); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode == ToneCurveParams::TC_MODE_PERCEPTUAL) { // apply curve while keeping color appearance constant - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve1); + if (editID == EUID_ToneCurve1) { // filling the pipette buffer + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); + } - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); - gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); - btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ptc1ApplyState); - } - } - } + if (hasToneCurve1) { + customToneCurve(customToneCurve1, curveMode, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, ptc1ApplyState); } if (editID == EUID_ToneCurve2) { // filling the pipette buffer - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; - } - } + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } if (hasToneCurve2) { - if (curveMode2 == ToneCurveParams::TC_MODE_STD) { // Standard - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TC_MODE_FILMLIKE) { // Adobe like - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TC_MODE_SATANDVALBLENDING) { // apply the curve on the saturation and value channels - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TC_MODE_WEIGHTEDSTD) { // apply the curve to the rgb channels, weighted - const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TC_MODE_LUMINANCE) { // apply the curve to the luminance channel - const LuminanceToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } else if (curveMode2 == ToneCurveParams::TC_MODE_PERCEPTUAL) { // apply curve while keeping color appearance constant - const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve2); - - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - userToneCurve.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ptc2ApplyState); - } - } - } + customToneCurve(customToneCurve2, curveMode2, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, ptc2ApplyState); } if (editID == EUID_RGB_R) { @@ -3780,7 +3833,7 @@ } } - if (rCurve || gCurve || bCurve) { // if any of the RGB curves is engaged + if (params->rgbCurves.enabled && (rCurve || gCurve || bCurve)) { // if any of the RGB curves is engaged if (!params->rgbCurves.lumamode) { // normal RGB mode for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -3841,8 +3894,7 @@ // Luminosity after // only Luminance in Lab float newy = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float newfy = newy < MAXVALF ? Color::cachef[newy] : 327.68f * std::cbrt (newy / MAXVALF); - float L_2 = 116.0f * newfy - 5242.88f; + float L_2 = newy <= MAXVALF ? Color::cachefy[newy] : 327.68f * (116.f * xcbrtf(newy / MAXVALF) - 16.f); //gamut control if (settings->rgbcurveslumamode_gamut) { @@ -3893,22 +3945,14 @@ } if (sat != 0 || hCurveEnabled || sCurveEnabled || vCurveEnabled) { + const float satby100 = sat / 100.f; for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - - const float satby100 = sat / 100.f; - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - + Color::rgb2hsvtc(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], h, s, v); + h /= 6.f; if (sat > 0) { - s = (1.f - satby100) * s + satby100 * (1.f - SQR (SQR (1.f - min (s, 1.0f)))); - - if (s < 0.f) { - s = 0.f; - } + s = std::max(0.f, intp(satby100, 1.f - SQR(SQR(1.f - std::min(s, 1.0f))), s)); } else { /*if (sat < 0)*/ s *= 1.f + satby100; } @@ -3950,7 +3994,7 @@ valparam *= (1.f - SQR (SQR (1.f - min (s, 1.0f)))); if (valparam > 0.00001f) { - v = (1.f - valparam) * v + valparam * (1.f - SQR (1.f - min (v, 1.0f))); // SQR (SQR to increase action and avoid artefacts + v = (1.f - valparam) * v + valparam * (1.f - SQR (1.f - min (v, 1.0f))); // SQR (SQR to increase action and avoid artifacts if (v < 0) { v = 0; @@ -3963,47 +4007,32 @@ } - Color::hsv2rgb (h, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); + Color::hsv2rgbdcp(h * 6.f, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } } if (isProPhoto) { // this is a hack to avoid the blue=>black bug (Issue 2141) - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - - if (r == 0.0f || g == 0.0f) { - float b = btemp[ti * TS + tj]; - float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - s *= 0.99f; - Color::hsv2rgb (h, s, v, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); - } - } - } + proPhotoBlue(rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } if (hasColorToning && !blackwhite) { if (params->colorToning.method == "Splitlr") { - float balanS, balanH; - float reducac = 0.4f; + constexpr float reducac = 0.4f; int preser = 0; if (params->colorToning.lumamode) { preser = 1; } - balanS = 1.f + Balan / 100.f; //balan between 0 and 2 - balanH = 1.f - Balan / 100.f; + const float balanS = 1.f + Balan / 100.f; //balan between 0 and 2 + const float balanH = 1.f - Balan / 100.f; float rh, gh, bh; float rl, gl, bl; float xh, yh, zh; float xl, yl, zl; - float iplow, iphigh; - iplow = (float)ctColorCurve.low; - iphigh = (float)ctColorCurve.high; + const float iplow = ctColorCurve.low; + const float iphigh = ctColorCurve.high; //2 colours ctColorCurve.getVal (iphigh, xh, yh, zh); ctColorCurve.getVal (iplow, xl, yl, zl); @@ -4012,79 +4041,49 @@ Color::xyz2rgb (xl, yl, zl, rl, gl, bl, wip); //reteave rgb value with s and l =1 retreavergb (rl, gl, bl); + const float krl = rl / (rl + gl + bl); + const float kgl = gl / (rl + gl + bl); + const float kbl = bl / (rl + gl + bl); retreavergb (rh, gh, bh); - //printf("rl=%f gl=%f bl=%f\n",rl,gl,bl); - + const float krh = rh / (rh + gh + bh); + const float kgh = gh / (rh + gh + bh); + const float kbh = bh / (rh + gh + bh); + strProtect = pow_F(strProtect, 0.4f); + constexpr int mode = 0; for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - float ro, go, bo; - int mode = 0; - toning2col (r, g, b, ro, go, bo, iplow, iphigh, rl, gl, bl, rh, gh, bh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); - rtemp[ti * TS + tj] = ro; - gtemp[ti * TS + tj] = go; - btemp[ti * TS + tj] = bo; + toning2col(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } } - // color toning with colour + // colour toning with colour else if (params->colorToning.method == "Splitco") { - /* - #if 1 - for (int i=istart,ti=0; i crash - gtemp[ti*TS+tj] = CLIP(go); - btemp[ti*TS+tj] = CLIP(bo); - } - } - #else - */ - float reducac = 0.3f; - int preser = 0; - - //bool execbal = params->colorToning.method=="Splitbal"; - if (params->colorToning.lumamode) { - preser = 1; - } - + constexpr float reducac = 0.3f; + constexpr int mode = 0; + strProtect = pow_F(strProtect, 0.4f); for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float r = rtemp[ti * TS + tj]; + const float g = gtemp[ti * TS + tj]; + const float b = btemp[ti * TS + tj]; float ro, go, bo; - int mode = 0; - toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, preser, strProtect); - float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; - float preserv = 1.f; + toningsmh(r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - if (preser == 1) { - preserv = lumbefore / lumafter; + if (params->colorToning.lumamode) { + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; + const float preserv = lumbefore / lumafter; + ro *= preserv; + go *= preserv; + bo *= preserv; } - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); - rtemp[ti * TS + tj] = ro; - gtemp[ti * TS + tj] = go; - btemp[ti * TS + tj] = bo; + rtemp[ti * TS + tj] = CLIP(ro); + gtemp[ti * TS + tj] = CLIP(go); + btemp[ti * TS + tj] = CLIP(bo); } } - -//#endif } //colortoning with shift color XYZ or Lch @@ -4136,7 +4135,7 @@ float b = btemp[ti * TS + tj]; float ro, go, bo; labtoning (r, g, b, ro, go, bo, algm, metchrom, twoc, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, clToningcurve, cl2Toningcurve, iplow, iphigh, wp, wip); - rtemp[ti * TS + tj] = CLIP (ro); //I used CLIP because there is a little bug in gamutLchonly that return 65536.ii intead of 65535 ==> crash + rtemp[ti * TS + tj] = CLIP (ro); //I used CLIP because there is a little bug in gamutLchonly that return 65536.ii instead of 65535 ==> crash gtemp[ti * TS + tj] = CLIP (go); btemp[ti * TS + tj] = CLIP (bo); } @@ -4152,29 +4151,25 @@ // Luminance = (0.299f*r + 0.587f*g + 0.114f*b) - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); + float s, l; + Color::rgb2slfloat (r, g, b, s, l); - float l_ = Color::gamma_srgb (l * 65535.f) / 65535.f; + float l_ = Color::gammatab_srgb1[l * 65535.f]; // get the opacity and tweak it to preserve saturated colors - float opacity; + float opacity = 0.f; if (ctOpacityCurve) { opacity = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)) * ctOpacityCurve.lutOpacityCurve[l_ * 500.f]; } - if (!ctOpacityCurve) { - opacity = 0.f; - } - float r2, g2, b2; ctColorCurve.getVal (l_, r2, g2, b2); // get the color from the color curve float h2, s2, l2; - Color::rgb2hsl (r2, g2, b2, h2, s2, l2); // transform this new color to hsl + Color::rgb2hslfloat (r2, g2, b2, h2, s2, l2); // transform this new color to hsl - Color::hsl2rgb (h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); + Color::hsl2rgbfloat (h2, s + ((1.f - s) * (1.f - l) * 0.7f), l, r2, g2, b2); rtemp[ti * TS + tj] = r + (r2 - r) * opacity; // merge the color to the old color, depending on the opacity gtemp[ti * TS + tj] = g + (g2 - g) * opacity; @@ -4186,13 +4181,7 @@ // filling the pipette buffer if (editID == EUID_BlackWhiteBeforeCurve) { - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - editIFloatTmpR[ti * TS + tj] = Color::gamma2curve[rtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpG[ti * TS + tj] = Color::gamma2curve[gtemp[ti * TS + tj]] / 65535.f; - editIFloatTmpB[ti * TS + tj] = Color::gamma2curve[btemp[ti * TS + tj]] / 65535.f; - } - } + fillEditFloat(editIFloatTmpR, editIFloatTmpG, editIFloatTmpB, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); } else if (editID == EUID_BlackWhiteLuminance) { for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { @@ -4212,34 +4201,34 @@ //black and white if (blackwhite) { if (hasToneCurvebw1) { - if (beforeCurveMode == BlackWhiteParams::TC_MODE_STD_BW) { // Standard + if (beforeCurveMode == BlackWhiteParams::TcMode::STD_BW) { // Standard for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const StandardToneCurvebw& userToneCurvebw = static_cast (customToneCurvebw1); + const StandardToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } - } else if (beforeCurveMode == BlackWhiteParams::TC_MODE_FILMLIKE_BW) { // Adobe like + } else if (beforeCurveMode == BlackWhiteParams::TcMode::FILMLIKE_BW) { // Adobe like for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const AdobeToneCurvebw& userToneCurvebw = static_cast (customToneCurvebw1); + const AdobeToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } - } else if (beforeCurveMode == BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW) { // apply the curve on the saturation and value channels + } else if (beforeCurveMode == BlackWhiteParams::TcMode::SATANDVALBLENDING_BW) { // apply the curve on the saturation and value channels for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const SatAndValueBlendingToneCurvebw& userToneCurvebw = static_cast (customToneCurvebw1); + const SatAndValueBlendingToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); userToneCurvebw.Apply (rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj]); } } - } else if (beforeCurveMode == BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted + } else if (beforeCurveMode == BlackWhiteParams::TcMode::WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { - const WeightedStdToneCurvebw& userToneCurvebw = static_cast (customToneCurvebw1); + const WeightedStdToneCurve& userToneCurvebw = static_cast (customToneCurvebw1); rtemp[ti * TS + tj] = CLIP (rtemp[ti * TS + tj]); gtemp[ti * TS + tj] = CLIP (gtemp[ti * TS + tj]); btemp[ti * TS + tj] = CLIP (btemp[ti * TS + tj]); @@ -4295,7 +4284,7 @@ #endif } - } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artefacts + } else if (algm == 1) { //Luminance mixer in Lab mode to avoid artifacts for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { //rgb => xyz @@ -4485,54 +4474,28 @@ if (!blackwhite) { - // ready, fill lab - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { + if (editImgFloat || editWhatever) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { - // filling the pipette buffer by the content of the temp pipette buffers - if (editImgFloat) { - editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; - editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; - editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; - } else if (editWhatever) { - editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; + // filling the pipette buffer by the content of the temp pipette buffers + if (editImgFloat) { + editImgFloat->r (i, j) = editIFloatTmpR[ti * TS + tj]; + editImgFloat->g (i, j) = editIFloatTmpG[ti * TS + tj]; + editImgFloat->b (i, j) = editIFloatTmpB[ti * TS + tj]; + } else if (editWhatever) { + editWhatever->v (i, j) = editWhateverTmp[ti * TS + tj]; + } } - - float r = rtemp[ti * TS + tj]; - float g = gtemp[ti * TS + tj]; - float b = btemp[ti * TS + tj]; - - float x = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; - float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - - float fx, fy, fz; - - fx = (x < 65535.0f ? Color::cachef[x] : 327.68f * std::cbrt (x / MAXVALF)); - fy = (y < 65535.0f ? Color::cachef[y] : 327.68f * std::cbrt (y / MAXVALF)); - fz = (z < 65535.0f ? Color::cachef[z] : 327.68f * std::cbrt (z / MAXVALF)); - - lab->L[i][j] = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; - lab->a[i][j] = (500.0f * (fx - fy) ); - lab->b[i][j] = (200.0f * (fy - fz) ); - - //test for color accuracy - /* - float fy = (0.00862069 * lab->L[i][j])/327.68 + 0.137932; // (L+16)/116 - float fx = (0.002 * lab->a[i][j])/327.68 + fy; - float fz = fy - (0.005 * lab->b[i][j])/327.68; - - float x_ = 65535*Lab2xyz(fx)*Color::D50x; - float y_ = 65535*Lab2xyz(fy); - float z_ = 65535*Lab2xyz(fz)*Color::D50z; - - int R,G,B; - xyz2srgb(x_,y_,z_,R,G,B); - r=(float)R; g=(float)G; b=(float)B; - float xxx=1; - */ } } + // ready, fill lab + for (int i = istart, ti = 0; i < tH; i++, ti++) { + Color::RGB2Lab(&rtemp[ti * TS], >emp[ti * TS], &btemp[ti * TS], &(lab->L[i][jstart]), &(lab->a[i][jstart]), &(lab->b[i][jstart]), toxyz, tW - jstart); + } + if (hasColorToningLabGrid) { + colorToningLabGrid(lab, jstart, tW, istart, tH, false); + } } else { // black & white // Auto channel mixer needs whole image, so we now copy to tmpImage and close the tiled processing for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -4554,8 +4517,6 @@ } } - free (buffer); - if (editIFloatBuffer) { free (editIFloatBuffer); } @@ -4672,25 +4633,25 @@ if (hasToneCurvebw2) { - if (afterCurveMode == BlackWhiteParams::TC_MODE_STD_BW) { // Standard + if (afterCurveMode == BlackWhiteParams::TcMode::STD_BW) { // Standard #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - const StandardToneCurvebw& userToneCurve = static_cast (customToneCurvebw2); + const StandardToneCurve& userToneCurve = static_cast (customToneCurvebw2); userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j)); } } - } else if (afterCurveMode == BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted + } else if (afterCurveMode == BlackWhiteParams::TcMode::WEIGHTEDSTD_BW) { // apply the curve to the rgb channels, weighted #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { //for ulterior usage if bw data modified for (int j = 0; j < tW; j++) { - const WeightedStdToneCurvebw& userToneCurve = static_cast (customToneCurvebw2); + const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurvebw2); tmpImage->r (i, j) = CLIP (tmpImage->r (i, j)); tmpImage->g (i, j) = CLIP (tmpImage->g (i, j)); @@ -4702,89 +4663,59 @@ } } - //colortoning with black and white + //colour toning with black and white if (hasColorToning) { if (params->colorToning.method == "Splitco") { - /* - #if 1 - for (int i=istart,ti=0; i crash - gtemp[ti*TS+tj] = CLIP(go); - btemp[ti*TS+tj] = CLIP(bo); - } - } - #else - */ - int preser = 0; - - if (params->colorToning.lumamode) { - preser = 1; - } - - float reducac = 0.3f; + constexpr float reducac = 0.5f; + constexpr int mode = 1; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); + const float r = tmpImage->r (i, j); + const float g = tmpImage->g (i, j); + const float b = tmpImage->b (i, j); - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; - if (lumbefore < 65000.f && lumbefore > 500.f) { //reduct artifacts for highlights an extrem shadows + if (lumbefore < 65000.f && lumbefore > 500.f) { //reduce artifacts for highlights and extreme shadows float ro, go, bo; - int mode = 1; - toningsmh (r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, preser, strProtect); - float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; - float preserv = 1.f; + toningsmh(r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); - if (preser == 1) { - preserv = lumbefore / lumafter; + if (params->colorToning.lumamode) { + const float lumafter = 0.299f * ro + 0.587f * go + 0.114f * bo; + const float preserv = lumbefore / lumafter; + ro *= preserv; + go *= preserv; + bo *= preserv; } - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); - tmpImage->r (i, j) = ro; - tmpImage->g (i, j) = go; - tmpImage->b (i, j) = bo; + tmpImage->r(i, j) = CLIP(ro); + tmpImage->g(i, j) = CLIP(go); + tmpImage->b(i, j) = CLIP(bo); } } } - -//#endif } else if (params->colorToning.method == "Splitlr") { - float balanS, balanH; - float reducac = 0.4f; + constexpr float reducac = 0.4f; int preser = 0; if (params->colorToning.lumamode) { preser = 1; } - balanS = 1.f + Balan / 100.f; //balan between 0 and 2 - balanH = 1.f - Balan / 100.f; + const float balanS = 1.f + Balan / 100.f; //balan between 0 and 2 + const float balanH = 1.f - Balan / 100.f; float rh, gh, bh; float rl, gl, bl; float xh, yh, zh; float xl, yl, zl; - float iplow, iphigh; - iplow = (float)ctColorCurve.low; - iphigh = (float)ctColorCurve.high; + const float iplow = ctColorCurve.low; + const float iphigh = ctColorCurve.high; //2 colours ctColorCurve.getVal (iphigh, xh, yh, zh); @@ -4795,23 +4726,23 @@ //retrieve rgb value with s and l =1 retreavergb (rl, gl, bl); + const float krl = rl / (rl + gl + bl); + const float kgl = gl / (rl + gl + bl); + const float kbl = bl / (rl + gl + bl); + retreavergb (rh, gh, bh); + const float krh = rh / (rh + gh + bh); + const float kgh = gh / (rh + gh + bh); + const float kbh = bh / (rh + gh + bh); + strProtect = pow_F(strProtect, 0.4f); + constexpr int mode = 1; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 5) #endif for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); - - float ro, go, bo; - int mode = 1; - toning2col (r, g, b, ro, go, bo, iplow, iphigh, rl, gl, bl, rh, gh, bh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); - tmpImage->r (i, j) = ro; - tmpImage->g (i, j) = go; - tmpImage->b (i, j) = bo; + toning2col(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), iplow, iphigh, krl, kgl, kbl, krh, kgh, kbh, SatLow, SatHigh, balanS, balanH, reducac, mode, preser, strProtect); } } } @@ -4887,31 +4818,31 @@ for (int i = 0; i < tH; i++) { for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); + float r = tmpImage->r(i, j); + float g = tmpImage->g(i, j); + float b = tmpImage->b(i, j); // Luminance = (0.299f*r + 0.587f*g + 0.114f*b) - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); + float s, l; + Color::rgb2slfloat(r, g, b, s, l); - float l_ = Color::gamma_srgb (l * 65535.f) / 65535.f; + float l_ = Color::gammatab_srgb1[l * 65535.f]; - // get the opacity and tweak it to preserve saturated colors + // get the opacity and tweak it to preserve saturated colours float opacity = ctOpacityCurve.lutOpacityCurve[l_ * 500.f] / 4.f; float r2, g2, b2; - ctColorCurve.getVal (l_, r2, g2, b2); // get the color from the color curve + ctColorCurve.getVal(l_, r2, g2, b2); // get the colour from the colour curve float h2, s2, l2; - Color::rgb2hsl (r2, g2, b2, h2, s2, l2); // transform this new color to hsl + Color::rgb2hslfloat(r2, g2, b2, h2, s2, l2); // transform this new colour to hsl - Color::hsl2rgb (h2, s2, l, r2, g2, b2); + Color::hsl2rgbfloat(h2, s2, l, r2, g2, b2); - tmpImage->r (i, j) = r + (r2 - r) * opacity; - tmpImage->g (i, j) = g + (g2 - g) * opacity; - tmpImage->b (i, j) = b + (b2 - b) * opacity; + tmpImage->r(i, j) = intp(opacity, r2, r); + tmpImage->g(i, j) = intp(opacity, g2, g); + tmpImage->b(i, j) = intp(opacity, b2, b); } } } @@ -4945,24 +4876,9 @@ #endif for (int i = 0; i < tH; i++) { - for (int j = 0; j < tW; j++) { - float r = tmpImage->r (i, j); - float g = tmpImage->g (i, j); - float b = tmpImage->b (i, j); - - float x = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; - float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; - float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; - - float fx, fy, fz; - - fx = (x < MAXVALF ? Color::cachef[x] : 327.68f * std::cbrt (x / MAXVALF)); - fy = (y < MAXVALF ? Color::cachef[y] : 327.68f * std::cbrt (y / MAXVALF)); - fz = (z < MAXVALF ? Color::cachef[z] : 327.68f * std::cbrt (z / MAXVALF)); - - lab->L[i][j] = 116.0f * fy - 5242.88f; //5242.88=16.0*327.68; - lab->a[i][j] = 500.0f * (fx - fy); - lab->b[i][j] = 200.0f * (fy - fz); + Color::RGB2Lab(tmpImage->r(i), tmpImage->g(i), tmpImage->b(i), lab->L[i], lab->a[i], lab->b[i], toxyz, tW); + if (hasColorToningLabGrid) { + colorToningLabGrid(lab, 0, tW, i, i + 1, false); } } @@ -4984,6 +4900,11 @@ if (vCurveEnabled) { delete vCurve; } + + if (params->localContrast.enabled) { + // Alberto's local contrast + localContrast(lab); + } } /** @@ -5056,11 +4977,8 @@ **/ void ImProcFunctions::secondeg_begin (float reducac, float vend, float &aam, float &bbm) { - float zrmd = reducac; //linear = 0.5 - float v0m = vend; - float mem = vend / 2.f; //(0. + 0.8)/2.f - aam = (1.f - zrmd * v0m / mem) / (v0m * v0m - mem * v0m); // - bbm = (1.f - aam * v0m * v0m) / v0m; + aam = (2.f - 4.f * reducac) / (vend * vend); + bbm = 1.f / vend - aam * vend; } @@ -5072,130 +4990,101 @@ * @param ro red output values [0..65535] * @param go green output values [0..65535] * @param bo blue output values [0..65535] -* @param RedLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param GreenLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param BlueLow [0..1] value after transformations of sliders [-100..100] for shadows -* @param RedMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param GreenMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param BlueMed [0..1] value after transformations of sliders [-100..100] for midtones -* @param RedHigh [0..1] value after transformations of sliders [-100..100] for highlights -* @param GreenHigh [0..1] value after transformations of sliders [-100..100] for highlights -* @param BlueHigh [0..1] value after transformations of sliders [-100..100] for highlights +* @param RedLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param GreenLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param BlueLow [-1..1] value after transformations of sliders [-100..100] for shadows +* @param RedMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param GreenMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param BlueMed [-1..1] value after transformations of sliders [-100..100] for midtones +* @param RedHigh [-1..1] value after transformations of sliders [-100..100] for highlights +* @param GreenHigh [-1..1] value after transformations of sliders [-100..100] for highlights +* @param BlueHigh [-1..1] value after transformations of sliders [-100..100] for highlights * @param reducac value of the reduction in the middle of the range for second degree increse or decrease action -* @param mode ? -* @param preser whether to preserve luminance (if 1) or not +* @param mode 0 = colour, 1 = Black and White +* @param strProtect ? **/ -void ImProcFunctions::toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect) +void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect) { - float bmu = mode == 1 ? 0.5f : 0.4f; - float RedL = 1.f + (RedLow - 1.f) * 0.4f; - float GreenL = 1.f + (GreenLow - 1.f) * 0.4f; - float BlueL = 1.f + (BlueLow - 1.f) * bmu; - float h, s, v; - Color::rgb2hsv (r, g, b, h, s, v); - float ksat = 1.f; - float ksatlow = 1.f; -// float s_0=0.55f; -// float s_1=0.85f; - /* - if(mode==0) {//color - if(s < s_0) ksat=SQR((1.f/s_0)*s); - if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); - } - */ + const float v = max(r, g, b) / 65535.f; float kl = 1.f; - float rlo = 1.f; //0.4 0.5 - float rlm = 1.5f; //1.1 - float rlh = 2.2f; //1.1 - float rlob = bmu; //for BW old mode - - if (mode == 0) { //color - rlo *= pow_F (strProtect, 0.4f); //0.5 ==> 0.75 - rlh *= pow_F (strProtect, 0.4f); - rlm *= pow_F (strProtect, 0.4f); + float rlo; //0.4 0.5 + float rlm; //1.1 + float rlh; //1.1 + float rlob; //for BW old mode + + if (mode == 0) { //colour + rlo = rlob = strProtect; //0.5 ==> 0.75 + rlh = 2.2f * strProtect; + rlm = 1.5f * strProtect; + constexpr float v0 = 0.15f; + //second degree + + if (v > v0) { + float aa, bb, cc; + secondeg_end (reducac, v0, aa, bb, cc); + kl = aa * v * v + bb * v + cc; //verified ==> exact + } else { + float aab, bbb; + secondeg_begin (0.7f, v0, aab, bbb); + kl = aab * v * v + bbb * v; + } } else { //bw coefficient to preserve same results as before for satlimtopacity = 0.5 (default) rlo = strProtect * 0.8f; //0.4 rlob = strProtect; //0.5 rlm = strProtect * 2.2f; //1.1 rlh = strProtect * 2.4f; //1.2 - } - - if (mode == 0) { - rlob = rlo; - } - - - //fixed value of reducac=0.3 - //secondeg_end (reducac, v0, aa, bb, cc); - if (mode == 1) { - reducac = 0.5f; //black and white mode - if (v > 0.15f) { - kl = (-1.f / 0.85f) * v + (1.f) / 0.85f; //Low light ==> decrease action after v=0.15 - } - } else { //color - float v0 = 0.15f; - //second degree - float aa, bb, cc; - secondeg_end (reducac, v0, aa, bb, cc); - float aab, bbb; - secondeg_begin (0.7f, v0, aab, bbb); - - if (v > v0) { - kl = aa * v * v + bb * v + cc; //verified ==> exact - } else if (mode == 0) { - kl = aab * v * v + bbb * v; //ksatlow=ksat; + kl = (-1.f / 0.85f) * v + 1.f / 0.85f; //Low light ==> decrease action after v=0.15 } } - if (RedLow != 1.f) { - RedL = 1.f + (RedLow - 1.f) * kl * ksat * rlo; //0.4 - - if (RedLow >= 1.f) { - g -= 20000.f * (RedL - 1.f) * ksatlow; - b -= 20000.f * (RedL - 1.f) * ksatlow; + { + const float corr = 20000.f * RedLow * kl * rlo; + if (RedLow > 0.f) { + g -= corr; + b -= corr; } else { - r += 20000.f * (RedL - 1.f) * ksatlow; + r += corr; } - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (GreenLow != 1.f) { - GreenL = 1.f + (GreenLow - 1.f) * kl * ksat * rlo; //0.4 - - if (GreenLow >= 1.f) { - r -= 20000.f * (GreenL - 1.f) * ksatlow; - b -= 20000.f * (GreenL - 1.f) * ksatlow; + { + const float corr = 20000.f * GreenLow * kl * rlo; + if (GreenLow > 0.f) { + r -= corr; + b -= corr; } else { - g += 20000.f * (GreenL - 1.f) * ksatlow; + g += corr; } - r = CLIP (r); - b = CLIP (b); - g = CLIP (g); + r = CLIP(r); + b = CLIP(b); + g = CLIP(g); } - if (BlueLow != 1.f) { - BlueL = 1.f + (BlueLow - 1.f) * kl * ksat * rlob; - if (BlueLow >= 1.f) { - r -= 20000.f * (BlueL - 1.f) * ksatlow; - g -= 20000.f * (BlueL - 1.f) * ksatlow; + { + const float corr = 20000.f * BlueLow * kl * rlob; + + if (BlueLow > 0.f) { + r -= corr; + g -= corr; } else { - b += 20000.f * (BlueL - 1.f) * ksatlow; + b += corr; } - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } // mid tones float km; - float v0m = 0.5f; //max action + constexpr float v0m = 0.5f; //max action if (v < v0m) { float aam, bbm; @@ -5209,134 +5098,112 @@ km = aamm * v * v + bbmm * v + ccmm; //verification good } - float RedM = 1.f + (RedMed - 1.f) * rlm; - - if (RedMed != 1.f) { - RedM = 1.f + (RedMed - 1.f) * km * rlm; + { + const float RedM = RedMed * km * rlm; - if (RedMed >= 1.f) { - r += 20000.f * (RedM - 1.f); - g -= 10000.f * (RedM - 1.f); - b -= 10000.f * (RedM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + if (RedMed > 0.f) { + r += 20000.f * RedM; + g -= 10000.f * RedM; + b -= 10000.f * RedM; } else { - r += 10000.f * (RedM - 1.f); - g -= 20000.f * (RedM - 1.f); - b -= 20000.f * (RedM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); - } + r += 10000.f * RedM; + g -= 20000.f * RedM; + b -= 20000.f * RedM; + } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float GreenM = 1.f + (GreenMed - 1.f) * rlm; - - if (GreenMed != 1.f) { - GreenM = 1.f + (GreenMed - 1.f) * km * rlm; - - if (GreenMed >= 1.f) { - r -= 10000.f * (GreenM - 1.f); - g += 20000.f * (GreenM - 1.f); - b -= 10000.f * (GreenM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + { + const float GreenM = GreenMed * km * rlm; + + if (GreenMed > 0.f) { + r -= 10000.f * GreenM; + g += 20000.f * GreenM; + b -= 10000.f * GreenM; } else { - r -= 20000.f * (GreenM - 1.f); - g += 10000.f * (GreenM - 1.f); - b -= 20000.f * (GreenM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); - } + r -= 20000.f * GreenM; + g += 10000.f * GreenM; + b -= 20000.f * GreenM; + } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float BlueM = 1.f + (BlueMed - 1.f) * rlm; - - if (BlueMed != 1.f) { - BlueM = 1.f + (BlueMed - 1.f) * km * rlm; - - if (BlueMed >= 1.f) { - r -= 10000.f * (BlueM - 1.f); - g -= 10000.f * (BlueM - 1.f); - b += 20000.f * (BlueM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); + { + const float BlueM = BlueMed * km * rlm; + + if (BlueMed > 0.f) { + r -= 10000.f * BlueM; + g -= 10000.f * BlueM; + b += 20000.f * BlueM; } else { - r -= 20000.f * (BlueM - 1.f); - g -= 20000.f * (BlueM - 1.f); - b += 10000.f * (BlueM - 1.f); - r = CLIP (r); - g = CLIP (g); - b = CLIP (b); - } + r -= 20000.f * BlueM; + g -= 20000.f * BlueM; + b += 10000.f * BlueM; + } + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } //high tones - float kh; - kh = 1.f; - float v00 = 0.8f; //max action + constexpr float v00 = 0.8f; //max action float aa0, bb0; secondeg_begin (reducac, v00, aa0, bb0); -// float hmu=1.5f; -// if(mode==1) hmu=1.2f;//for BW old mode - if (v > v00) { - kh = (-1.f / (1.f - v00)) * v + (1.f) / (1.f - v00); //High tones + float kh; + if (v > v00) { //max action + kh = (1.f - v) / (1.f - v00); //High tones } else { - kh = aa0 * v * v + bb0 * v; //verification = good + kh = v * (aa0 * v + bb0); //verification = good } - float RedH = 1.f + (RedHigh - 1.f) * rlh; - float GreenH = 1.f + (GreenHigh - 1.f) * rlh; - float BlueH = 1.f + (BlueHigh - 1.f) * rlh; //1.2 - - if (RedHigh != 1.f) { - RedH = 1.f + (RedHigh - 1.f) * kh * rlh; //1.2 + { + const float corr = 20000.f * RedHigh * kh * rlh; //1.2 - if (RedHigh >= 1.f) { - r += 20000.f * (RedH - 1.f); - r = CLIP (r); + if (RedHigh > 0.f) { + r += corr; } else { - g -= 20000.f * (RedH - 1.f); - b -= 20000.f * (RedH - 1.f); + g -= corr; + b -= corr; } - g = CLIP (g); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (GreenHigh != 1.f) { - GreenH = 1.f + (GreenHigh - 1.f) * kh * rlh; //1.2 + { + const float corr = 20000.f * GreenHigh * kh * rlh; //1.2 - if (GreenHigh >= 1.f) { - g += 20000.f * (GreenH - 1.f); - g = CLIP (g); + if (GreenHigh > 0.f) { + g += corr; } else { - r -= 20000.f * (GreenH - 1.f); - b -= 20000.f * (GreenH - 1.f); + r -= corr; + b -= corr; } - r = CLIP (r); - b = CLIP (b); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - if (BlueHigh != 1.f) { - BlueH = 1.f + (BlueHigh - 1.f) * kh * rlh; //1.2 + { + const float corr = 20000.f * BlueHigh * kh * rlh; //1.2 - if (BlueHigh >= 1.f) { - b += 20000.f * (BlueH - 1.f); - b = CLIP (b); + if (BlueHigh > 0.f) { + b += corr; } else { - r -= 20000.f * (BlueH - 1.f); - g -= 20000.f * (BlueH - 1.f); + r -= corr; + g -= corr; } - r = CLIP (r); - g = CLIP (g); + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } ro = r; @@ -5356,164 +5223,101 @@ * @param balanH [0..1] balance for highlights (same slider than for balanS) * @param reducac value of the reduction in the middle of the range for second degree, increase or decrease action **/ -void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect) +void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float krl, float kgl, float kbl, float krh, float kgh, float kbh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect) { - float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; - float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); - float v; - Color::rgb2hsv (r, g, b, h, s, v); - float ksat = 1.f; - float ksatlow = 1.f; - /* - if(mode==0) {//color - if(s < s_0) ksat=SQR((1.f/s_0)*s); - if(s > s_1) ksat=SQR((1.f/(s_1-1.f))*s - (1.f/(s_1-1.f))); - } - */ - float kl = 1.f; - float rlo = 1.f; - float rlh = 2.2f; - rlo *= pow_F (strProtect, 0.4f); //0.5 ==> 0.75 transfered value for more action - rlh *= pow_F (strProtect, 0.4f); + const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; + const float v = max(r, g, b) / 65535.f; + + const float rlo = strProtect; //0.5 ==> 0.75 transferred value for more action + const float rlh = 2.2f * strProtect; + //low tones //second degree float aa, bb, cc; //fixed value of reducac =0.4; secondeg_end (reducac, iplow, aa, bb, cc); - float aab, bbb; + float aab, bbb; secondeg_begin (0.7f, iplow, aab, bbb); - if (v > iplow) { - kl = aa * v * v + bb * v + cc; - } else if (mode == 0) { - kl = aab * v * v + bbb * v; - } - - if (SatLow > 0.f) { - //rl gl bl - float krl = rl / (rl + gl + bl); - float kgl = gl / (rl + gl + bl); - float kbl = bl / (rl + gl + bl); - float RedL, GreenL, BlueL; - - if (g < 20000.f || b < 20000.f || r < 20000.f) { - float kmgb = min (r, g, b); //I have tested ...0.85 compromise... - kl *= pow ((kmgb / 20000.f), 0.85f); + float kl = 1.f; + if (v > iplow) { + kl = aa * v * v + bb * v + cc; + } else if (mode == 0) { + kl = aab * v * v + bbb * v; + } + const float kmgb = min(r, g, b); + if (kmgb < 20000.f) { + //I have tested ...0.85 compromise... + kl *= pow_F ((kmgb / 20000.f), 0.85f); } - RedL = 1.f + (SatLow * krl) * kl * ksat * rlo * balanS; //0.4 + const float factor = 20000.f * SatLow * kl * rlo * balanS; if (krl > 0.f) { - g -= 20000.f * (RedL - 1.f) * ksatlow; - b -= 20000.f * (RedL - 1.f) * ksatlow; + g -= factor * krl; + b -= factor * krl; } - g = CLIP (g); - b = CLIP (b); - - GreenL = 1.f + (SatLow * kgl) * kl * ksat * rlo * balanS; //0.4 + g = CLIP(g); + b = CLIP(b); if (kgl > 0.f) { - r -= 20000.f * (GreenL - 1.f) * ksatlow; - b -= 20000.f * (GreenL - 1.f) * ksatlow; + r -= factor * kgl; + b -= factor * kgl; } - r = CLIP (r); - b = CLIP (b); - - BlueL = 1.f + (SatLow * kbl) * kl * ksat * rlo * balanS; //0.4 + r = CLIP(r); + b = CLIP(b); if (kbl > 0.f) { - r -= 20000.f * (BlueL - 1.f) * ksatlow; - g -= 20000.f * (BlueL - 1.f) * ksatlow; + r -= factor * kbl; + g -= factor * kbl; } - r = CLIP (r); - g = CLIP (g); + r = CLIP(r); + g = CLIP(g); } //high tones - float kh = 1.f; float aa0, bb0; //fixed value of reducac ==0.4; secondeg_begin (reducac, iphigh, aa0, bb0); - if (v > iphigh) { - kh = (-1.f / (1.f - iphigh)) * v + (1.f) / (1.f - iphigh); //Low light ==> decrease action after iplow - } else { - kh = aa0 * v * v + bb0 * v; - } - - - if (g > 45535.f || b > 45535.f || r > 45535.f) { - float kmgb = max (r, g, b); - float cora = 1.f / (45535.f - 65535.f); - float corb = 1.f - cora * 45535.f; - float cor = kmgb * cora + corb; - kh *= cor; - /* best algo if necessary with non linear response...little differences and more time! - float aa=1.f /(pow(45535.f,0.65f) - pow(65535.f,0.65f)); - float bb=1.f-aa*pow(45535.f,0.65f); - float cor=aa*pow(kmbg,0.65f)+bb; - kh*=cor;*/ - } - - if (SatHigh > 0.f) { - float RedH, GreenH, BlueH; - float krh = rh / (rh + gh + bh); - float kgh = gh / (rh + gh + bh); - float kbh = bh / (rh + gh + bh); - RedH = 1.f + (SatHigh * krh) * kh * rlh * balanH; //1.2 - - if (krh > 0.f) { - r += 20000.f * (RedH - 1.f); - r = CLIP (r); - } - - g = CLIP (g); - b = CLIP (b); - - GreenH = 1.f + (SatHigh * kgh) * kh * rlh * balanH; //1.2 - - if (kgh > 0.f) { - g += 20000.f * (GreenH - 1.f); - g = CLIP (g); - } - - r = CLIP (r); - b = CLIP (b); - BlueH = 1.f + (SatHigh * kbh) * kh * rlh * balanH; //1.2 - - if (kbh > 0.f) { - b += 20000.f * (BlueH - 1.f); - b = CLIP (b); + float kh = 1.f; + if (v > iphigh) { + kh = (1.f - v) / (1.f - iphigh); //Low light ==> decrease action after iplow + } else { + kh = aa0 * v * v + bb0 * v; } - r = CLIP (r); - g = CLIP (g); + const float kmgb = max(r, g, b); + if (kmgb > 45535.f) { + constexpr float cora = 1.f / (45535.f - 65535.f); + constexpr float corb = 1.f - cora * 45535.f; + kh *= kmgb * cora + corb; + } + const float factor = 20000.f * SatHigh * kh * rlh * balanH; + r += factor * (krh > 0.f ? krh : 0.f); + g += factor * (kgh > 0.f ? kgh : 0.f); + b += factor * (kbh > 0.f ? kbh : 0.f); + + r = CLIP(r); + g = CLIP(g); + b = CLIP(b); } - float lumafter = 0.299f * r + 0.587f * g + 0.114f * b; float preserv = 1.f; - if (preser == 1) { + float lumafter = 0.299f * r + 0.587f * g + 0.114f * b; preserv = lumbefore / lumafter; } - //float preserv=lumbefore/lumafter; - ro = r; - go = g; - bo = b; - ro *= preserv; - go *= preserv; - bo *= preserv; - ro = CLIP (ro); - go = CLIP (go); - bo = CLIP (bo); + ro = CLIP(r * preserv); + go = CLIP(g * preserv); + bo = CLIP(b * preserv); } /** @@ -5562,8 +5366,6 @@ float opacity2 = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)); //float ro, go, bo; - bool chr = true; - bool lum = false; float lm = l; float chromat, luma; @@ -5579,12 +5381,10 @@ luma = 1.f - SQR (SQR ((lm * 65535.f) / (cl2Toningcurve[ (lm) * 65535.f]))); //apply C2=f(L) acts only on 'b' } - int todo = 1; - if (algm == 1) { - Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity, twoc, metchrom, chr, lum, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, todo, wp, wip, ro, go, bo); + Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); } else { - Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chr, lum, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, todo, wp, wip, ro, go, bo); + Color::interpolateRGBColor (realL, iplow, iphigh, algm, opacity2, twoc, metchrom, chromat, luma, r, g, b, xl, yl, zl, x2, y2, z2, wp, wip, ro, go, bo); } } @@ -5607,8 +5407,12 @@ -SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) +void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf & acurve, LUTf & bcurve, LUTf & satcurve, LUTf & lhskcurve, LUTf & clcurve, LUTf & curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLCurve) { + if (!params->labCurve.enabled) { + return; + } + int W = lold->W; int H = lold->H; // lhskcurve.dump("lh_curve"); @@ -5824,7 +5628,7 @@ // only if user activate Lab adjustments if (autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity) { - Color::LabGamutMunsell (lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip, multiThread); + Color::LabGamutMunsell (lold->L[i], lold->a[i], lold->b[i], W, /*corMunsell*/true, /*lumaMuns*/false, params->toneCurve.hrenabled, /*gamut*/true, wip); } #ifdef __SSE2__ @@ -5979,7 +5783,7 @@ Lprov1 = l_r * 100.f; float Chprov2 = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; - //Gamut control especialy fot negative values slightly different of gamutlchonly + //Gamut control especially for negative values slightly different from gamutlchonly bool inRGB; do { @@ -5987,7 +5791,7 @@ float aprov1 = Chprov2 * sincosval.y; float bprov1 = Chprov2 * sincosval.x; - float fy = (0.00862069f * Lprov1 ) + 0.137932f; + float fy = (Color::c1By116 * Lprov1 ) + Color::c16By116; float fx = (0.002f * aprov1) + fy; float fz = fy - (0.005f * bprov1); @@ -6077,7 +5881,7 @@ editWhatever->v (i, j) = LIM01 (LL / 100.f); // Lab C=f(L) pipette } - if (clut) { // begin C=f(L) + if (clut && LL > 0.f) { // begin C=f(L) float factorskin, factorsat, factor, factorskinext; float chromaCfactor = (clcurve[LL * 655.35f]) / (LL * 655.35f); //apply C=f(L) float curf = 0.7f; //empirical coeff because curve is more progressive @@ -6378,8 +6182,8 @@ //#include "cubic.cc" -void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) -{ +//void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) +//{ /* LUT cmultiplier(181021); @@ -6456,7 +6260,7 @@ } */ //delete [] cmultiplier; -} +//} void ImProcFunctions::impulsedenoise (LabImage* lab) { @@ -6495,28 +6299,26 @@ } } -void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad) +void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float skinprot, float chrom, int hotbad) { if (ncie->W >= 8 && ncie->H >= 8) { - Badpixelscam (ncie, ncie, rad, thr, mode, b_l, t_l, t_r, b_r, skinprot, chrom, hotbad); + Badpixelscam (ncie, ncie, rad, thr, mode, skinprot, chrom, hotbad); } } -void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom) +void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom) { if (lab->W >= 8 && lab->H >= 8) { - BadpixelsLab (lab, lab, rad, thr, mode, b_l, t_l, t_r, b_r, skinprot, chrom); + BadpixelsLab (lab, lab, rad, thr, mode, skinprot, chrom); } } void ImProcFunctions::dirpyrequalizer (LabImage* lab, int scale) { if (params->dirpyrequalizer.enabled && lab->W >= 8 && lab->H >= 8) { - float b_l = static_cast (params->dirpyrequalizer.hueskin.value[0]) / 100.0f; - float t_l = static_cast (params->dirpyrequalizer.hueskin.value[1]) / 100.0f; - float b_r = static_cast (params->dirpyrequalizer.hueskin.value[2]) / 100.0f; - float t_r = static_cast (params->dirpyrequalizer.hueskin.value[3]) / 100.0f; - int choice = 0; //I have not disabled this statement in case of ! always 0 + float b_l = static_cast (params->dirpyrequalizer.hueskin.getBottomLeft()) / 100.0f; + float t_l = static_cast (params->dirpyrequalizer.hueskin.getTopLeft()) / 100.0f; + float t_r = static_cast (params->dirpyrequalizer.hueskin.getTopRight()) / 100.0f; // if (params->dirpyrequalizer.algo=="FI") choice=0; // else if(params->dirpyrequalizer.algo=="LA") choice=1; float artifact = (float) settings->artifact_cbdl; @@ -6532,14 +6334,14 @@ float chrom = 50.f; if (params->dirpyrequalizer.gamutlab) { - ImProcFunctions::badpixlab (lab, artifact, 5, 3, b_l, t_l, t_r, b_r, params->dirpyrequalizer.skinprotect, chrom); //for artifacts + ImProcFunctions::badpixlab (lab, artifact, 5, 3, params->dirpyrequalizer.skinprotect, chrom); //for artifacts } //dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult); - dirpyr_equalizer (lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, params->dirpyrequalizer.gamutlab, b_l, t_l, t_r, b_r, choice, scale); + dirpyr_equalizer (lab->L, lab->L, lab->W, lab->H, lab->a, lab->b, params->dirpyrequalizer.mult, params->dirpyrequalizer.threshold, params->dirpyrequalizer.skinprotect, b_l, t_l, t_r, scale); } } -void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates, int skip) +void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates, int skip) { if (!params->epd.enabled) { @@ -6608,7 +6410,7 @@ for (int i=heir; iQ_p[i][j];} - if(minQ>0.0) minQ=0.0;//normaly minQ always > 0... + if(minQ>0.0) minQ=0.0;//normally minQ always > 0... // EdgePreservingDecomposition epd = EdgePreservingDecomposition(Wid, Hei); //EdgePreservingDecomposition epd = EdgePreservingDecomposition(Wid, Hei/2); for(i = N2; i != N; i++) @@ -6752,7 +6554,7 @@ } -void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double defgain, double clip, +void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh) { @@ -6983,7 +6785,7 @@ gavg /= sum; if (black < gavg) { - int maxwhiteclip = (gavg - black) * 4 / 3 + black; // dont let whiteclip be such large that the histogram average goes above 3/4 + int maxwhiteclip = (gavg - black) * 4 / 3 + black; // don't let whiteclip be such large that the histogram average goes above 3/4 if (whiteclipg < maxwhiteclip) { whiteclipg = maxwhiteclip; @@ -7029,7 +6831,7 @@ gavg += histogram[i] * CurveFactory::gamma2((int)(corr*(i<workingSpaceInverseMatrix ( workingSpace ); const float wip[3][3] = { @@ -7204,4 +7007,41 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ +void ImProcFunctions::colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread) +{ + const float factor = ColorToningParams::LABGRID_CORR_MAX * 3.f; + float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor; + float a_base = params->colorToning.labgridALow; + float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor; + float b_base = params->colorToning.labgridBLow; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = ystart; y < yend; ++y) { + for (int x = xstart; x < xend; ++x) { + lab->a[y][x] += lab->L[y][x] * a_scale + a_base; + lab->b[y][x] += lab->L[y][x] * b_scale + b_base; + } + } +} + } diff -Nru rawtherapee-5.3/rtengine/improcfun.h rawtherapee-5.4/rtengine/improcfun.h --- rawtherapee-5.3/rtengine/improcfun.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/improcfun.h 2018-03-20 11:04:15.000000000 +0000 @@ -54,13 +54,9 @@ void calcVignettingParams (int oW, int oH, const VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul); - enum TransformMode { - TRANSFORM_PREVIEW, - TRANSFORM_HIGH_QUALITY, - TRANSFORM_HIGH_QUALITY_FULLIMAGE - }; void transformLuminanceOnly (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int oW, int oH, int fW, int fH); - void transformGeneral(TransformMode mode, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap); + void transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap); + void transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap); void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, int W, int H, const SharpeningParams &sharpenParam); void sharpenHaloCtrl (LabImage* lab, float** blurmap, float** base, int W, int H, SharpeningParams &sharpenParam); @@ -220,7 +216,7 @@ double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve); void labtoning (float r, float g, float b, float &ro, float &go, float &bo, int algm, int metchrom, int twoc, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, LUTf & clToningcurve, LUTf & cl2Toningcurve, float iplow, float iphigh, double wp[3][3], double wip[3][3] ); void toning2col (float r, float g, float b, float &ro, float &go, float &bo, float iplow, float iphigh, float rl, float gl, float bl, float rh, float gh, float bh, float SatLow, float SatHigh, float balanS, float balanH, float reducac, int mode, int preser, float strProtect); - void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, int preser, float strProtect); + void toningsmh (float r, float g, float b, float &ro, float &go, float &bo, float RedLow, float GreenLow, float BlueLow, float RedMed, float GreenMed, float BlueMed, float RedHigh, float GreenHigh, float BlueHigh, float reducac, int mode, float strProtect); void toningsmh2 (float r, float g, float b, float &ro, float &go, float &bo, float low[3], float satLow, float med[3], float satMed, float high[3], float satHigh, float reducac, int mode, int preser); void secondeg_begin (float reducac, float vend, float &aam, float &bbm); void secondeg_end (float reducac, float vinf, float &aa, float &bb, float &cc); @@ -229,23 +225,23 @@ void moyeqt (Imagefloat* working, float &moyS, float &eqty); void luminanceCurve (LabImage* lold, LabImage* lnew, LUTf &curve); - void ciecam_02float (CieImage* ncie, float adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, + void ciecam_02float (CieImage* ncie, float adap, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt); - void ciecam_02 (CieImage* ncie, double adap, int begh, int endh, int pW, int pwb, LabImage* lab, const ProcParams* params, + void ciecam_02 (CieImage* ncie, double adap, int pW, int pwb, LabImage* lab, const ProcParams* params, const ColorAppearance & customColCurve1, const ColorAppearance & customColCurve, const ColorAppearance & customColCurve3, - LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, double &yb, int rtt); + LUTu &histLCAM, LUTu &histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, double &d, double &dj, int rtt); void chromiLuminanceCurve (PipetteBuffer *pipetteBuffer, int pW, LabImage* lold, LabImage* lnew, LUTf &acurve, LUTf &bcurve, LUTf & satcurve, LUTf & satclcurve, LUTf &clcurve, LUTf &curve, bool utili, bool autili, bool butili, bool ccutili, bool cclutili, bool clcutili, LUTu &histCCurve, LUTu &histLurve); void vibrance (LabImage* lab);//Jacques' vibrance - void colorCurve (LabImage* lold, LabImage* lnew); +// void colorCurve (LabImage* lold, LabImage* lnew); void sharpening (LabImage* lab, float** buffer, SharpeningParams &sharpenParam); void sharpeningcam (CieImage* ncie, float** buffer); - void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const ImageMetaData *metadata, int rawRotationDeg, bool fullImage); + void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const FramesMetaData *metadata, int rawRotationDeg, bool fullImage); float resizeScale (const ProcParams* params, int fw, int fh, int &imw, int &imh); void lab2monitorRgb (LabImage* lab, Image8* image); - void resize (Image16* src, Image16* dst, float dScale); + void resize (Imagefloat* src, Imagefloat* dst, float dScale); void Lanczos (const LabImage* src, LabImage* dst, float scale); - void Lanczos (const Image16* src, Image16* dst, float scale); + void Lanczos (const Imagefloat* src, Imagefloat* dst, float scale); void deconvsharpening (float** luminance, float** buffer, int W, int H, const SharpeningParams &sharpenParam); void MLsharpen (LabImage* lab);// Manuel's clarity / sharpening @@ -263,12 +259,12 @@ void EPDToneMapResid (float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0); - float *CompressDR (float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Compressed); - void ContrastResid (float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params &cp, int W_L, int H_L, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx); - float *ContrastDR (float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Contrast = nullptr); + float *CompressDR (float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed); + void ContrastResid (float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); + float *ContrastDR (float *Source, int W_L, int H_L, float *Contrast = nullptr); void EPDToneMap (LabImage *lab, unsigned int Iterates = 0, int skip = 1); - void EPDToneMapCIE (CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1); + void EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wid, int Hei, float minQ, float maxQ, unsigned int Iterates = 0, int skip = 1); // pyramid denoise procparams::DirPyrDenoiseParams dnparams; @@ -278,25 +274,25 @@ int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/ ); void Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip); - void ip_wavelet (LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, bool wavcontlutili, int skip); + void ip_wavelet (LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip); void WaveletcontAllL (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, - struct cont_params &cp, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, FlatCurve* ChCurve, bool Chutili); + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); void WaveletcontAllLfinal (wavelet_decomposition &WaveletCoeffs_L, struct cont_params &cp, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void WaveletcontAllAB (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, const bool useChannelA); - void WaveletAandBAllAB (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, - struct cont_params &cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhcurve, bool hhutili); + void WaveletAandBAllAB (wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, + struct cont_params &cp, FlatCurve* hhcurve, bool hhutili); void ContAllL (float **koeLi, float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * lab, float **varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili); void finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, int W_L, int H_L, float *mean, float *sigma, float *MaxP, const WavOpacityCurveWL & waOpacityCurveWL); void ContAllAB (LabImage * lab, int maxlvl, float **varhue, float **varchrom, float ** WavCoeffs_a, float * WavCoeffs_a0, int level, int dir, const WavOpacityCurveW & waOpacityCurveW, struct cont_params &cp, int W_ab, int H_ab, const bool useChannelA); void Evaluate2 (wavelet_decomposition &WaveletCoeffs_L, - const struct cont_params& cp, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float madL[8][3]); - void Eval2 (float ** WavCoeffs_L, int level, const struct cont_params& cp, - int W_L, int H_L, int skip_L, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float *madL); + float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); + void Eval2 (float ** WavCoeffs_L, int level, + int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN); void Aver (float * HH_Coeffs, int datalen, float &averagePlus, float &averageNeg, float &max, float &min); void Sigma (float * HH_Coeffs, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg); @@ -305,7 +301,8 @@ void Median_Denoise ( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); - void RGB_denoise (int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &chaut, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &nresi, float &highresi); + void Median_Denoise ( float **src, float **dst, float upperBound, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); + void RGB_denoise (int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi); void RGB_denoise_infoGamCurve (const procparams::DirPyrDenoiseParams & dnparams, const bool isRAW, LUTf &gamcurve, float &gam, float &gamthresh, float &gamslope); void RGB_denoise_info (Imagefloat * src, Imagefloat * provicalc, bool isRAW, LUTf &gamcurve, float gam, float gamthresh, float gamslope, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float & maxblueaut, float &minredaut, float & minblueaut, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, bool multiThread = false); void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ); //for DCT @@ -313,8 +310,8 @@ bool WaveletDenoiseAllL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge); bool WaveletDenoiseAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); void WaveletDenoiseAll_info (int levwav, wavelet_decomposition &WaveletCoeffs_a, - wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, bool autoch, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, - float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread); + wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float & minblueaut, int schoice, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, + float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); bool WaveletDenoiseAll_BiShrinkL (wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3]); bool WaveletDenoiseAll_BiShrinkAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float noisevar_ab, @@ -322,9 +319,9 @@ void ShrinkAllL (wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, float *noisevarlum, float * madL, float * vari, int edge); void ShrinkAllAB (wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, float * madL, float * madaab = nullptr, bool madCalculated = false); - void ShrinkAll_info (float ** WavCoeffs_a, float ** WavCoeffs_b, int level, - int W_ab, int H_ab, int skip_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, bool autoch, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, - float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread); + void ShrinkAll_info (float ** WavCoeffs_a, float ** WavCoeffs_b, + int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, int lvl, float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, + float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb); void Noise_residualAB (wavelet_decomposition &WaveletCoeffs_ab, float &chresid, float &chmaxresid, bool denoiseMethodRgb); void calcautodn_info (float &chaut, float &delta, int Nb, int levaut, float maxmax, float lumema, float chromina, int mode, int lissage, float redyel, float skinc, float nsknc); float MadMax (float * DataList, int &max, int datalen); @@ -332,28 +329,32 @@ float MadRgb (float * DataList, const int datalen); // pyramid wavelet - void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, float ** dest_a, float ** dest_b, const double * mult, const double dirpyrThreshold, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale);//Emil's directional pyramid wavelet - void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale);//Emil's directional pyramid wavelet + void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, int scale);//Emil's directional pyramid wavelet + void dirpyr_equalizercam (CieImage* ncie, float ** src, float ** dst, int srcwidth, int srcheight, float ** h_p, float ** C_p, const double * mult, const double dirpyrThreshold, const double skinprot, bool execdir, float b_l, float t_l, float t_r, int scale);//Emil's directional pyramid wavelet void dirpyr_channel (float ** data_fine, float ** data_coarse, int width, int height, int level, int scale); - void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice); + void idirpyr_eq_channel (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r); void idirpyr_eq_channelcam (float ** data_coarse, float ** data_fine, float ** buffer, int width, int height, int level, float multi[6], const double dirpyrThreshold, float ** l_a_h, float ** l_b_c, const double skinprot, float b_l, float t_l, float t_r); void defringe (LabImage* lab); void defringecam (CieImage* ncie); - void badpixcam (CieImage* ncie, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad); - void badpixlab (LabImage* lab, double rad, int thr, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom); + void badpixcam (CieImage* ncie, double rad, int thr, int mode, float skinprot, float chrom, int hotbad); + void badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom); void PF_correct_RT (LabImage * src, LabImage * dst, double radius, int thresh); void PF_correct_RTcam (CieImage * src, CieImage * dst, double radius, int thresh); - void Badpixelscam (CieImage * src, CieImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad); - void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom); + void Badpixelscam (CieImage * src, CieImage * dst, double radius, int thresh, int mode, float skinprot, float chrom, int hotbad); + void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom); - Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm); - Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga = nullptr); + void ToneMapFattal02(Imagefloat *rgb); + void localContrast(LabImage *lab); + void colorToningLabGrid(LabImage *lab, int xstart, int xend, int ystart, int yend, bool MultiThread); + + Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings=true); + Imagefloat* lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); // CieImage *ciec; bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); bool transCoord (int W, int H, const std::vector &src, std::vector &red, std::vector &green, std::vector &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); - static void getAutoExp (const LUTu & histogram, int histcompr, double defgain, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh); + static void getAutoExp (const LUTu & histogram, int histcompr, double clip, double& expcomp, int& bright, int& contr, int& black, int& hlcompr, int& hlcomprthresh); static double getAutoDistor (const Glib::ustring& fname, int thumb_size); double getTransformAutoFill (int oW, int oH, const LensCorrection *pLCPMap = nullptr); void rgb2lab (const Imagefloat &src, LabImage &dst, const Glib::ustring &workingSpace); diff -Nru rawtherapee-5.3/rtengine/impulse_denoise.cc rawtherapee-5.4/rtengine/impulse_denoise.cc --- rawtherapee-5.3/rtengine/impulse_denoise.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/impulse_denoise.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,557 @@ +/* + * This file is part of RawTherapee. + * + * 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 widthITheightOUT ANY widthARRANTY; without even the implied warranty of + * MERCheightANTABILITY 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 . + * + * 2010 Emil Martinec + * + */ +#include +#include "rt_math.h" +#include "labimage.h" +#include "improcfun.h" +#include "cieimage.h" +#include "sleef.c" +#include "opthelper.h" +#include "gauss.h" + +using namespace std; + +namespace rtengine +{ + +void ImProcFunctions::impulse_nr (LabImage* lab, double thresh) +{ + // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // impulse noise removal + // local variables + + int width = lab->W; + int height = lab->H; + + // buffer for the lowpass image + float * lpf[height] ALIGNED16; + lpf[0] = new float [width * height]; + // buffer for the highpass image + char * impish[height] ALIGNED16; + impish[0] = new char [width * height]; + + for (int i = 1; i < height; i++) { + lpf[i] = lpf[i - 1] + width; + impish[i] = impish[i - 1] + width; + } + + + //The cleaning algorithm starts here + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // modified bilateral filter for lowpass image, omitting input pixel; or Gaussian blur + + const float eps = 1.0; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur (lab->L, lpf, width, height, max(2.0, thresh - 1.0)); + } + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + float impthr = max(1.0, 5.5 - thresh); + float impthrDiv24 = impthr / 24.0f; //Issue 1671: moved the Division outside the loop, impthr can be optimized out too, but I let in the code at the moment + + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int i1, j1, j; + float hpfabs, hfnbrave; +#ifdef __SSE2__ + vfloat hfnbravev, hpfabsv; + vfloat impthrDiv24v = F2V( impthrDiv24 ); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < height; i++) { + for (j = 0; j < 2; j++) { + hpfabs = fabs(lab->L[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = 0; j1 <= j + 2; j1++) { + hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + +#ifdef __SSE2__ + + for (; j < width - 5; j += 4) { + hfnbravev = ZEROV; + hpfabsv = vabsf(LVFU(lab->L[i][j]) - LVFU(lpf[i][j])); + + //block average of high pass data + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) { + for (j1 = j - 2; j1 <= j + 2; j1++) { + hfnbravev += vabsf(LVFU(lab->L[i1][j1]) - LVFU(lpf[i1][j1])); + } + } + + int mask = _mm_movemask_ps((hfnbravev - hpfabsv) * impthrDiv24v - hpfabsv); + impish[i][j] = (mask & 1); + impish[i][j + 1] = ((mask & 2) >> 1); + impish[i][j + 2] = ((mask & 4) >> 2); + impish[i][j + 3] = ((mask & 8) >> 3); + } + +#endif + + for (; j < width - 2; j++) { + hpfabs = fabs(lab->L[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 <= j + 2; j1++) { + hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + + for (; j < width; j++) { + hpfabs = fabs(lab->L[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 < width; j1++) { + hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + } + } + +//now impulsive values have been identified + +// Issue 1671: +// often, noise isn't evenly distributed, e.g. only a few noisy pixels in the bright sky, but many in the dark foreground, +// so it's better to schedule dynamic and let every thread only process 16 rows, to avoid running big threads out of work +// Measured it and in fact gives better performance than without schedule(dynamic,16). Of course, there could be a better +// choice for the chunk_size than 16 +// race conditions are avoided by the array impish +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int i1, j1, j; + float wtdsum[3], dirwt, norm; +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < height; i++) { + for (j = 0; j < 2; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = 0; j1 <= j + 2; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * lab->L[i1][j1]; + wtdsum[1] += dirwt * lab->a[i1][j1]; + wtdsum[2] += dirwt * lab->b[i1][j1]; + norm += dirwt; + } + + if (norm) { + lab->L[i][j] = wtdsum[0] / norm; //low pass filter + lab->a[i][j] = wtdsum[1] / norm; //low pass filter + lab->b[i][j] = wtdsum[2] / norm; //low pass filter + } + } + + for (; j < width - 2; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 <= j + 2; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * lab->L[i1][j1]; + wtdsum[1] += dirwt * lab->a[i1][j1]; + wtdsum[2] += dirwt * lab->b[i1][j1]; + norm += dirwt; + } + + if (norm) { + lab->L[i][j] = wtdsum[0] / norm; //low pass filter + lab->a[i][j] = wtdsum[1] / norm; //low pass filter + lab->b[i][j] = wtdsum[2] / norm; //low pass filter + } + } + + for (; j < width; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 < width; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * lab->L[i1][j1]; + wtdsum[1] += dirwt * lab->a[i1][j1]; + wtdsum[2] += dirwt * lab->b[i1][j1]; + norm += dirwt; + } + + if (norm) { + lab->L[i][j] = wtdsum[0] / norm; //low pass filter + lab->a[i][j] = wtdsum[1] / norm; //low pass filter + lab->b[i][j] = wtdsum[2] / norm; //low pass filter + } + } + } + } +//now impulsive values have been corrected + + delete [] lpf[0]; + delete [] impish[0]; + +} + + +void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buffers[3]) +{ + // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // impulse noise removal + // local variables + + int width = ncie->W; + int height = ncie->H; + + + float piid = 3.14159265f / 180.f; + + // buffer for the lowpass image + float ** lpf = buffers[0]; + // buffer for the highpass image + float ** impish = buffers[1]; + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // modified bilateral filter for lowpass image, omitting input pixel; or Gaussian blur + + + + //The cleaning algorithm starts here + + //rangeblur (lab->L, lpf, impish /*used as buffer here*/, width, height, thresh, false); +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur (ncie->sh_p, lpf, width, height, max(2.0, thresh - 1.0)); + } + + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + float impthr = max(1.0f, 5.0f - (float)thresh); + float impthrDiv24 = impthr / 24.0f; //Issue 1671: moved the Division outside the loop, impthr can be optimized out too, but I let in the code at the moment + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int i1, j1, j; + float hpfabs, hfnbrave; +#ifdef __SSE2__ + vfloat hfnbravev, hpfabsv; + vfloat impthrDiv24v = F2V( impthrDiv24 ); + vfloat onev = F2V( 1.0f ); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < height; i++) { + for (j = 0; j < 2; j++) { + hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = 0; j1 <= j + 2; j1++) { + hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + +#ifdef __SSE2__ + + for (; j < width - 5; j += 4) { + hpfabsv = vabsf(LVFU(ncie->sh_p[i][j]) - LVFU(lpf[i][j])); + hfnbravev = ZEROV; + + //block average of high pass data + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) { + for (j1 = j - 2; j1 <= j + 2; j1++ ) { + hfnbravev += vabsf(LVFU(ncie->sh_p[i1][j1]) - LVFU(lpf[i1][j1])); + } + + } + + STVFU(impish[i][j], vselfzero(vmaskf_gt(hpfabsv, (hfnbravev - hpfabsv)*impthrDiv24v), onev)); + } + +#endif + + for (; j < width - 2; j++) { + hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 <= j + 2; j1++ ) { + hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + + for (; j < width; j++) { + hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); + + //block average of high pass data + for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 < width; j1++ ) { + hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); + } + + impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); + } + } + } + +//now impulsive values have been identified + + const float eps = 1.0f; + + float** sraa = buffers[0]; // we can reuse buffers[0] because lpf is not needed anymore at this point + float** srbb = buffers[2]; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + +#ifdef __SSE2__ + vfloat2 sincosvalv; + vfloat piidv = F2V( piid ); + vfloat tempv; +#endif +#ifdef _OPENMP + #pragma omp for +#endif + + for (int i = 0; i < height; i++) { + int j = 0; +#ifdef __SSE2__ + + for (; j < width - 3; j += 4) { + sincosvalv = xsincosf(piidv * LVFU(ncie->h_p[i][j])); + tempv = LVFU(ncie->C_p[i][j]); + STVFU(sraa[i][j], tempv * sincosvalv.y); + STVFU(srbb[i][j], tempv * sincosvalv.x); + } + +#endif + + for (; j < width; j++) { + float2 sincosval = xsincosf(piid * ncie->h_p[i][j]); + sraa[i][j] = ncie->C_p[i][j] * sincosval.y; + srbb[i][j] = ncie->C_p[i][j] * sincosval.x; + } + } + } + +// Issue 1671: +// often, noise isn't evenly distributed, e.g. only a few noisy pixels in the bright sky, but many in the dark foreground, +// so it's better to schedule dynamic and let every thread only process 16 rows, to avoid running big threads out of work +// Measured it and in fact gives better performance than without schedule(dynamic,16). Of course, there could be a better +// choice for the chunk_size than 16 +// race conditions are avoided by the array impish +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int i1, j1, j; + float wtdsum[3], dirwt, norm; +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < height; i++) { + for (j = 0; j < 2; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0f; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = 0; j1 <= j + 2; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; + wtdsum[1] += dirwt * sraa[i1][j1]; + wtdsum[2] += dirwt * srbb[i1][j1]; + norm += dirwt; + } + + if (norm) { + ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter + sraa[i][j] = wtdsum[1] / norm; //low pass filter + srbb[i][j] = wtdsum[2] / norm; //low pass filter + } + } + + for (; j < width - 2; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0f; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 <= j + 2; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; + wtdsum[1] += dirwt * sraa[i1][j1]; + wtdsum[2] += dirwt * srbb[i1][j1]; + norm += dirwt; + } + + if (norm) { + ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter + sraa[i][j] = wtdsum[1] / norm; //low pass filter + srbb[i][j] = wtdsum[2] / norm; //low pass filter + } + } + + for (; j < width; j++) { + if (!impish[i][j]) { + continue; + } + + norm = 0.0f; + wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; + + for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) + for (j1 = j - 2; j1 < width; j1++ ) { + if (impish[i1][j1]) { + continue; + } + + dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? + wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; + wtdsum[1] += dirwt * sraa[i1][j1]; + wtdsum[2] += dirwt * srbb[i1][j1]; + norm += dirwt; + } + + if (norm) { + ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter + sraa[i][j] = wtdsum[1] / norm; //low pass filter + srbb[i][j] = wtdsum[2] / norm; //low pass filter + } + } + } + } + +//now impulsive values have been corrected + +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef __SSE2__ + vfloat interav, interbv; + vfloat piidv = F2V(piid); +#endif // __SSE2__ +#ifdef _OPENMP + #pragma omp for +#endif + + for(int i = 0; i < height; i++ ) { + int j = 0; +#ifdef __SSE2__ + + for(; j < width - 3; j += 4) { + interav = LVFU(sraa[i][j]); + interbv = LVFU(srbb[i][j]); + STVFU(ncie->h_p[i][j], (xatan2f(interbv, interav)) / piidv); + STVFU(ncie->C_p[i][j], vsqrtf(SQRV(interbv) + SQRV(interav))); + } + +#endif + + for(; j < width; j++) { + float intera = sraa[i][j]; + float interb = srbb[i][j]; + ncie->h_p[i][j] = (xatan2f(interb, intera)) / piid; + ncie->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); + } + } + } + +} + + +} diff -Nru rawtherapee-5.3/rtengine/impulse_denoise.h rawtherapee-5.4/rtengine/impulse_denoise.h --- rawtherapee-5.3/rtengine/impulse_denoise.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/impulse_denoise.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,557 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * 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 widthITheightOUT ANY widthARRANTY; without even the implied warranty of - * MERCheightANTABILITY 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 . - * - * 2010 Emil Martinec - * - */ -#include -#include "rt_math.h" -#include "labimage.h" -#include "improcfun.h" -#include "cieimage.h" -#include "sleef.c" -#include "opthelper.h" -#include "gauss.h" - -using namespace std; - -namespace rtengine -{ - -SSEFUNCTION void ImProcFunctions::impulse_nr (LabImage* lab, double thresh) -{ - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // impulse noise removal - // local variables - - int width = lab->W; - int height = lab->H; - - // buffer for the lowpass image - float * lpf[height] ALIGNED16; - lpf[0] = new float [width * height]; - // buffer for the highpass image - char * impish[height] ALIGNED16; - impish[0] = new char [width * height]; - - for (int i = 1; i < height; i++) { - lpf[i] = lpf[i - 1] + width; - impish[i] = impish[i - 1] + width; - } - - - //The cleaning algorithm starts here - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // modified bilateral filter for lowpass image, omitting input pixel; or Gaussian blur - - const float eps = 1.0; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - gaussianBlur (lab->L, lpf, width, height, max(2.0, thresh - 1.0)); - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - float impthr = max(1.0, 5.5 - thresh); - float impthrDiv24 = impthr / 24.0f; //Issue 1671: moved the Division outside the loop, impthr can be optimized out too, but I let in the code at the moment - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int i1, j1, j; - float hpfabs, hfnbrave; -#ifdef __SSE2__ - vfloat hfnbravev, hpfabsv; - vfloat impthrDiv24v = F2V( impthrDiv24 ); -#endif -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - hpfabs = fabs(lab->L[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++) { - hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - -#ifdef __SSE2__ - - for (; j < width - 5; j += 4) { - hfnbravev = ZEROV; - hpfabsv = vabsf(LVFU(lab->L[i][j]) - LVFU(lpf[i][j])); - - //block average of high pass data - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) { - for (j1 = j - 2; j1 <= j + 2; j1++) { - hfnbravev += vabsf(LVFU(lab->L[i1][j1]) - LVFU(lpf[i1][j1])); - } - } - - int mask = _mm_movemask_ps((hfnbravev - hpfabsv) * impthrDiv24v - hpfabsv); - impish[i][j] = (mask & 1); - impish[i][j + 1] = ((mask & 2) >> 1); - impish[i][j + 2] = ((mask & 4) >> 2); - impish[i][j + 3] = ((mask & 8) >> 3); - } - -#endif - - for (; j < width - 2; j++) { - hpfabs = fabs(lab->L[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++) { - hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - - for (; j < width; j++) { - hpfabs = fabs(lab->L[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++) { - hfnbrave += fabs(lab->L[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - } - } - -//now impulsive values have been identified - -// Issue 1671: -// often, noise isn't evenly distributed, e.g. only a few noisy pixels in the bright sky, but many in the dark foreground, -// so it's better to schedule dynamic and let every thread only process 16 rows, to avoid running big threads out of work -// Measured it and in fact gives better performance than without schedule(dynamic,16). Of course, there could be a better -// choice for the chunk_size than 16 -// race conditions are avoided by the array impish -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int i1, j1, j; - float wtdsum[3], dirwt, norm; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * lab->L[i1][j1]; - wtdsum[1] += dirwt * lab->a[i1][j1]; - wtdsum[2] += dirwt * lab->b[i1][j1]; - norm += dirwt; - } - - if (norm) { - lab->L[i][j] = wtdsum[0] / norm; //low pass filter - lab->a[i][j] = wtdsum[1] / norm; //low pass filter - lab->b[i][j] = wtdsum[2] / norm; //low pass filter - } - } - - for (; j < width - 2; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * lab->L[i1][j1]; - wtdsum[1] += dirwt * lab->a[i1][j1]; - wtdsum[2] += dirwt * lab->b[i1][j1]; - norm += dirwt; - } - - if (norm) { - lab->L[i][j] = wtdsum[0] / norm; //low pass filter - lab->a[i][j] = wtdsum[1] / norm; //low pass filter - lab->b[i][j] = wtdsum[2] / norm; //low pass filter - } - } - - for (; j < width; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1 / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * lab->L[i1][j1]; - wtdsum[1] += dirwt * lab->a[i1][j1]; - wtdsum[2] += dirwt * lab->b[i1][j1]; - norm += dirwt; - } - - if (norm) { - lab->L[i][j] = wtdsum[0] / norm; //low pass filter - lab->a[i][j] = wtdsum[1] / norm; //low pass filter - lab->b[i][j] = wtdsum[2] / norm; //low pass filter - } - } - } - } -//now impulsive values have been corrected - - delete [] lpf[0]; - delete [] impish[0]; - -} - - -SSEFUNCTION void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buffers[3]) -{ - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // impulse noise removal - // local variables - - int width = ncie->W; - int height = ncie->H; - - - float piid = 3.14159265f / 180.f; - - // buffer for the lowpass image - float ** lpf = buffers[0]; - // buffer for the highpass image - float ** impish = buffers[1]; - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - // modified bilateral filter for lowpass image, omitting input pixel; or Gaussian blur - - - - //The cleaning algorithm starts here - - //rangeblur (lab->L, lpf, impish /*used as buffer here*/, width, height, thresh, false); -#ifdef _OPENMP - #pragma omp parallel -#endif - { - gaussianBlur (ncie->sh_p, lpf, width, height, max(2.0, thresh - 1.0)); - } - - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - float impthr = max(1.0f, 5.0f - (float)thresh); - float impthrDiv24 = impthr / 24.0f; //Issue 1671: moved the Division outside the loop, impthr can be optimized out too, but I let in the code at the moment - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int i1, j1, j; - float hpfabs, hfnbrave; -#ifdef __SSE2__ - vfloat hfnbravev, hpfabsv; - vfloat impthrDiv24v = F2V( impthrDiv24 ); - vfloat onev = F2V( 1.0f ); -#endif -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++) { - hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - -#ifdef __SSE2__ - - for (; j < width - 5; j += 4) { - hpfabsv = vabsf(LVFU(ncie->sh_p[i][j]) - LVFU(lpf[i][j])); - hfnbravev = ZEROV; - - //block average of high pass data - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) { - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - hfnbravev += vabsf(LVFU(ncie->sh_p[i1][j1]) - LVFU(lpf[i1][j1])); - } - - } - - STVFU(impish[i][j], vselfzero(vmaskf_gt(hpfabsv, (hfnbravev - hpfabsv)*impthrDiv24v), onev)); - } - -#endif - - for (; j < width - 2; j++) { - hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - - for (; j < width; j++) { - hpfabs = fabs(ncie->sh_p[i][j] - lpf[i][j]); - - //block average of high pass data - for (i1 = max(0, i - 2), hfnbrave = 0; i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - hfnbrave += fabs(ncie->sh_p[i1][j1] - lpf[i1][j1]); - } - - impish[i][j] = (hpfabs > ((hfnbrave - hpfabs) * impthrDiv24)); - } - } - } - -//now impulsive values have been identified - - const float eps = 1.0f; - - float** sraa = buffers[0]; // we can reuse buffers[0] because lpf is not needed anymore at this point - float** srbb = buffers[2]; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - -#ifdef __SSE2__ - vfloat2 sincosvalv; - vfloat piidv = F2V( piid ); - vfloat tempv; -#endif -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < height; i++) { - int j = 0; -#ifdef __SSE2__ - - for (; j < width - 3; j += 4) { - sincosvalv = xsincosf(piidv * LVFU(ncie->h_p[i][j])); - tempv = LVFU(ncie->C_p[i][j]); - STVFU(sraa[i][j], tempv * sincosvalv.y); - STVFU(srbb[i][j], tempv * sincosvalv.x); - } - -#endif - - for (; j < width; j++) { - float2 sincosval = xsincosf(piid * ncie->h_p[i][j]); - sraa[i][j] = ncie->C_p[i][j] * sincosval.y; - srbb[i][j] = ncie->C_p[i][j] * sincosval.x; - } - } - } - -// Issue 1671: -// often, noise isn't evenly distributed, e.g. only a few noisy pixels in the bright sky, but many in the dark foreground, -// so it's better to schedule dynamic and let every thread only process 16 rows, to avoid running big threads out of work -// Measured it and in fact gives better performance than without schedule(dynamic,16). Of course, there could be a better -// choice for the chunk_size than 16 -// race conditions are avoided by the array impish -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int i1, j1, j; - float wtdsum[3], dirwt, norm; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0f; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; - wtdsum[1] += dirwt * sraa[i1][j1]; - wtdsum[2] += dirwt * srbb[i1][j1]; - norm += dirwt; - } - - if (norm) { - ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter - sraa[i][j] = wtdsum[1] / norm; //low pass filter - srbb[i][j] = wtdsum[2] / norm; //low pass filter - } - } - - for (; j < width - 2; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0f; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; - wtdsum[1] += dirwt * sraa[i1][j1]; - wtdsum[2] += dirwt * srbb[i1][j1]; - norm += dirwt; - } - - if (norm) { - ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter - sraa[i][j] = wtdsum[1] / norm; //low pass filter - srbb[i][j] = wtdsum[2] / norm; //low pass filter - } - } - - for (; j < width; j++) { - if (!impish[i][j]) { - continue; - } - - norm = 0.0f; - wtdsum[0] = wtdsum[1] = wtdsum[2] = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - if (impish[i1][j1]) { - continue; - } - - dirwt = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); //use more sophisticated rangefn??? - wtdsum[0] += dirwt * ncie->sh_p[i1][j1]; - wtdsum[1] += dirwt * sraa[i1][j1]; - wtdsum[2] += dirwt * srbb[i1][j1]; - norm += dirwt; - } - - if (norm) { - ncie->sh_p[i][j] = wtdsum[0] / norm; //low pass filter - sraa[i][j] = wtdsum[1] / norm; //low pass filter - srbb[i][j] = wtdsum[2] / norm; //low pass filter - } - } - } - } - -//now impulsive values have been corrected - -#ifdef _OPENMP - #pragma omp parallel -#endif - { -#ifdef __SSE2__ - vfloat interav, interbv; - vfloat piidv = F2V(piid); -#endif // __SSE2__ -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++ ) { - int j = 0; -#ifdef __SSE2__ - - for(; j < width - 3; j += 4) { - interav = LVFU(sraa[i][j]); - interbv = LVFU(srbb[i][j]); - STVFU(ncie->h_p[i][j], (xatan2f(interbv, interav)) / piidv); - STVFU(ncie->C_p[i][j], vsqrtf(SQRV(interbv) + SQRV(interav))); - } - -#endif - - for(; j < width; j++) { - float intera = sraa[i][j]; - float interb = srbb[i][j]; - ncie->h_p[i][j] = (xatan2f(interb, intera)) / piid; - ncie->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); - } - } - } - -} - - -} diff -Nru rawtherapee-5.3/rtengine/init.cc rawtherapee-5.4/rtengine/init.cc --- rawtherapee-5.3/rtengine/init.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/init.cc 2018-03-20 11:04:15.000000000 +0000 @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include #include "../rtgui/profilestorecombobox.h" #include "rtengine.h" #include "iccstore.h" @@ -38,37 +39,85 @@ const Settings* settings; MyMutex* lcmsMutex = nullptr; +MyMutex *fftwMutex = nullptr; int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDir, bool loadAll) { settings = s; - ProfileStore::getInstance()->init (loadAll); - ICCStore::getInstance()->init (s->iccDirectory, Glib::build_filename (baseDir, "iccprofiles"), loadAll); - DCPStore::getInstance()->init (Glib::build_filename (baseDir, "dcpprofiles"), loadAll); - - CameraConstantsStore::getInstance ()->init (baseDir, userSettingsDir); - ProcParams::init (); - Color::init (); - PerceptualToneCurve::init (); - RawImageSource::init (); + ProcParams::init(); + PerceptualToneCurve::init(); + RawImageSource::init(); + +#ifdef _OPENMP +#pragma omp parallel sections +#endif +{ +#ifdef _OPENMP +#pragma omp section +#endif +{ if (s->lensfunDbDirectory.empty() || Glib::path_is_absolute(s->lensfunDbDirectory)) { LFDatabase::init(s->lensfunDbDirectory); } else { LFDatabase::init(Glib::build_filename(baseDir, s->lensfunDbDirectory)); } +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + ProfileStore::getInstance()->init(loadAll); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + ICCStore::getInstance()->init(s->iccDirectory, Glib::build_filename (baseDir, "iccprofiles"), loadAll); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + DCPStore::getInstance()->init(Glib::build_filename (baseDir, "dcpprofiles"), loadAll); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + CameraConstantsStore::getInstance()->init(baseDir, userSettingsDir); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + dfm.init(s->darkFramesPath); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + ffm.init(s->flatFieldsPath); +} +} + + Color::init (); delete lcmsMutex; lcmsMutex = new MyMutex; - dfm.init( s->darkFramesPath ); - ffm.init( s->flatFieldsPath ); + fftwMutex = new MyMutex; return 0; } void cleanup () { - ProcParams::cleanup (); Color::cleanup (); RawImageSource::cleanup (); +#ifdef RT_FFTW3F_OMP + fftwf_cleanup_threads(); +#else + fftwf_cleanup(); +#endif + } StagedImageProcessor* StagedImageProcessor::create (InitialImage* initialImage) diff -Nru rawtherapee-5.3/rtengine/iplab2rgb.cc rawtherapee-5.4/rtengine/iplab2rgb.cc --- rawtherapee-5.3/rtengine/iplab2rgb.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/iplab2rgb.cc 2018-03-20 11:04:15.000000000 +0000 @@ -122,7 +122,7 @@ // // If output profile used, divide by 327.68 then apply the "profile" profile (eventually with a standard gamma) // otherwise divide by 327.68, convert to xyz and apply the RGB transform, before converting with gamma2curve -Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm) +Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings) { //gamutmap(lab); @@ -147,7 +147,7 @@ bool standard_gamma; - if(settings->HistogramWorking) { + if(settings->HistogramWorking && consider_histogram_settings) { profile = icm.working; standard_gamma = true; } else { @@ -252,7 +252,7 @@ * Used in processImage (rtengine/simpleprocess.cc) * * Provide a pointer to a 7 floats array for "ga" (uninitialized ; this array will be filled with the gamma values) if you want - * to use the custom gamma scenario. Thoses gamma values will correspond to the ones of the chosen standard output profile + * to use the custom gamma scenario. Those gamma values will correspond to the ones of the chosen standard output profile * (Prophoto if non standard output profile given) * * If "ga" is NULL, then we're considering standard gamma with the chosen output profile. @@ -262,7 +262,7 @@ * If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform * otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve */ -Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool bw, GammaValues *ga) +Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga) { if (cx < 0) { @@ -281,7 +281,7 @@ ch = lab->H - cy; } - Image16* image = new Image16 (cw, ch); + Imagefloat* image = new Imagefloat (cw, ch); cmsHPROFILE oprof = nullptr; if (ga) { @@ -300,11 +300,12 @@ } lcmsMutex->lock (); cmsHPROFILE iprof = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, oprof, TYPE_RGB_16, icm.outputIntent, flags); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); lcmsMutex->unlock (); image->ExecCMSTransform(hTransform, *lab, cx, cy); cmsDeleteTransform(hTransform); + image->normalizeFloatTo65535(); } else { #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) @@ -317,7 +318,7 @@ for (int j = cx; j < cx + cw; j++) { - float fy = (0.0086206897f * rL[j]) / 327.68f + 0.1379310345f; // (L+16)/116 + float fy = (Color::c1By116 * rL[j]) / 327.68f + Color::c16By116; // (L+16)/116 float fx = (0.002f * ra[j]) / 327.68f + fy; float fz = fy - (0.005f * rb[j]) / 327.68f; float LL = rL[j] / 327.68f; @@ -329,9 +330,9 @@ Color::xyz2srgb(x_, y_, z_, R, G, B); - image->r(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(R)]; - image->g(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(G)]; - image->b(i - cy, j - cx) = (int)Color::gamma2curve[CLIP(B)]; + image->r(i - cy, j - cx) = Color::gamma2curve[CLIP(R)]; + image->g(i - cy, j - cx) = Color::gamma2curve[CLIP(G)]; + image->b(i - cy, j - cx) = Color::gamma2curve[CLIP(B)]; } } } diff -Nru rawtherapee-5.3/rtengine/iplocalcontrast.cc rawtherapee-5.4/rtengine/iplocalcontrast.cc --- rawtherapee-5.3/rtengine/iplocalcontrast.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/iplocalcontrast.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,70 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Ported from G'MIC by Alberto Griggio + * + * The original implementation in G'MIC was authored by Arto Huotari, and was + * released under the CeCILL free software license (see + * http://www.cecill.info/licences/Licence_CeCILL_V2-en.html) + * + * 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 . + */ + +#ifdef _OPENMP +#include +#endif + +#include "improcfun.h" +#include "gauss.h" +#include "array2D.h" + +namespace rtengine { + +void ImProcFunctions::localContrast(LabImage *lab) +{ + if (!params->localContrast.enabled) { + return; + } + + const int width = lab->W; + const int height = lab->H; + const float a = params->localContrast.amount; + const float dark = params->localContrast.darkness; + const float light = params->localContrast.lightness; + array2D buf(width, height); + const float sigma = params->localContrast.radius / scale; + +#ifdef _OPENMP + #pragma omp parallel if(multiThread) +#endif + gaussianBlur(lab->L, buf, width, height, sigma); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + float bufval = (lab->L[y][x] - buf[y][x]) * a; + + if (dark != 1 || light != 1) { + bufval *= (bufval > 0.f) ? light : dark; + } + + lab->L[y][x] = std::max(0.0001f, lab->L[y][x] + bufval); + } + } +} + +} // namespace rtengine diff -Nru rawtherapee-5.3/rtengine/ipresize.cc rawtherapee-5.4/rtengine/ipresize.cc --- rawtherapee-5.3/rtengine/ipresize.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ipresize.cc 2018-03-20 11:04:15.000000000 +0000 @@ -46,7 +46,7 @@ } } -void ImProcFunctions::Lanczos (const Image16* src, Image16* dst, float scale) +void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float scale) { const float delta = 1.0f / scale; @@ -106,6 +106,9 @@ // weights for interpolation in y direction float w[support]; + for (auto& f : w) { + f = 0.f; + } // sum of weights used for normalization float ws = 0.0f; @@ -159,9 +162,9 @@ b += wh[k] * lb[jj]; } - dst->r (i, j) = CLIP (static_cast (r)); - dst->g (i, j) = CLIP (static_cast (g)); - dst->b (i, j) = CLIP (static_cast (b)); + dst->r (i, j) = CLIP (r);//static_cast (r)); + dst->g (i, j) = CLIP (g);//static_cast (g)); + dst->b (i, j) = CLIP (b);//static_cast (b)); } } @@ -175,7 +178,7 @@ } -SSEFUNCTION void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, float scale) +void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, float scale) { const float delta = 1.0f / scale; const float a = 3.0f; @@ -396,7 +399,7 @@ return (float)dScale; } -void ImProcFunctions::resize (Image16* src, Image16* dst, float dScale) +void ImProcFunctions::resize (Imagefloat* src, Imagefloat* dst, float dScale) { #ifdef PROFILE time_t t1 = clock(); diff -Nru rawtherapee-5.3/rtengine/ipsharpen.cc rawtherapee-5.4/rtengine/ipsharpen.cc --- rawtherapee-5.3/rtengine/ipsharpen.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ipsharpen.cc 2018-03-20 11:04:15.000000000 +0000 @@ -34,7 +34,7 @@ #define ABS(a) ((a)<0?-(a):(a)) extern const Settings* settings; -SSEFUNCTION void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, int H) +void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, int H) { const float dampingFac = -2.0 / (damping * damping); @@ -324,7 +324,7 @@ // Thanks to Manuel for this excellent job (Jacques Desmis JDC or frej83) void ImProcFunctions::MLsharpen (LabImage* lab) { - // JD: this algorithm maximize clarity of images; it does not play on accutance. It can remove (partialy) the effects of the AA filter) + // JD: this algorithm maximize clarity of images; it does not play on accutance. It can remove (partially) the effects of the AA filter) // I think we can use this algorithm alone in most cases, or first to clarify image and if you want a very little USM (unsharp mask sharpening) after... if (!params->sharpenEdge.enabled) { return; @@ -574,7 +574,7 @@ const int width = W, height = H; const float uniform = params->sharpenMicro.uniformity; //between 0 to 100 const int unif = (int)(uniform / 10.0f); //put unif between 0 to 10 - float amount = params->sharpenMicro.amount / 1500.0f; //amount 2000.0 quasi no artefacts ==> 1500 = maximum, after artefacts + float amount = params->sharpenMicro.amount / 1500.0f; //amount 2000.0 quasi no artifacts ==> 1500 = maximum, after artifacts if (amount < 0.000001f) { return; diff -Nru rawtherapee-5.3/rtengine/iptransform.cc rawtherapee-5.4/rtengine/iptransform.cc --- rawtherapee-5.3/rtengine/iptransform.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/iptransform.cc 2018-03-20 11:04:15.000000000 +0000 @@ -296,7 +296,7 @@ } void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, - const ImageMetaData *metadata, + const FramesMetaData *metadata, int rawRotationDeg, bool fullImage) { double focalLen = metadata->getFocalLen(); @@ -315,7 +315,7 @@ pLCPMap.reset( new LCPMapper (pLCPProf, focalLen, focalLen35mm, focusDist, fNumber, false, - params->lensProf.useDist, + false, oW, oH, params->coarse, rawRotationDeg ) ); @@ -325,18 +325,31 @@ if (! (needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient())) { transformLuminanceOnly (original, transformed, cx, cy, oW, oH, fW, fH); } else { - TransformMode mode; + bool highQuality; + std::unique_ptr tmpimg; if (!needsCA() && scale != 1) { - mode = TRANSFORM_PREVIEW; - } else if (!fullImage) { - mode = TRANSFORM_HIGH_QUALITY; + highQuality = false; } else { - mode = TRANSFORM_HIGH_QUALITY_FULLIMAGE; + highQuality = true; + // agriggio: CA correction via the lens profile has to be + // performed before all the other transformations (except for the + // coarse rotation/flipping). In order to not change the code too + // much, I simply introduced a new mode + // TRANSFORM_HIGH_QUALITY_CA, which applies *only* + // profile-based CA correction. So, the correction in this case + // occurs in two steps, using an intermediate temporary + // image. There's room for optimization of course... + if (pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()) { + tmpimg.reset(new Imagefloat(original->getWidth(), original->getHeight())); + transformLCPCAOnly(original, tmpimg.get(), cx, cy, pLCPMap.get()); + original = tmpimg.get(); + } } - transformGeneral(mode, original, transformed, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); + transformGeneral(highQuality, original, transformed, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); } } + // helper function void ImProcFunctions::calcVignettingParams (int oW, int oH, const VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul) { @@ -723,8 +736,17 @@ } -void ImProcFunctions::transformGeneral(ImProcFunctions::TransformMode mode, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap) +void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, Imagefloat *transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH, const LensCorrection *pLCPMap) { + // set up stuff, depending on the mode we are + bool enableLCPDist = pLCPMap && params->lensProf.useDist; + bool enableCA = highQuality && needsCA(); + bool enableGradient = needsGradient(); + bool enablePCVignetting = needsPCVignetting(); + bool enableVignetting = needsVignetting(); + bool enablePerspective = needsPerspective(); + bool enableDistortion = needsDistortion(); + double w2 = (double) oW / 2.0 - 0.5; double h2 = (double) oH / 2.0 - 0.5; @@ -733,13 +755,13 @@ struct grad_params gp; - if (needsGradient()) { + if (enableGradient) { calcGradientParams (oW, oH, params->gradient, gp); } struct pcv_params pcv; - if (needsPCVignetting()) { + if (enablePCVignetting) { calcPCVignetteParams (fW, fH, oW, oH, params->pcvignette, params->crop, pcv); } @@ -755,12 +777,11 @@ // auxiliary variables for c/a correction double chDist[3]; - chDist[0] = params->cacorrection.red; + chDist[0] = enableCA ? params->cacorrection.red : 0.0; chDist[1] = 0.0; - chDist[2] = params->cacorrection.blue; + chDist[2] = enableCA ? params->cacorrection.blue : 0.0; // auxiliary variables for distortion correction - bool needsDist = needsDistortion(); // for performance double distAmount = params->distortion.amount; // auxiliary variables for rotation @@ -783,37 +804,13 @@ double ascale = params->commonTrans.autofill ? getTransformAutoFill (oW, oH, pLCPMap) : 1.0; - // smaller crop images are a problem, so only when processing fully - bool enableLCPCA = false; - bool enableLCPDist = false; - bool enableCA = false; - - switch (mode) { - case ImProcFunctions::TRANSFORM_HIGH_QUALITY_FULLIMAGE: { - enableLCPCA = pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable(); - } - //no break on purpose - - case ImProcFunctions::TRANSFORM_HIGH_QUALITY: { - enableLCPDist = pLCPMap && params->lensProf.useDist; - if (enableLCPCA) { - enableLCPDist = false; - } - enableCA = enableLCPCA || needsCA(); - } - //no break on purpose - - default: - case ImProcFunctions::TRANSFORM_PREVIEW: { - enableLCPDist = pLCPMap && params->lensProf.useDist; - break; - } - } - - if (!enableCA) { - chDist[0] = 0.0; - } - +#if defined( __GNUC__ ) && __GNUC__ >= 7// silence warning +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif +#if defined( __GNUC__ ) && __GNUC__ >= 7 +#pragma GCC diagnostic pop +#endif // main cycle bool darkening = (params->vignetting.amount <= 0.0); #pragma omp parallel for if (multiThread) @@ -834,12 +831,12 @@ double vig_x_d = 0., vig_y_d = 0.; - if (needsVignetting()) { + if (enableVignetting) { vig_x_d = ascale * (x + cx - vig_w2); // centering x coord & scale vig_y_d = ascale * (y + cy - vig_h2); // centering y coord & scale } - if (needsPerspective()) { + if (enablePerspective) { // horizontal perspective transformation y_d *= maxRadius / (maxRadius + x_d * hptanpt); x_d *= maxRadius * hpcospt / (maxRadius + x_d * hptanpt); @@ -856,14 +853,14 @@ // distortion correction double s = 1; - if (needsDist) { + if (enableDistortion) { double r = sqrt (Dxc * Dxc + Dyc * Dyc) / maxRadius; // sqrt is slow s = 1.0 - distAmount + distAmount * r ; } double r2 = 0.; - if (needsVignetting()) { + if (enableVignetting) { double vig_Dx = vig_x_d * cost - vig_y_d * sint; double vig_Dy = vig_x_d * sint + vig_y_d * cost; r2 = sqrt (vig_Dx * vig_Dx + vig_Dy * vig_Dy); @@ -877,11 +874,6 @@ Dx += w2; Dy += h2; - // LCP CA - if (enableLCPCA) { - pLCPMap->correctCA (Dx, Dy, c); - } - // Extract integer and fractions of source screen coordinates int xc = (int)Dx; Dx -= (double)xc; @@ -896,7 +888,7 @@ // multiplier for vignetting correction double vignmul = 1.0; - if (needsVignetting()) { + if (enableVignetting) { if (darkening) { vignmul /= std::max (v + mul * tanh (b * (maxRadius - s * r2) / maxRadius), 0.001); } else { @@ -904,11 +896,11 @@ } } - if (needsGradient()) { + if (enableGradient) { vignmul *= calcGradientFactor (gp, cx + x, cy + y); } - if (needsPCVignetting()) { + if (enablePCVignetting) { vignmul *= calcPCVignetteFactor (pcv, cx + x, cy + y); } @@ -916,7 +908,7 @@ // all interpolation pixels inside image if (enableCA) { interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, & (chTrans[c][y][x]), vignmul); - } else if (mode == ImProcFunctions::TRANSFORM_PREVIEW) { + } else if (!highQuality) { transformed->r (y, x) = vignmul * (original->r (yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->r (yc, xc + 1) * Dx * (1.0 - Dy) + original->r (yc + 1, xc) * (1.0 - Dx) * Dy + original->r (yc + 1, xc + 1) * Dx * Dy); transformed->g (y, x) = vignmul * (original->g (yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->g (yc, xc + 1) * Dx * (1.0 - Dy) + original->g (yc + 1, xc) * (1.0 - Dx) * Dy + original->g (yc + 1, xc + 1) * Dx * Dy); transformed->b (y, x) = vignmul * (original->b (yc, xc) * (1.0 - Dx) * (1.0 - Dy) + original->b (yc, xc + 1) * Dx * (1.0 - Dy) + original->b (yc + 1, xc) * (1.0 - Dx) * Dy + original->b (yc + 1, xc + 1) * Dx * Dy); @@ -950,6 +942,62 @@ } } } + } +} + + +void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *transformed, int cx, int cy, const LensCorrection *pLCPMap) +{ + assert(pLCPMap && params->lensProf.useCA && pLCPMap->isCACorrectionAvailable()); + + float** chOrig[3]; + chOrig[0] = original->r.ptrs; + chOrig[1] = original->g.ptrs; + chOrig[2] = original->b.ptrs; + + float** chTrans[3]; + chTrans[0] = transformed->r.ptrs; + chTrans[1] = transformed->g.ptrs; + chTrans[2] = transformed->b.ptrs; + + #pragma omp parallel for if (multiThread) + + for (int y = 0; y < transformed->getHeight(); y++) { + for (int x = 0; x < transformed->getWidth(); x++) { + for (int c = 0; c < 3; c++) { + double Dx = x; + double Dy = y; + + pLCPMap->correctCA(Dx, Dy, cx, cy, c); + + // Extract integer and fractions of coordinates + int xc = (int)Dx; + Dx -= (double)xc; + int yc = (int)Dy; + Dy -= (double)yc; + + // Convert only valid pixels + if (yc >= 0 && yc < original->getHeight() && xc >= 0 && xc < original->getWidth()) { + + // multiplier for vignetting correction + if (yc > 0 && yc < original->getHeight() - 2 && xc > 0 && xc < original->getWidth() - 2) { + // all interpolation pixels inside image + interpolateTransformChannelsCubic (chOrig[c], xc - 1, yc - 1, Dx, Dy, & (chTrans[c][y][x]), 1.0); + } else { + // edge pixels + int y1 = LIM (yc, 0, original->getHeight() - 1); + int y2 = LIM (yc + 1, 0, original->getHeight() - 1); + int x1 = LIM (xc, 0, original->getWidth() - 1); + int x2 = LIM (xc + 1, 0, original->getWidth() - 1); + + chTrans[c][y][x] = (chOrig[c][y1][x1] * (1.0 - Dx) * (1.0 - Dy) + chOrig[c][y1][x2] * Dx * (1.0 - Dy) + chOrig[c][y2][x1] * (1.0 - Dx) * Dy + chOrig[c][y2][x2] * Dx * Dy); + } + } else { + // not valid (source pixel x,y not inside source image, etc.) + chTrans[c][y][x] = 0; + } + } + } } } diff -Nru rawtherapee-5.3/rtengine/ipvibrance.cc rawtherapee-5.4/rtengine/ipvibrance.cc --- rawtherapee-5.3/rtengine/ipvibrance.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ipvibrance.cc 2018-03-20 11:04:15.000000000 +0000 @@ -126,7 +126,7 @@ const float chromaPastel = float (params->vibrance.pastels) / 100.0f; const float chromaSatur = float (params->vibrance.saturated) / 100.0f; const float p00 = 0.07f; - const float limitpastelsatur = (static_cast (params->vibrance.psthreshold.value[ThresholdSelector::TS_TOPLEFT]) / 100.0f) * (1.0f - p00) + p00; + const float limitpastelsatur = (static_cast(params->vibrance.psthreshold.getTopLeft()) / 100.0f) * (1.0f - p00) + p00; const float maxdp = (limitpastelsatur - p00) / 4.0f; const float maxds = (1.0 - limitpastelsatur) / 4.0f; const float p0 = p00 + maxdp; @@ -135,7 +135,7 @@ const float s0 = limitpastelsatur + maxds; const float s1 = limitpastelsatur + 2.0f * maxds; const float s2 = limitpastelsatur + 3.0f * maxds; - const float transitionweighting = static_cast (params->vibrance.psthreshold.value[ThresholdSelector::TS_BOTTOMLEFT]) / 100.0f; + const float transitionweighting = static_cast(params->vibrance.psthreshold.getBottomLeft()) / 100.0f; float chromamean = 0.0f; if (chromaPastel != chromaSatur) { @@ -700,7 +700,7 @@ aprovn = Chprov * sincosval.y; bprovn = Chprov * sincosval.x; - float fyy = (0.00862069f * Lprov ) + 0.137932f; + float fyy = (Color::c1By116 * Lprov ) + Color::c16By116; float fxx = (0.002f * aprovn) + fyy; float fzz = fyy - (0.005f * bprovn); float xx_ = 65535.f * Color::f2xyz (fxx) * Color::D50x; diff -Nru rawtherapee-5.3/rtengine/ipwavelet.cc rawtherapee-5.4/rtengine/ipwavelet.cc --- rawtherapee-5.3/rtengine/ipwavelet.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/ipwavelet.cc 2018-03-20 11:04:15.000000000 +0000 @@ -140,7 +140,7 @@ int wavNestedLevels = 1; -SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, bool wavcontlutili, int skip) +void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, int skip) { @@ -432,56 +432,56 @@ cp.thH = float(waparams.thrH); cp.sky = waparams.sky; //skin - cp.b_l = static_cast(params->wavelet.hueskin.value[0]) / 100.0f; - cp.t_l = static_cast(params->wavelet.hueskin.value[1]) / 100.0f; - cp.b_r = static_cast(params->wavelet.hueskin.value[2]) / 100.0f; - cp.t_r = static_cast(params->wavelet.hueskin.value[3]) / 100.0f; - - cp.b_ly = static_cast(params->wavelet.hueskin2.value[0]) / 100.0f; - cp.t_ly = static_cast(params->wavelet.hueskin2.value[1]) / 100.0f; - cp.b_ry = static_cast(params->wavelet.hueskin2.value[2]) / 100.0f; - cp.t_ry = static_cast(params->wavelet.hueskin2.value[3]) / 100.0f; + cp.b_l = static_cast(params->wavelet.hueskin.getBottomLeft()) / 100.0f; + cp.t_l = static_cast(params->wavelet.hueskin.getTopLeft()) / 100.0f; + cp.b_r = static_cast(params->wavelet.hueskin.getBottomRight()) / 100.0f; + cp.t_r = static_cast(params->wavelet.hueskin.getTopRight()) / 100.0f; + + cp.b_ly = static_cast(params->wavelet.hueskin2.getBottomLeft()) / 100.0f; + cp.t_ly = static_cast(params->wavelet.hueskin2.getTopLeft()) / 100.0f; + cp.b_ry = static_cast(params->wavelet.hueskin2.getBottomRight()) / 100.0f; + cp.t_ry = static_cast(params->wavelet.hueskin2.getTopRight()) / 100.0f; cp.numlevH = params->wavelet.threshold; //shadows - cp.b_lsl = static_cast(params->wavelet.bllev.value[0]); - cp.t_lsl = static_cast(params->wavelet.bllev.value[1]); - cp.b_rsl = static_cast(params->wavelet.bllev.value[2]); - cp.t_rsl = static_cast(params->wavelet.bllev.value[3]); + cp.b_lsl = static_cast(params->wavelet.bllev.getBottomLeft()); + cp.t_lsl = static_cast(params->wavelet.bllev.getTopLeft()); + cp.b_rsl = static_cast(params->wavelet.bllev.getBottomRight()); + cp.t_rsl = static_cast(params->wavelet.bllev.getTopRight()); cp.numlevS = params->wavelet.threshold2; int maxlevS = 9 - cp.numlevH; cp.numlevS = MIN(cp.numlevS, maxlevS); //printf("levHigh=%d levShad=%d\n",cp.numlevH,cp.numlevS); //highlight - cp.b_lhl = static_cast(params->wavelet.hllev.value[0]); - cp.t_lhl = static_cast(params->wavelet.hllev.value[1]); - cp.b_rhl = static_cast(params->wavelet.hllev.value[2]); - cp.t_rhl = static_cast(params->wavelet.hllev.value[3]); + cp.b_lhl = static_cast(params->wavelet.hllev.getBottomLeft()); + cp.t_lhl = static_cast(params->wavelet.hllev.getTopLeft()); + cp.b_rhl = static_cast(params->wavelet.hllev.getBottomRight()); + cp.t_rhl = static_cast(params->wavelet.hllev.getTopRight()); //printf("BL=%f TL=%f BR=%f TR=%f\n",cp.b_lhl,cp.t_lhl,cp.b_rhl,cp.t_rhl); //pastel - cp.b_lpast = static_cast(params->wavelet.pastlev.value[0]); - cp.t_lpast = static_cast(params->wavelet.pastlev.value[1]); - cp.b_rpast = static_cast(params->wavelet.pastlev.value[2]); - cp.t_rpast = static_cast(params->wavelet.pastlev.value[3]); + cp.b_lpast = static_cast(params->wavelet.pastlev.getBottomLeft()); + cp.t_lpast = static_cast(params->wavelet.pastlev.getTopLeft()); + cp.b_rpast = static_cast(params->wavelet.pastlev.getBottomRight()); + cp.t_rpast = static_cast(params->wavelet.pastlev.getTopRight()); //saturated - cp.b_lsat = static_cast(params->wavelet.satlev.value[0]); - cp.t_lsat = static_cast(params->wavelet.satlev.value[1]); - cp.b_rsat = static_cast(params->wavelet.satlev.value[2]); - cp.t_rsat = static_cast(params->wavelet.satlev.value[3]); + cp.b_lsat = static_cast(params->wavelet.satlev.getBottomLeft()); + cp.t_lsat = static_cast(params->wavelet.satlev.getTopLeft()); + cp.b_rsat = static_cast(params->wavelet.satlev.getBottomRight()); + cp.t_rsat = static_cast(params->wavelet.satlev.getTopRight()); //edge local contrast - cp.edg_low = static_cast(params->wavelet.edgcont.value[0]); - cp.edg_mean = static_cast(params->wavelet.edgcont.value[1]); - cp.edg_max = static_cast(params->wavelet.edgcont.value[2]); - cp.edg_sd = static_cast(params->wavelet.edgcont.value[3]); + cp.edg_low = static_cast(params->wavelet.edgcont.getBottomLeft()); + cp.edg_mean = static_cast(params->wavelet.edgcont.getTopLeft()); + cp.edg_max = static_cast(params->wavelet.edgcont.getBottomRight()); + cp.edg_sd = static_cast(params->wavelet.edgcont.getTopRight()); //level noise - cp.lev0s = static_cast(params->wavelet.level0noise.value[0]); - cp.lev0n = static_cast(params->wavelet.level0noise.value[1]); - cp.lev1s = static_cast(params->wavelet.level1noise.value[0]); - cp.lev1n = static_cast(params->wavelet.level1noise.value[1]); - cp.lev2s = static_cast(params->wavelet.level2noise.value[0]); - cp.lev2n = static_cast(params->wavelet.level2noise.value[1]); - cp.lev3s = static_cast(params->wavelet.level3noise.value[0]); - cp.lev3n = static_cast(params->wavelet.level3noise.value[1]); + cp.lev0s = static_cast(params->wavelet.level0noise.getBottom()); + cp.lev0n = static_cast(params->wavelet.level0noise.getTop()); + cp.lev1s = static_cast(params->wavelet.level1noise.getBottom()); + cp.lev1n = static_cast(params->wavelet.level1noise.getTop()); + cp.lev2s = static_cast(params->wavelet.level2noise.getBottom()); + cp.lev2n = static_cast(params->wavelet.level2noise.getTop()); + cp.lev3s = static_cast(params->wavelet.level3noise.getBottom()); + cp.lev3n = static_cast(params->wavelet.level3noise.getTop()); cp.detectedge = params->wavelet.medianlev; //printf("low=%f mean=%f sd=%f max=%f\n",cp.edg_low,cp.edg_mean,cp.edg_sd,cp.edg_max); @@ -645,7 +645,7 @@ numthreads = MIN(numthreads, maxnumberofthreadsforwavelet); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP wavNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); @@ -669,12 +669,12 @@ #pragma omp parallel num_threads(numthreads) #endif { - float *mean = new float [9]; - float *meanN = new float [9]; - float *sigma = new float [9]; - float *sigmaN = new float [9]; - float *MaxP = new float [9]; - float *MaxN = new float [9]; + float mean[10]; + float meanN[10]; + float sigma[10]; + float sigmaN[10]; + float MaxP[10]; + float MaxN[10]; float** varhue = new float*[tileheight]; @@ -720,7 +720,7 @@ Lold = lab->L; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -784,7 +784,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -868,7 +868,7 @@ if(!Ldecomp->memoryAllocationFailed) { float madL[8][3]; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -883,7 +883,6 @@ } } - int ind = 0; bool ref = false; if((cp.lev0s > 0.f || cp.lev1s > 0.f || cp.lev2s > 0.f || cp.lev3s > 0.f) && cp.noiseena) { @@ -899,7 +898,7 @@ } if(cp.val > 0 || ref || contr) {//edge - Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL); + Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } //init for edge and denoise @@ -921,7 +920,6 @@ WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, vari, edge); } - ind = 1; //Flat curve for Contrast=f(H) in levels FlatCurve* ChCurve = new FlatCurve(params->wavelet.Chcurve); //curve C=f(H) bool Chutili = false; @@ -936,10 +934,10 @@ } - WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, waOpacityCurveWL, ChCurve, Chutili); + WaveletcontAllL(labco, varhue, varchro, *Ldecomp, cp, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); if(cp.val > 0 || ref || contr || cp.diagcurv) {//edge - Evaluate2(*Ldecomp, cp, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL); + Evaluate2(*Ldecomp, mean, meanN, sigma, sigmaN, MaxP, MaxN); } WaveletcontAllLfinal(*Ldecomp, cp, mean, sigma, MaxP, waOpacityCurveWL); @@ -1025,7 +1023,7 @@ if(!adecomp->memoryAllocationFailed && !bdecomp->memoryAllocationFailed) { WaveletcontAllAB(labco, varhue, varchro, *adecomp, waOpacityCurveW, cp, true); WaveletcontAllAB(labco, varhue, varchro, *bdecomp, waOpacityCurveW, cp, false); - WaveletAandBAllAB(labco, varhue, varchro, *adecomp, *bdecomp, cp, waOpacityCurveW, hhCurve, hhutili ); + WaveletAandBAllAB(*adecomp, *bdecomp, cp, hhCurve, hhutili ); adecomp->reconstruct(labco->data + datalen, cp.strength); bdecomp->reconstruct(labco->data + 2 * datalen, cp.strength); @@ -1078,7 +1076,7 @@ bool highlight = params->toneCurve.hrenabled; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1247,14 +1245,8 @@ delete [] varchro; - delete [] mean; - delete [] meanN; - delete [] sigma; - delete [] sigmaN; - delete [] MaxP; - delete [] MaxN; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP omp_set_nested(oldNested); #endif @@ -1279,17 +1271,17 @@ //find absolute mean int countP = 0, countN = 0; - float averaP = 0.f, averaN = 0.f; + double averaP = 0.0, averaN = 0.0; // use double precision for large summations float thres = 5.f;//different fom zero to take into account only data large enough max = 0.f; min = 0.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { float lmax = 0.f, lmin = 0.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for reduction(+:averaP,averaN,countP,countN) nowait #endif @@ -1313,7 +1305,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { @@ -1340,10 +1332,10 @@ void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg) { int countP = 0, countN = 0; - float variP = 0.f, variN = 0.f; + double variP = 0.0, variN = 0.0; // use double precision for large summations float thres = 5.f;//different fom zero to take into account only data large enough -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for reduction(+:variP,variN,countP,countN) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1372,7 +1364,7 @@ } void ImProcFunctions::Evaluate2(wavelet_decomposition &WaveletCoeffs_L, - const struct cont_params& cp, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float madL[8][3]) + float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) { //StopWatch Stop1("Evaluate2"); int maxlvl = WaveletCoeffs_L.maxlevel(); @@ -1382,16 +1374,14 @@ int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); - int skip_L = WaveletCoeffs_L.level_stride(lvl); - float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - Eval2 (WavCoeffs_L, lvl, cp, Wlvl_L, Hlvl_L, skip_L, ind, mean, meanN, sigma, sigmaN, MaxP, MaxN, madL[lvl]); + Eval2 (WavCoeffs_L, lvl, Wlvl_L, Hlvl_L, mean, meanN, sigma, sigmaN, MaxP, MaxN); } } -void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, const struct cont_params& cp, - int W_L, int H_L, int skip_L, int ind, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, float *madL) +void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, + int W_L, int H_L, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN) { float avLP[4], avLN[4]; @@ -1435,7 +1425,7 @@ MaxN[level] = maxLN; } -float *ImProcFunctions::ContrastDR(float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Contrast) +float *ImProcFunctions::ContrastDR(float *Source, int W_L, int H_L, float *Contrast) { int n = W_L * H_L; @@ -1444,7 +1434,7 @@ } memcpy(Contrast, Source, n * sizeof(float)); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1455,19 +1445,19 @@ return Contrast; } -SSEFUNCTION float *ImProcFunctions::CompressDR(float *Source, int skip, struct cont_params &cp, int W_L, int H_L, float Compression, float DetailBoost, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx, float *Compressed) +float *ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost, float *Compressed) { const float eps = 0.000001f; int n = W_L * H_L; #ifdef __SSE2__ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel #endif { __m128 epsv = _mm_set1_ps( eps ); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -1481,7 +1471,7 @@ } #else -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1491,7 +1481,7 @@ #endif - float *ucr = ContrastDR(Source, skip, cp, W_L, H_L, Compression, DetailBoost, max0, min0, ave, ah, bh, al, bl, factorx); + float *ucr = ContrastDR(Source, W_L, H_L); if(Compressed == nullptr) { Compressed = ucr; @@ -1518,7 +1508,7 @@ } #ifdef __SSE2__ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel #endif { @@ -1526,7 +1516,7 @@ __m128 epsv = _mm_set1_ps( eps ); __m128 DetailBoostv = _mm_set1_ps( DetailBoost ); __m128 tempv = _mm_set1_ps( temp ); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -1547,7 +1537,7 @@ } #else -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1569,7 +1559,7 @@ } -void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params &cp, int W_L, int H_L, float max0, float min0, float ave, float ah, float bh, float al, float bl, float factorx) +void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0) { float stren = cp.tmstrength; float gamm = params->wavelet.gamma; @@ -1582,7 +1572,7 @@ min0 = 0.0f; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1599,10 +1589,10 @@ } - CompressDR(WavCoeffs_L0, skip, cp, W_L, H_L, Compression, DetailBoost, max0, min0, ave, ah, bh, al, bl, factorx, WavCoeffs_L0); + CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost, WavCoeffs_L0); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif @@ -1634,7 +1624,7 @@ } // max0=32768.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1659,7 +1649,7 @@ epd2.CompressDynamicRange(WavCoeffs_L0, (float)sca / skip, edgest, Compression, DetailBoost, Iterates, rew); //Restore past range, also desaturate a bit per Mantiuk's Color correction for tone mapping. -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif @@ -1685,7 +1675,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, - struct cont_params &cp, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, FlatCurve* ChCurve, bool Chutili) + struct cont_params &cp, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) { int maxlvl = WaveletCoeffs_L.maxlevel(); int W_L = WaveletCoeffs_L.level_W(0); @@ -1697,12 +1687,12 @@ float contrast = cp.contrast; float multL = (float)contrast * (maxl - 1.f) / 100.f + 1.f; float multH = (float) contrast * (maxh - 1.f) / 100.f + 1.f; - double avedbl = 0.f; // use double precision for big summations + double avedbl = 0.0; // use double precision for large summations float max0 = 0.f; float min0 = FLT_MAX; if(contrast != 0.f || (cp.tonemap && cp.resena)) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for reduction(+:avedbl) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -1710,14 +1700,14 @@ avedbl += WavCoeffs_L0[i]; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { float lminL = FLT_MAX; float lmaxL = 0.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -1732,7 +1722,7 @@ } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { @@ -1792,13 +1782,13 @@ koeLi[j][i] = 0.f; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { - if(contrast != 0.f && cp.resena) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step + if(contrast != 0.f && cp.resena && max0 > 0.0) { // contrast = 0.f means that all will be multiplied by 1.f, so we can skip this step { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -1827,18 +1817,18 @@ if(cp.tonemap && cp.contmet == 1 && cp.resena) { float maxp = max0 * 256.f; float minp = min0 * 256.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp single #endif - ContrastResid(WavCoeffs_L0, 5, skip, cp, W_L, H_L, maxp, minp, ave, ah, bh, al, bl, factorx ); + ContrastResid(WavCoeffs_L0, cp, W_L, H_L, maxp, minp); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp barrier #endif if((cp.conres != 0.f || cp.conresH != 0.f) && cp.resena) { // cp.conres = 0.f and cp.comresH = 0.f means that all will be multiplied by 1.f, so we can skip this step -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for nowait #endif @@ -1885,14 +1875,11 @@ // I was inspired by the principle of Canny and Lipschitz (continuity and derivability) // I adapted the principle but have profoundly changed the algorithm // One can 1) change all parameters and found good parameters; - //one can also chnage in calckoe - float edd = settings->ed_detec; - float eddlow = settings->ed_low; //5 to 40 - // float eddlipinfl=settings->ed_lipinfl; - // float eddlipampl=settings->ed_lipampl; + //one can also change in calckoe + float edd = 3.f; + float eddlow = 15.f; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; float eddlipampl = 1.f + cp.edgampl / 50.f; - // float eddlow=5.f + cp.edgampl/2.f;//settings->ed_low;//5 to 40 if(cp.detectedge) { //enabled Lipschitz control...more memory..more time... @@ -1903,7 +1890,7 @@ tmC[i] = &tmCBuffer[i * W_L]; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -1923,7 +1910,7 @@ float aamp = 1.f + cp.eddetthrHi / 100.f; for (int lvl = 0; lvl < 4; lvl++) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif @@ -1933,7 +1920,7 @@ float interm = 0.f; if(cp.lip3 && cp.lipp) { - // comparaison between pixel and neighbours + // comparison between pixel and neighbours const auto neigh = cp.neigh == 1; const auto kneigh = neigh ? 28.f : 38.f; const auto somm = neigh ? 40.f : 50.f; @@ -2000,7 +1987,7 @@ kampli = AmpLip / aamp; } - // comparaison betwwen pixel and neighbours to do ==> I think 3 dir above is better + // comparison betwwen pixel and neighbours to do ==> I think 3 dir above is better /* if(cp.lip3){ koeLi[lvl*3][i*W_L + j] = (koeLi[lvl*3][i*W_L + j] + koeLi[lvl*3][(i-1)*W_L + j] + koeLi[lvl*3][(i+1)*W_L + j] + koeLi[lvl*3][i*W_L + j+1] + koeLi[lvl*3][i*W_L + j-1] + koeLi[lvl*3][(i-1)*W_L + j-1] @@ -2026,7 +2013,7 @@ // end } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2038,7 +2025,7 @@ float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl); - ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, meanN, sigma, sigmaN, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); + ContAllL (koeLi, maxkoeLi, true, maxlvl, labco, varhue, varchrom, WavCoeffs_L, WavCoeffs_L0, lvl, dir, cp, Wlvl_L, Hlvl_L, skip, mean, sigma, MaxP, MaxN, wavCLVCcurve, waOpacityCurveW, ChCurve, Chutili); } @@ -2051,8 +2038,8 @@ } } -void ImProcFunctions::WaveletAandBAllAB(LabImage * labco, float ** varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, - struct cont_params &cp, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* hhCurve, bool hhutili) +void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, + struct cont_params &cp, FlatCurve* hhCurve, bool hhutili) { // StopWatch Stop1("WaveletAandBAllAB"); if (hhutili && cp.resena) { // H=f(H) @@ -2061,7 +2048,7 @@ float * WavCoeffs_a0 = WaveletCoeffs_a.coeff0; float * WavCoeffs_b0 = WaveletCoeffs_b.coeff0; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { @@ -2069,7 +2056,7 @@ float huebuffer[W_L] ALIGNED64; float chrbuffer[W_L] ALIGNED64; #endif // __SSE2__ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic,16) #endif @@ -2129,13 +2116,13 @@ float * WavCoeffs_ab0 = WaveletCoeffs_ab.coeff0; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif { if(cp.chrores != 0.f && cp.resena) { // cp.chrores == 0.f means all will be multiplied by 1.f, so we can skip the processing of residual -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for nowait #endif @@ -2188,7 +2175,7 @@ if(cp.cbena && cp.resena) {//if user select Toning and color balance -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for nowait #endif @@ -2243,7 +2230,7 @@ } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2438,7 +2425,7 @@ float bsig = 0.5f - asig * mean[level]; float amean = 0.5f / mean[level]; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic, W_L * 16) num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -2466,7 +2453,7 @@ } } - int choicelevel = atoi(params->wavelet.Lmethod.data()) - 1; + int choicelevel = params->wavelet.Lmethod - 1; choicelevel = choicelevel == -1 ? 4 : choicelevel; int choiceClevel = 0; @@ -2579,7 +2566,7 @@ } void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschitz, int maxlvl, LabImage * labco, float ** varhue, float **varchrom, float ** WavCoeffs_L, float * WavCoeffs_L0, int level, int dir, struct cont_params &cp, - int W_L, int H_L, int skip, float *mean, float *meanN, float *sigma, float *sigmaN, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) + int W_L, int H_L, int skip, float *mean, float *sigma, float *MaxP, float *MaxN, const WavCurve & wavCLVCcurve, const WavOpacityCurveW & waOpacityCurveW, FlatCurve* ChCurve, bool Chutili) { assert (level >= 0); assert (maxlvl > level); @@ -2591,11 +2578,11 @@ scaleskip[sc] = scales[sc] / skip; } - float t_r = settings->top_right; - float t_l = settings->top_left; - float b_r = settings->bot_right; - float edd = settings->ed_detec; - float eddstrength = settings->ed_detecStr; + float t_r = 40.f; + float t_l = 10.f; + float b_r = 75.f; + float edd = 3.f; + float eddstrength = 1.3f; float aedstr = (eddstrength - 1.f) / 90.f; float bedstr = 1.f - 10.f * aedstr; @@ -2758,7 +2745,7 @@ float edgePrecalc = 1.f + refin; //estimate edge "pseudo variance" - if(cp.EDmet == 2) { //curve + if(cp.EDmet == 2 && MaxP[level] > 0.f) { //curve // if(exa) {//curve float insigma = 0.666f; //SD float logmax = log(MaxP[level]); //log Max @@ -3279,7 +3266,7 @@ } // to see each level of wavelet ...level from 0 to 8 - int choicelevel = atoi(params->wavelet.Lmethod.data()) - 1; + int choicelevel = params->wavelet.Lmethod - 1; choicelevel = choicelevel == -1 ? 4 : choicelevel; } @@ -3537,7 +3524,7 @@ } // to see each level of wavelet ...level from 0 to 8 - int choicelevel = atoi(params->wavelet.Lmethod.data()) - 1; + int choicelevel = params->wavelet.Lmethod - 1; choicelevel = choicelevel == -1 ? 4 : choicelevel; int choiceClevel = 0; diff -Nru rawtherapee-5.3/rtengine/labimage.cc rawtherapee-5.4/rtengine/labimage.cc --- rawtherapee-5.3/rtengine/labimage.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/labimage.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1,9 +1,31 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2017 Gabor Horvath + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include +#include + #include "labimage.h" -#include + namespace rtengine { -LabImage::LabImage (int w, int h) : fromImage(false), W(w), H(h) +LabImage::LabImage (int w, int h) : W(w), H(h) { allocLab(w, h); } @@ -42,4 +64,43 @@ v3 = n ? accumulator_b / float(n) : 0.f; } +void LabImage::allocLab(int w, int h) +{ + L = new float*[h]; + a = new float*[h]; + b = new float*[h]; + + data = new float [w * h * 3]; + float * index = data; + + for (int i = 0; i < h; i++) { + L[i] = index + i * w; + } + + index += w * h; + + for (int i = 0; i < h; i++) { + a[i] = index + i * w; + } + + index += w * h; + + for (int i = 0; i < h; i++) { + b[i] = index + i * w; + } +} + +void LabImage::deleteLab() +{ + delete [] L; + delete [] a; + delete [] b; + delete [] data; +} + +void LabImage::reallocLab() +{ + allocLab(W, H); +}; + } diff -Nru rawtherapee-5.3/rtengine/labimage.h rawtherapee-5.4/rtengine/labimage.h --- rawtherapee-5.3/rtengine/labimage.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/labimage.h 2018-03-20 11:04:15.000000000 +0000 @@ -25,32 +25,8 @@ class LabImage { private: - bool fromImage; - void allocLab(int w, int h) - { - L = new float*[H]; - a = new float*[H]; - b = new float*[H]; + void allocLab(int w, int h); - data = new float [W * H * 3]; - float * index = data; - - for (int i = 0; i < H; i++) { - L[i] = index + i * W; - } - - index += W * H; - - for (int i = 0; i < H; i++) { - a[i] = index + i * W; - } - - index += W * H; - - for (int i = 0; i < H; i++) { - b[i] = index + i * W; - } - }; public: int W, H; float * data; @@ -64,20 +40,8 @@ //Copies image data in Img into this instance. void CopyFrom(LabImage *Img); void getPipetteData (float &L, float &a, float &b, int posX, int posY, int squareSize); - void deleteLab( ) - { - if (!fromImage) { - delete [] L; - delete [] a; - delete [] b; - delete [] data; - } - } - void reallocLab( ) - { - allocLab(W, H); - }; - + void deleteLab(); + void reallocLab(); }; } diff -Nru rawtherapee-5.3/rtengine/lcp.cc rawtherapee-5.4/rtengine/lcp.cc --- rawtherapee-5.3/rtengine/lcp.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/lcp.cc 2018-03-20 11:04:15.000000000 +0000 @@ -361,7 +361,7 @@ const float focDist = aPersModel[pm]->focDist; const float focDistLog = std::log(focDist) + euler; - double meanErr; + double meanErr = 0.0; if (aPersModel[pm]->hasModeData(mode)) { double lowMeanErr = 0.0; @@ -797,12 +797,12 @@ if (src_str == "PerspectiveModel") { pProf->firstLIDone = true; pProf->inPerspect = true; - return; + parseAttr = true; } else if (src_str == "FisheyeModel") { pProf->firstLIDone = true; pProf->inPerspect = true; pProf->isFisheye = true; // just misses third param, and different path, rest is the same - return; + parseAttr = true; } else if (src_str == "Description") { parseAttr = true; } @@ -1077,12 +1077,15 @@ y -= cy * scale; } -void rtengine::LCPMapper::correctCA(double& x, double& y, int channel) const +void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int channel) const { if (!enableCA) { return; } + x += cx; + y += cy; + double xgreen, ygreen; // First calc the green channel like normal distortion @@ -1123,9 +1126,12 @@ x = (chrom[channel].scale_factor * ( xd * commonSum + xfac * rsqr )) * chrom[channel].fx + chrom[channel].x0; y = (chrom[channel].scale_factor * ( yd * commonSum + yfac * rsqr )) * chrom[channel].fy + chrom[channel].y0; } + + x -= cx; + y -= cy; } -SSEFUNCTION void rtengine::LCPMapper::processVignetteLine(int width, int y, float* line) const +void rtengine::LCPMapper::processVignetteLine(int width, int y, float* line) const { // No need for swapXY, since vignette is in RAW and always before rotation float yd = ((float)y - mc.y0) * mc.rfy; @@ -1163,7 +1169,7 @@ } } -SSEFUNCTION void rtengine::LCPMapper::processVignetteLine3Channels(int width, int y, float* line) const +void rtengine::LCPMapper::processVignetteLine3Channels(int width, int y, float* line) const { // No need for swapXY, since vignette is in RAW and always before rotation float yd = ((float)y - mc.y0) * mc.rfy; diff -Nru rawtherapee-5.3/rtengine/lcp.h rawtherapee-5.4/rtengine/lcp.h --- rawtherapee-5.3/rtengine/lcp.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/lcp.h 2018-03-20 11:04:15.000000000 +0000 @@ -164,7 +164,7 @@ virtual ~LensCorrection() {} virtual void correctDistortion(double &x, double &y, int cx, int cy, double scale) const = 0; virtual bool isCACorrectionAvailable() const = 0; - virtual void correctCA(double &x, double &y, int channel) const = 0; + virtual void correctCA(double &x, double &y, int cx, int cy, int channel) const = 0; virtual void processVignetteLine(int width, int y, float *line) const = 0; virtual void processVignetteLine3Channels(int width, int y, float *line) const = 0; }; @@ -192,7 +192,7 @@ void correctDistortion(double &x, double &y, int cx, int cy, double scale) const; // MUST be the first stage bool isCACorrectionAvailable() const; - void correctCA(double& x, double& y, int channel) const; + void correctCA(double& x, double& y, int cx, int cy, int channel) const; void processVignetteLine(int width, int y, float* line) const; void processVignetteLine3Channels(int width, int y, float* line) const; diff -Nru rawtherapee-5.3/rtengine/loadinitial.cc rawtherapee-5.4/rtengine/loadinitial.cc --- rawtherapee-5.3/rtengine/loadinitial.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/loadinitial.cc 2018-03-20 11:04:15.000000000 +0000 @@ -36,11 +36,7 @@ isrc->setProgressListener (pl); - if(isRaw && pl == nullptr) { - *errorCode = isrc->load (fname, true); - } else { - *errorCode = isrc->load (fname); - } + *errorCode = isrc->load (fname); if (*errorCode) { delete isrc; diff -Nru rawtherapee-5.3/rtengine/LUT.h rawtherapee-5.4/rtengine/LUT.h --- rawtherapee-5.3/rtengine/LUT.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/LUT.h 2018-03-20 11:04:15.000000000 +0000 @@ -93,7 +93,7 @@ { protected: // list of variables ordered to improve cache speed - unsigned int maxs; + int maxs; float maxsf; T * data; unsigned int clip; @@ -101,10 +101,10 @@ unsigned int upperBound; // always equals size-1, parameter created for performance reason private: unsigned int owner; -#if defined( __SSE2__ ) && defined( __x86_64__ ) - vfloat maxsv ALIGNED16; - vfloat sizev ALIGNED16; - vint sizeiv ALIGNED16; +#ifdef __SSE2__ + alignas(16) vfloat maxsv; + alignas(16) vfloat sizev; + alignas(16) vint sizeiv; #endif public: /// convenience flag! If one doesn't want to delete the buffer but want to flag it to be recomputed... @@ -123,13 +123,16 @@ #endif dirty = true; clip = flags; - data = new T[s]; + // Add a few extra elements so [](vfloat) won't access out-of-bounds memory. + // The routine would still produce the right answer, but might cause issues + // with address/heap checking programs. + data = new T[s + 3]; owner = 1; size = s; upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); @@ -152,13 +155,14 @@ dirty = true; // Assumption! clip = flags; - data = new T[s]; + // See comment in constructor. + data = new T[s + 3]; owner = 1; size = s; upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); @@ -169,7 +173,7 @@ { data = nullptr; reset(); -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = ZEROV; sizev = ZEROV; sizeiv = _mm_setzero_si128(); @@ -191,6 +195,10 @@ clip = flags; } + int getClip() const { + return clip; + } + /** @brief Get the number of element in the LUT (i.e. dimension of the array) * For a LUT(500), it will return 500 * @return number of element in the array @@ -218,7 +226,8 @@ } if (this->data == nullptr) { - this->data = new T[rhs.size]; + // See comment in constructor. + this->data = new T[rhs.size + 3]; } this->clip = rhs.clip; @@ -228,7 +237,7 @@ this->upperBound = rhs.upperBound; this->maxs = this->size - 2; this->maxsf = (float)this->maxs; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ this->maxsv = F2V( this->size - 2); this->sizeiv = _mm_set1_epi32( (int)(this->size - 1) ); this->sizev = F2V( this->size - 1 ); @@ -243,7 +252,7 @@ LUT & operator+=(LUT &rhs) { if (rhs.size == this->size) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -259,7 +268,7 @@ template::value>::type> LUT & operator*=(float factor) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -274,7 +283,7 @@ template::value>::type> LUT & operator/=(float divisor) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -292,73 +301,102 @@ return data[ rtengine::LIM(index, 0, upperBound) ]; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) -/* - vfloat operator[](vfloat indexv ) const - { -// printf("don't use this operator. It's not ready for production"); - return _mm_setzero_ps(); - - // convert floats to ints - vint idxv = _mm_cvttps_epi32( indexv ); - vfloat tempv, resultv, p1v, p2v; - vmask maxmask = vmaskf_gt(indexv, maxsv); - idxv = _mm_castps_si128(vself(maxmask, maxsv, _mm_castsi128_ps(idxv))); - vmask minmask = vmaskf_lt(indexv, _mm_setzero_ps()); - idxv = _mm_castps_si128(vself(minmask, _mm_setzero_ps(), _mm_castsi128_ps(idxv))); - // access the LUT 4 times and shuffle the values into p1v and p2v - - int idx; +#ifdef __SSE2__ - // get 4th value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(3, 3, 3, 3))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(0, 0, 0, 0)); - p2v = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - // now p1v is 3 3 3 3 - // p2v is 3 3 3 3 - // get 3rd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(2, 2, 2, 2))); - tempv = LVFU(data[idx]); - p1v = _mm_move_ss( p1v, tempv); - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p1v is 3 3 3 2 - // p2v is 3 3 3 2 + // NOTE: This function requires LUTs which clips only at lower bound + vfloat cb(vfloat indexv) const + { + static_assert(std::is_same::value, "This method only works for float LUTs"); - // get 2nd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(1, 1, 1, 1))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps( p1v, p1v, _MM_SHUFFLE(1, 0, 1, 0)); - p2v = _mm_shuffle_ps( p2v, p2v, _MM_SHUFFLE(1, 0, 1, 0)); - // now p1v is 3 2 3 2 - // now p2v is 3 2 3 2 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 3 1 - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p1v is 3 2 3 1 + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); + + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } + + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + + vfloat diff = vmaxf(ZEROV, indexv) - _mm_cvtepi32_ps(indexes); + return vintpf(diff, upper, lower); + } + + // NOTE: This version requires LUTs which clip at upper and lower bounds + // (which is the default). + vfloat operator[](vfloat indexv) const + { + static_assert(std::is_same::value, "This method only works for float LUTs"); + + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); + + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } + + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); + + vfloat diff = vmaxf(ZEROV, vminf(sizev, indexv)) - _mm_cvtepi32_ps(indexes); + return vintpf(diff, upper, lower); + } + + // NOTE: This version requires LUTs which do not clip at upper and lower bounds + vfloat operator()(vfloat indexv) const + { + static_assert(std::is_same::value, "This method only works for float LUTs"); + + // Clamp and convert to integer values. Extract out of SSE register because all + // lookup operations use regular addresses. + vfloat clampedIndexes = vmaxf(ZEROV, vminf(maxsv, indexv)); + vint indexes = _mm_cvttps_epi32(clampedIndexes); + int indexArray[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); + + // Load data from the table. This reads more than necessary, but there don't seem + // to exist more granular operations (though we could try non-SSE). + // Cast to int for convenience in the next operation (partial transpose). + vint values[4]; + for (int i = 0; i < 4; ++i) { + values[i] = _mm_castps_si128(LVFU(data[indexArray[i]])); + } + + // Partial 4x4 transpose operation. We want two new vectors, the first consisting + // of [values[0][0] ... values[3][0]] and the second [values[0][1] ... values[3][1]]. + __m128i temp0 = _mm_unpacklo_epi32(values[0], values[1]); + __m128i temp1 = _mm_unpacklo_epi32(values[2], values[3]); + vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); + vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); - // get 1st value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(0, 0, 0, 0))); - tempv = LVFU(data[idx]); - p1v = _mm_shuffle_ps( p1v, p1v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p1v is 3 2 1 1 - p2v = _mm_shuffle_ps( p2v, p2v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p2v is 3 2 1 1 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 1 0 - tempv = _mm_shuffle_ps(tempv, tempv, _MM_SHUFFLE(1, 1, 1, 1)); - p2v = _mm_move_ss( p2v, tempv); - // now p2v is 3 2 1 0 - - vfloat diffv = indexv - _mm_cvtepi32_ps ( idxv ); - diffv = vself(vorm(maxmask, minmask), _mm_setzero_ps(), diffv); - resultv = p1v + p2v * diffv; - return resultv ; + vfloat diff = indexv - _mm_cvtepi32_ps(indexes); + return vintpf(diff, upper, lower); } -*/ #ifdef __SSE4_1__ template::value>::type> vfloat operator[](vint idxv ) const @@ -456,7 +494,7 @@ } idx = 0; - } else if (index > maxsf) { + } else if (idx > maxs) { if (clip & LUT_CLIP_ABOVE) { return data[upperBound]; } @@ -652,7 +690,7 @@ upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( size - 2); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); diff -Nru rawtherapee-5.3/rtengine/myfile.cc rawtherapee-5.4/rtengine/myfile.cc --- rawtherapee-5.3/rtengine/myfile.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/myfile.cc 2018-03-20 11:04:15.000000000 +0000 @@ -33,6 +33,11 @@ #define PROT_READ 1 #define MAP_FAILED (void *)-1 +#ifdef __GNUC__ // silence warning +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { HANDLE handle = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, PAGE_WRITECOPY, 0, 0, NULL); @@ -51,6 +56,9 @@ UnmapViewOfFile(start); return 0; } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif #else // WIN32 diff -Nru rawtherapee-5.3/rtengine/opthelper.h rawtherapee-5.4/rtengine/opthelper.h --- rawtherapee-5.3/rtengine/opthelper.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/opthelper.h 2018-03-20 11:04:15.000000000 +0000 @@ -22,46 +22,18 @@ #ifndef OPTHELPER_H #define OPTHELPER_H + #define pow_F(a,b) (xexpf(b*xlogf(a))) + #ifdef __SSE2__ #include "sleefsseavx.c" - #ifdef __GNUC__ - #if defined(WIN32) && !defined( __x86_64__ ) - // needed for actual versions of GCC with 32-Bit Windows - #define SSEFUNCTION __attribute__((force_align_arg_pointer)) - #else - #define SSEFUNCTION - #endif - #else - #define SSEFUNCTION - #endif - #else - #ifdef __SSE__ - #ifdef __GNUC__ - #if defined(WIN32) && !defined( __x86_64__ ) - // needed for actual versions of GCC with 32-Bit Windows - #define SSEFUNCTION __attribute__((force_align_arg_pointer)) - #else - #define SSEFUNCTION - #endif - #else - #define SSEFUNCTION - #endif - #else - #define SSEFUNCTION - #endif #endif #ifdef __GNUC__ #define RESTRICT __restrict__ #define LIKELY(x) __builtin_expect (!!(x), 1) #define UNLIKELY(x) __builtin_expect (!!(x), 0) - #if (!defined(WIN32) || defined( __x86_64__ )) - #define ALIGNED64 __attribute__ ((aligned (64))) - #define ALIGNED16 __attribute__ ((aligned (16))) - #else // there is a bug in gcc 4.7.x when using openmp and aligned memory and -O3, also needed for WIN32 builds - #define ALIGNED64 - #define ALIGNED16 - #endif + #define ALIGNED64 __attribute__ ((aligned (64))) + #define ALIGNED16 __attribute__ ((aligned (16))) #else #define RESTRICT #define LIKELY(x) (x) @@ -69,7 +41,4 @@ #define ALIGNED64 #define ALIGNED16 #endif - #if defined _OPENMP - #define _RT_NESTED_OPENMP - #endif #endif diff -Nru rawtherapee-5.3/rtengine/PF_correct_RT.cc rawtherapee-5.4/rtengine/PF_correct_RT.cc --- rawtherapee-5.3/rtengine/PF_correct_RT.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/PF_correct_RT.cc 2018-03-20 11:04:15.000000000 +0000 @@ -43,7 +43,7 @@ { extern const Settings* settings; -SSEFUNCTION void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst, double radius, int thresh) +void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst, double radius, int thresh) { const int halfwin = ceil(2 * radius) + 1; @@ -70,7 +70,7 @@ gaussianBlur (src->b, tmp1->b, src->W, src->H, radius); } - float chromave = 0.0f; + double chromave = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel @@ -285,7 +285,7 @@ free(fringe); } -SSEFUNCTION void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * dst, double radius, int thresh) +void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * dst, double radius, int thresh) { const int halfwin = ceil(2 * radius) + 1; @@ -382,7 +382,7 @@ gaussianBlur (srbb, tmbb, src->W, src->H, radius); } - float chromave = 0.0f; + double chromave = 0.0; // use double precision for large summations #ifdef __SSE2__ @@ -655,7 +655,7 @@ free(fringe); } -SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom, int hotbad) +void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, double radius, int thresh, int mode, float skinprot, float chrom, int hotbad) { const int halfwin = ceil(2 * radius) + 1; MyTime t1, t2; @@ -1042,7 +1042,7 @@ // begin chroma badpixels - float chrommed = 0.f; + double chrommed = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel for reduction(+:chrommed) #endif @@ -1263,7 +1263,7 @@ } -SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom) +void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom) { const int halfwin = ceil(2 * radius) + 1; MyTime t1, t2; @@ -1646,7 +1646,7 @@ if(mode == 3) { // begin chroma badpixels - float chrommed = 0.f; + double chrommed = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel for reduction(+:chrommed) #endif diff -Nru rawtherapee-5.3/rtengine/pixelshift.cc rawtherapee-5.4/rtengine/pixelshift.cc --- rawtherapee-5.3/rtengine/pixelshift.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/pixelshift.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////// // -// Algorithm for Pentax Pixel Shift raw files with motion detection +// Algorithm for Pentax/Sony Pixel Shift raw files with motion detection // // Copyright (C) 2016 - 2017 Ingo Weyrich // @@ -294,12 +294,11 @@ } - } using namespace std; using namespace rtengine; -void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParamsIn, unsigned int frame, const std::string &model, float rawWpCorrection) +void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParamsIn, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection) { if(numFrames != 4) { // fallback for non pixelshift files @@ -311,11 +310,11 @@ bayerParams.pixelShiftAutomatic = true; - if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Automatic) { + if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO) { bool pixelShiftEqualBright = bayerParams.pixelShiftEqualBright; bayerParams.setPixelShiftDefaults(); bayerParams.pixelShiftEqualBright = pixelShiftEqualBright; - } else if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Off) { + } else if(bayerParams.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::OFF) { bayerParams.pixelShiftAutomatic = false; bayerParams.pixelShiftShowMotion = false; } @@ -505,8 +504,44 @@ static const float ePerIsoK70 = 0.5f; + // preliminary ILCE-7RM3 data, good fidelity except from A) small innaccuracy at places + // due to integer scaling quantization, B) much different noise behavior of PDAF pixels + static const float nReadILCE7RM3[] = { 4.2f, // ISO 100 + 3.9f, // ISO 125 + 3.6f, // ISO 160 + 3.55f, // ISO 200 + 3.5f, // ISO 250 + 3.45f, // ISO 320 + 3.35f, // ISO 400 + 3.3f, // ISO 500 + 1.3f, // ISO 640 + 1.2f, // ISO 800 + 1.2f, // ISO 1000 + 1.2f, // ISO 1250 + 1.15f, // ISO 1600 + 1.2f, // ISO 2000 + 1.15f, // ISO 2500 + 1.15f, // ISO 3200 + 1.1f, // ISO 4000 + 1.1f, // ISO 5000 + 1.05f, // ISO 6400 + 1.05f, // ISO 8000 + 1.05f, // ISO 10000 + 1.0f, // ISO 12800 + 1.0f, // ISO 16000 + 1.0f, // ISO 20000 + 1.0f, // ISO 25600 + 1.0f, // ISO 32000 + 1.0f, // ISO 40000 + 1.0f, // ISO 51200 + 1.1f, // ISO 64000 + 1.1f, // ISO 80000 + 1.1f, // ISO 102400 + }; + static const float ePerIsoILCE7RM3 = 0.8f; + if(plistener) { - plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift])); + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT))); plistener->setProgress(0.0); } @@ -531,6 +566,9 @@ } else if(model.find("K-1") != string::npos) { nRead = nReadK1[nReadIndex]; eperIsoModel = ePerIsoK1; + } else if(model.find("ILCE-7RM3") != string::npos) { + nRead = nReadILCE7RM3[nReadIndex]; + eperIsoModel = ePerIsoILCE7RM3; } else { // as long as we don't have values for Pentax KP, we use the values from K-70 nRead = nReadK70[nReadIndex]; eperIsoModel = ePerIsoK70; @@ -887,11 +925,25 @@ const float blend = smoothFactor == 0.f ? 1.f : pow_F(std::max(psMask[i][j] - 1.f, 0.f), smoothFactor); #endif redDest[j + offsX] = intp(blend, redDest[j + offsX], psRed[i][j] ); - greenDest[j + offsX] = intp(blend, greenDest[j + offsX], ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f); + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + greenDest[j + offsX] = intp(blend, greenDest[j + offsX], (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]); + } else { + greenDest[j + offsX] = intp(blend, greenDest[j + offsX], ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f); + } blueDest[j + offsX] = intp(blend, blueDest[j + offsX], psBlue[i][j]); } else { redDest[j + offsX] = psRed[i][j]; - greenDest[j + offsX] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + greenDest[j + offsX] = (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]; + } else { + greenDest[j + offsX] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + } blueDest[j + offsX] = psBlue[i][j]; } } @@ -924,7 +976,14 @@ for(; j < winw - 1; ++j) { // set red, green and blue values - green[i][j] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + if(bayerParams.pixelShiftOneGreen) { + int greenFrame = (1 - offset != 0) ? 1 - offset : 3 - offset; + int greenJ = (1 - offset != 0) ? j : j + 1; + int greenI = (1 - offset != 0) ? i - offset + 1 : i + offset; + green[i][j] = (*rawDataFrames[greenFrame])[greenI][greenJ] * greenBrightness[greenFrame]; + } else { + green[i][j] = ((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset] + (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset]) * 0.5f; + } nonGreenDest0[j] = (*rawDataFrames[(offset << 1) + offset])[i][j + offset] * ngbright[ng][(offset << 1) + offset]; nonGreenDest1[j] = (*rawDataFrames[2 - offset])[i + 1][j - offset + 1] * ngbright[ng ^ 1][2 - offset]; offset ^= 1; // 0 => 1 or 1 => 0 diff -Nru rawtherapee-5.3/rtengine/previewimage.cc rawtherapee-5.4/rtengine/previewimage.cc --- rawtherapee-5.3/rtengine/previewimage.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/previewimage.cc 2018-03-20 11:04:15.000000000 +0000 @@ -59,7 +59,8 @@ } } else { rtengine::RawMetaDataLocation ri; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, width, height, 1, true, true); + eSensorType sensorType = rtengine::ST_NONE; + tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, width, height, 1, true, true); if (tpp) { data = tpp->getImage8Data(); @@ -96,7 +97,7 @@ if ((mode == PIM_EmbeddedOrRaw && !tpp) || mode == PIM_ForceRaw) { RawImageSource rawImage; - int error = rawImage.load(fname, true); + int error = rawImage.load(fname); if (!error) { const unsigned char *data = nullptr; @@ -107,14 +108,14 @@ rawImage.getFullSize (fw, fh, TR_NONE); PreviewProps pp (0, 0, fw, fh, 1); params.icm.input = Glib::ustring("(embedded)"); - params.raw.bayersensor.method = RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast]; + params.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); params.raw.deadPixelFilter = false; params.raw.ca_autocorrect = false; - params.raw.xtranssensor.method = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::fast]; + params.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); rawImage.preprocess(params.raw, params.lensProf, params.coarse); rawImage.demosaic(params.raw); Imagefloat image(fw, fh); - rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.icm, params.raw); + rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.raw); rtengine::Image8 output(fw, fh); rawImage.convertColorSpace(&image, params.icm, wb); #pragma omp parallel for schedule(dynamic, 10) diff -Nru rawtherapee-5.3/rtengine/procevents.h rawtherapee-5.4/rtengine/procevents.h --- rawtherapee-5.3/rtengine/procevents.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/procevents.h 2018-03-20 11:04:15.000000000 +0000 @@ -26,7 +26,7 @@ // Aligned so the first entry starts on line 30 -enum ProcEvent { +enum ProcEventCode { EvPhotoLoaded = 0, EvProfileLoaded = 1, EvProfileChanged = 2, @@ -511,14 +511,41 @@ EvCATgreensc = 481, EvCATybscen = 482, EvCATAutoyb = 483, - // profiled lens correction new events EvLensCorrMode = 484, EvLensCorrLensfunCamera = 485, EvLensCorrLensfunLens = 486, + EvTMFattalEnabled = 487, + EvTMFattalThreshold = 488, + EvTMFattalAmount = 489, + EvWBEnabled = 490, + EvRGBEnabled = 491, + EvLEnabled = 492, + EvPixelShiftOneGreen = 493, NUMOFEVENTS }; + + +class ProcEvent { +public: + ProcEvent(): code_(0) {} + ProcEvent(ProcEventCode code): code_(code) {} + explicit ProcEvent(int code): code_(code) {} + operator int() { return code_; } + +private: + int code_; +}; + + +inline bool operator==(ProcEvent a, ProcEvent b) { return int(a) == int(b); } +inline bool operator==(ProcEvent a, ProcEventCode b) { return int(a) == int(b); } +inline bool operator==(ProcEventCode a, ProcEvent b) { return int(a) == int(b); } +inline bool operator!=(ProcEvent a, ProcEvent b) { return int(a) != int(b); } +inline bool operator!=(ProcEvent a, ProcEventCode b) { return int(a) != int(b); } +inline bool operator!=(ProcEventCode a, ProcEvent b) { return int(a) != int(b); } + } #endif diff -Nru rawtherapee-5.3/rtengine/procparams.cc rawtherapee-5.4/rtengine/procparams.cc --- rawtherapee-5.3/rtengine/procparams.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/procparams.cc 2018-03-20 11:04:15.000000000 +0000 @@ -16,17 +16,21 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ + +#include + +#include + #include -#include "procparams.h" -#include "rt_math.h" + #include "curves.h" +#include "procparams.h" + #include "../rtgui/multilangmgr.h" -#include "../rtgui/version.h" -#include "../rtgui/ppversion.h" -#include "../rtgui/paramsedited.h" #include "../rtgui/options.h" -#include -#define APPVERSION RTVERSION +#include "../rtgui/paramsedited.h" +#include "../rtgui/ppversion.h" +#include "../rtgui/version.h" using namespace std; extern Options options; @@ -34,6 +38,56 @@ namespace { +Glib::ustring expandRelativePath (const Glib::ustring &procparams_fname, const Glib::ustring &prefix, Glib::ustring embedded_fname) +{ + if (embedded_fname == "" || !Glib::path_is_absolute (procparams_fname)) { + return embedded_fname; + } + + if (prefix != "") { + if (embedded_fname.length() < prefix.length() || embedded_fname.substr (0, prefix.length()) != prefix) { + return embedded_fname; + } + + embedded_fname = embedded_fname.substr (prefix.length()); + } + + if (Glib::path_is_absolute (embedded_fname)) { + return prefix + embedded_fname; + } + + Glib::ustring absPath = prefix + Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S + embedded_fname; + return absPath; +} + +Glib::ustring relativePathIfInside (const Glib::ustring &procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) +{ + if (fnameAbsolute || embedded_fname == "" || !Glib::path_is_absolute (procparams_fname)) { + return embedded_fname; + } + + Glib::ustring prefix = ""; + + if (embedded_fname.length() > 5 && embedded_fname.substr (0, 5) == "file:") { + embedded_fname = embedded_fname.substr (5); + prefix = "file:"; + } + + if (!Glib::path_is_absolute (embedded_fname)) { + return prefix + embedded_fname; + } + + Glib::ustring dir1 = Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S; + Glib::ustring dir2 = Glib::path_get_dirname (embedded_fname) + G_DIR_SEPARATOR_S; + + if (dir2.substr (0, dir1.length()) != dir1) { + // it's in a different directory, ie not inside + return prefix + embedded_fname; + } + + return prefix + embedded_fname.substr (dir1.length()); +} + void avoidEmptyCurve (std::vector &curve) { if (curve.empty()) { @@ -41,277 +95,636 @@ } } +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + int& value +) +{ + value = keyfile.get_integer(group_name, key); } -namespace rtengine -{ -namespace procparams -{ -const int tr = (int) options.rtSettings.top_right; -const int br = (int) options.rtSettings.bot_right; -const int tl = (int) options.rtSettings.top_left; -const int bl = (int) options.rtSettings.bot_left; - -const char *LensProfParams::methodstring[static_cast(LensProfParams::LcMode::LCP) + 1u] = {"none", "lfauto", "lfmanual", "lcp"}; -const char *RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::numMethods] = {"amaze", "igv", "lmmse", "eahd", "hphd", "vng4", "dcb", "ahd", "fast", "mono", "none", "pixelshift" }; -const char *RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::numMethods] = {"3-pass (best)", "1-pass (medium)", "fast", "mono", "none" }; - -const char *RAWParams::ff_BlurTypestring[RAWParams::numFlatFileBlurTypes] = {/*"Parametric",*/ "Area Flatfield", "Vertical Flatfield", "Horizontal Flatfield", "V+H Flatfield"}; -std::vector WBParams::wbEntries; - -bool ToneCurveParams::HLReconstructionNecessary (LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw) -{ - if (options.rtSettings.verbose) - printf ("histRedRaw[ 0]=%07d, histGreenRaw[ 0]=%07d, histBlueRaw[ 0]=%07d\nhistRedRaw[255]=%07d, histGreenRaw[255]=%07d, histBlueRaw[255]=%07d\n", - histRedRaw[0], histGreenRaw[0], histBlueRaw[0], histRedRaw[255], histGreenRaw[255], histBlueRaw[255]); - - return histRedRaw[255] > 50 || histGreenRaw[255] > 50 || histBlueRaw[255] > 50 || histRedRaw[0] > 50 || histGreenRaw[0] > 50 || histBlueRaw[0] > 50; -} - -void WBParams::init() -{ - // Creation of the different methods and its associated temperature value - wbEntries.push_back (new WBEntry ("Camera", WBT_CAMERA, M ("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Auto", WBT_AUTO, M ("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Daylight", WBT_DAYLIGHT, M ("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Cloudy", WBT_CLOUDY, M ("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Shade", WBT_SHADE, M ("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Water 1", WBT_WATER, M ("TP_WBALANCE_WATER1"), 35000, 0.3f, 1.1f, 0.f)); - wbEntries.push_back (new WBEntry ("Water 2", WBT_WATER, M ("TP_WBALANCE_WATER2"), 48000, 0.63f, 1.38f, 0.f)); - wbEntries.push_back (new WBEntry ("Tungsten", WBT_TUNGSTEN, M ("TP_WBALANCE_TUNGSTEN"), 2856, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F1", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO1"), 6430, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F2", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO2"), 4230, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F3", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO3"), 3450, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F4", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO4"), 2940, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F5", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO5"), 6350, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F6", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO6"), 4150, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F7", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO7"), 6500, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F8", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO8"), 5020, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F9", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO9"), 4330, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F10", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO10"), 5300, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F11", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO11"), 4000, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Fluo F12", WBT_FLUORESCENT, M ("TP_WBALANCE_FLUO12"), 3000, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("HMI Lamp", WBT_LAMP, M ("TP_WBALANCE_HMI"), 4800, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("GTI Lamp", WBT_LAMP, M ("TP_WBALANCE_GTI"), 5000, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("JudgeIII Lamp", WBT_LAMP, M ("TP_WBALANCE_JUDGEIII"), 5100, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Solux Lamp 3500K", WBT_LAMP, M ("TP_WBALANCE_SOLUX35"), 3480, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Solux Lamp 4100K", WBT_LAMP, M ("TP_WBALANCE_SOLUX41"), 3930, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Solux Lamp 4700K", WBT_LAMP, M ("TP_WBALANCE_SOLUX47"), 4700, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("NG Solux Lamp 4700K", WBT_LAMP, M ("TP_WBALANCE_SOLUX47_NG"), 4480, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("LED LSI Lumelex 2040", WBT_LED, M ("TP_WBALANCE_LED_LSI"), 2970, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("LED CRS SP12 WWMR16", WBT_LED, M ("TP_WBALANCE_LED_CRS"), 3050, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Flash 5500K", WBT_FLASH, M ("TP_WBALANCE_FLASH55"), 5500, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Flash 6000K", WBT_FLASH, M ("TP_WBALANCE_FLASH60"), 6000, 1.f, 1.f, 0.f)); - wbEntries.push_back (new WBEntry ("Flash 6500K", WBT_FLASH, M ("TP_WBALANCE_FLASH65"), 6500, 1.f, 1.f, 0.f)); - // Should remain the last one - wbEntries.push_back (new WBEntry ("Custom", WBT_CUSTOM, M ("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f)); -} - -void WBParams::cleanup() +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + double& value +) { - for (unsigned int i = 0; i < wbEntries.size(); i++) { - delete wbEntries[i]; - } + value = keyfile.get_double(group_name, key); } -// Maps crop to resized width (e.g. smaller previews) -void CropParams::mapToResized (int resizedWidth, int resizedHeight, int scale, int &x1, int &x2, int &y1, int &y2) const +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool& value +) { - x1 = 0, x2 = resizedWidth, y1 = 0, y2 = resizedHeight; - - if (enabled) { - x1 = min (resizedWidth - 1, max (0, x / scale)); - y1 = min (resizedHeight - 1, max (0, y / scale)); - x2 = min (resizedWidth, max (0, (x + w) / scale)); - y2 = min (resizedHeight, max (0, (y + h) / scale)); - } + value = keyfile.get_boolean(group_name, key); } -RetinexParams::RetinexParams () +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + Glib::ustring& value +) { - setDefaults (); + value = keyfile.get_string(group_name, key); } -void RetinexParams::getDefaulttransmissionCurve (std::vector &curve) +void getFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + std::vector& value +) { - double v[12] = { 0.00, 0.50, 0.35, 0.35, - 0.60, 0.75, 0.35, 0.35, - 1.00, 0.50, 0.35, 0.35, - }; + value = keyfile.get_double_list(group_name, key); + avoidEmptyCurve(value); +} +template +bool assignFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool has_params_edited, + T& value, + bool& params_edited_value +) +{ + if (keyfile.has_key(group_name, key)) { + getFromKeyfile(keyfile, group_name, key, value); - curve.resize (13); - curve.at (0 ) = double (FCT_MinMaxCPoints); + if (has_params_edited) { + params_edited_value = true; + } - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; + return true; } + return false; } -void RetinexParams::getDefaultgaintransmissionCurve (std::vector &curve) + +template::value>::type> +bool assignFromKeyfile( + const Glib::KeyFile& keyfile, + const Glib::ustring& group_name, + const Glib::ustring& key, + bool has_params_edited, + const std::map& mapping, + T& value, + bool& params_edited_value +) { - double v[16] = { 0.00, 0.1, 0.35, 0.00, - 0.25, 0.25, 0.35, 0.35, - 0.70, 0.25, 0.35, 0.35, - 1.00, 0.1, 0.00, 0.00 - }; + if (keyfile.has_key(group_name, key)) { + Glib::ustring v; + getFromKeyfile(keyfile, group_name, key, v); + const typename std::map::const_iterator m = mapping.find(v); + + if (m != mapping.end()) { + value = m->second; + } else { + return false; + } - curve.resize (17); - curve.at (0 ) = double (FCT_MinMaxCPoints); + if (has_params_edited) { + params_edited_value = true; + } - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; + return true; } + return false; } - -void RetinexParams::setDefaults() +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + int value, + Glib::KeyFile& keyfile +) { - enabled = false; - str = 20; - scal = 3; - iter = 1; - grad = 1; - grads = 1; - gam = 1.30; - slope = 3.; - neigh = 80; - offs = 0; - vart = 200; - limd = 8; - highl = 4; - highlights = 0; - htonalwidth = 80; - shadows = 0; - stonalwidth = 80; - radius = 40; - - skal = 3; - retinexMethod = "high"; - mapMethod = "none"; - viewMethod = "none"; - retinexcolorspace = "Lab"; - gammaretinex = "none"; - medianmap = false; - cdcurve.clear(); - cdcurve.push_back (DCT_Linear); - cdHcurve.clear(); - cdHcurve.push_back (DCT_Linear); - lhcurve.clear(); - lhcurve.push_back (DCT_Linear); - mapcurve.clear(); - mapcurve.push_back (DCT_Linear); - getDefaultgaintransmissionCurve (gaintransmissionCurve); + keyfile.set_integer(group_name, key, value); +} - getDefaulttransmissionCurve (transmissionCurve); +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + double value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_double(group_name, key, value); } -void RetinexParams::getCurves (RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + bool value, + Glib::KeyFile& keyfile +) { - transmissionCurveLUT.Set (this->transmissionCurve); - gaintransmissionCurveLUT.Set (this->gaintransmissionCurve); + keyfile.set_boolean(group_name, key, value); +} +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const Glib::ustring& value, + Glib::KeyFile& keyfile +) +{ + keyfile.set_string(group_name, key, value); } +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::vector& value, + Glib::KeyFile& keyfile +) +{ + const Glib::ArrayHandle list = value; + keyfile.set_integer_list(group_name, key, list); +} -ColorToningParams::ColorToningParams () : hlColSat (60, 80, false), shadowsColSat (80, 208, false) +void putToKeyfile( + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::vector& value, + Glib::KeyFile& keyfile +) { - setDefaults(); + const Glib::ArrayHandle list = value; + keyfile.set_double_list(group_name, key, list); } -void ColorToningParams::getDefaultColorCurve (std::vector &curve) +template +bool saveToKeyfile( + bool save, + const Glib::ustring& group_name, + const Glib::ustring& key, + const T& value, + Glib::KeyFile& keyfile +) { - double v[8] = { 0.050, 0.62, 0.25, 0.25, - 0.585, 0.11, 0.25, 0.25 - }; + if (save) { + putToKeyfile(group_name, key, value, keyfile); + return true; + } + return false; +} - curve.resize (9); - curve.at (0) = double (FCT_MinMaxCPoints); +template::value>::type> +bool saveToKeyfile( + bool save, + const Glib::ustring& group_name, + const Glib::ustring& key, + const std::map& mapping, + const T& value, + Glib::KeyFile& keyfile +) +{ + if (save) { + const typename std::map::const_iterator m = mapping.find(value); - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; + if (m != mapping.end()) { + keyfile.set_string(group_name, key, m->second); + return true; + } } + return false; +} + } +namespace rtengine +{ -void ColorToningParams::getDefaultOpacityCurve (std::vector &curve) +namespace procparams { - double v[16] = { 0.00, 0.3, 0.35, 0.00, - 0.25, 0.8, 0.35, 0.35, - 0.70, 0.8, 0.35, 0.35, - 1.00, 0.3, 0.00, 0.00 - }; - curve.resize (17); - curve.at (0 ) = double (FCT_MinMaxCPoints); - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +ToneCurveParams::ToneCurveParams() : + autoexp(false), + clip(0.02), + hrenabled(false), + method("Blend"), + expcomp(0), + curve{ + DCT_Linear + }, + curve2{ + DCT_Linear + }, + curveMode(ToneCurveParams::TcMode::STD), + curveMode2(ToneCurveParams::TcMode::STD), + brightness(0), + black(0), + contrast(0), + saturation(0), + shcompr(50), + hlcompr(0), + hlcomprthresh(33), + histmatching(false) +{ } -void ColorToningParams::getDefaultCLCurve (std::vector &curve) +bool ToneCurveParams::operator ==(const ToneCurveParams& other) const +{ + return + autoexp == other.autoexp + && clip == other.clip + && hrenabled == other.hrenabled + && method == other.method + && expcomp == other.expcomp + && curve == other.curve + && curve2 == other.curve2 + && curveMode == other.curveMode + && curveMode2 == other.curveMode2 + && brightness == other.brightness + && black == other.black + && contrast == other.contrast + && saturation == other.saturation + && shcompr == other.shcompr + && hlcompr == other.hlcompr + && hlcomprthresh == other.hlcomprthresh + && histmatching == other.histmatching; +} + +bool ToneCurveParams::operator !=(const ToneCurveParams& other) const +{ + return !(*this == other); +} + +RetinexParams::RetinexParams() : + enabled(false), + cdcurve{ + DCT_Linear + }, + cdHcurve{ + DCT_Linear + }, + lhcurve{ + DCT_Linear + }, + transmissionCurve{ + FCT_MinMaxCPoints, + 0.00, + 0.50, + 0.35, + 0.35, + 0.60, + 0.75, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + gaintransmissionCurve{ + FCT_MinMaxCPoints, + 0.00, + 0.1, + 0.35, + 0.00, + 0.25, + 0.25, + 0.35, + 0.35, + 0.70, + 0.25, + 0.35, + 0.35, + 1.00, + 0.1, + 0.00, + 0.00 + }, + mapcurve{ + DCT_Linear + }, + str(20), + scal(3), + iter(1), + grad(1), + grads(1), + gam(1.30), + slope(3.), + neigh(80), + offs(0), + highlights(0), + htonalwidth(80), + shadows(0), + stonalwidth(80), + radius(40), + retinexMethod("high"), + retinexcolorspace("Lab"), + gammaretinex("none"), + mapMethod("none"), + viewMethod("none"), + vart(200), + limd(8), + highl(4), + skal(3), + medianmap(false) { - double v[6] = { 0.00, 0.00, - 0.35, 0.65, - 1.00, 1.00 - }; +} - curve.resize (7); - curve.at (0) = double (DCT_NURBS); +bool RetinexParams::operator ==(const RetinexParams& other) const +{ + return + enabled == other.enabled + && cdcurve == other.cdcurve + && cdHcurve == other.cdHcurve + && lhcurve == other.lhcurve + && transmissionCurve == other.transmissionCurve + && gaintransmissionCurve == other.gaintransmissionCurve + && mapcurve == other.mapcurve + && str == other.str + && scal == other.scal + && iter == other.iter + && grad == other.grad + && grads == other.grads + && gam == other.gam + && slope == other.slope + && neigh == other.neigh + && offs == other.offs + && highlights == other.highlights + && htonalwidth == other.htonalwidth + && shadows == other.shadows + && stonalwidth == other.stonalwidth + && radius == other.radius + && retinexMethod == other.retinexMethod + && retinexcolorspace == other.retinexcolorspace + && gammaretinex == other.gammaretinex + && mapMethod == other.mapMethod + && viewMethod == other.viewMethod + && vart == other.vart + && limd == other.limd + && highl == other.highl + && skal == other.skal + && medianmap == other.medianmap; +} + +bool RetinexParams::operator !=(const RetinexParams& other) const +{ + return !(*this == other); +} + +void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const +{ + transmissionCurveLUT.Set(this->transmissionCurve); + gaintransmissionCurveLUT.Set(this->gaintransmissionCurve); + +} + +LCurveParams::LCurveParams() : + enabled(false), + lcurve{ + DCT_Linear + }, + acurve{ + DCT_Linear + }, + bcurve{ + DCT_Linear + }, + cccurve{ + DCT_Linear + }, + chcurve{ + FCT_Linear + }, + lhcurve{ + FCT_Linear + }, + hhcurve{ + FCT_Linear + }, + lccurve{ + DCT_Linear + }, + clcurve{ + DCT_Linear + }, + brightness(0), + contrast(0), + chromaticity(0), + avoidcolorshift(false), + rstprotection(0), + lcredsk(true) +{ +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; +bool LCurveParams::operator ==(const LCurveParams& other) const +{ + return + enabled == other.enabled + && lcurve == other.lcurve + && acurve == other.acurve + && bcurve == other.bcurve + && cccurve == other.cccurve + && chcurve == other.chcurve + && lhcurve == other.lhcurve + && hhcurve == other.hhcurve + && lccurve == other.lccurve + && clcurve == other.clcurve + && brightness == other.brightness + && contrast == other.contrast + && chromaticity == other.chromaticity + && avoidcolorshift == other.avoidcolorshift + && rstprotection == other.rstprotection + && lcredsk == other.lcredsk; +} + +bool LCurveParams::operator !=(const LCurveParams& other) const +{ + return !(*this == other); +} + +RGBCurvesParams::RGBCurvesParams() : + enabled(false), + lumamode(false), + rcurve{ + DCT_Linear + }, + gcurve{ + DCT_Linear + }, + bcurve{ + DCT_Linear } +{ } -void ColorToningParams::getDefaultCL2Curve (std::vector &curve) +bool RGBCurvesParams::operator ==(const RGBCurvesParams& other) const { - double v[6] = { 0.00, 0.00, - 0.35, 0.65, - 1.00, 1.00 - }; + return + enabled == other.enabled + && lumamode == other.lumamode + && rcurve == other.rcurve + && gcurve == other.gcurve + && bcurve == other.bcurve; +} + +bool RGBCurvesParams::operator !=(const RGBCurvesParams& other) const +{ + return !(*this == other); +} - curve.resize (7); - curve.at (0) = double (DCT_NURBS); - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +LocalContrastParams::LocalContrastParams(): + enabled(false), + radius(80), + amount(0.2), + darkness(1.0), + lightness(1.0) +{ } -void ColorToningParams::setDefaults() + +bool LocalContrastParams::operator==(const LocalContrastParams &other) const { - enabled = false; - autosat = true; - method = "Lab"; + return + enabled == other.enabled + && radius == other.radius + && amount == other.amount + && darkness == other.darkness + && lightness == other.lightness; +} + + +bool LocalContrastParams::operator!=(const LocalContrastParams &other) const +{ + return !(*this == other); +} + + +const double ColorToningParams::LABGRID_CORR_MAX = 12000.f; + +ColorToningParams::ColorToningParams() : + enabled(false), + autosat(true), + opacityCurve{ + FCT_MinMaxCPoints, + 0.00, + 0.3, + 0.35, + 0.00, + 0.25, + 0.8, + 0.35, + 0.35, + 0.70, + 0.8, + 0.35, + 0.35, + 1.00, + 0.3, + 0.00, + 0.00 + }, + colorCurve{ + FCT_MinMaxCPoints, + 0.050, + 0.62, + 0.25, + 0.25, + 0.585, + 0.11, + 0.25, + 0.25 + }, + satProtectionThreshold(30), + saturatedOpacity(80), + strength(50), + balance(0), + hlColSat(60, 80, false), + shadowsColSat (80, 208, false), + clcurve{ + DCT_NURBS, + 0.00, + 0.00, + 0.35, + 0.65, + 1.00, + 1.00 + }, + cl2curve{ + DCT_NURBS, + 0.00, + 0.00, + 0.35, + 0.65, + 1.00, + 1.00 + }, + method("Lab"), + twocolor("Std"), + redlow(0.0), + greenlow(0.0), + bluelow(0.0), + redmed(0.0), + greenmed(0.0), + bluemed(0.0), + redhigh(0.0), + greenhigh(0.0), + bluehigh(0.0), + satlow(0.0), + sathigh(0.0), + lumamode(true), + labgridALow(0.0), + labgridBLow(0.0), + labgridAHigh(0.0), + labgridBHigh(0.0) +{ +} - getDefaultColorCurve (colorCurve); - getDefaultOpacityCurve (opacityCurve); - getDefaultCLCurve (clcurve); - getDefaultCL2Curve (cl2curve); +bool ColorToningParams::operator ==(const ColorToningParams& other) const +{ + return + enabled == other.enabled + && autosat == other.autosat + && opacityCurve == other.opacityCurve + && colorCurve == other.colorCurve + && satProtectionThreshold == other.satProtectionThreshold + && saturatedOpacity == other.saturatedOpacity + && strength == other.strength + && balance == other.balance + && hlColSat == other.hlColSat + && shadowsColSat == other.shadowsColSat + && clcurve == other.clcurve + && cl2curve == other.cl2curve + && method == other.method + && twocolor == other.twocolor + && redlow == other.redlow + && greenlow == other.greenlow + && bluelow == other.bluelow + && redmed == other.redmed + && greenmed == other.greenmed + && bluemed == other.bluemed + && redhigh == other.redhigh + && greenhigh == other.greenhigh + && bluehigh == other.bluehigh + && satlow == other.satlow + && sathigh == other.sathigh + && lumamode == other.lumamode + && labgridALow == other.labgridALow + && labgridBLow == other.labgridBLow + && labgridAHigh == other.labgridAHigh + && labgridBHigh == other.labgridBHigh; +} - hlColSat.setValues (60, 80); - shadowsColSat.setValues (80, 208); - balance = 0; - satProtectionThreshold = 30; - saturatedOpacity = 80; - strength = 50; - lumamode = true; - twocolor = "Std"; - redlow = 0.0; - greenlow = 0.0; - bluelow = 0.0; - satlow = 0.0; - sathigh = 0.0; - redmed = 0.0; - greenmed = 0.0; - bluemed = 0.0; - redhigh = 0.0; - greenhigh = 0.0; - bluehigh = 0.0; +bool ColorToningParams::operator !=(const ColorToningParams& other) const +{ + return !(*this == other); } -void ColorToningParams::mixerToCurve (std::vector &colorCurve, std::vector &opacityCurve) const +void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vector& opacityCurve) const { // check if non null first if (!redlow && !greenlow && !bluelow && !redmed && !greenmed && !bluemed && !redhigh && !greenhigh && !bluehigh) { @@ -456,15 +869,10 @@ high[0] = high[1] = high[2] = 1.f; } - - - const double xPosLow = 0.1; const double xPosMed = 0.4; const double xPosHigh = 0.7; - - colorCurve.resize ( medSat != 0.f ? 13 : 9 ); colorCurve.at (0) = FCT_MinMaxCPoints; opacityCurve.resize (13); @@ -525,9 +933,9 @@ opacityCurve.at (12) = 0.35; } -void ColorToningParams::slidersToCurve (std::vector &colorCurve, std::vector &opacityCurve) const +void ColorToningParams::slidersToCurve(std::vector& colorCurve, std::vector& opacityCurve) const { - if (hlColSat.value[0] == 0 && shadowsColSat.value[0] == 0) { // if both opacity are null, set both curves to Linear + if (hlColSat.getBottom() == 0 && shadowsColSat.getBottom() == 0) { // if both opacity are null, set both curves to Linear colorCurve.resize (1); colorCurve.at (0) = FCT_Linear; opacityCurve.resize (1); @@ -538,27 +946,27 @@ colorCurve.resize (9); colorCurve.at (0) = FCT_MinMaxCPoints; colorCurve.at (1) = 0.26 + 0.12 * double (balance) / 100.; - colorCurve.at (2) = double (shadowsColSat.value[1]) / 360.; + colorCurve.at (2) = double (shadowsColSat.getTop()) / 360.; colorCurve.at (3) = 0.35; colorCurve.at (4) = 0.35; colorCurve.at (5) = 0.64 + 0.12 * double (balance) / 100.; - colorCurve.at (6) = double (hlColSat.value[1]) / 360.; + colorCurve.at (6) = double (hlColSat.getTop()) / 360.; colorCurve.at (7) = 0.35; colorCurve.at (8) = 0.35; opacityCurve.resize (9); opacityCurve.at (0) = FCT_MinMaxCPoints; opacityCurve.at (1) = colorCurve.at (1); - opacityCurve.at (2) = double (shadowsColSat.value[0]) / 100.; + opacityCurve.at (2) = double (shadowsColSat.getBottom()) / 100.; opacityCurve.at (3) = 0.35; opacityCurve.at (4) = 0.35; opacityCurve.at (5) = colorCurve.at (5); - opacityCurve.at (6) = double (hlColSat.value[0]) / 100.; + opacityCurve.at (6) = double (hlColSat.getBottom()) / 100.; opacityCurve.at (7) = 0.35; opacityCurve.at (8) = 0.35; } -void ColorToningParams::getCurves (ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], const double rgb_xyz[3][3], bool &opautili) const +void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurve& opacityCurveLUT, const double xyz_rgb[3][3], bool& opautili) const { float satur = 0.8f; float lumin = 0.5f; //middle of luminance for optimization of gamut - no real importance...as we work in XYZ and gamut control @@ -584,7575 +992,3771 @@ satur = 0.9f; } - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, rgb_xyz, satur, lumin); + colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); opacityCurveLUT.Set (oCurve, opautili); } else if (method == "Splitlr" || method == "Splitco") { - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, rgb_xyz, satur, lumin); + colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); opacityCurveLUT.Set (oCurve, opautili); } else if (method.substr (0, 3) == "RGB") { - colorCurveLUT.SetRGB (cCurve, xyz_rgb, rgb_xyz); + colorCurveLUT.SetRGB (cCurve); opacityCurveLUT.Set (oCurve, opautili); } } SharpeningParams::SharpeningParams() : - enabled (false), - radius (0.5), - amount (200), - threshold (20, 80, 2000, 1200, false), - edgesonly (false), - edges_radius (1.9), - edges_tolerance (1800), - halocontrol (false), - halocontrol_amount (85), - deconvamount (75), - deconvradius (0.75), - deconviter (30), - deconvdamping (20) -{}; - - -VibranceParams::VibranceParams() : - enabled (false), - pastels (0), - saturated (0), - psthreshold (0, 75, false), - protectskins (false), - avoidcolorshift (true), - pastsattog (true) -{}; - - -//WaveletParams::WaveletParams (): hueskin(-5, 25, 170, 120, false), hueskin2(-260, -250, -130, -140, false), hllev(50, 75, 100, 98, false), bllev(0, 2, 50, 25, false), pastlev(0, 2, 30, 20, false), satlev(30, 45, 130, 100, false), edgcont(0, 20, 100, 75, false){ - -WaveletParams::WaveletParams() : - hueskin ( -5, 25, 170, 120, false), - hueskin2 (-260, -250, -130, -140, false), - hllev ( 50, 75, 100, 98, false), - bllev ( 0, 2, 50, 25, false), - pastlev ( 0, 2, 30, 20, false), - satlev ( 30, 45, 130, 100, false), - edgcont ( bl, tl, br, tr, false), - /*edgcont ( 0, 10, 75, 40, false),*/ - level0noise (0, 0, false), - level1noise (0, 0, false), - level2noise (0, 0, false), - level3noise (0, 0, false) + enabled(false), + radius(0.5), + amount(200), + threshold(20, 80, 2000, 1200, false), + edgesonly(false), + edges_radius(1.9), + edges_tolerance(1800), + halocontrol(false), + halocontrol_amount(85), + method("usm"), + deconvamount(75), + deconvradius(0.75), + deconviter(30), + deconvdamping(20) { - setDefaults (); } -void WaveletParams::getDefaultOpacityCurveRG (std::vector &curve) +bool SharpeningParams::operator ==(const SharpeningParams& other) const { - double v[8] = { 0.0, 0.50, 0.35, 0.35, - 1.00, 0.50, 0.35, 0.35 - }; - - curve.resize (9); - curve.at (0) = double (FCT_MinMaxCPoints); - - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } + return + enabled == other.enabled + && radius == other.radius + && amount == other.amount + && threshold == other.threshold + && edgesonly == other.edgesonly + && edges_radius == other.edges_radius + && edges_tolerance == other.edges_tolerance + && halocontrol == other.halocontrol + && halocontrol_amount == other.halocontrol_amount + && method == other.method + && deconvamount == other.deconvamount + && deconvradius == other.deconvradius + && deconviter == other.deconviter + && deconvdamping == other.deconvdamping; } -void WaveletParams::getDefaultOpacityCurveBY (std::vector &curve) -{ - double v[8] = { 0.0, 0.50, 0.35, 0.35, - 1.00, 0.50, 0.35, 0.35 - }; - curve.resize (9); - curve.at (0 ) = double (FCT_MinMaxCPoints); +bool SharpeningParams::operator !=(const SharpeningParams& other) const +{ + return !(*this == other); +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +SharpenEdgeParams::SharpenEdgeParams() : + enabled(false), + passes(2), + amount(50.0), + threechannels(false) +{ } +bool SharpenEdgeParams::operator ==(const SharpenEdgeParams& other) const +{ + return + enabled == other.enabled + && passes == other.passes + && amount == other.amount + && threechannels == other.threechannels; +} -void WaveletParams::getDefaultOpacityCurveW (std::vector &curve) +bool SharpenEdgeParams::operator !=(const SharpenEdgeParams& other) const { - double v[16] = { 0.00, 0.35, 0.35, 0.00, - 0.35, 0.75, 0.35, 0.35, - 0.60, 0.75, 0.35, 0.35, - 1.00, 0.35, 0.00, 0.00 - }; - curve.resize (17); - curve.at (0) = double (FCT_MinMaxCPoints); + return !(*this == other); +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +SharpenMicroParams::SharpenMicroParams() : + enabled(false), + matrix(false), + amount(20.0), + uniformity(50.0) +{ } -void WaveletParams::getDefaultOpacityCurveWL (std::vector &curve) +bool SharpenMicroParams::operator ==(const SharpenMicroParams& other) const { - double v[8] = { 0.0, 0.50, 0.35, 0.35, - 1.00, 0.50, 0.35, 0.35 - }; + return + enabled == other.enabled + && matrix == other.matrix + && amount == other.amount + && uniformity == other.uniformity; +} - /*double v[12]={ 0.00, 0.53, 0.35, 0.00, - 0.42, 0.53, 0.35, 0.35, - 1.00, 0.15, 0.00, 0.00 }; - */ - curve.resize (9); - curve.at (0) = double (FCT_MinMaxCPoints); +bool SharpenMicroParams::operator !=(const SharpenMicroParams& other) const +{ + return !(*this == other); +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; +VibranceParams::VibranceParams() : + enabled(false), + pastels(0), + saturated(0), + psthreshold(0, 75, false), + protectskins(false), + avoidcolorshift(true), + pastsattog(true), + skintonescurve{ + DCT_Linear } +{ } - -void WaveletParams::getDefaultCCWCurve (std::vector &curve) +bool VibranceParams::operator ==(const VibranceParams& other) const { - double v[12] = { 0.0, 0.25, 0.35, 0.35, - 0.50, 0.75, 0.35, 0.35, - 0.90, 0.0, 0.35, 0.35 - }; - - curve.resize (13); - curve.at (0 ) = double (FCT_MinMaxCPoints); - - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } + return + enabled == other.enabled + && pastels == other.pastels + && saturated == other.saturated + && psthreshold == other.psthreshold + && protectskins == other.protectskins + && avoidcolorshift == other.avoidcolorshift + && pastsattog == other.pastsattog + && skintonescurve == other.skintonescurve; +} +bool VibranceParams::operator !=(const VibranceParams& other) const +{ + return !(*this == other); } -void WaveletParams::getCurves (WavCurve &cCurve, WavOpacityCurveRG &opacityCurveLUTRG, WavOpacityCurveBY &opacityCurveLUTBY, WavOpacityCurveW &opacityCurveLUTW, WavOpacityCurveWL &opacityCurveLUTWL) const +WBParams::WBParams() : + enabled(true), + method("Camera"), + temperature(6504), + green(1.0), + equal(1.0), + tempBias(0.0) { - cCurve.Set (this->ccwcurve); - opacityCurveLUTRG.Set (this->opacityCurveRG); - opacityCurveLUTBY.Set (this->opacityCurveBY); - opacityCurveLUTW.Set (this->opacityCurveW); - opacityCurveLUTWL.Set (this->opacityCurveWL); +} +bool WBParams::operator ==(const WBParams& other) const +{ + return + enabled == other.enabled + && method == other.method + && temperature == other.temperature + && green == other.green + && equal == other.equal + && tempBias == other.tempBias; +} + +bool WBParams::operator !=(const WBParams& other) const +{ + return !(*this == other); +} + +const std::vector& WBParams::getWbEntries() +{ + static const std::vector wb_entries = { + {"Camera", WBEntry::Type::CAMERA, M("TP_WBALANCE_CAMERA"), 0, 1.f, 1.f, 0.f}, + {"Auto", WBEntry::Type::AUTO, M("TP_WBALANCE_AUTO"), 0, 1.f, 1.f, 0.f}, + {"Daylight", WBEntry::Type::DAYLIGHT, M("TP_WBALANCE_DAYLIGHT"), 5300, 1.f, 1.f, 0.f}, + {"Cloudy", WBEntry::Type::CLOUDY, M("TP_WBALANCE_CLOUDY"), 6200, 1.f, 1.f, 0.f}, + {"Shade", WBEntry::Type::SHADE, M("TP_WBALANCE_SHADE"), 7600, 1.f, 1.f, 0.f}, + {"Water 1", WBEntry::Type::WATER, M("TP_WBALANCE_WATER1"), 35000, 0.3f, 1.1f, 0.f}, + {"Water 2", WBEntry::Type::WATER, M("TP_WBALANCE_WATER2"), 48000, 0.63f, 1.38f, 0.f}, + {"Tungsten", WBEntry::Type::TUNGSTEN, M("TP_WBALANCE_TUNGSTEN"), 2856, 1.f, 1.f, 0.f}, + {"Fluo F1", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO1"), 6430, 1.f, 1.f, 0.f}, + {"Fluo F2", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO2"), 4230, 1.f, 1.f, 0.f}, + {"Fluo F3", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO3"), 3450, 1.f, 1.f, 0.f}, + {"Fluo F4", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO4"), 2940, 1.f, 1.f, 0.f}, + {"Fluo F5", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO5"), 6350, 1.f, 1.f, 0.f}, + {"Fluo F6", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO6"), 4150, 1.f, 1.f, 0.f}, + {"Fluo F7", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO7"), 6500, 1.f, 1.f, 0.f}, + {"Fluo F8", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO8"), 5020, 1.f, 1.f, 0.f}, + {"Fluo F9", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO9"), 4330, 1.f, 1.f, 0.f}, + {"Fluo F10", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO10"), 5300, 1.f, 1.f, 0.f}, + {"Fluo F11", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO11"), 4000, 1.f, 1.f, 0.f}, + {"Fluo F12", WBEntry::Type::FLUORESCENT, M("TP_WBALANCE_FLUO12"), 3000, 1.f, 1.f, 0.f}, + {"HMI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_HMI"), 4800, 1.f, 1.f, 0.f}, + {"GTI Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_GTI"), 5000, 1.f, 1.f, 0.f}, + {"JudgeIII Lamp", WBEntry::Type::LAMP, M("TP_WBALANCE_JUDGEIII"), 5100, 1.f, 1.f, 0.f}, + {"Solux Lamp 3500K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX35"), 3480, 1.f, 1.f, 0.f}, + {"Solux Lamp 4100K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX41"), 3930, 1.f, 1.f, 0.f}, + {"Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47"), 4700, 1.f, 1.f, 0.f}, + {"NG Solux Lamp 4700K", WBEntry::Type::LAMP, M("TP_WBALANCE_SOLUX47_NG"), 4480, 1.f, 1.f, 0.f}, + {"LED LSI Lumelex 2040", WBEntry::Type::LED, M("TP_WBALANCE_LED_LSI"), 2970, 1.f, 1.f, 0.f}, + {"LED CRS SP12 WWMR16", WBEntry::Type::LED, M("TP_WBALANCE_LED_CRS"), 3050, 1.f, 1.f, 0.f}, + {"Flash 5500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH55"), 5500, 1.f, 1.f, 0.f}, + {"Flash 6000K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH60"), 6000, 1.f, 1.f, 0.f}, + {"Flash 6500K", WBEntry::Type::FLASH, M("TP_WBALANCE_FLASH65"), 6500, 1.f, 1.f, 0.f}, + // Should remain the last one + {"Custom", WBEntry::Type::CUSTOM, M ("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} + }; + + return wb_entries; +} + +ColorAppearanceParams::ColorAppearanceParams() : + enabled(false), + degree(90), + autodegree(true), + degreeout(90), + autodegreeout(true), + curve{ + DCT_Linear + }, + curve2{ + DCT_Linear + }, + curve3{ + DCT_Linear + }, + curveMode(TcMode::LIGHT), + curveMode2(TcMode::LIGHT), + curveMode3(CtcMode::CHROMA), + surround("Average"), + surrsrc("Average"), + adapscen(2000.0), + autoadapscen(true), + ybscen(18), + autoybscen(true), + adaplum(16), + badpixsl(0), + wbmodel("RawT"), + algo("No"), + contrast(0.0), + qcontrast(0.0), + jlight(0.0), + qbright(0.0), + chroma(0.0), + schroma(0.0), + mchroma(0.0), + colorh(0.0), + rstprotection(0.0), + surrsource(false), + gamut(true), + datacie(false), + tonecie(false), + tempout(5000), + ybout(18), + greenout(1.0), + tempsc(5000), + greensc(1.0) +{ } -void WaveletParams::setDefaults() +bool ColorAppearanceParams::operator ==(const ColorAppearanceParams& other) const { - getDefaultCCWCurve (ccwcurve); - getDefaultOpacityCurveRG (opacityCurveRG); - getDefaultOpacityCurveBY (opacityCurveBY); - getDefaultOpacityCurveW (opacityCurveW); - getDefaultOpacityCurveWL (opacityCurveWL); - enabled = false; - median = false; - medianlev = false; - linkedg = true; - cbenab = false; - lipst = false; - Medgreinf = "less"; //"none"; - avoid = false; - tmr = false; - strength = 100; - balance = 0; - iter = 0; - wavclCurve.clear (); - wavclCurve.push_back (DCT_Linear); - - Lmethod = "4_"; - CHmethod = "without"; - CHSLmethod = "SL"; - EDmethod = "CU"; - NPmethod = "none"; - BAmethod = "none"; - TMmethod = "cont"; - HSmethod = "with"; - CLmethod = "all"; - Backmethod = "grey"; - Dirmethod = "all"; - Tilesmethod = "full"; - daubcoeffmethod = "4_"; - rescon = 0; - resconH = 0; - reschro = 0; - tmrs = 0; - gamma = 1; - sky = 0.; - sup = 0; - thres = 7; - chroma = 5; - chro = 0; - contrast = 0; - edgrad = 15; - edgval = 0; - edgthresh = 10; - thr = 35; - thrH = 65; - skinprotect = 0.; - hueskin.setValues ( -5, 25, 170, 120); - hueskin2.setValues (-260, -250, -130, -140); - threshold = 5; - threshold2 = 4; - edgedetect = 90; - edgedetectthr = 20; - edgedetectthr2 = 0; - edgesensi = 60; - edgeampli = 10; - hllev.setValues (50, 75, 100, 98); - bllev.setValues ( 0, 2, 50, 25); - pastlev.setValues ( 0, 2, 30, 20); - satlev.setValues (30, 45, 130, 100); - //edgcont.setValues (bl, tl, br, tr); - edgcont.setValues ( 0, 10, 75, 40); - level0noise.setValues (0, 0); - level1noise.setValues (0, 0); - level2noise.setValues (0, 0); - level3noise.setValues (0, 0); - hhcurve.clear (); - hhcurve.push_back (FCT_Linear); - Chcurve.clear (); - Chcurve.push_back (FCT_Linear); - expcontrast = false; - expchroma = false; - expedge = false; - expresid = false; - expfinal = false; - exptoning = false; - expnoise = false; - - for (int i = 0; i < 9; i ++) { - c[i] = 0; - } - - for (int i = 0; i < 9; i ++) { - ch[i] = 0; + return + enabled == other.enabled + && degree == other.degree + && autodegree == other.autodegree + && degreeout == other.degreeout + && autodegreeout == other.autodegreeout + && curve == other.curve + && curve2 == other.curve2 + && curve3 == other.curve3 + && curveMode == other.curveMode + && curveMode2 == other.curveMode2 + && curveMode3 == other.curveMode3 + && surround == other.surround + && surrsrc == other.surrsrc + && adapscen == other.adapscen + && autoadapscen == other.autoadapscen + && ybscen == other.ybscen + && autoybscen == other.autoybscen + && adaplum == other.adaplum + && badpixsl == other.badpixsl + && wbmodel == other.wbmodel + && algo == other.algo + && contrast == other.contrast + && qcontrast == other.qcontrast + && jlight == other.jlight + && qbright == other.qbright + && chroma == other.chroma + && schroma == other.schroma + && mchroma == other.mchroma + && colorh == other.colorh + && rstprotection == other.rstprotection + && surrsource == other.surrsource + && gamut == other.gamut + && datacie == other.datacie + && tonecie == other.tonecie + && tempout == other.tempout + && ybout == other.ybout + && greenout == other.greenout + && tempsc == other.tempsc + && greensc == other.greensc; +} + +bool ColorAppearanceParams::operator !=(const ColorAppearanceParams& other) const +{ + return !(*this == other); +} + +DefringeParams::DefringeParams() : + enabled(false), + radius(2.0), + threshold(13), + huecurve{ + FCT_MinMaxCPoints, + 0.166666667, + 0., + 0.35, + 0.35, + 0.347, + 0., + 0.35, + 0.35, + 0.513667426, + 0, + 0.35, + 0.35, + 0.668944571, + 0., + 0.35, + 0.35, + 0.8287775246, + 0.97835991, + 0.35, + 0.35, + 0.9908883827, + 0., + 0.35, + 0.35 } - - greenlow = greenmed = greenhigh = 0.0; - bluelow = bluemed = bluehigh = 0.0; - +{ } +bool DefringeParams::operator ==(const DefringeParams& other) const +{ + return + enabled == other.enabled + && radius == other.radius + && threshold == other.threshold + && huecurve == other.huecurve; +} -DirPyrDenoiseParams::DirPyrDenoiseParams () +bool DefringeParams::operator !=(const DefringeParams& other) const { - setDefaults (); + return !(*this == other); } -void DirPyrDenoiseParams::getDefaultNoisCurve (std::vector &curve) +ImpulseDenoiseParams::ImpulseDenoiseParams() : + enabled(false), + thresh(50) { - double v[8] = { 0.05, 0.15, 0.35, 0.35, - 0.55, 0.04, 0.35, 0.35 - }; - curve.resize (9); - curve.at (0 ) = double (FCT_MinMaxCPoints); +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +bool ImpulseDenoiseParams::operator ==(const ImpulseDenoiseParams& other) const +{ + return + enabled == other.enabled + && thresh == other.thresh; } -void DirPyrDenoiseParams::getDefaultCCCurve (std::vector &curve) +bool ImpulseDenoiseParams::operator !=(const ImpulseDenoiseParams& other) const { - // double v[8]= { 0.15, 0.00,0.35,0.35, - // 0.60, 0.05,0.35,0.35}; - double v[8] = { 0.05, 0.50, 0.35, 0.35, - 0.35, 0.05, 0.35, 0.35 - }; + return !(*this == other); +} - curve.resize (9); - curve.at (0 ) = double (FCT_MinMaxCPoints); +DirPyrDenoiseParams::DirPyrDenoiseParams() : + lcurve{ + FCT_MinMaxCPoints, + 0.05, + 0.15, + 0.35, + 0.35, + 0.55, + 0.04, + 0.35, + 0.35 + }, + cccurve{ + FCT_MinMaxCPoints, + 0.05, + 0.50, + 0.35, + 0.35, + 0.35, + 0.05, + 0.35, + 0.35 + }, + enabled(false), + enhance(false), + median(false), + perform(false), + luma(0), + Ldetail(0), + chroma(15), + redchro(0), + bluechro(0), + gamma(1.7), + dmethod("Lab"), + Lmethod("SLI"), + Cmethod("MAN"), + C2method("AUTO"), + smethod("shal"), + medmethod("soft"), + methodmed("none"), + rgbmethod("soft"), + passes(1) +{ +} - for (size_t i = 1; i < curve.size(); ++i) { - curve.at (i) = v[i - 1]; - } +bool DirPyrDenoiseParams::operator ==(const DirPyrDenoiseParams& other) const +{ + return + lcurve == other.lcurve + && cccurve == other.cccurve + && enabled == other.enabled + && enhance == other.enhance + && median == other.median + && perform == other.perform + && luma == other.luma + && Ldetail == other.Ldetail + && chroma == other.chroma + && redchro == other.redchro + && bluechro == other.bluechro + && gamma == other.gamma + && dmethod == other.dmethod + && Lmethod == other.Lmethod + && Cmethod == other.Cmethod + && C2method == other.C2method + && smethod == other.smethod + && medmethod == other.medmethod + && methodmed == other.methodmed + && rgbmethod == other.rgbmethod + && passes == other.passes; } +bool DirPyrDenoiseParams::operator !=(const DirPyrDenoiseParams& other) const +{ + return !(*this == other); +} -void DirPyrDenoiseParams::setDefaults() +void DirPyrDenoiseParams::getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const { + lCurve.Set(this->lcurve); + cCurve.Set(this->cccurve); +} - getDefaultNoisCurve (lcurve); - getDefaultCCCurve (cccurve); +EPDParams::EPDParams() : + enabled(false), + strength(0.5), + gamma(1.0), + edgeStopping(1.4), + scale(1.0), + reweightingIterates(0) +{ +} - enabled = false; - enhance = false; - median = false; - perform = false; - luma = 0; - passes = 1; - dmethod = "Lab"; - Lmethod = "SLI";//"CUR";// SLIDER method with value 0 is set as default, while the default Lcurve is populated via getDefaultNoisCurve and can be switched to by the user - Cmethod = "MAN"; - C2method = "AUTO"; - smethod = "shal"; - medmethod = "soft"; - methodmed = "none"; - rgbmethod = "soft"; - Ldetail = 0; - chroma = 15; - redchro = 0; - bluechro = 0; - gamma = 1.7; - perform = false; +bool EPDParams::operator ==(const EPDParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength + && gamma == other.gamma + && edgeStopping == other.edgeStopping + && scale == other.scale + && reweightingIterates == other.reweightingIterates; } -void DirPyrDenoiseParams::getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const +bool EPDParams::operator !=(const EPDParams& other) const { - lCurve.Set (this->lcurve); - cCurve.Set (this->cccurve); + return !(*this == other); } -void ToneCurveParams::setDefaults() +FattalToneMappingParams::FattalToneMappingParams() : + enabled(false), + threshold(0), + amount(30), + anchor(50) { - autoexp = false; - clip = 0.02; - expcomp = 0; - brightness = 0; - contrast = 0; - saturation = 0; - black = 0; - hlcompr = 0; - hlcomprthresh = 33; - shcompr = 50; - curve.clear (); - curve.push_back (DCT_Linear); - curve2.clear (); - curve2.push_back (DCT_Linear); - curveMode = ToneCurveParams::TC_MODE_STD; - curveMode2 = ToneCurveParams::TC_MODE_STD; - hrenabled = false; - method = "Blend"; -} - -void LensProfParams::setDefaults() -{ - lcMode = LcMode::NONE; - lcpFile = ""; - useDist = useVign = true; - useCA = false; - lfCameraMake = ""; - lfCameraModel = ""; - lfLens = ""; -} - -void CoarseTransformParams::setDefaults() -{ - rotate = 0; - hflip = false; - vflip = false; } -void RAWParams::BayerSensor::setPixelShiftDefaults() + +bool FattalToneMappingParams::operator ==(const FattalToneMappingParams& other) const { - pixelShiftMotion = 0; - pixelShiftMotionCorrection = RAWParams::BayerSensor::Grid3x3New; - pixelShiftMotionCorrectionMethod = RAWParams::BayerSensor::Automatic; - pixelShiftStddevFactorGreen = 5.0; - pixelShiftStddevFactorRed = 5.0; - pixelShiftStddevFactorBlue = 5.0; - pixelShiftEperIso = 0.0; - pixelShiftNreadIso = 0.0; - pixelShiftPrnu = 1.0; - pixelShiftSigma = 1.0; - pixelShiftSum = 3.0; - pixelShiftRedBlueWeight = 0.7; - pixelShiftAutomatic = true; - pixelShiftNonGreenHorizontal = false; - pixelShiftNonGreenVertical = false; - pixelShiftHoleFill = true; - pixelShiftMedian = false; - pixelShiftMedian3 = false; - pixelShiftGreen = true; - pixelShiftBlur = true; - pixelShiftSmoothFactor = 0.7; - pixelShiftExp0 = false; - pixelShiftLmmse = false; - pixelShiftEqualBright = false; - pixelShiftEqualBrightChannel = false; - pixelShiftNonGreenCross = true; - pixelShiftNonGreenCross2 = false; - pixelShiftNonGreenAmaze = false; + return + enabled == other.enabled + && threshold == other.threshold + && amount == other.amount + && anchor == other.anchor; } -void RAWParams::setDefaults() +bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) const { - bayersensor.method = RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze]; - bayersensor.imageNum = 0; - bayersensor.ccSteps = 0; - bayersensor.dcb_iterations = 2; - bayersensor.dcb_enhance = true; -//bayersensor.all_enhance = false; - bayersensor.lmmse_iterations = 2; - bayersensor.black0 = 0.0; - bayersensor.black1 = 0.0; - bayersensor.black2 = 0.0; - bayersensor.black3 = 0.0; - bayersensor.twogreen = true; - bayersensor.linenoise = 0; - bayersensor.greenthresh = 0; - - xtranssensor.method = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::threePass]; - xtranssensor.ccSteps = 0; - xtranssensor.blackred = 0.0; - xtranssensor.blackgreen = 0.0; - xtranssensor.blackblue = 0.0; - - expos = 1.0; - preser = 0.0; - df_autoselect = false; - ff_AutoSelect = false; - ff_BlurRadius = 32; - ff_BlurType = RAWParams::ff_BlurTypestring[RAWParams::area_ff]; - ff_AutoClipControl = false; - ff_clipControl = 0; - cared = 0; - cablue = 0; - ca_autocorrect = false; - hotPixelFilter = false; - deadPixelFilter = false; - hotdeadpix_thresh = 100; - bayersensor.setPixelShiftDefaults(); - bayersensor.pixelShiftShowMotion = false; - bayersensor.pixelShiftShowMotionMaskOnly = false; + return !(*this == other); +} +SHParams::SHParams() : + enabled(false), + hq(false), + highlights(0), + htonalwidth(80), + shadows(0), + stonalwidth(80), + radius(40) +{ } -void ColorManagementParams::setDefaults() -{ - input = "(cameraICC)"; - toneCurve = false; - applyLookTable = false; - applyBaselineExposureOffset = true; - applyHueSatMap = true; - dcpIlluminant = 0; - working = "ProPhoto"; - output = "RT_sRGB"; - outputIntent = RI_RELATIVE; - outputBPC = true; - gamma = "default"; - gampos = 2.22; - slpos = 4.5; - freegamma = false; +bool SHParams::operator ==(const SHParams& other) const +{ + return + enabled == other.enabled + && hq == other.hq + && highlights == other.highlights + && htonalwidth == other.htonalwidth + && shadows == other.shadows + && stonalwidth == other.stonalwidth + && radius == other.radius; } -ProcParams::ProcParams () +bool SHParams::operator !=(const SHParams& other) const { + return !(*this == other); +} - setDefaults (); +CropParams::CropParams() : + enabled(false), + x(-1), + y(-1), + w(15000), + h(15000), + fixratio(true), + ratio("As Image"), + orientation("As Image"), + guide("Frame") +{ } -void ProcParams::init () +bool CropParams::operator ==(const CropParams& other) const { + return + enabled == other.enabled + && x == other.x + && y == other.y + && w == other.w + && h == other.h + && fixratio == other.fixratio + && ratio == other.ratio + && orientation == other.orientation + && guide == other.guide; +} - WBParams::init(); +bool CropParams::operator !=(const CropParams& other) const +{ + return !(*this == other); } -void ProcParams::cleanup () +void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, int& x1, int& x2, int& y1, int& y2) const { + x1 = 0, x2 = resizedWidth, y1 = 0, y2 = resizedHeight; - WBParams::cleanup(); + if (enabled) { + x1 = min(resizedWidth - 1, max (0, x / scale)); + y1 = min(resizedHeight - 1, max (0, y / scale)); + x2 = min(resizedWidth, max (0, (x + w) / scale)); + y2 = min(resizedHeight, max (0, (y + h) / scale)); + } } -ProcParams* ProcParams::create () +CoarseTransformParams::CoarseTransformParams() : + rotate(0), + hflip(false), + vflip(false) { +} - return new ProcParams(); +bool CoarseTransformParams::operator ==(const CoarseTransformParams& other) const +{ + return + rotate == other.rotate + && hflip == other.hflip + && vflip == other.vflip; } -void ProcParams::destroy (ProcParams* pp) +bool CoarseTransformParams::operator !=(const CoarseTransformParams& other) const { + return !(*this == other); +} - delete pp; +CommonTransformParams::CommonTransformParams() : + autofill(true) +{ } -void ProcParams::setDefaults () +bool CommonTransformParams::operator ==(const CommonTransformParams& other) const { + return autofill == other.autofill; +} - toneCurve.setDefaults(); +bool CommonTransformParams::operator !=(const CommonTransformParams& other) const +{ + return !(*this == other); +} - labCurve.brightness = 0; - labCurve.contrast = 0; - labCurve.chromaticity = 0; - labCurve.avoidcolorshift = false; - labCurve.lcredsk = true; - labCurve.rstprotection = 0; - labCurve.lcurve.clear (); - labCurve.lcurve.push_back (DCT_Linear); - labCurve.acurve.clear (); - labCurve.acurve.push_back (DCT_Linear); - labCurve.bcurve.clear (); - labCurve.bcurve.push_back (DCT_Linear); - labCurve.cccurve.clear (); - labCurve.cccurve.push_back (DCT_Linear); - labCurve.chcurve.clear (); - labCurve.chcurve.push_back (FCT_Linear); - labCurve.lhcurve.clear (); - labCurve.lhcurve.push_back (FCT_Linear); - labCurve.hhcurve.clear (); - labCurve.hhcurve.push_back (FCT_Linear); - - labCurve.lccurve.clear (); - labCurve.lccurve.push_back (DCT_Linear); - labCurve.clcurve.clear (); - labCurve.clcurve.push_back (DCT_Linear); - - rgbCurves.lumamode = false; - rgbCurves.rcurve.clear (); - rgbCurves.rcurve.push_back (DCT_Linear); - rgbCurves.gcurve.clear (); - rgbCurves.gcurve.push_back (DCT_Linear); - rgbCurves.bcurve.clear (); - rgbCurves.bcurve.push_back (DCT_Linear); - - colorToning.setDefaults(); - - sharpenEdge.enabled = false; - sharpenEdge.passes = 2; - sharpenEdge.amount = 50.0; - sharpenEdge.threechannels = false; - - sharpenMicro.enabled = false; - sharpenMicro.amount = 20.0; - sharpenMicro.uniformity = 50.0; - sharpenMicro.matrix = false; - - sharpening.enabled = false; - sharpening.radius = 0.5; - sharpening.amount = 200; - sharpening.threshold.setValues (20, 80, 2000, 1200); - sharpening.edgesonly = false; - sharpening.edges_radius = 1.9; - sharpening.edges_tolerance = 1800; - sharpening.halocontrol = false; - sharpening.halocontrol_amount = 85; - sharpening.method = "usm"; - sharpening.deconvradius = 0.75; - sharpening.deconviter = 30; - sharpening.deconvdamping = 20; - sharpening.deconvamount = 75; - - prsharpening.enabled = false; - prsharpening.radius = 0.5; - prsharpening.amount = 200; - prsharpening.threshold.setValues (20, 80, 2000, 1200); - prsharpening.edgesonly = false; - prsharpening.edges_radius = 1.9; - prsharpening.edges_tolerance = 1800; - prsharpening.halocontrol = false; - prsharpening.halocontrol_amount = 85; - prsharpening.method = "rld"; - prsharpening.deconvradius = 0.45; - prsharpening.deconviter = 100; - prsharpening.deconvdamping = 0; - prsharpening.deconvamount = 100; +RotateParams::RotateParams() : + degree(0.0) +{ +} - vibrance.enabled = false; - vibrance.pastels = 0; - vibrance.saturated = 0; - vibrance.psthreshold.setValues (0, 75); - vibrance.protectskins = false; - vibrance.avoidcolorshift = true; - vibrance.pastsattog = true; - vibrance.skintonescurve.clear (); - vibrance.skintonescurve.push_back (DCT_Linear); - - wb.method = "Camera"; - wb.temperature = 6504; - wb.green = 1.0; - wb.equal = 1.0; - wb.tempBias = 0.0; - colorappearance.enabled = false; - colorappearance.degree = 90; - colorappearance.autodegree = true; - colorappearance.degreeout = 90; - colorappearance.autodegreeout = true; - colorappearance.surround = "Average"; - colorappearance.surrsrc = "Average"; - colorappearance.adaplum = 16; - colorappearance.badpixsl = 0; - colorappearance.adapscen = 2000.0; - colorappearance.autoadapscen = true; - colorappearance.ybscen = 18; - colorappearance.autoybscen = true; - colorappearance.algo = "No"; - colorappearance.wbmodel = "RawT"; - colorappearance.jlight = 0.0; - colorappearance.qbright = 0.0; - colorappearance.chroma = 0.0; - colorappearance.schroma = 0.0; - colorappearance.mchroma = 0.0; - colorappearance.rstprotection = 0.0; - colorappearance.contrast = 0.0; - colorappearance.qcontrast = 0.0; - colorappearance.colorh = 0.0; - colorappearance.surrsource = false; - colorappearance.gamut = true; -// colorappearance.badpix = false; - colorappearance.datacie = false; - colorappearance.tonecie = false; -// colorappearance.sharpcie = false; - colorappearance.curve.clear (); - colorappearance.curve.push_back (DCT_Linear); - colorappearance.curve2.clear (); - colorappearance.curve2.push_back (DCT_Linear); - colorappearance.curveMode = ColorAppearanceParams::TC_MODE_LIGHT; - colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_LIGHT; - colorappearance.curve3.clear (); - colorappearance.curve3.push_back (DCT_Linear); - colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_CHROMA; - colorappearance.tempout = 5000; - colorappearance.greenout = 1.0; - colorappearance.ybout = 18; - colorappearance.tempsc = 5000; - colorappearance.greensc = 1.0; - - impulseDenoise.enabled = false; - impulseDenoise.thresh = 50; - - defringe.enabled = false; - defringe.radius = 2.0; - defringe.threshold = 13; - defringe.huecurve.resize (25); - defringe.huecurve.at (0) = FCT_MinMaxCPoints; - defringe.huecurve.at (1) = 0.166666667; - defringe.huecurve.at (2) = 0.; - defringe.huecurve.at (3) = 0.35; - defringe.huecurve.at (4) = 0.35; - defringe.huecurve.at (5) = 0.347; - defringe.huecurve.at (6) = 0.; - defringe.huecurve.at (7) = 0.35; - defringe.huecurve.at (8) = 0.35; - defringe.huecurve.at (9) = 0.513667426; - defringe.huecurve.at (10) = 0; - defringe.huecurve.at (11) = 0.35; - defringe.huecurve.at (12) = 0.35; - defringe.huecurve.at (13) = 0.668944571; - defringe.huecurve.at (14) = 0.; - defringe.huecurve.at (15) = 0.35; - defringe.huecurve.at (16) = 0.35; - defringe.huecurve.at (17) = 0.8287775246; - defringe.huecurve.at (18) = 0.97835991; - defringe.huecurve.at (19) = 0.35; - defringe.huecurve.at (20) = 0.35; - defringe.huecurve.at (21) = 0.9908883827; - defringe.huecurve.at (22) = 0.; - defringe.huecurve.at (23) = 0.35; - defringe.huecurve.at (24) = 0.35; - - dirpyrDenoise.setDefaults(); - - epd.enabled = false; - epd.strength = 0.5; - epd.gamma = 1.0; - epd.edgeStopping = 1.4; - epd.scale = 1.0; - epd.reweightingIterates = 0; - - sh.enabled = false; - sh.hq = false; - sh.highlights = 0; - sh.htonalwidth = 80; - sh.shadows = 0; - sh.stonalwidth = 80; - sh.localcontrast = 0; - sh.radius = 40; - - crop.enabled = false; - crop.x = -1; - crop.y = -1; - crop.w = 15000; - crop.h = 15000; - crop.fixratio = true; - crop.ratio = "3:2"; - crop.orientation = "As Image"; - crop.guide = "Frame"; - - coarse.setDefaults(); - - commonTrans.autofill = true; - - rotate.degree = 0; - - distortion.amount = 0; - - perspective.horizontal = 0; - perspective.vertical = 0; - - gradient.enabled = false; - gradient.degree = 0; - gradient.feather = 25; - gradient.strength = 0.60; - gradient.centerX = 0; - gradient.centerY = 0; - - pcvignette.enabled = false; - pcvignette.strength = 0.60; - pcvignette.feather = 50; - pcvignette.roundness = 50; - - cacorrection.red = 0; - cacorrection.blue = 0; - - - vignetting.amount = 0; - vignetting.radius = 50; - vignetting.strength = 1; - vignetting.centerX = 0; - vignetting.centerY = 0; - - lensProf.setDefaults(); - - chmixer.red[0] = 100; - chmixer.red[1] = 0; - chmixer.red[2] = 0; - chmixer.green[0] = 0; - chmixer.green[1] = 100; - chmixer.green[2] = 0; - chmixer.blue[0] = 0; - chmixer.blue[1] = 0; - chmixer.blue[2] = 100; - - blackwhite.autoc = false; - blackwhite.enabledcc = true; - blackwhite.enabled = false; - blackwhite.mixerRed = 33; - blackwhite.mixerGreen = 33; - blackwhite.mixerBlue = 33; - blackwhite.mixerOrange = 33; - blackwhite.mixerYellow = 33; - blackwhite.mixerCyan = 33; - blackwhite.mixerMagenta = 33; - blackwhite.mixerPurple = 33; - blackwhite.gammaRed = 0; - blackwhite.gammaGreen = 0; - blackwhite.gammaBlue = 0; - blackwhite.luminanceCurve.clear (); - blackwhite.luminanceCurve.push_back (FCT_Linear); - blackwhite.method = "Desaturation"; - blackwhite.filter = "None"; - blackwhite.setting = "NormalContrast"; - blackwhite.beforeCurve.clear (); - blackwhite.beforeCurve.push_back (DCT_Linear); - blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_STD_BW; - blackwhite.afterCurve.clear (); - blackwhite.afterCurve.push_back (DCT_Linear); - blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_STD_BW; - blackwhite.algo = "SP"; - - resize.enabled = false; - resize.scale = 1.0; - resize.appliesTo = "Cropped area"; - resize.method = "Lanczos"; - resize.dataspec = 3; - resize.width = 900; - resize.height = 900; - - icm.setDefaults(); - - dirpyrequalizer.enabled = false; - dirpyrequalizer.gamutlab = false; - dirpyrequalizer.cbdlMethod = "bef"; - - - for (int i = 0; i < 6; i ++) { - dirpyrequalizer.mult[i] = 1.0; - } - - dirpyrequalizer.threshold = 0.2; - dirpyrequalizer.skinprotect = 0.; - dirpyrequalizer.hueskin.setValues (-5, 25, 170, 120); //default (b_l 0, t_l 30, b_r 170, t_r 120); -// dirpyrequalizer.algo = "FI"; - - hsvequalizer.hcurve.clear (); - hsvequalizer.hcurve.push_back (FCT_Linear); - hsvequalizer.scurve.clear (); - hsvequalizer.scurve.push_back (FCT_Linear); - hsvequalizer.vcurve.clear (); - hsvequalizer.vcurve.push_back (FCT_Linear); +bool RotateParams::operator ==(const RotateParams& other) const +{ + return degree == other.degree; +} - filmSimulation.setDefaults(); +bool RotateParams::operator !=(const RotateParams& other) const +{ + return !(*this == other); +} - raw.setDefaults(); +DistortionParams::DistortionParams() : + amount(0.0) +{ +} - exif.clear (); - iptc.clear (); +bool DistortionParams::operator ==(const DistortionParams& other) const +{ + return amount == other.amount; +} - rank = 0; - colorlabel = 0; - inTrash = false; +bool DistortionParams::operator !=(const DistortionParams& other) const +{ + return !(*this == other); +} - ppVersion = PPVERSION; +LensProfParams::LensProfParams() : + lcMode(LcMode::NONE), + useDist(true), + useVign(true), + useCA(false) +{ } -static Glib::ustring expandRelativePath (const Glib::ustring &procparams_fname, const Glib::ustring &prefix, Glib::ustring embedded_fname) +bool LensProfParams::operator ==(const LensProfParams& other) const { - if (embedded_fname == "" || !Glib::path_is_absolute (procparams_fname)) { - return embedded_fname; - } + return + lcMode == other.lcMode + && lcpFile == other.lcpFile + && useCA == other.useCA + && lfCameraMake == other.lfCameraMake + && lfCameraModel == other.lfCameraModel + && lfLens == other.lfLens; +} - if (prefix != "") { - if (embedded_fname.length() < prefix.length() || embedded_fname.substr (0, prefix.length()) != prefix) { - return embedded_fname; - } +bool LensProfParams::operator !=(const LensProfParams& other) const +{ + return !(*this == other); +} - embedded_fname = embedded_fname.substr (prefix.length()); - } +bool LensProfParams::useLensfun() const +{ + return lcMode == LcMode::LENSFUNAUTOMATCH || lcMode == LcMode::LENSFUNMANUAL; +} - if (Glib::path_is_absolute (embedded_fname)) { - return prefix + embedded_fname; - } +bool LensProfParams::lfAutoMatch() const +{ + return lcMode == LcMode::LENSFUNAUTOMATCH; +} - Glib::ustring absPath = prefix + Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S + embedded_fname; - return absPath; +bool LensProfParams::useLcp() const +{ + return lcMode == LcMode::LCP && lcpFile.length() > 0; } -static Glib::ustring relativePathIfInside (const Glib::ustring &procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) +bool LensProfParams::lfManual() const { - if (fnameAbsolute || embedded_fname == "" || !Glib::path_is_absolute (procparams_fname)) { - return embedded_fname; - } + return lcMode == LcMode::LENSFUNMANUAL; +} - Glib::ustring prefix = ""; +const std::vector& LensProfParams::getMethodStrings() const +{ + static const std::vector method_strings = { + "none", + "lfauto", + "lfmanual", + "lcp" + }; + return method_strings; +} - if (embedded_fname.length() > 5 && embedded_fname.substr (0, 5) == "file:") { - embedded_fname = embedded_fname.substr (5); - prefix = "file:"; - } +Glib::ustring LensProfParams::getMethodString(LcMode mode) const +{ + return getMethodStrings()[toUnderlying(mode)]; +} - if (!Glib::path_is_absolute (embedded_fname)) { - return prefix + embedded_fname; +LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode) const +{ + for (std::vector::size_type i = 0; i < getMethodStrings().size(); ++i) { + if (getMethodStrings()[i] == mode) { + return static_cast(i); + } } + return LcMode::NONE; +} - Glib::ustring dir1 = Glib::path_get_dirname (procparams_fname) + G_DIR_SEPARATOR_S; - Glib::ustring dir2 = Glib::path_get_dirname (embedded_fname) + G_DIR_SEPARATOR_S; +PerspectiveParams::PerspectiveParams() : + horizontal(0.0), + vertical(0.0) +{ +} - if (dir2.substr (0, dir1.length()) != dir1) { - // it's in a different directory, ie not inside - return prefix + embedded_fname; - } +bool PerspectiveParams::operator ==(const PerspectiveParams& other) const +{ + return + horizontal == other.horizontal + && vertical == other.vertical; +} - return prefix + embedded_fname.substr (dir1.length()); +bool PerspectiveParams::operator !=(const PerspectiveParams& other) const +{ + return !(*this == other); } -int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, bool fnameAbsolute, ParamsEdited* pedited) +GradientParams::GradientParams() : + enabled(false), + degree(0.0), + feather(25), + strength(0.60), + centerX(0), + centerY(0) { +} - if (fname.empty () && fname2.empty ()) { - return 0; - } +bool GradientParams::operator ==(const GradientParams& other) const +{ + return + enabled == other.enabled + && degree == other.degree + && feather == other.feather + && strength == other.strength + && centerX == other.centerX + && centerY == other.centerY; +} - Glib::ustring sPParams; +bool GradientParams::operator !=(const GradientParams& other) const +{ + return !(*this == other); +} - try { +PCVignetteParams::PCVignetteParams() : + enabled(false), + strength(0.60), + feather(50), + roundness(50) +{ +} - Glib::KeyFile keyFile; +bool PCVignetteParams::operator ==(const PCVignetteParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength + && feather == other.feather + && roundness == other.roundness; +} - keyFile.set_string ("Version", "AppVersion", APPVERSION); - keyFile.set_integer ("Version", "Version", PPVERSION); +bool PCVignetteParams::operator !=(const PCVignetteParams& other) const +{ + return !(*this == other); +} - if (!pedited || pedited->general.rank) { - keyFile.set_integer ("General", "Rank", rank); - } +VignettingParams::VignettingParams() : + amount(0), + radius(50), + strength(1), + centerX(0), + centerY(0) +{ +} - if (!pedited || pedited->general.colorlabel) { - keyFile.set_integer ("General", "ColorLabel", colorlabel); - } +bool VignettingParams::operator ==(const VignettingParams& other) const +{ + return + amount == other.amount + && radius == other.radius + && strength == other.strength + && centerX == other.centerX + && centerY == other.centerY; +} - if (!pedited || pedited->general.intrash) { - keyFile.set_boolean ("General", "InTrash", inTrash); - } +bool VignettingParams::operator !=(const VignettingParams& other) const +{ + return !(*this == other); +} -// save tone curve - if (!pedited || pedited->toneCurve.autoexp) { - keyFile.set_boolean ("Exposure", "Auto", toneCurve.autoexp); - } +ChannelMixerParams::ChannelMixerParams() : + enabled(false), + red{ + 100, + 0, + 0 + }, + green{ + 0, + 100, + 0 + }, + blue{ + 0, + 0, + 100 + } +{ +} - if (!pedited || pedited->toneCurve.clip) { - keyFile.set_double ("Exposure", "Clip", toneCurve.clip); +bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const +{ + if (enabled != other.enabled) { + return false; + } + for (unsigned int i = 0; i < 3; ++i) { + if ( + red[i] != other.red[i] + || green[i] != other.green[i] + || blue[i] != other.blue[i] + ) { + return false; } + } + return true; +} - if (!pedited || pedited->toneCurve.expcomp) { - keyFile.set_double ("Exposure", "Compensation", toneCurve.expcomp); - } +bool ChannelMixerParams::operator !=(const ChannelMixerParams& other) const +{ + return !(*this == other); +} - if (!pedited || pedited->toneCurve.brightness) { - keyFile.set_integer ("Exposure", "Brightness", toneCurve.brightness); - } +BlackWhiteParams::BlackWhiteParams() : + beforeCurve{ + DCT_Linear + }, + beforeCurveMode(BlackWhiteParams::TcMode::STD_BW), + afterCurve{ + DCT_Linear + }, + afterCurveMode(BlackWhiteParams::TcMode::STD_BW), + algo("SP"), + luminanceCurve{ + FCT_Linear + }, + autoc(false), + enabledcc(true), + enabled(false), + filter("None"), + setting("NormalContrast"), + method("Desaturation"), + mixerRed(33), + mixerOrange(33), + mixerYellow(33), + mixerGreen(33), + mixerCyan(33), + mixerBlue(33), + mixerMagenta(33), + mixerPurple(33), + gammaRed(0), + gammaGreen(0), + gammaBlue(0) +{ +} - if (!pedited || pedited->toneCurve.contrast) { - keyFile.set_integer ("Exposure", "Contrast", toneCurve.contrast); - } +bool BlackWhiteParams::operator ==(const BlackWhiteParams& other) const +{ + return + beforeCurve == other.beforeCurve + && beforeCurveMode == other.beforeCurveMode + && afterCurve == other.afterCurve + && afterCurveMode == other.afterCurveMode + && algo == other.algo + && luminanceCurve == other.luminanceCurve + && autoc == other.autoc + && enabledcc == other.enabledcc + && enabled == other.enabled + && filter == other.filter + && setting == other.setting + && method == other.method + && mixerRed == other.mixerRed + && mixerOrange == other.mixerOrange + && mixerYellow == other.mixerYellow + && mixerGreen == other.mixerGreen + && mixerCyan == other.mixerCyan + && mixerBlue == other.mixerBlue + && mixerMagenta == other.mixerMagenta + && mixerPurple == other.mixerPurple + && gammaRed == other.gammaRed + && gammaGreen == other.gammaGreen + && gammaBlue == other.gammaBlue; +} + +bool BlackWhiteParams::operator !=(const BlackWhiteParams& other) const +{ + return !(*this == other); +} + +CACorrParams::CACorrParams() : + red(0.0), + blue(0.0) +{ +} - if (!pedited || pedited->toneCurve.saturation) { - keyFile.set_integer ("Exposure", "Saturation", toneCurve.saturation); - } +bool CACorrParams::operator ==(const CACorrParams& other) const +{ + return + red == other.red + && blue == other.blue; +} - if (!pedited || pedited->toneCurve.black) { - keyFile.set_integer ("Exposure", "Black", toneCurve.black); - } +bool CACorrParams::operator !=(const CACorrParams& other) const +{ + return !(*this == other); +} - if (!pedited || pedited->toneCurve.hlcompr) { - keyFile.set_integer ("Exposure", "HighlightCompr", toneCurve.hlcompr); - } +ResizeParams::ResizeParams() : + enabled(false), + scale(1.0), + appliesTo("Cropped area"), + method("Lanczos"), + dataspec(3), + width(900), + height(900) +{ +} - if (!pedited || pedited->toneCurve.hlcomprthresh) { - keyFile.set_integer ("Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh); - } +bool ResizeParams::operator ==(const ResizeParams& other) const +{ + return + enabled == other.enabled + && scale == other.scale + && appliesTo == other.appliesTo + && method == other.method + && dataspec == other.dataspec + && width == other.width + && height == other.height; +} - if (!pedited || pedited->toneCurve.shcompr) { - keyFile.set_integer ("Exposure", "ShadowCompr", toneCurve.shcompr); - } +bool ResizeParams::operator !=(const ResizeParams& other) const +{ + return !(*this == other); +} -// save highlight recovery settings - if (!pedited || pedited->toneCurve.hrenabled) { - keyFile.set_boolean ("HLRecovery", "Enabled", toneCurve.hrenabled); - } +const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring ("No ICM: sRGB output"); - if (!pedited || pedited->toneCurve.method) { - keyFile.set_string ("HLRecovery", "Method", toneCurve.method); - } +ColorManagementParams::ColorManagementParams() : + input("(cameraICC)"), + toneCurve(false), + applyLookTable(false), + applyBaselineExposureOffset(true), + applyHueSatMap(true), + dcpIlluminant(0), + working("ProPhoto"), + output("RT_sRGB"), + outputIntent(RI_RELATIVE), + outputBPC(true), + gamma("default"), + gampos(2.22), + slpos(4.5), + freegamma(false) +{ +} - if (!pedited || pedited->toneCurve.curveMode) { - Glib::ustring method; +bool ColorManagementParams::operator ==(const ColorManagementParams& other) const +{ + return + input == other.input + && toneCurve == other.toneCurve + && applyLookTable == other.applyLookTable + && applyBaselineExposureOffset == other.applyBaselineExposureOffset + && applyHueSatMap == other.applyHueSatMap + && dcpIlluminant == other.dcpIlluminant + && working == other.working + && output == other.output + && outputIntent == other.outputIntent + && outputBPC == other.outputBPC + && gamma == other.gamma + && gampos == other.gampos + && slpos == other.slpos + && freegamma == other.freegamma; +} - switch (toneCurve.curveMode) { - case (ToneCurveParams::TC_MODE_STD): - method = "Standard"; - break; +bool ColorManagementParams::operator !=(const ColorManagementParams& other) const +{ + return !(*this == other); +} - case (ToneCurveParams::TC_MODE_FILMLIKE): - method = "FilmLike"; - break; +WaveletParams::WaveletParams() : + ccwcurve{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.25, + 0.35, + 0.35, + 0.50, + 0.75, + 0.35, + 0.35, + 0.90, + 0.0, + 0.35, + 0.35 + }, + opacityCurveRG{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + opacityCurveBY{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + opacityCurveW{ + static_cast(FCT_MinMaxCPoints), + 0.00, + 0.35, + 0.35, + 0.00, + 0.35, + 0.75, + 0.35, + 0.35, + 0.60, + 0.75, + 0.35, + 0.35, + 1.00, + 0.35, + 0.00, + 0.00 + }, + opacityCurveWL{ + static_cast(FCT_MinMaxCPoints), + 0.0, + 0.50, + 0.35, + 0.35, + 1.00, + 0.50, + 0.35, + 0.35 + }, + hhcurve{ + FCT_Linear + }, + Chcurve{ + FCT_Linear + }, + wavclCurve { + DCT_Linear + }, + enabled(false), + median(false), + medianlev(false), + linkedg(true), + cbenab(false), + greenlow(0), + bluelow(0), + greenmed(0), + bluemed(0), + greenhigh(0), + bluehigh(0), + lipst(false), + avoid(false), + tmr(false), + strength(100), + balance(0), + iter(0), + expcontrast(false), + expchroma(false), + c{}, + ch{}, + expedge(false), + expresid(false), + expfinal(false), + exptoning(false), + expnoise(false), + Lmethod(4), + CLmethod("all"), + Backmethod("grey"), + Tilesmethod("full"), + daubcoeffmethod("4_"), + CHmethod("without"), + Medgreinf("less"), + CHSLmethod("SL"), + EDmethod("CU"), + NPmethod("none"), + BAmethod("none"), + TMmethod("cont"), + Dirmethod("all"), + HSmethod("with"), + rescon(0), + resconH(0), + reschro(0), + tmrs(0), + gamma(1), + sup(0), + sky(0.0), + thres(7), + chroma(5), + chro(0), + threshold(5), + threshold2(4), + edgedetect(90), + edgedetectthr(20), + edgedetectthr2(0), + edgesensi(60), + edgeampli(10), + contrast(0), + edgrad(15), + edgval(0), + edgthresh(10), + thr(35), + thrH(65), + skinprotect(0.0), + hueskin(-5, 25, 170, 120, false), + hueskin2(-260, -250, -130, -140, false), + hllev(50, 75, 100, 98, false), + bllev(0, 2, 50, 25, false), + pastlev(0, 2, 30, 20, false), + satlev(30, 45, 130, 100, false), + edgcont(0, 10, 75, 40, false), + level0noise(0, 0, false), + level1noise(0, 0, false), + level2noise(0, 0, false), + level3noise(0, 0, false) +{ +} - case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): - method = "SatAndValueBlending"; - break; +bool WaveletParams::operator ==(const WaveletParams& other) const +{ + return + ccwcurve == other.ccwcurve + && opacityCurveRG == other.opacityCurveRG + && opacityCurveBY == other.opacityCurveBY + && opacityCurveW == other.opacityCurveW + && opacityCurveWL == other.opacityCurveWL + && hhcurve == other.hhcurve + && Chcurve == other.Chcurve + && wavclCurve == other.wavclCurve + && enabled == other.enabled + && median == other.median + && medianlev == other.medianlev + && linkedg == other.linkedg + && cbenab == other.cbenab + && greenlow == other.greenlow + && bluelow == other.bluelow + && greenmed == other.greenmed + && bluemed == other.bluemed + && greenhigh == other.greenhigh + && bluehigh == other.bluehigh + && lipst == other.lipst + && avoid == other.avoid + && tmr == other.tmr + && strength == other.strength + && balance == other.balance + && iter == other.iter + && expcontrast == other.expcontrast + && expchroma == other.expchroma + && [this, &other]() -> bool + { + for (unsigned int i = 0; i < 9; ++i) { + if (c[i] != other.c[i] || ch[i] != other.ch[i]) { + return false; + } + } + return true; + }() + && expedge == other.expedge + && expresid == other.expresid + && expfinal == other.expfinal + && exptoning == other.exptoning + && expnoise == other.expnoise + && Lmethod == other.Lmethod + && CLmethod == other.CLmethod + && Backmethod == other.Backmethod + && Tilesmethod == other.Tilesmethod + && daubcoeffmethod == other.daubcoeffmethod + && CHmethod == other.CHmethod + && Medgreinf == other.Medgreinf + && CHSLmethod == other.CHSLmethod + && EDmethod == other.EDmethod + && NPmethod == other.NPmethod + && BAmethod == other.BAmethod + && TMmethod == other.TMmethod + && Dirmethod == other.Dirmethod + && HSmethod == other.HSmethod + && rescon == other.rescon + && resconH == other.resconH + && reschro == other.reschro + && tmrs == other.tmrs + && gamma == other.gamma + && sup == other.sup + && sky == other.sky + && thres == other.thres + && chroma == other.chroma + && chro == other.chro + && threshold == other.threshold + && threshold2 == other.threshold2 + && edgedetect == other.edgedetect + && edgedetectthr == other.edgedetectthr + && edgedetectthr2 == other.edgedetectthr2 + && edgesensi == other.edgesensi + && edgeampli == other.edgeampli + && contrast == other.contrast + && edgrad == other.edgrad + && edgval == other.edgval + && edgthresh == other.edgthresh + && thr == other.thr + && thrH == other.thrH + && skinprotect == other.skinprotect + && hueskin == other.hueskin + && hueskin2 == other.hueskin2 + && hllev == other.hllev + && bllev == other.bllev + && pastlev == other.pastlev + && satlev == other.satlev + && edgcont == other.edgcont + && level0noise == other.level0noise + && level1noise == other.level1noise + && level2noise == other.level2noise + && level3noise == other.level3noise; +} + +bool WaveletParams::operator !=(const WaveletParams& other) const +{ + return !(*this == other); +} + +void WaveletParams::getCurves( + WavCurve& cCurve, + WavOpacityCurveRG& opacityCurveLUTRG, + WavOpacityCurveBY& opacityCurveLUTBY, + WavOpacityCurveW& opacityCurveLUTW, + WavOpacityCurveWL& opacityCurveLUTWL +) const +{ + cCurve.Set (this->ccwcurve); + opacityCurveLUTRG.Set (this->opacityCurveRG); + opacityCurveLUTBY.Set (this->opacityCurveBY); + opacityCurveLUTW.Set (this->opacityCurveW); + opacityCurveLUTWL.Set (this->opacityCurveWL); - case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): - method = "WeightedStd"; - break; +} - case (ToneCurveParams::TC_MODE_LUMINANCE): - method = "Luminance"; - break; +DirPyrEqualizerParams::DirPyrEqualizerParams() : + enabled(false), + gamutlab(false), + mult{ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + }, + threshold(0.2), + skinprotect(0.0), + hueskin (-5, 25, 170, 120, false), + cbdlMethod("bef") +{ +} - case (ToneCurveParams::TC_MODE_PERCEPTUAL): - method = "Perceptual"; - break; - } +bool DirPyrEqualizerParams::operator ==(const DirPyrEqualizerParams& other) const +{ + return + enabled == other.enabled + && gamutlab == other.gamutlab + && [this, &other]() -> bool + { + for (unsigned int i = 0; i < 6; ++i) { + if (mult[i] != other.mult[i]) { + return false; + } + } + return true; + }() + && threshold == other.threshold + && skinprotect == other.skinprotect + && hueskin == other.hueskin + && cbdlMethod == other.cbdlMethod; +} - keyFile.set_string ("Exposure", "CurveMode", method); - } +bool DirPyrEqualizerParams::operator !=(const DirPyrEqualizerParams& other) const +{ + return !(*this == other); +} - if (!pedited || pedited->toneCurve.curveMode2) { - Glib::ustring method; +HSVEqualizerParams::HSVEqualizerParams() : + enabled(false), + hcurve{ + FCT_Linear + }, + scurve{ + FCT_Linear + }, + vcurve{ + FCT_Linear + } +{ +} - switch (toneCurve.curveMode2) { - case (ToneCurveParams::TC_MODE_STD): - method = "Standard"; - break; +bool HSVEqualizerParams::operator ==(const HSVEqualizerParams& other) const +{ + return + enabled == other.enabled + && hcurve == other.hcurve + && scurve == other.scurve + && vcurve == other.vcurve; +} - case (ToneCurveParams::TC_MODE_FILMLIKE): - method = "FilmLike"; - break; +bool HSVEqualizerParams::operator !=(const HSVEqualizerParams& other) const +{ + return !(*this == other); +} - case (ToneCurveParams::TC_MODE_SATANDVALBLENDING): - method = "SatAndValueBlending"; - break; +FilmSimulationParams::FilmSimulationParams() : + enabled(false), + strength(100) +{ +} - case (ToneCurveParams::TC_MODE_WEIGHTEDSTD): - method = "WeightedStd"; - break; +bool FilmSimulationParams::operator ==(const FilmSimulationParams& other) const +{ + return + enabled == other.enabled + && clutFilename == other.clutFilename + && strength == other.strength; +} + +bool FilmSimulationParams::operator !=(const FilmSimulationParams& other) const +{ + return !(*this == other); +} + +RAWParams::BayerSensor::BayerSensor() : + method(getMethodString(Method::AMAZE)), + imageNum(0), + ccSteps(0), + black0(0.0), + black1(0.0), + black2(0.0), + black3(0.0), + twogreen(true), + linenoise(0), + greenthresh(0), + dcb_iterations(2), + lmmse_iterations(2), + pixelShiftMotion(0), + pixelShiftMotionCorrection(PSMotionCorrection::GRID_3X3_NEW), + pixelShiftMotionCorrectionMethod(PSMotionCorrectionMethod::AUTO), + pixelShiftStddevFactorGreen(5.0), + pixelShiftStddevFactorRed(5.0), + pixelShiftStddevFactorBlue(5.0), + pixelShiftEperIso(0.0), + pixelShiftNreadIso(0.0), + pixelShiftPrnu(1.0), + pixelShiftSigma(1.0), + pixelShiftSum(3.0), + pixelShiftRedBlueWeight(0.7), + pixelShiftShowMotion(false), + pixelShiftShowMotionMaskOnly(false), + pixelShiftAutomatic(true), + pixelShiftNonGreenHorizontal(false), + pixelShiftNonGreenVertical(false), + pixelShiftHoleFill(true), + pixelShiftMedian(false), + pixelShiftMedian3(false), + pixelShiftGreen(true), + pixelShiftBlur(true), + pixelShiftSmoothFactor(0.7), + pixelShiftExp0(false), + pixelShiftLmmse(false), + pixelShiftOneGreen(false), + pixelShiftEqualBright(false), + pixelShiftEqualBrightChannel(false), + pixelShiftNonGreenCross(true), + pixelShiftNonGreenCross2(false), + pixelShiftNonGreenAmaze(false), + dcb_enhance(true) +{ +} - case (ToneCurveParams::TC_MODE_LUMINANCE): - method = "Luminance"; - break; +bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const +{ + return + method == other.method + && imageNum == other.imageNum + && ccSteps == other.ccSteps + && black0 == other.black0 + && black1 == other.black1 + && black2 == other.black2 + && black3 == other.black3 + && twogreen == other.twogreen + && linenoise == other.linenoise + && greenthresh == other.greenthresh + && dcb_iterations == other.dcb_iterations + && lmmse_iterations == other.lmmse_iterations + && pixelShiftMotion == other.pixelShiftMotion + && pixelShiftMotionCorrection == other.pixelShiftMotionCorrection + && pixelShiftMotionCorrectionMethod == other.pixelShiftMotionCorrectionMethod + && pixelShiftStddevFactorGreen == other.pixelShiftStddevFactorGreen + && pixelShiftStddevFactorRed == other.pixelShiftStddevFactorRed + && pixelShiftStddevFactorBlue == other.pixelShiftStddevFactorBlue + && pixelShiftEperIso == other.pixelShiftEperIso + && pixelShiftNreadIso == other.pixelShiftNreadIso + && pixelShiftPrnu == other.pixelShiftPrnu + && pixelShiftSigma == other.pixelShiftSigma + && pixelShiftSum == other.pixelShiftSum + && pixelShiftRedBlueWeight == other.pixelShiftRedBlueWeight + && pixelShiftShowMotion == other.pixelShiftShowMotion + && pixelShiftShowMotionMaskOnly == other.pixelShiftShowMotionMaskOnly + && pixelShiftAutomatic == other.pixelShiftAutomatic + && pixelShiftNonGreenHorizontal == other.pixelShiftNonGreenHorizontal + && pixelShiftNonGreenVertical == other.pixelShiftNonGreenVertical + && pixelShiftHoleFill == other.pixelShiftHoleFill + && pixelShiftMedian == other.pixelShiftMedian + && pixelShiftMedian3 == other.pixelShiftMedian3 + && pixelShiftGreen == other.pixelShiftGreen + && pixelShiftBlur == other.pixelShiftBlur + && pixelShiftSmoothFactor == other.pixelShiftSmoothFactor + && pixelShiftExp0 == other.pixelShiftExp0 + && pixelShiftLmmse == other.pixelShiftLmmse + && pixelShiftOneGreen == other.pixelShiftOneGreen + && pixelShiftEqualBright == other.pixelShiftEqualBright + && pixelShiftEqualBrightChannel == other.pixelShiftEqualBrightChannel + && pixelShiftNonGreenCross == other.pixelShiftNonGreenCross + && pixelShiftNonGreenCross2 == other.pixelShiftNonGreenCross2 + && pixelShiftNonGreenAmaze == other.pixelShiftNonGreenAmaze + && dcb_enhance == other.dcb_enhance; +} - case (ToneCurveParams::TC_MODE_PERCEPTUAL): - method = "Perceptual"; - break; - } +bool RAWParams::BayerSensor::operator !=(const BayerSensor& other) const +{ + return !(*this == other); +} - keyFile.set_string ("Exposure", "CurveMode2", method); - } +void RAWParams::BayerSensor::setPixelShiftDefaults() +{ + pixelShiftMotion = 0; + pixelShiftMotionCorrection = RAWParams::BayerSensor::PSMotionCorrection::GRID_3X3_NEW; + pixelShiftMotionCorrectionMethod = RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO; + pixelShiftStddevFactorGreen = 5.0; + pixelShiftStddevFactorRed = 5.0; + pixelShiftStddevFactorBlue = 5.0; + pixelShiftEperIso = 0.0; + pixelShiftNreadIso = 0.0; + pixelShiftPrnu = 1.0; + pixelShiftSigma = 1.0; + pixelShiftSum = 3.0; + pixelShiftRedBlueWeight = 0.7; + pixelShiftAutomatic = true; + pixelShiftNonGreenHorizontal = false; + pixelShiftNonGreenVertical = false; + pixelShiftHoleFill = true; + pixelShiftMedian = false; + pixelShiftMedian3 = false; + pixelShiftGreen = true; + pixelShiftBlur = true; + pixelShiftSmoothFactor = 0.7; + pixelShiftExp0 = false; + pixelShiftLmmse = false; + pixelShiftOneGreen = false; + pixelShiftEqualBright = false; + pixelShiftEqualBrightChannel = false; + pixelShiftNonGreenCross = true; + pixelShiftNonGreenCross2 = false; + pixelShiftNonGreenAmaze = false; +} - if (!pedited || pedited->toneCurve.curve) { - Glib::ArrayHandle tcurve = toneCurve.curve; - keyFile.set_double_list ("Exposure", "Curve", tcurve); - } +const std::vector& RAWParams::BayerSensor::getMethodStrings() +{ + static const std::vector method_strings { + "amaze", + "igv", + "lmmse", + "eahd", + "hphd", + "vng4", + "dcb", + "ahd", + "rcd", + "fast", + "mono", + "none", + "pixelshift" + }; + return method_strings; +} - if (!pedited || pedited->toneCurve.curve2) { - Glib::ArrayHandle tcurve = toneCurve.curve2; - keyFile.set_double_list ("Exposure", "Curve2", tcurve); - } +Glib::ustring RAWParams::BayerSensor::getMethodString(Method method) +{ + return getMethodStrings()[toUnderlying(method)]; +} -//save retinex +RAWParams::XTransSensor::XTransSensor() : + method(getMethodString(Method::THREE_PASS)), + ccSteps(0), + blackred(0.0), + blackgreen(0.0), + blackblue(0.0) +{ +} - if (!pedited || pedited->retinex.enabled) { - keyFile.set_boolean ("Retinex", "Enabled", retinex.enabled); - } +bool RAWParams::XTransSensor::operator ==(const XTransSensor& other) const +{ + return + method == other.method + && ccSteps == other.ccSteps + && blackred == other.blackred + && blackgreen == other.blackgreen + && blackblue == other.blackblue; +} - if (!pedited || pedited->retinex.str) { - keyFile.set_integer ("Retinex", "Str", retinex.str); - } +bool RAWParams::XTransSensor::operator !=(const XTransSensor& other) const +{ + return !(*this == other); +} - if (!pedited || pedited->retinex.scal) { - keyFile.set_integer ("Retinex", "Scal", retinex.scal); - } +const std::vector& RAWParams::XTransSensor::getMethodStrings() +{ + static const std::vector method_strings { + "3-pass (best)", + "1-pass (medium)", + "fast", + "mono", + "none" + }; + return method_strings; +} - if (!pedited || pedited->retinex.iter) { - keyFile.set_integer ("Retinex", "Iter", retinex.iter); - } - - if (!pedited || pedited->retinex.grad) { - keyFile.set_integer ("Retinex", "Grad", retinex.grad); - } - - if (!pedited || pedited->retinex.grads) { - keyFile.set_integer ("Retinex", "Grads", retinex.grads); - } - - if (!pedited || pedited->retinex.gam) { - keyFile.set_double ("Retinex", "Gam", retinex.gam); - } - - if (!pedited || pedited->retinex.slope) { - keyFile.set_double ("Retinex", "Slope", retinex.slope); - } - - if (!pedited || pedited->retinex.medianmap) { - keyFile.set_boolean ("Retinex", "Median", retinex.medianmap); - } - - - - if (!pedited || pedited->retinex.neigh) { - keyFile.set_integer ("Retinex", "Neigh", retinex.neigh); - } - - if (!pedited || pedited->retinex.offs) { - keyFile.set_integer ("Retinex", "Offs", retinex.offs); - } - - if (!pedited || pedited->retinex.vart) { - keyFile.set_integer ("Retinex", "Vart", retinex.vart); - } - - if (!pedited || pedited->retinex.limd) { - keyFile.set_integer ("Retinex", "Limd", retinex.limd); - } - - if (!pedited || pedited->retinex.highl) { - keyFile.set_integer ("Retinex", "highl", retinex.highl); - } - - if (!pedited || pedited->retinex.skal) { - keyFile.set_integer ("Retinex", "skal", retinex.skal); - } - - if (!pedited || pedited->retinex.retinexMethod) { - keyFile.set_string ("Retinex", "RetinexMethod", retinex.retinexMethod); - } - - if (!pedited || pedited->retinex.mapMethod) { - keyFile.set_string ("Retinex", "mapMethod", retinex.mapMethod); - } - - if (!pedited || pedited->retinex.viewMethod) { - keyFile.set_string ("Retinex", "viewMethod", retinex.viewMethod); - } - - if (!pedited || pedited->retinex.retinexcolorspace) { - keyFile.set_string ("Retinex", "Retinexcolorspace", retinex.retinexcolorspace); - } - - if (!pedited || pedited->retinex.gammaretinex) { - keyFile.set_string ("Retinex", "Gammaretinex", retinex.gammaretinex); - } - - if (!pedited || pedited->retinex.cdcurve) { - Glib::ArrayHandle cdcurve = retinex.cdcurve; - keyFile.set_double_list ("Retinex", "CDCurve", cdcurve); - } - - if (!pedited || pedited->retinex.mapcurve) { - Glib::ArrayHandle mapcurve = retinex.mapcurve; - keyFile.set_double_list ("Retinex", "MAPCurve", mapcurve); - } - - if (!pedited || pedited->retinex.cdHcurve) { - Glib::ArrayHandle cdHcurve = retinex.cdHcurve; - keyFile.set_double_list ("Retinex", "CDHCurve", cdHcurve); - } - - if (!pedited || pedited->retinex.lhcurve) { - Glib::ArrayHandle lhcurve = retinex.lhcurve; - keyFile.set_double_list ("Retinex", "LHCurve", lhcurve); - } - - if (!pedited || pedited->retinex.highlights) { - keyFile.set_integer ("Retinex", "Highlights", retinex.highlights); - } - - if (!pedited || pedited->retinex.htonalwidth) { - keyFile.set_integer ("Retinex", "HighlightTonalWidth", retinex.htonalwidth); - } - - if (!pedited || pedited->retinex.shadows) { - keyFile.set_integer ("Retinex", "Shadows", retinex.shadows); - } - - if (!pedited || pedited->retinex.stonalwidth) { - keyFile.set_integer ("Retinex", "ShadowTonalWidth", retinex.stonalwidth); - } - - if (!pedited || pedited->retinex.radius) { - keyFile.set_integer ("Retinex", "Radius", retinex.radius); - } - - if (!pedited || pedited->retinex.transmissionCurve) { - Glib::ArrayHandle transmissionCurve = retinex.transmissionCurve; - keyFile.set_double_list ("Retinex", "TransmissionCurve", transmissionCurve); - } - - if (!pedited || pedited->retinex.gaintransmissionCurve) { - Glib::ArrayHandle gaintransmissionCurve = retinex.gaintransmissionCurve; - keyFile.set_double_list ("Retinex", "GainTransmissionCurve", gaintransmissionCurve); - } - -// save channel mixer - if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { - Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Channel Mixer", "Red", rmix); - } - - if (!pedited || pedited->chmixer.green[0] || pedited->chmixer.green[1] || pedited->chmixer.green[2]) { - Glib::ArrayHandle gmix (chmixer.green, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Channel Mixer", "Green", gmix); - } - - if (!pedited || pedited->chmixer.blue[0] || pedited->chmixer.blue[1] || pedited->chmixer.blue[2]) { - Glib::ArrayHandle bmix (chmixer.blue, 3, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Channel Mixer", "Blue", bmix); - } - -//save Black & White - if (!pedited || pedited->blackwhite.enabled) { - keyFile.set_boolean ("Black & White", "Enabled", blackwhite.enabled); - } - - if (!pedited || pedited->blackwhite.method) { - keyFile.set_string ("Black & White", "Method", blackwhite.method ); - } - - if (!pedited || pedited->blackwhite.autoc) { - keyFile.set_boolean ("Black & White", "Auto", blackwhite.autoc); - } - - if (!pedited || pedited->blackwhite.enabledcc) { - keyFile.set_boolean ("Black & White", "ComplementaryColors", blackwhite.enabledcc); - } - - if (!pedited || pedited->blackwhite.setting) { - keyFile.set_string ("Black & White", "Setting", blackwhite.setting ); - } - - if (!pedited || pedited->blackwhite.filter) { - keyFile.set_string ("Black & White", "Filter", blackwhite.filter ); - } - - if (!pedited || pedited->blackwhite.mixerRed) { - keyFile.set_integer ("Black & White", "MixerRed", blackwhite.mixerRed); - } - - if (!pedited || pedited->blackwhite.mixerOrange) { - keyFile.set_integer ("Black & White", "MixerOrange", blackwhite.mixerOrange); - } - - if (!pedited || pedited->blackwhite.mixerYellow) { - keyFile.set_integer ("Black & White", "MixerYellow", blackwhite.mixerYellow); - } - - if (!pedited || pedited->blackwhite.mixerGreen) { - keyFile.set_integer ("Black & White", "MixerGreen", blackwhite.mixerGreen); - } - - if (!pedited || pedited->blackwhite.mixerCyan) { - keyFile.set_integer ("Black & White", "MixerCyan", blackwhite.mixerCyan); - } - - if (!pedited || pedited->blackwhite.mixerBlue) { - keyFile.set_integer ("Black & White", "MixerBlue", blackwhite.mixerBlue); - } - - if (!pedited || pedited->blackwhite.mixerMagenta) { - keyFile.set_integer ("Black & White", "MixerMagenta", blackwhite.mixerMagenta); - } - - if (!pedited || pedited->blackwhite.mixerPurple) { - keyFile.set_integer ("Black & White", "MixerPurple", blackwhite.mixerPurple); - } - - if (!pedited || pedited->blackwhite.gammaRed) { - keyFile.set_integer ("Black & White", "GammaRed", blackwhite.gammaRed); - } - - if (!pedited || pedited->blackwhite.gammaGreen) { - keyFile.set_integer ("Black & White", "GammaGreen", blackwhite.gammaGreen); - } - - if (!pedited || pedited->blackwhite.gammaBlue) { - keyFile.set_integer ("Black & White", "GammaBlue", blackwhite.gammaBlue); - } - - if (!pedited || pedited->blackwhite.algo) { - keyFile.set_string ("Black & White", "Algorithm", blackwhite.algo); - } - - if (!pedited || pedited->blackwhite.luminanceCurve) { - Glib::ArrayHandle luminanceCurve = blackwhite.luminanceCurve; - keyFile.set_double_list ("Black & White", "LuminanceCurve", luminanceCurve); - } - - if (!pedited || pedited->blackwhite.beforeCurveMode) { - Glib::ustring mode; - - switch (blackwhite.beforeCurveMode) { - case (BlackWhiteParams::TC_MODE_STD_BW): - mode = "Standard"; - break; - - case (BlackWhiteParams::TC_MODE_FILMLIKE_BW): - mode = "FilmLike"; - break; - - case (BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW): - mode = "SatAndValueBlending"; - break; - - case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): - mode = "WeightedStd"; - break; - } - - keyFile.set_string ("Black & White", "BeforeCurveMode", mode); - } - - if (!pedited || pedited->blackwhite.afterCurveMode) { - Glib::ustring mode; - - switch (blackwhite.afterCurveMode) { - case (BlackWhiteParams::TC_MODE_STD_BW): - mode = "Standard"; - break; - - case (BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW): - mode = "WeightedStd"; - break; - - default: - break; - } - - keyFile.set_string ("Black & White", "AfterCurveMode", mode); - } - - if (!pedited || pedited->blackwhite.beforeCurve) { - Glib::ArrayHandle tcurvebw = blackwhite.beforeCurve; - keyFile.set_double_list ("Black & White", "BeforeCurve", tcurvebw); - } - - if (!pedited || pedited->blackwhite.afterCurve) { - Glib::ArrayHandle tcurvebw = blackwhite.afterCurve; - keyFile.set_double_list ("Black & White", "AfterCurve", tcurvebw); - } - -// save luma curve - if (!pedited || pedited->labCurve.brightness) { - keyFile.set_integer ("Luminance Curve", "Brightness", labCurve.brightness); - } - - if (!pedited || pedited->labCurve.contrast) { - keyFile.set_integer ("Luminance Curve", "Contrast", labCurve.contrast); - } - - if (!pedited || pedited->labCurve.chromaticity) { - keyFile.set_integer ("Luminance Curve", "Chromaticity", labCurve.chromaticity); - } - - if (!pedited || pedited->labCurve.avoidcolorshift) { - keyFile.set_boolean ("Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift); - } - - if (!pedited || pedited->labCurve.rstprotection) { - keyFile.set_double ("Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection); - } - - if (!pedited || pedited->labCurve.lcredsk) { - keyFile.set_boolean ("Luminance Curve", "LCredsk", labCurve.lcredsk); - } - - if (!pedited || pedited->labCurve.lcurve) { - Glib::ArrayHandle lcurve = labCurve.lcurve; - keyFile.set_double_list ("Luminance Curve", "LCurve", lcurve); - } - - if (!pedited || pedited->labCurve.acurve) { - Glib::ArrayHandle acurve = labCurve.acurve; - keyFile.set_double_list ("Luminance Curve", "aCurve", acurve); - } - - if (!pedited || pedited->labCurve.bcurve) { - Glib::ArrayHandle bcurve = labCurve.bcurve; - keyFile.set_double_list ("Luminance Curve", "bCurve", bcurve); - } - - if (!pedited || pedited->labCurve.cccurve) { - Glib::ArrayHandle cccurve = labCurve.cccurve; - keyFile.set_double_list ("Luminance Curve", "ccCurve", cccurve); - } - - if (!pedited || pedited->labCurve.chcurve) { - Glib::ArrayHandle chcurve = labCurve.chcurve; - keyFile.set_double_list ("Luminance Curve", "chCurve", chcurve); - } - - if (!pedited || pedited->labCurve.lhcurve) { - Glib::ArrayHandle lhcurve = labCurve.lhcurve; - keyFile.set_double_list ("Luminance Curve", "lhCurve", lhcurve); - } - - if (!pedited || pedited->labCurve.hhcurve) { - Glib::ArrayHandle hhcurve = labCurve.hhcurve; - keyFile.set_double_list ("Luminance Curve", "hhCurve", hhcurve); - } - - if (!pedited || pedited->labCurve.lccurve) { - Glib::ArrayHandle lccurve = labCurve.lccurve; - keyFile.set_double_list ("Luminance Curve", "LcCurve", lccurve); - } - - if (!pedited || pedited->labCurve.clcurve) { - Glib::ArrayHandle clcurve = labCurve.clcurve; - keyFile.set_double_list ("Luminance Curve", "ClCurve", clcurve); - } - -// save sharpening - if (!pedited || pedited->sharpening.enabled) { - keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); - } - - if (!pedited || pedited->sharpening.method) { - keyFile.set_string ("Sharpening", "Method", sharpening.method); - } - - if (!pedited || pedited->sharpening.radius) { - keyFile.set_double ("Sharpening", "Radius", sharpening.radius); - } - - if (!pedited || pedited->sharpening.amount) { - keyFile.set_integer ("Sharpening", "Amount", sharpening.amount); - } - - if (!pedited || pedited->sharpening.threshold) { - Glib::ArrayHandle thresh (sharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Sharpening", "Threshold", thresh); - } - - if (!pedited || pedited->sharpening.edgesonly) { - keyFile.set_boolean ("Sharpening", "OnlyEdges", sharpening.edgesonly); - } - - if (!pedited || pedited->sharpening.edges_radius) { - keyFile.set_double ("Sharpening", "EdgedetectionRadius", sharpening.edges_radius); - } - - if (!pedited || pedited->sharpening.edges_tolerance) { - keyFile.set_integer ("Sharpening", "EdgeTolerance", sharpening.edges_tolerance); - } - - if (!pedited || pedited->sharpening.halocontrol) { - keyFile.set_boolean ("Sharpening", "HalocontrolEnabled", sharpening.halocontrol); - } - - if (!pedited || pedited->sharpening.halocontrol_amount) { - keyFile.set_integer ("Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount); - } - - if (!pedited || pedited->sharpening.deconvradius) { - keyFile.set_double ("Sharpening", "DeconvRadius", sharpening.deconvradius); - } - - if (!pedited || pedited->sharpening.deconvamount) { - keyFile.set_integer ("Sharpening", "DeconvAmount", sharpening.deconvamount); - } - - if (!pedited || pedited->sharpening.deconvdamping) { - keyFile.set_integer ("Sharpening", "DeconvDamping", sharpening.deconvdamping); - } - - if (!pedited || pedited->sharpening.deconviter) { - keyFile.set_integer ("Sharpening", "DeconvIterations", sharpening.deconviter); - } - -// save vibrance - if (!pedited || pedited->vibrance.enabled) { - keyFile.set_boolean ("Vibrance", "Enabled", vibrance.enabled); - } - - if (!pedited || pedited->vibrance.pastels) { - keyFile.set_integer ("Vibrance", "Pastels", vibrance.pastels); - } - - if (!pedited || pedited->vibrance.saturated) { - keyFile.set_integer ("Vibrance", "Saturated", vibrance.saturated); - } - - if (!pedited || pedited->vibrance.psthreshold) { - Glib::ArrayHandle thresh (vibrance.psthreshold.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Vibrance", "PSThreshold", thresh); - } - - if (!pedited || pedited->vibrance.protectskins) { - keyFile.set_boolean ("Vibrance", "ProtectSkins", vibrance.protectskins); - } - - if (!pedited || pedited->vibrance.avoidcolorshift) { - keyFile.set_boolean ("Vibrance", "AvoidColorShift", vibrance.avoidcolorshift); - } - - if (!pedited || pedited->vibrance.pastsattog) { - keyFile.set_boolean ("Vibrance", "PastSatTog", vibrance.pastsattog); - } - - if (!pedited || pedited->vibrance.skintonescurve) { - Glib::ArrayHandle skintonescurve = vibrance.skintonescurve; - keyFile.set_double_list ("Vibrance", "SkinTonesCurve", skintonescurve); - } - -//save edge sharpening - if (!pedited || pedited->sharpenEdge.enabled) { - keyFile.set_boolean ("SharpenEdge", "Enabled", sharpenEdge.enabled); - } - - if (!pedited || pedited->sharpenEdge.passes) { - keyFile.set_integer ("SharpenEdge", "Passes", sharpenEdge.passes); - } - - if (!pedited || pedited->sharpenEdge.amount) { - keyFile.set_double ("SharpenEdge", "Strength", sharpenEdge.amount); - } - - if (!pedited || pedited->sharpenEdge.threechannels) { - keyFile.set_boolean ("SharpenEdge", "ThreeChannels", sharpenEdge.threechannels); - } - -//save micro-contrast sharpening - if (!pedited || pedited->sharpenMicro.enabled) { - keyFile.set_boolean ("SharpenMicro", "Enabled", sharpenMicro.enabled); - } - - if (!pedited || pedited->sharpenMicro.matrix) { - keyFile.set_boolean ("SharpenMicro", "Matrix", sharpenMicro.matrix); - } - - if (!pedited || pedited->sharpenMicro.amount) { - keyFile.set_double ("SharpenMicro", "Strength", sharpenMicro.amount); - } - - if (!pedited || pedited->sharpenMicro.uniformity) { - keyFile.set_double ("SharpenMicro", "Uniformity", sharpenMicro.uniformity); - } - - /* - // save colorBoost - if (!pedited || pedited->colorBoost.amount) keyFile.set_integer ("Color Boost", "Amount", colorBoost.amount); - if (!pedited || pedited->colorBoost.avoidclip) keyFile.set_boolean ("Color Boost", "AvoidColorClipping", colorBoost.avoidclip); - if (!pedited || pedited->colorBoost.enable_saturationlimiter) keyFile.set_boolean ("Color Boost", "SaturationLimiter", colorBoost.enable_saturationlimiter); - if (!pedited || pedited->colorBoost.saturationlimit) keyFile.set_double ("Color Boost", "SaturationLimit", colorBoost.saturationlimit); - */ - - // save wb - if (!pedited || pedited->wb.method) { - keyFile.set_string ("White Balance", "Setting", wb.method); - } - - if (!pedited || pedited->wb.temperature) { - keyFile.set_integer ("White Balance", "Temperature", wb.temperature); - } - - if (!pedited || pedited->wb.green) { - keyFile.set_double ("White Balance", "Green", wb.green); - } - - if (!pedited || pedited->wb.equal) { - keyFile.set_double ("White Balance", "Equal", wb.equal); - } - - if (!pedited || pedited->wb.tempBias) { - keyFile.set_double ("White Balance", "TemperatureBias", wb.tempBias); - } - - /* - // save colorShift - if (!pedited || pedited->colorShift.a) keyFile.set_double ("Color Shift", "ChannelA", colorShift.a); - if (!pedited || pedited->colorShift.b) keyFile.set_double ("Color Shift", "ChannelB", colorShift.b); - */ -// save colorappearance - if (!pedited || pedited->colorappearance.enabled) { - keyFile.set_boolean ("Color appearance", "Enabled", colorappearance.enabled); - } - - if (!pedited || pedited->colorappearance.degree) { - keyFile.set_integer ("Color appearance", "Degree", colorappearance.degree); - } - - if (!pedited || pedited->colorappearance.autodegree) { - keyFile.set_boolean ("Color appearance", "AutoDegree", colorappearance.autodegree); - } - - if (!pedited || pedited->colorappearance.degreeout) { - keyFile.set_integer ("Color appearance", "Degreeout", colorappearance.degreeout); - } - - if (!pedited || pedited->colorappearance.autodegreeout) { - keyFile.set_boolean ("Color appearance", "AutoDegreeout", colorappearance.autodegreeout); - } - - if (!pedited || pedited->colorappearance.surround) { - keyFile.set_string ("Color appearance", "Surround", colorappearance.surround); - } - - if (!pedited || pedited->colorappearance.surrsrc) { - keyFile.set_string ("Color appearance", "Surrsrc", colorappearance.surrsrc); - } - -// if (!pedited || pedited->colorappearance.backgrd) keyFile.set_integer ("Color appearance", "Background", colorappearance.backgrd); - if (!pedited || pedited->colorappearance.adaplum) { - keyFile.set_double ("Color appearance", "AdaptLum", colorappearance.adaplum); - } - - if (!pedited || pedited->colorappearance.badpixsl) { - keyFile.set_integer ("Color appearance", "Badpixsl", colorappearance.badpixsl); - } - - if (!pedited || pedited->colorappearance.wbmodel) { - keyFile.set_string ("Color appearance", "Model", colorappearance.wbmodel); - } - - if (!pedited || pedited->colorappearance.algo) { - keyFile.set_string ("Color appearance", "Algorithm", colorappearance.algo); - } - - if (!pedited || pedited->colorappearance.jlight) { - keyFile.set_double ("Color appearance", "J-Light", colorappearance.jlight); - } - - if (!pedited || pedited->colorappearance.qbright) { - keyFile.set_double ("Color appearance", "Q-Bright", colorappearance.qbright); - } - - if (!pedited || pedited->colorappearance.chroma) { - keyFile.set_double ("Color appearance", "C-Chroma", colorappearance.chroma); - } - - if (!pedited || pedited->colorappearance.schroma) { - keyFile.set_double ("Color appearance", "S-Chroma", colorappearance.schroma); - } - - if (!pedited || pedited->colorappearance.mchroma) { - keyFile.set_double ("Color appearance", "M-Chroma", colorappearance.mchroma); - } - - if (!pedited || pedited->colorappearance.contrast) { - keyFile.set_double ("Color appearance", "J-Contrast", colorappearance.contrast); - } - - if (!pedited || pedited->colorappearance.qcontrast) { - keyFile.set_double ("Color appearance", "Q-Contrast", colorappearance.qcontrast); - } - - if (!pedited || pedited->colorappearance.colorh) { - keyFile.set_double ("Color appearance", "H-Hue", colorappearance.colorh); - } - - if (!pedited || pedited->colorappearance.rstprotection) { - keyFile.set_double ("Color appearance", "RSTProtection", colorappearance.rstprotection); - } - - if (!pedited || pedited->colorappearance.adapscen) { - keyFile.set_double ("Color appearance", "AdaptScene", colorappearance.adapscen); - } - - if (!pedited || pedited->colorappearance.autoadapscen) { - keyFile.set_boolean ("Color appearance", "AutoAdapscen", colorappearance.autoadapscen); - } - - if (!pedited || pedited->colorappearance.ybscen) { - keyFile.set_integer ("Color appearance", "YbScene", colorappearance.ybscen); - } - - if (!pedited || pedited->colorappearance.autoybscen) { - keyFile.set_boolean ("Color appearance", "Autoybscen", colorappearance.autoybscen); - } - - if (!pedited || pedited->colorappearance.surrsource) { - keyFile.set_boolean ("Color appearance", "SurrSource", colorappearance.surrsource); - } - - if (!pedited || pedited->colorappearance.gamut) { - keyFile.set_boolean ("Color appearance", "Gamut", colorappearance.gamut); - } - - if (!pedited || pedited->colorappearance.tempout) { - keyFile.set_integer ("Color appearance", "Tempout", colorappearance.tempout); - } - - if (!pedited || pedited->colorappearance.greenout) { - keyFile.set_double ("Color appearance", "Greenout", colorappearance.greenout); - } - - if (!pedited || pedited->colorappearance.tempsc) { - keyFile.set_integer ("Color appearance", "Tempsc", colorappearance.tempsc); - } - - if (!pedited || pedited->colorappearance.greensc) { - keyFile.set_double ("Color appearance", "Greensc", colorappearance.greensc); - } - - if (!pedited || pedited->colorappearance.ybout) { - keyFile.set_integer ("Color appearance", "Ybout", colorappearance.ybout); - } - -// if (!pedited || pedited->colorappearance.badpix) keyFile.set_boolean ("Color appearance", "Badpix", colorappearance.badpix); - if (!pedited || pedited->colorappearance.datacie) { - keyFile.set_boolean ("Color appearance", "Datacie", colorappearance.datacie); - } - - if (!pedited || pedited->colorappearance.tonecie) { - keyFile.set_boolean ("Color appearance", "Tonecie", colorappearance.tonecie); - } - -// if (!pedited || pedited->colorappearance.sharpcie) keyFile.set_boolean ("Color appearance", "Sharpcie", colorappearance.sharpcie); - if (!pedited || pedited->colorappearance.curveMode) { - Glib::ustring method; - - switch (colorappearance.curveMode) { - case (ColorAppearanceParams::TC_MODE_LIGHT): - method = "Lightness"; - break; - - case (ColorAppearanceParams::TC_MODE_BRIGHT): - method = "Brightness"; - break; - } - - keyFile.set_string ("Color appearance", "CurveMode", method); - } - - if (!pedited || pedited->colorappearance.curveMode2) { - Glib::ustring method; - - switch (colorappearance.curveMode2) { - case (ColorAppearanceParams::TC_MODE_LIGHT): - method = "Lightness"; - break; - - case (ColorAppearanceParams::TC_MODE_BRIGHT): - method = "Brightness"; - break; - } - - keyFile.set_string ("Color appearance", "CurveMode2", method); - } - - if (!pedited || pedited->colorappearance.curveMode3) { - Glib::ustring method; - - switch (colorappearance.curveMode3) { - case (ColorAppearanceParams::TC_MODE_CHROMA): - method = "Chroma"; - break; - - case (ColorAppearanceParams::TC_MODE_SATUR): - method = "Saturation"; - break; - - case (ColorAppearanceParams::TC_MODE_COLORF): - method = "Colorfullness"; - break; - - } - - keyFile.set_string ("Color appearance", "CurveMode3", method); - } - - if (!pedited || pedited->colorappearance.curve) { - Glib::ArrayHandle tcurve = colorappearance.curve; - keyFile.set_double_list ("Color appearance", "Curve", tcurve); - } - - if (!pedited || pedited->colorappearance.curve2) { - Glib::ArrayHandle tcurve = colorappearance.curve2; - keyFile.set_double_list ("Color appearance", "Curve2", tcurve); - } - - if (!pedited || pedited->colorappearance.curve3) { - Glib::ArrayHandle tcurve = colorappearance.curve3; - keyFile.set_double_list ("Color appearance", "Curve3", tcurve); - } - - - -// save impulseDenoise - if (!pedited || pedited->impulseDenoise.enabled) { - keyFile.set_boolean ("Impulse Denoising", "Enabled", impulseDenoise.enabled); - } - - if (!pedited || pedited->impulseDenoise.thresh) { - keyFile.set_integer ("Impulse Denoising", "Threshold", impulseDenoise.thresh); - } - -// save defringe - if (!pedited || pedited->defringe.enabled) { - keyFile.set_boolean ("Defringing", "Enabled", defringe.enabled); - } - - if (!pedited || pedited->defringe.radius) { - keyFile.set_double ("Defringing", "Radius", defringe.radius); - } - - if (!pedited || pedited->defringe.threshold) { - keyFile.set_integer ("Defringing", "Threshold", defringe.threshold); - } - - if (!pedited || pedited->defringe.huecurve) { - Glib::ArrayHandle huecurve = defringe.huecurve; - keyFile.set_double_list ("Defringing", "HueCurve", huecurve); - } - -// save dirpyrDenoise - if (!pedited || pedited->dirpyrDenoise.enabled) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled); - } - - if (!pedited || pedited->dirpyrDenoise.enhance) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance); - } - - if (!pedited || pedited->dirpyrDenoise.median) { - keyFile.set_boolean ("Directional Pyramid Denoising", "Median", dirpyrDenoise.median); - } - -// if (!pedited || pedited->dirpyrDenoise.perform) keyFile.set_boolean ("Directional Pyramid Denoising", "Perform", dirpyrDenoise.perform); - if (!pedited || pedited->dirpyrDenoise.luma) { - keyFile.set_double ("Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma); - } - - if (!pedited || pedited->dirpyrDenoise.Ldetail) { - keyFile.set_double ("Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail); - } - - if (!pedited || pedited->dirpyrDenoise.chroma) { - keyFile.set_double ("Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma); - } - - if (!pedited || pedited->dirpyrDenoise.dmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod); - } - - if (!pedited || pedited->dirpyrDenoise.Lmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod); - } - -// never save 'auto chroma preview mode' to pp3 - if (!pedited || pedited->dirpyrDenoise.Cmethod) { - if (dirpyrDenoise.Cmethod == "PRE") { - dirpyrDenoise.Cmethod = "MAN"; - } - - keyFile.set_string ("Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod); - } - - if (!pedited || pedited->dirpyrDenoise.C2method) { - if (dirpyrDenoise.C2method == "PREV") { - dirpyrDenoise.C2method = "MANU"; - } - - keyFile.set_string ("Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method); - } - - if (!pedited || pedited->dirpyrDenoise.smethod) { - keyFile.set_string ("Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod); - } - - if (!pedited || pedited->dirpyrDenoise.medmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod); - } - - if (!pedited || pedited->dirpyrDenoise.rgbmethod) { - keyFile.set_string ("Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod); - } - - if (!pedited || pedited->dirpyrDenoise.methodmed) { - keyFile.set_string ("Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed); - } - - if (!pedited || pedited->dirpyrDenoise.redchro) { - keyFile.set_double ("Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro); - } - - if (!pedited || pedited->dirpyrDenoise.bluechro) { - keyFile.set_double ("Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro); - } - - if (!pedited || pedited->dirpyrDenoise.gamma) { - keyFile.set_double ("Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma); - } - - if (!pedited || pedited->dirpyrDenoise.passes) { - keyFile.set_integer ("Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes); - } - - if (!pedited || pedited->dirpyrDenoise.lcurve) { - Glib::ArrayHandle lcurve = dirpyrDenoise.lcurve; - keyFile.set_double_list ("Directional Pyramid Denoising", "LCurve", lcurve); - } - - if (!pedited || pedited->dirpyrDenoise.cccurve) { - Glib::ArrayHandle cccurve = dirpyrDenoise.cccurve; - keyFile.set_double_list ("Directional Pyramid Denoising", "CCCurve", cccurve); - } - -// save epd. - if (!pedited || pedited->epd.enabled) { - keyFile.set_boolean ("EPD", "Enabled", epd.enabled); - } - - if (!pedited || pedited->epd.strength) { - keyFile.set_double ("EPD", "Strength", epd.strength); - } - - if (!pedited || pedited->epd.gamma) { - keyFile.set_double ("EPD", "Gamma", epd.gamma); - } - - if (!pedited || pedited->epd.edgeStopping) { - keyFile.set_double ("EPD", "EdgeStopping", epd.edgeStopping); - } - - if (!pedited || pedited->epd.scale) { - keyFile.set_double ("EPD", "Scale", epd.scale); - } - - if (!pedited || pedited->epd.reweightingIterates) { - keyFile.set_integer ("EPD", "ReweightingIterates", epd.reweightingIterates); - } - - /* - // save lumaDenoise - if (!pedited || pedited->lumaDenoise.enabled) keyFile.set_boolean ("Luminance Denoising", "Enabled", lumaDenoise.enabled); - if (!pedited || pedited->lumaDenoise.radius) keyFile.set_double ("Luminance Denoising", "Radius", lumaDenoise.radius); - if (!pedited || pedited->lumaDenoise.edgetolerance) keyFile.set_integer ("Luminance Denoising", "EdgeTolerance", lumaDenoise.edgetolerance); - */ - - /* - // save colorDenoise - //if (!pedited || pedited->colorDenoise.enabled) keyFile.set_boolean ("Chrominance Denoising", "Enabled", colorDenoise.enabled); - if (!pedited || pedited->colorDenoise.amount) keyFile.set_integer ("Chrominance Denoising", "Amount", colorDenoise.amount); - */ - -// save sh - if (!pedited || pedited->sh.enabled) { - keyFile.set_boolean ("Shadows & Highlights", "Enabled", sh.enabled); - } - - if (!pedited || pedited->sh.hq) { - keyFile.set_boolean ("Shadows & Highlights", "HighQuality", sh.hq); - } - - if (!pedited || pedited->sh.highlights) { - keyFile.set_integer ("Shadows & Highlights", "Highlights", sh.highlights); - } - - if (!pedited || pedited->sh.htonalwidth) { - keyFile.set_integer ("Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth); - } - - if (!pedited || pedited->sh.shadows) { - keyFile.set_integer ("Shadows & Highlights", "Shadows", sh.shadows); - } - - if (!pedited || pedited->sh.stonalwidth) { - keyFile.set_integer ("Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth); - } - - if (!pedited || pedited->sh.localcontrast) { - keyFile.set_integer ("Shadows & Highlights", "LocalContrast", sh.localcontrast); - } - - if (!pedited || pedited->sh.radius) { - keyFile.set_integer ("Shadows & Highlights", "Radius", sh.radius); - } - -// save crop - if (!pedited || pedited->crop.enabled) { - keyFile.set_boolean ("Crop", "Enabled", crop.enabled); - } - - if (!pedited || pedited->crop.x) { - keyFile.set_integer ("Crop", "X", crop.x); - } - - if (!pedited || pedited->crop.y) { - keyFile.set_integer ("Crop", "Y", crop.y); - } - - if (!pedited || pedited->crop.w) { - keyFile.set_integer ("Crop", "W", crop.w); - } - - if (!pedited || pedited->crop.h) { - keyFile.set_integer ("Crop", "H", crop.h); - } - - if (!pedited || pedited->crop.fixratio) { - keyFile.set_boolean ("Crop", "FixedRatio", crop.fixratio); - } - - if (!pedited || pedited->crop.ratio) { - keyFile.set_string ("Crop", "Ratio", crop.ratio); - } - - if (!pedited || pedited->crop.orientation) { - keyFile.set_string ("Crop", "Orientation", crop.orientation); - } - - if (!pedited || pedited->crop.guide) { - keyFile.set_string ("Crop", "Guide", crop.guide); - } - -// save coarse - if (!pedited || pedited->coarse.rotate) { - keyFile.set_integer ("Coarse Transformation", "Rotate", coarse.rotate); - } - - if (!pedited || pedited->coarse.hflip) { - keyFile.set_boolean ("Coarse Transformation", "HorizontalFlip", coarse.hflip); - } - - if (!pedited || pedited->coarse.vflip) { - keyFile.set_boolean ("Coarse Transformation", "VerticalFlip", coarse.vflip); - } - -// save commonTrans - if (!pedited || pedited->commonTrans.autofill) { - keyFile.set_boolean ("Common Properties for Transformations", "AutoFill", commonTrans.autofill); - } - -// save rotate - if (!pedited || pedited->rotate.degree) { - keyFile.set_double ("Rotation", "Degree", rotate.degree); - } - -// save distortion - if (!pedited || pedited->distortion.amount) { - keyFile.set_double ("Distortion", "Amount", distortion.amount); - } - -// lens profile - if (!pedited || pedited->lensProf.lcMode) { - keyFile.set_string ("LensProfile", "LcMode", lensProf.getMethodString (lensProf.lcMode)); - } - - if (!pedited || pedited->lensProf.lcpFile) { - keyFile.set_string ("LensProfile", "LCPFile", relativePathIfInside (fname, fnameAbsolute, lensProf.lcpFile)); - } - - if (!pedited || pedited->lensProf.useDist) { - keyFile.set_boolean ("LensProfile", "UseDistortion", lensProf.useDist); - } - - if (!pedited || pedited->lensProf.useVign) { - keyFile.set_boolean ("LensProfile", "UseVignette", lensProf.useVign); - } - - if (!pedited || pedited->lensProf.useCA) { - keyFile.set_boolean ("LensProfile", "UseCA", lensProf.useCA); - } - - if (!pedited || pedited->lensProf.lfCameraMake) { - keyFile.set_string("LensProfile", "LFCameraMake", lensProf.lfCameraMake); - } - if (!pedited || pedited->lensProf.lfCameraModel) { - keyFile.set_string("LensProfile", "LFCameraModel", lensProf.lfCameraModel); - } - if (!pedited || pedited->lensProf.lfLens) { - keyFile.set_string("LensProfile", "LFLens", lensProf.lfLens); - } - -// save perspective correction - if (!pedited || pedited->perspective.horizontal) { - keyFile.set_double ("Perspective", "Horizontal", perspective.horizontal); - } - - if (!pedited || pedited->perspective.vertical) { - keyFile.set_double ("Perspective", "Vertical", perspective.vertical); - } - -// save gradient - if (!pedited || pedited->gradient.enabled) { - keyFile.set_boolean ("Gradient", "Enabled", gradient.enabled); - } - - if (!pedited || pedited->gradient.degree) { - keyFile.set_double ("Gradient", "Degree", gradient.degree); - } - - if (!pedited || pedited->gradient.feather) { - keyFile.set_integer ("Gradient", "Feather", gradient.feather); - } - - if (!pedited || pedited->gradient.strength) { - keyFile.set_double ("Gradient", "Strength", gradient.strength); - } - - if (!pedited || pedited->gradient.centerX) { - keyFile.set_integer ("Gradient", "CenterX", gradient.centerX); - } - - if (!pedited || pedited->gradient.centerY) { - keyFile.set_integer ("Gradient", "CenterY", gradient.centerY); - } - -// save post-crop vignette - if (!pedited || pedited->pcvignette.enabled) { - keyFile.set_boolean ("PCVignette", "Enabled", pcvignette.enabled); - } - - if (!pedited || pedited->pcvignette.strength) { - keyFile.set_double ("PCVignette", "Strength", pcvignette.strength); - } - - if (!pedited || pedited->pcvignette.feather) { - keyFile.set_integer ("PCVignette", "Feather", pcvignette.feather); - } - - if (!pedited || pedited->pcvignette.roundness) { - keyFile.set_integer ("PCVignette", "Roundness", pcvignette.roundness); - } - -// save C/A correction - if (!pedited || pedited->cacorrection.red) { - keyFile.set_double ("CACorrection", "Red", cacorrection.red); - } - - if (!pedited || pedited->cacorrection.blue) { - keyFile.set_double ("CACorrection", "Blue", cacorrection.blue); - } - -// save vignetting correction - if (!pedited || pedited->vignetting.amount) { - keyFile.set_integer ("Vignetting Correction", "Amount", vignetting.amount); - } - - if (!pedited || pedited->vignetting.radius) { - keyFile.set_integer ("Vignetting Correction", "Radius", vignetting.radius); - } - - if (!pedited || pedited->vignetting.strength) { - keyFile.set_integer ("Vignetting Correction", "Strength", vignetting.strength); - } - - if (!pedited || pedited->vignetting.centerX) { - keyFile.set_integer ("Vignetting Correction", "CenterX", vignetting.centerX); - } - - if (!pedited || pedited->vignetting.centerY) { - keyFile.set_integer ("Vignetting Correction", "CenterY", vignetting.centerY); - } - - - if (!pedited || pedited->resize.enabled) { - keyFile.set_boolean ("Resize", "Enabled", resize.enabled); - } - - if (!pedited || pedited->resize.scale) { - keyFile.set_double ("Resize", "Scale", resize.scale); - } - - if (!pedited || pedited->resize.appliesTo) { - keyFile.set_string ("Resize", "AppliesTo", resize.appliesTo); - } - - if (!pedited || pedited->resize.method) { - keyFile.set_string ("Resize", "Method", resize.method); - } - - if (!pedited || pedited->resize.dataspec) { - keyFile.set_integer ("Resize", "DataSpecified", resize.dataspec); - } - - if (!pedited || pedited->resize.width) { - keyFile.set_integer ("Resize", "Width", resize.width); - } - - if (!pedited || pedited->resize.height) { - keyFile.set_integer ("Resize", "Height", resize.height); - } - - if (!pedited || pedited->prsharpening.enabled) { - keyFile.set_boolean ("PostResizeSharpening", "Enabled", prsharpening.enabled); - } - - if (!pedited || pedited->prsharpening.method) { - keyFile.set_string ("PostResizeSharpening", "Method", prsharpening.method); - } - - if (!pedited || pedited->prsharpening.radius) { - keyFile.set_double ("PostResizeSharpening", "Radius", prsharpening.radius); - } - - if (!pedited || pedited->prsharpening.amount) { - keyFile.set_integer ("PostResizeSharpening", "Amount", prsharpening.amount); - } - - if (!pedited || pedited->prsharpening.threshold) { - Glib::ArrayHandle thresh (prsharpening.threshold.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("PostResizeSharpening", "Threshold", thresh); - } - - if (!pedited || pedited->prsharpening.edgesonly) { - keyFile.set_boolean ("PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly); - } - - if (!pedited || pedited->prsharpening.edges_radius) { - keyFile.set_double ("PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius); - } - - if (!pedited || pedited->prsharpening.edges_tolerance) { - keyFile.set_integer ("PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance); - } - - if (!pedited || pedited->prsharpening.halocontrol) { - keyFile.set_boolean ("PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol); - } - - if (!pedited || pedited->prsharpening.halocontrol_amount) { - keyFile.set_integer ("PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount); - } - - if (!pedited || pedited->prsharpening.deconvradius) { - keyFile.set_double ("PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius); - } - - if (!pedited || pedited->prsharpening.deconvamount) { - keyFile.set_integer ("PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount); - } - - if (!pedited || pedited->prsharpening.deconvdamping) { - keyFile.set_integer ("PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping); - } - - if (!pedited || pedited->prsharpening.deconviter) { - keyFile.set_integer ("PostResizeSharpening", "DeconvIterations", prsharpening.deconviter); - } - - -// save color management settings - if (!pedited || pedited->icm.input) { - keyFile.set_string ("Color Management", "InputProfile", relativePathIfInside (fname, fnameAbsolute, icm.input)); - } - - if (!pedited || pedited->icm.toneCurve) { - keyFile.set_boolean ("Color Management", "ToneCurve", icm.toneCurve); - } - - if (!pedited || pedited->icm.applyLookTable) { - keyFile.set_boolean ("Color Management", "ApplyLookTable", icm.applyLookTable); - } - - if (!pedited || pedited->icm.applyBaselineExposureOffset) { - keyFile.set_boolean ("Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset); - } - - if (!pedited || pedited->icm.applyHueSatMap) { - keyFile.set_boolean ("Color Management", "ApplyHueSatMap", icm.applyHueSatMap); - } - - if (!pedited || pedited->icm.dcpIlluminant) { - keyFile.set_integer ("Color Management", "DCPIlluminant", icm.dcpIlluminant); - } - - if (!pedited || pedited->icm.working) { - keyFile.set_string ("Color Management", "WorkingProfile", icm.working); - } - - if (!pedited || pedited->icm.output) { - keyFile.set_string ("Color Management", "OutputProfile", icm.output); - } - - if (!pedited || pedited->icm.outputIntent) { - Glib::ustring intent; - - switch (icm.outputIntent) { - default: - case RI_PERCEPTUAL: - intent = "Perceptual"; - break; - - case RI_RELATIVE: - intent = "Relative"; - break; - - case RI_SATURATION: - intent = "Saturation"; - break; - - case RI_ABSOLUTE: - intent = "Absolute"; - break; - } - - keyFile.set_string ("Color Management", "OutputProfileIntent", intent); - } - - if (!pedited || pedited->icm.outputBPC) { - keyFile.set_boolean ("Color Management", "OutputBPC", icm.outputBPC); - } - - if (!pedited || pedited->icm.gamma) { - keyFile.set_string ("Color Management", "Gammafree", icm.gamma); - } - - if (!pedited || pedited->icm.freegamma) { - keyFile.set_boolean ("Color Management", "Freegamma", icm.freegamma); - } - - if (!pedited || pedited->icm.gampos) { - keyFile.set_double ("Color Management", "GammaValue", icm.gampos); - } - - if (!pedited || pedited->icm.slpos) { - keyFile.set_double ("Color Management", "GammaSlope", icm.slpos); - } - - - -// save wavelet parameters - if (!pedited || pedited->wavelet.enabled) { - keyFile.set_boolean ("Wavelet", "Enabled", wavelet.enabled); - } - - if (!pedited || pedited->wavelet.strength) { - keyFile.set_integer ("Wavelet", "Strength", wavelet.strength); - } - - if (!pedited || pedited->wavelet.balance) { - keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); - } - - if (!pedited || pedited->wavelet.iter) { - keyFile.set_integer ("Wavelet", "Iter", wavelet.iter); - } - - if (!pedited || pedited->wavelet.thres) { - keyFile.set_integer ("Wavelet", "MaxLev", wavelet.thres); - } - - if (!pedited || pedited->wavelet.Tilesmethod) { - keyFile.set_string ("Wavelet", "TilesMethod", wavelet.Tilesmethod); - } - - if (!pedited || pedited->wavelet.daubcoeffmethod) { - keyFile.set_string ("Wavelet", "DaubMethod", wavelet.daubcoeffmethod); - } - - if (!pedited || pedited->wavelet.CLmethod) { - keyFile.set_string ("Wavelet", "ChoiceLevMethod", wavelet.CLmethod); - } - - if (!pedited || pedited->wavelet.Backmethod) { - keyFile.set_string ("Wavelet", "BackMethod", wavelet.Backmethod); - } - - if (!pedited || pedited->wavelet.Lmethod) { - keyFile.set_string ("Wavelet", "LevMethod", wavelet.Lmethod); - } - - if (!pedited || pedited->wavelet.Dirmethod) { - keyFile.set_string ("Wavelet", "DirMethod", wavelet.Dirmethod); - } - - if (!pedited || pedited->wavelet.greenhigh) { - keyFile.set_integer ("Wavelet", "CBgreenhigh", wavelet.greenhigh); - } - - if (!pedited || pedited->wavelet.greenmed) { - keyFile.set_integer ("Wavelet", "CBgreenmed", wavelet.greenmed); - } - - if (!pedited || pedited->wavelet.greenlow) { - keyFile.set_integer ("Wavelet", "CBgreenlow", wavelet.greenlow); - } - - if (!pedited || pedited->wavelet.bluehigh) { - keyFile.set_integer ("Wavelet", "CBbluehigh", wavelet.bluehigh); - } - - if (!pedited || pedited->wavelet.bluemed) { - keyFile.set_integer ("Wavelet", "CBbluemed", wavelet.bluemed); - } - - if (!pedited || pedited->wavelet.bluelow) { - keyFile.set_integer ("Wavelet", "CBbluelow", wavelet.bluelow); - } - - if (!pedited || pedited->wavelet.expcontrast) { - keyFile.set_boolean ("Wavelet", "Expcontrast", wavelet.expcontrast); - } - - if (!pedited || pedited->wavelet.expchroma) { - keyFile.set_boolean ("Wavelet", "Expchroma", wavelet.expchroma); - } - - if (!pedited || pedited->wavelet.expedge) { - keyFile.set_boolean ("Wavelet", "Expedge", wavelet.expedge); - } - - if (!pedited || pedited->wavelet.expresid) { - keyFile.set_boolean ("Wavelet", "Expresid", wavelet.expresid); - } - - if (!pedited || pedited->wavelet.expfinal) { - keyFile.set_boolean ("Wavelet", "Expfinal", wavelet.expfinal); - } - - if (!pedited || pedited->wavelet.exptoning) { - keyFile.set_boolean ("Wavelet", "Exptoning", wavelet.exptoning); - } - - if (!pedited || pedited->wavelet.expnoise) { - keyFile.set_boolean ("Wavelet", "Expnoise", wavelet.expnoise); - } - - for (int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Contrast" << (i + 1); - - if (!pedited || pedited->wavelet.c[i]) { - keyFile.set_integer ("Wavelet", ss.str(), wavelet.c[i]); - } - } - - for (int i = 0; i < 9; i++) { - std::stringstream ss; - ss << "Chroma" << (i + 1); - - if (!pedited || pedited->wavelet.ch[i]) { - keyFile.set_integer ("Wavelet", ss.str(), wavelet.ch[i]); - } - } - - if (!pedited || pedited->wavelet.sup) { - keyFile.set_integer ("Wavelet", "ContExtra", wavelet.sup); - } - - if (!pedited || pedited->wavelet.HSmethod) { - keyFile.set_string ("Wavelet", "HSMethod", wavelet.HSmethod); - } - - if (!pedited || pedited->wavelet.hllev) { - Glib::ArrayHandle thresh (wavelet.hllev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "HLRange", thresh); - } - - if (!pedited || pedited->wavelet.bllev) { - Glib::ArrayHandle thresh (wavelet.bllev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "SHRange", thresh); - } - - if (!pedited || pedited->wavelet.edgcont) { - Glib::ArrayHandle thresh (wavelet.edgcont.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "Edgcont", thresh); - } - - if (!pedited || pedited->wavelet.level0noise) { - Glib::ArrayHandle thresh (wavelet.level0noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list ("Wavelet", "Level0noise", thresh); - } - - if (!pedited || pedited->wavelet.level1noise) { - Glib::ArrayHandle thresh (wavelet.level1noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list ("Wavelet", "Level1noise", thresh); - } - - if (!pedited || pedited->wavelet.level2noise) { - Glib::ArrayHandle thresh (wavelet.level2noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list ("Wavelet", "Level2noise", thresh); - } - - if (!pedited || pedited->wavelet.level3noise) { - Glib::ArrayHandle thresh (wavelet.level3noise.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_double_list ("Wavelet", "Level3noise", thresh); - } - - - if (!pedited || pedited->wavelet.threshold) { - keyFile.set_integer ("Wavelet", "ThresholdHighlight", wavelet.threshold); - } - - if (!pedited || pedited->wavelet.threshold2) { - keyFile.set_integer ("Wavelet", "ThresholdShadow", wavelet.threshold2); - } - - if (!pedited || pedited->wavelet.edgedetect) { - keyFile.set_integer ("Wavelet", "Edgedetect", wavelet.edgedetect); - } - - if (!pedited || pedited->wavelet.edgedetectthr) { - keyFile.set_integer ("Wavelet", "Edgedetectthr", wavelet.edgedetectthr); - } - - if (!pedited || pedited->wavelet.edgedetectthr2) { - keyFile.set_integer ("Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2); - } - - if (!pedited || pedited->wavelet.edgesensi) { - keyFile.set_integer ("Wavelet", "Edgesensi", wavelet.edgesensi); - } - - if (!pedited || pedited->wavelet.edgeampli) { - keyFile.set_integer ("Wavelet", "Edgeampli", wavelet.edgeampli); - } - - if (!pedited || pedited->wavelet.chroma) { - keyFile.set_integer ("Wavelet", "ThresholdChroma", wavelet.chroma); - } - - if (!pedited || pedited->wavelet.CHmethod) { - keyFile.set_string ("Wavelet", "CHromaMethod", wavelet.CHmethod); - } - - if (!pedited || pedited->wavelet.Medgreinf) { - keyFile.set_string ("Wavelet", "Medgreinf", wavelet.Medgreinf); - } - - if (!pedited || pedited->wavelet.CHSLmethod) { - keyFile.set_string ("Wavelet", "CHSLromaMethod", wavelet.CHSLmethod); - } - - if (!pedited || pedited->wavelet.EDmethod) { - keyFile.set_string ("Wavelet", "EDMethod", wavelet.EDmethod); - } - - if (!pedited || pedited->wavelet.NPmethod) { - keyFile.set_string ("Wavelet", "NPMethod", wavelet.NPmethod); - } - - if (!pedited || pedited->wavelet.BAmethod) { - keyFile.set_string ("Wavelet", "BAMethod", wavelet.BAmethod); - } - - if (!pedited || pedited->wavelet.TMmethod) { - keyFile.set_string ("Wavelet", "TMMethod", wavelet.TMmethod); - } - - if (!pedited || pedited->wavelet.chro) { - keyFile.set_integer ("Wavelet", "ChromaLink", wavelet.chro); - } - - if (!pedited || pedited->wavelet.ccwcurve) { - Glib::ArrayHandle ccwcurve = wavelet.ccwcurve; - keyFile.set_double_list ("Wavelet", "ContrastCurve", ccwcurve); - } - - if (!pedited || pedited->wavelet.pastlev) { - Glib::ArrayHandle thresh (wavelet.pastlev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "Pastlev", thresh); - } - - if (!pedited || pedited->wavelet.satlev) { - Glib::ArrayHandle thresh (wavelet.satlev.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "Satlev", thresh); - } - - if (!pedited || pedited->wavelet.opacityCurveRG) { - Glib::ArrayHandle curve = wavelet.opacityCurveRG; - keyFile.set_double_list ("Wavelet", "OpacityCurveRG", curve); - } - - if (!pedited || pedited->wavelet.opacityCurveBY) { - Glib::ArrayHandle curve = wavelet.opacityCurveBY; - keyFile.set_double_list ("Wavelet", "OpacityCurveBY", curve); - } - - if (!pedited || pedited->wavelet.opacityCurveW) { - Glib::ArrayHandle curve = wavelet.opacityCurveW; - keyFile.set_double_list ("Wavelet", "OpacityCurveW", curve); - } - - if (!pedited || pedited->wavelet.opacityCurveWL) { - Glib::ArrayHandle curve = wavelet.opacityCurveWL; - keyFile.set_double_list ("Wavelet", "OpacityCurveWL", curve); - } - - if (!pedited || pedited->wavelet.hhcurve) { - Glib::ArrayHandle curve = wavelet.hhcurve; - keyFile.set_double_list ("Wavelet", "HHcurve", curve); - } - - if (!pedited || pedited->wavelet.Chcurve) { - Glib::ArrayHandle curve = wavelet.Chcurve; - keyFile.set_double_list ("Wavelet", "CHcurve", curve); - } - - if (!pedited || pedited->wavelet.wavclCurve) { - Glib::ArrayHandle wavclCurve = wavelet.wavclCurve; - keyFile.set_double_list ("Wavelet", "WavclCurve", wavclCurve); - } - - - if (!pedited || pedited->wavelet.median) { - keyFile.set_boolean ("Wavelet", "Median", wavelet.median); - } - - if (!pedited || pedited->wavelet.medianlev) { - keyFile.set_boolean ("Wavelet", "Medianlev", wavelet.medianlev); - } - - if (!pedited || pedited->wavelet.linkedg) { - keyFile.set_boolean ("Wavelet", "Linkedg", wavelet.linkedg); - } - - if (!pedited || pedited->wavelet.cbenab) { - keyFile.set_boolean ("Wavelet", "CBenab", wavelet.cbenab); - } - - if (!pedited || pedited->wavelet.lipst) { - keyFile.set_boolean ("Wavelet", "Lipst", wavelet.lipst); - } - -// if (!pedited || pedited->wavelet.edgreinf) keyFile.set_boolean ("Wavelet", "Edgreinf", wavelet.edgreinf); - if (!pedited || pedited->wavelet.skinprotect) { - keyFile.set_double ("Wavelet", "Skinprotect", wavelet.skinprotect); - } - - if (!pedited || pedited->wavelet.hueskin) { - Glib::ArrayHandle thresh (wavelet.hueskin.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "Hueskin", thresh); - } - - if (!pedited || pedited->wavelet.edgrad) { - keyFile.set_integer ("Wavelet", "Edgrad", wavelet.edgrad); - } - - if (!pedited || pedited->wavelet.edgval) { - keyFile.set_integer ("Wavelet", "Edgval", wavelet.edgval); - } - - if (!pedited || pedited->wavelet.edgthresh) { - keyFile.set_integer ("Wavelet", "ThrEdg", wavelet.edgthresh); - } - -// if (!pedited || pedited->wavelet.strength) keyFile.set_integer ("Wavelet", "Strength", wavelet.strength); -// if (!pedited || pedited->wavelet.balance) keyFile.set_integer ("Wavelet", "Balance", wavelet.balance); - - if (!pedited || pedited->wavelet.avoid) { - keyFile.set_boolean ("Wavelet", "AvoidColorShift", wavelet.avoid); - } - - if (!pedited || pedited->wavelet.tmr) { - keyFile.set_boolean ("Wavelet", "TMr", wavelet.tmr); - } - - if (!pedited || pedited->wavelet.rescon) { - keyFile.set_integer ("Wavelet", "ResidualcontShadow", wavelet.rescon); - } - - if (!pedited || pedited->wavelet.resconH) { - keyFile.set_integer ("Wavelet", "ResidualcontHighlight", wavelet.resconH); - } - - if (!pedited || pedited->wavelet.thr) { - keyFile.set_integer ("Wavelet", "ThresholdResidShadow", wavelet.thr); - } - - if (!pedited || pedited->wavelet.thrH) { - keyFile.set_integer ("Wavelet", "ThresholdResidHighLight", wavelet.thrH); - } - - if (!pedited || pedited->wavelet.reschro) { - keyFile.set_integer ("Wavelet", "Residualchroma", wavelet.reschro); - } - - if (!pedited || pedited->wavelet.tmrs) { - keyFile.set_double ("Wavelet", "ResidualTM", wavelet.tmrs); - } - - if (!pedited || pedited->wavelet.gamma) { - keyFile.set_double ("Wavelet", "Residualgamma", wavelet.gamma); - } - - if (!pedited || pedited->wavelet.sky) { - keyFile.set_double ("Wavelet", "HueRangeResidual", wavelet.sky); - } - - if (!pedited || pedited->wavelet.hueskin2) { - Glib::ArrayHandle thresh (wavelet.hueskin2.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Wavelet", "HueRange", thresh); - } - - if (!pedited || pedited->wavelet.contrast) { - keyFile.set_integer ("Wavelet", "Contrast", wavelet.contrast); - } - - -// save directional pyramid wavelet parameters - if (!pedited || pedited->dirpyrequalizer.enabled) { - keyFile.set_boolean ("Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled); - } - - if (!pedited || pedited->dirpyrequalizer.gamutlab) { - keyFile.set_boolean ("Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab); - } - - if (!pedited || pedited->dirpyrequalizer.cbdlMethod) { - keyFile.set_string ("Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod); - } - - for (int i = 0; i < 6; i++) { - std::stringstream ss; - ss << "Mult" << i; - - if (!pedited || pedited->dirpyrequalizer.mult[i]) { - keyFile.set_double ("Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i]); - } - } - - if (!pedited || pedited->dirpyrequalizer.threshold) { - keyFile.set_double ("Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold); - } - - if (!pedited || pedited->dirpyrequalizer.skinprotect) { - keyFile.set_double ("Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect); - } - -// if (!pedited || pedited->dirpyrequalizer.algo) keyFile.set_string ("Directional Pyramid Equalizer", "Algorithm", dirpyrequalizer.algo); - if (!pedited || pedited->dirpyrequalizer.hueskin) { - Glib::ArrayHandle thresh (dirpyrequalizer.hueskin.value, 4, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("Directional Pyramid Equalizer", "Hueskin", thresh); - } - -// save hsv wavelet parameters - if (!pedited || pedited->hsvequalizer.hcurve) { - Glib::ArrayHandle hcurve = hsvequalizer.hcurve; - keyFile.set_double_list ("HSV Equalizer", "HCurve", hcurve); - } - - if (!pedited || pedited->hsvequalizer.scurve) { - Glib::ArrayHandle scurve = hsvequalizer.scurve; - keyFile.set_double_list ("HSV Equalizer", "SCurve", scurve); - } - - if (!pedited || pedited->hsvequalizer.vcurve) { - Glib::ArrayHandle vcurve = hsvequalizer.vcurve; - keyFile.set_double_list ("HSV Equalizer", "VCurve", vcurve); - } - -//save film simulation parameters - if ( !pedited || pedited->filmSimulation.enabled ) { - keyFile.set_boolean ( "Film Simulation", "Enabled", filmSimulation.enabled ); - } - - if ( !pedited || pedited->filmSimulation.clutFilename ) { - keyFile.set_string ( "Film Simulation", "ClutFilename", filmSimulation.clutFilename ); - } - - if ( !pedited || pedited->filmSimulation.strength ) { - keyFile.set_integer ( "Film Simulation", "Strength", filmSimulation.strength ); - } - - - if (!pedited || pedited->rgbCurves.lumamode) { - keyFile.set_boolean ("RGB Curves", "LumaMode", rgbCurves.lumamode); - } - - if (!pedited || pedited->rgbCurves.rcurve) { - Glib::ArrayHandle RGBrcurve = rgbCurves.rcurve; - keyFile.set_double_list ("RGB Curves", "rCurve", RGBrcurve); - } - - if (!pedited || pedited->rgbCurves.gcurve) { - Glib::ArrayHandle RGBgcurve = rgbCurves.gcurve; - keyFile.set_double_list ("RGB Curves", "gCurve", RGBgcurve); - } - - if (!pedited || pedited->rgbCurves.bcurve) { - Glib::ArrayHandle RGBbcurve = rgbCurves.bcurve; - keyFile.set_double_list ("RGB Curves", "bCurve", RGBbcurve); - } - -// save Color Toning - if (!pedited || pedited->colorToning.enabled) { - keyFile.set_boolean ("ColorToning", "Enabled", colorToning.enabled); - } - - if (!pedited || pedited->colorToning.method) { - keyFile.set_string ("ColorToning", "Method", colorToning.method); - } - - if (!pedited || pedited->colorToning.lumamode) { - keyFile.set_boolean ("ColorToning", "Lumamode", colorToning.lumamode); - } - - if (!pedited || pedited->colorToning.twocolor) { - keyFile.set_string ("ColorToning", "Twocolor", colorToning.twocolor); - } - - if (!pedited || pedited->colorToning.redlow) { - keyFile.set_double ("ColorToning", "Redlow", colorToning.redlow); - } - - if (!pedited || pedited->colorToning.greenlow) { - keyFile.set_double ("ColorToning", "Greenlow", colorToning.greenlow); - } - - if (!pedited || pedited->colorToning.bluelow) { - keyFile.set_double ("ColorToning", "Bluelow", colorToning.bluelow); - } - - if (!pedited || pedited->colorToning.satlow) { - keyFile.set_double ("ColorToning", "Satlow", colorToning.satlow); - } - - if (!pedited || pedited->colorToning.balance) { - keyFile.set_integer ("ColorToning", "Balance", colorToning.balance); - } - - if (!pedited || pedited->colorToning.sathigh) { - keyFile.set_double ("ColorToning", "Sathigh", colorToning.sathigh); - } - - if (!pedited || pedited->colorToning.redmed) { - keyFile.set_double ("ColorToning", "Redmed", colorToning.redmed); - } - - if (!pedited || pedited->colorToning.greenmed) { - keyFile.set_double ("ColorToning", "Greenmed", colorToning.greenmed); - } - - if (!pedited || pedited->colorToning.bluemed) { - keyFile.set_double ("ColorToning", "Bluemed", colorToning.bluemed); - } - - if (!pedited || pedited->colorToning.redhigh) { - keyFile.set_double ("ColorToning", "Redhigh", colorToning.redhigh); - } - - if (!pedited || pedited->colorToning.greenhigh) { - keyFile.set_double ("ColorToning", "Greenhigh", colorToning.greenhigh); - } - - if (!pedited || pedited->colorToning.bluehigh) { - keyFile.set_double ("ColorToning", "Bluehigh", colorToning.bluehigh); - } - - if (!pedited || pedited->colorToning.autosat) { - keyFile.set_boolean ("ColorToning", "Autosat", colorToning.autosat); - } - - if (!pedited || pedited->colorToning.opacityCurve) { - Glib::ArrayHandle curve = colorToning.opacityCurve; - keyFile.set_double_list ("ColorToning", "OpacityCurve", curve); - } - - if (!pedited || pedited->colorToning.colorCurve) { - Glib::ArrayHandle curve = colorToning.colorCurve; - keyFile.set_double_list ("ColorToning", "ColorCurve", curve); - } - - if (!pedited || pedited->colorToning.satprotectionthreshold) { - keyFile.set_integer ("ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold ); - } - - if (!pedited || pedited->colorToning.saturatedopacity) { - keyFile.set_integer ("ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity ); - } - - if (!pedited || pedited->colorToning.strength) { - keyFile.set_integer ("ColorToning", "Strength", colorToning.strength ); - } - - if (!pedited || pedited->colorToning.hlColSat) { - Glib::ArrayHandle thresh (colorToning.hlColSat.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("ColorToning", "HighlightsColorSaturation", thresh); - } - - if (!pedited || pedited->colorToning.shadowsColSat) { - Glib::ArrayHandle thresh (colorToning.shadowsColSat.value, 2, Glib::OWNERSHIP_NONE); - keyFile.set_integer_list ("ColorToning", "ShadowsColorSaturation", thresh); - } - - if (!pedited || pedited->colorToning.clcurve) { - Glib::ArrayHandle clcurve = colorToning.clcurve; - keyFile.set_double_list ("ColorToning", "ClCurve", clcurve); - } - - if (!pedited || pedited->colorToning.cl2curve) { - Glib::ArrayHandle cl2curve = colorToning.cl2curve; - keyFile.set_double_list ("ColorToning", "Cl2Curve", cl2curve); - } - -// save raw parameters - if (!pedited || pedited->raw.darkFrame) { - keyFile.set_string ("RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame) ); - } - - if (!pedited || pedited->raw.dfAuto) { - keyFile.set_boolean ("RAW", "DarkFrameAuto", raw.df_autoselect ); - } - - if (!pedited || pedited->raw.ff_file) { - keyFile.set_string ("RAW", "FlatFieldFile", relativePathIfInside (fname, fnameAbsolute, raw.ff_file) ); - } - - if (!pedited || pedited->raw.ff_AutoSelect) { - keyFile.set_boolean ("RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect ); - } - - if (!pedited || pedited->raw.ff_BlurRadius) { - keyFile.set_integer ("RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius ); - } - - if (!pedited || pedited->raw.ff_BlurType) { - keyFile.set_string ("RAW", "FlatFieldBlurType", raw.ff_BlurType ); - } - - if (!pedited || pedited->raw.ff_AutoClipControl) { - keyFile.set_boolean ("RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl ); - } - - if (!pedited || pedited->raw.ff_clipControl) { - keyFile.set_boolean ("RAW", "FlatFieldClipControl", raw.ff_clipControl ); - } - - if (!pedited || pedited->raw.caCorrection) { - keyFile.set_boolean ("RAW", "CA", raw.ca_autocorrect ); - } - - if (!pedited || pedited->raw.caRed) { - keyFile.set_double ("RAW", "CARed", raw.cared ); - } - - if (!pedited || pedited->raw.caBlue) { - keyFile.set_double ("RAW", "CABlue", raw.cablue ); - } - - if (!pedited || pedited->raw.hotPixelFilter) { - keyFile.set_boolean ("RAW", "HotPixelFilter", raw.hotPixelFilter ); - } - - if (!pedited || pedited->raw.deadPixelFilter) { - keyFile.set_boolean ("RAW", "DeadPixelFilter", raw.deadPixelFilter ); - } - - if (!pedited || pedited->raw.hotDeadPixelThresh) { - keyFile.set_integer ("RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh ); - } - - if (!pedited || pedited->raw.bayersensor.method) { - keyFile.set_string ("RAW Bayer", "Method", raw.bayersensor.method ); - } - - if (!pedited || pedited->raw.bayersensor.imageNum) { - keyFile.set_integer ("RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1 ); - } - - if (!pedited || pedited->raw.bayersensor.ccSteps) { - keyFile.set_integer ("RAW Bayer", "CcSteps", raw.bayersensor.ccSteps); - } - - if (!pedited || pedited->raw.bayersensor.exBlack0) { - keyFile.set_double ("RAW Bayer", "PreBlack0", raw.bayersensor.black0 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack1) { - keyFile.set_double ("RAW Bayer", "PreBlack1", raw.bayersensor.black1 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack2) { - keyFile.set_double ("RAW Bayer", "PreBlack2", raw.bayersensor.black2 ); - } - - if (!pedited || pedited->raw.bayersensor.exBlack3) { - keyFile.set_double ("RAW Bayer", "PreBlack3", raw.bayersensor.black3 ); - } - - if (!pedited || pedited->raw.bayersensor.exTwoGreen) { - keyFile.set_boolean ("RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen ); - } - - if (!pedited || pedited->raw.bayersensor.linenoise) { - keyFile.set_integer ("RAW Bayer", "LineDenoise", raw.bayersensor.linenoise); - } - - if (!pedited || pedited->raw.bayersensor.greenEq) { - keyFile.set_integer ("RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh); - } - - if (!pedited || pedited->raw.bayersensor.dcbIterations) { - keyFile.set_integer ("RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations ); - } - - if (!pedited || pedited->raw.bayersensor.dcbEnhance) { - keyFile.set_boolean ("RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance ); - } - - if (!pedited || pedited->raw.bayersensor.lmmseIterations) { - keyFile.set_integer ("RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftMotion) { - keyFile.set_integer ("RAW Bayer", "PixelShiftMotion", raw.bayersensor.pixelShiftMotion ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrection) { - keyFile.set_integer ("RAW Bayer", "PixelShiftMotionCorrection", raw.bayersensor.pixelShiftMotionCorrection ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod) { - keyFile.set_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod", raw.bayersensor.pixelShiftMotionCorrectionMethod ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorGreen) { - keyFile.set_double ("RAW Bayer", "pixelShiftStddevFactorGreen", raw.bayersensor.pixelShiftStddevFactorGreen ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorRed) { - keyFile.set_double ("RAW Bayer", "pixelShiftStddevFactorRed", raw.bayersensor.pixelShiftStddevFactorRed ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorBlue) { - keyFile.set_double ("RAW Bayer", "pixelShiftStddevFactorBlue", raw.bayersensor.pixelShiftStddevFactorBlue ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftEperIso) { - keyFile.set_double ("RAW Bayer", "PixelShiftEperIso", raw.bayersensor.pixelShiftEperIso ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNreadIso) { - keyFile.set_double ("RAW Bayer", "PixelShiftNreadIso", raw.bayersensor.pixelShiftNreadIso ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftPrnu) { - keyFile.set_double ("RAW Bayer", "PixelShiftPrnu", raw.bayersensor.pixelShiftPrnu ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftSigma) { - keyFile.set_double ("RAW Bayer", "PixelShiftSigma", raw.bayersensor.pixelShiftSigma ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftSum) { - keyFile.set_double ("RAW Bayer", "PixelShiftSum", raw.bayersensor.pixelShiftSum ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftRedBlueWeight) { - keyFile.set_double ("RAW Bayer", "PixelShiftRedBlueWeight", raw.bayersensor.pixelShiftRedBlueWeight ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftShowMotion) { - keyFile.set_boolean ("RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelShiftShowMotion ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly) { - keyFile.set_boolean ("RAW Bayer", "PixelShiftShowMotionMaskOnly", raw.bayersensor.pixelShiftShowMotionMaskOnly ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftAutomatic) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenHorizontal) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenVertical) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftHoleFill) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftMedian) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftMedian3) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftMedian3", raw.bayersensor.pixelShiftMedian3 ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftGreen) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftGreen", raw.bayersensor.pixelShiftGreen ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftBlur) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftBlur", raw.bayersensor.pixelShiftBlur ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftSmooth) { - keyFile.set_double ("RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftExp0) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0 ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftLmmse) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftEqualBright) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross2) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross2", raw.bayersensor.pixelShiftNonGreenCross2 ); - } - - if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenAmaze) { - keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenAmaze", raw.bayersensor.pixelShiftNonGreenAmaze ); - } - - if (!pedited || pedited->raw.xtranssensor.method) { - keyFile.set_string ("RAW X-Trans", "Method", raw.xtranssensor.method ); - } - - if (!pedited || pedited->raw.xtranssensor.ccSteps) { - keyFile.set_integer ("RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackRed) { - keyFile.set_double ("RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred ); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackGreen) { - keyFile.set_double ("RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen ); - } - - if (!pedited || pedited->raw.xtranssensor.exBlackBlue) { - keyFile.set_double ("RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue ); - } - - -// save raw exposition - if (!pedited || pedited->raw.exPos) { - keyFile.set_double ("RAW", "PreExposure", raw.expos ); - } - - if (!pedited || pedited->raw.exPreser) { - keyFile.set_double ("RAW", "PrePreserv", raw.preser ); - } - -// save exif change list - if (!pedited || pedited->exif) { - for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); ++i) { - keyFile.set_string ("Exif", i->first, i->second); - } - } - -// save iptc change list - if (!pedited || pedited->iptc) { - for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); ++i) { - Glib::ArrayHandle values = i->second; - keyFile.set_string_list ("IPTC", i->first, values); - } - } - - sPParams = keyFile.to_data(); - - } catch (Glib::KeyFileError&) {} - - if (sPParams.empty ()) { - return 1; - } - - int error1, error2; - error1 = write (fname, sPParams); - - if (!fname2.empty ()) { - - error2 = write (fname2, sPParams); - // If at least one file has been saved, it's a success - return error1 & error2; - } else { - return error1; - } -} - -int ProcParams::write (const Glib::ustring &fname, const Glib::ustring &content) const -{ - - int error = 0; - - if (fname.length()) { - FILE *f; - f = g_fopen (fname.c_str (), "wt"); - - if (f == nullptr) { - error = 1; - } else { - fprintf (f, "%s", content.c_str()); - fclose (f); - } - } - - return error; -} - -int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) -{ - setlocale (LC_NUMERIC, "C"); // to set decimal point to "." - - if (fname.empty()) { - return 1; - } - - Glib::KeyFile keyFile; - - try { - - if (pedited) { - pedited->set (false); - } - - FILE* f = g_fopen (fname.c_str (), "rt"); - - if (!f) { - return 1; - } - - char* buffer = new char[1024]; - std::ostringstream ostr; - - while (fgets (buffer, 1024, f)) { - ostr << buffer << "\n"; - } - - delete [] buffer; - - if (!keyFile.load_from_data (ostr.str())) { - return 1; - } - - fclose (f); - - // load tonecurve: - - ppVersion = PPVERSION; - appVersion = APPVERSION; - - if (keyFile.has_group ("Version")) { - if (keyFile.has_key ("Version", "AppVersion")) { - appVersion = keyFile.get_string ("Version", "AppVersion"); - } - - if (keyFile.has_key ("Version", "Version")) { - ppVersion = keyFile.get_integer ("Version", "Version"); - } - } - - if (keyFile.has_group ("General")) { - if (keyFile.has_key ("General", "Rank")) { - rank = keyFile.get_integer ("General", "Rank"); - - if (pedited) { - pedited->general.rank = true; - } - } - - if (keyFile.has_key ("General", "ColorLabel")) { - colorlabel = keyFile.get_integer ("General", "ColorLabel"); - - if (pedited) { - pedited->general.colorlabel = true; - } - } - - if (keyFile.has_key ("General", "InTrash")) { - inTrash = keyFile.get_boolean ("General", "InTrash"); - - if (pedited) { - pedited->general.intrash = true; - } - } - } - - if (keyFile.has_group ("Exposure")) { - if (ppVersion < PPVERSION_AEXP) { - toneCurve.autoexp = false; // prevent execution of autoexp when opening file created with earlier verions of autoexp algorithm - } else if (keyFile.has_key ("Exposure", "Auto")) { - toneCurve.autoexp = keyFile.get_boolean ("Exposure", "Auto"); - - if (pedited) { - pedited->toneCurve.autoexp = true; - } - } - - if (keyFile.has_key ("Exposure", "Clip")) { - toneCurve.clip = keyFile.get_double ("Exposure", "Clip"); - - if (pedited) { - pedited->toneCurve.clip = true; - } - } - - if (keyFile.has_key ("Exposure", "Compensation")) { - toneCurve.expcomp = keyFile.get_double ("Exposure", "Compensation"); - - if (pedited) { - pedited->toneCurve.expcomp = true; - } - } - - if (keyFile.has_key ("Exposure", "Brightness")) { - toneCurve.brightness = keyFile.get_integer ("Exposure", "Brightness"); - - if (pedited) { - pedited->toneCurve.brightness = true; - } - } - - if (keyFile.has_key ("Exposure", "Contrast")) { - toneCurve.contrast = keyFile.get_integer ("Exposure", "Contrast"); - - if (pedited) { - pedited->toneCurve.contrast = true; - } - } - - if (keyFile.has_key ("Exposure", "Saturation")) { - toneCurve.saturation = keyFile.get_integer ("Exposure", "Saturation"); - - if (pedited) { - pedited->toneCurve.saturation = true; - } - } - - if (keyFile.has_key ("Exposure", "Black")) { - toneCurve.black = keyFile.get_integer ("Exposure", "Black"); - - if (pedited) { - pedited->toneCurve.black = true; - } - } - - if (keyFile.has_key ("Exposure", "HighlightCompr")) { - toneCurve.hlcompr = keyFile.get_integer ("Exposure", "HighlightCompr"); - - if (pedited) { - pedited->toneCurve.hlcompr = true; - } - } - - if (keyFile.has_key ("Exposure", "HighlightComprThreshold")) { - toneCurve.hlcomprthresh = keyFile.get_integer ("Exposure", "HighlightComprThreshold"); - - if (pedited) { - pedited->toneCurve.hlcomprthresh = true; - } - } - - if (keyFile.has_key ("Exposure", "ShadowCompr")) { - toneCurve.shcompr = keyFile.get_integer ("Exposure", "ShadowCompr"); - - if (pedited) { - pedited->toneCurve.shcompr = true; - } - } - -// load highlight recovery settings - if (toneCurve.shcompr > 100) { - toneCurve.shcompr = 100; // older pp3 files can have values above 100. - } - - if (keyFile.has_key ("Exposure", "CurveMode")) { - Glib::ustring sMode = keyFile.get_string ("Exposure", "CurveMode"); - - if (sMode == "Standard") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_STD; - } else if (sMode == "FilmLike") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_FILMLIKE; - } else if (sMode == "SatAndValueBlending") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_SATANDVALBLENDING; - } else if (sMode == "WeightedStd") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_WEIGHTEDSTD; - } else if (sMode == "Luminance") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_LUMINANCE; - } else if (sMode == "Perceptual") { - toneCurve.curveMode = ToneCurveParams::TC_MODE_PERCEPTUAL; - } - - if (pedited) { - pedited->toneCurve.curveMode = true; - } - } - - if (keyFile.has_key ("Exposure", "CurveMode2")) { - Glib::ustring sMode = keyFile.get_string ("Exposure", "CurveMode2"); - - if (sMode == "Standard") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_STD; - } else if (sMode == "FilmLike") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_FILMLIKE; - } else if (sMode == "SatAndValueBlending") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_SATANDVALBLENDING; - } else if (sMode == "WeightedStd") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_WEIGHTEDSTD; - } else if (sMode == "Luminance") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_LUMINANCE; - } else if (sMode == "Perceptual") { - toneCurve.curveMode2 = ToneCurveParams::TC_MODE_PERCEPTUAL; - } - - if (pedited) { - pedited->toneCurve.curveMode2 = true; - } - } - - if (ppVersion > 200) { - if (keyFile.has_key ("Exposure", "Curve")) { - toneCurve.curve = keyFile.get_double_list ("Exposure", "Curve"); - avoidEmptyCurve (toneCurve.curve); - - if (pedited) { - pedited->toneCurve.curve = true; - } - } - - if (keyFile.has_key ("Exposure", "Curve2")) { - toneCurve.curve2 = keyFile.get_double_list ("Exposure", "Curve2"); - avoidEmptyCurve (toneCurve.curve2); - - if (pedited) { - pedited->toneCurve.curve2 = true; - } - } - } - } - - if (keyFile.has_group ("HLRecovery")) { - if (keyFile.has_key ("HLRecovery", "Enabled")) { - toneCurve.hrenabled = keyFile.get_boolean ("HLRecovery", "Enabled"); - - if (pedited) { - pedited->toneCurve.hrenabled = true; - } - } - - if (keyFile.has_key ("HLRecovery", "Method")) { - toneCurve.method = keyFile.get_string ("HLRecovery", "Method"); - - if (pedited) { - pedited->toneCurve.method = true; - } - } - } - - // load channel mixer curve - if (keyFile.has_group ("Channel Mixer")) { - if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { - const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); - const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); - const std::vector bmix = keyFile.get_integer_list ("Channel Mixer", "Blue"); - - if (rmix.size() == 3 && gmix.size() == 3 && bmix.size() == 3) { - memcpy (chmixer.red, rmix.data(), 3 * sizeof (int)); - memcpy (chmixer.green, gmix.data(), 3 * sizeof (int)); - memcpy (chmixer.blue, bmix.data(), 3 * sizeof (int)); - } - - if (pedited) { - pedited->chmixer.red[0] = pedited->chmixer.red[1] = pedited->chmixer.red[2] = true; - pedited->chmixer.green[0] = pedited->chmixer.green[1] = pedited->chmixer.green[2] = true; - pedited->chmixer.blue[0] = pedited->chmixer.blue[1] = pedited->chmixer.blue[2] = true; - } - } - } - -// load black & white - if (keyFile.has_group ("Black & White")) { - if (keyFile.has_key ("Black & White", "Enabled")) { - blackwhite.enabled = keyFile.get_boolean ("Black & White", "Enabled"); - - if (pedited) { - pedited->blackwhite.enabled = true; - } - } - - if (keyFile.has_key ("Black & White", "Method")) { - blackwhite.method = keyFile.get_string ("Black & White", "Method"); - - if (pedited) { - pedited->blackwhite.method = true; - } - } - - if (keyFile.has_key ("Black & White", "Auto")) { - blackwhite.autoc = keyFile.get_boolean ("Black & White", "Auto"); - - if (pedited) { - pedited->blackwhite.autoc = true; - } - } - - if (keyFile.has_key ("Black & White", "ComplementaryColors")) { - blackwhite.enabledcc = keyFile.get_boolean ("Black & White", "ComplementaryColors"); - - if (pedited) { - pedited->blackwhite.enabledcc = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerRed")) { - blackwhite.mixerRed = keyFile.get_integer ("Black & White", "MixerRed"); - - if (pedited) { - pedited->blackwhite.mixerRed = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerOrange")) { - blackwhite.mixerOrange = keyFile.get_integer ("Black & White", "MixerOrange"); - - if (pedited) { - pedited->blackwhite.mixerOrange = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerYellow")) { - blackwhite.mixerYellow = keyFile.get_integer ("Black & White", "MixerYellow"); - - if (pedited) { - pedited->blackwhite.mixerYellow = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerGreen")) { - blackwhite.mixerGreen = keyFile.get_integer ("Black & White", "MixerGreen"); - - if (pedited) { - pedited->blackwhite.mixerGreen = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerCyan")) { - blackwhite.mixerCyan = keyFile.get_integer ("Black & White", "MixerCyan"); - - if (pedited) { - pedited->blackwhite.mixerCyan = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerBlue")) { - blackwhite.mixerBlue = keyFile.get_integer ("Black & White", "MixerBlue"); - - if (pedited) { - pedited->blackwhite.mixerBlue = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerMagenta")) { - blackwhite.mixerMagenta = keyFile.get_integer ("Black & White", "MixerMagenta"); - - if (pedited) { - pedited->blackwhite.mixerMagenta = true; - } - } - - if (keyFile.has_key ("Black & White", "MixerPurple")) { - blackwhite.mixerPurple = keyFile.get_integer ("Black & White", "MixerPurple"); - - if (pedited) { - pedited->blackwhite.mixerPurple = true; - } - } - - if (keyFile.has_key ("Black & White", "GammaRed")) { - blackwhite.gammaRed = keyFile.get_integer ("Black & White", "GammaRed"); - - if (pedited) { - pedited->blackwhite.gammaRed = true; - } - } - - if (keyFile.has_key ("Black & White", "GammaGreen")) { - blackwhite.gammaGreen = keyFile.get_integer ("Black & White", "GammaGreen"); - - if (pedited) { - pedited->blackwhite.gammaGreen = true; - } - } - - if (keyFile.has_key ("Black & White", "GammaBlue")) { - blackwhite.gammaBlue = keyFile.get_integer ("Black & White", "GammaBlue"); - - if (pedited) { - pedited->blackwhite.gammaBlue = true; - } - } - - if (keyFile.has_key ("Black & White", "Filter")) { - blackwhite.filter = keyFile.get_string ("Black & White", "Filter"); - - if (pedited) { - pedited->blackwhite.filter = true; - } - } - - if (keyFile.has_key ("Black & White", "Setting")) { - blackwhite.setting = keyFile.get_string ("Black & White", "Setting"); - - if (pedited) { - pedited->blackwhite.setting = true; - } - } - - if (keyFile.has_key ("Black & White", "LuminanceCurve")) { - blackwhite.luminanceCurve = keyFile.get_double_list ("Black & White", "LuminanceCurve"); - avoidEmptyCurve (blackwhite.luminanceCurve); - - if (pedited) { - pedited->blackwhite.luminanceCurve = true; - } - } - - if (keyFile.has_key ("Black & White", "BeforeCurve")) { - blackwhite.beforeCurve = keyFile.get_double_list ("Black & White", "BeforeCurve"); - avoidEmptyCurve (blackwhite.beforeCurve); - - if (pedited) { - pedited->blackwhite.beforeCurve = true; - } - } - - if (keyFile.has_key ("Black & White", "Algorithm")) { - blackwhite.algo = keyFile.get_string ("Black & White", "Algorithm"); - - if (pedited) { - pedited->blackwhite.algo = true; - } - } - - if (keyFile.has_key ("Black & White", "BeforeCurveMode")) { - Glib::ustring sMode = keyFile.get_string ("Black & White", "BeforeCurveMode"); - - if (sMode == "Standard") { - blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_STD_BW; - } else if (sMode == "FilmLike") { - blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_FILMLIKE_BW; - } else if (sMode == "SatAndValueBlending") { - blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW; - } else if (sMode == "WeightedStd") { - blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW; - } - - if (pedited) { - pedited->blackwhite.beforeCurveMode = true; - } - } - - if (keyFile.has_key ("Black & White", "AfterCurve")) { - blackwhite.afterCurve = keyFile.get_double_list ("Black & White", "AfterCurve"); - avoidEmptyCurve (blackwhite.afterCurve); - - if (pedited) { - pedited->blackwhite.afterCurve = true; - } - } - - if (keyFile.has_key ("Black & White", "AfterCurveMode")) { - Glib::ustring sMode2 = keyFile.get_string ("Black & White", "AfterCurveMode"); - - if (sMode2 == "Standard") { - blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_STD_BW; - } else if (sMode2 == "WeightedStd") { - blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW; - } - - if (pedited) { - pedited->blackwhite.afterCurveMode = true; - } - } - } - -//load retinex - if (keyFile.has_group ("Retinex")) { - - if (keyFile.has_key ("Retinex", "Median")) { - retinex.medianmap = keyFile.get_boolean ("Retinex", "Median"); - - if (pedited) { - pedited->retinex.medianmap = true; - } - } - - if (keyFile.has_key ("Retinex", "RetinexMethod")) { - retinex.retinexMethod = keyFile.get_string ("Retinex", "RetinexMethod"); - - if (pedited) { - pedited->retinex.retinexMethod = true; - } - } - - if (keyFile.has_key ("Retinex", "mapMethod")) { - retinex.mapMethod = keyFile.get_string ("Retinex", "mapMethod"); - - if (pedited) { - pedited->retinex.mapMethod = true; - } - } - - if (keyFile.has_key ("Retinex", "viewMethod")) { - retinex.viewMethod = keyFile.get_string ("Retinex", "viewMethod"); - - if (pedited) { - pedited->retinex.viewMethod = true; - } - } - - - if (keyFile.has_key ("Retinex", "Retinexcolorspace")) { - retinex.retinexcolorspace = keyFile.get_string ("Retinex", "Retinexcolorspace"); - - if (pedited) { - pedited->retinex.retinexcolorspace = true; - } - } - - if (keyFile.has_key ("Retinex", "Gammaretinex")) { - retinex.gammaretinex = keyFile.get_string ("Retinex", "Gammaretinex"); - - if (pedited) { - pedited->retinex.gammaretinex = true; - } - } - - if (keyFile.has_key ("Retinex", "Enabled")) { - retinex.enabled = keyFile.get_boolean ("Retinex", "Enabled"); - - if (pedited) { - pedited->retinex.enabled = true; - } - } - - if (keyFile.has_key ("Retinex", "Neigh")) { - retinex.neigh = keyFile.get_integer ("Retinex", "Neigh"); - - if (pedited) { - pedited->retinex.neigh = true; - } - } - - if (keyFile.has_key ("Retinex", "Str")) { - retinex.str = keyFile.get_integer ("Retinex", "Str"); - - if (pedited) { - pedited->retinex.str = true; - } - } - - if (keyFile.has_key ("Retinex", "Scal")) { - retinex.scal = keyFile.get_integer ("Retinex", "Scal"); - - if (pedited) { - pedited->retinex.scal = true; - } - } - - if (keyFile.has_key ("Retinex", "Iter")) { - retinex.iter = keyFile.get_integer ("Retinex", "Iter"); - - if (pedited) { - pedited->retinex.iter = true; - } - } - - if (keyFile.has_key ("Retinex", "Grad")) { - retinex.grad = keyFile.get_integer ("Retinex", "Grad"); - - if (pedited) { - pedited->retinex.grad = true; - } - } - - if (keyFile.has_key ("Retinex", "Grads")) { - retinex.grads = keyFile.get_integer ("Retinex", "Grads"); - - if (pedited) { - pedited->retinex.grads = true; - } - } - - if (keyFile.has_key ("Retinex", "Gam")) { - retinex.gam = keyFile.get_double ("Retinex", "Gam"); - - if (pedited) { - pedited->retinex.gam = true; - } - } - - if (keyFile.has_key ("Retinex", "Slope")) { - retinex.slope = keyFile.get_double ("Retinex", "Slope"); - - if (pedited) { - pedited->retinex.slope = true; - } - } - - if (keyFile.has_key ("Retinex", "Offs")) { - retinex.offs = keyFile.get_integer ("Retinex", "Offs"); - - if (pedited) { - pedited->retinex.offs = true; - } - } - - if (keyFile.has_key ("Retinex", "Vart")) { - retinex.vart = keyFile.get_integer ("Retinex", "Vart"); - - if (pedited) { - pedited->retinex.vart = true; - } - } - - if (keyFile.has_key ("Retinex", "Limd")) { - retinex.limd = keyFile.get_integer ("Retinex", "Limd"); - - if (pedited) { - pedited->retinex.limd = true; - } - } - - if (keyFile.has_key ("Retinex", "highl")) { - retinex.highl = keyFile.get_integer ("Retinex", "highl"); - - if (pedited) { - pedited->retinex.highl = true; - } - } - - if (keyFile.has_key ("Retinex", "skal")) { - retinex.skal = keyFile.get_integer ("Retinex", "skal"); - - if (pedited) { - pedited->retinex.skal = true; - } - } - - if (keyFile.has_key ("Retinex", "CDCurve")) { - retinex.cdcurve = keyFile.get_double_list ("Retinex", "CDCurve"); - avoidEmptyCurve (retinex.cdcurve); - - if (pedited) { - pedited->retinex.cdcurve = true; - } - } - - if (keyFile.has_key ("Retinex", "MAPCurve")) { - retinex.mapcurve = keyFile.get_double_list ("Retinex", "MAPCurve"); - avoidEmptyCurve (retinex.mapcurve); - - if (pedited) { - pedited->retinex.mapcurve = true; - } - } - - if (keyFile.has_key ("Retinex", "CDHCurve")) { - retinex.cdHcurve = keyFile.get_double_list ("Retinex", "CDHCurve"); - avoidEmptyCurve (retinex.cdHcurve); - - if (pedited) { - pedited->retinex.cdHcurve = true; - } - } - - if (keyFile.has_key ("Retinex", "LHCurve")) { - retinex.lhcurve = keyFile.get_double_list ("Retinex", "LHCurve"); - avoidEmptyCurve (retinex.lhcurve); - - if (pedited) { - pedited->retinex.lhcurve = true; - } - } - - if (keyFile.has_key ("Retinex", "Highlights")) { - retinex.highlights = keyFile.get_integer ("Retinex", "Highlights"); - - if (pedited) { - pedited->retinex.highlights = true; - } - } - - if (keyFile.has_key ("Retinex", "HighlightTonalWidth")) { - retinex.htonalwidth = keyFile.get_integer ("Retinex", "HighlightTonalWidth"); - - if (pedited) { - pedited->retinex.htonalwidth = true; - } - } - - if (keyFile.has_key ("Retinex", "Shadows")) { - retinex.shadows = keyFile.get_integer ("Retinex", "Shadows"); - - if (pedited) { - pedited->retinex.shadows = true; - } - } - - if (keyFile.has_key ("Retinex", "ShadowTonalWidth")) { - retinex.stonalwidth = keyFile.get_integer ("Retinex", "ShadowTonalWidth"); - - if (pedited) { - pedited->retinex.stonalwidth = true; - } - } - - - if (keyFile.has_key ("Retinex", "Radius")) { - retinex.radius = keyFile.get_integer ("Retinex", "Radius"); - - if (pedited) { - pedited->retinex.radius = true; - } - } - - - if (keyFile.has_key ("Retinex", "TransmissionCurve")) { - retinex.transmissionCurve = keyFile.get_double_list ("Retinex", "TransmissionCurve"); - avoidEmptyCurve (retinex.transmissionCurve); - - if (pedited) { - pedited->retinex.transmissionCurve = true; - } - } - - - if (keyFile.has_key ("Retinex", "GainTransmissionCurve")) { - retinex.gaintransmissionCurve = keyFile.get_double_list ("Retinex", "GainTransmissionCurve"); - avoidEmptyCurve (retinex.gaintransmissionCurve); - - if (pedited) { - pedited->retinex.gaintransmissionCurve = true; - } - } - - } - - -// load luma curve - if (keyFile.has_group ("Luminance Curve")) { - if (keyFile.has_key ("Luminance Curve", "Brightness")) { - labCurve.brightness = keyFile.get_integer ("Luminance Curve", "Brightness"); - - if (pedited) { - pedited->labCurve.brightness = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "Contrast")) { - labCurve.contrast = keyFile.get_integer ("Luminance Curve", "Contrast"); - - if (pedited) { - pedited->labCurve.contrast = true; - } - } - - if (ppVersion < 303) { -// transform Saturation into Chromaticity -// if Saturation == 0, should we set BWToning on? - if (keyFile.has_key ("Luminance Curve", "Saturation")) { - labCurve.chromaticity = keyFile.get_integer ("Luminance Curve", "Saturation"); - - if (pedited) { - pedited->labCurve.chromaticity = true; - } - } - -// transform AvoidColorClipping into AvoidColorShift - if (keyFile.has_key ("Luminance Curve", "AvoidColorClipping")) { - labCurve.avoidcolorshift = keyFile.get_boolean ("Luminance Curve", "AvoidColorClipping"); - - if (pedited) { - pedited->labCurve.avoidcolorshift = true; - } - } - } else { - if (keyFile.has_key ("Luminance Curve", "Chromaticity")) { - labCurve.chromaticity = keyFile.get_integer ("Luminance Curve", "Chromaticity"); - - if (ppVersion >= 303 && ppVersion < 314 && labCurve.chromaticity == -100) { - blackwhite.enabled = true; - } - - if (pedited) { - pedited->labCurve.chromaticity = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "AvoidColorShift")) { - labCurve.avoidcolorshift = keyFile.get_boolean ("Luminance Curve", "AvoidColorShift"); - - if (pedited) { - pedited->labCurve.avoidcolorshift = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "RedAndSkinTonesProtection")) { - labCurve.rstprotection = keyFile.get_double ("Luminance Curve", "RedAndSkinTonesProtection"); - - if (pedited) { - pedited->labCurve.rstprotection = true; - } - } - } - - if (keyFile.has_key ("Luminance Curve", "LCredsk")) { - labCurve.lcredsk = keyFile.get_boolean ("Luminance Curve", "LCredsk"); - - if (pedited) { - pedited->labCurve.lcredsk = true; - } - } - - if (ppVersion < 314) - -// Backward compatibility: If BWtoning is true, Chromaticity has to be set to -100, which will produce the same effect -// and will enable the b&w toning mode ('a' & 'b' curves) - if (keyFile.has_key ("Luminance Curve", "BWtoning")) { - if ( keyFile.get_boolean ("Luminance Curve", "BWtoning")) { - labCurve.chromaticity = -100; - - if (pedited) { - pedited->labCurve.chromaticity = true; - } - } - } - - if (keyFile.has_key ("Luminance Curve", "LCurve")) { - labCurve.lcurve = keyFile.get_double_list ("Luminance Curve", "LCurve"); - avoidEmptyCurve (labCurve.lcurve); - - if (pedited) { - pedited->labCurve.lcurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "aCurve")) { - labCurve.acurve = keyFile.get_double_list ("Luminance Curve", "aCurve"); - avoidEmptyCurve (labCurve.acurve); - - if (pedited) { - pedited->labCurve.acurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "bCurve")) { - labCurve.bcurve = keyFile.get_double_list ("Luminance Curve", "bCurve"); - avoidEmptyCurve (labCurve.bcurve); - - if (pedited) { - pedited->labCurve.bcurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "ccCurve")) { - labCurve.cccurve = keyFile.get_double_list ("Luminance Curve", "ccCurve"); - avoidEmptyCurve (labCurve.cccurve); - - if (pedited) { - pedited->labCurve.cccurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "chCurve")) { - labCurve.chcurve = keyFile.get_double_list ("Luminance Curve", "chCurve"); - avoidEmptyCurve (labCurve.chcurve); - - if (pedited) { - pedited->labCurve.chcurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "lhCurve")) { - labCurve.lhcurve = keyFile.get_double_list ("Luminance Curve", "lhCurve"); - avoidEmptyCurve (labCurve.lhcurve); - - if (pedited) { - pedited->labCurve.lhcurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "hhCurve")) { - labCurve.hhcurve = keyFile.get_double_list ("Luminance Curve", "hhCurve"); - avoidEmptyCurve (labCurve.hhcurve); - - if (pedited) { - pedited->labCurve.hhcurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "LcCurve")) { - labCurve.lccurve = keyFile.get_double_list ("Luminance Curve", "LcCurve"); - avoidEmptyCurve (labCurve.lccurve); - - if (pedited) { - pedited->labCurve.lccurve = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "ClCurve")) { - labCurve.clcurve = keyFile.get_double_list ("Luminance Curve", "ClCurve"); - avoidEmptyCurve (labCurve.clcurve); - - if (pedited) { - pedited->labCurve.clcurve = true; - } - } - - } - -// load sharpening - if (keyFile.has_group ("Sharpening")) { - if (keyFile.has_key ("Sharpening", "Enabled")) { - sharpening.enabled = keyFile.get_boolean ("Sharpening", "Enabled"); - - if (pedited) { - pedited->sharpening.enabled = true; - } - } - - if (keyFile.has_key ("Sharpening", "Radius")) { - sharpening.radius = keyFile.get_double ("Sharpening", "Radius"); - - if (pedited) { - pedited->sharpening.radius = true; - } - } - - if (keyFile.has_key ("Sharpening", "Amount")) { - sharpening.amount = keyFile.get_integer ("Sharpening", "Amount"); - - if (pedited) { - pedited->sharpening.amount = true; - } - } - - if (keyFile.has_key ("Sharpening", "Threshold")) { - if (ppVersion < 302) { - int thresh = min (keyFile.get_integer ("Sharpening", "Threshold"), 2000); - sharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization - } else { - const std::vector thresh = keyFile.get_integer_list ("Sharpening", "Threshold"); - - if (thresh.size() >= 4) { - sharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); - } - } - - if (pedited) { - pedited->sharpening.threshold = true; - } - } - - if (keyFile.has_key ("Sharpening", "OnlyEdges")) { - sharpening.edgesonly = keyFile.get_boolean ("Sharpening", "OnlyEdges"); - - if (pedited) { - pedited->sharpening.edgesonly = true; - } - } - - if (keyFile.has_key ("Sharpening", "EdgedetectionRadius")) { - sharpening.edges_radius = keyFile.get_double ("Sharpening", "EdgedetectionRadius"); - - if (pedited) { - pedited->sharpening.edges_radius = true; - } - } - - if (keyFile.has_key ("Sharpening", "EdgeTolerance")) { - sharpening.edges_tolerance = keyFile.get_integer ("Sharpening", "EdgeTolerance"); - - if (pedited) { - pedited->sharpening.edges_tolerance = true; - } - } - - if (keyFile.has_key ("Sharpening", "HalocontrolEnabled")) { - sharpening.halocontrol = keyFile.get_boolean ("Sharpening", "HalocontrolEnabled"); - - if (pedited) { - pedited->sharpening.halocontrol = true; - } - } - - if (keyFile.has_key ("Sharpening", "HalocontrolAmount")) { - sharpening.halocontrol_amount = keyFile.get_integer ("Sharpening", "HalocontrolAmount"); - - if (pedited) { - pedited->sharpening.halocontrol_amount = true; - } - } - - if (keyFile.has_key ("Sharpening", "Method")) { - sharpening.method = keyFile.get_string ("Sharpening", "Method"); - - if (pedited) { - pedited->sharpening.method = true; - } - } - - if (keyFile.has_key ("Sharpening", "DeconvRadius")) { - sharpening.deconvradius = keyFile.get_double ("Sharpening", "DeconvRadius"); - - if (pedited) { - pedited->sharpening.deconvradius = true; - } - } - - if (keyFile.has_key ("Sharpening", "DeconvAmount")) { - sharpening.deconvamount = keyFile.get_integer ("Sharpening", "DeconvAmount"); - - if (pedited) { - pedited->sharpening.deconvamount = true; - } - } - - if (keyFile.has_key ("Sharpening", "DeconvDamping")) { - sharpening.deconvdamping = keyFile.get_integer ("Sharpening", "DeconvDamping"); - - if (pedited) { - pedited->sharpening.deconvdamping = true; - } - } - - if (keyFile.has_key ("Sharpening", "DeconvIterations")) { - sharpening.deconviter = keyFile.get_integer ("Sharpening", "DeconvIterations"); - - if (pedited) { - pedited->sharpening.deconviter = true; - } - } - } - -// load edge sharpening - if (keyFile.has_group ("SharpenEdge")) { - if (keyFile.has_key ("SharpenEdge", "Enabled")) { - sharpenEdge.enabled = keyFile.get_boolean ("SharpenEdge", "Enabled"); - - if (pedited) { - pedited->sharpenEdge.enabled = true; - } - } - - if (keyFile.has_key ("SharpenEdge", "Passes")) { - sharpenEdge.passes = keyFile.get_integer ("SharpenEdge", "Passes"); - - if (pedited) { - pedited->sharpenEdge.passes = true; - } - } - - if (keyFile.has_key ("SharpenEdge", "Strength")) { - sharpenEdge.amount = keyFile.get_double ("SharpenEdge", "Strength"); - - if (pedited) { - pedited->sharpenEdge.amount = true; - } - } - - if (keyFile.has_key ("SharpenEdge", "ThreeChannels")) { - sharpenEdge.threechannels = keyFile.get_boolean ("SharpenEdge", "ThreeChannels"); - - if (pedited) { - pedited->sharpenEdge.threechannels = true; - } - } - } - -// load micro-contrast sharpening - if (keyFile.has_group ("SharpenMicro")) { - if (keyFile.has_key ("SharpenMicro", "Enabled")) { - sharpenMicro.enabled = keyFile.get_boolean ("SharpenMicro", "Enabled"); - - if (pedited) { - pedited->sharpenMicro.enabled = true; - } - } - - if (keyFile.has_key ("SharpenMicro", "Matrix")) { - sharpenMicro.matrix = keyFile.get_boolean ("SharpenMicro", "Matrix"); - - if (pedited) { - pedited->sharpenMicro.matrix = true; - } - } - - if (keyFile.has_key ("SharpenMicro", "Strength")) { - sharpenMicro.amount = keyFile.get_double ("SharpenMicro", "Strength"); - - if (pedited) { - pedited->sharpenMicro.amount = true; - } - } - - if (keyFile.has_key ("SharpenMicro", "Uniformity")) { - sharpenMicro.uniformity = keyFile.get_double ("SharpenMicro", "Uniformity"); - - if (pedited) { - pedited->sharpenMicro.uniformity = true; - } - } - } - -// load vibrance - if (keyFile.has_group ("Vibrance")) { - if (keyFile.has_key ("Vibrance", "Enabled")) { - vibrance.enabled = keyFile.get_boolean ("Vibrance", "Enabled"); - - if (pedited) { - pedited->vibrance.enabled = true; - } - } - - if (keyFile.has_key ("Vibrance", "Pastels")) { - vibrance.pastels = keyFile.get_integer ("Vibrance", "Pastels"); - - if (pedited) { - pedited->vibrance.pastels = true; - } - } - - if (keyFile.has_key ("Vibrance", "Saturated")) { - vibrance.saturated = keyFile.get_integer ("Vibrance", "Saturated"); - - if (pedited) { - pedited->vibrance.saturated = true; - } - } - - if (keyFile.has_key ("Vibrance", "PSThreshold")) { - if (ppVersion < 302) { - int thresh = keyFile.get_integer ("Vibrance", "PSThreshold"); - vibrance.psthreshold.setValues (thresh, thresh); - } else { - const std::vector thresh = keyFile.get_integer_list ("Vibrance", "PSThreshold"); - - if (thresh.size() >= 2 ) { - vibrance.psthreshold.setValues (thresh[0], thresh[1]); - } - } - - if (pedited) { - pedited->vibrance.psthreshold = true; - } - } - - if (keyFile.has_key ("Vibrance", "ProtectSkins")) { - vibrance.protectskins = keyFile.get_boolean ("Vibrance", "ProtectSkins"); - - if (pedited) { - pedited->vibrance.protectskins = true; - } - } - - if (keyFile.has_key ("Vibrance", "AvoidColorShift")) { - vibrance.avoidcolorshift = keyFile.get_boolean ("Vibrance", "AvoidColorShift"); - - if (pedited) { - pedited->vibrance.avoidcolorshift = true; - } - } - - if (keyFile.has_key ("Vibrance", "PastSatTog")) { - vibrance.pastsattog = keyFile.get_boolean ("Vibrance", "PastSatTog"); - - if (pedited) { - pedited->vibrance.pastsattog = true; - } - } - - if (keyFile.has_key ("Vibrance", "SkinTonesCurve")) { - vibrance.skintonescurve = keyFile.get_double_list ("Vibrance", "SkinTonesCurve"); - avoidEmptyCurve (vibrance.skintonescurve); - - if (pedited) { - pedited->vibrance.skintonescurve = true; - } - } - } - - // load colorBoost - /*if (keyFile.has_group ("Color Boost")) { - if (keyFile.has_key ("Color Boost", "Amount")) { colorBoost.amount = keyFile.get_integer ("Color Boost", "Amount"); if (pedited) pedited->colorBoost.amount = true; } - else { - int a=0, b=0; - if (keyFile.has_key ("Color Boost", "ChannelA")) { a = keyFile.get_integer ("Color Boost", "ChannelA"); } - if (keyFile.has_key ("Color Boost", "ChannelB")) { b = keyFile.get_integer ("Color Boost", "ChannelB"); } - colorBoost.amount = (a+b) / 2; - if (pedited) pedited->colorBoost.amount = true; - } - if (keyFile.has_key ("Color Boost", "AvoidColorClipping")) { colorBoost.avoidclip = keyFile.get_boolean ("Color Boost", "AvoidColorClipping"); if (pedited) pedited->colorBoost.avoidclip = true; } - if (keyFile.has_key ("Color Boost", "SaturationLimiter")) { colorBoost.enable_saturationlimiter= keyFile.get_boolean ("Color Boost", "SaturationLimiter"); if (pedited) pedited->colorBoost.enable_saturationlimiter = true; } - if (keyFile.has_key ("Color Boost", "SaturationLimit")) { colorBoost.saturationlimit = keyFile.get_double ("Color Boost", "SaturationLimit"); if (pedited) pedited->colorBoost.saturationlimit = true; } - }*/ - - // load wb - if (keyFile.has_group ("White Balance")) { - if (keyFile.has_key ("White Balance", "Setting")) { - wb.method = keyFile.get_string ("White Balance", "Setting"); - - if (pedited) { - pedited->wb.method = true; - } - } - - if (keyFile.has_key ("White Balance", "Temperature")) { - wb.temperature = keyFile.get_integer ("White Balance", "Temperature"); - - if (pedited) { - pedited->wb.temperature = true; - } - } - - if (keyFile.has_key ("White Balance", "Green")) { - wb.green = keyFile.get_double ("White Balance", "Green"); - - if (pedited) { - pedited->wb.green = true; - } - } - - if (keyFile.has_key ("White Balance", "Equal")) { - wb.equal = keyFile.get_double ("White Balance", "Equal"); - - if (pedited) { - pedited->wb.equal = true; - } - } - - if (keyFile.has_key ("White Balance", "TemperatureBias")) { - wb.tempBias = keyFile.get_double ("White Balance", "TemperatureBias"); - - if (pedited) { - pedited->wb.tempBias = true; - } - } - } - - // load colorShift - /*if (keyFile.has_group ("Color Shift")) { - if (keyFile.has_key ("Color Shift", "ChannelA")) { colorShift.a = keyFile.get_double ("Color Shift", "ChannelA"); if (pedited) pedited->colorShift.a = true; } - if (keyFile.has_key ("Color Shift", "ChannelB")) { colorShift.b = keyFile.get_double ("Color Shift", "ChannelB"); if (pedited) pedited->colorShift.b = true; } - }*/ - - // load defringe - if (keyFile.has_group ("Defringing")) { - if (keyFile.has_key ("Defringing", "Enabled")) { - defringe.enabled = keyFile.get_boolean ("Defringing", "Enabled"); - - if (pedited) { - pedited->defringe.enabled = true; - } - } - - if (keyFile.has_key ("Defringing", "Radius")) { - defringe.radius = keyFile.get_double ("Defringing", "Radius"); - - if (pedited) { - pedited->defringe.radius = true; - } - } - - if (keyFile.has_key ("Defringing", "Threshold")) { - defringe.threshold = (float)keyFile.get_integer ("Defringing", "Threshold"); - - if (pedited) { - pedited->defringe.threshold = true; - } - } - - if (ppVersion < 310) { - defringe.threshold = sqrt (defringe.threshold * 33.f / 5.f); - } - - if (keyFile.has_key ("Defringing", "HueCurve")) { - defringe.huecurve = keyFile.get_double_list ("Defringing", "HueCurve"); - avoidEmptyCurve (defringe.huecurve); - - if (pedited) { - pedited->defringe.huecurve = true; - } - } - } - -// load colorappearance - if (keyFile.has_group ("Color appearance")) { - if (keyFile.has_key ("Color appearance", "Enabled")) { - colorappearance.enabled = keyFile.get_boolean ("Color appearance", "Enabled"); - - if (pedited) { - pedited->colorappearance.enabled = true; - } - } - - if (keyFile.has_key ("Color appearance", "Degree")) { - colorappearance.degree = keyFile.get_integer ("Color appearance", "Degree"); - - if (pedited) { - pedited->colorappearance.degree = true; - } - } - - if (keyFile.has_key ("Color appearance", "AutoDegree")) { - colorappearance.autodegree = keyFile.get_boolean ("Color appearance", "AutoDegree"); - - if (pedited) { - pedited->colorappearance.autodegree = true; - } - } - - if (keyFile.has_key ("Color appearance", "Degreeout")) { - colorappearance.degreeout = keyFile.get_integer ("Color appearance", "Degreeout"); - - if (pedited) { - pedited->colorappearance.degreeout = true; - } - } - - if (keyFile.has_key ("Color appearance", "AutoDegreeout")) { - colorappearance.autodegreeout = keyFile.get_boolean ("Color appearance", "AutoDegreeout"); - - if (pedited) { - pedited->colorappearance.autodegreeout = true; - } - } - - if (keyFile.has_key ("Color appearance", "Surround")) { - colorappearance.surround = keyFile.get_string ("Color appearance", "Surround"); - - if (pedited) { - pedited->colorappearance.surround = true; - } - } - - if (keyFile.has_key ("Color appearance", "Surrsrc")) { - colorappearance.surrsrc = keyFile.get_string ("Color appearance", "Surrsrc"); - - if (pedited) { - pedited->colorappearance.surrsrc = true; - } - } - -// if (keyFile.has_key ("Color appearance", "Background")) {colorappearance.backgrd = keyFile.get_integer ("Color appearance", "Background"); if (pedited) pedited->colorappearance.backgrd = true; } - if (keyFile.has_key ("Color appearance", "AdaptLum")) { - colorappearance.adaplum = keyFile.get_double ("Color appearance", "AdaptLum"); - - if (pedited) { - pedited->colorappearance.adaplum = true; - } - } - - if (keyFile.has_key ("Color appearance", "Badpixsl")) { - colorappearance.badpixsl = keyFile.get_integer ("Color appearance", "Badpixsl"); - - if (pedited) { - pedited->colorappearance.badpixsl = true; - } - } - - if (keyFile.has_key ("Color appearance", "Model")) { - colorappearance.wbmodel = keyFile.get_string ("Color appearance", "Model"); - - if (pedited) { - pedited->colorappearance.wbmodel = true; - } - } - - if (keyFile.has_key ("Color appearance", "Algorithm")) { - colorappearance.algo = keyFile.get_string ("Color appearance", "Algorithm"); - - if (pedited) { - pedited->colorappearance.algo = true; - } - } - - if (keyFile.has_key ("Color appearance", "J-Light")) { - colorappearance.jlight = keyFile.get_double ("Color appearance", "J-Light"); - - if (pedited) { - pedited->colorappearance.jlight = true; - } - } - - if (keyFile.has_key ("Color appearance", "Q-Bright")) { - colorappearance.qbright = keyFile.get_double ("Color appearance", "Q-Bright"); - - if (pedited) { - pedited->colorappearance.qbright = true; - } - } - - if (keyFile.has_key ("Color appearance", "C-Chroma")) { - colorappearance.chroma = keyFile.get_double ("Color appearance", "C-Chroma"); - - if (pedited) { - pedited->colorappearance.chroma = true; - } - } - - if (keyFile.has_key ("Color appearance", "S-Chroma")) { - colorappearance.schroma = keyFile.get_double ("Color appearance", "S-Chroma"); - - if (pedited) { - pedited->colorappearance.schroma = true; - } - } - - if (keyFile.has_key ("Color appearance", "M-Chroma")) { - colorappearance.mchroma = keyFile.get_double ("Color appearance", "M-Chroma"); - - if (pedited) { - pedited->colorappearance.mchroma = true; - } - } - - if (keyFile.has_key ("Color appearance", "RSTProtection")) { - colorappearance.rstprotection = keyFile.get_double ("Color appearance", "RSTProtection"); - - if (pedited) { - pedited->colorappearance.rstprotection = true; - } - } - - if (keyFile.has_key ("Color appearance", "J-Contrast")) { - colorappearance.contrast = keyFile.get_double ("Color appearance", "J-Contrast"); - - if (pedited) { - pedited->colorappearance.contrast = true; - } - } - - if (keyFile.has_key ("Color appearance", "Q-Contrast")) { - colorappearance.qcontrast = keyFile.get_double ("Color appearance", "Q-Contrast"); - - if (pedited) { - pedited->colorappearance.qcontrast = true; - } - } - - if (keyFile.has_key ("Color appearance", "H-Hue")) { - colorappearance.colorh = keyFile.get_double ("Color appearance", "H-Hue"); - - if (pedited) { - pedited->colorappearance.colorh = true; - } - } - - if (keyFile.has_key ("Color appearance", "AdaptScene")) { - colorappearance.adapscen = keyFile.get_double ("Color appearance", "AdaptScene"); - - if (pedited) { - pedited->colorappearance.adapscen = true; - } - } - - if (keyFile.has_key ("Color appearance", "AutoAdapscen")) { - colorappearance.autoadapscen = keyFile.get_boolean ("Color appearance", "AutoAdapscen"); - - if (pedited) { - pedited->colorappearance.autoadapscen = true; - } - } - - if (keyFile.has_key ("Color appearance", "YbScene")) { - colorappearance.ybscen = keyFile.get_integer ("Color appearance", "YbScene"); - - if (pedited) { - pedited->colorappearance.ybscen = true; - } - } - - if (keyFile.has_key ("Color appearance", "Autoybscen")) { - colorappearance.autoybscen = keyFile.get_boolean ("Color appearance", "Autoybscen"); - - if (pedited) { - pedited->colorappearance.autoybscen = true; - } - } - - if (keyFile.has_key ("Color appearance", "SurrSource")) { - colorappearance.surrsource = keyFile.get_boolean ("Color appearance", "SurrSource"); - - if (pedited) { - pedited->colorappearance.surrsource = true; - } - } - - if (keyFile.has_key ("Color appearance", "Gamut")) { - colorappearance.gamut = keyFile.get_boolean ("Color appearance", "Gamut"); - - if (pedited) { - pedited->colorappearance.gamut = true; - } - } - - if (keyFile.has_key ("Color appearance", "Tempout")) { - colorappearance.tempout = keyFile.get_integer ("Color appearance", "Tempout"); - - if (pedited) { - pedited->colorappearance.tempout = true; - } - } - - if (keyFile.has_key ("Color appearance", "Greenout")) { - colorappearance.greenout = keyFile.get_double ("Color appearance", "Greenout"); - - if (pedited) { - pedited->colorappearance.greenout = true; - } - } - - if (keyFile.has_key ("Color appearance", "Tempsc")) { - colorappearance.tempsc = keyFile.get_integer ("Color appearance", "Tempsc"); - - if (pedited) { - pedited->colorappearance.tempsc = true; - } - } - - if (keyFile.has_key ("Color appearance", "Greensc")) { - colorappearance.greensc = keyFile.get_double ("Color appearance", "Greensc"); - - if (pedited) { - pedited->colorappearance.greensc = true; - } - } - - if (keyFile.has_key ("Color appearance", "Ybout")) { - colorappearance.ybout = keyFile.get_integer ("Color appearance", "Ybout"); - - if (pedited) { - pedited->colorappearance.ybout = true; - } - } - -// if (keyFile.has_key ("Color appearance", "Badpix")) {colorappearance.badpix = keyFile.get_boolean ("Color appearance", "Badpix"); if (pedited) pedited->colorappearance.badpix = true; } - if (keyFile.has_key ("Color appearance", "Datacie")) { - colorappearance.datacie = keyFile.get_boolean ("Color appearance", "Datacie"); - - if (pedited) { - pedited->colorappearance.datacie = true; - } - } - - if (keyFile.has_key ("Color appearance", "Tonecie")) { - colorappearance.tonecie = keyFile.get_boolean ("Color appearance", "Tonecie"); - - if (pedited) { - pedited->colorappearance.tonecie = true; - } - } - -// if (keyFile.has_key ("Color appearance", "Sharpcie")) {colorappearance.sharpcie = keyFile.get_boolean ("Color appearance", "Sharpcie"); if (pedited) pedited->colorappearance.sharpcie = true; } - if (keyFile.has_key ("Color appearance", "CurveMode")) { - Glib::ustring sMode = keyFile.get_string ("Color appearance", "CurveMode"); - - if (sMode == "Lightness") { - colorappearance.curveMode = ColorAppearanceParams::TC_MODE_LIGHT; - } else if (sMode == "Brightness") { - colorappearance.curveMode = ColorAppearanceParams::TC_MODE_BRIGHT; - } - - if (pedited) { - pedited->colorappearance.curveMode = true; - } - } - - if (keyFile.has_key ("Color appearance", "CurveMode2")) { - Glib::ustring sMode = keyFile.get_string ("Color appearance", "CurveMode2"); - - if (sMode == "Lightness") { - colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_LIGHT; - } else if (sMode == "Brightness") { - colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_BRIGHT; - } - - if (pedited) { - pedited->colorappearance.curveMode2 = true; - } - } - - if (keyFile.has_key ("Color appearance", "CurveMode3")) { - Glib::ustring sMode = keyFile.get_string ("Color appearance", "CurveMode3"); - - if (sMode == "Chroma") { - colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_CHROMA; - } else if (sMode == "Saturation") { - colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_SATUR; - } else if (sMode == "Colorfullness") { - colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_COLORF; - } - - if (pedited) { - pedited->colorappearance.curveMode3 = true; - } - } - - if (ppVersion > 200) { - if (keyFile.has_key ("Color appearance", "Curve")) { - colorappearance.curve = keyFile.get_double_list ("Color appearance", "Curve"); - avoidEmptyCurve (colorappearance.curve); - - if (pedited) { - pedited->colorappearance.curve = true; - } - } - - if (keyFile.has_key ("Color appearance", "Curve2")) { - colorappearance.curve2 = keyFile.get_double_list ("Color appearance", "Curve2"); - avoidEmptyCurve (colorappearance.curve2); - - if (pedited) { - pedited->colorappearance.curve2 = true; - } - } - - if (keyFile.has_key ("Color appearance", "Curve3")) { - colorappearance.curve3 = keyFile.get_double_list ("Color appearance", "Curve3"); - avoidEmptyCurve (colorappearance.curve3); - - if (pedited) { - pedited->colorappearance.curve3 = true; - } - } - } - - } - -// load impulseDenoise - if (keyFile.has_group ("Impulse Denoising")) { - if (keyFile.has_key ("Impulse Denoising", "Enabled")) { - impulseDenoise.enabled = keyFile.get_boolean ("Impulse Denoising", "Enabled"); - - if (pedited) { - pedited->impulseDenoise.enabled = true; - } - } - - if (keyFile.has_key ("Impulse Denoising", "Threshold")) { - impulseDenoise.thresh = keyFile.get_integer ("Impulse Denoising", "Threshold"); - - if (pedited) { - pedited->impulseDenoise.thresh = true; - } - } - } - -// load dirpyrDenoise - if (keyFile.has_group ("Directional Pyramid Denoising")) {//TODO: No longer an accurate description for FT denoise - if (keyFile.has_key ("Directional Pyramid Denoising", "Enabled")) { - dirpyrDenoise.enabled = keyFile.get_boolean ("Directional Pyramid Denoising", "Enabled"); - - if (pedited) { - pedited->dirpyrDenoise.enabled = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Enhance")) { - dirpyrDenoise.enhance = keyFile.get_boolean ("Directional Pyramid Denoising", "Enhance"); - - if (pedited) { - pedited->dirpyrDenoise.enhance = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Median")) { - dirpyrDenoise.median = keyFile.get_boolean ("Directional Pyramid Denoising", "Median"); - - if (pedited) { - pedited->dirpyrDenoise.median = true; - } - } - -// if (keyFile.has_key ("Directional Pyramid Denoising", "Perform")) { dirpyrDenoise.perform = keyFile.get_boolean ("Directional Pyramid Denoising", "Perform"); if (pedited) pedited->dirpyrDenoise.perform = true; } - if (keyFile.has_key ("Directional Pyramid Denoising", "Luma")) { - dirpyrDenoise.luma = keyFile.get_double ("Directional Pyramid Denoising", "Luma"); - - if (pedited) { - pedited->dirpyrDenoise.luma = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Ldetail")) { - dirpyrDenoise.Ldetail = keyFile.get_double ("Directional Pyramid Denoising", "Ldetail"); - - if (pedited) { - pedited->dirpyrDenoise.Ldetail = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Chroma")) { - dirpyrDenoise.chroma = keyFile.get_double ("Directional Pyramid Denoising", "Chroma"); - - if (pedited) { - pedited->dirpyrDenoise.chroma = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Method")) { - dirpyrDenoise.dmethod = keyFile.get_string ("Directional Pyramid Denoising", "Method"); - - if (pedited) { - pedited->dirpyrDenoise.dmethod = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "LMethod")) { - dirpyrDenoise.Lmethod = keyFile.get_string ("Directional Pyramid Denoising", "LMethod"); - - if (pedited) { - pedited->dirpyrDenoise.Lmethod = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "CMethod")) { - dirpyrDenoise.Cmethod = keyFile.get_string ("Directional Pyramid Denoising", "CMethod"); - - if (pedited) { - pedited->dirpyrDenoise.Cmethod = true; - } - } - -// never load 'auto chroma preview mode' from pp3 - if (dirpyrDenoise.Cmethod == "PRE") { - dirpyrDenoise.Cmethod = "MAN"; - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "C2Method")) { - dirpyrDenoise.C2method = keyFile.get_string ("Directional Pyramid Denoising", "C2Method"); - - if (pedited) { - pedited->dirpyrDenoise.C2method = true; - } - } - - if (dirpyrDenoise.C2method == "PREV") { - dirpyrDenoise.C2method = "MANU"; - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "SMethod")) { - dirpyrDenoise.smethod = keyFile.get_string ("Directional Pyramid Denoising", "SMethod"); - - if (pedited) { - pedited->dirpyrDenoise.smethod = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "MedMethod")) { - dirpyrDenoise.medmethod = keyFile.get_string ("Directional Pyramid Denoising", "MedMethod"); - - if (pedited) { - pedited->dirpyrDenoise.medmethod = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "MethodMed")) { - dirpyrDenoise.methodmed = keyFile.get_string ("Directional Pyramid Denoising", "MethodMed"); - - if (pedited) { - pedited->dirpyrDenoise.methodmed = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "RGBMethod")) { - dirpyrDenoise.rgbmethod = keyFile.get_string ("Directional Pyramid Denoising", "RGBMethod"); - - if (pedited) { - pedited->dirpyrDenoise.rgbmethod = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "LCurve")) { - dirpyrDenoise.lcurve = keyFile.get_double_list ("Directional Pyramid Denoising", "LCurve"); - avoidEmptyCurve (dirpyrDenoise.lcurve); - - if (pedited) { - pedited->dirpyrDenoise.lcurve = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "CCCurve")) { - dirpyrDenoise.cccurve = keyFile.get_double_list ("Directional Pyramid Denoising", "CCCurve"); - avoidEmptyCurve (dirpyrDenoise.cccurve); - - if (pedited) { - pedited->dirpyrDenoise.cccurve = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Redchro")) { - dirpyrDenoise.redchro = keyFile.get_double ("Directional Pyramid Denoising", "Redchro"); - - if (pedited) { - pedited->dirpyrDenoise.redchro = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Bluechro")) { - dirpyrDenoise.bluechro = keyFile.get_double ("Directional Pyramid Denoising", "Bluechro"); - - if (pedited) { - pedited->dirpyrDenoise.bluechro = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Gamma")) { - dirpyrDenoise.gamma = keyFile.get_double ("Directional Pyramid Denoising", "Gamma"); - - if (pedited) { - pedited->dirpyrDenoise.gamma = true; - } - } - - if (keyFile.has_key ("Directional Pyramid Denoising", "Passes")) { - dirpyrDenoise.passes = keyFile.get_integer ("Directional Pyramid Denoising", "Passes"); - - if (pedited) { - pedited->dirpyrDenoise.passes = true; - } - } - } - -//Load EPD. - if (keyFile.has_group ("EPD")) { - if (keyFile.has_key ("EPD", "Enabled")) { - epd.enabled = keyFile.get_boolean ("EPD", "Enabled"); - - if (pedited) { - pedited->epd.enabled = true; - } - } - - if (keyFile.has_key ("EPD", "Strength")) { - epd.strength = keyFile.get_double ("EPD", "Strength"); - - if (pedited) { - pedited->epd.strength = true; - } - } - - if (keyFile.has_key ("EPD", "Gamma")) { - epd.gamma = keyFile.get_double ("EPD", "Gamma"); - - if (pedited) { - pedited->epd.gamma = true; - } - } - - if (keyFile.has_key ("EPD", "EdgeStopping")) { - epd.edgeStopping = keyFile.get_double ("EPD", "EdgeStopping"); - - if (pedited) { - pedited->epd.edgeStopping = true; - } - } - - if (keyFile.has_key ("EPD", "Scale")) { - epd.scale = keyFile.get_double ("EPD", "Scale"); - - if (pedited) { - pedited->epd.scale = true; - } - } - - if (keyFile.has_key ("EPD", "ReweightingIterates")) { - epd.reweightingIterates = keyFile.get_integer ("EPD", "ReweightingIterates"); - - if (pedited) { - pedited->epd.reweightingIterates = true; - } - } - } - - // load lumaDenoise - /*if (keyFile.has_group ("Luminance Denoising")) { - if (keyFile.has_key ("Luminance Denoising", "Enabled")) { lumaDenoise.enabled = keyFile.get_boolean ("Luminance Denoising", "Enabled"); if (pedited) pedited->lumaDenoise.enabled = true; } - if (keyFile.has_key ("Luminance Denoising", "Radius")) { lumaDenoise.radius = keyFile.get_double ("Luminance Denoising", "Radius"); if (pedited) pedited->lumaDenoise.radius = true; } - if (keyFile.has_key ("Luminance Denoising", "EdgeTolerance")) { lumaDenoise.edgetolerance = keyFile.get_integer ("Luminance Denoising", "EdgeTolerance"); if (pedited) pedited->lumaDenoise.edgetolerance = true; } - }*/ - - // load colorDenoise - /*if (keyFile.has_group ("Chrominance Denoising")) { - if (keyFile.has_key ("Chrominance Denoising", "Enabled")) { colorDenoise.enabled = keyFile.get_boolean ("Chrominance Denoising", "Enabled"); if (pedited) pedited->colorDenoise.enabled = true; } - // WARNING: radius doesn't exist anymore; is there any compatibility issue that require to keep the following line? - if (keyFile.has_key ("Chrominance Denoising", "Radius")) { colorDenoise.amount = 10*keyFile.get_double ("Chrominance Denoising", "Radius"); } - if (keyFile.has_key ("Chrominance Denoising", "Amount")) { colorDenoise.amount = keyFile.get_integer ("Chrominance Denoising", "Amount"); if (pedited) pedited->colorDenoise.amount = true; } - }*/ - - // load sh - if (keyFile.has_group ("Shadows & Highlights")) { - if (keyFile.has_key ("Shadows & Highlights", "Enabled")) { - sh.enabled = keyFile.get_boolean ("Shadows & Highlights", "Enabled"); - - if (pedited) { - pedited->sh.enabled = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "HighQuality")) { - sh.hq = keyFile.get_boolean ("Shadows & Highlights", "HighQuality"); - - if (pedited) { - pedited->sh.hq = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "Highlights")) { - sh.highlights = keyFile.get_integer ("Shadows & Highlights", "Highlights"); - - if (pedited) { - pedited->sh.highlights = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "HighlightTonalWidth")) { - sh.htonalwidth = keyFile.get_integer ("Shadows & Highlights", "HighlightTonalWidth"); - - if (pedited) { - pedited->sh.htonalwidth = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "Shadows")) { - sh.shadows = keyFile.get_integer ("Shadows & Highlights", "Shadows"); - - if (pedited) { - pedited->sh.shadows = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "ShadowTonalWidth")) { - sh.stonalwidth = keyFile.get_integer ("Shadows & Highlights", "ShadowTonalWidth"); - - if (pedited) { - pedited->sh.stonalwidth = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "LocalContrast")) { - sh.localcontrast = keyFile.get_integer ("Shadows & Highlights", "LocalContrast"); - - if (pedited) { - pedited->sh.localcontrast = true; - } - } - - if (keyFile.has_key ("Shadows & Highlights", "Radius")) { - sh.radius = keyFile.get_integer ("Shadows & Highlights", "Radius"); - - if (pedited) { - pedited->sh.radius = true; - } - } - } - -// load crop - if (keyFile.has_group ("Crop")) { - if (keyFile.has_key ("Crop", "Enabled")) { - crop.enabled = keyFile.get_boolean ("Crop", "Enabled"); - - if (pedited) { - pedited->crop.enabled = true; - } - } - - if (keyFile.has_key ("Crop", "X")) { - crop.x = keyFile.get_integer ("Crop", "X"); - - if (pedited) { - pedited->crop.x = true; - } - } - - if (keyFile.has_key ("Crop", "Y")) { - crop.y = keyFile.get_integer ("Crop", "Y"); - - if (pedited) { - pedited->crop.y = true; - } - } - - if (keyFile.has_key ("Crop", "W")) { - crop.w = std::max (keyFile.get_integer ("Crop", "W"), 1); - - if (pedited) { - pedited->crop.w = true; - } - } - - if (keyFile.has_key ("Crop", "H")) { - crop.h = std::max (keyFile.get_integer ("Crop", "H"), 1); - - if (pedited) { - pedited->crop.h = true; - } - } - - if (keyFile.has_key ("Crop", "FixedRatio")) { - crop.fixratio = keyFile.get_boolean ("Crop", "FixedRatio"); - - if (pedited) { - pedited->crop.fixratio = true; - } - } - - if (keyFile.has_key ("Crop", "Ratio")) { - crop.ratio = keyFile.get_string ("Crop", "Ratio"); - - if (pedited) { - pedited->crop.ratio = true; - } - -//backwards compatibility for crop.ratio - if (crop.ratio == "DIN") { - crop.ratio = "1.414 - DIN EN ISO 216"; - } - - if (crop.ratio == "8.5:11") { - crop.ratio = "8.5:11 - US Letter"; - } - - if (crop.ratio == "11:17") { - crop.ratio = "11:17 - Tabloid"; - } - } - - if (keyFile.has_key ("Crop", "Orientation")) { - crop.orientation = keyFile.get_string ("Crop", "Orientation"); - - if (pedited) { - pedited->crop.orientation = true; - } - } - - if (keyFile.has_key ("Crop", "Guide")) { - crop.guide = keyFile.get_string ("Crop", "Guide"); - - if (pedited) { - pedited->crop.guide = true; - } - } - } - -// load coarse - if (keyFile.has_group ("Coarse Transformation")) { - if (keyFile.has_key ("Coarse Transformation", "Rotate")) { - coarse.rotate = keyFile.get_integer ("Coarse Transformation", "Rotate"); - - if (pedited) { - pedited->coarse.rotate = true; - } - } - - if (keyFile.has_key ("Coarse Transformation", "HorizontalFlip")) { - coarse.hflip = keyFile.get_boolean ("Coarse Transformation", "HorizontalFlip"); - - if (pedited) { - pedited->coarse.hflip = true; - } - } - - if (keyFile.has_key ("Coarse Transformation", "VerticalFlip")) { - coarse.vflip = keyFile.get_boolean ("Coarse Transformation", "VerticalFlip"); - - if (pedited) { - pedited->coarse.vflip = true; - } - } - } - -// load rotate - if (keyFile.has_group ("Rotation")) { - if (keyFile.has_key ("Rotation", "Degree")) { - rotate.degree = keyFile.get_double ("Rotation", "Degree"); - - if (pedited) { - pedited->rotate.degree = true; - } - } - } - -// load commonTrans - if (keyFile.has_group ("Common Properties for Transformations")) { - if (keyFile.has_key ("Common Properties for Transformations", "AutoFill")) { - commonTrans.autofill = keyFile.get_boolean ("Common Properties for Transformations", "AutoFill"); - - if (pedited) { - pedited->commonTrans.autofill = true; - } - } - } - -// load distortion - if (keyFile.has_group ("Distortion")) { - if (keyFile.has_key ("Distortion", "Amount")) { - distortion.amount = keyFile.get_double ("Distortion", "Amount"); - - if (pedited) { - pedited->distortion.amount = true; - } - } - } - -// lens profile - if (keyFile.has_group ("LensProfile")) { - if (keyFile.has_key ("LensProfile", "LcMode")) { - lensProf.lcMode = lensProf.getMethodNumber (keyFile.get_string ("LensProfile", "LcMode")); - - if (pedited) { - pedited->lensProf.lcMode = true; - } - } - - if (keyFile.has_key ("LensProfile", "LCPFile")) { - lensProf.lcpFile = expandRelativePath (fname, "", keyFile.get_string ("LensProfile", "LCPFile")); - - if (pedited) { - pedited->lensProf.lcpFile = true; - } - - if(ppVersion < 327 && !lensProf.lcpFile.empty()) { - lensProf.lcMode = LensProfParams::LcMode::LCP; - } - } - - if (keyFile.has_key ("LensProfile", "UseDistortion")) { - lensProf.useDist = keyFile.get_boolean ("LensProfile", "UseDistortion"); - - if (pedited) { - pedited->lensProf.useDist = true; - } - } - - if (keyFile.has_key ("LensProfile", "UseVignette")) { - lensProf.useVign = keyFile.get_boolean ("LensProfile", "UseVignette"); - - if (pedited) { - pedited->lensProf.useVign = true; - } - } - - if (keyFile.has_key ("LensProfile", "UseCA")) { - lensProf.useCA = keyFile.get_boolean ("LensProfile", "UseCA"); - - if (pedited) { - pedited->lensProf.useCA = true; - } - } - - if (keyFile.has_key("LensProfile", "LFCameraMake")) { - lensProf.lfCameraMake = keyFile.get_string("LensProfile", "LFCameraMake"); - if (pedited) { - pedited->lensProf.lfCameraMake = true; - } - } - - if (keyFile.has_key("LensProfile", "LFCameraModel")) { - lensProf.lfCameraModel = keyFile.get_string("LensProfile", "LFCameraModel"); - if (pedited) { - pedited->lensProf.lfCameraModel = true; - } - } - - if (keyFile.has_key("LensProfile", "LFLens")) { - lensProf.lfLens = keyFile.get_string("LensProfile", "LFLens"); - if (pedited) { - pedited->lensProf.lfLens = true; - } - } - } - -// load perspective correction - if (keyFile.has_group ("Perspective")) { - if (keyFile.has_key ("Perspective", "Horizontal")) { - perspective.horizontal = keyFile.get_double ("Perspective", "Horizontal"); - - if (pedited) { - pedited->perspective.horizontal = true; - } - } - - if (keyFile.has_key ("Perspective", "Vertical")) { - perspective.vertical = keyFile.get_double ("Perspective", "Vertical"); - - if (pedited) { - pedited->perspective.vertical = true; - } - } - } - -// load gradient - if (keyFile.has_group ("Gradient")) { - if (keyFile.has_key ("Gradient", "Enabled")) { - gradient.enabled = keyFile.get_boolean ("Gradient", "Enabled"); - - if (pedited) { - pedited->gradient.enabled = true; - } - } - - if (keyFile.has_key ("Gradient", "Degree")) { - gradient.degree = keyFile.get_double ("Gradient", "Degree"); - - if (pedited) { - pedited->gradient.degree = true; - } - } - - if (keyFile.has_key ("Gradient", "Feather")) { - gradient.feather = keyFile.get_integer ("Gradient", "Feather"); - - if (pedited) { - pedited->gradient.feather = true; - } - } - - if (keyFile.has_key ("Gradient", "Strength")) { - gradient.strength = keyFile.get_double ("Gradient", "Strength"); - - if (pedited) { - pedited->gradient.strength = true; - } - } - - if (keyFile.has_key ("Gradient", "CenterX")) { - gradient.centerX = keyFile.get_integer ("Gradient", "CenterX"); - - if (pedited) { - pedited->gradient.centerX = true; - } - } - - if (keyFile.has_key ("Gradient", "CenterY")) { - gradient.centerY = keyFile.get_integer ("Gradient", "CenterY"); - - if (pedited) { - pedited->gradient.centerY = true; - } - } - } - - if (keyFile.has_group ("PCVignette")) { - if (keyFile.has_key ("PCVignette", "Enabled")) { - pcvignette.enabled = keyFile.get_boolean ("PCVignette", "Enabled"); - - if (pedited) { - pedited->pcvignette.enabled = true; - } - } - - if (keyFile.has_key ("PCVignette", "Strength")) { - pcvignette.strength = keyFile.get_double ("PCVignette", "Strength"); - - if (pedited) { - pedited->pcvignette.strength = true; - } - } - - if (keyFile.has_key ("PCVignette", "Feather")) { - pcvignette.feather = keyFile.get_integer ("PCVignette", "Feather"); - - if (pedited) { - pedited->pcvignette.feather = true; - } - } - - if (keyFile.has_key ("PCVignette", "Roundness")) { - pcvignette.roundness = keyFile.get_integer ("PCVignette", "Roundness"); - - if (pedited) { - pedited->pcvignette.roundness = true; - } - } - } - -// load c/a correction - if (keyFile.has_group ("CACorrection")) { - if (keyFile.has_key ("CACorrection", "Red")) { - cacorrection.red = keyFile.get_double ("CACorrection", "Red"); - - if (pedited) { - pedited->cacorrection.red = true; - } - } - - if (keyFile.has_key ("CACorrection", "Blue")) { - cacorrection.blue = keyFile.get_double ("CACorrection", "Blue"); - - if (pedited) { - pedited->cacorrection.blue = true; - } - } - } - -// load vignetting correction - if (keyFile.has_group ("Vignetting Correction")) { - if (keyFile.has_key ("Vignetting Correction", "Amount")) { - vignetting.amount = keyFile.get_integer ("Vignetting Correction", "Amount"); - - if (pedited) { - pedited->vignetting.amount = true; - } - } - - if (keyFile.has_key ("Vignetting Correction", "Radius")) { - vignetting.radius = keyFile.get_integer ("Vignetting Correction", "Radius"); - - if (pedited) { - pedited->vignetting.radius = true; - } - } - - if (keyFile.has_key ("Vignetting Correction", "Strength")) { - vignetting.strength = keyFile.get_integer ("Vignetting Correction", "Strength"); - - if (pedited) { - pedited->vignetting.strength = true; - } - } - - if (keyFile.has_key ("Vignetting Correction", "CenterX")) { - vignetting.centerX = keyFile.get_integer ("Vignetting Correction", "CenterX"); - - if (pedited) { - pedited->vignetting.centerX = true; - } - } - - if (keyFile.has_key ("Vignetting Correction", "CenterY")) { - vignetting.centerY = keyFile.get_integer ("Vignetting Correction", "CenterY"); - - if (pedited) { - pedited->vignetting.centerY = true; - } - } - } - -// load resize settings - if (keyFile.has_group ("Resize")) { - if (keyFile.has_key ("Resize", "Enabled")) { - resize.enabled = keyFile.get_boolean ("Resize", "Enabled"); - - if (pedited) { - pedited->resize.enabled = true; - } - } - - if (keyFile.has_key ("Resize", "Scale")) { - resize.scale = keyFile.get_double ("Resize", "Scale"); - - if (pedited) { - pedited->resize.scale = true; - } - } - - if (keyFile.has_key ("Resize", "AppliesTo")) { - resize.appliesTo = keyFile.get_string ("Resize", "AppliesTo"); - - if (pedited) { - pedited->resize.appliesTo = true; - } - } - - if (keyFile.has_key ("Resize", "Method")) { - resize.method = keyFile.get_string ("Resize", "Method"); - - if (pedited) { - pedited->resize.method = true; - } - } - - if (keyFile.has_key ("Resize", "DataSpecified")) { - resize.dataspec = keyFile.get_integer ("Resize", "DataSpecified"); - - if (pedited) { - pedited->resize.dataspec = true; - } - } - - if (keyFile.has_key ("Resize", "Width")) { - resize.width = keyFile.get_integer ("Resize", "Width"); - - if (pedited) { - pedited->resize.width = true; - } - } - - if (keyFile.has_key ("Resize", "Height")) { - resize.height = keyFile.get_integer ("Resize", "Height"); - - if (pedited) { - pedited->resize.height = true; - } - } - } - -// load post resize sharpening - if (keyFile.has_group ("PostResizeSharpening")) { - if (keyFile.has_key ("PostResizeSharpening", "Enabled")) { - prsharpening.enabled = keyFile.get_boolean ("PostResizeSharpening", "Enabled"); - - if (pedited) { - pedited->prsharpening.enabled = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "Radius")) { - prsharpening.radius = keyFile.get_double ("PostResizeSharpening", "Radius"); - - if (pedited) { - pedited->prsharpening.radius = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "Amount")) { - prsharpening.amount = keyFile.get_integer ("PostResizeSharpening", "Amount"); - - if (pedited) { - pedited->prsharpening.amount = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "Threshold")) { - if (ppVersion < 302) { - int thresh = min (keyFile.get_integer ("PostResizeSharpening", "Threshold"), 2000); - prsharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization - } else { - const std::vector thresh = keyFile.get_integer_list ("PostResizeSharpening", "Threshold"); - - if (thresh.size() >= 4) { - prsharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); - } - } - - if (pedited) { - pedited->prsharpening.threshold = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "OnlyEdges")) { - prsharpening.edgesonly = keyFile.get_boolean ("PostResizeSharpening", "OnlyEdges"); - - if (pedited) { - pedited->prsharpening.edgesonly = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "EdgedetectionRadius")) { - prsharpening.edges_radius = keyFile.get_double ("PostResizeSharpening", "EdgedetectionRadius"); - - if (pedited) { - pedited->prsharpening.edges_radius = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "EdgeTolerance")) { - prsharpening.edges_tolerance = keyFile.get_integer ("PostResizeSharpening", "EdgeTolerance"); - - if (pedited) { - pedited->prsharpening.edges_tolerance = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "HalocontrolEnabled")) { - prsharpening.halocontrol = keyFile.get_boolean ("PostResizeSharpening", "HalocontrolEnabled"); - - if (pedited) { - pedited->prsharpening.halocontrol = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "HalocontrolAmount")) { - prsharpening.halocontrol_amount = keyFile.get_integer ("PostResizeSharpening", "HalocontrolAmount"); - - if (pedited) { - pedited->prsharpening.halocontrol_amount = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "Method")) { - prsharpening.method = keyFile.get_string ("PostResizeSharpening", "Method"); - - if (pedited) { - pedited->prsharpening.method = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "DeconvRadius")) { - prsharpening.deconvradius = keyFile.get_double ("PostResizeSharpening", "DeconvRadius"); - - if (pedited) { - pedited->prsharpening.deconvradius = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "DeconvAmount")) { - prsharpening.deconvamount = keyFile.get_integer ("PostResizeSharpening", "DeconvAmount"); - - if (pedited) { - pedited->prsharpening.deconvamount = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "DeconvDamping")) { - prsharpening.deconvdamping = keyFile.get_integer ("PostResizeSharpening", "DeconvDamping"); - - if (pedited) { - pedited->prsharpening.deconvdamping = true; - } - } - - if (keyFile.has_key ("PostResizeSharpening", "DeconvIterations")) { - prsharpening.deconviter = keyFile.get_integer ("PostResizeSharpening", "DeconvIterations"); - - if (pedited) { - pedited->prsharpening.deconviter = true; - } - } - } - -// load color management settings - if (keyFile.has_group ("Color Management")) { - if (keyFile.has_key ("Color Management", "InputProfile")) { - icm.input = expandRelativePath (fname, "file:", keyFile.get_string ("Color Management", "InputProfile")); - - if (pedited) { - pedited->icm.input = true; - } - } - - if (keyFile.has_key ("Color Management", "ToneCurve")) { - icm.toneCurve = keyFile.get_boolean ("Color Management", "ToneCurve"); - - if (pedited) { - pedited->icm.toneCurve = true; - } - } - - if (keyFile.has_key ("Color Management", "ApplyLookTable")) { - icm.applyLookTable = keyFile.get_boolean ("Color Management", "ApplyLookTable"); - - if (pedited) { - pedited->icm.applyLookTable = true; - } - } - - if (keyFile.has_key ("Color Management", "ApplyBaselineExposureOffset")) { - icm.applyBaselineExposureOffset = keyFile.get_boolean ("Color Management", "ApplyBaselineExposureOffset"); - - if (pedited) { - pedited->icm.applyBaselineExposureOffset = true; - } - } - - if (keyFile.has_key ("Color Management", "ApplyHueSatMap")) { - icm.applyHueSatMap = keyFile.get_boolean ("Color Management", "ApplyHueSatMap"); - - if (pedited) { - pedited->icm.applyHueSatMap = true; - } - } - - if (keyFile.has_key ("Color Management", "DCPIlluminant")) { - icm.dcpIlluminant = keyFile.get_integer ("Color Management", "DCPIlluminant"); - - if (pedited) { - pedited->icm.dcpIlluminant = true; - } - } - - if (keyFile.has_key ("Color Management", "WorkingProfile")) { - icm.working = keyFile.get_string ("Color Management", "WorkingProfile"); - - if (pedited) { - pedited->icm.working = true; - } - } - - if (keyFile.has_key ("Color Management", "OutputProfile")) { - icm.output = keyFile.get_string ("Color Management", "OutputProfile"); - - if (pedited) { - pedited->icm.output = true; - } - } - - if (keyFile.has_key ("Color Management", "OutputProfileIntent")) { - Glib::ustring intent = keyFile.get_string ("Color Management", "OutputProfileIntent"); - - if (intent == "Perceptual") { - icm.outputIntent = RI_PERCEPTUAL; - } else if (intent == "Relative") { - icm.outputIntent = RI_RELATIVE; - } else if (intent == "Saturation") { - icm.outputIntent = RI_SATURATION; - } else if (intent == "Absolute") { - icm.outputIntent = RI_ABSOLUTE; - } - - if (pedited) { - pedited->icm.outputIntent = true; - } - } - - if (keyFile.has_key ("Color Management", "OutputBPC")) { - icm.outputBPC = keyFile.get_boolean ("Color Management", "OutputBPC"); - - if (pedited) { - pedited->icm.outputBPC = true; - } - } - - if (keyFile.has_key ("Color Management", "Gammafree")) { - icm.gamma = keyFile.get_string ("Color Management", "Gammafree"); - - if (pedited) { - pedited->icm.gamfree = true; - } - } - - if (keyFile.has_key ("Color Management", "Freegamma")) { - icm.freegamma = keyFile.get_boolean ("Color Management", "Freegamma"); - - if (pedited) { - pedited->icm.freegamma = true; - } - } - - if (keyFile.has_key ("Color Management", "GammaValue")) { - icm.gampos = keyFile.get_double ("Color Management", "GammaValue"); - - if (pedited) { - pedited->icm.gampos = true; - } - } - - if (keyFile.has_key ("Color Management", "GammaSlope")) { - icm.slpos = keyFile.get_double ("Color Management", "GammaSlope"); - - if (pedited) { - pedited->icm.slpos = true; - } - } - - } - -// load wavelet wavelet parameters - if (keyFile.has_group ("Wavelet")) { - if (keyFile.has_key ("Wavelet", "Enabled")) { - wavelet.enabled = keyFile.get_boolean ("Wavelet", "Enabled"); - - if (pedited) { - pedited->wavelet.enabled = true; - } - } - - if (keyFile.has_key ("Wavelet", "Strength")) { - wavelet.strength = keyFile.get_integer ("Wavelet", "Strength"); - - if (pedited) { - pedited->wavelet.strength = true; - } - } - - if (keyFile.has_key ("Wavelet", "Balance")) { - wavelet.balance = keyFile.get_integer ("Wavelet", "Balance"); - - if (pedited) { - pedited->wavelet.balance = true; - } - } - - if (keyFile.has_key ("Wavelet", "Iter")) { - wavelet.iter = keyFile.get_integer ("Wavelet", "Iter"); - - if (pedited) { - pedited->wavelet.iter = true; - } - } - - if (keyFile.has_key ("Wavelet", "Median")) { - wavelet.median = keyFile.get_boolean ("Wavelet", "Median"); - - if (pedited) { - pedited->wavelet.median = true; - } - } - - if (keyFile.has_key ("Wavelet", "Medianlev")) { - wavelet.medianlev = keyFile.get_boolean ("Wavelet", "Medianlev"); - - if (pedited) { - pedited->wavelet.medianlev = true; - } - } - - if (keyFile.has_key ("Wavelet", "Linkedg")) { - wavelet.linkedg = keyFile.get_boolean ("Wavelet", "Linkedg"); - - if (pedited) { - pedited->wavelet.linkedg = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBenab")) { - wavelet.cbenab = keyFile.get_boolean ("Wavelet", "CBenab"); - - if (pedited) { - pedited->wavelet.cbenab = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBgreenhigh")) { - wavelet.greenhigh = keyFile.get_integer ("Wavelet", "CBgreenhigh"); - - if (pedited) { - pedited->wavelet.greenhigh = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBgreenmed")) { - wavelet.greenmed = keyFile.get_integer ("Wavelet", "CBgreenmed"); - - if (pedited) { - pedited->wavelet.greenmed = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBgreenlow")) { - wavelet.greenlow = keyFile.get_integer ("Wavelet", "CBgreenlow"); - - if (pedited) { - pedited->wavelet.greenlow = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBbluehigh")) { - wavelet.bluehigh = keyFile.get_integer ("Wavelet", "CBbluehigh"); - - if (pedited) { - pedited->wavelet.bluehigh = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBbluemed")) { - wavelet.bluemed = keyFile.get_integer ("Wavelet", "CBbluemed"); - - if (pedited) { - pedited->wavelet.bluemed = true; - } - } - - if (keyFile.has_key ("Wavelet", "CBbluelow")) { - wavelet.bluelow = keyFile.get_integer ("Wavelet", "CBbluelow"); - - if (pedited) { - pedited->wavelet.bluelow = true; - } - } - -// if (keyFile.has_key ("Wavelet", "Edgreinf")) {wavelet.edgreinf = keyFile.get_boolean ("Wavelet", "Edgreinf");if (pedited) pedited->wavelet.edgreinf = true;} - if (keyFile.has_key ("Wavelet", "Lipst")) { - wavelet.lipst = keyFile.get_boolean ("Wavelet", "Lipst"); - - if (pedited) { - pedited->wavelet.lipst = true; - } - } - - if (keyFile.has_key ("Wavelet", "AvoidColorShift")) { - wavelet.avoid = keyFile.get_boolean ("Wavelet", "AvoidColorShift"); - - if (pedited) { - pedited->wavelet.avoid = true; - } - } - - if (keyFile.has_key ("Wavelet", "TMr")) { - wavelet.tmr = keyFile.get_boolean ("Wavelet", "TMr"); - - if (pedited) { - pedited->wavelet.tmr = true; - } - } - - if (keyFile.has_key ("Wavelet", "LevMethod")) { - wavelet.Lmethod = keyFile.get_string ("Wavelet", "LevMethod"); - - if (pedited) { - pedited->wavelet.Lmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "ChoiceLevMethod")) { - wavelet.CLmethod = keyFile.get_string ("Wavelet", "ChoiceLevMethod"); - - if (pedited) { - pedited->wavelet.CLmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "BackMethod")) { - wavelet.Backmethod = keyFile.get_string ("Wavelet", "BackMethod"); - - if (pedited) { - pedited->wavelet.Backmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "TilesMethod")) { - wavelet.Tilesmethod = keyFile.get_string ("Wavelet", "TilesMethod"); - - if (pedited) { - pedited->wavelet.Tilesmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "DaubMethod")) { - wavelet.daubcoeffmethod = keyFile.get_string ("Wavelet", "DaubMethod"); - - if (pedited) { - pedited->wavelet.daubcoeffmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "CHromaMethod")) { - wavelet.CHmethod = keyFile.get_string ("Wavelet", "CHromaMethod"); - - if (pedited) { - pedited->wavelet.CHmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "Medgreinf")) { - wavelet.Medgreinf = keyFile.get_string ("Wavelet", "Medgreinf"); - - if (pedited) { - pedited->wavelet.Medgreinf = true; - } - } - - if (keyFile.has_key ("Wavelet", "CHSLromaMethod")) { - wavelet.CHSLmethod = keyFile.get_string ("Wavelet", "CHSLromaMethod"); - - if (pedited) { - pedited->wavelet.CHSLmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "EDMethod")) { - wavelet.EDmethod = keyFile.get_string ("Wavelet", "EDMethod"); - - if (pedited) { - pedited->wavelet.EDmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "NPMethod")) { - wavelet.NPmethod = keyFile.get_string ("Wavelet", "NPMethod"); - - if (pedited) { - pedited->wavelet.NPmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "BAMethod")) { - wavelet.BAmethod = keyFile.get_string ("Wavelet", "BAMethod"); - - if (pedited) { - pedited->wavelet.BAmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "TMMethod")) { - wavelet.TMmethod = keyFile.get_string ("Wavelet", "TMMethod"); - - if (pedited) { - pedited->wavelet.TMmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "HSMethod")) { - wavelet.HSmethod = keyFile.get_string ("Wavelet", "HSMethod"); - - if (pedited) { - pedited->wavelet.HSmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "DirMethod")) { - wavelet.Dirmethod = keyFile.get_string ("Wavelet", "DirMethod"); - - if (pedited) { - pedited->wavelet.Dirmethod = true; - } - } - - if (keyFile.has_key ("Wavelet", "ResidualcontShadow")) { - wavelet.rescon = keyFile.get_integer ("Wavelet", "ResidualcontShadow"); - - if (pedited) { - pedited->wavelet.rescon = true; - } - } - - if (keyFile.has_key ("Wavelet", "ResidualcontHighlight")) { - wavelet.resconH = keyFile.get_integer ("Wavelet", "ResidualcontHighlight"); - - if (pedited) { - pedited->wavelet.resconH = true; - } - } - - if (keyFile.has_key ("Wavelet", "Residualchroma")) { - wavelet.reschro = keyFile.get_integer ("Wavelet", "Residualchroma"); - - if (pedited) { - pedited->wavelet.reschro = true; - } - } - - if (keyFile.has_key ("Wavelet", "ResidualTM")) { - wavelet.tmrs = keyFile.get_double ("Wavelet", "ResidualTM"); - - if (pedited) { - pedited->wavelet.tmrs = true; - } - } - - if (keyFile.has_key ("Wavelet", "Residualgamma")) { - wavelet.gamma = keyFile.get_double ("Wavelet", "Residualgamma"); - - if (pedited) { - pedited->wavelet.gamma = true; - } - } - - if (keyFile.has_key ("Wavelet", "ContExtra")) { - wavelet.sup = keyFile.get_integer ("Wavelet", "ContExtra"); - - if (pedited) { - pedited->wavelet.sup = true; - } - } - - if (keyFile.has_key ("Wavelet", "HueRangeResidual")) { - wavelet.sky = keyFile.get_double ("Wavelet", "HueRangeResidual"); - - if (pedited) { - pedited->wavelet.sky = true; - } - } - - if (keyFile.has_key ("Wavelet", "MaxLev")) { - wavelet.thres = keyFile.get_integer ("Wavelet", "MaxLev"); - - if (pedited) { - pedited->wavelet.thres = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThresholdHighLight")) { - wavelet.threshold = keyFile.get_integer ("Wavelet", "ThresholdHighLight"); - - if (pedited) { - pedited->wavelet.threshold = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThresholdShadow")) { - wavelet.threshold2 = keyFile.get_integer ("Wavelet", "ThresholdShadow"); - - if (pedited) { - pedited->wavelet.threshold2 = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgedetect")) { - wavelet.edgedetect = keyFile.get_integer ("Wavelet", "Edgedetect"); - - if (pedited) { - pedited->wavelet.edgedetect = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgedetectthr")) { - wavelet.edgedetectthr = keyFile.get_integer ("Wavelet", "Edgedetectthr"); - - if (pedited) { - pedited->wavelet.edgedetectthr = true; - } - } - - if (keyFile.has_key ("Wavelet", "EdgedetectthrHi")) { - wavelet.edgedetectthr2 = keyFile.get_integer ("Wavelet", "EdgedetectthrHi"); - - if (pedited) { - pedited->wavelet.edgedetectthr2 = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgesensi")) { - wavelet.edgesensi = keyFile.get_integer ("Wavelet", "Edgesensi"); - - if (pedited) { - pedited->wavelet.edgesensi = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgeampli")) { - wavelet.edgeampli = keyFile.get_integer ("Wavelet", "Edgeampli"); - - if (pedited) { - pedited->wavelet.edgeampli = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThresholdChroma")) { - wavelet.chroma = keyFile.get_integer ("Wavelet", "ThresholdChroma"); - - if (pedited) { - pedited->wavelet.chroma = true; - } - } - - if (keyFile.has_key ("Wavelet", "ChromaLink")) { - wavelet.chro = keyFile.get_integer ("Wavelet", "ChromaLink"); - - if (pedited) { - pedited->wavelet.chro = true; - } - } - - if (keyFile.has_key ("Wavelet", "Contrast")) { - wavelet.contrast = keyFile.get_integer ("Wavelet", "Contrast"); - - if (pedited) { - pedited->wavelet.contrast = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgrad")) { - wavelet.edgrad = keyFile.get_integer ("Wavelet", "Edgrad"); - - if (pedited) { - pedited->wavelet.edgrad = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgval")) { - wavelet.edgval = keyFile.get_integer ("Wavelet", "Edgval"); - - if (pedited) { - pedited->wavelet.edgval = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThrEdg")) { - wavelet.edgthresh = keyFile.get_integer ("Wavelet", "ThrEdg"); - - if (pedited) { - pedited->wavelet.edgthresh = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThresholdResidShadow")) { - wavelet.thr = keyFile.get_integer ("Wavelet", "ThresholdResidShadow"); - - if (pedited) { - pedited->wavelet.thr = true; - } - } - - if (keyFile.has_key ("Wavelet", "ThresholdResidHighLight")) { - wavelet.thrH = keyFile.get_integer ("Wavelet", "ThresholdResidHighLight"); - - if (pedited) { - pedited->wavelet.thrH = true; - } - } - - if (keyFile.has_key ("Wavelet", "ContrastCurve")) { - wavelet.ccwcurve = keyFile.get_double_list ("Wavelet", "ContrastCurve"); - avoidEmptyCurve (wavelet.ccwcurve); - - if (pedited) { - pedited->wavelet.ccwcurve = true; - } - } - - if (keyFile.has_key ("Wavelet", "OpacityCurveRG")) { - wavelet.opacityCurveRG = keyFile.get_double_list ("Wavelet", "OpacityCurveRG"); - avoidEmptyCurve (wavelet.opacityCurveRG); - - if (pedited) { - pedited->wavelet.opacityCurveRG = true; - } - } - - if (keyFile.has_key ("Wavelet", "OpacityCurveBY")) { - wavelet.opacityCurveBY = keyFile.get_double_list ("Wavelet", "OpacityCurveBY"); - avoidEmptyCurve (wavelet.opacityCurveBY); - - if (pedited) { - pedited->wavelet.opacityCurveBY = true; - } - } - - if (keyFile.has_key ("Wavelet", "OpacityCurveW")) { - wavelet.opacityCurveW = keyFile.get_double_list ("Wavelet", "OpacityCurveW"); - avoidEmptyCurve (wavelet.opacityCurveW); - - if (pedited) { - pedited->wavelet.opacityCurveW = true; - } - } - - if (keyFile.has_key ("Wavelet", "OpacityCurveWL")) { - wavelet.opacityCurveWL = keyFile.get_double_list ("Wavelet", "OpacityCurveWL"); - avoidEmptyCurve (wavelet.opacityCurveWL); - - if (pedited) { - pedited->wavelet.opacityCurveWL = true; - } - } - - if (keyFile.has_key ("Wavelet", "HHcurve")) { - wavelet.hhcurve = keyFile.get_double_list ("Wavelet", "HHcurve"); - avoidEmptyCurve (wavelet.hhcurve); - - if (pedited) { - pedited->wavelet.hhcurve = true; - } - } - - if (keyFile.has_key ("Wavelet", "CHcurve")) { - wavelet.Chcurve = keyFile.get_double_list ("Wavelet", "CHcurve"); - avoidEmptyCurve (wavelet.Chcurve); - - if (pedited) { - pedited->wavelet.Chcurve = true; - } - } - - if (keyFile.has_key ("Wavelet", "WavclCurve")) { - wavelet.wavclCurve = keyFile.get_double_list ("Wavelet", "WavclCurve"); - avoidEmptyCurve (wavelet.wavclCurve); - - if (pedited) { - pedited->wavelet.wavclCurve = true; - } - } - - if (keyFile.has_key ("Wavelet", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Hueskin"); - - if (thresh.size() >= 4) { - wavelet.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hueskin = true; - } - } - - if (keyFile.has_key ("Wavelet", "HueRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HueRange"); - - if (thresh.size() >= 4) { - wavelet.hueskin2.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hueskin2 = true; - } - } - - if (keyFile.has_key ("Wavelet", "HLRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HLRange"); - - if (thresh.size() >= 4) { - wavelet.hllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.hllev = true; - } - } - - if (keyFile.has_key ("Wavelet", "SHRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "SHRange"); - - if (thresh.size() >= 4) { - wavelet.bllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.bllev = true; - } - } - - if (keyFile.has_key ("Wavelet", "Edgcont")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Edgcont"); - - if (thresh.size() >= 4) { - wavelet.edgcont.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.edgcont = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level0noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level0noise"); - - if (thresh.size() >= 2) { - wavelet.level0noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level0noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level1noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level1noise"); - - if (thresh.size() >= 2) { - wavelet.level1noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level1noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level2noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level2noise"); - - if (thresh.size() >= 2) { - wavelet.level2noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level2noise = true; - } - } - - if (keyFile.has_key ("Wavelet", "Level3noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); - - if (thresh.size() >= 2) { - wavelet.level3noise.setValues (thresh[0], thresh[1]); - } - - if (pedited) { - pedited->wavelet.level3noise = true; - } - } - - - if (keyFile.has_key ("Wavelet", "Pastlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); - - if (thresh.size() >= 4) { - wavelet.pastlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.pastlev = true; - } - } - - if (keyFile.has_key ("Wavelet", "Satlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Satlev"); - - if (thresh.size() >= 4) { - wavelet.satlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } - - if (pedited) { - pedited->wavelet.satlev = true; - } - } +Glib::ustring RAWParams::XTransSensor::getMethodString(Method method) +{ + return getMethodStrings()[toUnderlying(method)]; +} +RAWParams::RAWParams() : + df_autoselect(false), + ff_AutoSelect(false), + ff_BlurRadius(32), + ff_BlurType(getFlatFieldBlurTypeString(FlatFieldBlurType::AREA)), + ff_AutoClipControl(false), + ff_clipControl(0), + ca_autocorrect(false), + cared(0.0), + cablue(0.0), + expos(1.0), + preser(0.0), + hotPixelFilter(false), + deadPixelFilter(false), + hotdeadpix_thresh(100) +{ +} - if (keyFile.has_key ("Wavelet", "Skinprotect")) { - wavelet.skinprotect = keyFile.get_double ("Wavelet", "Skinprotect"); +bool RAWParams::operator ==(const RAWParams& other) const +{ + return + bayersensor == other.bayersensor + && xtranssensor == other.xtranssensor + && dark_frame == other.dark_frame + && df_autoselect == other.df_autoselect + && ff_file == other.ff_file + && ff_AutoSelect == other.ff_AutoSelect + && ff_BlurRadius == other.ff_BlurRadius + && ff_BlurType == other.ff_BlurType + && ff_AutoClipControl == other.ff_AutoClipControl + && ff_clipControl == other.ff_clipControl + && ca_autocorrect == other.ca_autocorrect + && cared == other.cared + && cablue == other.cablue + && expos == other.expos + && preser == other.preser + && hotPixelFilter == other.hotPixelFilter + && deadPixelFilter == other.deadPixelFilter + && hotdeadpix_thresh == other.hotdeadpix_thresh; +} - if (pedited) { - pedited->wavelet.skinprotect = true; - } - } +bool RAWParams::operator !=(const RAWParams& other) const +{ + return !(*this == other); +} - if (keyFile.has_key ("Wavelet", "Expcontrast")) { - wavelet.expcontrast = keyFile.get_boolean ("Wavelet", "Expcontrast"); +const std::vector& RAWParams::getFlatFieldBlurTypeStrings() +{ + static const std::vector blur_type_strings { + "Area Flatfield", + "Vertical Flatfield", + "Horizontal Flatfield", + "V+H Flatfield" + }; + return blur_type_strings; +} - if (pedited) { - pedited->wavelet.expcontrast = true; - } - } +Glib::ustring RAWParams::getFlatFieldBlurTypeString(FlatFieldBlurType type) +{ + return getFlatFieldBlurTypeStrings()[toUnderlying(type)]; +} - if (keyFile.has_key ("Wavelet", "Expchroma")) { - wavelet.expchroma = keyFile.get_boolean ("Wavelet", "Expchroma"); - if (pedited) { - pedited->wavelet.expchroma = true; - } - } +MetaDataParams::MetaDataParams(): + mode(MetaDataParams::TUNNEL) +{ +} - for (int i = 0; i < 9; i ++) { - std::stringstream ss; - ss << "Contrast" << (i + 1); +bool MetaDataParams::operator==(const MetaDataParams &other) const +{ + return mode == other.mode; +} - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.c[i] = keyFile.get_integer ("Wavelet", ss.str()); +bool MetaDataParams::operator!=(const MetaDataParams &other) const +{ + return !(*this == other); +} - if (pedited) { - pedited->wavelet.c[i] = true; - } - } - } - for (int i = 0; i < 9; i ++) { - std::stringstream ss; - ss << "Chroma" << (i + 1); +ProcParams::ProcParams () +{ + setDefaults (); +} - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); +void ProcParams::setDefaults () +{ + toneCurve = ToneCurveParams(); - if (pedited) { - pedited->wavelet.ch[i] = true; - } - } - } + labCurve = LCurveParams(); - if (keyFile.has_key ("Wavelet", "Expedge")) { - wavelet.expedge = keyFile.get_boolean ("Wavelet", "Expedge"); + rgbCurves = RGBCurvesParams(); - if (pedited) { - pedited->wavelet.expedge = true; - } - } + localContrast = LocalContrastParams(); - if (keyFile.has_key ("Wavelet", "Expresid")) { - wavelet.expresid = keyFile.get_boolean ("Wavelet", "Expresid"); + colorToning = ColorToningParams(); - if (pedited) { - pedited->wavelet.expresid = true; - } - } + sharpenEdge = SharpenEdgeParams(); - if (keyFile.has_key ("Wavelet", "Expfinal")) { - wavelet.expfinal = keyFile.get_boolean ("Wavelet", "Expfinal"); + sharpenMicro = SharpenMicroParams(); - if (pedited) { - pedited->wavelet.expfinal = true; - } - } + sharpening = SharpeningParams(); - if (keyFile.has_key ("Wavelet", "Exptoning")) { - wavelet.exptoning = keyFile.get_boolean ("Wavelet", "Exptoning"); + prsharpening = SharpeningParams(); + prsharpening.method = "rld"; + prsharpening.deconvamount = 100; + prsharpening.deconvradius = 0.45; + prsharpening.deconviter = 100; + prsharpening.deconvdamping = 0; - if (pedited) { - pedited->wavelet.exptoning = true; - } - } + vibrance = VibranceParams(); - if (keyFile.has_key ("Wavelet", "Expnoise")) { - wavelet.expnoise = keyFile.get_boolean ("Wavelet", "Expnoise"); + wb = WBParams(); - if (pedited) { - pedited->wavelet.expnoise = true; - } - } + colorappearance = ColorAppearanceParams(); + defringe = DefringeParams(); - } + impulseDenoise = ImpulseDenoiseParams(); -// load directional pyramid equalizer parameters - if (keyFile.has_group ("Directional Pyramid Equalizer")) { - if (keyFile.has_key ("Directional Pyramid Equalizer", "Enabled")) { - dirpyrequalizer.enabled = keyFile.get_boolean ("Directional Pyramid Equalizer", "Enabled"); + dirpyrDenoise = DirPyrDenoiseParams(); - if (pedited) { - pedited->dirpyrequalizer.enabled = true; - } - } + epd = EPDParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", "Gamutlab")) { - dirpyrequalizer.gamutlab = keyFile.get_boolean ("Directional Pyramid Equalizer", "Gamutlab"); + fattal = FattalToneMappingParams(); - if (pedited) { - pedited->dirpyrequalizer.gamutlab = true; - } - } + sh = SHParams(); + crop = CropParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", "cbdlMethod")) { - dirpyrequalizer.cbdlMethod = keyFile.get_string ("Directional Pyramid Equalizer", "cbdlMethod"); + coarse = CoarseTransformParams(); - if (pedited) { - pedited->dirpyrequalizer.cbdlMethod = true; - } - } + commonTrans = CommonTransformParams(); + rotate = RotateParams(); -// if (keyFile.has_key ("Directional Pyramid Equalizer", "Algorithm")) { dirpyrequalizer.algo = keyFile.get_string ("Directional Pyramid Equalizer", "Algorithm"); if (pedited) pedited->dirpyrequalizer.algo = true; } - if (keyFile.has_key ("Directional Pyramid Equalizer", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Directional Pyramid Equalizer", "Hueskin"); + distortion = DistortionParams(); - if (thresh.size() >= 4) { - dirpyrequalizer.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); - } + lensProf = LensProfParams(); - if (pedited) { - pedited->dirpyrequalizer.hueskin = true; - } - } + perspective = PerspectiveParams(); - if (ppVersion < 316) { - for (int i = 0; i < 5; i ++) { - std::stringstream ss; - ss << "Mult" << i; + gradient = GradientParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { - if (i == 4) { - dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + pcvignette = PCVignetteParams(); - if (pedited) { - pedited->dirpyrequalizer.threshold = true; - } - } else { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + vignetting = VignettingParams(); - if (pedited) { - pedited->dirpyrequalizer.mult[i] = true; - } - } - } - } + chmixer = ChannelMixerParams(); - dirpyrequalizer.mult[4] = 1.0; - } else { -// 5 level wavelet + dedicated threshold parameter - for (int i = 0; i < 6; i ++) { - std::stringstream ss; - ss << "Mult" << i; + blackwhite = BlackWhiteParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + cacorrection = CACorrParams(); - if (pedited) { - pedited->dirpyrequalizer.mult[i] = true; - } - } - } + resize = ResizeParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", "Threshold")) { - dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", "Threshold"); + icm = ColorManagementParams(); - if (pedited) { - pedited->dirpyrequalizer.threshold = true; - } - } + wavelet = WaveletParams(); - if (keyFile.has_key ("Directional Pyramid Equalizer", "Skinprotect")) { - dirpyrequalizer.skinprotect = keyFile.get_double ("Directional Pyramid Equalizer", "Skinprotect"); + dirpyrequalizer = DirPyrEqualizerParams(); - if (pedited) { - pedited->dirpyrequalizer.skinprotect = true; - } - } - } - } + hsvequalizer = HSVEqualizerParams(); -// load CLUT parameters - if ( keyFile.has_group ( "Film Simulation" ) ) { - if ( keyFile.has_key ( "Film Simulation", "Enabled" ) ) { - filmSimulation.enabled = keyFile.get_boolean ( "Film Simulation", "Enabled" ); + filmSimulation = FilmSimulationParams(); - if ( pedited ) { - pedited->filmSimulation.enabled = true; - } - } + raw = RAWParams(); - if ( keyFile.has_key ( "Film Simulation", "ClutFilename" ) ) { - filmSimulation.clutFilename = keyFile.get_string ( "Film Simulation", "ClutFilename" ); + metadata = MetaDataParams(); + exif.clear (); + iptc.clear (); - if ( pedited ) { - pedited->filmSimulation.clutFilename = true; - } - } + rank = 0; + colorlabel = 0; + inTrash = false; - if ( keyFile.has_key ( "Film Simulation", "Strength" ) ) { - if (ppVersion < 321) { - filmSimulation.strength = int (keyFile.get_double ( "Film Simulation", "Strength" ) * 100 + 0.1); - } else { - filmSimulation.strength = keyFile.get_integer ( "Film Simulation", "Strength" ); - } + ppVersion = PPVERSION; +} - if ( pedited ) { - pedited->filmSimulation.strength = true; - } - } - } +int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bool fnameAbsolute, ParamsEdited* pedited) +{ + if (fname.empty () && fname2.empty ()) { + return 0; + } -// load HSV wavelet parameters - if (keyFile.has_group ("HSV Equalizer")) { - if (ppVersion >= 300) { - if (keyFile.has_key ("HSV Equalizer", "HCurve")) { - hsvequalizer.hcurve = keyFile.get_double_list ("HSV Equalizer", "HCurve"); - avoidEmptyCurve (hsvequalizer.hcurve); + Glib::ustring sPParams; - if (pedited) { - pedited->hsvequalizer.hcurve = true; - } - } + try { + Glib::KeyFile keyFile; - if (keyFile.has_key ("HSV Equalizer", "SCurve")) { - hsvequalizer.scurve = keyFile.get_double_list ("HSV Equalizer", "SCurve"); - avoidEmptyCurve (hsvequalizer.scurve); +// Version + keyFile.set_string ("Version", "AppVersion", RTVERSION); + keyFile.set_integer ("Version", "Version", PPVERSION); - if (pedited) { - pedited->hsvequalizer.scurve = true; - } - } + saveToKeyfile(!pedited || pedited->general.rank, "General", "Rank", rank, keyFile); + saveToKeyfile(!pedited || pedited->general.colorlabel, "General", "ColorLabel", colorlabel, keyFile); + saveToKeyfile(!pedited || pedited->general.intrash, "General", "InTrash", inTrash, keyFile); + +// Tone curve + saveToKeyfile(!pedited || pedited->toneCurve.autoexp, "Exposure", "Auto", toneCurve.autoexp, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.clip, "Exposure", "Clip", toneCurve.clip, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.expcomp, "Exposure", "Compensation", toneCurve.expcomp, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.brightness, "Exposure", "Brightness", toneCurve.brightness, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.contrast, "Exposure", "Contrast", toneCurve.contrast, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.saturation, "Exposure", "Saturation", toneCurve.saturation, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.black, "Exposure", "Black", toneCurve.black, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlcompr, "Exposure", "HighlightCompr", toneCurve.hlcompr, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.hlcomprthresh, "Exposure", "HighlightComprThreshold", toneCurve.hlcomprthresh, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.shcompr, "Exposure", "ShadowCompr", toneCurve.shcompr, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.histmatching, "Exposure", "HistogramMatching", toneCurve.histmatching, keyFile); + +// Highlight recovery + saveToKeyfile(!pedited || pedited->toneCurve.hrenabled, "HLRecovery", "Enabled", toneCurve.hrenabled, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.method, "HLRecovery", "Method", toneCurve.method, keyFile); + + const std::map tc_mapping = { + {ToneCurveParams::TcMode::STD, "Standard"}, + {ToneCurveParams::TcMode::FILMLIKE, "FilmLike"}, + {ToneCurveParams::TcMode::SATANDVALBLENDING, "SatAndValueBlending"}, + {ToneCurveParams::TcMode::WEIGHTEDSTD,"WeightedStd"}, + {ToneCurveParams::TcMode::LUMINANCE, "Luminance"}, + {ToneCurveParams::TcMode::PERCEPTUAL, "Perceptual"} + }; + + saveToKeyfile(!pedited || pedited->toneCurve.curveMode, "Exposure", "CurveMode", tc_mapping, toneCurve.curveMode, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.curveMode2, "Exposure", "CurveMode2", tc_mapping, toneCurve.curveMode2, keyFile); + + saveToKeyfile(!pedited || pedited->toneCurve.curve, "Exposure", "Curve", toneCurve.curve, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.curve2, "Exposure", "Curve2", toneCurve.curve2, keyFile); + +// Retinex + saveToKeyfile(!pedited || pedited->retinex.enabled, "Retinex", "Enabled", retinex.enabled, keyFile); + saveToKeyfile(!pedited || pedited->retinex.str, "Retinex", "Str", retinex.str, keyFile); + saveToKeyfile(!pedited || pedited->retinex.scal, "Retinex", "Scal", retinex.scal, keyFile); + saveToKeyfile(!pedited || pedited->retinex.iter, "Retinex", "Iter", retinex.iter, keyFile); + saveToKeyfile(!pedited || pedited->retinex.grad, "Retinex", "Grad", retinex.grad, keyFile); + saveToKeyfile(!pedited || pedited->retinex.grads, "Retinex", "Grads", retinex.grads, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gam, "Retinex", "Gam", retinex.gam, keyFile); + saveToKeyfile(!pedited || pedited->retinex.slope, "Retinex", "Slope", retinex.slope, keyFile); + saveToKeyfile(!pedited || pedited->retinex.medianmap, "Retinex", "Median", retinex.medianmap, keyFile); + + saveToKeyfile(!pedited || pedited->retinex.neigh, "Retinex", "Neigh", retinex.neigh, keyFile); + saveToKeyfile(!pedited || pedited->retinex.offs, "Retinex", "Offs", retinex.offs, keyFile); + saveToKeyfile(!pedited || pedited->retinex.vart, "Retinex", "Vart", retinex.vart, keyFile); + saveToKeyfile(!pedited || pedited->retinex.limd, "Retinex", "Limd", retinex.limd, keyFile); + saveToKeyfile(!pedited || pedited->retinex.highl, "Retinex", "highl", retinex.highl, keyFile); + saveToKeyfile(!pedited || pedited->retinex.skal, "Retinex", "skal", retinex.skal, keyFile); + saveToKeyfile(!pedited || pedited->retinex.retinexMethod, "Retinex", "RetinexMethod", retinex.retinexMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.mapMethod, "Retinex", "mapMethod", retinex.mapMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.viewMethod, "Retinex", "viewMethod", retinex.viewMethod, keyFile); + saveToKeyfile(!pedited || pedited->retinex.retinexcolorspace, "Retinex", "Retinexcolorspace", retinex.retinexcolorspace, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gammaretinex, "Retinex", "Gammaretinex", retinex.gammaretinex, keyFile); + saveToKeyfile(!pedited || pedited->retinex.cdcurve, "Retinex", "CDCurve", retinex.cdcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.mapcurve, "Retinex", "MAPCurve", retinex.mapcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.cdHcurve, "Retinex", "CDHCurve", retinex.cdHcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.lhcurve, "Retinex", "LHCurve", retinex.lhcurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.highlights, "Retinex", "Highlights", retinex.highlights, keyFile); + saveToKeyfile(!pedited || pedited->retinex.htonalwidth, "Retinex", "HighlightTonalWidth", retinex.htonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->retinex.shadows, "Retinex", "Shadows", retinex.shadows, keyFile); + saveToKeyfile(!pedited || pedited->retinex.stonalwidth, "Retinex", "ShadowTonalWidth", retinex.stonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->retinex.radius, "Retinex", "Radius", retinex.radius, keyFile); + saveToKeyfile(!pedited || pedited->retinex.transmissionCurve, "Retinex", "TransmissionCurve", retinex.transmissionCurve, keyFile); + saveToKeyfile(!pedited || pedited->retinex.gaintransmissionCurve, "Retinex", "GainTransmissionCurve", retinex.gaintransmissionCurve, keyFile); + +// Local contrast + saveToKeyfile(!pedited || pedited->localContrast.enabled, "Local Contrast", "Enabled", localContrast.enabled, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.radius, "Local Contrast", "Radius", localContrast.radius, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.amount, "Local Contrast", "Amount", localContrast.amount, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.darkness, "Local Contrast", "Darkness", localContrast.darkness, keyFile); + saveToKeyfile(!pedited || pedited->localContrast.lightness, "Local Contrast", "Lightness", localContrast.lightness, keyFile); - if (keyFile.has_key ("HSV Equalizer", "VCurve")) { - hsvequalizer.vcurve = keyFile.get_double_list ("HSV Equalizer", "VCurve"); - avoidEmptyCurve (hsvequalizer.vcurve); - if (pedited) { - pedited->hsvequalizer.vcurve = true; - } - } - } +// Channel mixer + saveToKeyfile(!pedited || pedited->chmixer.enabled, "Channel Mixer", "Enabled", chmixer.enabled, keyFile); + if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { + Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list ("Channel Mixer", "Red", rmix); } -// load RGB curves - if (keyFile.has_group ("RGB Curves")) { - if (keyFile.has_key ("RGB Curves", "LumaMode")) { - rgbCurves.lumamode = keyFile.get_boolean ("RGB Curves", "LumaMode"); - - if (pedited) { - pedited->rgbCurves.lumamode = true; - } - } + if (!pedited || pedited->chmixer.green[0] || pedited->chmixer.green[1] || pedited->chmixer.green[2]) { + Glib::ArrayHandle gmix (chmixer.green, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list ("Channel Mixer", "Green", gmix); + } - if (keyFile.has_key ("RGB Curves", "rCurve")) { - rgbCurves.rcurve = keyFile.get_double_list ("RGB Curves", "rCurve"); - avoidEmptyCurve (rgbCurves.rcurve); + if (!pedited || pedited->chmixer.blue[0] || pedited->chmixer.blue[1] || pedited->chmixer.blue[2]) { + Glib::ArrayHandle bmix (chmixer.blue, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list ("Channel Mixer", "Blue", bmix); + } - if (pedited) { - pedited->rgbCurves.rcurve = true; - } - } +// Black & White + saveToKeyfile(!pedited || pedited->blackwhite.enabled, "Black & White", "Enabled", blackwhite.enabled, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.method, "Black & White", "Method", blackwhite.method, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.autoc, "Black & White", "Auto", blackwhite.autoc, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.enabledcc, "Black & White", "ComplementaryColors", blackwhite.enabledcc, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.setting, "Black & White", "Setting", blackwhite.setting, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.filter, "Black & White", "Filter", blackwhite.filter, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerRed, "Black & White", "MixerRed", blackwhite.mixerRed, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerOrange, "Black & White", "MixerOrange", blackwhite.mixerOrange, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerYellow, "Black & White", "MixerYellow", blackwhite.mixerYellow, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerGreen, "Black & White", "MixerGreen", blackwhite.mixerGreen, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerCyan, "Black & White", "MixerCyan", blackwhite.mixerCyan, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerBlue, "Black & White", "MixerBlue", blackwhite.mixerBlue, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerMagenta, "Black & White", "MixerMagenta", blackwhite.mixerMagenta, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.mixerPurple, "Black & White", "MixerPurple", blackwhite.mixerPurple, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaRed, "Black & White", "GammaRed", blackwhite.gammaRed, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaGreen, "Black & White", "GammaGreen", blackwhite.gammaGreen, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.gammaBlue, "Black & White", "GammaBlue", blackwhite.gammaBlue, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.algo, "Black & White", "Algorithm", blackwhite.algo, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.luminanceCurve, "Black & White", "LuminanceCurve", blackwhite.luminanceCurve, keyFile); + saveToKeyfile( + !pedited || pedited->blackwhite.beforeCurveMode, + "Black & White", + "BeforeCurveMode", + { + {BlackWhiteParams::TcMode::STD_BW, "Standard"}, + {BlackWhiteParams::TcMode::FILMLIKE_BW, "FilmLike"}, + {BlackWhiteParams::TcMode::SATANDVALBLENDING_BW, "SatAndValueBlending"}, + {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} + + }, + blackwhite.beforeCurveMode, + keyFile + ); + saveToKeyfile( + !pedited || pedited->blackwhite.afterCurveMode, + "Black & White", + "AfterCurveMode", + { + {BlackWhiteParams::TcMode::STD_BW, "Standard"}, + {BlackWhiteParams::TcMode::WEIGHTEDSTD_BW, "WeightedStd"} + + }, + blackwhite.afterCurveMode, + keyFile + ); + saveToKeyfile(!pedited || pedited->blackwhite.beforeCurve, "Black & White", "BeforeCurve", blackwhite.beforeCurve, keyFile); + saveToKeyfile(!pedited || pedited->blackwhite.afterCurve, "Black & White", "AfterCurve", blackwhite.afterCurve, keyFile); + +// Luma curve + saveToKeyfile(!pedited || pedited->labCurve.enabled, "Luminance Curve", "Enabled", labCurve.enabled, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.brightness, "Luminance Curve", "Brightness", labCurve.brightness, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.contrast, "Luminance Curve", "Contrast", labCurve.contrast, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.chromaticity, "Luminance Curve", "Chromaticity", labCurve.chromaticity, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.avoidcolorshift, "Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.rstprotection, "Luminance Curve", "RedAndSkinTonesProtection", labCurve.rstprotection, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lcredsk, "Luminance Curve", "LCredsk", labCurve.lcredsk, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lcurve, "Luminance Curve", "LCurve", labCurve.lcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.acurve, "Luminance Curve", "aCurve", labCurve.acurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.bcurve, "Luminance Curve", "bCurve", labCurve.bcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.cccurve, "Luminance Curve", "ccCurve", labCurve.cccurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.chcurve, "Luminance Curve", "chCurve", labCurve.chcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lhcurve, "Luminance Curve", "lhCurve", labCurve.lhcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.hhcurve, "Luminance Curve", "hhCurve", labCurve.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.lccurve, "Luminance Curve", "LcCurve", labCurve.lccurve, keyFile); + saveToKeyfile(!pedited || pedited->labCurve.clcurve, "Luminance Curve", "ClCurve", labCurve.clcurve, keyFile); + +// Sharpening + saveToKeyfile(!pedited || pedited->sharpening.enabled, "Sharpening", "Enabled", sharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.method, "Sharpening", "Method", sharpening.method, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.radius, "Sharpening", "Radius", sharpening.radius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.amount, "Sharpening", "Amount", sharpening.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.threshold, "Sharpening", "Threshold", sharpening.threshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edgesonly, "Sharpening", "OnlyEdges", sharpening.edgesonly, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edges_radius, "Sharpening", "EdgedetectionRadius", sharpening.edges_radius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.edges_tolerance, "Sharpening", "EdgeTolerance", sharpening.edges_tolerance, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.halocontrol, "Sharpening", "HalocontrolEnabled", sharpening.halocontrol, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.halocontrol_amount, "Sharpening", "HalocontrolAmount", sharpening.halocontrol_amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvradius, "Sharpening", "DeconvRadius", sharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvamount, "Sharpening", "DeconvAmount", sharpening.deconvamount, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconvdamping, "Sharpening", "DeconvDamping", sharpening.deconvdamping, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.deconviter, "Sharpening", "DeconvIterations", sharpening.deconviter, keyFile); + +// Vibrance + saveToKeyfile(!pedited || pedited->vibrance.enabled, "Vibrance", "Enabled", vibrance.enabled, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.pastels, "Vibrance", "Pastels", vibrance.pastels, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.saturated, "Vibrance", "Saturated", vibrance.saturated, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.psthreshold, "Vibrance", "PSThreshold", vibrance.psthreshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->vibrance.protectskins, "Vibrance", "ProtectSkins", vibrance.protectskins, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.avoidcolorshift, "Vibrance", "AvoidColorShift", vibrance.avoidcolorshift, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.pastsattog, "Vibrance", "PastSatTog", vibrance.pastsattog, keyFile); + saveToKeyfile(!pedited || pedited->vibrance.skintonescurve, "Vibrance", "SkinTonesCurve", vibrance.skintonescurve, keyFile); + +// Edge sharpening + saveToKeyfile(!pedited || pedited->sharpenEdge.enabled, "SharpenEdge", "Enabled", sharpenEdge.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.passes, "SharpenEdge", "Passes", sharpenEdge.passes, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.amount, "SharpenEdge", "Strength", sharpenEdge.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpenEdge.threechannels, "SharpenEdge", "ThreeChannels", sharpenEdge.threechannels, keyFile); + +// Micro-contrast sharpening + saveToKeyfile(!pedited || pedited->sharpenMicro.enabled, "SharpenMicro", "Enabled", sharpenMicro.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.matrix, "SharpenMicro", "Matrix", sharpenMicro.matrix, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.amount, "SharpenMicro", "Strength", sharpenMicro.amount, keyFile); + saveToKeyfile(!pedited || pedited->sharpenMicro.uniformity, "SharpenMicro", "Uniformity", sharpenMicro.uniformity, keyFile); + +// WB + saveToKeyfile(!pedited || pedited->wb.enabled, "White Balance", "Enabled", wb.enabled, keyFile); + saveToKeyfile(!pedited || pedited->wb.method, "White Balance", "Setting", wb.method, keyFile); + saveToKeyfile(!pedited || pedited->wb.temperature, "White Balance", "Temperature", wb.temperature, keyFile); + saveToKeyfile(!pedited || pedited->wb.green, "White Balance", "Green", wb.green, keyFile); + saveToKeyfile(!pedited || pedited->wb.equal, "White Balance", "Equal", wb.equal, keyFile); + saveToKeyfile(!pedited || pedited->wb.tempBias, "White Balance", "TemperatureBias", wb.tempBias, keyFile); + +// Colorappearance + saveToKeyfile(!pedited || pedited->colorappearance.enabled, "Color appearance", "Enabled", colorappearance.enabled, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.degree, "Color appearance", "Degree", colorappearance.degree, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autodegree, "Color appearance", "AutoDegree", colorappearance.autodegree, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.degreeout, "Color appearance", "Degreeout", colorappearance.degreeout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autodegreeout, "Color appearance", "AutoDegreeout", colorappearance.autodegreeout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surround, "Color appearance", "Surround", colorappearance.surround, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surrsrc, "Color appearance", "Surrsrc", colorappearance.surrsrc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.adaplum, "Color appearance", "AdaptLum", colorappearance.adaplum, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.badpixsl, "Color appearance", "Badpixsl", colorappearance.badpixsl, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.wbmodel, "Color appearance", "Model", colorappearance.wbmodel, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.algo, "Color appearance", "Algorithm", colorappearance.algo, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.jlight, "Color appearance", "J-Light", colorappearance.jlight, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.qbright, "Color appearance", "Q-Bright", colorappearance.qbright, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.chroma, "Color appearance", "C-Chroma", colorappearance.chroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.schroma, "Color appearance", "S-Chroma", colorappearance.schroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.mchroma, "Color appearance", "M-Chroma", colorappearance.mchroma, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.contrast, "Color appearance", "J-Contrast", colorappearance.contrast, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.qcontrast, "Color appearance", "Q-Contrast", colorappearance.qcontrast, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.colorh, "Color appearance", "H-Hue", colorappearance.colorh, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.rstprotection, "Color appearance", "RSTProtection", colorappearance.rstprotection, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.adapscen, "Color appearance", "AdaptScene", colorappearance.adapscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autoadapscen, "Color appearance", "AutoAdapscen", colorappearance.autoadapscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.ybscen, "Color appearance", "YbScene", colorappearance.ybscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.autoybscen, "Color appearance", "Autoybscen", colorappearance.autoybscen, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.surrsource, "Color appearance", "SurrSource", colorappearance.surrsource, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.gamut, "Color appearance", "Gamut", colorappearance.gamut, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tempout, "Color appearance", "Tempout", colorappearance.tempout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.greenout, "Color appearance", "Greenout", colorappearance.greenout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tempsc, "Color appearance", "Tempsc", colorappearance.tempsc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.greensc, "Color appearance", "Greensc", colorappearance.greensc, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.ybout, "Color appearance", "Ybout", colorappearance.ybout, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.datacie, "Color appearance", "Datacie", colorappearance.datacie, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.tonecie, "Color appearance", "Tonecie", colorappearance.tonecie, keyFile); + + const std::map ca_mapping = { + {ColorAppearanceParams::TcMode::LIGHT, "Lightness"}, + {ColorAppearanceParams::TcMode::BRIGHT, "Brightness"} + }; + + saveToKeyfile(!pedited || pedited->colorappearance.curveMode, "Color appearance", "CurveMode", ca_mapping, colorappearance.curveMode, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curveMode2, "Color appearance", "CurveMode2", ca_mapping, colorappearance.curveMode2, keyFile); + saveToKeyfile( + !pedited || pedited->colorappearance.curveMode3, + "Color appearance", + "CurveMode3", + { + {ColorAppearanceParams::CtcMode::CHROMA, "Chroma"}, + {ColorAppearanceParams::CtcMode::SATUR, "Saturation"}, + {ColorAppearanceParams::CtcMode::COLORF, "Colorfullness"} + + }, + colorappearance.curveMode3, + keyFile + ); + saveToKeyfile(!pedited || pedited->colorappearance.curve, "Color appearance", "Curve", colorappearance.curve, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curve2, "Color appearance", "Curve2", colorappearance.curve2, keyFile); + saveToKeyfile(!pedited || pedited->colorappearance.curve3, "Color appearance", "Curve3", colorappearance.curve3, keyFile); + +// Impulse denoise + saveToKeyfile(!pedited || pedited->impulseDenoise.enabled, "Impulse Denoising", "Enabled", impulseDenoise.enabled, keyFile); + saveToKeyfile(!pedited || pedited->impulseDenoise.thresh, "Impulse Denoising", "Threshold", impulseDenoise.thresh, keyFile); + +// Defringe + saveToKeyfile(!pedited || pedited->defringe.enabled, "Defringing", "Enabled", defringe.enabled, keyFile); + saveToKeyfile(!pedited || pedited->defringe.radius, "Defringing", "Radius", defringe.radius, keyFile); + saveToKeyfile(!pedited || pedited->defringe.threshold, "Defringing", "Threshold", defringe.threshold, keyFile); + saveToKeyfile(!pedited || pedited->defringe.huecurve, "Defringing", "HueCurve", defringe.huecurve, keyFile); + +// Directional pyramid denoising + saveToKeyfile(!pedited || pedited->dirpyrDenoise.enabled, "Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.enhance, "Directional Pyramid Denoising", "Enhance", dirpyrDenoise.enhance, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.median, "Directional Pyramid Denoising", "Median", dirpyrDenoise.median, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.luma, "Directional Pyramid Denoising", "Luma", dirpyrDenoise.luma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Ldetail, "Directional Pyramid Denoising", "Ldetail", dirpyrDenoise.Ldetail, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.chroma, "Directional Pyramid Denoising", "Chroma", dirpyrDenoise.chroma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.dmethod, "Directional Pyramid Denoising", "Method", dirpyrDenoise.dmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Lmethod, "Directional Pyramid Denoising", "LMethod", dirpyrDenoise.Lmethod, keyFile); + if (dirpyrDenoise.Cmethod == "PRE") { + dirpyrDenoise.Cmethod = "MAN"; // Never save 'auto chroma preview mode' to pp3 + } + saveToKeyfile(!pedited || pedited->dirpyrDenoise.Cmethod, "Directional Pyramid Denoising", "CMethod", dirpyrDenoise.Cmethod, keyFile); + if (dirpyrDenoise.C2method == "PREV") { + dirpyrDenoise.C2method = "MANU"; + } + saveToKeyfile(!pedited || pedited->dirpyrDenoise.C2method, "Directional Pyramid Denoising", "C2Method", dirpyrDenoise.C2method, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.smethod, "Directional Pyramid Denoising", "SMethod", dirpyrDenoise.smethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.medmethod, "Directional Pyramid Denoising", "MedMethod", dirpyrDenoise.medmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.rgbmethod, "Directional Pyramid Denoising", "RGBMethod", dirpyrDenoise.rgbmethod, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.methodmed, "Directional Pyramid Denoising", "MethodMed", dirpyrDenoise.methodmed, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.redchro, "Directional Pyramid Denoising", "Redchro", dirpyrDenoise.redchro, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.bluechro, "Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.gamma, "Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.passes, "Directional Pyramid Denoising", "Passes", dirpyrDenoise.passes, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.lcurve, "Directional Pyramid Denoising", "LCurve", dirpyrDenoise.lcurve, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrDenoise.cccurve, "Directional Pyramid Denoising", "CCCurve", dirpyrDenoise.cccurve, keyFile); + +// EPD + saveToKeyfile(!pedited || pedited->epd.enabled, "EPD", "Enabled", epd.enabled, keyFile); + saveToKeyfile(!pedited || pedited->epd.strength, "EPD", "Strength", epd.strength, keyFile); + saveToKeyfile(!pedited || pedited->epd.gamma, "EPD", "Gamma", epd.gamma, keyFile); + saveToKeyfile(!pedited || pedited->epd.edgeStopping, "EPD", "EdgeStopping", epd.edgeStopping, keyFile); + saveToKeyfile(!pedited || pedited->epd.scale, "EPD", "Scale", epd.scale, keyFile); + saveToKeyfile(!pedited || pedited->epd.reweightingIterates, "EPD", "ReweightingIterates", epd.reweightingIterates, keyFile); + +// Fattal + saveToKeyfile(!pedited || pedited->fattal.enabled, "FattalToneMapping", "Enabled", fattal.enabled, keyFile); + saveToKeyfile(!pedited || pedited->fattal.threshold, "FattalToneMapping", "Threshold", fattal.threshold, keyFile); + saveToKeyfile(!pedited || pedited->fattal.amount, "FattalToneMapping", "Amount", fattal.amount, keyFile); + saveToKeyfile(!pedited || pedited->fattal.anchor, "FattalToneMapping", "Anchor", fattal.anchor, keyFile); + +// Shadows & highlights + saveToKeyfile(!pedited || pedited->sh.enabled, "Shadows & Highlights", "Enabled", sh.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sh.hq, "Shadows & Highlights", "HighQuality", sh.hq, keyFile); + saveToKeyfile(!pedited || pedited->sh.highlights, "Shadows & Highlights", "Highlights", sh.highlights, keyFile); + saveToKeyfile(!pedited || pedited->sh.htonalwidth, "Shadows & Highlights", "HighlightTonalWidth", sh.htonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->sh.shadows, "Shadows & Highlights", "Shadows", sh.shadows, keyFile); + saveToKeyfile(!pedited || pedited->sh.stonalwidth, "Shadows & Highlights", "ShadowTonalWidth", sh.stonalwidth, keyFile); + saveToKeyfile(!pedited || pedited->sh.radius, "Shadows & Highlights", "Radius", sh.radius, keyFile); + +// Crop + saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile); + saveToKeyfile(!pedited || pedited->crop.x, "Crop", "X", crop.x, keyFile); + saveToKeyfile(!pedited || pedited->crop.y, "Crop", "Y", crop.y, keyFile); + saveToKeyfile(!pedited || pedited->crop.w, "Crop", "W", crop.w, keyFile); + saveToKeyfile(!pedited || pedited->crop.h, "Crop", "H", crop.h, keyFile); + saveToKeyfile(!pedited || pedited->crop.fixratio, "Crop", "FixedRatio", crop.fixratio, keyFile); + saveToKeyfile(!pedited || pedited->crop.ratio, "Crop", "Ratio", crop.ratio, keyFile); + saveToKeyfile(!pedited || pedited->crop.orientation, "Crop", "Orientation", crop.orientation, keyFile); + saveToKeyfile(!pedited || pedited->crop.guide, "Crop", "Guide", crop.guide, keyFile); + +// Coarse transformation + saveToKeyfile(!pedited || pedited->coarse.rotate, "Coarse Transformation", "Rotate", coarse.rotate, keyFile); + saveToKeyfile(!pedited || pedited->coarse.hflip, "Coarse Transformation", "HorizontalFlip", coarse.hflip, keyFile); + saveToKeyfile(!pedited || pedited->coarse.vflip, "Coarse Transformation", "VerticalFlip", coarse.vflip, keyFile); + +// Common properties for transformations + saveToKeyfile(!pedited || pedited->commonTrans.autofill, "Common Properties for Transformations", "AutoFill", commonTrans.autofill, keyFile); + +// Rotation + saveToKeyfile(!pedited || pedited->rotate.degree, "Rotation", "Degree", rotate.degree, keyFile); + +// Distortion + saveToKeyfile(!pedited || pedited->distortion.amount, "Distortion", "Amount", distortion.amount, keyFile); + +// Lens profile + saveToKeyfile(!pedited || pedited->lensProf.lcMode, "LensProfile", "LcMode", lensProf.getMethodString (lensProf.lcMode), keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lcpFile, "LensProfile", "LCPFile", relativePathIfInside (fname, fnameAbsolute, lensProf.lcpFile), keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useDist, "LensProfile", "UseDistortion", lensProf.useDist, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useVign, "LensProfile", "UseVignette", lensProf.useVign, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.useCA, "LensProfile", "UseCA", lensProf.useCA, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfCameraMake, "LensProfile", "LFCameraMake", lensProf.lfCameraMake, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfCameraModel, "LensProfile", "LFCameraModel", lensProf.lfCameraModel, keyFile); + saveToKeyfile(!pedited || pedited->lensProf.lfLens, "LensProfile", "LFLens", lensProf.lfLens, keyFile); + +// Perspective correction + saveToKeyfile(!pedited || pedited->perspective.horizontal, "Perspective", "Horizontal", perspective.horizontal, keyFile); + saveToKeyfile(!pedited || pedited->perspective.vertical, "Perspective", "Vertical", perspective.vertical, keyFile); + +// Gradient + saveToKeyfile(!pedited || pedited->gradient.enabled, "Gradient", "Enabled", gradient.enabled, keyFile); + saveToKeyfile(!pedited || pedited->gradient.degree, "Gradient", "Degree", gradient.degree, keyFile); + saveToKeyfile(!pedited || pedited->gradient.feather, "Gradient", "Feather", gradient.feather, keyFile); + saveToKeyfile(!pedited || pedited->gradient.strength, "Gradient", "Strength", gradient.strength, keyFile); + saveToKeyfile(!pedited || pedited->gradient.centerX, "Gradient", "CenterX", gradient.centerX, keyFile); + saveToKeyfile(!pedited || pedited->gradient.centerY, "Gradient", "CenterY", gradient.centerY, keyFile); + +// Post-crop vignette + saveToKeyfile(!pedited || pedited->pcvignette.enabled, "PCVignette", "Enabled", pcvignette.enabled, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.strength, "PCVignette", "Strength", pcvignette.strength, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.feather, "PCVignette", "Feather", pcvignette.feather, keyFile); + saveToKeyfile(!pedited || pedited->pcvignette.roundness, "PCVignette", "Roundness", pcvignette.roundness, keyFile); + +// C/A correction + saveToKeyfile(!pedited || pedited->cacorrection.red, "CACorrection", "Red", cacorrection.red, keyFile); + saveToKeyfile(!pedited || pedited->cacorrection.blue, "CACorrection", "Blue", cacorrection.blue, keyFile); + +// Vignetting correction + saveToKeyfile(!pedited || pedited->vignetting.amount, "Vignetting Correction", "Amount", vignetting.amount, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.radius, "Vignetting Correction", "Radius", vignetting.radius, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.strength, "Vignetting Correction", "Strength", vignetting.strength, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.centerX, "Vignetting Correction", "CenterX", vignetting.centerX, keyFile); + saveToKeyfile(!pedited || pedited->vignetting.centerY, "Vignetting Correction", "CenterY", vignetting.centerY, keyFile); + +// Resize + saveToKeyfile(!pedited || pedited->resize.enabled, "Resize", "Enabled", resize.enabled, keyFile); + saveToKeyfile(!pedited || pedited->resize.scale, "Resize", "Scale", resize.scale, keyFile); + saveToKeyfile(!pedited || pedited->resize.appliesTo, "Resize", "AppliesTo", resize.appliesTo, keyFile); + saveToKeyfile(!pedited || pedited->resize.method, "Resize", "Method", resize.method, keyFile); + saveToKeyfile(!pedited || pedited->resize.dataspec, "Resize", "DataSpecified", resize.dataspec, keyFile); + saveToKeyfile(!pedited || pedited->resize.width, "Resize", "Width", resize.width, keyFile); + saveToKeyfile(!pedited || pedited->resize.height, "Resize", "Height", resize.height, keyFile); + +// Post resize sharpening + saveToKeyfile(!pedited || pedited->prsharpening.enabled, "PostResizeSharpening", "Enabled", prsharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.method, "PostResizeSharpening", "Method", prsharpening.method, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.radius, "PostResizeSharpening", "Radius", prsharpening.radius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.amount, "PostResizeSharpening", "Amount", prsharpening.amount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.threshold, "PostResizeSharpening", "Threshold", prsharpening.threshold.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edgesonly, "PostResizeSharpening", "OnlyEdges", prsharpening.edgesonly, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edges_radius, "PostResizeSharpening", "EdgedetectionRadius", prsharpening.edges_radius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.edges_tolerance, "PostResizeSharpening", "EdgeTolerance", prsharpening.edges_tolerance, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.halocontrol, "PostResizeSharpening", "HalocontrolEnabled", prsharpening.halocontrol, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.halocontrol_amount, "PostResizeSharpening", "HalocontrolAmount", prsharpening.halocontrol_amount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvradius, "PostResizeSharpening", "DeconvRadius", prsharpening.deconvradius, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvamount, "PostResizeSharpening", "DeconvAmount", prsharpening.deconvamount, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconvdamping, "PostResizeSharpening", "DeconvDamping", prsharpening.deconvdamping, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.deconviter, "PostResizeSharpening", "DeconvIterations", prsharpening.deconviter, keyFile); + +// Color management + saveToKeyfile(!pedited || pedited->icm.input, "Color Management", "InputProfile", relativePathIfInside (fname, fnameAbsolute, icm.input), keyFile); + saveToKeyfile(!pedited || pedited->icm.toneCurve, "Color Management", "ToneCurve", icm.toneCurve, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyLookTable, "Color Management", "ApplyLookTable", icm.applyLookTable, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyBaselineExposureOffset, "Color Management", "ApplyBaselineExposureOffset", icm.applyBaselineExposureOffset, keyFile); + saveToKeyfile(!pedited || pedited->icm.applyHueSatMap, "Color Management", "ApplyHueSatMap", icm.applyHueSatMap, keyFile); + saveToKeyfile(!pedited || pedited->icm.dcpIlluminant, "Color Management", "DCPIlluminant", icm.dcpIlluminant, keyFile); + saveToKeyfile(!pedited || pedited->icm.working, "Color Management", "WorkingProfile", icm.working, keyFile); + saveToKeyfile(!pedited || pedited->icm.output, "Color Management", "OutputProfile", icm.output, keyFile); + saveToKeyfile( + !pedited || pedited->icm.outputIntent, + "Color Management", + "OutputProfileIntent", + { + {RI_PERCEPTUAL, "Perceptual"}, + {RI_RELATIVE, "Relative"}, + {RI_SATURATION, "Saturation"}, + {RI_ABSOLUTE, "Absolute"} + + }, + icm.outputIntent, + keyFile + ); + saveToKeyfile(!pedited || pedited->icm.outputBPC, "Color Management", "OutputBPC", icm.outputBPC, keyFile); + saveToKeyfile(!pedited || pedited->icm.gamma, "Color Management", "Gammafree", icm.gamma, keyFile); + saveToKeyfile(!pedited || pedited->icm.freegamma, "Color Management", "Freegamma", icm.freegamma, keyFile); + saveToKeyfile(!pedited || pedited->icm.gampos, "Color Management", "GammaValue", icm.gampos, keyFile); + saveToKeyfile(!pedited || pedited->icm.slpos, "Color Management", "GammaSlope", icm.slpos, keyFile); + +// Wavelet + saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.strength, "Wavelet", "Strength", wavelet.strength, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.balance, "Wavelet", "Balance", wavelet.balance, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.iter, "Wavelet", "Iter", wavelet.iter, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thres, "Wavelet", "MaxLev", wavelet.thres, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Tilesmethod, "Wavelet", "TilesMethod", wavelet.Tilesmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.daubcoeffmethod, "Wavelet", "DaubMethod", wavelet.daubcoeffmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CLmethod, "Wavelet", "ChoiceLevMethod", wavelet.CLmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Backmethod, "Wavelet", "BackMethod", wavelet.Backmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Lmethod, "Wavelet", "LevMethod", wavelet.Lmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Dirmethod, "Wavelet", "DirMethod", wavelet.Dirmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenhigh, "Wavelet", "CBgreenhigh", wavelet.greenhigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenmed, "Wavelet", "CBgreenmed", wavelet.greenmed, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.greenlow, "Wavelet", "CBgreenlow", wavelet.greenlow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluehigh, "Wavelet", "CBbluehigh", wavelet.bluehigh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluemed, "Wavelet", "CBbluemed", wavelet.bluemed, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bluelow, "Wavelet", "CBbluelow", wavelet.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expcontrast, "Wavelet", "Expcontrast", wavelet.expcontrast, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expchroma, "Wavelet", "Expchroma", wavelet.expchroma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expedge, "Wavelet", "Expedge", wavelet.expedge, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expresid, "Wavelet", "Expresid", wavelet.expresid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expfinal, "Wavelet", "Expfinal", wavelet.expfinal, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.exptoning, "Wavelet", "Exptoning", wavelet.exptoning, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.expnoise, "Wavelet", "Expnoise", wavelet.expnoise, keyFile); - if (keyFile.has_key ("RGB Curves", "gCurve")) { - rgbCurves.gcurve = keyFile.get_double_list ("RGB Curves", "gCurve"); - avoidEmptyCurve (rgbCurves.gcurve); + for (int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Contrast" << (i + 1); - if (pedited) { - pedited->rgbCurves.gcurve = true; - } - } + saveToKeyfile(!pedited || pedited->wavelet.c[i], "Wavelet", ss.str(), wavelet.c[i], keyFile); + } - if (keyFile.has_key ("RGB Curves", "bCurve")) { - rgbCurves.bcurve = keyFile.get_double_list ("RGB Curves", "bCurve"); - avoidEmptyCurve (rgbCurves.bcurve); + for (int i = 0; i < 9; i++) { + std::stringstream ss; + ss << "Chroma" << (i + 1); - if (pedited) { - pedited->rgbCurves.bcurve = true; - } - } + saveToKeyfile(!pedited || pedited->wavelet.ch[i], "Wavelet", ss.str(), wavelet.ch[i], keyFile); } -// load Color Toning - if (keyFile.has_group ("ColorToning")) { - if (keyFile.has_key ("ColorToning", "Enabled")) { - colorToning.enabled = keyFile.get_boolean ("ColorToning", "Enabled"); + saveToKeyfile(!pedited || pedited->wavelet.sup, "Wavelet", "ContExtra", wavelet.sup, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.HSmethod, "Wavelet", "HSMethod", wavelet.HSmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hllev, "Wavelet", "HLRange", wavelet.hllev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.bllev, "Wavelet", "SHRange", wavelet.bllev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgcont, "Wavelet", "Edgcont", wavelet.edgcont.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level0noise, "Wavelet", "Level0noise", wavelet.level0noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level1noise, "Wavelet", "Level1noise", wavelet.level1noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level2noise, "Wavelet", "Level2noise", wavelet.level2noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.level3noise, "Wavelet", "Level3noise", wavelet.level3noise.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.threshold, "Wavelet", "ThresholdHighlight", wavelet.threshold, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.threshold2, "Wavelet", "ThresholdShadow", wavelet.threshold2, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetect, "Wavelet", "Edgedetect", wavelet.edgedetect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr, "Wavelet", "Edgedetectthr", wavelet.edgedetectthr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgedetectthr2, "Wavelet", "EdgedetectthrHi", wavelet.edgedetectthr2, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgesensi, "Wavelet", "Edgesensi", wavelet.edgesensi, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgeampli, "Wavelet", "Edgeampli", wavelet.edgeampli, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chroma, "Wavelet", "ThresholdChroma", wavelet.chroma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CHmethod, "Wavelet", "CHromaMethod", wavelet.CHmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Medgreinf, "Wavelet", "Medgreinf", wavelet.Medgreinf, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.CHSLmethod, "Wavelet", "CHSLromaMethod", wavelet.CHSLmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.EDmethod, "Wavelet", "EDMethod", wavelet.EDmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.NPmethod, "Wavelet", "NPMethod", wavelet.NPmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.BAmethod, "Wavelet", "BAMethod", wavelet.BAmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.TMmethod, "Wavelet", "TMMethod", wavelet.TMmethod, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.chro, "Wavelet", "ChromaLink", wavelet.chro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.ccwcurve, "Wavelet", "ContrastCurve", wavelet.ccwcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.pastlev, "Wavelet", "Pastlev", wavelet.pastlev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.satlev, "Wavelet", "Satlev", wavelet.satlev.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveRG, "Wavelet", "OpacityCurveRG", wavelet.opacityCurveRG, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveBY, "Wavelet", "OpacityCurveBY", wavelet.opacityCurveBY, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveW, "Wavelet", "OpacityCurveW", wavelet.opacityCurveW, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.opacityCurveWL, "Wavelet", "OpacityCurveWL", wavelet.opacityCurveWL, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hhcurve, "Wavelet", "HHcurve", wavelet.hhcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.Chcurve, "Wavelet", "CHcurve", wavelet.Chcurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.wavclCurve, "Wavelet", "WavclCurve", wavelet.wavclCurve, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.median, "Wavelet", "Median", wavelet.median, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.medianlev, "Wavelet", "Medianlev", wavelet.medianlev, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.linkedg, "Wavelet", "Linkedg", wavelet.linkedg, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.cbenab, "Wavelet", "CBenab", wavelet.cbenab, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.lipst, "Wavelet", "Lipst", wavelet.lipst, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.skinprotect, "Wavelet", "Skinprotect", wavelet.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hueskin, "Wavelet", "Hueskin", wavelet.hueskin.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgrad, "Wavelet", "Edgrad", wavelet.edgrad, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgval, "Wavelet", "Edgval", wavelet.edgval, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.edgthresh, "Wavelet", "ThrEdg", wavelet.edgthresh, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.avoid, "Wavelet", "AvoidColorShift", wavelet.avoid, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.tmr, "Wavelet", "TMr", wavelet.tmr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.rescon, "Wavelet", "ResidualcontShadow", wavelet.rescon, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.resconH, "Wavelet", "ResidualcontHighlight", wavelet.resconH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thr, "Wavelet", "ThresholdResidShadow", wavelet.thr, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.thrH, "Wavelet", "ThresholdResidHighLight", wavelet.thrH, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.reschro, "Wavelet", "Residualchroma", wavelet.reschro, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.tmrs, "Wavelet", "ResidualTM", wavelet.tmrs, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.gamma, "Wavelet", "Residualgamma", wavelet.gamma, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.sky, "Wavelet", "HueRangeResidual", wavelet.sky, keyFile); + saveToKeyfile(!pedited || pedited->wavelet.hueskin2, "Wavelet", "HueRange", wavelet.hueskin2.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->wavelet.contrast, "Wavelet", "Contrast", wavelet.contrast, keyFile); + +// Directional pyramid equalizer + saveToKeyfile(!pedited || pedited->dirpyrequalizer.enabled, "Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.gamutlab, "Directional Pyramid Equalizer", "Gamutlab", dirpyrequalizer.gamutlab, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.cbdlMethod, "Directional Pyramid Equalizer", "cbdlMethod", dirpyrequalizer.cbdlMethod, keyFile); - if (pedited) { - pedited->colorToning.enabled = true; - } - } + for (int i = 0; i < 6; i++) { + std::stringstream ss; + ss << "Mult" << i; - if (keyFile.has_key ("ColorToning", "Method")) { - colorToning.method = keyFile.get_string ("ColorToning", "Method"); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.mult[i], "Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i], keyFile); + } - if (pedited) { - pedited->colorToning.method = true; - } - } + saveToKeyfile(!pedited || pedited->dirpyrequalizer.threshold, "Directional Pyramid Equalizer", "Threshold", dirpyrequalizer.threshold, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.skinprotect, "Directional Pyramid Equalizer", "Skinprotect", dirpyrequalizer.skinprotect, keyFile); + saveToKeyfile(!pedited || pedited->dirpyrequalizer.hueskin, "Directional Pyramid Equalizer", "Hueskin", dirpyrequalizer.hueskin.toVector(), keyFile); + +// HSV Equalizer + saveToKeyfile(!pedited || pedited->hsvequalizer.enabled, "HSV Equalizer", "Enabled", hsvequalizer.enabled, keyFile); + saveToKeyfile(!pedited || pedited->hsvequalizer.hcurve, "HSV Equalizer", "HCurve", hsvequalizer.hcurve, keyFile); + saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); + saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); + +// Film simulation + saveToKeyfile(!pedited || pedited->filmSimulation.enabled, "Film Simulation", "Enabled", filmSimulation.enabled, keyFile); + saveToKeyfile(!pedited || pedited->filmSimulation.clutFilename, "Film Simulation", "ClutFilename", filmSimulation.clutFilename, keyFile); + saveToKeyfile(!pedited || pedited->filmSimulation.strength, "Film Simulation", "Strength", filmSimulation.strength, keyFile); + + saveToKeyfile(!pedited || pedited->rgbCurves.enabled, "RGB Curves", "Enabled", rgbCurves.enabled, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.lumamode, "RGB Curves", "LumaMode", rgbCurves.lumamode, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.rcurve, "RGB Curves", "rCurve", rgbCurves.rcurve, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.gcurve, "RGB Curves", "gCurve", rgbCurves.gcurve, keyFile); + saveToKeyfile(!pedited || pedited->rgbCurves.bcurve, "RGB Curves", "bCurve", rgbCurves.bcurve, keyFile); + +// Color toning + saveToKeyfile(!pedited || pedited->colorToning.enabled, "ColorToning", "Enabled", colorToning.enabled, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.method, "ColorToning", "Method", colorToning.method, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.lumamode, "ColorToning", "Lumamode", colorToning.lumamode, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.twocolor, "ColorToning", "Twocolor", colorToning.twocolor, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redlow, "ColorToning", "Redlow", colorToning.redlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenlow, "ColorToning", "Greenlow", colorToning.greenlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluelow, "ColorToning", "Bluelow", colorToning.bluelow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.satlow, "ColorToning", "Satlow", colorToning.satlow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.balance, "ColorToning", "Balance", colorToning.balance, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.sathigh, "ColorToning", "Sathigh", colorToning.sathigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redmed, "ColorToning", "Redmed", colorToning.redmed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenmed, "ColorToning", "Greenmed", colorToning.greenmed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluemed, "ColorToning", "Bluemed", colorToning.bluemed, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.redhigh, "ColorToning", "Redhigh", colorToning.redhigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.greenhigh, "ColorToning", "Greenhigh", colorToning.greenhigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.bluehigh, "ColorToning", "Bluehigh", colorToning.bluehigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.autosat, "ColorToning", "Autosat", colorToning.autosat, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.opacityCurve, "ColorToning", "OpacityCurve", colorToning.opacityCurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.colorCurve, "ColorToning", "ColorCurve", colorToning.colorCurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.satprotectionthreshold, "ColorToning", "SatProtectionThreshold", colorToning.satProtectionThreshold, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.saturatedopacity, "ColorToning", "SaturatedOpacity", colorToning.saturatedOpacity, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.strength, "ColorToning", "Strength", colorToning.strength, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.hlColSat, "ColorToning", "HighlightsColorSaturation", colorToning.hlColSat.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->colorToning.shadowsColSat, "ColorToning", "ShadowsColorSaturation", colorToning.shadowsColSat.toVector(), keyFile); + saveToKeyfile(!pedited || pedited->colorToning.clcurve, "ColorToning", "ClCurve", colorToning.clcurve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.cl2curve, "ColorToning", "Cl2Curve", colorToning.cl2curve, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridALow, "ColorToning", "LabGridALow", colorToning.labgridALow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridBLow, "ColorToning", "LabGridBLow", colorToning.labgridBLow, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridAHigh, "ColorToning", "LabGridAHigh", colorToning.labgridAHigh, keyFile); + saveToKeyfile(!pedited || pedited->colorToning.labgridBHigh, "ColorToning", "LabGridBHigh", colorToning.labgridBHigh, keyFile); + +// Raw + saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame), keyFile); + saveToKeyfile(!pedited || pedited->raw.df_autoselect, "RAW", "DarkFrameAuto", raw.df_autoselect, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_file, "RAW", "FlatFieldFile", relativePathIfInside (fname, fnameAbsolute, raw.ff_file), keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_AutoSelect, "RAW", "FlatFieldAutoSelect", raw.ff_AutoSelect, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_BlurRadius, "RAW", "FlatFieldBlurRadius", raw.ff_BlurRadius, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_BlurType, "RAW", "FlatFieldBlurType", raw.ff_BlurType, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_AutoClipControl, "RAW", "FlatFieldAutoClipControl", raw.ff_AutoClipControl, keyFile); + saveToKeyfile(!pedited || pedited->raw.ff_clipControl, "RAW", "FlatFieldClipControl", raw.ff_clipControl, keyFile); + saveToKeyfile(!pedited || pedited->raw.ca_autocorrect, "RAW", "CA", raw.ca_autocorrect, keyFile); + saveToKeyfile(!pedited || pedited->raw.cared, "RAW", "CARed", raw.cared, keyFile); + saveToKeyfile(!pedited || pedited->raw.cablue, "RAW", "CABlue", raw.cablue, keyFile); + saveToKeyfile(!pedited || pedited->raw.hotPixelFilter, "RAW", "HotPixelFilter", raw.hotPixelFilter, keyFile); + saveToKeyfile(!pedited || pedited->raw.deadPixelFilter, "RAW", "DeadPixelFilter", raw.deadPixelFilter, keyFile); + saveToKeyfile(!pedited || pedited->raw.hotdeadpix_thresh, "RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.method, "RAW Bayer", "Method", raw.bayersensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.imageNum, "RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.ccSteps, "RAW Bayer", "CcSteps", raw.bayersensor.ccSteps, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack0, "RAW Bayer", "PreBlack0", raw.bayersensor.black0, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack1, "RAW Bayer", "PreBlack1", raw.bayersensor.black1, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack2, "RAW Bayer", "PreBlack2", raw.bayersensor.black2, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack3, "RAW Bayer", "PreBlack3", raw.bayersensor.black3, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.exTwoGreen, "RAW Bayer", "PreTwoGreen", raw.bayersensor.twogreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.linenoise, "RAW Bayer", "LineDenoise", raw.bayersensor.linenoise, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.greenEq, "RAW Bayer", "GreenEqThreshold", raw.bayersensor.greenthresh, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbIterations, "RAW Bayer", "DCBIterations", raw.bayersensor.dcb_iterations, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.dcbEnhance, "RAW Bayer", "DCBEnhance", raw.bayersensor.dcb_enhance, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.lmmseIterations, "RAW Bayer", "LMMSEIterations", raw.bayersensor.lmmse_iterations, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotion, "RAW Bayer", "PixelShiftMotion", raw.bayersensor.pixelShiftMotion, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrection, "RAW Bayer", "PixelShiftMotionCorrection", toUnderlying(raw.bayersensor.pixelShiftMotionCorrection), keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod, "RAW Bayer", "PixelShiftMotionCorrectionMethod", toUnderlying(raw.bayersensor.pixelShiftMotionCorrectionMethod), keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorGreen, "RAW Bayer", "pixelShiftStddevFactorGreen", raw.bayersensor.pixelShiftStddevFactorGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorRed, "RAW Bayer", "pixelShiftStddevFactorRed", raw.bayersensor.pixelShiftStddevFactorRed, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftStddevFactorBlue, "RAW Bayer", "pixelShiftStddevFactorBlue", raw.bayersensor.pixelShiftStddevFactorBlue, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEperIso, "RAW Bayer", "PixelShiftEperIso", raw.bayersensor.pixelShiftEperIso, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNreadIso, "RAW Bayer", "PixelShiftNreadIso", raw.bayersensor.pixelShiftNreadIso, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftPrnu, "RAW Bayer", "PixelShiftPrnu", raw.bayersensor.pixelShiftPrnu, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSigma, "RAW Bayer", "PixelShiftSigma", raw.bayersensor.pixelShiftSigma, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSum, "RAW Bayer", "PixelShiftSum", raw.bayersensor.pixelShiftSum, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftRedBlueWeight, "RAW Bayer", "PixelShiftRedBlueWeight", raw.bayersensor.pixelShiftRedBlueWeight, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotion, "RAW Bayer", "PixelShiftShowMotion", raw.bayersensor.pixelShiftShowMotion, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly, "RAW Bayer", "PixelShiftShowMotionMaskOnly", raw.bayersensor.pixelShiftShowMotionMaskOnly, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftAutomatic, "RAW Bayer", "pixelShiftAutomatic", raw.bayersensor.pixelShiftAutomatic, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenHorizontal, "RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenVertical, "RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftHoleFill, "RAW Bayer", "pixelShiftHoleFill", raw.bayersensor.pixelShiftHoleFill, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian, "RAW Bayer", "pixelShiftMedian", raw.bayersensor.pixelShiftMedian, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftMedian3, "RAW Bayer", "pixelShiftMedian3", raw.bayersensor.pixelShiftMedian3, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftGreen, "RAW Bayer", "pixelShiftGreen", raw.bayersensor.pixelShiftGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftBlur, "RAW Bayer", "pixelShiftBlur", raw.bayersensor.pixelShiftBlur, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftSmooth, "RAW Bayer", "pixelShiftSmoothFactor", raw.bayersensor.pixelShiftSmoothFactor, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftExp0, "RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftLmmse, "RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse, keyFile); +// saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftOneGreen, "RAW Bayer", "pixelShiftOneGreen", raw.bayersensor.pixelShiftOneGreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBright, "RAW Bayer", "pixelShiftEqualBright", raw.bayersensor.pixelShiftEqualBright, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftEqualBrightChannel, "RAW Bayer", "pixelShiftEqualBrightChannel", raw.bayersensor.pixelShiftEqualBrightChannel, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross, "RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross2, "RAW Bayer", "pixelShiftNonGreenCross2", raw.bayersensor.pixelShiftNonGreenCross2, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pixelShiftNonGreenAmaze, "RAW Bayer", "pixelShiftNonGreenAmaze", raw.bayersensor.pixelShiftNonGreenAmaze, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.method, "RAW X-Trans", "Method", raw.xtranssensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.ccSteps, "RAW X-Trans", "CcSteps", raw.xtranssensor.ccSteps, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackRed, "RAW X-Trans", "PreBlackRed", raw.xtranssensor.blackred, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackGreen, "RAW X-Trans", "PreBlackGreen", raw.xtranssensor.blackgreen, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.exBlackBlue, "RAW X-Trans", "PreBlackBlue", raw.xtranssensor.blackblue, keyFile); + +// Raw exposition + saveToKeyfile(!pedited || pedited->raw.exPos, "RAW", "PreExposure", raw.expos, keyFile); + saveToKeyfile(!pedited || pedited->raw.exPreser, "RAW", "PrePreserv", raw.preser, keyFile); - if (keyFile.has_key ("ColorToning", "Lumamode")) { - colorToning.lumamode = keyFile.get_boolean ("ColorToning", "Lumamode"); +// MetaData + saveToKeyfile(!pedited || pedited->metadata.mode, "MetaData", "Mode", metadata.mode, keyFile); - if (pedited) { - pedited->colorToning.lumamode = true; - } +// EXIF change list + if (!pedited || pedited->exif) { + for (ExifPairs::const_iterator i = exif.begin(); i != exif.end(); ++i) { + keyFile.set_string ("Exif", i->first, i->second); } + } - if (keyFile.has_key ("ColorToning", "Twocolor")) { - colorToning.twocolor = keyFile.get_string ("ColorToning", "Twocolor"); - - if (pedited) { - pedited->colorToning.twocolor = true; - } +// IPTC change list + if (!pedited || pedited->iptc) { + for (IPTCPairs::const_iterator i = iptc.begin(); i != iptc.end(); ++i) { + Glib::ArrayHandle values = i->second; + keyFile.set_string_list ("IPTC", i->first, values); } + } - if (keyFile.has_key ("ColorToning", "OpacityCurve")) { - colorToning.opacityCurve = keyFile.get_double_list ("ColorToning", "OpacityCurve"); - avoidEmptyCurve (colorToning.opacityCurve); + sPParams = keyFile.to_data(); - if (pedited) { - pedited->colorToning.opacityCurve = true; - } - } + } catch (Glib::KeyFileError&) {} - if (keyFile.has_key ("ColorToning", "ColorCurve")) { - colorToning.colorCurve = keyFile.get_double_list ("ColorToning", "ColorCurve"); - avoidEmptyCurve (colorToning.colorCurve); + if (sPParams.empty ()) { + return 1; + } - if (pedited) { - pedited->colorToning.colorCurve = true; - } - } + int error1, error2; + error1 = write (fname, sPParams); - if (keyFile.has_key ("ColorToning", "Autosat")) { - colorToning.autosat = keyFile.get_boolean ("ColorToning", "Autosat"); + if (!fname2.empty ()) { - if (pedited) { - pedited->colorToning.autosat = true; - } - } + error2 = write (fname2, sPParams); + // If at least one file has been saved, it's a success + return error1 & error2; + } else { + return error1; + } +} - if (keyFile.has_key ("ColorToning", "SatProtectionThreshold")) { - colorToning.satProtectionThreshold = keyFile.get_integer ("ColorToning", "SatProtectionThreshold"); +int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) +{ + setlocale (LC_NUMERIC, "C"); // to set decimal point to "." - if (pedited) { - pedited->colorToning.satprotectionthreshold = true; - } - } + if (fname.empty()) { + return 1; + } - if (keyFile.has_key ("ColorToning", "SaturatedOpacity")) { - colorToning.saturatedOpacity = keyFile.get_integer ("ColorToning", "SaturatedOpacity"); + Glib::KeyFile keyFile; - if (pedited) { - pedited->colorToning.saturatedopacity = true; - } - } + try { + if (pedited) { + pedited->set (false); + } - if (keyFile.has_key ("ColorToning", "Strength")) { - colorToning.strength = keyFile.get_integer ("ColorToning", "Strength"); + if (!Glib::file_test(fname, Glib::FILE_TEST_EXISTS) || + !keyFile.load_from_file(fname)) { + return 1; + } - if (pedited) { - pedited->colorToning.strength = true; - } + ppVersion = PPVERSION; + appVersion = RTVERSION; + + if (keyFile.has_group ("Version")) { + if (keyFile.has_key ("Version", "AppVersion")) { + appVersion = keyFile.get_string ("Version", "AppVersion"); } - if (keyFile.has_key ("ColorToning", "HighlightsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "HighlightsColorSaturation"); + if (keyFile.has_key ("Version", "Version")) { + ppVersion = keyFile.get_integer ("Version", "Version"); + } + } - if (thresh.size() >= 2) { - colorToning.hlColSat.setValues (thresh[0], thresh[1]); - } + if (keyFile.has_group ("General")) { + assignFromKeyfile(keyFile, "General", "Rank", pedited, rank, pedited->general.rank); + assignFromKeyfile(keyFile, "General", "ColorLabel", pedited, colorlabel, pedited->general.colorlabel); + assignFromKeyfile(keyFile, "General", "InTrash", pedited, inTrash, pedited->general.intrash); + } - if (pedited) { - pedited->colorToning.hlColSat = true; - } + if (keyFile.has_group ("Exposure")) { + if (ppVersion < PPVERSION_AEXP) { + toneCurve.autoexp = false; // prevent execution of autoexp when opening file created with earlier versions of autoexp algorithm + } else { + assignFromKeyfile(keyFile, "Exposure", "Auto", pedited, toneCurve.autoexp, pedited->toneCurve.autoexp); + } + assignFromKeyfile(keyFile, "Exposure", "Clip", pedited, toneCurve.clip, pedited->toneCurve.clip); + assignFromKeyfile(keyFile, "Exposure", "Compensation", pedited, toneCurve.expcomp, pedited->toneCurve.expcomp); + assignFromKeyfile(keyFile, "Exposure", "Brightness", pedited, toneCurve.brightness, pedited->toneCurve.brightness); + assignFromKeyfile(keyFile, "Exposure", "Contrast", pedited, toneCurve.contrast, pedited->toneCurve.contrast); + assignFromKeyfile(keyFile, "Exposure", "Saturation", pedited, toneCurve.saturation, pedited->toneCurve.saturation); + assignFromKeyfile(keyFile, "Exposure", "Black", pedited, toneCurve.black, pedited->toneCurve.black); + assignFromKeyfile(keyFile, "Exposure", "HighlightCompr", pedited, toneCurve.hlcompr, pedited->toneCurve.hlcompr); + assignFromKeyfile(keyFile, "Exposure", "HighlightComprThreshold", pedited, toneCurve.hlcomprthresh, pedited->toneCurve.hlcomprthresh); + assignFromKeyfile(keyFile, "Exposure", "ShadowCompr", pedited, toneCurve.shcompr, pedited->toneCurve.shcompr); + if (toneCurve.shcompr > 100) { + toneCurve.shcompr = 100; // older pp3 files can have values above 100. } - if (keyFile.has_key ("ColorToning", "ShadowsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "ShadowsColorSaturation"); + const std::map tc_mapping = { + {"Standard", ToneCurveParams::TcMode::STD}, + {"FilmLike", ToneCurveParams::TcMode::FILMLIKE}, + {"SatAndValueBlending", ToneCurveParams::TcMode::SATANDVALBLENDING}, + {"WeightedStd", ToneCurveParams::TcMode::WEIGHTEDSTD}, + {"Luminance", ToneCurveParams::TcMode::LUMINANCE}, + {"Perceptual", ToneCurveParams::TcMode::PERCEPTUAL} + }; - if (thresh.size() >= 2) { - colorToning.shadowsColSat.setValues (thresh[0], thresh[1]); - } + assignFromKeyfile(keyFile, "Exposure", "CurveMode", pedited, tc_mapping, toneCurve.curveMode, pedited->toneCurve.curveMode); + assignFromKeyfile(keyFile, "Exposure", "CurveMode2", pedited, tc_mapping, toneCurve.curveMode2, pedited->toneCurve.curveMode2); - if (pedited) { - pedited->colorToning.shadowsColSat = true; - } + if (ppVersion > 200) { + assignFromKeyfile(keyFile, "Exposure", "Curve", pedited, toneCurve.curve, pedited->toneCurve.curve); + assignFromKeyfile(keyFile, "Exposure", "Curve2", pedited, toneCurve.curve2, pedited->toneCurve.curve2); } + assignFromKeyfile(keyFile, "Exposure", "HistogramMatching", pedited, toneCurve.histmatching, pedited->toneCurve.histmatching); + } - if (keyFile.has_key ("ColorToning", "ClCurve")) { - colorToning.clcurve = keyFile.get_double_list ("ColorToning", "ClCurve"); - avoidEmptyCurve (colorToning.clcurve); + if (keyFile.has_group ("HLRecovery")) { + assignFromKeyfile(keyFile, "HLRecovery", "Enabled", pedited, toneCurve.hrenabled, pedited->toneCurve.hrenabled); + assignFromKeyfile(keyFile, "HLRecovery", "Method", pedited, toneCurve.method, pedited->toneCurve.method); + } + if (keyFile.has_group ("Channel Mixer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "Channel Mixer", "Enabled", pedited, chmixer.enabled, pedited->chmixer.enabled); + } else { + chmixer.enabled = true; if (pedited) { - pedited->colorToning.clcurve = true; + pedited->chmixer.enabled = true; } } + if (keyFile.has_key ("Channel Mixer", "Red") && keyFile.has_key ("Channel Mixer", "Green") && keyFile.has_key ("Channel Mixer", "Blue")) { + const std::vector rmix = keyFile.get_integer_list ("Channel Mixer", "Red"); + const std::vector gmix = keyFile.get_integer_list ("Channel Mixer", "Green"); + const std::vector bmix = keyFile.get_integer_list ("Channel Mixer", "Blue"); - if (keyFile.has_key ("ColorToning", "Cl2Curve")) { - colorToning.cl2curve = keyFile.get_double_list ("ColorToning", "Cl2Curve"); - avoidEmptyCurve (colorToning.cl2curve); - - if (pedited) { - pedited->colorToning.cl2curve = true; + if (rmix.size() == 3 && gmix.size() == 3 && bmix.size() == 3) { + memcpy (chmixer.red, rmix.data(), 3 * sizeof (int)); + memcpy (chmixer.green, gmix.data(), 3 * sizeof (int)); + memcpy (chmixer.blue, bmix.data(), 3 * sizeof (int)); } - } - - if (keyFile.has_key ("ColorToning", "Redlow")) { - colorToning.redlow = keyFile.get_double ("ColorToning", "Redlow"); if (pedited) { - pedited->colorToning.redlow = true; + pedited->chmixer.red[0] = pedited->chmixer.red[1] = pedited->chmixer.red[2] = true; + pedited->chmixer.green[0] = pedited->chmixer.green[1] = pedited->chmixer.green[2] = true; + pedited->chmixer.blue[0] = pedited->chmixer.blue[1] = pedited->chmixer.blue[2] = true; } } + } - if (keyFile.has_key ("ColorToning", "Greenlow")) { - colorToning.greenlow = keyFile.get_double ("ColorToning", "Greenlow"); - - if (pedited) { - pedited->colorToning.greenlow = true; - } - } + if (keyFile.has_group ("Black & White")) { + assignFromKeyfile(keyFile, "Black & White", "Enabled", pedited, blackwhite.enabled, pedited->blackwhite.enabled); + assignFromKeyfile(keyFile, "Black & White", "Method", pedited, blackwhite.method, pedited->blackwhite.method); + assignFromKeyfile(keyFile, "Black & White", "Auto", pedited, blackwhite.autoc, pedited->blackwhite.autoc); + assignFromKeyfile(keyFile, "Black & White", "ComplementaryColors", pedited, blackwhite.enabledcc, pedited->blackwhite.enabledcc); + assignFromKeyfile(keyFile, "Black & White", "MixerRed", pedited, blackwhite.mixerRed, pedited->blackwhite.mixerRed); + assignFromKeyfile(keyFile, "Black & White", "MixerOrange", pedited, blackwhite.mixerOrange, pedited->blackwhite.mixerOrange); + assignFromKeyfile(keyFile, "Black & White", "MixerYellow", pedited, blackwhite.mixerYellow, pedited->blackwhite.mixerYellow); + assignFromKeyfile(keyFile, "Black & White", "MixerGreen", pedited, blackwhite.mixerGreen, pedited->blackwhite.mixerGreen); + assignFromKeyfile(keyFile, "Black & White", "MixerCyan", pedited, blackwhite.mixerCyan, pedited->blackwhite.mixerCyan); + assignFromKeyfile(keyFile, "Black & White", "MixerBlue", pedited, blackwhite.mixerBlue, pedited->blackwhite.mixerBlue); + assignFromKeyfile(keyFile, "Black & White", "MixerMagenta", pedited, blackwhite.mixerMagenta, pedited->blackwhite.mixerMagenta); + assignFromKeyfile(keyFile, "Black & White", "MixerPurple", pedited, blackwhite.mixerPurple, pedited->blackwhite.mixerPurple); + assignFromKeyfile(keyFile, "Black & White", "GammaRed", pedited, blackwhite.gammaRed, pedited->blackwhite.gammaRed); + assignFromKeyfile(keyFile, "Black & White", "GammaGreen", pedited, blackwhite.gammaGreen, pedited->blackwhite.gammaGreen); + assignFromKeyfile(keyFile, "Black & White", "GammaBlue", pedited, blackwhite.gammaBlue, pedited->blackwhite.gammaBlue); + assignFromKeyfile(keyFile, "Black & White", "Filter", pedited, blackwhite.filter, pedited->blackwhite.filter); + assignFromKeyfile(keyFile, "Black & White", "Setting", pedited, blackwhite.setting, pedited->blackwhite.setting); + assignFromKeyfile(keyFile, "Black & White", "LuminanceCurve", pedited, blackwhite.luminanceCurve, pedited->blackwhite.luminanceCurve); + + assignFromKeyfile(keyFile, "Black & White", "BeforeCurve", pedited, blackwhite.beforeCurve, pedited->blackwhite.beforeCurve); + + assignFromKeyfile(keyFile, "Black & White", "Algorithm", pedited, blackwhite.algo, pedited->blackwhite.algo); + assignFromKeyfile( + keyFile, + "Black & White", + "BeforeCurveMode", + pedited, + { + {"Standard", BlackWhiteParams::TcMode::STD_BW}, + {"FilmLike", BlackWhiteParams::TcMode::FILMLIKE_BW}, + {"SatAndValueBlending", BlackWhiteParams::TcMode::SATANDVALBLENDING_BW}, + {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} + }, + blackwhite.beforeCurveMode, + pedited->blackwhite.beforeCurveMode + ); + + assignFromKeyfile(keyFile, "Black & White", "AfterCurve", pedited, blackwhite.afterCurve, pedited->blackwhite.afterCurve); + assignFromKeyfile( + keyFile, + "Black & White", + "AfterCurveMode", + pedited, + { + {"Standard", BlackWhiteParams::TcMode::STD_BW}, + {"WeightedStd", BlackWhiteParams::TcMode::WEIGHTEDSTD_BW} + }, + blackwhite.afterCurveMode, + pedited->blackwhite.afterCurveMode + ); + } - if (keyFile.has_key ("ColorToning", "Bluelow")) { - colorToning.bluelow = keyFile.get_double ("ColorToning", "Bluelow"); + if (keyFile.has_group ("Retinex")) { + assignFromKeyfile(keyFile, "Retinex", "Median", pedited, retinex.medianmap, pedited->retinex.medianmap); + assignFromKeyfile(keyFile, "Retinex", "RetinexMethod", pedited, retinex.retinexMethod, pedited->retinex.retinexMethod); + assignFromKeyfile(keyFile, "Retinex", "mapMethod", pedited, retinex.mapMethod, pedited->retinex.mapMethod); + assignFromKeyfile(keyFile, "Retinex", "viewMethod", pedited, retinex.viewMethod, pedited->retinex.viewMethod); + + assignFromKeyfile(keyFile, "Retinex", "Retinexcolorspace", pedited, retinex.retinexcolorspace, pedited->retinex.retinexcolorspace); + assignFromKeyfile(keyFile, "Retinex", "Gammaretinex", pedited, retinex.gammaretinex, pedited->retinex.gammaretinex); + assignFromKeyfile(keyFile, "Retinex", "Enabled", pedited, retinex.enabled, pedited->retinex.enabled); + assignFromKeyfile(keyFile, "Retinex", "Neigh", pedited, retinex.neigh, pedited->retinex.neigh); + assignFromKeyfile(keyFile, "Retinex", "Str", pedited, retinex.str, pedited->retinex.str); + assignFromKeyfile(keyFile, "Retinex", "Scal", pedited, retinex.scal, pedited->retinex.scal); + assignFromKeyfile(keyFile, "Retinex", "Iter", pedited, retinex.iter, pedited->retinex.iter); + assignFromKeyfile(keyFile, "Retinex", "Grad", pedited, retinex.grad, pedited->retinex.grad); + assignFromKeyfile(keyFile, "Retinex", "Grads", pedited, retinex.grads, pedited->retinex.grads); + assignFromKeyfile(keyFile, "Retinex", "Gam", pedited, retinex.gam, pedited->retinex.gam); + assignFromKeyfile(keyFile, "Retinex", "Slope", pedited, retinex.slope, pedited->retinex.slope); + assignFromKeyfile(keyFile, "Retinex", "Offs", pedited, retinex.offs, pedited->retinex.offs); + assignFromKeyfile(keyFile, "Retinex", "Vart", pedited, retinex.vart, pedited->retinex.vart); + assignFromKeyfile(keyFile, "Retinex", "Limd", pedited, retinex.limd, pedited->retinex.limd); + assignFromKeyfile(keyFile, "Retinex", "highl", pedited, retinex.highl, pedited->retinex.highl); + assignFromKeyfile(keyFile, "Retinex", "skal", pedited, retinex.skal, pedited->retinex.skal); + assignFromKeyfile(keyFile, "Retinex", "CDCurve", pedited, retinex.cdcurve, pedited->retinex.cdcurve); + + assignFromKeyfile(keyFile, "Retinex", "MAPCurve", pedited, retinex.mapcurve, pedited->retinex.mapcurve); + + assignFromKeyfile(keyFile, "Retinex", "CDHCurve", pedited, retinex.cdHcurve, pedited->retinex.cdHcurve); + + assignFromKeyfile(keyFile, "Retinex", "LHCurve", pedited, retinex.lhcurve, pedited->retinex.lhcurve); + + assignFromKeyfile(keyFile, "Retinex", "Highlights", pedited, retinex.highlights, pedited->retinex.highlights); + assignFromKeyfile(keyFile, "Retinex", "HighlightTonalWidth", pedited, retinex.htonalwidth, pedited->retinex.htonalwidth); + assignFromKeyfile(keyFile, "Retinex", "Shadows", pedited, retinex.shadows, pedited->retinex.shadows); + assignFromKeyfile(keyFile, "Retinex", "ShadowTonalWidth", pedited, retinex.stonalwidth, pedited->retinex.stonalwidth); + + assignFromKeyfile(keyFile, "Retinex", "Radius", pedited, retinex.radius, pedited->retinex.radius); + + assignFromKeyfile(keyFile, "Retinex", "TransmissionCurve", pedited, retinex.transmissionCurve, pedited->retinex.transmissionCurve); + + assignFromKeyfile(keyFile, "Retinex", "GainTransmissionCurve", pedited, retinex.gaintransmissionCurve, pedited->retinex.gaintransmissionCurve); + } + + if (keyFile.has_group("Local Contrast")) { + assignFromKeyfile(keyFile, "Local Contrast", "Enabled", pedited, localContrast.enabled, pedited->localContrast.enabled); + assignFromKeyfile(keyFile, "Local Contrast", "Radius", pedited, localContrast.radius, pedited->localContrast.radius); + assignFromKeyfile(keyFile, "Local Contrast", "Amount", pedited, localContrast.amount, pedited->localContrast.amount); + assignFromKeyfile(keyFile, "Local Contrast", "Darkness", pedited, localContrast.darkness, pedited->localContrast.darkness); + assignFromKeyfile(keyFile, "Local Contrast", "Lightness", pedited, localContrast.lightness, pedited->localContrast.lightness); + } + if (keyFile.has_group ("Luminance Curve")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "Luminance Curve", "Enabled", pedited, labCurve.enabled, pedited->labCurve.enabled); + } else { + labCurve.enabled = true; if (pedited) { - pedited->colorToning.bluelow = true; + pedited->labCurve.enabled = true; } } - if (keyFile.has_key ("ColorToning", "Satlow")) { - colorToning.satlow = keyFile.get_double ("ColorToning", "Satlow"); + assignFromKeyfile(keyFile, "Luminance Curve", "Brightness", pedited, labCurve.brightness, pedited->labCurve.brightness); + assignFromKeyfile(keyFile, "Luminance Curve", "Contrast", pedited, labCurve.contrast, pedited->labCurve.contrast); - if (pedited) { - pedited->colorToning.satlow = true; - } - } + if (ppVersion < 303) { + // transform Saturation into Chromaticity + // if Saturation == 0, should we set BWToning on? + assignFromKeyfile(keyFile, "Luminance Curve", "Saturation", pedited, labCurve.chromaticity, pedited->labCurve.chromaticity); + // transform AvoidColorClipping into AvoidColorShift + assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorClipping", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); + } else { + if (keyFile.has_key ("Luminance Curve", "Chromaticity")) { + labCurve.chromaticity = keyFile.get_integer ("Luminance Curve", "Chromaticity"); - if (keyFile.has_key ("ColorToning", "Balance")) { - colorToning.balance = keyFile.get_integer ("ColorToning", "Balance"); + if (ppVersion >= 303 && ppVersion < 314 && labCurve.chromaticity == -100) { + blackwhite.enabled = true; + } - if (pedited) { - pedited->colorToning.balance = true; + if (pedited) { + pedited->labCurve.chromaticity = true; + } } - } - if (keyFile.has_key ("ColorToning", "Sathigh")) { - colorToning.sathigh = keyFile.get_double ("ColorToning", "Sathigh"); - - if (pedited) { - pedited->colorToning.sathigh = true; - } + assignFromKeyfile(keyFile, "Luminance Curve", "AvoidColorShift", pedited, labCurve.avoidcolorshift, pedited->labCurve.avoidcolorshift); + assignFromKeyfile(keyFile, "Luminance Curve", "RedAndSkinTonesProtection", pedited, labCurve.rstprotection, pedited->labCurve.rstprotection); } - if (keyFile.has_key ("ColorToning", "Redmed")) { - colorToning.redmed = keyFile.get_double ("ColorToning", "Redmed"); - - if (pedited) { - pedited->colorToning.redmed = true; - } - } + assignFromKeyfile(keyFile, "Luminance Curve", "LCredsk", pedited, labCurve.lcredsk, pedited->labCurve.lcredsk); - if (keyFile.has_key ("ColorToning", "Greenmed")) { - colorToning.greenmed = keyFile.get_double ("ColorToning", "Greenmed"); + if (ppVersion < 314) { + // Backward compatibility: If BWtoning is true, Chromaticity has to be set to -100, which will produce the same effect + // and will enable the b&w toning mode ('a' & 'b' curves) + if (keyFile.has_key ("Luminance Curve", "BWtoning")) { + if ( keyFile.get_boolean ("Luminance Curve", "BWtoning")) { + labCurve.chromaticity = -100; - if (pedited) { - pedited->colorToning.greenmed = true; + if (pedited) { + pedited->labCurve.chromaticity = true; + } + } } } - if (keyFile.has_key ("ColorToning", "Bluemed")) { - colorToning.bluemed = keyFile.get_double ("ColorToning", "Bluemed"); + assignFromKeyfile(keyFile, "Luminance Curve", "LCurve", pedited, labCurve.lcurve, pedited->labCurve.lcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "aCurve", pedited, labCurve.acurve, pedited->labCurve.acurve); + assignFromKeyfile(keyFile, "Luminance Curve", "bCurve", pedited, labCurve.bcurve, pedited->labCurve.bcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "ccCurve", pedited, labCurve.cccurve, pedited->labCurve.cccurve); + assignFromKeyfile(keyFile, "Luminance Curve", "chCurve", pedited, labCurve.chcurve, pedited->labCurve.chcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "lhCurve", pedited, labCurve.lhcurve, pedited->labCurve.lhcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "hhCurve", pedited, labCurve.hhcurve, pedited->labCurve.hhcurve); + assignFromKeyfile(keyFile, "Luminance Curve", "LcCurve", pedited, labCurve.lccurve, pedited->labCurve.lccurve); + assignFromKeyfile(keyFile, "Luminance Curve", "ClCurve", pedited, labCurve.clcurve, pedited->labCurve.clcurve); + } - if (pedited) { - pedited->colorToning.bluemed = true; - } - } + if (keyFile.has_group ("Sharpening")) { + assignFromKeyfile(keyFile, "Sharpening", "Enabled", pedited, sharpening.enabled, pedited->sharpening.enabled); + assignFromKeyfile(keyFile, "Sharpening", "Radius", pedited, sharpening.radius, pedited->sharpening.radius); + assignFromKeyfile(keyFile, "Sharpening", "Amount", pedited, sharpening.amount, pedited->sharpening.amount); - if (keyFile.has_key ("ColorToning", "Redhigh")) { - colorToning.redhigh = keyFile.get_double ("ColorToning", "Redhigh"); + if (keyFile.has_key ("Sharpening", "Threshold")) { + if (ppVersion < 302) { + int thresh = min (keyFile.get_integer ("Sharpening", "Threshold"), 2000); + sharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization + } else { + const std::vector thresh = keyFile.get_integer_list ("Sharpening", "Threshold"); - if (pedited) { - pedited->colorToning.redhigh = true; + if (thresh.size() >= 4) { + sharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); + } } - } - - if (keyFile.has_key ("ColorToning", "Greenhigh")) { - colorToning.greenhigh = keyFile.get_double ("ColorToning", "Greenhigh"); if (pedited) { - pedited->colorToning.greenhigh = true; + pedited->sharpening.threshold = true; } } - if (keyFile.has_key ("ColorToning", "Bluehigh")) { - colorToning.bluehigh = keyFile.get_double ("ColorToning", "Bluehigh"); + assignFromKeyfile(keyFile, "Sharpening", "OnlyEdges", pedited, sharpening.edgesonly, pedited->sharpening.edgesonly); + assignFromKeyfile(keyFile, "Sharpening", "EdgedetectionRadius", pedited, sharpening.edges_radius, pedited->sharpening.edges_radius); + assignFromKeyfile(keyFile, "Sharpening", "EdgeTolerance", pedited, sharpening.edges_tolerance, pedited->sharpening.edges_tolerance); + assignFromKeyfile(keyFile, "Sharpening", "HalocontrolEnabled", pedited, sharpening.halocontrol, pedited->sharpening.halocontrol); + assignFromKeyfile(keyFile, "Sharpening", "HalocontrolAmount", pedited, sharpening.halocontrol_amount, pedited->sharpening.halocontrol_amount); + assignFromKeyfile(keyFile, "Sharpening", "Method", pedited, sharpening.method, pedited->sharpening.method); + assignFromKeyfile(keyFile, "Sharpening", "DeconvRadius", pedited, sharpening.deconvradius, pedited->sharpening.deconvradius); + assignFromKeyfile(keyFile, "Sharpening", "DeconvAmount", pedited, sharpening.deconvamount, pedited->sharpening.deconvamount); + assignFromKeyfile(keyFile, "Sharpening", "DeconvDamping", pedited, sharpening.deconvdamping, pedited->sharpening.deconvdamping); + assignFromKeyfile(keyFile, "Sharpening", "DeconvIterations", pedited, sharpening.deconviter, pedited->sharpening.deconviter); + } - if (pedited) { - pedited->colorToning.bluehigh = true; - } - } + if (keyFile.has_group ("SharpenEdge")) { + assignFromKeyfile(keyFile, "SharpenEdge", "Enabled", pedited, sharpenEdge.enabled, pedited->sharpenEdge.enabled); + assignFromKeyfile(keyFile, "SharpenEdge", "Passes", pedited, sharpenEdge.passes, pedited->sharpenEdge.passes); + assignFromKeyfile(keyFile, "SharpenEdge", "Strength", pedited, sharpenEdge.amount, pedited->sharpenEdge.amount); + assignFromKeyfile(keyFile, "SharpenEdge", "ThreeChannels", pedited, sharpenEdge.threechannels, pedited->sharpenEdge.threechannels); } -// load raw settings - if (keyFile.has_group ("RAW")) { - if (keyFile.has_key ("RAW", "DarkFrame")) { - raw.dark_frame = expandRelativePath (fname, "", keyFile.get_string ("RAW", "DarkFrame" )); + if (keyFile.has_group ("SharpenMicro")) { + assignFromKeyfile(keyFile, "SharpenMicro", "Enabled", pedited, sharpenMicro.enabled, pedited->sharpenMicro.enabled); + assignFromKeyfile(keyFile, "SharpenMicro", "Matrix", pedited, sharpenMicro.matrix, pedited->sharpenMicro.matrix); + assignFromKeyfile(keyFile, "SharpenMicro", "Strength", pedited, sharpenMicro.amount, pedited->sharpenMicro.amount); + assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, sharpenMicro.uniformity, pedited->sharpenMicro.uniformity); + } - if (pedited) { - pedited->raw.darkFrame = true; - } - } + if (keyFile.has_group ("Vibrance")) { + assignFromKeyfile(keyFile, "Vibrance", "Enabled", pedited, vibrance.enabled, pedited->vibrance.enabled); + assignFromKeyfile(keyFile, "Vibrance", "Pastels", pedited, vibrance.pastels, pedited->vibrance.pastels); + assignFromKeyfile(keyFile, "Vibrance", "Saturated", pedited, vibrance.saturated, pedited->vibrance.saturated); - if (keyFile.has_key ("RAW", "DarkFrameAuto")) { - raw.df_autoselect = keyFile.get_boolean ("RAW", "DarkFrameAuto" ); + if (keyFile.has_key ("Vibrance", "PSThreshold")) { + if (ppVersion < 302) { + int thresh = keyFile.get_integer ("Vibrance", "PSThreshold"); + vibrance.psthreshold.setValues (thresh, thresh); + } else { + const std::vector thresh = keyFile.get_integer_list ("Vibrance", "PSThreshold"); - if (pedited) { - pedited->raw.dfAuto = true; + if (thresh.size() >= 2 ) { + vibrance.psthreshold.setValues (thresh[0], thresh[1]); + } } - } - - if (keyFile.has_key ("RAW", "FlatFieldFile")) { - raw.ff_file = expandRelativePath (fname, "", keyFile.get_string ("RAW", "FlatFieldFile" )); if (pedited) { - pedited->raw.ff_file = true; + pedited->vibrance.psthreshold = true; } } - if (keyFile.has_key ("RAW", "FlatFieldAutoSelect")) { - raw.ff_AutoSelect = keyFile.get_boolean ("RAW", "FlatFieldAutoSelect" ); + assignFromKeyfile(keyFile, "Vibrance", "ProtectSkins", pedited, vibrance.protectskins, pedited->vibrance.protectskins); + assignFromKeyfile(keyFile, "Vibrance", "AvoidColorShift", pedited, vibrance.avoidcolorshift, pedited->vibrance.avoidcolorshift); + assignFromKeyfile(keyFile, "Vibrance", "PastSatTog", pedited, vibrance.pastsattog, pedited->vibrance.pastsattog); + assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); + } + + if (keyFile.has_group ("White Balance")) { + assignFromKeyfile(keyFile, "White Balance", "Enabled", pedited, wb.enabled, pedited->wb.enabled); + assignFromKeyfile(keyFile, "White Balance", "Setting", pedited, wb.method, pedited->wb.method); + assignFromKeyfile(keyFile, "White Balance", "Temperature", pedited, wb.temperature, pedited->wb.temperature); + assignFromKeyfile(keyFile, "White Balance", "Green", pedited, wb.green, pedited->wb.green); + assignFromKeyfile(keyFile, "White Balance", "Equal", pedited, wb.equal, pedited->wb.equal); + assignFromKeyfile(keyFile, "White Balance", "TemperatureBias", pedited, wb.tempBias, pedited->wb.tempBias); + } - if (pedited) { - pedited->raw.ff_AutoSelect = true; - } - } + if (keyFile.has_group ("Defringing")) { + assignFromKeyfile(keyFile, "Defringing", "Enabled", pedited, defringe.enabled, pedited->defringe.enabled); + assignFromKeyfile(keyFile, "Defringing", "Radius", pedited, defringe.radius, pedited->defringe.radius); - if (keyFile.has_key ("RAW", "FlatFieldBlurRadius")) { - raw.ff_BlurRadius = keyFile.get_integer ("RAW", "FlatFieldBlurRadius" ); + if (keyFile.has_key ("Defringing", "Threshold")) { + defringe.threshold = (float)keyFile.get_integer ("Defringing", "Threshold"); if (pedited) { - pedited->raw.ff_BlurRadius = true; + pedited->defringe.threshold = true; } } - if (keyFile.has_key ("RAW", "FlatFieldBlurType")) { - raw.ff_BlurType = keyFile.get_string ("RAW", "FlatFieldBlurType" ); - - if (pedited) { - pedited->raw.ff_BlurType = true; - } + if (ppVersion < 310) { + defringe.threshold = sqrt (defringe.threshold * 33.f / 5.f); } - if (keyFile.has_key ("RAW", "FlatFieldAutoClipControl")) { - raw.ff_AutoClipControl = keyFile.get_boolean ("RAW", "FlatFieldAutoClipControl" ); + assignFromKeyfile(keyFile, "Defringing", "HueCurve", pedited, defringe.huecurve, pedited->defringe.huecurve); + } - if (pedited) { - pedited->raw.ff_AutoClipControl = true; - } + if (keyFile.has_group ("Color appearance")) { + assignFromKeyfile(keyFile, "Color appearance", "Enabled", pedited, colorappearance.enabled, pedited->colorappearance.enabled); + assignFromKeyfile(keyFile, "Color appearance", "Degree", pedited, colorappearance.degree, pedited->colorappearance.degree); + assignFromKeyfile(keyFile, "Color appearance", "AutoDegree", pedited, colorappearance.autodegree, pedited->colorappearance.autodegree); + assignFromKeyfile(keyFile, "Color appearance", "Degreeout", pedited, colorappearance.degreeout, pedited->colorappearance.degreeout); + + assignFromKeyfile(keyFile, "Color appearance", "AutoDegreeout", pedited, colorappearance.autodegreeout, pedited->colorappearance.autodegreeout); + + assignFromKeyfile(keyFile, "Color appearance", "Surround", pedited, colorappearance.surround, pedited->colorappearance.surround); + assignFromKeyfile(keyFile, "Color appearance", "Surrsrc", pedited, colorappearance.surrsrc, pedited->colorappearance.surrsrc); + assignFromKeyfile(keyFile, "Color appearance", "AdaptLum", pedited, colorappearance.adaplum, pedited->colorappearance.adaplum); + assignFromKeyfile(keyFile, "Color appearance", "Badpixsl", pedited, colorappearance.badpixsl, pedited->colorappearance.badpixsl); + assignFromKeyfile(keyFile, "Color appearance", "Model", pedited, colorappearance.wbmodel, pedited->colorappearance.wbmodel); + assignFromKeyfile(keyFile, "Color appearance", "Algorithm", pedited, colorappearance.algo, pedited->colorappearance.algo); + assignFromKeyfile(keyFile, "Color appearance", "J-Light", pedited, colorappearance.jlight, pedited->colorappearance.jlight); + assignFromKeyfile(keyFile, "Color appearance", "Q-Bright", pedited, colorappearance.qbright, pedited->colorappearance.qbright); + assignFromKeyfile(keyFile, "Color appearance", "C-Chroma", pedited, colorappearance.chroma, pedited->colorappearance.chroma); + assignFromKeyfile(keyFile, "Color appearance", "S-Chroma", pedited, colorappearance.schroma, pedited->colorappearance.schroma); + assignFromKeyfile(keyFile, "Color appearance", "M-Chroma", pedited, colorappearance.mchroma, pedited->colorappearance.mchroma); + assignFromKeyfile(keyFile, "Color appearance", "RSTProtection", pedited, colorappearance.rstprotection, pedited->colorappearance.rstprotection); + assignFromKeyfile(keyFile, "Color appearance", "J-Contrast", pedited, colorappearance.contrast, pedited->colorappearance.contrast); + assignFromKeyfile(keyFile, "Color appearance", "Q-Contrast", pedited, colorappearance.qcontrast, pedited->colorappearance.qcontrast); + assignFromKeyfile(keyFile, "Color appearance", "H-Hue", pedited, colorappearance.colorh, pedited->colorappearance.colorh); + assignFromKeyfile(keyFile, "Color appearance", "AdaptScene", pedited, colorappearance.adapscen, pedited->colorappearance.adapscen); + assignFromKeyfile(keyFile, "Color appearance", "AutoAdapscen", pedited, colorappearance.autoadapscen, pedited->colorappearance.autoadapscen); + assignFromKeyfile(keyFile, "Color appearance", "YbScene", pedited, colorappearance.ybscen, pedited->colorappearance.ybscen); + assignFromKeyfile(keyFile, "Color appearance", "Autoybscen", pedited, colorappearance.autoybscen, pedited->colorappearance.autoybscen); + assignFromKeyfile(keyFile, "Color appearance", "SurrSource", pedited, colorappearance.surrsource, pedited->colorappearance.surrsource); + assignFromKeyfile(keyFile, "Color appearance", "Gamut", pedited, colorappearance.gamut, pedited->colorappearance.gamut); + assignFromKeyfile(keyFile, "Color appearance", "Tempout", pedited, colorappearance.tempout, pedited->colorappearance.tempout); + assignFromKeyfile(keyFile, "Color appearance", "Greenout", pedited, colorappearance.greenout, pedited->colorappearance.greenout); + assignFromKeyfile(keyFile, "Color appearance", "Tempsc", pedited, colorappearance.tempsc, pedited->colorappearance.tempsc); + assignFromKeyfile(keyFile, "Color appearance", "Greensc", pedited, colorappearance.greensc, pedited->colorappearance.greensc); + assignFromKeyfile(keyFile, "Color appearance", "Ybout", pedited, colorappearance.ybout, pedited->colorappearance.ybout); + assignFromKeyfile(keyFile, "Color appearance", "Datacie", pedited, colorappearance.datacie, pedited->colorappearance.datacie); + assignFromKeyfile(keyFile, "Color appearance", "Tonecie", pedited, colorappearance.tonecie, pedited->colorappearance.tonecie); + + const std::map tc_mapping = { + {"Lightness", ColorAppearanceParams::TcMode::LIGHT}, + {"Brightness", ColorAppearanceParams::TcMode::BRIGHT} + }; + assignFromKeyfile(keyFile, "Color appearance", "CurveMode", pedited, tc_mapping, colorappearance.curveMode, pedited->colorappearance.curveMode); + assignFromKeyfile(keyFile, "Color appearance", "CurveMode2", pedited, tc_mapping, colorappearance.curveMode2, pedited->colorappearance.curveMode2); + + assignFromKeyfile( + keyFile, + "Color appearance", + "CurveMode3", + pedited, + { + {"Chroma", ColorAppearanceParams::CtcMode::CHROMA}, + {"Saturation", ColorAppearanceParams::CtcMode::SATUR}, + {"Colorfullness", ColorAppearanceParams::CtcMode::COLORF} + }, + colorappearance.curveMode3, + pedited->colorappearance.curveMode3 + ); + + if (ppVersion > 200) { + assignFromKeyfile(keyFile, "Color appearance", "Curve", pedited, colorappearance.curve, pedited->colorappearance.curve); + assignFromKeyfile(keyFile, "Color appearance", "Curve2", pedited, colorappearance.curve2, pedited->colorappearance.curve2); + assignFromKeyfile(keyFile, "Color appearance", "Curve3", pedited, colorappearance.curve3, pedited->colorappearance.curve3); } - if (keyFile.has_key ("RAW", "FlatFieldClipControl")) { - raw.ff_clipControl = keyFile.get_boolean ("RAW", "FlatFieldClipControl" ); + } - if (pedited) { - pedited->raw.ff_clipControl = true; - } - } + if (keyFile.has_group ("Impulse Denoising")) { + assignFromKeyfile(keyFile, "Impulse Denoising", "Enabled", pedited, impulseDenoise.enabled, pedited->impulseDenoise.enabled); + assignFromKeyfile(keyFile, "Impulse Denoising", "Threshold", pedited, impulseDenoise.thresh, pedited->impulseDenoise.thresh); + } - if (keyFile.has_key ("RAW", "CA")) { - raw.ca_autocorrect = keyFile.get_boolean ("RAW", "CA" ); + if (keyFile.has_group ("Directional Pyramid Denoising")) {//TODO: No longer an accurate description for FT denoise + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enabled", pedited, dirpyrDenoise.enabled, pedited->dirpyrDenoise.enabled); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Enhance", pedited, dirpyrDenoise.enhance, pedited->dirpyrDenoise.enhance); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Median", pedited, dirpyrDenoise.median, pedited->dirpyrDenoise.median); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Luma", pedited, dirpyrDenoise.luma, pedited->dirpyrDenoise.luma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Ldetail", pedited, dirpyrDenoise.Ldetail, pedited->dirpyrDenoise.Ldetail); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Chroma", pedited, dirpyrDenoise.chroma, pedited->dirpyrDenoise.chroma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Method", pedited, dirpyrDenoise.dmethod, pedited->dirpyrDenoise.dmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LMethod", pedited, dirpyrDenoise.Lmethod, pedited->dirpyrDenoise.Lmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CMethod", pedited, dirpyrDenoise.Cmethod, pedited->dirpyrDenoise.Cmethod); - if (pedited) { - pedited->raw.caCorrection = true; - } + if (dirpyrDenoise.Cmethod == "PRE") { + dirpyrDenoise.Cmethod = "MAN"; // Never load 'auto chroma preview mode' from pp3 } - if (keyFile.has_key ("RAW", "CARed")) { - raw.cared = keyFile.get_double ("RAW", "CARed" ); - - if (pedited) { - pedited->raw.caRed = true; - } + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "C2Method", pedited, dirpyrDenoise.C2method, pedited->dirpyrDenoise.C2method); + if (dirpyrDenoise.C2method == "PREV") { + dirpyrDenoise.C2method = "MANU"; } - if (keyFile.has_key ("RAW", "CABlue")) { - raw.cablue = keyFile.get_double ("RAW", "CABlue" ); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "SMethod", pedited, dirpyrDenoise.smethod, pedited->dirpyrDenoise.smethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MedMethod", pedited, dirpyrDenoise.medmethod, pedited->dirpyrDenoise.medmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "MethodMed", pedited, dirpyrDenoise.methodmed, pedited->dirpyrDenoise.methodmed); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "RGBMethod", pedited, dirpyrDenoise.rgbmethod, pedited->dirpyrDenoise.rgbmethod); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "LCurve", pedited, dirpyrDenoise.lcurve, pedited->dirpyrDenoise.lcurve); + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "CCCurve", pedited, dirpyrDenoise.cccurve, pedited->dirpyrDenoise.cccurve); + + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Redchro", pedited, dirpyrDenoise.redchro, pedited->dirpyrDenoise.redchro); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Bluechro", pedited, dirpyrDenoise.bluechro, pedited->dirpyrDenoise.bluechro); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Gamma", pedited, dirpyrDenoise.gamma, pedited->dirpyrDenoise.gamma); + assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Passes", pedited, dirpyrDenoise.passes, pedited->dirpyrDenoise.passes); + } - if (pedited) { - pedited->raw.caBlue = true; - } - } + if (keyFile.has_group ("EPD")) { + assignFromKeyfile(keyFile, "EPD", "Enabled", pedited, epd.enabled, pedited->epd.enabled); + assignFromKeyfile(keyFile, "EPD", "Strength", pedited, epd.strength, pedited->epd.strength); + assignFromKeyfile(keyFile, "EPD", "Gamma", pedited, epd.gamma, pedited->epd.gamma); + assignFromKeyfile(keyFile, "EPD", "EdgeStopping", pedited, epd.edgeStopping, pedited->epd.edgeStopping); + assignFromKeyfile(keyFile, "EPD", "Scale", pedited, epd.scale, pedited->epd.scale); + assignFromKeyfile(keyFile, "EPD", "ReweightingIterates", pedited, epd.reweightingIterates, pedited->epd.reweightingIterates); + } -// for compatibility to elder pp3 versions - if (keyFile.has_key ("RAW", "HotDeadPixels")) { - raw.deadPixelFilter = raw.hotPixelFilter = keyFile.get_boolean ("RAW", "HotDeadPixels" ); + if (keyFile.has_group ("FattalToneMapping")) { + assignFromKeyfile(keyFile, "FattalToneMapping", "Enabled", pedited, fattal.enabled, pedited->fattal.enabled); + assignFromKeyfile(keyFile, "FattalToneMapping", "Threshold", pedited, fattal.threshold, pedited->fattal.threshold); + assignFromKeyfile(keyFile, "FattalToneMapping", "Amount", pedited, fattal.amount, pedited->fattal.amount); + assignFromKeyfile(keyFile, "FattalToneMapping", "Anchor", pedited, fattal.anchor, pedited->fattal.anchor); + } + if (keyFile.has_group ("Shadows & Highlights")) { + assignFromKeyfile(keyFile, "Shadows & Highlights", "Enabled", pedited, sh.enabled, pedited->sh.enabled); + assignFromKeyfile(keyFile, "Shadows & Highlights", "HighQuality", pedited, sh.hq, pedited->sh.hq); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Highlights", pedited, sh.highlights, pedited->sh.highlights); + assignFromKeyfile(keyFile, "Shadows & Highlights", "HighlightTonalWidth", pedited, sh.htonalwidth, pedited->sh.htonalwidth); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Shadows", pedited, sh.shadows, pedited->sh.shadows); + assignFromKeyfile(keyFile, "Shadows & Highlights", "ShadowTonalWidth", pedited, sh.stonalwidth, pedited->sh.stonalwidth); + assignFromKeyfile(keyFile, "Shadows & Highlights", "Radius", pedited, sh.radius, pedited->sh.radius); + if (keyFile.has_key("Shadows & Highlights", "LocalContrast") && ppVersion < 329) { + int lc = keyFile.get_integer("Shadows & Highlights", "LocalContrast"); + localContrast.amount = float(lc) / (sh.hq ? 500.0 : 30.); + if (pedited) { + pedited->localContrast.amount = true; + } + localContrast.enabled = sh.enabled; if (pedited) { - pedited->raw.hotPixelFilter = pedited->raw.deadPixelFilter = true; + pedited->localContrast.enabled = true; } - } - - if (keyFile.has_key ("RAW", "HotPixelFilter")) { - raw.hotPixelFilter = keyFile.get_boolean ("RAW", "HotPixelFilter" ); - + localContrast.radius = sh.radius; if (pedited) { - pedited->raw.hotPixelFilter = true; + pedited->localContrast.radius = true; } } + } + + if (keyFile.has_group ("Crop")) { + assignFromKeyfile(keyFile, "Crop", "Enabled", pedited, crop.enabled, pedited->crop.enabled); + assignFromKeyfile(keyFile, "Crop", "X", pedited, crop.x, pedited->crop.x); + assignFromKeyfile(keyFile, "Crop", "Y", pedited, crop.y, pedited->crop.y); - if (keyFile.has_key ("RAW", "DeadPixelFilter")) { - raw.deadPixelFilter = keyFile.get_boolean ("RAW", "DeadPixelFilter" ); + if (keyFile.has_key ("Crop", "W")) { + crop.w = std::max (keyFile.get_integer ("Crop", "W"), 1); if (pedited) { - pedited->raw.deadPixelFilter = true; + pedited->crop.w = true; } } - if (keyFile.has_key ("RAW", "HotDeadPixelThresh")) { - raw.hotdeadpix_thresh = keyFile.get_integer ("RAW", "HotDeadPixelThresh" ); + if (keyFile.has_key ("Crop", "H")) { + crop.h = std::max (keyFile.get_integer ("Crop", "H"), 1); if (pedited) { - pedited->raw.hotDeadPixelThresh = true; + pedited->crop.h = true; } } - if (keyFile.has_key ("RAW", "PreExposure")) { - raw.expos = keyFile.get_double ("RAW", "PreExposure"); + assignFromKeyfile(keyFile, "Crop", "FixedRatio", pedited, crop.fixratio, pedited->crop.fixratio); - if (pedited) { - pedited->raw.exPos = true; + if (assignFromKeyfile(keyFile, "Crop", "Ratio", pedited, crop.ratio, pedited->crop.ratio)) { + //backwards compatibility for crop.ratio + if (crop.ratio == "DIN") { + crop.ratio = "1.414 - DIN EN ISO 216"; } - } - if (keyFile.has_key ("RAW", "PrePreserv")) { - raw.preser = keyFile.get_double ("RAW", "PrePreserv"); + if (crop.ratio == "8.5:11") { + crop.ratio = "8.5:11 - US Letter"; + } - if (pedited) { - pedited->raw.exPreser = true; + if (crop.ratio == "11:17") { + crop.ratio = "11:17 - Tabloid"; } } + assignFromKeyfile(keyFile, "Crop", "Orientation", pedited, crop.orientation, pedited->crop.orientation); + assignFromKeyfile(keyFile, "Crop", "Guide", pedited, crop.guide, pedited->crop.guide); + } - if (ppVersion < 320) { - if (keyFile.has_key ("RAW", "Method")) { - raw.bayersensor.method = keyFile.get_string ("RAW", "Method"); + if (keyFile.has_group ("Coarse Transformation")) { + assignFromKeyfile(keyFile, "Coarse Transformation", "Rotate", pedited, coarse.rotate, pedited->coarse.rotate); + assignFromKeyfile(keyFile, "Coarse Transformation", "HorizontalFlip", pedited, coarse.hflip, pedited->coarse.hflip); + assignFromKeyfile(keyFile, "Coarse Transformation", "VerticalFlip", pedited, coarse.vflip, pedited->coarse.vflip); + } - if (pedited) { - pedited->raw.bayersensor.method = true; - } - } + if (keyFile.has_group ("Rotation")) { + assignFromKeyfile(keyFile, "Rotation", "Degree", pedited, rotate.degree, pedited->rotate.degree); + } - if (keyFile.has_key ("RAW", "CcSteps")) { - raw.bayersensor.ccSteps = keyFile.get_integer ("RAW", "CcSteps"); + if (keyFile.has_group ("Common Properties for Transformations")) { + assignFromKeyfile(keyFile, "Common Properties for Transformations", "AutoFill", pedited, commonTrans.autofill, pedited->commonTrans.autofill); + } - if (pedited) { - pedited->raw.bayersensor.ccSteps = true; - } - } + if (keyFile.has_group ("Distortion")) { + assignFromKeyfile(keyFile, "Distortion", "Amount", pedited, distortion.amount, pedited->distortion.amount); + } - if (keyFile.has_key ("RAW", "LineDenoise")) { - raw.bayersensor.linenoise = keyFile.get_integer ("RAW", "LineDenoise" ); + if (keyFile.has_group ("LensProfile")) { + if (keyFile.has_key ("LensProfile", "LcMode")) { + lensProf.lcMode = lensProf.getMethodNumber (keyFile.get_string ("LensProfile", "LcMode")); - if (pedited) { - pedited->raw.bayersensor.linenoise = true; - } + if (pedited) { + pedited->lensProf.lcMode = true; } + } - if (keyFile.has_key ("RAW", "GreenEqThreshold")) { - raw.bayersensor.greenthresh = keyFile.get_integer ("RAW", "GreenEqThreshold"); + if (keyFile.has_key ("LensProfile", "LCPFile")) { + lensProf.lcpFile = expandRelativePath (fname, "", keyFile.get_string ("LensProfile", "LCPFile")); - if (pedited) { - pedited->raw.bayersensor.greenEq = true; - } + if (pedited) { + pedited->lensProf.lcpFile = true; } - if (keyFile.has_key ("RAW", "DCBIterations")) { - raw.bayersensor.dcb_iterations = keyFile.get_integer ("RAW", "DCBIterations"); - - if (pedited) { - pedited->raw.bayersensor.dcbIterations = true; - } + if (ppVersion < 327 && !lensProf.lcpFile.empty()) { + lensProf.lcMode = LensProfParams::LcMode::LCP; } + } - if (keyFile.has_key ("RAW", "DCBEnhance")) { - raw.bayersensor.dcb_enhance = keyFile.get_boolean ("RAW", "DCBEnhance"); + assignFromKeyfile(keyFile, "LensProfile", "UseDistortion", pedited, lensProf.useDist, pedited->lensProf.useDist); + assignFromKeyfile(keyFile, "LensProfile", "UseVignette", pedited, lensProf.useVign, pedited->lensProf.useVign); + assignFromKeyfile(keyFile, "LensProfile", "UseCA", pedited, lensProf.useCA, pedited->lensProf.useCA); - if (pedited) { - pedited->raw.bayersensor.dcbEnhance = true; - } + if (keyFile.has_key("LensProfile", "LFCameraMake")) { + lensProf.lfCameraMake = keyFile.get_string("LensProfile", "LFCameraMake"); + if (pedited) { + pedited->lensProf.lfCameraMake = true; } + } - if (keyFile.has_key ("RAW", "LMMSEIterations")) { - raw.bayersensor.lmmse_iterations = keyFile.get_integer ("RAW", "LMMSEIterations"); - - if (pedited) { - pedited->raw.bayersensor.lmmseIterations = true; - } + if (keyFile.has_key("LensProfile", "LFCameraModel")) { + lensProf.lfCameraModel = keyFile.get_string("LensProfile", "LFCameraModel"); + if (pedited) { + pedited->lensProf.lfCameraModel = true; } + } - if (keyFile.has_key ("RAW", "PreBlackzero")) { - raw.bayersensor.black0 = keyFile.get_double ("RAW", "PreBlackzero"); - - if (pedited) { - pedited->raw.bayersensor.exBlack0 = true; - } + if (keyFile.has_key("LensProfile", "LFLens")) { + lensProf.lfLens = keyFile.get_string("LensProfile", "LFLens"); + if (pedited) { + pedited->lensProf.lfLens = true; } + } + } - if (keyFile.has_key ("RAW", "PreBlackone")) { - raw.bayersensor.black1 = keyFile.get_double ("RAW", "PreBlackone"); + if (keyFile.has_group ("Perspective")) { + assignFromKeyfile(keyFile, "Perspective", "Horizontal", pedited, perspective.horizontal, pedited->perspective.horizontal); + assignFromKeyfile(keyFile, "Perspective", "Vertical", pedited, perspective.vertical, pedited->perspective.vertical); + } - if (pedited) { - pedited->raw.bayersensor.exBlack1 = true; - } - } + if (keyFile.has_group ("Gradient")) { + assignFromKeyfile(keyFile, "Gradient", "Enabled", pedited, gradient.enabled, pedited->gradient.enabled); + assignFromKeyfile(keyFile, "Gradient", "Degree", pedited, gradient.degree, pedited->gradient.degree); + assignFromKeyfile(keyFile, "Gradient", "Feather", pedited, gradient.feather, pedited->gradient.feather); + assignFromKeyfile(keyFile, "Gradient", "Strength", pedited, gradient.strength, pedited->gradient.strength); + assignFromKeyfile(keyFile, "Gradient", "CenterX", pedited, gradient.centerX, pedited->gradient.centerX); + assignFromKeyfile(keyFile, "Gradient", "CenterY", pedited, gradient.centerY, pedited->gradient.centerY); + } - if (keyFile.has_key ("RAW", "PreBlacktwo")) { - raw.bayersensor.black2 = keyFile.get_double ("RAW", "PreBlacktwo"); + if (keyFile.has_group ("PCVignette")) { + assignFromKeyfile(keyFile, "PCVignette", "Enabled", pedited, pcvignette.enabled, pedited->pcvignette.enabled); + assignFromKeyfile(keyFile, "PCVignette", "Strength", pedited, pcvignette.strength, pedited->pcvignette.strength); + assignFromKeyfile(keyFile, "PCVignette", "Feather", pedited, pcvignette.feather, pedited->pcvignette.feather); + assignFromKeyfile(keyFile, "PCVignette", "Roundness", pedited, pcvignette.roundness, pedited->pcvignette.roundness); + } - if (pedited) { - pedited->raw.bayersensor.exBlack2 = true; - } - } + if (keyFile.has_group ("CACorrection")) { + assignFromKeyfile(keyFile, "CACorrection", "Red", pedited, cacorrection.red, pedited->cacorrection.red); + assignFromKeyfile(keyFile, "CACorrection", "Blue", pedited, cacorrection.blue, pedited->cacorrection.blue); + } - if (keyFile.has_key ("RAW", "PreBlackthree")) { - raw.bayersensor.black3 = keyFile.get_double ("RAW", "PreBlackthree"); + if (keyFile.has_group ("Vignetting Correction")) { + assignFromKeyfile(keyFile, "Vignetting Correction", "Amount", pedited, vignetting.amount, pedited->vignetting.amount); + assignFromKeyfile(keyFile, "Vignetting Correction", "Radius", pedited, vignetting.radius, pedited->vignetting.radius); + assignFromKeyfile(keyFile, "Vignetting Correction", "Strength", pedited, vignetting.strength, pedited->vignetting.strength); + assignFromKeyfile(keyFile, "Vignetting Correction", "CenterX", pedited, vignetting.centerX, pedited->vignetting.centerX); + assignFromKeyfile(keyFile, "Vignetting Correction", "CenterY", pedited, vignetting.centerY, pedited->vignetting.centerY); + } - if (pedited) { - pedited->raw.bayersensor.exBlack3 = true; - } - } + if (keyFile.has_group ("Resize")) { + assignFromKeyfile(keyFile, "Resize", "Enabled", pedited, resize.enabled, pedited->resize.enabled); + assignFromKeyfile(keyFile, "Resize", "Scale", pedited, resize.scale, pedited->resize.scale); + assignFromKeyfile(keyFile, "Resize", "AppliesTo", pedited, resize.appliesTo, pedited->resize.appliesTo); + assignFromKeyfile(keyFile, "Resize", "Method", pedited, resize.method, pedited->resize.method); + assignFromKeyfile(keyFile, "Resize", "DataSpecified", pedited, resize.dataspec, pedited->resize.dataspec); + assignFromKeyfile(keyFile, "Resize", "Width", pedited, resize.width, pedited->resize.width); + assignFromKeyfile(keyFile, "Resize", "Height", pedited, resize.height, pedited->resize.height); + } - if (keyFile.has_key ("RAW", "PreTwoGreen")) { - raw.bayersensor.twogreen = keyFile.get_boolean ("RAW", "PreTwoGreen"); + if (keyFile.has_group ("PostResizeSharpening")) { + assignFromKeyfile(keyFile, "PostResizeSharpening", "Enabled", pedited, prsharpening.enabled, pedited->prsharpening.enabled); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Radius", pedited, prsharpening.radius, pedited->prsharpening.radius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Amount", pedited, prsharpening.amount, pedited->prsharpening.amount); - if (pedited) { - pedited->raw.bayersensor.exTwoGreen = true; + if (keyFile.has_key ("PostResizeSharpening", "Threshold")) { + if (ppVersion < 302) { + int thresh = min (keyFile.get_integer ("PostResizeSharpening", "Threshold"), 2000); + prsharpening.threshold.setValues (thresh, thresh, 2000, 2000); // TODO: 2000 is the maximum value and is taken of rtgui/sharpening.cc ; should be changed by the tool modularization + } else { + const std::vector thresh = keyFile.get_integer_list ("PostResizeSharpening", "Threshold"); + + if (thresh.size() >= 4) { + prsharpening.threshold.setValues (thresh[0], thresh[1], min (thresh[2], 2000), min (thresh[3], 2000)); } } -//if (keyFile.has_key ("RAW", "ALLEnhance")) { raw.bayersensor.all_enhance = keyFile.get_boolean("RAW", "ALLEnhance"); if (pedited) pedited->raw.bayersensor.allEnhance = true; } + if (pedited) { + pedited->prsharpening.threshold = true; + } } + + assignFromKeyfile(keyFile, "PostResizeSharpening", "OnlyEdges", pedited, prsharpening.edgesonly, pedited->prsharpening.edgesonly); + assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgedetectionRadius", pedited, prsharpening.edges_radius, pedited->prsharpening.edges_radius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "EdgeTolerance", pedited, prsharpening.edges_tolerance, pedited->prsharpening.edges_tolerance); + assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolEnabled", pedited, prsharpening.halocontrol, pedited->prsharpening.halocontrol); + assignFromKeyfile(keyFile, "PostResizeSharpening", "HalocontrolAmount", pedited, prsharpening.halocontrol_amount, pedited->prsharpening.halocontrol_amount); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Method", pedited, prsharpening.method, pedited->prsharpening.method); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvRadius", pedited, prsharpening.deconvradius, pedited->prsharpening.deconvradius); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvAmount", pedited, prsharpening.deconvamount, pedited->prsharpening.deconvamount); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvDamping", pedited, prsharpening.deconvdamping, pedited->prsharpening.deconvdamping); + assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvIterations", pedited, prsharpening.deconviter, pedited->prsharpening.deconviter); } -// load Bayer sensors' raw settings - if (keyFile.has_group ("RAW Bayer")) { - if (keyFile.has_key ("RAW Bayer", "Method")) { - raw.bayersensor.method = keyFile.get_string ("RAW Bayer", "Method"); + if (keyFile.has_group ("Color Management")) { + if (keyFile.has_key ("Color Management", "InputProfile")) { + icm.input = expandRelativePath (fname, "file:", keyFile.get_string ("Color Management", "InputProfile")); if (pedited) { - pedited->raw.bayersensor.method = true; + pedited->icm.input = true; } } - if (keyFile.has_key ("RAW Bayer", "ImageNum")) { - raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; + assignFromKeyfile(keyFile, "Color Management", "ToneCurve", pedited, icm.toneCurve, pedited->icm.toneCurve); + assignFromKeyfile(keyFile, "Color Management", "ApplyLookTable", pedited, icm.applyLookTable, pedited->icm.applyLookTable); + assignFromKeyfile(keyFile, "Color Management", "ApplyBaselineExposureOffset", pedited, icm.applyBaselineExposureOffset, pedited->icm.applyBaselineExposureOffset); + assignFromKeyfile(keyFile, "Color Management", "ApplyHueSatMap", pedited, icm.applyHueSatMap, pedited->icm.applyHueSatMap); + assignFromKeyfile(keyFile, "Color Management", "DCPIlluminant", pedited, icm.dcpIlluminant, pedited->icm.dcpIlluminant); + assignFromKeyfile(keyFile, "Color Management", "WorkingProfile", pedited, icm.working, pedited->icm.working); + assignFromKeyfile(keyFile, "Color Management", "OutputProfile", pedited, icm.output, pedited->icm.output); - if (pedited) { - pedited->raw.bayersensor.imageNum = true; - } - } + if (keyFile.has_key ("Color Management", "OutputProfileIntent")) { + Glib::ustring intent = keyFile.get_string ("Color Management", "OutputProfileIntent"); - if (keyFile.has_key ("RAW Bayer", "CcSteps")) { - raw.bayersensor.ccSteps = keyFile.get_integer ("RAW Bayer", "CcSteps"); + if (intent == "Perceptual") { + icm.outputIntent = RI_PERCEPTUAL; + } else if (intent == "Relative") { + icm.outputIntent = RI_RELATIVE; + } else if (intent == "Saturation") { + icm.outputIntent = RI_SATURATION; + } else if (intent == "Absolute") { + icm.outputIntent = RI_ABSOLUTE; + } if (pedited) { - pedited->raw.bayersensor.ccSteps = true; + pedited->icm.outputIntent = true; } } - if (keyFile.has_key ("RAW Bayer", "PreBlack0")) { - raw.bayersensor.black0 = keyFile.get_double ("RAW Bayer", "PreBlack0"); + assignFromKeyfile(keyFile, "Color Management", "OutputBPC", pedited, icm.outputBPC, pedited->icm.outputBPC); + assignFromKeyfile(keyFile, "Color Management", "Gammafree", pedited, icm.gamma, pedited->icm.gamma); + assignFromKeyfile(keyFile, "Color Management", "Freegamma", pedited, icm.freegamma, pedited->icm.freegamma); + assignFromKeyfile(keyFile, "Color Management", "GammaValue", pedited, icm.gampos, pedited->icm.gampos); + assignFromKeyfile(keyFile, "Color Management", "GammaSlope", pedited, icm.slpos, pedited->icm.slpos); + } - if (pedited) { - pedited->raw.bayersensor.exBlack0 = true; + if (keyFile.has_group ("Wavelet")) { + assignFromKeyfile(keyFile, "Wavelet", "Enabled", pedited, wavelet.enabled, pedited->wavelet.enabled); + assignFromKeyfile(keyFile, "Wavelet", "Strength", pedited, wavelet.strength, pedited->wavelet.strength); + assignFromKeyfile(keyFile, "Wavelet", "Balance", pedited, wavelet.balance, pedited->wavelet.balance); + assignFromKeyfile(keyFile, "Wavelet", "Iter", pedited, wavelet.iter, pedited->wavelet.iter); + assignFromKeyfile(keyFile, "Wavelet", "Median", pedited, wavelet.median, pedited->wavelet.median); + assignFromKeyfile(keyFile, "Wavelet", "Medianlev", pedited, wavelet.medianlev, pedited->wavelet.medianlev); + assignFromKeyfile(keyFile, "Wavelet", "Linkedg", pedited, wavelet.linkedg, pedited->wavelet.linkedg); + assignFromKeyfile(keyFile, "Wavelet", "CBenab", pedited, wavelet.cbenab, pedited->wavelet.cbenab); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenhigh", pedited, wavelet.greenhigh, pedited->wavelet.greenhigh); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenmed", pedited, wavelet.greenmed, pedited->wavelet.greenmed); + assignFromKeyfile(keyFile, "Wavelet", "CBgreenlow", pedited, wavelet.greenlow, pedited->wavelet.greenlow); + assignFromKeyfile(keyFile, "Wavelet", "CBbluehigh", pedited, wavelet.bluehigh, pedited->wavelet.bluehigh); + assignFromKeyfile(keyFile, "Wavelet", "CBbluemed", pedited, wavelet.bluemed, pedited->wavelet.bluemed); + assignFromKeyfile(keyFile, "Wavelet", "CBbluelow", pedited, wavelet.bluelow, pedited->wavelet.bluelow); + assignFromKeyfile(keyFile, "Wavelet", "Lipst", pedited, wavelet.lipst, pedited->wavelet.lipst); + assignFromKeyfile(keyFile, "Wavelet", "AvoidColorShift", pedited, wavelet.avoid, pedited->wavelet.avoid); + assignFromKeyfile(keyFile, "Wavelet", "TMr", pedited, wavelet.tmr, pedited->wavelet.tmr); + if (ppVersion < 331) { // wavelet.Lmethod was a string before version 331 + Glib::ustring temp; + assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, temp, pedited->wavelet.Lmethod); + if (!temp.empty()) { + wavelet.Lmethod = std::stoi(temp); } + } else { + assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, wavelet.Lmethod, pedited->wavelet.Lmethod); } + assignFromKeyfile(keyFile, "Wavelet", "ChoiceLevMethod", pedited, wavelet.CLmethod, pedited->wavelet.CLmethod); + assignFromKeyfile(keyFile, "Wavelet", "BackMethod", pedited, wavelet.Backmethod, pedited->wavelet.Backmethod); + assignFromKeyfile(keyFile, "Wavelet", "TilesMethod", pedited, wavelet.Tilesmethod, pedited->wavelet.Tilesmethod); + assignFromKeyfile(keyFile, "Wavelet", "DaubMethod", pedited, wavelet.daubcoeffmethod, pedited->wavelet.daubcoeffmethod); + assignFromKeyfile(keyFile, "Wavelet", "CHromaMethod", pedited, wavelet.CHmethod, pedited->wavelet.CHmethod); + assignFromKeyfile(keyFile, "Wavelet", "Medgreinf", pedited, wavelet.Medgreinf, pedited->wavelet.Medgreinf); + assignFromKeyfile(keyFile, "Wavelet", "CHSLromaMethod", pedited, wavelet.CHSLmethod, pedited->wavelet.CHSLmethod); + assignFromKeyfile(keyFile, "Wavelet", "EDMethod", pedited, wavelet.EDmethod, pedited->wavelet.EDmethod); + assignFromKeyfile(keyFile, "Wavelet", "NPMethod", pedited, wavelet.NPmethod, pedited->wavelet.NPmethod); + assignFromKeyfile(keyFile, "Wavelet", "BAMethod", pedited, wavelet.BAmethod, pedited->wavelet.BAmethod); + assignFromKeyfile(keyFile, "Wavelet", "TMMethod", pedited, wavelet.TMmethod, pedited->wavelet.TMmethod); + assignFromKeyfile(keyFile, "Wavelet", "HSMethod", pedited, wavelet.HSmethod, pedited->wavelet.HSmethod); + assignFromKeyfile(keyFile, "Wavelet", "DirMethod", pedited, wavelet.Dirmethod, pedited->wavelet.Dirmethod); + assignFromKeyfile(keyFile, "Wavelet", "ResidualcontShadow", pedited, wavelet.rescon, pedited->wavelet.rescon); + assignFromKeyfile(keyFile, "Wavelet", "ResidualcontHighlight", pedited, wavelet.resconH, pedited->wavelet.resconH); + assignFromKeyfile(keyFile, "Wavelet", "Residualchroma", pedited, wavelet.reschro, pedited->wavelet.reschro); + assignFromKeyfile(keyFile, "Wavelet", "ResidualTM", pedited, wavelet.tmrs, pedited->wavelet.tmrs); + assignFromKeyfile(keyFile, "Wavelet", "Residualgamma", pedited, wavelet.gamma, pedited->wavelet.gamma); + assignFromKeyfile(keyFile, "Wavelet", "ContExtra", pedited, wavelet.sup, pedited->wavelet.sup); + assignFromKeyfile(keyFile, "Wavelet", "HueRangeResidual", pedited, wavelet.sky, pedited->wavelet.sky); + assignFromKeyfile(keyFile, "Wavelet", "MaxLev", pedited, wavelet.thres, pedited->wavelet.thres); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdHighlight", pedited, wavelet.threshold, pedited->wavelet.threshold); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdShadow", pedited, wavelet.threshold2, pedited->wavelet.threshold2); + assignFromKeyfile(keyFile, "Wavelet", "Edgedetect", pedited, wavelet.edgedetect, pedited->wavelet.edgedetect); + assignFromKeyfile(keyFile, "Wavelet", "Edgedetectthr", pedited, wavelet.edgedetectthr, pedited->wavelet.edgedetectthr); + assignFromKeyfile(keyFile, "Wavelet", "EdgedetectthrHi", pedited, wavelet.edgedetectthr2, pedited->wavelet.edgedetectthr2); + assignFromKeyfile(keyFile, "Wavelet", "Edgesensi", pedited, wavelet.edgesensi, pedited->wavelet.edgesensi); + assignFromKeyfile(keyFile, "Wavelet", "Edgeampli", pedited, wavelet.edgeampli, pedited->wavelet.edgeampli); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdChroma", pedited, wavelet.chroma, pedited->wavelet.chroma); + assignFromKeyfile(keyFile, "Wavelet", "ChromaLink", pedited, wavelet.chro, pedited->wavelet.chro); + assignFromKeyfile(keyFile, "Wavelet", "Contrast", pedited, wavelet.contrast, pedited->wavelet.contrast); + assignFromKeyfile(keyFile, "Wavelet", "Edgrad", pedited, wavelet.edgrad, pedited->wavelet.edgrad); + assignFromKeyfile(keyFile, "Wavelet", "Edgval", pedited, wavelet.edgval, pedited->wavelet.edgval); + assignFromKeyfile(keyFile, "Wavelet", "ThrEdg", pedited, wavelet.edgthresh, pedited->wavelet.edgthresh); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidShadow", pedited, wavelet.thr, pedited->wavelet.thr); + assignFromKeyfile(keyFile, "Wavelet", "ThresholdResidHighLight", pedited, wavelet.thrH, pedited->wavelet.thrH); + assignFromKeyfile(keyFile, "Wavelet", "ContrastCurve", pedited, wavelet.ccwcurve, pedited->wavelet.ccwcurve); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveRG", pedited, wavelet.opacityCurveRG, pedited->wavelet.opacityCurveRG); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveBY", pedited, wavelet.opacityCurveBY, pedited->wavelet.opacityCurveBY); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveW", pedited, wavelet.opacityCurveW, pedited->wavelet.opacityCurveW); + assignFromKeyfile(keyFile, "Wavelet", "OpacityCurveWL", pedited, wavelet.opacityCurveWL, pedited->wavelet.opacityCurveWL); + assignFromKeyfile(keyFile, "Wavelet", "HHcurve", pedited, wavelet.hhcurve, pedited->wavelet.hhcurve); + assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); + assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); - if (keyFile.has_key ("RAW Bayer", "PreBlack1")) { - raw.bayersensor.black1 = keyFile.get_double ("RAW Bayer", "PreBlack1"); + if (keyFile.has_key ("Wavelet", "Hueskin")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Hueskin"); - if (pedited) { - pedited->raw.bayersensor.exBlack1 = true; + if (thresh.size() >= 4) { + wavelet.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "PreBlack2")) { - raw.bayersensor.black2 = keyFile.get_double ("RAW Bayer", "PreBlack2"); if (pedited) { - pedited->raw.bayersensor.exBlack2 = true; + pedited->wavelet.hueskin = true; } } - if (keyFile.has_key ("RAW Bayer", "PreBlack3")) { - raw.bayersensor.black3 = keyFile.get_double ("RAW Bayer", "PreBlack3"); + if (keyFile.has_key ("Wavelet", "HueRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HueRange"); - if (pedited) { - pedited->raw.bayersensor.exBlack3 = true; + if (thresh.size() >= 4) { + wavelet.hueskin2.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "PreTwoGreen")) { - raw.bayersensor.twogreen = keyFile.get_boolean ("RAW Bayer", "PreTwoGreen"); if (pedited) { - pedited->raw.bayersensor.exTwoGreen = true; + pedited->wavelet.hueskin2 = true; } } - if (keyFile.has_key ("RAW Bayer", "LineDenoise")) { - raw.bayersensor.linenoise = keyFile.get_integer ("RAW Bayer", "LineDenoise" ); + if (keyFile.has_key ("Wavelet", "HLRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HLRange"); - if (pedited) { - pedited->raw.bayersensor.linenoise = true; + if (thresh.size() >= 4) { + wavelet.hllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "GreenEqThreshold")) { - raw.bayersensor.greenthresh = keyFile.get_integer ("RAW Bayer", "GreenEqThreshold"); if (pedited) { - pedited->raw.bayersensor.greenEq = true; + pedited->wavelet.hllev = true; } } - if (keyFile.has_key ("RAW Bayer", "DCBIterations")) { - raw.bayersensor.dcb_iterations = keyFile.get_integer ("RAW Bayer", "DCBIterations"); + if (keyFile.has_key ("Wavelet", "SHRange")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "SHRange"); - if (pedited) { - pedited->raw.bayersensor.dcbIterations = true; + if (thresh.size() >= 4) { + wavelet.bllev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "DCBEnhance")) { - raw.bayersensor.dcb_enhance = keyFile.get_boolean ("RAW Bayer", "DCBEnhance"); if (pedited) { - pedited->raw.bayersensor.dcbEnhance = true; + pedited->wavelet.bllev = true; } } - if (keyFile.has_key ("RAW Bayer", "LMMSEIterations")) { - raw.bayersensor.lmmse_iterations = keyFile.get_integer ("RAW Bayer", "LMMSEIterations"); + if (keyFile.has_key ("Wavelet", "Edgcont")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Edgcont"); - if (pedited) { - pedited->raw.bayersensor.lmmseIterations = true; + if (thresh.size() >= 4) { + wavelet.edgcont.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotion")) { - raw.bayersensor.pixelShiftMotion = keyFile.get_integer ("RAW Bayer", "PixelShiftMotion"); if (pedited) { - pedited->raw.bayersensor.pixelShiftMotion = true; + pedited->wavelet.edgcont = true; } } - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrection")) { - raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::ePSMotionCorrection)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrection"); + if (keyFile.has_key ("Wavelet", "Level0noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level0noise"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftMotionCorrection = true; + if (thresh.size() >= 2) { + wavelet.level0noise.setValues (thresh[0], thresh[1]); } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { - raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::ePSMotionCorrectionMethod)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod"); if (pedited) { - pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = true; + pedited->wavelet.level0noise = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftStddevFactorGreen")) { - raw.bayersensor.pixelShiftStddevFactorGreen = keyFile.get_double ("RAW Bayer", "pixelShiftStddevFactorGreen"); + if (keyFile.has_key ("Wavelet", "Level1noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level1noise"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftStddevFactorGreen = true; + if (thresh.size() >= 2) { + wavelet.level1noise.setValues (thresh[0], thresh[1]); } - } - - if (keyFile.has_key ("RAW Bayer", "pixelShiftStddevFactorRed")) { - raw.bayersensor.pixelShiftStddevFactorRed = keyFile.get_double ("RAW Bayer", "pixelShiftStddevFactorRed"); if (pedited) { - pedited->raw.bayersensor.pixelShiftStddevFactorRed = true; + pedited->wavelet.level1noise = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftStddevFactorBlue")) { - raw.bayersensor.pixelShiftStddevFactorBlue = keyFile.get_double ("RAW Bayer", "pixelShiftStddevFactorBlue"); + if (keyFile.has_key ("Wavelet", "Level2noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level2noise"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftStddevFactorBlue = true; + if (thresh.size() >= 2) { + wavelet.level2noise.setValues (thresh[0], thresh[1]); } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftEperIso")) { - raw.bayersensor.pixelShiftEperIso = keyFile.get_double ("RAW Bayer", "PixelShiftEperIso"); if (pedited) { - pedited->raw.bayersensor.pixelShiftEperIso = true; + pedited->wavelet.level2noise = true; } } - if (keyFile.has_key ("RAW Bayer", "PixelShiftNreadIso")) { - raw.bayersensor.pixelShiftNreadIso = keyFile.get_double ("RAW Bayer", "PixelShiftNreadIso"); + if (keyFile.has_key ("Wavelet", "Level3noise")) { + const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); + + if (thresh.size() >= 2) { + wavelet.level3noise.setValues (thresh[0], thresh[1]); + } if (pedited) { - pedited->raw.bayersensor.pixelShiftNreadIso = true; + pedited->wavelet.level3noise = true; } } - if (keyFile.has_key ("RAW Bayer", "PixelShiftPrnu")) { - raw.bayersensor.pixelShiftPrnu = keyFile.get_double ("RAW Bayer", "PixelShiftPrnu"); + if (keyFile.has_key ("Wavelet", "Pastlev")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftPrnu = true; + if (thresh.size() >= 4) { + wavelet.pastlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftSigma")) { - raw.bayersensor.pixelShiftSigma = keyFile.get_double ("RAW Bayer", "PixelShiftSigma"); if (pedited) { - pedited->raw.bayersensor.pixelShiftSigma = true; + pedited->wavelet.pastlev = true; } } - if (keyFile.has_key ("RAW Bayer", "PixelShiftSum")) { - raw.bayersensor.pixelShiftSum = keyFile.get_double ("RAW Bayer", "PixelShiftSum"); + if (keyFile.has_key ("Wavelet", "Satlev")) { + const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Satlev"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftSum = true; + if (thresh.size() >= 4) { + wavelet.satlev.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); } - } - - if (keyFile.has_key ("RAW Bayer", "PixelShiftRedBlueWeight")) { - raw.bayersensor.pixelShiftRedBlueWeight = keyFile.get_double ("RAW Bayer", "PixelShiftRedBlueWeight"); if (pedited) { - pedited->raw.bayersensor.pixelShiftRedBlueWeight = true; + pedited->wavelet.satlev = true; } } - if (keyFile.has_key ("RAW Bayer", "PixelShiftShowMotion")) { - raw.bayersensor.pixelShiftShowMotion = keyFile.get_boolean ("RAW Bayer", "PixelShiftShowMotion"); + assignFromKeyfile(keyFile, "Wavelet", "Skinprotect", pedited, wavelet.skinprotect, pedited->wavelet.skinprotect); + assignFromKeyfile(keyFile, "Wavelet", "Expcontrast", pedited, wavelet.expcontrast, pedited->wavelet.expcontrast); + assignFromKeyfile(keyFile, "Wavelet", "Expchroma", pedited, wavelet.expchroma, pedited->wavelet.expchroma); - if (pedited) { - pedited->raw.bayersensor.pixelShiftShowMotion = true; - } - } + for (int i = 0; i < 9; ++i) { + std::stringstream ss; + ss << "Contrast" << (i + 1); - if (keyFile.has_key ("RAW Bayer", "PixelShiftShowMotionMaskOnly")) { - raw.bayersensor.pixelShiftShowMotionMaskOnly = keyFile.get_boolean ("RAW Bayer", "PixelShiftShowMotionMaskOnly"); + if (keyFile.has_key ("Wavelet", ss.str())) { + wavelet.c[i] = keyFile.get_integer ("Wavelet", ss.str()); - if (pedited) { - pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly = true; + if (pedited) { + pedited->wavelet.c[i] = true; + } } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftAutomatic")) { - raw.bayersensor.pixelShiftAutomatic = keyFile.get_boolean ("RAW Bayer", "pixelShiftAutomatic"); + for (int i = 0; i < 9; ++i) { + std::stringstream ss; + ss << "Chroma" << (i + 1); - if (pedited) { - pedited->raw.bayersensor.pixelShiftAutomatic = true; + if (keyFile.has_key ("Wavelet", ss.str())) { + wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); + + if (pedited) { + pedited->wavelet.ch[i] = true; + } } } + assignFromKeyfile(keyFile, "Wavelet", "Expedge", pedited, wavelet.expedge, pedited->wavelet.expedge); + assignFromKeyfile(keyFile, "Wavelet", "Expresid", pedited, wavelet.expresid, pedited->wavelet.expresid); + assignFromKeyfile(keyFile, "Wavelet", "Expfinal", pedited, wavelet.expfinal, pedited->wavelet.expfinal); + assignFromKeyfile(keyFile, "Wavelet", "Exptoning", pedited, wavelet.exptoning, pedited->wavelet.exptoning); + assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); + } - if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenHorizontal")) { - raw.bayersensor.pixelShiftNonGreenHorizontal = keyFile.get_boolean ("RAW Bayer", "pixelShiftNonGreenHorizontal"); + if (keyFile.has_group ("Directional Pyramid Equalizer")) { + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Enabled", pedited, dirpyrequalizer.enabled, pedited->dirpyrequalizer.enabled); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Gamutlab", pedited, dirpyrequalizer.gamutlab, pedited->dirpyrequalizer.gamutlab); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "cbdlMethod", pedited, dirpyrequalizer.cbdlMethod, pedited->dirpyrequalizer.cbdlMethod); - if (pedited) { - pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = true; - } - } + if (keyFile.has_key ("Directional Pyramid Equalizer", "Hueskin")) { + const std::vector thresh = keyFile.get_integer_list ("Directional Pyramid Equalizer", "Hueskin"); - if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenVertical")) { - raw.bayersensor.pixelShiftNonGreenVertical = keyFile.get_boolean ("RAW Bayer", "pixelShiftNonGreenVertical"); + if (thresh.size() >= 4) { + dirpyrequalizer.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + } if (pedited) { - pedited->raw.bayersensor.pixelShiftNonGreenVertical = true; + pedited->dirpyrequalizer.hueskin = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftHoleFill")) { - raw.bayersensor.pixelShiftHoleFill = keyFile.get_boolean ("RAW Bayer", "pixelShiftHoleFill"); + if (ppVersion < 316) { + for (int i = 0; i < 5; i ++) { + std::stringstream ss; + ss << "Mult" << i; - if (pedited) { - pedited->raw.bayersensor.pixelShiftHoleFill = true; - } - } + if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { + if (i == 4) { + dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); - if (keyFile.has_key ("RAW Bayer", "pixelShiftMedian")) { - raw.bayersensor.pixelShiftMedian = keyFile.get_boolean ("RAW Bayer", "pixelShiftMedian"); + if (pedited) { + pedited->dirpyrequalizer.threshold = true; + } + } else { + dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); - if (pedited) { - pedited->raw.bayersensor.pixelShiftMedian = true; + if (pedited) { + pedited->dirpyrequalizer.mult[i] = true; + } + } + } } - } - if (keyFile.has_key ("RAW Bayer", "pixelShiftMedian3")) { - raw.bayersensor.pixelShiftMedian3 = keyFile.get_boolean ("RAW Bayer", "pixelShiftMedian3"); + dirpyrequalizer.mult[4] = 1.0; + } else { + // 5 level wavelet + dedicated threshold parameter + for (int i = 0; i < 6; i ++) { + std::stringstream ss; + ss << "Mult" << i; - if (pedited) { - pedited->raw.bayersensor.pixelShiftMedian3 = true; + if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { + dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + + if (pedited) { + pedited->dirpyrequalizer.mult[i] = true; + } + } } + + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Threshold", pedited, dirpyrequalizer.threshold, pedited->dirpyrequalizer.threshold); + assignFromKeyfile(keyFile, "Directional Pyramid Equalizer", "Skinprotect", pedited, dirpyrequalizer.skinprotect, pedited->dirpyrequalizer.skinprotect); } + } - if (keyFile.has_key ("RAW Bayer", "pixelShiftGreen")) { - raw.bayersensor.pixelShiftGreen = keyFile.get_boolean ("RAW Bayer", "pixelShiftGreen"); + if (keyFile.has_group ("Film Simulation")) { + assignFromKeyfile(keyFile, "Film Simulation", "Enabled", pedited, filmSimulation.enabled, pedited->filmSimulation.enabled); + assignFromKeyfile(keyFile, "Film Simulation", "ClutFilename", pedited, filmSimulation.clutFilename, pedited->filmSimulation.clutFilename); + if (keyFile.has_key ("Film Simulation", "Strength")) { + if (ppVersion < 321) { + filmSimulation.strength = keyFile.get_double ("Film Simulation", "Strength") * 100 + 0.1; + } else { + filmSimulation.strength = keyFile.get_integer ("Film Simulation", "Strength"); + } if (pedited) { - pedited->raw.bayersensor.pixelShiftGreen = true; + pedited->filmSimulation.strength = true; } } + } - if (keyFile.has_key ("RAW Bayer", "pixelShiftBlur")) { - raw.bayersensor.pixelShiftBlur = keyFile.get_boolean ("RAW Bayer", "pixelShiftBlur"); - + if (keyFile.has_group ("HSV Equalizer")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "HSV Equalizer", "Enabled", pedited, hsvequalizer.enabled, pedited->hsvequalizer.enabled); + } else { + hsvequalizer.enabled = true; if (pedited) { - pedited->raw.bayersensor.pixelShiftBlur = true; + pedited->hsvequalizer.enabled = true; } } + if (ppVersion >= 300) { + assignFromKeyfile(keyFile, "HSV Equalizer", "HCurve", pedited, hsvequalizer.hcurve, pedited->hsvequalizer.hcurve); + assignFromKeyfile(keyFile, "HSV Equalizer", "SCurve", pedited, hsvequalizer.scurve, pedited->hsvequalizer.scurve); + assignFromKeyfile(keyFile, "HSV Equalizer", "VCurve", pedited, hsvequalizer.vcurve, pedited->hsvequalizer.vcurve); + } + } - if (keyFile.has_key ("RAW Bayer", "pixelShiftSmoothFactor")) { - raw.bayersensor.pixelShiftSmoothFactor = keyFile.get_double ("RAW Bayer", "pixelShiftSmoothFactor"); - + if (keyFile.has_group ("RGB Curves")) { + if (ppVersion >= 329) { + assignFromKeyfile(keyFile, "RGB Curves", "Enabled", pedited, rgbCurves.enabled, pedited->rgbCurves.enabled); + } else { + rgbCurves.enabled = true; if (pedited) { - pedited->raw.bayersensor.pixelShiftSmooth = true; + pedited->rgbCurves.enabled = true; } } + assignFromKeyfile(keyFile, "RGB Curves", "LumaMode", pedited, rgbCurves.lumamode, pedited->rgbCurves.lumamode); + assignFromKeyfile(keyFile, "RGB Curves", "rCurve", pedited, rgbCurves.rcurve, pedited->rgbCurves.rcurve); + assignFromKeyfile(keyFile, "RGB Curves", "gCurve", pedited, rgbCurves.gcurve, pedited->rgbCurves.gcurve); + assignFromKeyfile(keyFile, "RGB Curves", "bCurve", pedited, rgbCurves.bcurve, pedited->rgbCurves.bcurve); + } - if (keyFile.has_key ("RAW Bayer", "pixelShiftExp0")) { - raw.bayersensor.pixelShiftExp0 = keyFile.get_boolean ("RAW Bayer", "pixelShiftExp0"); + if (keyFile.has_group ("ColorToning")) { + assignFromKeyfile(keyFile, "ColorToning", "Enabled", pedited, colorToning.enabled, pedited->colorToning.enabled); + assignFromKeyfile(keyFile, "ColorToning", "Method", pedited, colorToning.method, pedited->colorToning.method); + assignFromKeyfile(keyFile, "ColorToning", "Lumamode", pedited, colorToning.lumamode, pedited->colorToning.lumamode); + assignFromKeyfile(keyFile, "ColorToning", "Twocolor", pedited, colorToning.twocolor, pedited->colorToning.twocolor); + assignFromKeyfile(keyFile, "ColorToning", "OpacityCurve", pedited, colorToning.opacityCurve, pedited->colorToning.opacityCurve); + assignFromKeyfile(keyFile, "ColorToning", "ColorCurve", pedited, colorToning.colorCurve, pedited->colorToning.colorCurve); + assignFromKeyfile(keyFile, "ColorToning", "Autosat", pedited, colorToning.autosat, pedited->colorToning.autosat); + assignFromKeyfile(keyFile, "ColorToning", "SatProtectionThreshold", pedited, colorToning.satProtectionThreshold, pedited->colorToning.satprotectionthreshold); + assignFromKeyfile(keyFile, "ColorToning", "SaturatedOpacity", pedited, colorToning.saturatedOpacity, pedited->colorToning.saturatedopacity); + assignFromKeyfile(keyFile, "ColorToning", "Strength", pedited, colorToning.strength, pedited->colorToning.strength); - if (pedited) { - pedited->raw.bayersensor.pixelShiftExp0 = true; - } - } + if (keyFile.has_key ("ColorToning", "HighlightsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list ("ColorToning", "HighlightsColorSaturation"); - if (keyFile.has_key ("RAW Bayer", "pixelShiftLmmse")) { - raw.bayersensor.pixelShiftLmmse = keyFile.get_boolean ("RAW Bayer", "pixelShiftLmmse"); + if (thresh.size() >= 2) { + colorToning.hlColSat.setValues (thresh[0], thresh[1]); + } if (pedited) { - pedited->raw.bayersensor.pixelShiftLmmse = true; + pedited->colorToning.hlColSat = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftEqualBright")) { - raw.bayersensor.pixelShiftEqualBright = keyFile.get_boolean ("RAW Bayer", "pixelShiftEqualBright"); + if (keyFile.has_key ("ColorToning", "ShadowsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list ("ColorToning", "ShadowsColorSaturation"); - if (pedited) { - pedited->raw.bayersensor.pixelShiftEqualBright = true; + if (thresh.size() >= 2) { + colorToning.shadowsColSat.setValues (thresh[0], thresh[1]); } - } - - if (keyFile.has_key ("RAW Bayer", "pixelShiftEqualBrightChannel")) { - raw.bayersensor.pixelShiftEqualBrightChannel = keyFile.get_boolean ("RAW Bayer", "pixelShiftEqualBrightChannel"); if (pedited) { - pedited->raw.bayersensor.pixelShiftEqualBrightChannel = true; + pedited->colorToning.shadowsColSat = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross")) { - raw.bayersensor.pixelShiftNonGreenCross = keyFile.get_boolean ("RAW Bayer", "pixelShiftNonGreenCross"); + assignFromKeyfile(keyFile, "ColorToning", "ClCurve", pedited, colorToning.clcurve, pedited->colorToning.clcurve); + assignFromKeyfile(keyFile, "ColorToning", "Cl2Curve", pedited, colorToning.cl2curve, pedited->colorToning.cl2curve); + assignFromKeyfile(keyFile, "ColorToning", "Redlow", pedited, colorToning.redlow, pedited->colorToning.redlow); + assignFromKeyfile(keyFile, "ColorToning", "Greenlow", pedited, colorToning.greenlow, pedited->colorToning.greenlow); + assignFromKeyfile(keyFile, "ColorToning", "Bluelow", pedited, colorToning.bluelow, pedited->colorToning.bluelow); + assignFromKeyfile(keyFile, "ColorToning", "Satlow", pedited, colorToning.satlow, pedited->colorToning.satlow); + assignFromKeyfile(keyFile, "ColorToning", "Balance", pedited, colorToning.balance, pedited->colorToning.balance); + assignFromKeyfile(keyFile, "ColorToning", "Sathigh", pedited, colorToning.sathigh, pedited->colorToning.sathigh); + assignFromKeyfile(keyFile, "ColorToning", "Redmed", pedited, colorToning.redmed, pedited->colorToning.redmed); + assignFromKeyfile(keyFile, "ColorToning", "Greenmed", pedited, colorToning.greenmed, pedited->colorToning.greenmed); + assignFromKeyfile(keyFile, "ColorToning", "Bluemed", pedited, colorToning.bluemed, pedited->colorToning.bluemed); + assignFromKeyfile(keyFile, "ColorToning", "Redhigh", pedited, colorToning.redhigh, pedited->colorToning.redhigh); + assignFromKeyfile(keyFile, "ColorToning", "Greenhigh", pedited, colorToning.greenhigh, pedited->colorToning.greenhigh); + assignFromKeyfile(keyFile, "ColorToning", "Bluehigh", pedited, colorToning.bluehigh, pedited->colorToning.bluehigh); + + assignFromKeyfile(keyFile, "ColorToning", "LabGridALow", pedited, colorToning.labgridALow, pedited->colorToning.labgridALow); + assignFromKeyfile(keyFile, "ColorToning", "LabGridBLow", pedited, colorToning.labgridBLow, pedited->colorToning.labgridBLow); + assignFromKeyfile(keyFile, "ColorToning", "LabGridAHigh", pedited, colorToning.labgridAHigh, pedited->colorToning.labgridAHigh); + assignFromKeyfile(keyFile, "ColorToning", "LabGridBHigh", pedited, colorToning.labgridBHigh, pedited->colorToning.labgridBHigh); + } + + if (keyFile.has_group ("RAW")) { + if (keyFile.has_key ("RAW", "DarkFrame")) { + raw.dark_frame = expandRelativePath (fname, "", keyFile.get_string ("RAW", "DarkFrame" )); if (pedited) { - pedited->raw.bayersensor.pixelShiftNonGreenCross = true; + pedited->raw.darkFrame = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross2")) { - raw.bayersensor.pixelShiftNonGreenCross2 = keyFile.get_boolean ("RAW Bayer", "pixelShiftNonGreenCross2"); + assignFromKeyfile(keyFile, "RAW", "DarkFrameAuto", pedited, raw.df_autoselect, pedited->raw.df_autoselect); + + if (keyFile.has_key ("RAW", "FlatFieldFile")) { + raw.ff_file = expandRelativePath (fname, "", keyFile.get_string ("RAW", "FlatFieldFile" )); if (pedited) { - pedited->raw.bayersensor.pixelShiftNonGreenCross2 = true; + pedited->raw.ff_file = true; } } - if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenAmaze")) { - raw.bayersensor.pixelShiftNonGreenAmaze = keyFile.get_boolean ("RAW Bayer", "pixelShiftNonGreenAmaze"); - - if (pedited) { - pedited->raw.bayersensor.pixelShiftNonGreenAmaze = true; - } + assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoSelect", pedited, raw.ff_AutoSelect, pedited->raw.ff_AutoSelect); + assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurRadius", pedited, raw.ff_BlurRadius, pedited->raw.ff_BlurRadius); + assignFromKeyfile(keyFile, "RAW", "FlatFieldBlurType", pedited, raw.ff_BlurType, pedited->raw.ff_BlurType); + assignFromKeyfile(keyFile, "RAW", "FlatFieldAutoClipControl", pedited, raw.ff_AutoClipControl, pedited->raw.ff_AutoClipControl); + if (ppVersion < 328) { + // With ppversion < 328 this value was stored as a boolean, which is nonsense. + // To avoid annoying warnings we skip reading and assume 0. + raw.ff_clipControl = 0; + } else { + assignFromKeyfile(keyFile, "RAW", "FlatFieldClipControl", pedited, raw.ff_clipControl, pedited->raw.ff_clipControl); + } + assignFromKeyfile(keyFile, "RAW", "CA", pedited, raw.ca_autocorrect, pedited->raw.ca_autocorrect); + assignFromKeyfile(keyFile, "RAW", "CARed", pedited, raw.cared, pedited->raw.cared); + assignFromKeyfile(keyFile, "RAW", "CABlue", pedited, raw.cablue, pedited->raw.cablue); + // For compatibility to elder pp3 versions + assignFromKeyfile(keyFile, "RAW", "HotDeadPixels", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); + raw.deadPixelFilter = raw.hotPixelFilter; + if (pedited) { + pedited->raw.deadPixelFilter = pedited->raw.hotPixelFilter; + } + assignFromKeyfile(keyFile, "RAW", "HotPixelFilter", pedited, raw.hotPixelFilter, pedited->raw.hotPixelFilter); + assignFromKeyfile(keyFile, "RAW", "DeadPixelFilter", pedited, raw.deadPixelFilter, pedited->raw.deadPixelFilter); + assignFromKeyfile(keyFile, "RAW", "HotDeadPixelThresh", pedited, raw.hotdeadpix_thresh, pedited->raw.hotdeadpix_thresh); + assignFromKeyfile(keyFile, "RAW", "PreExposure", pedited, raw.expos, pedited->raw.exPos); + assignFromKeyfile(keyFile, "RAW", "PrePreserv", pedited, raw.preser, pedited->raw.exPreser); + if (ppVersion < 320) { + assignFromKeyfile(keyFile, "RAW", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); + assignFromKeyfile(keyFile, "RAW", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); + assignFromKeyfile(keyFile, "RAW", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); + assignFromKeyfile(keyFile, "RAW", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); + assignFromKeyfile(keyFile, "RAW", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); + assignFromKeyfile(keyFile, "RAW", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); + assignFromKeyfile(keyFile, "RAW", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); + assignFromKeyfile(keyFile, "RAW", "PreBlackzero", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); + assignFromKeyfile(keyFile, "RAW", "PreBlackone", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); + assignFromKeyfile(keyFile, "RAW", "PreBlacktwo", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); + assignFromKeyfile(keyFile, "RAW", "PreBlackthree", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); + assignFromKeyfile(keyFile, "RAW", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); } } -// load X-Trans sensors' raw settings - if (keyFile.has_group ("RAW X-Trans")) { - if (keyFile.has_key ("RAW X-Trans", "Method")) { - raw.xtranssensor.method = keyFile.get_string ("RAW X-Trans", "Method"); - - if (pedited) { - pedited->raw.xtranssensor.method = true; - } - } + if (keyFile.has_group ("RAW Bayer")) { + assignFromKeyfile(keyFile, "RAW Bayer", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); - if (keyFile.has_key ("RAW X-Trans", "CcSteps")) { - raw.xtranssensor.ccSteps = keyFile.get_integer ("RAW X-Trans", "CcSteps"); + if (keyFile.has_key ("RAW Bayer", "ImageNum")) { + raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; if (pedited) { - pedited->raw.xtranssensor.ccSteps = true; + pedited->raw.bayersensor.imageNum = true; } } - if (keyFile.has_key ("RAW X-Trans", "PreBlackRed")) { - raw.xtranssensor.blackred = keyFile.get_double ("RAW X-Trans", "PreBlackRed"); + assignFromKeyfile(keyFile, "RAW Bayer", "CcSteps", pedited, raw.bayersensor.ccSteps, pedited->raw.bayersensor.ccSteps); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack0", pedited, raw.bayersensor.black0, pedited->raw.bayersensor.exBlack0); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack1", pedited, raw.bayersensor.black1, pedited->raw.bayersensor.exBlack1); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack2", pedited, raw.bayersensor.black2, pedited->raw.bayersensor.exBlack2); + assignFromKeyfile(keyFile, "RAW Bayer", "PreBlack3", pedited, raw.bayersensor.black3, pedited->raw.bayersensor.exBlack3); + assignFromKeyfile(keyFile, "RAW Bayer", "PreTwoGreen", pedited, raw.bayersensor.twogreen, pedited->raw.bayersensor.exTwoGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "LineDenoise", pedited, raw.bayersensor.linenoise, pedited->raw.bayersensor.linenoise); + assignFromKeyfile(keyFile, "RAW Bayer", "GreenEqThreshold", pedited, raw.bayersensor.greenthresh, pedited->raw.bayersensor.greenEq); + assignFromKeyfile(keyFile, "RAW Bayer", "DCBIterations", pedited, raw.bayersensor.dcb_iterations, pedited->raw.bayersensor.dcbIterations); + assignFromKeyfile(keyFile, "RAW Bayer", "DCBEnhance", pedited, raw.bayersensor.dcb_enhance, pedited->raw.bayersensor.dcbEnhance); + assignFromKeyfile(keyFile, "RAW Bayer", "LMMSEIterations", pedited, raw.bayersensor.lmmse_iterations, pedited->raw.bayersensor.lmmseIterations); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftMotion", pedited, raw.bayersensor.pixelShiftMotion, pedited->raw.bayersensor.pixelShiftMotion); + + if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrection")) { + raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::PSMotionCorrection)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrection"); if (pedited) { - pedited->raw.xtranssensor.exBlackRed = true; + pedited->raw.bayersensor.pixelShiftMotionCorrection = true; } } - if (keyFile.has_key ("RAW X-Trans", "PreBlackGreen")) { - raw.xtranssensor.blackgreen = keyFile.get_double ("RAW X-Trans", "PreBlackGreen"); + if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { + raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod"); if (pedited) { - pedited->raw.xtranssensor.exBlackGreen = true; + pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = true; } } - if (keyFile.has_key ("RAW X-Trans", "PreBlackBlue")) { - raw.xtranssensor.blackblue = keyFile.get_double ("RAW X-Trans", "PreBlackBlue"); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorGreen", pedited, raw.bayersensor.pixelShiftStddevFactorGreen, pedited->raw.bayersensor.pixelShiftStddevFactorGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorRed", pedited, raw.bayersensor.pixelShiftStddevFactorRed, pedited->raw.bayersensor.pixelShiftStddevFactorRed); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftStddevFactorBlue", pedited, raw.bayersensor.pixelShiftStddevFactorBlue, pedited->raw.bayersensor.pixelShiftStddevFactorBlue); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftEperIso", pedited, raw.bayersensor.pixelShiftEperIso, pedited->raw.bayersensor.pixelShiftEperIso); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftNreadIso", pedited, raw.bayersensor.pixelShiftNreadIso, pedited->raw.bayersensor.pixelShiftNreadIso); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftPrnu", pedited, raw.bayersensor.pixelShiftPrnu, pedited->raw.bayersensor.pixelShiftPrnu); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSigma", pedited, raw.bayersensor.pixelShiftSigma, pedited->raw.bayersensor.pixelShiftSigma); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftSum", pedited, raw.bayersensor.pixelShiftSum, pedited->raw.bayersensor.pixelShiftSum); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftRedBlueWeight", pedited, raw.bayersensor.pixelShiftRedBlueWeight, pedited->raw.bayersensor.pixelShiftRedBlueWeight); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotion", pedited, raw.bayersensor.pixelShiftShowMotion, pedited->raw.bayersensor.pixelShiftShowMotion); + assignFromKeyfile(keyFile, "RAW Bayer", "PixelShiftShowMotionMaskOnly", pedited, raw.bayersensor.pixelShiftShowMotionMaskOnly, pedited->raw.bayersensor.pixelShiftShowMotionMaskOnly); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftAutomatic", pedited, raw.bayersensor.pixelShiftAutomatic, pedited->raw.bayersensor.pixelShiftAutomatic); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenHorizontal", pedited, raw.bayersensor.pixelShiftNonGreenHorizontal, pedited->raw.bayersensor.pixelShiftNonGreenHorizontal); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenVertical", pedited, raw.bayersensor.pixelShiftNonGreenVertical, pedited->raw.bayersensor.pixelShiftNonGreenVertical); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftHoleFill", pedited, raw.bayersensor.pixelShiftHoleFill, pedited->raw.bayersensor.pixelShiftHoleFill); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian", pedited, raw.bayersensor.pixelShiftMedian, pedited->raw.bayersensor.pixelShiftMedian); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftMedian3", pedited, raw.bayersensor.pixelShiftMedian3, pedited->raw.bayersensor.pixelShiftMedian3); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftGreen", pedited, raw.bayersensor.pixelShiftGreen, pedited->raw.bayersensor.pixelShiftGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftBlur", pedited, raw.bayersensor.pixelShiftBlur, pedited->raw.bayersensor.pixelShiftBlur); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftSmoothFactor", pedited, raw.bayersensor.pixelShiftSmoothFactor, pedited->raw.bayersensor.pixelShiftSmooth); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftExp0", pedited, raw.bayersensor.pixelShiftExp0, pedited->raw.bayersensor.pixelShiftExp0); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftLmmse", pedited, raw.bayersensor.pixelShiftLmmse, pedited->raw.bayersensor.pixelShiftLmmse); +// assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftOneGreen", pedited, raw.bayersensor.pixelShiftOneGreen, pedited->raw.bayersensor.pixelShiftOneGreen); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBright", pedited, raw.bayersensor.pixelShiftEqualBright, pedited->raw.bayersensor.pixelShiftEqualBright); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftEqualBrightChannel", pedited, raw.bayersensor.pixelShiftEqualBrightChannel, pedited->raw.bayersensor.pixelShiftEqualBrightChannel); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross", pedited, raw.bayersensor.pixelShiftNonGreenCross, pedited->raw.bayersensor.pixelShiftNonGreenCross); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenCross2", pedited, raw.bayersensor.pixelShiftNonGreenCross2, pedited->raw.bayersensor.pixelShiftNonGreenCross2); + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftNonGreenAmaze", pedited, raw.bayersensor.pixelShiftNonGreenAmaze, pedited->raw.bayersensor.pixelShiftNonGreenAmaze); + } - if (pedited) { - pedited->raw.xtranssensor.exBlackBlue = true; - } + if (keyFile.has_group ("RAW X-Trans")) { + assignFromKeyfile(keyFile, "RAW X-Trans", "Method", pedited, raw.xtranssensor.method, pedited->raw.xtranssensor.method); + assignFromKeyfile(keyFile, "RAW X-Trans", "CcSteps", pedited, raw.xtranssensor.ccSteps, pedited->raw.xtranssensor.ccSteps); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackRed", pedited, raw.xtranssensor.blackred, pedited->raw.xtranssensor.exBlackRed); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackGreen", pedited, raw.xtranssensor.blackgreen, pedited->raw.xtranssensor.exBlackGreen); + assignFromKeyfile(keyFile, "RAW X-Trans", "PreBlackBlue", pedited, raw.xtranssensor.blackblue, pedited->raw.xtranssensor.exBlackBlue); + } + + if (keyFile.has_group("MetaData")) { + int mode = int(MetaDataParams::TUNNEL); + assignFromKeyfile(keyFile, "MetaData", "Mode", pedited, mode, pedited->metadata.mode); + if (mode >= int(MetaDataParams::TUNNEL) && mode <= int(MetaDataParams::STRIP)) { + metadata.mode = static_cast(mode); } } - // load exif change settings if (keyFile.has_group ("Exif")) { std::vector keys = keyFile.get_keys ("Exif"); - for (int i = 0; i < (int)keys.size(); i++) { - Glib::ustring tmpStr = keyFile.get_string ("Exif", keys[i]); - exif[keys[i]] = keyFile.get_string ("Exif", keys[i]); + for (const auto& key : keyFile.get_keys("Exif")) { + exif[key] = keyFile.get_string ("Exif", key); if (pedited) { pedited->exif = true; @@ -8173,12 +4777,9 @@ * i.e. they don't merge */ if (keyFile.has_group ("IPTC")) { - std::vector keys = keyFile.get_keys ("IPTC"); - IPTCPairs::iterator element; - - for (unsigned int i = 0; i < keys.size(); i++) { + for (const auto& key : keyFile.get_keys("IPTC")) { // does this key already exist? - element = iptc.find (keys[i]); + const IPTCPairs::iterator element = iptc.find(key); if (element != iptc.end()) { // it already exist so we cleanup the values @@ -8186,13 +4787,8 @@ } // TODO: look out if merging Keywords and SupplementalCategories from the procparams chain would be interesting - std::vector currIptc = keyFile.get_string_list ("IPTC", keys[i]); - - for ( - std::vector::iterator currLoadedTagValue = currIptc.begin(); - currLoadedTagValue != currIptc.end(); - ++currLoadedTagValue) { - iptc[keys[i]].push_back (currLoadedTagValue->data()); + for (const auto& currLoadedTagValue : keyFile.get_string_list ("IPTC", key)) { + iptc[key].push_back (currLoadedTagValue); } if (pedited) { @@ -8201,7 +4797,6 @@ } } - return 0; } catch (const Glib::Error& e) { printf ("-->%s\n", e.what().c_str()); @@ -8216,534 +4811,96 @@ return 0; } -const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring ("No ICM: sRGB output"); - -bool operator== (const WaveletParams & a, const WaveletParams & b) +ProcParams* ProcParams::create() { - if (a.enabled != b.enabled) { - return false; - } - - for (int i = 0; i < 9; i++) { - if (a.c[i] != b.c[i]) { - return false; - } - } - - for (int i = 0; i < 9; i++) { - if (a.ch[i] != b.ch[i]) { - return false; - } - } - - return true; + return new ProcParams(); } - - -bool operator== (const DirPyrEqualizerParams & a, const DirPyrEqualizerParams & b) +void ProcParams::destroy(ProcParams* pp) { - if (a.enabled != b.enabled) { - return false; - } - - for (int i = 0; i < 6; i++) { - if (a.mult[i] != b.mult[i]) { - return false; - } - } - - return a.threshold == b.threshold; -} - -/*bool operator==(const ExifPairs& a, const ExifPairs& b) { - - return a.field == b.field && a.value == b.value; + delete pp; } -bool operator==(const IPTCPairs& a, const IPTCPairs& b) { - - return a.field == b.field && a.values == b.values; -}*/ -bool ProcParams::operator== (const ProcParams& other) +bool ProcParams::operator ==(const ProcParams& other) const { - return - toneCurve.curve == other.toneCurve.curve - && toneCurve.curve2 == other.toneCurve.curve2 - && toneCurve.brightness == other.toneCurve.brightness - && toneCurve.black == other.toneCurve.black - && toneCurve.contrast == other.toneCurve.contrast - && toneCurve.saturation == other.toneCurve.saturation - && toneCurve.shcompr == other.toneCurve.shcompr - && toneCurve.hlcompr == other.toneCurve.hlcompr - && toneCurve.hlcomprthresh == other.toneCurve.hlcomprthresh - && toneCurve.autoexp == other.toneCurve.autoexp - && toneCurve.clip == other.toneCurve.clip - && toneCurve.expcomp == other.toneCurve.expcomp - && toneCurve.curveMode == other.toneCurve.curveMode - && toneCurve.curveMode2 == other.toneCurve.curveMode2 - && toneCurve.hrenabled == other.toneCurve.hrenabled - && toneCurve.method == other.toneCurve.method - && retinex.cdcurve == other.retinex.cdcurve - && retinex.mapcurve == other.retinex.mapcurve - && retinex.cdHcurve == other.retinex.cdHcurve - && retinex.lhcurve == other.retinex.lhcurve - && retinex.transmissionCurve == other.retinex.transmissionCurve - && retinex.gaintransmissionCurve == other.retinex.gaintransmissionCurve - && retinex.str == other.retinex.str - && retinex.scal == other.retinex.scal - && retinex.iter == other.retinex.iter - && retinex.grad == other.retinex.grad - && retinex.grads == other.retinex.grads - && retinex.gam == other.retinex.gam - && retinex.slope == other.retinex.slope - && retinex.neigh == other.retinex.neigh - && retinex.limd == other.retinex.limd - && retinex.highl == other.retinex.highl - && retinex.highlights == other.retinex.highlights - && retinex.htonalwidth == other.retinex.htonalwidth - && retinex.shadows == other.retinex.shadows - && retinex.stonalwidth == other.retinex.stonalwidth - && retinex.radius == other.retinex.radius - && retinex.skal == other.retinex.skal - && retinex.offs == other.retinex.offs - && retinex.retinexMethod == other.retinex.retinexMethod - && retinex.mapMethod == other.retinex.mapMethod - && retinex.viewMethod == other.retinex.viewMethod - && retinex.retinexcolorspace == other.retinex.retinexcolorspace - && retinex.gammaretinex == other.retinex.gammaretinex - && retinex.vart == other.retinex.vart - && retinex.medianmap == other.retinex.medianmap - && retinex.enabled == other.retinex.enabled - && labCurve.lcurve == other.labCurve.lcurve - && labCurve.acurve == other.labCurve.acurve - && labCurve.bcurve == other.labCurve.bcurve - && labCurve.cccurve == other.labCurve.cccurve - && labCurve.chcurve == other.labCurve.chcurve - && labCurve.lhcurve == other.labCurve.lhcurve - && labCurve.hhcurve == other.labCurve.hhcurve - && labCurve.lccurve == other.labCurve.lccurve - && labCurve.clcurve == other.labCurve.clcurve - && labCurve.brightness == other.labCurve.brightness - && labCurve.contrast == other.labCurve.contrast - && labCurve.chromaticity == other.labCurve.chromaticity - && labCurve.avoidcolorshift == other.labCurve.avoidcolorshift - && labCurve.rstprotection == other.labCurve.rstprotection - && labCurve.lcredsk == other.labCurve.lcredsk - && sharpenEdge.enabled == other.sharpenEdge.enabled - && sharpenEdge.passes == other.sharpenEdge.passes - && sharpenEdge.amount == other.sharpenEdge.amount - && sharpenEdge.threechannels == other.sharpenEdge.threechannels - && sharpenMicro.enabled == other.sharpenMicro.enabled - && sharpenMicro.matrix == other.sharpenMicro.matrix - && sharpenMicro.amount == other.sharpenMicro.amount - && sharpenMicro.uniformity == other.sharpenMicro.uniformity - && sharpening.enabled == other.sharpening.enabled - && sharpening.radius == other.sharpening.radius - && sharpening.amount == other.sharpening.amount - && sharpening.threshold == other.sharpening.threshold - && sharpening.edgesonly == other.sharpening.edgesonly - && sharpening.edges_radius == other.sharpening.edges_radius - && sharpening.edges_tolerance == other.sharpening.edges_tolerance - && sharpening.halocontrol == other.sharpening.halocontrol - && sharpening.halocontrol_amount == other.sharpening.halocontrol_amount - && sharpening.method == other.sharpening.method - && sharpening.deconvamount == other.sharpening.deconvamount - && sharpening.deconvradius == other.sharpening.deconvradius - && sharpening.deconviter == other.sharpening.deconviter - && sharpening.deconvdamping == other.sharpening.deconvdamping - && prsharpening.enabled == other.prsharpening.enabled - && prsharpening.radius == other.prsharpening.radius - && prsharpening.amount == other.prsharpening.amount - && prsharpening.threshold == other.prsharpening.threshold - && prsharpening.edgesonly == other.prsharpening.edgesonly - && prsharpening.edges_radius == other.prsharpening.edges_radius - && prsharpening.edges_tolerance == other.prsharpening.edges_tolerance - && prsharpening.halocontrol == other.prsharpening.halocontrol - && prsharpening.halocontrol_amount == other.prsharpening.halocontrol_amount - && prsharpening.method == other.prsharpening.method - && prsharpening.deconvamount == other.prsharpening.deconvamount - && prsharpening.deconvradius == other.prsharpening.deconvradius - && prsharpening.deconviter == other.prsharpening.deconviter - && prsharpening.deconvdamping == other.prsharpening.deconvdamping - && vibrance.enabled == other.vibrance.enabled - && vibrance.pastels == other.vibrance.pastels - && vibrance.saturated == other.vibrance.saturated - && vibrance.psthreshold == other.vibrance.psthreshold - && vibrance.protectskins == other.vibrance.protectskins - && vibrance.avoidcolorshift == other.vibrance.avoidcolorshift - && vibrance.pastsattog == other.vibrance.pastsattog - && vibrance.skintonescurve == other.vibrance.skintonescurve - //&& colorBoost.amount == other.colorBoost.amount - //&& colorBoost.avoidclip == other.colorBoost.avoidclip - //&& colorBoost.enable_saturationlimiter == other.colorBoost.enable_saturationlimiter - //&& colorBoost.saturationlimit == other.colorBoost.saturationlimit - && wb.method == other.wb.method - && wb.green == other.wb.green - && wb.temperature == other.wb.temperature - && wb.equal == other.wb.equal - //&& colorShift.a == other.colorShift.a - //&& colorShift.b == other.colorShift.b - && colorappearance.enabled == other.colorappearance.enabled - && colorappearance.degree == other.colorappearance.degree - && colorappearance.autodegree == other.colorappearance.autodegree - && colorappearance.degreeout == other.colorappearance.degreeout - && colorappearance.autodegreeout == other.colorappearance.autodegreeout - && colorappearance.surround == other.colorappearance.surround - && colorappearance.surrsrc == other.colorappearance.surrsrc - && colorappearance.adapscen == other.colorappearance.adapscen - && colorappearance.autoadapscen == other.colorappearance.autoadapscen - && colorappearance.ybscen == other.colorappearance.ybscen - && colorappearance.autoybscen == other.colorappearance.autoybscen - && colorappearance.adaplum == other.colorappearance.adaplum - && colorappearance.badpixsl == other.colorappearance.badpixsl - && colorappearance.wbmodel == other.colorappearance.wbmodel - && colorappearance.algo == other.colorappearance.algo - && colorappearance.curveMode == other.colorappearance.curveMode - && colorappearance.curveMode2 == other.colorappearance.curveMode2 - && colorappearance.curveMode3 == other.colorappearance.curveMode3 - && colorappearance.jlight == other.colorappearance.jlight - && colorappearance.qbright == other.colorappearance.qbright - && colorappearance.chroma == other.colorappearance.chroma - && colorappearance.schroma == other.colorappearance.schroma - && colorappearance.mchroma == other.colorappearance.mchroma - && colorappearance.rstprotection == other.colorappearance.rstprotection - && colorappearance.contrast == other.colorappearance.contrast - && colorappearance.qcontrast == other.colorappearance.qcontrast - && colorappearance.colorh == other.colorappearance.colorh - && colorappearance.tempout == other.colorappearance.tempout - && colorappearance.greenout == other.colorappearance.greenout - && colorappearance.tempsc == other.colorappearance.tempsc - && colorappearance.greensc == other.colorappearance.greensc - && colorappearance.ybout == other.colorappearance.ybout - && impulseDenoise.enabled == other.impulseDenoise.enabled - && impulseDenoise.thresh == other.impulseDenoise.thresh - && dirpyrDenoise.enabled == other.dirpyrDenoise.enabled - && dirpyrDenoise.enhance == other.dirpyrDenoise.enhance - && dirpyrDenoise.median == other.dirpyrDenoise.median -// && dirpyrDenoise.perform == other.dirpyrDenoise.perform - && dirpyrDenoise.luma == other.dirpyrDenoise.luma - && dirpyrDenoise.lcurve == other.dirpyrDenoise.lcurve - && dirpyrDenoise.cccurve == other.dirpyrDenoise.cccurve - && dirpyrDenoise.Ldetail == other.dirpyrDenoise.Ldetail - && dirpyrDenoise.chroma == other.dirpyrDenoise.chroma - && dirpyrDenoise.dmethod == other.dirpyrDenoise.dmethod - && dirpyrDenoise.Lmethod == other.dirpyrDenoise.Lmethod - && dirpyrDenoise.Cmethod == other.dirpyrDenoise.Cmethod - && dirpyrDenoise.C2method == other.dirpyrDenoise.C2method - && dirpyrDenoise.smethod == other.dirpyrDenoise.smethod - && dirpyrDenoise.medmethod == other.dirpyrDenoise.medmethod - && dirpyrDenoise.methodmed == other.dirpyrDenoise.methodmed - && dirpyrDenoise.rgbmethod == other.dirpyrDenoise.rgbmethod - && dirpyrDenoise.redchro == other.dirpyrDenoise.redchro - && dirpyrDenoise.bluechro == other.dirpyrDenoise.bluechro - && dirpyrDenoise.gamma == other.dirpyrDenoise.gamma - && dirpyrDenoise.passes == other.dirpyrDenoise.passes - && epd.enabled == other.epd.enabled - && epd.strength == other.epd.strength - && epd.gamma == other.epd.gamma - && epd.edgeStopping == other.epd.edgeStopping - && epd.scale == other.epd.scale - && epd.reweightingIterates == other.epd.reweightingIterates - && defringe.enabled == other.defringe.enabled - && defringe.radius == other.defringe.radius - && defringe.threshold == other.defringe.threshold - && defringe.huecurve == other.defringe.huecurve - - //&& lumaDenoise.enabled == other.lumaDenoise.enabled - //&& lumaDenoise.radius == other.lumaDenoise.radius - //&& lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance - //&& colorDenoise.enabled == other.colorDenoise.enabled - //&& colorDenoise.edgetolerance == other.colorDenoise.edgetolerance - //&& colorDenoise.edgesensitive == other.colorDenoise.edgesensitive - && sh.enabled == other.sh.enabled - && sh.hq == other.sh.hq - && sh.highlights == other.sh.highlights - && sh.htonalwidth == other.sh.htonalwidth - && sh.shadows == other.sh.shadows - && sh.stonalwidth == other.sh.stonalwidth - && sh.localcontrast == other.sh.localcontrast - && sh.radius == other.sh.radius - && crop.enabled == other.crop.enabled - && crop.x == other.crop.x - && crop.y == other.crop.y - && crop.w == other.crop.w - && crop.h == other.crop.h - && crop.fixratio == other.crop.fixratio - && crop.ratio == other.crop.ratio - && crop.orientation == other.crop.orientation - && crop.guide == other.crop.guide - && coarse.rotate == other.coarse.rotate - && coarse.hflip == other.coarse.hflip - && coarse.vflip == other.coarse.vflip - && rotate.degree == other.rotate.degree - && commonTrans.autofill == other.commonTrans.autofill - && distortion.amount == other.distortion.amount - && lensProf.lcMode == other.lensProf.lcMode - && lensProf.lcpFile == other.lensProf.lcpFile - && lensProf.useDist == other.lensProf.useDist - && lensProf.useVign == other.lensProf.useVign - && lensProf.useCA == other.lensProf.useCA - && lensProf.lfCameraMake == other.lensProf.lfCameraMake - && lensProf.lfCameraModel == other.lensProf.lfCameraModel - && lensProf.lfLens == other.lensProf.lfLens - && perspective.horizontal == other.perspective.horizontal - && perspective.vertical == other.perspective.vertical - && gradient.enabled == other.gradient.enabled - && gradient.degree == other.gradient.degree - && gradient.feather == other.gradient.feather - && gradient.strength == other.gradient.strength - && gradient.centerX == other.gradient.centerX - && gradient.centerY == other.gradient.centerY - && pcvignette.enabled == other.pcvignette.enabled - && pcvignette.strength == other.pcvignette.strength - && pcvignette.feather == other.pcvignette.feather - && pcvignette.roundness == other.pcvignette.roundness - && cacorrection.red == other.cacorrection.red - && cacorrection.blue == other.cacorrection.blue - && vignetting.amount == other.vignetting.amount - && vignetting.radius == other.vignetting.radius - && vignetting.strength == other.vignetting.strength - && vignetting.centerX == other.vignetting.centerX - && vignetting.centerY == other.vignetting.centerY - && !memcmp (&chmixer.red, &other.chmixer.red, 3 * sizeof (int)) - && !memcmp (&chmixer.green, &other.chmixer.green, 3 * sizeof (int)) - && !memcmp (&chmixer.blue, &other.chmixer.blue, 3 * sizeof (int)) - && blackwhite.mixerRed == other.blackwhite.mixerRed - && blackwhite.mixerOrange == other.blackwhite.mixerOrange - && blackwhite.mixerYellow == other.blackwhite.mixerYellow - && blackwhite.mixerGreen == other.blackwhite.mixerGreen - && blackwhite.mixerCyan == other.blackwhite.mixerCyan - && blackwhite.mixerBlue == other.blackwhite.mixerBlue - && blackwhite.mixerMagenta == other.blackwhite.mixerMagenta - && blackwhite.mixerPurple == other.blackwhite.mixerPurple - && blackwhite.gammaRed == other.blackwhite.gammaRed - && blackwhite.gammaGreen == other.blackwhite.gammaGreen - && blackwhite.gammaBlue == other.blackwhite.gammaBlue - && blackwhite.filter == other.blackwhite.filter - && blackwhite.setting == other.blackwhite.setting - && blackwhite.method == other.blackwhite.method - && blackwhite.luminanceCurve == other.blackwhite.luminanceCurve - && blackwhite.beforeCurve == other.blackwhite.beforeCurve - && blackwhite.afterCurve == other.blackwhite.afterCurve - && blackwhite.beforeCurveMode == other.blackwhite.beforeCurveMode - && blackwhite.afterCurveMode == other.blackwhite.afterCurveMode - && blackwhite.autoc == other.blackwhite.autoc - && blackwhite.algo == other.blackwhite.algo - && resize.scale == other.resize.scale - && resize.appliesTo == other.resize.appliesTo - && resize.method == other.resize.method - && resize.dataspec == other.resize.dataspec - && resize.width == other.resize.width - && resize.height == other.resize.height - && raw.bayersensor.method == other.raw.bayersensor.method - && raw.bayersensor.imageNum == other.raw.bayersensor.imageNum - && raw.bayersensor.ccSteps == other.raw.bayersensor.ccSteps - && raw.bayersensor.black0 == other.raw.bayersensor.black0 - && raw.bayersensor.black1 == other.raw.bayersensor.black1 - && raw.bayersensor.black2 == other.raw.bayersensor.black2 - && raw.bayersensor.black3 == other.raw.bayersensor.black3 - && raw.bayersensor.twogreen == other.raw.bayersensor.twogreen - && raw.bayersensor.greenthresh == other.raw.bayersensor.greenthresh - && raw.bayersensor.linenoise == other.raw.bayersensor.linenoise - && raw.bayersensor.dcb_iterations == other.raw.bayersensor.dcb_iterations - && raw.bayersensor.lmmse_iterations == other.raw.bayersensor.lmmse_iterations - && raw.bayersensor.pixelShiftMotion == other.raw.bayersensor.pixelShiftMotion - && raw.bayersensor.pixelShiftMotionCorrection == other.raw.bayersensor.pixelShiftMotionCorrection - && raw.bayersensor.pixelShiftMotionCorrectionMethod == other.raw.bayersensor.pixelShiftMotionCorrectionMethod - && raw.bayersensor.pixelShiftStddevFactorGreen == other.raw.bayersensor.pixelShiftStddevFactorGreen - && raw.bayersensor.pixelShiftStddevFactorRed == other.raw.bayersensor.pixelShiftStddevFactorRed - && raw.bayersensor.pixelShiftStddevFactorBlue == other.raw.bayersensor.pixelShiftStddevFactorBlue - && raw.bayersensor.pixelShiftEperIso == other.raw.bayersensor.pixelShiftEperIso - && raw.bayersensor.pixelShiftNreadIso == other.raw.bayersensor.pixelShiftNreadIso - && raw.bayersensor.pixelShiftPrnu == other.raw.bayersensor.pixelShiftPrnu - && raw.bayersensor.pixelShiftSigma == other.raw.bayersensor.pixelShiftSigma - && raw.bayersensor.pixelShiftSum == other.raw.bayersensor.pixelShiftSum - && raw.bayersensor.pixelShiftRedBlueWeight == other.raw.bayersensor.pixelShiftRedBlueWeight - && raw.bayersensor.pixelShiftShowMotion == other.raw.bayersensor.pixelShiftShowMotion - && raw.bayersensor.pixelShiftShowMotionMaskOnly == other.raw.bayersensor.pixelShiftShowMotionMaskOnly - && raw.bayersensor.pixelShiftAutomatic == other.raw.bayersensor.pixelShiftAutomatic - && raw.bayersensor.pixelShiftNonGreenHorizontal == other.raw.bayersensor.pixelShiftNonGreenHorizontal - && raw.bayersensor.pixelShiftNonGreenVertical == other.raw.bayersensor.pixelShiftNonGreenVertical - && raw.bayersensor.pixelShiftHoleFill == other.raw.bayersensor.pixelShiftHoleFill - && raw.bayersensor.pixelShiftMedian == other.raw.bayersensor.pixelShiftMedian - && raw.bayersensor.pixelShiftMedian3 == other.raw.bayersensor.pixelShiftMedian3 - && raw.bayersensor.pixelShiftGreen == other.raw.bayersensor.pixelShiftGreen - && raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur - && raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor - && raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0 - && raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse - && raw.bayersensor.pixelShiftEqualBright == other.raw.bayersensor.pixelShiftEqualBright - && raw.bayersensor.pixelShiftEqualBrightChannel == other.raw.bayersensor.pixelShiftEqualBrightChannel - && raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross - && raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2 - && raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze - && raw.bayersensor.dcb_enhance == other.raw.bayersensor.dcb_enhance - && raw.xtranssensor.method == other.raw.xtranssensor.method - && raw.xtranssensor.ccSteps == other.raw.xtranssensor.ccSteps - && raw.xtranssensor.blackred == other.raw.xtranssensor.blackred - && raw.xtranssensor.blackgreen == other.raw.xtranssensor.blackgreen - && raw.xtranssensor.blackblue == other.raw.xtranssensor.blackblue - && raw.dark_frame == other.raw.dark_frame - && raw.df_autoselect == other.raw.df_autoselect - && raw.ff_file == other.raw.ff_file - && raw.ff_AutoSelect == other.raw.ff_AutoSelect - && raw.ff_BlurRadius == other.raw.ff_BlurRadius - && raw.ff_BlurType == other.raw.ff_BlurType - && raw.ff_AutoClipControl == other.raw.ff_AutoClipControl - && raw.ff_clipControl == other.raw.ff_clipControl - && raw.expos == other.raw.expos - && raw.preser == other.raw.preser - && raw.ca_autocorrect == other.raw.ca_autocorrect - && raw.cared == other.raw.cared - && raw.cablue == other.raw.cablue - && raw.hotPixelFilter == other.raw.hotPixelFilter - && raw.deadPixelFilter == other.raw.deadPixelFilter - && raw.hotdeadpix_thresh == other.raw.hotdeadpix_thresh - && icm.input == other.icm.input - && icm.toneCurve == other.icm.toneCurve - && icm.applyLookTable == other.icm.applyLookTable - && icm.applyBaselineExposureOffset == other.icm.applyBaselineExposureOffset - && icm.applyHueSatMap == other.icm.applyHueSatMap - && icm.dcpIlluminant == other.icm.dcpIlluminant - && icm.working == other.icm.working - && icm.output == other.icm.output - && icm.gamma == other.icm.gamma - && icm.freegamma == other.icm.freegamma - && icm.gampos == other.icm.gampos - && icm.slpos == other.icm.slpos + toneCurve == other.toneCurve + && retinex == other.retinex + && localContrast == other.localContrast + && labCurve == other.labCurve + && sharpenEdge == other.sharpenEdge + && sharpenMicro == other.sharpenMicro + && sharpening == other.sharpening + && prsharpening == other.prsharpening + && vibrance == other.vibrance + && wb == other.wb + && colorappearance == other.colorappearance + && impulseDenoise == other.impulseDenoise + && dirpyrDenoise == other.dirpyrDenoise + && epd == other.epd + && fattal == other.fattal + && defringe == other.defringe + && sh == other.sh + && crop == other.crop + && coarse == other.coarse + && rotate == other.rotate + && commonTrans == other.commonTrans + && distortion == other.distortion + && lensProf == other.lensProf + && perspective == other.perspective + && gradient == other.gradient + && pcvignette == other.pcvignette + && cacorrection == other.cacorrection + && vignetting == other.vignetting + && chmixer == other.chmixer + && blackwhite == other.blackwhite + && resize == other.resize + && raw == other.raw + && icm == other.icm && wavelet == other.wavelet - && wavelet.Lmethod == other.wavelet.Lmethod - && wavelet.CLmethod == other.wavelet.CLmethod - && wavelet.Backmethod == other.wavelet.Backmethod - && wavelet.Tilesmethod == other.wavelet.Tilesmethod - && wavelet.daubcoeffmethod == other.wavelet.daubcoeffmethod - && wavelet.CHmethod == other.wavelet.CHmethod - && wavelet.CHSLmethod == other.wavelet.CHSLmethod - && wavelet.EDmethod == other.wavelet.EDmethod - && wavelet.NPmethod == other.wavelet.NPmethod - && wavelet.BAmethod == other.wavelet.BAmethod - && wavelet.TMmethod == other.wavelet.TMmethod - && wavelet.HSmethod == other.wavelet.HSmethod - && wavelet.Dirmethod == other.wavelet.Dirmethod - && wavelet.rescon == other.wavelet.rescon - && wavelet.resconH == other.wavelet.resconH - && wavelet.reschro == other.wavelet.reschro - && wavelet.tmrs == other.wavelet.tmrs - && wavelet.gamma == other.wavelet.gamma - && wavelet.sup == other.wavelet.sup - && wavelet.sky == other.wavelet.sky - && wavelet.thres == other.wavelet.thres - && wavelet.chroma == other.wavelet.chroma - && wavelet.chro == other.wavelet.chro - && wavelet.tmr == other.wavelet.tmr - && wavelet.contrast == other.wavelet.contrast - && wavelet.median == other.wavelet.median - && wavelet.expcontrast == other.wavelet.expcontrast - && wavelet.expchroma == other.wavelet.expchroma - && wavelet.expedge == other.wavelet.expedge - && wavelet.expresid == other.wavelet.expresid - && wavelet.expfinal == other.wavelet.expfinal - && wavelet.exptoning == other.wavelet.exptoning - && wavelet.expnoise == other.wavelet.expnoise - && wavelet.medianlev == other.wavelet.medianlev - && wavelet.linkedg == other.wavelet.linkedg - && wavelet.cbenab == other.wavelet.cbenab - && wavelet.lipst == other.wavelet.lipst - && wavelet.Medgreinf == other.wavelet.Medgreinf - && wavelet.edgrad == other.wavelet.edgrad - && wavelet.edgval == other.wavelet.edgval - && wavelet.edgthresh == other.wavelet.edgthresh - && wavelet.thr == other.wavelet.thr - && wavelet.thrH == other.wavelet.thrH - && wavelet.threshold == other.wavelet.threshold - && wavelet.threshold2 == other.wavelet.threshold2 - && wavelet.edgedetect == other.wavelet.edgedetect - && wavelet.edgedetectthr == other.wavelet.edgedetectthr - && wavelet.edgedetectthr2 == other.wavelet.edgedetectthr2 - && wavelet.edgesensi == other.wavelet.edgesensi - && wavelet.edgeampli == other.wavelet.edgeampli - && wavelet.hueskin == other.wavelet.hueskin - && wavelet.hueskin2 == other.wavelet.hueskin2 - && wavelet.hllev == other.wavelet.hllev - && wavelet.bllev == other.wavelet.bllev - && wavelet.edgcont == other.wavelet.edgcont - && wavelet.level0noise == other.wavelet.level0noise - && wavelet.level1noise == other.wavelet.level1noise - && wavelet.level2noise == other.wavelet.level2noise - && wavelet.level3noise == other.wavelet.level3noise - && wavelet.pastlev == other.wavelet.pastlev - && wavelet.satlev == other.wavelet.satlev - && wavelet.opacityCurveRG == other.wavelet.opacityCurveRG - && wavelet.opacityCurveBY == other.wavelet.opacityCurveBY - && wavelet.opacityCurveW == other.wavelet.opacityCurveW - && wavelet.opacityCurveWL == other.wavelet.opacityCurveWL - && wavelet.hhcurve == other.wavelet.hhcurve - && wavelet.Chcurve == other.wavelet.Chcurve - && wavelet.ccwcurve == other.wavelet.ccwcurve - && wavelet.wavclCurve == other.wavelet.wavclCurve - && wavelet.skinprotect == other.wavelet.skinprotect - && wavelet.strength == other.wavelet.strength - && wavelet.balance == other.wavelet.balance - && wavelet.greenhigh == other.wavelet.greenhigh - && wavelet.greenmed == other.wavelet.greenmed - && wavelet.greenlow == other.wavelet.greenlow - && wavelet.bluehigh == other.wavelet.bluehigh - && wavelet.bluemed == other.wavelet.bluemed - && wavelet.bluelow == other.wavelet.bluelow - && wavelet.iter == other.wavelet.iter && dirpyrequalizer == other.dirpyrequalizer - // && dirpyrequalizer.algo == other.dirpyrequalizer.algo - && dirpyrequalizer.hueskin == other.dirpyrequalizer.hueskin - && dirpyrequalizer.threshold == other.dirpyrequalizer.threshold - && dirpyrequalizer.cbdlMethod == other.dirpyrequalizer.cbdlMethod - && dirpyrequalizer.skinprotect == other.dirpyrequalizer.skinprotect - && hsvequalizer.hcurve == other.hsvequalizer.hcurve - && hsvequalizer.scurve == other.hsvequalizer.scurve - && hsvequalizer.vcurve == other.hsvequalizer.vcurve - && filmSimulation.enabled == other.filmSimulation.enabled - && filmSimulation.clutFilename == other.filmSimulation.clutFilename - && filmSimulation.strength == other.filmSimulation.strength - && rgbCurves.rcurve == other.rgbCurves.rcurve - && rgbCurves.gcurve == other.rgbCurves.gcurve - && rgbCurves.bcurve == other.rgbCurves.bcurve - && colorToning.enabled == other.colorToning.enabled - && colorToning.twocolor == other.colorToning.twocolor - && colorToning.method == other.colorToning.method - && colorToning.colorCurve == other.colorToning.colorCurve - && colorToning.opacityCurve == other.colorToning.opacityCurve - && colorToning.autosat == other.colorToning.autosat - && colorToning.satProtectionThreshold == other.colorToning.satProtectionThreshold - && colorToning.saturatedOpacity == other.colorToning.saturatedOpacity - && colorToning.strength == other.colorToning.strength - && colorToning.hlColSat == other.colorToning.hlColSat - && colorToning.shadowsColSat == other.colorToning.shadowsColSat - && colorToning.balance == other.colorToning.balance - && colorToning.clcurve == other.colorToning.clcurve - && colorToning.cl2curve == other.colorToning.cl2curve - && colorToning.redlow == other.colorToning.redlow - && colorToning.greenlow == other.colorToning.greenlow - && colorToning.bluelow == other.colorToning.bluelow - && colorToning.satlow == other.colorToning.satlow - && colorToning.sathigh == other.colorToning.sathigh - && colorToning.redmed == other.colorToning.redmed - && colorToning.greenmed == other.colorToning.greenmed - && colorToning.bluemed == other.colorToning.bluemed - && colorToning.redhigh == other.colorToning.redhigh - && colorToning.greenhigh == other.colorToning.greenhigh - && colorToning.bluehigh == other.colorToning.bluehigh + && hsvequalizer == other.hsvequalizer + && filmSimulation == other.filmSimulation + && rgbCurves == other.rgbCurves + && colorToning == other.colorToning + && metadata == other.metadata && exif == other.exif && iptc == other.iptc; } -bool ProcParams::operator!= (const ProcParams& other) +bool ProcParams::operator !=(const ProcParams& other) const +{ + return !(*this == other); +} + +void ProcParams::init() +{ +} + +void ProcParams::cleanup() +{ +} + +int ProcParams::write(const Glib::ustring& fname, const Glib::ustring& content) const { + int error = 0; + + if (fname.length()) { + FILE *f; + f = g_fopen (fname.c_str (), "wt"); + + if (f == nullptr) { + error = 1; + } else { + fprintf (f, "%s", content.c_str()); + fclose (f); + } + } - return ! (*this == other); + return error; } -PartialProfile::PartialProfile (bool createInstance, bool paramsEditedValue) +PartialProfile::PartialProfile(bool createInstance, bool paramsEditedValue) { if (createInstance) { pparams = new ProcParams(); @@ -8754,7 +4911,7 @@ } } -PartialProfile::PartialProfile (ProcParams* pp, ParamsEdited* pe, bool fullCopy) +PartialProfile::PartialProfile(ProcParams* pp, ParamsEdited* pe, bool fullCopy) { if (fullCopy && pp) { pparams = new ProcParams (*pp); @@ -8769,7 +4926,7 @@ } } -PartialProfile::PartialProfile (const ProcParams* pp, const ParamsEdited* pe) +PartialProfile::PartialProfile(const ProcParams* pp, const ParamsEdited* pe) { if (pp) { pparams = new ProcParams (*pp); @@ -8784,7 +4941,29 @@ } } -int PartialProfile::load (const Glib::ustring &fName) +void PartialProfile::deleteInstance() +{ + if (pparams) { + delete pparams; + pparams = nullptr; + } + + if (pedited) { + delete pedited; + pedited = nullptr; + } +} + +void PartialProfile::clearGeneral() +{ + if (pedited) { + pedited->general.colorlabel = false; + pedited->general.intrash = false; + pedited->general.rank = false; + } +} + +int PartialProfile::load(const Glib::ustring& fName) { if (!pparams) { pparams = new ProcParams(); @@ -8803,46 +4982,34 @@ } } -void PartialProfile::deleteInstance () -{ - if (pparams) { - delete pparams; - pparams = nullptr; - } - - if (pedited) { - delete pedited; - pedited = nullptr; - } -} - /* * Set the all values of the General section to false * in order to preserve them in applyTo */ -void PartialProfile::clearGeneral () +void PartialProfile::set(bool v) { if (pedited) { - pedited->general.colorlabel = false; - pedited->general.intrash = false; - pedited->general.rank = false; + pedited->set (v); } } -const void PartialProfile::applyTo (ProcParams *destParams) const +void PartialProfile::applyTo(ProcParams* destParams) const { if (destParams && pparams && pedited) { pedited->combine (*destParams, *pparams, true); } } -void PartialProfile::set (bool v) +AutoPartialProfile::AutoPartialProfile() : + PartialProfile(true) { - if (pedited) { - pedited->set (v); - } } +AutoPartialProfile::~AutoPartialProfile() +{ + deleteInstance(); } + } +} diff -Nru rawtherapee-5.3/rtengine/procparams.h rawtherapee-5.4/rtengine/procparams.h --- rawtherapee-5.3/rtengine/procparams.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/procparams.h 2018-03-20 11:04:15.000000000 +0000 @@ -16,19 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PROCPARAMS_H_ -#define _PROCPARAMS_H_ +#pragma once -#include -#include #include +#include #include +#include #include #include -#include "LUT.h" #include "coord.h" +#include "LUT.h" +#include "noncopyable.h" class ParamsEdited; @@ -36,15 +36,15 @@ { class ColorGradientCurve; -class OpacityCurve; class NoiseCurve; +class OpacityCurve; +class RetinexgaintransmissionCurve; +class RetinextransmissionCurve; class WavCurve; -class WavOpacityCurveRG; class WavOpacityCurveBY; +class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; -class RetinextransmissionCurve; -class RetinexgaintransmissionCurve; enum RenderingIntent { RI_PERCEPTUAL = INTENT_PERCEPTUAL, @@ -57,213 +57,211 @@ namespace procparams { -template -class Threshold +template +class Threshold final { public: - T value[4]; + Threshold(T _bottom, T _top, bool _start_at_one) : + Threshold(_bottom, _top, 0, 0, _start_at_one, false) + { + } -protected: - bool initEq1; - bool _isDouble; + Threshold(T _bottom_left, T _top_left, T _bottom_right, T _top_right, bool _start_at_one) : + Threshold(_bottom_left, _top_left, _bottom_right, _top_right, _start_at_one, true) + { + } -public: - Threshold (T bottom, T top, bool startAtOne) + template + typename std::enable_if::value, bool>::type operator ==(const Threshold& rhs) const + { + if (is_double) { + return + std::fabs (bottom_left - rhs.bottom_left) < 1e-10 + && std::fabs (top_left - rhs.top_left) < 1e-10 + && std::fabs (bottom_right - rhs.bottom_right) < 1e-10 + && std::fabs (top_right - rhs.top_right) < 1e-10; + } else { + return + std::fabs (bottom_left - rhs.bottom_left) < 1e-10 + && std::fabs (top_left - rhs.top_left) < 1e-10; + } + } + + template + typename std::enable_if::value, bool>::type operator ==(const Threshold& rhs) const + { + if (is_double) { + return + bottom_left == rhs.bottom_left + && top_left == rhs.top_left + && bottom_right == rhs.bottom_right + && top_right == rhs.top_right; + } else { + return + bottom_left == rhs.bottom_left + && top_left == rhs.top_left; + } + } + + T getBottom() const { - initEq1 = startAtOne; - value[0] = bottom; - value[1] = top; - value[2] = T (0); - value[3] = T (0); - _isDouble = false; + return bottom_left; } - Threshold (T bottomLeft, T topLeft, T bottomRight, T topRight, bool startAtOne) + T getTop() const { - initEq1 = startAtOne; - value[0] = bottomLeft; - value[1] = topLeft; - value[2] = bottomRight; - value[3] = topRight; - _isDouble = true; + return top_left; } - // for convenience, since 'values' is public - void setValues (T bottom, T top) + T getBottomLeft() const { - value[0] = bottom; - value[1] = top; + return bottom_left; } - // for convenience, since 'values' is public - void setValues (T bottomLeft, T topLeft, T bottomRight, T topRight) + T getTopLeft() const { - value[0] = bottomLeft; - value[1] = topLeft; - value[2] = bottomRight; - value[3] = topRight; + return top_left; + } + + T getBottomRight() const + { + return bottom_right; + } + + T getTopRight() const + { + return top_right; + } + + void setValues(T bottom, T top) + { + bottom_left = bottom; + top_left = top; + } + + void setValues(T bottom_left, T top_left, T bottom_right, T top_right) + { + this->bottom_left = bottom_left; + this->top_left = top_left; + this->bottom_right = bottom_right; + this->top_right = top_right; } bool isDouble() const { - return _isDouble; + return is_double; + } + + std::vector toVector() const + { + if (is_double) { + return { + bottom_left, + top_left, + bottom_right, + top_right + }; + } else { + return { + bottom_left, + top_left + }; + } } // RT: Type of the returned value // RV: Type of the value on the X axis // RV2: Type of the maximum value on the Y axis template - RT multiply (RV x, RV2 yMax) const + RT multiply (RV x, RV2 y_max) const { - double val = double (x); + const double val = x; - if (initEq1) { - if (_isDouble) { - if (val == double (value[2]) && double (value[2]) == double (value[3])) - // this handle the special case where the 2 right values are the same, then bottom one is sent back, + if (init_eql) { + if (is_double) { + if (val == static_cast(bottom_right) && static_cast(bottom_right) == static_cast(top_right)) { + // This handles the special case where the 2 right values are the same, then bottom one is sent back, // useful if one wants to keep the bottom value even beyond the x max bound - { - return RT (0.); + return 0; } - if (val >= double (value[3])) { - return RT (yMax); + if (val >= static_cast(top_right)) { + return y_max; } - if (val > double (value[2])) { - return RT (double (yMax) * (val - double (value[2])) / (double (value[3]) - double (value[2]))); + if (val > static_cast(bottom_right)) { + return static_cast(y_max * (val - static_cast(bottom_right)) / (static_cast(top_right) - static_cast(bottom_right))); } } - if (val >= double (value[0])) { - return RT (0); + if (val >= static_cast(bottom_left)) { + return 0; } - if (val > double (value[1])) { - return RT (double (yMax) * (1. - (val - double (value[0])) / (double (value[1]) - double (value[0])))); + if (val > static_cast(top_left)) { + return static_cast(y_max * (1. - (val - static_cast(bottom_left)) / (static_cast(top_left) - static_cast(bottom_left)))); } - return RT (yMax); + return y_max; } else { - if (_isDouble) { - if (val == double (value[2]) && double (value[2]) == double (value[3])) - // this handle the special case where the 2 right values are the same, then top one is sent back, + if (is_double) { + if (val == static_cast(bottom_right) && static_cast(bottom_right) == static_cast(top_right)) { + // This handles the special case where the 2 right values are the same, then top one is sent back, // useful if one wants to keep the top value even beyond the x max bound - { - return RT (yMax); + return y_max; } - if (val >= double (value[2])) { - return RT (0); + if (val >= static_cast(bottom_right)) { + return 0; } - if (val > double (value[3])) { - return RT (double (yMax) * (1. - (val - double (value[3])) / (double (value[2]) - double (value[3])))); + if (val > static_cast(top_right)) { + return static_cast(y_max * (1.0 - (val - static_cast(top_right)) / (static_cast(bottom_right) - static_cast(top_right)))); } } - if (val >= double (value[1])) { - return RT (yMax); + if (val >= static_cast(top_left)) { + return y_max; } - if (val > double (value[0])) { - return RT (double (yMax) * (val - double (value[0])) / (double (value[1]) - double (value[0]))); + if (val > static_cast(bottom_left)) { + return static_cast(y_max * (val - static_cast(bottom_left)) / (static_cast(top_left) - static_cast(bottom_left))); } - return RT (0); + return 0; } } - // RT: Type of the returned value - // RV: Type of the value on the X axis - /*template - RT getRatio(RV val) const { - double val = double(val); - if (initEq1) { - if (_isDouble) { // assuming that simple thresholds will be more frequent - if (val >= double(value[3])) - return RT(1); - if (val > double(value[2])) - return (val-double(value[2]))/(double(value[3])-double(value[2])); - } - if (val >= double(value[1])) - return RT(0); - if (val > double(value[0])) - return 1.-(val-double(value[0]))/(double(value[1])-double(value[0])); - return RT(1); - } - else { - if (_isDouble) { // assuming that simple thresholds will be more frequent - if (val >= double(value[3])) - return RT(0); - if (val > double(value[2])) - return 1.-(val-double(value[2]))/(double(value[3])-double(value[2])); - } - if (val >= double(value[1])) - return RT(1); - if (val > double(value[0])) - return (val-double(value[0]))/(double(value[1])-double(value[0])); - return RT(0); - } - }*/ - - Threshold& operator = (const Threshold &rhs) +private: + Threshold(T _bottom_left, T _top_left, T _bottom_right, T _top_right, bool _start_at_one, bool _is_double) : + bottom_left(_bottom_left), + top_left(_top_left), + bottom_right(_bottom_right), + top_right(_top_right), + init_eql(_start_at_one), + is_double(_is_double) { - value[0] = rhs.value[0]; - value[1] = rhs.value[1]; - value[2] = rhs.value[2]; - value[3] = rhs.value[3]; - initEq1 = rhs.initEq1; - _isDouble = rhs._isDouble; - return *this; } - template - typename std::enable_if::value, bool>::type operator == (const Threshold &rhs) const - { - if (_isDouble) { - return std::fabs (value[0] - rhs.value[0]) < 1e-10 - && std::fabs (value[1] - rhs.value[1]) < 1e-10 - && std::fabs (value[2] - rhs.value[2]) < 1e-10 - && std::fabs (value[3] - rhs.value[3]) < 1e-10; - } else { - return std::fabs (value[0] - rhs.value[0]) < 1e-10 - && std::fabs (value[1] - rhs.value[1]) < 1e-10; - } - } - - template - typename std::enable_if::value, bool>::type operator == (const Threshold &rhs) const - { - if (_isDouble) { - return - value[0] == rhs.value[0] - && value[1] == rhs.value[1] - && value[2] == rhs.value[2] - && value[3] == rhs.value[3]; - } else { - return - value[0] == rhs.value[0] - && value[1] == rhs.value[1]; - } - } + T bottom_left; + T top_left; + T bottom_right; + T top_right; + bool init_eql; + bool is_double; }; /** * Parameters of the tone curve */ -class ToneCurveParams -{ - -public: - - enum eTCModeId { - TC_MODE_STD, // Standard modes, the curve is applied on all component individually - TC_MODE_WEIGHTEDSTD, // Weighted standard mode - TC_MODE_FILMLIKE, // Film-like mode, as defined in Adobe's reference code - TC_MODE_SATANDVALBLENDING, // Modify the Saturation and Value channel - TC_MODE_LUMINANCE, // Modify the Luminance channel with coefficients from Rec 709's - TC_MODE_PERCEPTUAL // Keep color appearance constant using perceptual modeling +struct ToneCurveParams { + enum class TcMode { + STD, // Standard modes, the curve is applied on all component individually + WEIGHTEDSTD, // Weighted standard mode + FILMLIKE, // Film-like mode, as defined in Adobe's reference code + SATANDVALBLENDING, // Modify the Saturation and Value channel + LUMINANCE, // Modify the Luminance channel with coefficients from Rec 709's + PERCEPTUAL // Keep color appearance constant using perceptual modeling }; bool autoexp; @@ -273,8 +271,8 @@ double expcomp; std::vector curve; std::vector curve2; - eTCModeId curveMode; - eTCModeId curveMode2; + TcMode curveMode; + TcMode curveMode2; int brightness; int black; int contrast; @@ -282,21 +280,20 @@ int shcompr; int hlcompr; // Highlight Recovery's compression int hlcomprthresh; // Highlight Recovery's threshold + bool histmatching; // histogram matching + + ToneCurveParams(); + + bool operator ==(const ToneCurveParams& other) const; + bool operator !=(const ToneCurveParams& other) const; - ToneCurveParams () - { - setDefaults(); - } - void setDefaults(); - static bool HLReconstructionNecessary (LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw); }; + /** * Parameters of Retinex */ -class RetinexParams +struct RetinexParams { - -public: bool enabled; std::vector cdcurve; std::vector cdHcurve; @@ -329,23 +326,22 @@ int highl; int skal; bool medianmap; - RetinexParams (); - void setDefaults(); - void getCurves (RetinextransmissionCurve &transmissionCurveLUT, RetinexgaintransmissionCurve &gaintransmissionCurveLUT) const; - static void getDefaultgaintransmissionCurve (std::vector &curve); + RetinexParams(); - static void getDefaulttransmissionCurve (std::vector &curve); + bool operator ==(const RetinexParams& other) const; + bool operator !=(const RetinexParams& other) const; + + void getCurves(RetinextransmissionCurve& transmissionCurveLUT, RetinexgaintransmissionCurve& gaintransmissionCurveLUT) const; }; /** * Parameters of the luminance curve */ -class LCurveParams +struct LCurveParams { - -public: + bool enabled; std::vector lcurve; std::vector acurve; std::vector bcurve; @@ -361,29 +357,52 @@ bool avoidcolorshift; double rstprotection; bool lcredsk; + + LCurveParams(); + + bool operator ==(const LCurveParams& other) const; + bool operator !=(const LCurveParams& other) const; +}; + + +/** + * Parameters for local contrast + */ +struct LocalContrastParams { + bool enabled; + int radius; + double amount; + double darkness; + double lightness; + + LocalContrastParams(); + + bool operator==(const LocalContrastParams &other) const; + bool operator!=(const LocalContrastParams &other) const; }; + /** * Parameters of the RGB curves */ -class RGBCurvesParams -{ - -public: +struct RGBCurvesParams { + bool enabled; bool lumamode; std::vector rcurve; std::vector gcurve; std::vector bcurve; + + RGBCurvesParams(); + + bool operator ==(const RGBCurvesParams& other) const; + bool operator !=(const RGBCurvesParams& other) const; }; /** * Parameters of the Color Toning */ -class ColorToningParams -{ - -public: +struct ColorToningParams { bool enabled; bool autosat; std::vector opacityCurve; @@ -405,6 +424,7 @@ * Lch : * RGBSliders : * RGBCurves : + * LabGrid : */ Glib::ustring method; @@ -428,28 +448,29 @@ double sathigh; bool lumamode; - ColorToningParams (); - void setDefaults(); // SHOULD BE GENERALIZED TO ALL CLASSES! + double labgridALow; + double labgridBLow; + double labgridAHigh; + double labgridBHigh; + static const double LABGRID_CORR_MAX; + + ColorToningParams(); + + bool operator ==(const ColorToningParams& other) const; + bool operator !=(const ColorToningParams& other) const; + /// @brief Transform the mixer values to their curve equivalences - void mixerToCurve (std::vector &colorCurve, std::vector &opacityCurve) const; + void mixerToCurve(std::vector& colorCurve, std::vector& opacityCurve) const; /// @brief Specifically transform the sliders values to their curve equivalences - void slidersToCurve (std::vector &colorCurve, std::vector &opacityCurve) const; + void slidersToCurve(std::vector& colorCurve, std::vector& opacityCurve) const; /// @brief Fill the ColorGradientCurve and OpacityCurve LUTf from the control points curve or sliders value - void getCurves (ColorGradientCurve &colorCurveLUT, OpacityCurve &opacityCurveLUT, const double xyz_rgb[3][3], const double rgb_xyz[3][3], bool &opautili) const; - - static void getDefaultColorCurve (std::vector &curve); - static void getDefaultOpacityCurve (std::vector &curve); - static void getDefaultCLCurve (std::vector &curve); - static void getDefaultCL2Curve (std::vector &curve); + void getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurve& opacityCurveLUT, const double xyz_rgb[3][3], bool& opautili) const; }; /** * Parameters of the sharpening */ -class SharpeningParams -{ - -public: +struct SharpeningParams { bool enabled; double radius; int amount; @@ -466,31 +487,39 @@ int deconvdamping; SharpeningParams(); + + bool operator ==(const SharpeningParams& other) const; + bool operator !=(const SharpeningParams& other) const; }; -class SharpenEdgeParams -{ -public: + +struct SharpenEdgeParams { bool enabled; int passes; double amount; bool threechannels; + + SharpenEdgeParams(); + + bool operator ==(const SharpenEdgeParams& other) const; + bool operator !=(const SharpenEdgeParams& other) const; }; -class SharpenMicroParams -{ -public: + +struct SharpenMicroParams { bool enabled; bool matrix; double amount; double uniformity; + + SharpenMicroParams(); + + bool operator ==(const SharpenMicroParams& other) const; + bool operator !=(const SharpenMicroParams& other) const; }; /** * Parameters of the vibrance */ -class VibranceParams -{ - -public: +struct VibranceParams { bool enabled; int pastels; int saturated; @@ -501,85 +530,69 @@ std::vector skintonescurve; VibranceParams(); -}; -/** - * Parameters of the color boost - */ -/*class ColorBoostParams { - - public: - int amount; - bool avoidclip; - bool enable_saturationlimiter; - double saturationlimit; -};*/ + bool operator ==(const VibranceParams& other) const; + bool operator !=(const VibranceParams& other) const; +}; /** * Parameters of the white balance adjustments */ +struct WBEntry { + enum class Type { + CAMERA, + AUTO, + DAYLIGHT, + CLOUDY, + SHADE, + WATER, + TUNGSTEN, + FLUORESCENT, + LAMP, + FLASH, + LED, + // CUSTOM one must remain the last one! + CUSTOM + }; -enum WBTypes { - WBT_CAMERA, - WBT_AUTO, - WBT_DAYLIGHT, - WBT_CLOUDY, - WBT_SHADE, - WBT_WATER, - WBT_TUNGSTEN, - WBT_FLUORESCENT, - WBT_LAMP, - WBT_FLASH, - WBT_LED, - // WBT_CUSTOM one must remain the last one! - WBT_CUSTOM -}; - -class WBEntry -{ -public: Glib::ustring ppLabel; - enum WBTypes type; + Type type; Glib::ustring GUILabel; int temperature; double green; double equal; double tempBias; - - WBEntry (const Glib::ustring &p, enum WBTypes t, const Glib::ustring &l, int temp, double green, double equal, double bias) : ppLabel (p), type (t), GUILabel (l), temperature (temp), green (green), equal (equal), tempBias (bias) {}; }; -class WBParams -{ - -public: - static std::vector wbEntries; +struct WBParams { + bool enabled; Glib::ustring method; int temperature; double green; double equal; double tempBias; - static void init(); - static void cleanup(); + WBParams(); + + bool operator ==(const WBParams& other) const; + bool operator !=(const WBParams& other) const; + + static const std::vector& getWbEntries(); }; /** * Parameters of colorappearance */ -class ColorAppearanceParams -{ - -public: - enum eTCModeId { - TC_MODE_LIGHT, // Lightness mode - TC_MODE_BRIGHT, // Brightness mode +struct ColorAppearanceParams { + enum class TcMode { + LIGHT, // Lightness mode + BRIGHT, // Brightness mode }; - enum eCTCModeId { - TC_MODE_CHROMA, // chroma mode - TC_MODE_SATUR, // saturation mode - TC_MODE_COLORF, // colorfullness mode + enum class CtcMode { + CHROMA, // chroma mode + SATUR, // saturation mode + COLORF, // colorfullness mode }; bool enabled; @@ -590,9 +603,9 @@ std::vector curve; std::vector curve2; std::vector curve3; - eTCModeId curveMode; - eTCModeId curveMode2; - eCTCModeId curveMode3; + TcMode curveMode; + TcMode curveMode2; + CtcMode curveMode3; Glib::ustring surround; Glib::ustring surrsrc; @@ -616,7 +629,6 @@ double rstprotection; bool surrsource; bool gamut; - // bool badpix; bool datacie; bool tonecie; int tempout; @@ -625,74 +637,44 @@ int tempsc; double greensc; - // bool sharpcie; -}; - -/** - * Parameters of the color shift - */ -/*class ColorShiftParams { - - public: - double a; - double b; -};*/ - -/** - * Parameters of the luminance denoising - */ -/*class LumaDenoiseParams { - - public: - bool enabled; - double radius; - int edgetolerance; -};*/ + ColorAppearanceParams(); -/** - * Parameters of the color denoising - */ -/*class ColorDenoiseParams { - - public: - bool enabled; - int edgetolerance; - bool edgesensitive; - int amount; -};*/ + bool operator ==(const ColorAppearanceParams& other) const; + bool operator !=(const ColorAppearanceParams& other) const; +}; /** * Parameters of defringing */ -class DefringeParams -{ - -public: +struct DefringeParams { bool enabled; double radius; float threshold; std::vector huecurve; + + DefringeParams(); + + bool operator ==(const DefringeParams& other) const; + bool operator !=(const DefringeParams& other) const; }; /** * Parameters of impulse denoising */ -class ImpulseDenoiseParams -{ - -public: +struct ImpulseDenoiseParams { bool enabled; int thresh; + ImpulseDenoiseParams(); + + bool operator ==(const ImpulseDenoiseParams& other) const; + bool operator !=(const ImpulseDenoiseParams& other) const; }; /** * Parameters of the directional pyramid denoising */ -class DirPyrDenoiseParams -{ - -public: +struct DirPyrDenoiseParams { std::vector lcurve; std::vector cccurve; @@ -717,51 +699,65 @@ Glib::ustring rgbmethod; int passes; - DirPyrDenoiseParams (); - void setDefaults(); // SHOULD BE GENERALIZED TO ALL CLASSES! - void getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const; + DirPyrDenoiseParams(); + + bool operator ==(const DirPyrDenoiseParams& other) const; + bool operator !=(const DirPyrDenoiseParams& other) const; - static void getDefaultNoisCurve (std::vector &curve); - static void getDefaultCCCurve (std::vector &curve); + void getCurves(NoiseCurve& lCurve, NoiseCurve& cCurve) const; }; -//EPD related parameters. -class EPDParams -{ -public: +// EPD related parameters. +struct EPDParams { bool enabled; double strength; double gamma; double edgeStopping; double scale; int reweightingIterates; + + EPDParams(); + + bool operator ==(const EPDParams& other) const; + bool operator !=(const EPDParams& other) const; +}; + +// Fattal02 Tone-Mapping parameters +struct FattalToneMappingParams { + bool enabled; + int threshold; + int amount; + int anchor; + + FattalToneMappingParams(); + + bool operator ==(const FattalToneMappingParams& other) const; + bool operator !=(const FattalToneMappingParams& other) const; }; /** * Parameters of the shadow/highlight enhancement */ -class SHParams -{ - -public: +struct SHParams { bool enabled; bool hq; int highlights; int htonalwidth; int shadows; int stonalwidth; - int localcontrast; int radius; + + SHParams(); + + bool operator ==(const SHParams& other) const; + bool operator !=(const SHParams& other) const; }; /** * Parameters of the cropping */ -class CropParams -{ - -public: +struct CropParams { bool enabled; int x; int y; @@ -772,63 +768,66 @@ Glib::ustring orientation; Glib::ustring guide; - CropParams() : enabled (false), x (0), y (0), w (0), h (0), fixratio (false) {}; - void mapToResized (int resizedWidth, int resizedHeight, int scale, int &x1, int &x2, int &y1, int &y2) const; + CropParams(); + + bool operator ==(const CropParams& other) const; + bool operator !=(const CropParams& other) const; + + void mapToResized(int resizedWidth, int resizedHeight, int scale, int& x1, int& x2, int& y1, int& y2) const; }; /** * Parameters of the coarse transformations like 90 deg rotations and h/v flipping */ -class CoarseTransformParams -{ - -public: +struct CoarseTransformParams { int rotate; bool hflip; bool vflip; - CoarseTransformParams() - { - setDefaults(); - } - void setDefaults(); + CoarseTransformParams(); + + bool operator ==(const CoarseTransformParams& other) const; + bool operator !=(const CoarseTransformParams& other) const; }; /** * Common transformation parameters */ -class CommonTransformParams -{ - -public: +struct CommonTransformParams { bool autofill; + + CommonTransformParams(); + + bool operator ==(const CommonTransformParams& other) const; + bool operator !=(const CommonTransformParams& other) const; }; /** * Parameters of the rotation */ -class RotateParams -{ - -public: +struct RotateParams { double degree; + + RotateParams(); + + bool operator ==(const RotateParams& other) const; + bool operator !=(const RotateParams& other) const; }; /** * Parameters of the distortion correction */ -class DistortionParams -{ - -public: +struct DistortionParams { double amount; + + DistortionParams(); + + bool operator ==(const DistortionParams& other) const; + bool operator !=(const DistortionParams& other) const; }; // Lens profile correction parameters -class LensProfParams -{ - -public: +struct LensProfParams { enum class LcMode { NONE, // No lens correction LENSFUNAUTOMATCH, // Lens correction using auto matched lensfun database entry @@ -836,7 +835,6 @@ LCP // Lens correction using lcp file }; - static const char *methodstring[static_cast(LcMode::LCP) + 1u]; LcMode lcMode; Glib::ustring lcpFile; bool useDist, useVign, useCA; @@ -844,129 +842,110 @@ Glib::ustring lfCameraModel; Glib::ustring lfLens; - LensProfParams() - { - setDefaults(); - } - void setDefaults(); - - bool useLensfun() const - { - return lcMode == LcMode::LENSFUNAUTOMATCH || lcMode == LcMode::LENSFUNMANUAL; - } - - bool lfAutoMatch() const - { - return lcMode == LcMode::LENSFUNAUTOMATCH; - } - - bool useLcp() const - { - return lcMode == LcMode::LCP && lcpFile.length() > 0; - } - - bool lfManual() const - { - return lcMode == LcMode::LENSFUNMANUAL; - } + LensProfParams(); - Glib::ustring getMethodString(LcMode mode) const - { - return methodstring[static_cast(mode)]; - } + bool operator ==(const LensProfParams& other) const; + bool operator !=(const LensProfParams& other) const; - LcMode getMethodNumber(const Glib::ustring &mode) const - { - for(size_t i = 0; i <= static_cast(LcMode::LCP); ++i) { - if(methodstring[i] == mode) { - return static_cast(i); - } - } - return LcMode::NONE; - } + bool useLensfun() const; + bool lfAutoMatch() const; + bool useLcp() const; + bool lfManual() const; + + const std::vector& getMethodStrings() const; + Glib::ustring getMethodString(LcMode mode) const; + LcMode getMethodNumber(const Glib::ustring& mode) const; }; /** * Parameters of the perspective correction */ -class PerspectiveParams -{ - -public: +struct PerspectiveParams { double horizontal; double vertical; + + PerspectiveParams(); + + bool operator ==(const PerspectiveParams& other) const; + bool operator !=(const PerspectiveParams& other) const; }; /** * Parameters of the gradient filter */ -class GradientParams -{ - -public: +struct GradientParams { bool enabled; double degree; int feather; double strength; int centerX; int centerY; + + GradientParams(); + + bool operator ==(const GradientParams& other) const; + bool operator !=(const GradientParams& other) const; }; /** * Parameters of the post-crop vignette filter */ -class PCVignetteParams -{ - -public: +struct PCVignetteParams { bool enabled; double strength; int feather; int roundness; + + PCVignetteParams(); + + bool operator ==(const PCVignetteParams& other) const; + bool operator !=(const PCVignetteParams& other) const; }; /** * Parameters of the vignetting correction */ -class VignettingParams -{ - -public: +struct VignettingParams { int amount; int radius; int strength; int centerX; int centerY; + + VignettingParams(); + + bool operator ==(const VignettingParams& other) const; + bool operator !=(const VignettingParams& other) const; }; /** * Parameters of the color mixer */ -class ChannelMixerParams -{ - -public: +struct ChannelMixerParams { + bool enabled; int red[3]; int green[3]; int blue[3]; -}; -class BlackWhiteParams -{ + ChannelMixerParams(); -public: - enum eTCModeId { - TC_MODE_STD_BW, // Standard modes, the curve is applied on all component individually - TC_MODE_WEIGHTEDSTD_BW, // Weighted standard mode - TC_MODE_FILMLIKE_BW, // Film-like mode, as defined in Adobe's reference code - TC_MODE_SATANDVALBLENDING_BW // Modify the Saturation and Value channel + bool operator ==(const ChannelMixerParams& other) const; + bool operator !=(const ChannelMixerParams& other) const; +}; + +struct BlackWhiteParams { + enum class TcMode { + STD_BW, // Standard modes, the curve is applied on all component individually + WEIGHTEDSTD_BW, // Weighted standard mode + FILMLIKE_BW, // Film-like mode, as defined in Adobe's reference code + SATANDVALBLENDING_BW // Modify the Saturation and Value channel }; std::vector beforeCurve; - eTCModeId beforeCurveMode; + TcMode beforeCurveMode; std::vector afterCurve; - eTCModeId afterCurveMode; + TcMode afterCurveMode; Glib::ustring algo; std::vector luminanceCurve; @@ -987,37 +966,30 @@ int gammaRed; int gammaGreen; int gammaBlue; + + BlackWhiteParams(); + + bool operator ==(const BlackWhiteParams& other) const; + bool operator !=(const BlackWhiteParams& other) const; }; /** * Parameters of the c/a correction */ -class CACorrParams -{ - -public: +struct CACorrParams { double red; double blue; -}; -/** - * Parameters of the highlight recovery - */ -/* -class HRecParams { + CACorrParams(); - public: - bool enabled; - Glib::ustring method; + bool operator ==(const CACorrParams& other) const; + bool operator !=(const CACorrParams& other) const; }; -*/ + /** * Parameters of the resizing */ -class ResizeParams -{ - -public: +struct ResizeParams { bool enabled; double scale; Glib::ustring appliesTo; @@ -1025,15 +997,17 @@ int dataspec; int width; int height; + + ResizeParams(); + + bool operator ==(const ResizeParams& other) const; + bool operator !=(const ResizeParams& other) const; }; /** * Parameters of the color spaces used during the processing */ -class ColorManagementParams -{ - -public: +struct ColorManagementParams { Glib::ustring input; bool toneCurve; bool applyLookTable; @@ -1044,20 +1018,39 @@ Glib::ustring output; RenderingIntent outputIntent; bool outputBPC; - static const Glib::ustring NoICMString; Glib::ustring gamma; double gampos; double slpos; bool freegamma; - ColorManagementParams() - { - setDefaults(); - } - void setDefaults(); + static const Glib::ustring NoICMString; + + ColorManagementParams(); + + bool operator ==(const ColorManagementParams& other) const; + bool operator !=(const ColorManagementParams& other) const; }; + +/** + * Parameters for metadata handling + */ +struct MetaDataParams { + enum Mode { + TUNNEL, + EDIT, + STRIP + }; + Mode mode; + + MetaDataParams(); + + bool operator ==(const MetaDataParams &other) const; + bool operator !=(const MetaDataParams &other) const; +}; + + /** * Typedef for representing a key/value for the exif metadata information */ @@ -1066,14 +1059,10 @@ /** * The IPTC key/value pairs */ -typedef std::map > IPTCPairs; +typedef std::map> IPTCPairs; - -class WaveletParams -{ - -public: - std::vector ccwcurve; +struct WaveletParams { + std::vector ccwcurve; std::vector opacityCurveRG; std::vector opacityCurveBY; std::vector opacityCurveW; @@ -1086,15 +1075,14 @@ bool medianlev; bool linkedg; bool cbenab; - double greenlow; - double bluelow; - double greenmed; - double bluemed; - double greenhigh; - double bluehigh; + int greenlow; + int bluelow; + int greenmed; + int bluemed; + int greenhigh; + int bluehigh; bool lipst; - // bool edgreinf; bool avoid; bool tmr; int strength; @@ -1110,7 +1098,7 @@ bool exptoning; bool expnoise; - Glib::ustring Lmethod; + int Lmethod; Glib::ustring CLmethod; Glib::ustring Backmethod; Glib::ustring Tilesmethod; @@ -1160,47 +1148,52 @@ Threshold level2noise; Threshold level3noise; + WaveletParams(); - WaveletParams (); - void setDefaults(); - void getCurves (WavCurve &cCurve, WavOpacityCurveRG &opacityCurveLUTRG, WavOpacityCurveBY &opacityCurveLUTBY, WavOpacityCurveW &opacityCurveLUTW, WavOpacityCurveWL &opacityCurveLUTWL) const; - static void getDefaultCCWCurve (std::vector &curve); - static void getDefaultOpacityCurveRG (std::vector &curve); - static void getDefaultOpacityCurveBY (std::vector &curve); - static void getDefaultOpacityCurveW (std::vector &curve); - static void getDefaultOpacityCurveWL (std::vector &curve); + bool operator ==(const WaveletParams& other) const; + bool operator !=(const WaveletParams& other) const; + void getCurves( + WavCurve& cCurve, + WavOpacityCurveRG& + opacityCurveLUTRG, + WavOpacityCurveBY& opacityCurveLUTBY, + WavOpacityCurveW& opacityCurveLUTW, + WavOpacityCurveWL& opacityCurveLUTWL + ) const; }; - /** * Directional pyramid equalizer params */ -class DirPyrEqualizerParams -{ - -public: +struct DirPyrEqualizerParams { bool enabled; bool gamutlab; double mult[6]; double threshold; double skinprotect; Threshold hueskin; - //Glib::ustring algo; Glib::ustring cbdlMethod; - DirPyrEqualizerParams() : hueskin (20, 80, 2000, 1200, false) {}; + + DirPyrEqualizerParams(); + + bool operator ==(const DirPyrEqualizerParams& other) const; + bool operator !=(const DirPyrEqualizerParams& other) const; }; /** * HSV equalizer params */ -class HSVEqualizerParams -{ +struct HSVEqualizerParams { + bool enabled; + std::vector hcurve; + std::vector scurve; + std::vector vcurve; -public: - std::vector hcurve; - std::vector scurve; - std::vector vcurve; + HSVEqualizerParams(); + + bool operator ==(const HSVEqualizerParams& other) const; + bool operator !=(const HSVEqualizerParams& other) const; }; @@ -1212,45 +1205,51 @@ Glib::ustring clutFilename; int strength; - FilmSimulationParams() - { - setDefaults(); - } + FilmSimulationParams(); - void setDefaults() - { - enabled = false; - clutFilename = Glib::ustring(); - strength = 100; - } + bool operator ==(const FilmSimulationParams& other) const; + bool operator !=(const FilmSimulationParams& other) const; }; /** * Parameters for RAW demosaicing, common to all sensor type */ -class RAWParams -{ - -public: +struct RAWParams { /** * Parameters for RAW demosaicing specific to Bayer sensors */ - class BayerSensor - { - public: - //enum eMethod{ eahd,hphd,vng4,dcb,amaze,ahd,IGV_noise,fast, - //numMethods }; // This MUST be the last enum - enum eMethod { amaze, igv, lmmse, eahd, hphd, vng4, dcb, ahd, fast, mono, none, pixelshift, - numMethods - }; // This MUST be the last enum - enum ePSMotionCorrection { - Grid1x1, Grid1x2, Grid3x3, Grid5x5, Grid7x7, Grid3x3New + struct BayerSensor { + enum class Method { + AMAZE, + IGV, + LMMSE, + EAHD, + HPHD, + VNG4, + DCB, + AHD, + RCD, + FAST, + MONO, + NONE, + PIXELSHIFT }; - enum ePSMotionCorrectionMethod { - Off, Automatic, Custom + + enum class PSMotionCorrection { + GRID_1X1, + GRID_1X2, + GRID_3X3, + GRID_5X5, + GRID_7X7, + GRID_3X3_NEW + }; + + enum class PSMotionCorrectionMethod { + OFF, + AUTO, + CUSTOM }; - static const char *methodstring[numMethods]; Glib::ustring method; int imageNum; @@ -1265,8 +1264,8 @@ int dcb_iterations; int lmmse_iterations; int pixelShiftMotion; - ePSMotionCorrection pixelShiftMotionCorrection; - ePSMotionCorrectionMethod pixelShiftMotionCorrectionMethod; + PSMotionCorrection pixelShiftMotionCorrection; + PSMotionCorrectionMethod pixelShiftMotionCorrectionMethod; double pixelShiftStddevFactorGreen; double pixelShiftStddevFactorRed; double pixelShiftStddevFactorBlue; @@ -1289,44 +1288,61 @@ double pixelShiftSmoothFactor; bool pixelShiftExp0; bool pixelShiftLmmse; + bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; bool pixelShiftNonGreenCross2; bool pixelShiftNonGreenAmaze; bool dcb_enhance; - //bool all_enhance; + + BayerSensor(); + + bool operator ==(const BayerSensor& other) const; + bool operator !=(const BayerSensor& other) const; void setPixelShiftDefaults(); + static const std::vector& getMethodStrings(); + static Glib::ustring getMethodString(Method method); }; /** * Parameters for RAW demosaicing specific to X-Trans sensors */ - class XTransSensor - { - public: - enum eMethod { threePass, onePass, fast, mono, none, - numMethods - }; // This MUST be the last enum - static const char *methodstring[numMethods]; + struct XTransSensor { + enum class Method { + THREE_PASS, + ONE_PASS, + FAST, + MONO, + NONE + }; Glib::ustring method; int ccSteps; double blackred; double blackgreen; double blackblue; - }; + + XTransSensor(); + + bool operator ==(const XTransSensor& other) const; + bool operator !=(const XTransSensor& other) const; + + static const std::vector& getMethodStrings(); + static Glib::ustring getMethodString(Method method); + }; BayerSensor bayersensor; ///< RAW parameters for Bayer sensors XTransSensor xtranssensor; ///< RAW parameters for X-Trans sensors - enum eFlatFileBlurType { /*parametric,*/area_ff, v_ff, h_ff, vh_ff, - numFlatFileBlurTypes - }; // This MUST be the last enum - - static const char *ff_BlurTypestring[numFlatFileBlurTypes]; + enum class FlatFieldBlurType { + AREA, + V, + H, + VH, + }; Glib::ustring dark_frame; bool df_autoselect; @@ -1350,11 +1366,13 @@ bool deadPixelFilter; int hotdeadpix_thresh; - RAWParams() - { - setDefaults(); - } - void setDefaults(); + RAWParams(); + + bool operator ==(const RAWParams& other) const; + bool operator !=(const RAWParams& other) const; + + static const std::vector& getFlatFieldBlurTypeStrings(); + static Glib::ustring getFlatFieldBlurTypeString(FlatFieldBlurType type); }; /** @@ -1366,7 +1384,8 @@ public: ToneCurveParams toneCurve; ///< Tone curve parameters LCurveParams labCurve; ///< CIELAB luminance curve parameters - RetinexParams retinex; ///< Retinex parameters + RetinexParams retinex; ///< Retinex parameters + LocalContrastParams localContrast; ////< Local contrast parameters RGBCurvesParams rgbCurves; ///< RGB curves parameters ColorToningParams colorToning; ///< Color Toning parameters SharpeningParams sharpening; ///< Sharpening parameters @@ -1374,16 +1393,13 @@ SharpenEdgeParams sharpenEdge; ///< Sharpen edge parameters SharpenMicroParams sharpenMicro; ///< Sharpen microcontrast parameters VibranceParams vibrance; ///< Vibrance parameters - //ColorBoostParams colorBoost; ///< Color boost parameters WBParams wb; ///< White balance parameters ColorAppearanceParams colorappearance; - //ColorShiftParams colorShift; ///< Color shift parameters - //LumaDenoiseParams lumaDenoise; ///< Luminance denoising parameters - //ColorDenoiseParams colorDenoise; ///< Color denoising parameters DefringeParams defringe; ///< Defringing parameters ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters EPDParams epd; ///< Edge Preserving Decomposition parameters + FattalToneMappingParams fattal; ///< Fattal02 tone mapping SHParams sh; ///< Shadow/highlight enhancement parameters CropParams crop; ///< Crop parameters CoarseTransformParams coarse; ///< Coarse transformation (90, 180, 270 deg rotation, h/v flipping) parameters @@ -1397,7 +1413,7 @@ CACorrParams cacorrection; ///< Lens c/a correction parameters VignettingParams vignetting; ///< Lens vignetting correction parameters ChannelMixerParams chmixer; ///< Channel mixer parameters - BlackWhiteParams blackwhite; ///< Black & White parameters + BlackWhiteParams blackwhite; ///< Black& White parameters ResizeParams resize; ///< Resize parameters ColorManagementParams icm; ///< profiles/color spaces used during the image processing RAWParams raw; ///< RAW parameters before demosaicing @@ -1405,23 +1421,24 @@ DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid wavelet parameters HSVEqualizerParams hsvequalizer; ///< hsv wavelet parameters FilmSimulationParams filmSimulation; ///< film simulation parameters - char rank; ///< Custom image quality ranking - char colorlabel; ///< Custom color label + int rank; ///< Custom image quality ranking + int colorlabel; ///< Custom color label bool inTrash; ///< Marks deleted image Glib::ustring appVersion; ///< Version of the application that generated the parameters int ppVersion; ///< Version of the PP file from which the parameters have been read - ExifPairs exif; ///< List of modifications appplied on the exif tags of the input image - IPTCPairs iptc; ///< The IPTC tags and values to be saved to the output image + MetaDataParams metadata; ///< Metadata parameters + ExifPairs exif; ///< List of modifications appplied on the exif tags of the input image + IPTCPairs iptc; ///< The IPTC tags and values to be saved to the output image /** * The constructor only sets the hand-wired defaults. */ - ProcParams (); + ProcParams(); /** * Sets the hand-wired defaults parameters. */ - void setDefaults (); + void setDefaults(); /** * Saves the parameters to possibly two files. This is a performance improvement if a function has to * save the same file in two different location, i.e. the cache and the image's directory @@ -1432,28 +1449,28 @@ * @param pedited pointer to a ParamsEdited object (optional) to store which values has to be saved * @return Error code (=0 if all supplied filenames where created correctly) */ - int save (const Glib::ustring &fname, const Glib::ustring &fname2 = "", bool fnameAbsolute = true, ParamsEdited* pedited = nullptr); + int save(const Glib::ustring& fname, const Glib::ustring& fname2 = Glib::ustring(), bool fnameAbsolute = true, ParamsEdited* pedited = nullptr); /** * Loads the parameters from a file. * @param fname the name of the file * @params pedited pointer to a ParamsEdited object (optional) to store which values has been loaded * @return Error code (=0 if no error) */ - int load (const Glib::ustring &fname, ParamsEdited* pedited = nullptr); + int load(const Glib::ustring& fname, ParamsEdited* pedited = nullptr); /** Creates a new instance of ProcParams. * @return a pointer to the new ProcParams instance. */ - static ProcParams* create (); + static ProcParams* create (); /** Destroys an instance of ProcParams. * @param pp a pointer to the ProcParams instance to destroy. */ - static void destroy (ProcParams* pp); + static void destroy(ProcParams* pp); - static void init (); - static void cleanup (); + static void init(); + static void cleanup(); - bool operator== (const ProcParams& other); - bool operator!= (const ProcParams& other); + bool operator ==(const ProcParams& other) const; + bool operator !=(const ProcParams& other) const; private: /** Write the ProcParams's text in the file of the given name. @@ -1461,8 +1478,7 @@ * @param content the text to write * @return Error code (=0 if no error) * */ - int write (const Glib::ustring &fname, const Glib::ustring &content) const; - + int write(const Glib::ustring& fname, const Glib::ustring& content) const; }; /** @@ -1471,29 +1487,24 @@ * saving too) * * PartialProfile is not responsible of ProcParams and ParamsEdited object creation - * and hence is not responsible of their destructions. The function that instanciate + * and hence is not responsible of their destructions. The function that instantiate * PartialProfile object has to handle all this itself. */ -class PartialProfile +class PartialProfile : + public NonCopyable { public: + PartialProfile(bool createInstance = false, bool paramsEditedValue = false); + PartialProfile(ProcParams* pp, ParamsEdited* pe = nullptr, bool fullCopy = false); + PartialProfile(const ProcParams* pp, const ParamsEdited* pe = nullptr); + void deleteInstance(); + void clearGeneral(); + int load(const Glib::ustring& fName); + void set(bool v); + void applyTo(ProcParams* destParams) const ; + rtengine::procparams::ProcParams* pparams; ParamsEdited* pedited; - PartialProfile& operator = (const PartialProfile& rhs) - { - pparams = rhs.pparams; - pedited = rhs.pedited; - return *this; - }; - - PartialProfile (bool createInstance = false, bool paramsEditedValue = false); - PartialProfile (ProcParams* pp, ParamsEdited* pe = nullptr, bool fullCopy = false); - PartialProfile (const ProcParams* pp, const ParamsEdited* pe = nullptr); - void deleteInstance (); - void clearGeneral (); - int load (const Glib::ustring &fName); - void set (bool v); - const void applyTo (ProcParams *destParams) const ; }; /** @@ -1501,16 +1512,13 @@ * and automatically delete them in the destructor. This class has been mostly created * to be used with vectors, which use the default constructor/destructor */ -class AutoPartialProfile : public PartialProfile +class AutoPartialProfile : + public PartialProfile { public: - AutoPartialProfile() : PartialProfile (true) {} - ~AutoPartialProfile() - { - deleteInstance(); - } + AutoPartialProfile(); + ~AutoPartialProfile(); }; } } -#endif diff -Nru rawtherapee-5.3/rtengine/profilestore.cc rawtherapee-5.4/rtengine/profilestore.cc --- rawtherapee-5.3/rtengine/profilestore.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/profilestore.cc 2018-03-20 11:04:15.000000000 +0000 @@ -49,6 +49,7 @@ if ((storeState == STORESTATE_NOTINITIALIZED || storeState == STORESTATE_DIRTY) && loadAll) { storeState = STORESTATE_BEINGINITIALIZED; _parseProfiles (); + std::stable_partition(entries.begin(), entries.end(), [](const ProfileStoreEntry *e) { return e->type == PSET_FOLDER; }); storeState = STORESTATE_INITIALIZED; } @@ -120,11 +121,14 @@ Glib::ustring p2 = options.getGlobalProfilePath(); bool displayLevel0 = options.useBundledProfiles && !p1.empty() && !p2.empty() && p1 != p2; - Glib::ustring virtualPath ("${U}"); - Glib::ustring currDir ("${U}"); - parseDir (p1, virtualPath, currDir, 0, 0, displayLevel0); - - if (displayLevel0) { + Glib::ustring virtualPath; + Glib::ustring currDir; + if (!p1.empty()) { + virtualPath = "${U}"; + currDir = "${U}"; + parseDir (p1, virtualPath, currDir, 0, 0, displayLevel0); + } + if (p1.empty() || displayLevel0) { virtualPath = "${G}"; currDir = "${G}"; parseDir (p2, virtualPath, currDir, 0, 0, displayLevel0); @@ -498,7 +502,7 @@ printf ("\n"); } -PartialProfile *ProfileStore::loadDynamicProfile (const ImageMetaData *im) +PartialProfile *ProfileStore::loadDynamicProfile (const FramesMetaData *im) { if (storeState == STORESTATE_NOTINITIALIZED) { parseProfilesOnce(); diff -Nru rawtherapee-5.3/rtengine/profilestore.h rawtherapee-5.4/rtengine/profilestore.h --- rawtherapee-5.3/rtengine/profilestore.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/profilestore.h 2018-03-20 11:04:15.000000000 +0000 @@ -195,7 +195,7 @@ void addListener (ProfileStoreListener *listener); void removeListener (ProfileStoreListener *listener); - rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::ImageMetaData *im); + rtengine::procparams::PartialProfile* loadDynamicProfile (const rtengine::FramesMetaData *im); void dumpFolderList(); }; diff -Nru rawtherapee-5.3/rtengine/rawimage.cc rawtherapee-5.4/rtengine/rawimage.cc --- rawtherapee-5.3/rtengine/rawimage.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rawimage.cc 2018-03-20 11:04:15.000000000 +0000 @@ -695,7 +695,7 @@ } else if (colors == 1) { // Monochrome if (!allocation) { - allocation = new float[height * width]; + allocation = new float[static_cast(height) * static_cast(width)]; data = new float*[height]; for (int i = 0; i < height; i++) { @@ -704,7 +704,7 @@ } } else { if (!allocation) { - allocation = new float[3 * height * width]; + allocation = new float[3UL * static_cast(height) * static_cast(width)]; data = new float*[height]; for (int i = 0; i < height; i++) { diff -Nru rawtherapee-5.3/rtengine/rawimage.h rawtherapee-5.4/rtengine/rawimage.h --- rawtherapee-5.3/rtengine/rawimage.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rawimage.h 2018-03-20 11:04:15.000000000 +0000 @@ -24,7 +24,7 @@ #include #include "dcraw.h" -#include "imageio.h" +#include "imageformat.h" #include "noncopyable.h" namespace rtengine diff -Nru rawtherapee-5.3/rtengine/rawimagesource.cc rawtherapee-5.4/rtengine/rawimagesource.cc --- rawtherapee-5.3/rtengine/rawimagesource.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rawimagesource.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,6 @@ #include #endif #include "opthelper.h" -#define BENCHMARK #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD @@ -87,7 +86,7 @@ rotateLine (blue, image->b, tran, i, imwidth, imheight); } -void transLineFuji (const float* const red, const float* const green, const float* const blue, const int i, rtengine::Imagefloat* const image, const int tran, const int imwidth, const int imheight, const int fw) +void transLineFuji (const float* const red, const float* const green, const float* const blue, const int i, rtengine::Imagefloat* const image, const int tran, const int imheight, const int fw) { // Fuji SuperCCD rotation + coarse rotation @@ -623,7 +622,7 @@ return gain; } -void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw ) +void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw ) { MyMutex::MyLock lock(getImageMutex); @@ -650,8 +649,8 @@ const float new_pre_mul[4] = { ri->get_pre_mul(0) / rm, ri->get_pre_mul(1) / gm, ri->get_pre_mul(2) / bm, ri->get_pre_mul(3) / gm }; float new_scale_mul[4]; - bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::mono]) - || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono]); + bool isMono = (ri->getSensorType() == ST_FUJI_XTRANS && raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) + || (ri->getSensorType() == ST_BAYER && raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)); float gain = calculate_scale_mul(new_scale_mul, new_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); rm = new_scale_mul[0] / scale_mul[0] * gain; gm = new_scale_mul[1] / scale_mul[1] * gain; @@ -824,7 +823,7 @@ if(d1x) { transLineD1x (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, d1xHeightOdd, doClip); } else if(fuji) { - transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight, fw); + transLineFuji (line_red, line_grn, line_blue, ix, image, tran, imheight, fw); } else { transLineStandard (line_red, line_grn, line_blue, ix, image, tran, imwidth, imheight); } @@ -910,11 +909,11 @@ } } -DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as) +DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as) { DCPProfile *dcpProf = nullptr; cmsHPROFILE dummy; - findInputProfile(cmp.input, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); + findInputProfile(cmp.input, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); if (dcpProf == nullptr) { if (settings->verbose) { @@ -930,7 +929,7 @@ void RawImageSource::convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) { double pre_mul[3] = { ri->get_pre_mul(0), ri->get_pre_mul(1), ri->get_pre_mul(2) }; - colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast(getMetaData()))->getCamera()); + colorSpaceConversion (image, cmp, wb, pre_mul, embProfile, camProfile, imatrices.xyz_cam, (static_cast(getMetaData()))->getCamera()); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1342,12 +1341,12 @@ * (Taken from Emil Martinec idea) * (Optimized by Ingo Weyrich 2013 and 2015) */ -SSEFUNCTION int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels ) +int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels ) { float varthresh = (20.0 * (thresh / 100.0) + 1.0 ) / 24.f; // allocate temporary buffer - float (*cfablur); + float* cfablur; cfablur = (float (*)) malloc (H * W * sizeof * cfablur); // counter for dead or hot pixels @@ -1518,7 +1517,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -int RawImageSource::load (const Glib::ustring &fname, int imageNum, bool batch) +int RawImageSource::load (const Glib::ustring &fname) { MyTime t1, t2; @@ -1699,12 +1698,10 @@ } - //Load complete Exif informations - RawMetaDataLocation rml; - rml.exifBase = ri->get_exifBase(); - rml.ciffBase = ri->get_ciffBase(); - rml.ciffLength = ri->get_ciffLen(); - idata = new ImageData (fname, &rml); + // Load complete Exif information + std::unique_ptr rml(new RawMetaDataLocation (ri->get_exifBase(), ri->get_ciffBase(), ri->get_ciffLen())); + idata = new FramesData (fname, std::move(rml)); + idata->setDCRawFrameCount (numFrames); green(W, H); red(W, H); @@ -1923,7 +1920,7 @@ } // check if it is an olympus E camera or green equilibration is enabled. If yes, compute G channel pre-compensation factors - if ( ri->getSensorType() == ST_BAYER && (raw.bayersensor.greenthresh || (((idata->getMake().size() >= 7 && idata->getMake().substr(0, 7) == "OLYMPUS" && idata->getModel()[0] == 'E') || (idata->getMake().size() >= 9 && idata->getMake().substr(0, 9) == "Panasonic")) && raw.bayersensor.method != RAWParams::BayerSensor::methodstring[ RAWParams::BayerSensor::vng4])) ) { + if ( ri->getSensorType() == ST_BAYER && (raw.bayersensor.greenthresh || (((idata->getMake().size() >= 7 && idata->getMake().substr(0, 7) == "OLYMPUS" && idata->getModel()[0] == 'E') || (idata->getMake().size() >= 9 && idata->getMake().substr(0, 9) == "Panasonic")) && raw.bayersensor.method != RAWParams::BayerSensor::getMethodString( RAWParams::BayerSensor::Method::VNG4))) ) { // global correction if(numFrames == 4) { for(int i = 0; i < 4; ++i) { @@ -2005,7 +2002,7 @@ double clip = 0; int brightness, contrast, black, hlcompr, hlcomprthresh; getAutoExpHistogram (aehist, aehistcompr); - ImProcFunctions::getAutoExp (aehist, aehistcompr, getDefGain(), clip, dirpyrdenoiseExpComp, brightness, contrast, black, hlcompr, hlcomprthresh); + ImProcFunctions::getAutoExp (aehist, aehistcompr, clip, dirpyrdenoiseExpComp, brightness, contrast, black, hlcompr, hlcomprthresh); } t2.set(); @@ -2029,28 +2026,30 @@ t1.set(); if (ri->getSensorType() == ST_BAYER) { - if ( raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::hphd] ) { + if ( raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD) ) { hphd_demosaic (); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::vng4] ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4) ) { vng4_demosaic (); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::ahd] ) { - ahd_demosaic (0, 0, W, H); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze] ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD) ) { + ahd_demosaic (); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZE) ) { amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::pixelshift] ) { - pixelshift(0, 0, W, H, raw.bayersensor, currFrame, ri->get_model(), raw.expos); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT) ) { + pixelshift(0, 0, W, H, raw.bayersensor, currFrame, ri->get_maker(), ri->get_model(), raw.expos); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCB) ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::eahd]) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD)) { eahd_demosaic (); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::igv]) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV)) { igv_interpolate(W, H); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::lmmse]) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::LMMSE)) { lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast] ) { - fast_demosaic (0, 0, W, H); - } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono] ) { + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST) ) { + fast_demosaic(); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO) ) { nodemosaic(true); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCD) ) { + rcd_demosaic (); } else { nodemosaic(false); } @@ -2058,13 +2057,13 @@ //if (raw.all_enhance) refinement_lassus(); } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - if (raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::fast] ) { + if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST) ) { fast_xtrans_interpolate(); - } else if (raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::onePass]) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::ONE_PASS)) { xtrans_interpolate(1, false); - } else if (raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::threePass] ) { + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS) ) { xtrans_interpolate(3, true); - } else if(raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::mono] ) { + } else if(raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) ) { nodemosaic(true); } else { nodemosaic(false); @@ -2091,7 +2090,7 @@ //void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) -void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) +void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) { bool useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN"); conversionBuffer[0] (W - 2 * border, H - 2 * border); @@ -2119,8 +2118,8 @@ std::swap(pwr, gamm); } - int mode = 0, imax = 0; - Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope + int mode = 0; + Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4); double start; @@ -2360,7 +2359,7 @@ retinexParams.getCurves(retinextransmissionCurve, retinexgaintransmissionCurve); } -void RawImageSource::retinex(ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) +void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexParams &deh, const ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) { MyTime t4, t5; t4.set(); @@ -2386,13 +2385,13 @@ double gamm = deh.gam; double gamm2 = gamm; double ts = deh.slope; - int mode = 0, imax = 0; + int mode = 0; if(gamm2 < 1.) { std::swap(pwr, gamm); } - Color::calcGamma(pwr, ts, mode, imax, g_a); // call to calcGamma with selected gamma and slope + Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope double mul = 1. + g_a[4]; double add; @@ -2805,14 +2804,14 @@ BS += BS & 1; //function call to cfabloxblur - if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::v_ff]) { + if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::V)) { cfaboxblur(riFlatFile, cfablur, 2 * BS, 0); - } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::h_ff]) { + } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::H)) { cfaboxblur(riFlatFile, cfablur, 0, 2 * BS); - } else if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) { + } else if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { //slightly more complicated blur if trying to correct both vertical and horizontal anomalies cfaboxblur(riFlatFile, cfablur, BS, BS); //first do area blur to correct vignette - } else { //(raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::area_ff]) + } else { //(raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::area_ff)) cfaboxblur(riFlatFile, cfablur, BS, BS); } @@ -3010,7 +3009,7 @@ } } - if (raw.ff_BlurType == RAWParams::ff_BlurTypestring[RAWParams::vh_ff]) { + if (raw.ff_BlurType == RAWParams::getFlatFieldBlurTypeString(RAWParams::FlatFieldBlurType::VH)) { float *cfablur1 = (float (*)) malloc (H * W * sizeof * cfablur1); float *cfablur2 = (float (*)) malloc (H * W * sizeof * cfablur2); //slightly more complicated blur if trying to correct both vertical and horizontal anomalies @@ -3170,7 +3169,7 @@ } } -SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) +void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) { if(boxW == 0 && boxH == 0) { // nothing to blur @@ -3431,7 +3430,7 @@ black_lev[2] = raw.bayersensor.black2; //B black_lev[3] = raw.bayersensor.black3; //G2 - isMono = RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono] == raw.bayersensor.method; + isMono = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO) == raw.bayersensor.method; } else if (getSensorType() == ST_FUJI_XTRANS) { black_lev[0] = raw.xtranssensor.blackred; //R @@ -3439,7 +3438,7 @@ black_lev[2] = raw.xtranssensor.blackblue; //B black_lev[3] = raw.xtranssensor.blackgreen; //G2 (set, only used with a Bayer filter) - isMono = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::mono] == raw.xtranssensor.method; + isMono = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) == raw.xtranssensor.method; } for(int i = 0; i < 4 ; i++) { @@ -3884,7 +3883,7 @@ } // Converts raw image including ICC input profile to working space - floating point version -void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) +void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], const std::string &camName) { // MyTime t1, t2, t3; @@ -4737,21 +4736,22 @@ } // end of critical region } // end of parallel region + constexpr float gammaLimit = 32767.f * 65536.f; // Color::gamma overflows when the LUT is accessed with too large values for(int i = 0; i < 65536; i++) { int idx; - idx = CLIP((int)Color::gamma(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)), gammaLimit))); histRedRaw[idx >> 8] += hist[0][i]; if (ri->get_colors() > 1) { - idx = CLIP((int)Color::gamma(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)), gammaLimit))); histGreenRaw[idx >> 8] += hist[1][i]; if (fourColours) { - idx = CLIP((int)Color::gamma(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)), gammaLimit))); histGreenRaw[idx >> 8] += hist[3][i]; } - idx = CLIP((int)Color::gamma(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)))); + idx = CLIP((int)Color::gamma(std::min(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)), gammaLimit))); histBlueRaw[idx >> 8] += hist[2][i]; } } @@ -5349,6 +5349,10 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { + if(d1x) { // Nikon D1x has special sensor. We just skip it + R = G = B = 0; + return; + } int xnew = x + border; int ynew = y + border; rotate += ri->get_rotateDegree(); diff -Nru rawtherapee-5.3/rtengine/rawimagesource.h rawtherapee-5.4/rtengine/rawimagesource.h --- rawtherapee-5.3/rtengine/rawimagesource.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rawimagesource.h 2018-03-20 11:04:15.000000000 +0000 @@ -39,7 +39,7 @@ static DiagonalCurve *phaseOneIccCurveInv; static LUTf invGrad; // for fast_demosaic static LUTf initInvGrad (); - static void colorSpaceConversion_ (Imagefloat* im, ColorManagementParams &cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName); + static void colorSpaceConversion_ (Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName); int defTransform (int tran); protected: @@ -95,6 +95,8 @@ float psGreenBrightness[4]; float psBlueBrightness[4]; + std::vector histMatchingCache; + ColorManagementParams histMatchingParams; void hphd_vertical (float** hpmap, int col_from, int col_to); void hphd_horizontal (float** hpmap, int row_from, int row_to); @@ -116,19 +118,19 @@ RawImageSource (); ~RawImageSource (); - int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false); + int load (const Glib::ustring &fname); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true); void demosaic (const RAWParams &raw); - void retinex (ColorManagementParams cmp, const RetinexParams &deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI); + void retinex (const ColorManagementParams& cmp, const RetinexParams &deh, const ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI); void retinexPrepareCurves (const RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI); - void retinexPrepareBuffers (ColorManagementParams cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); + void retinexPrepareBuffers (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); void flushRawData (); void flushRGB (); void HLRecovery_Global (ToneCurveParams hrp); void refinement_lassus (int PassCount); void refinement(int PassCount); - bool IsrgbSourceModified() const + bool isRGBSourceModified() const { return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } @@ -138,7 +140,7 @@ void cfaboxblur (RawImage *riFlatFile, float* cfablur, int boxH, int boxW); void scaleColors (int winx, int winy, int winw, int winh, const RAWParams &raw, array2D &rawData); // raw for cblack - void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw); + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw); eSensorType getSensorType () const { return ri != nullptr ? ri->getSensorType() : ST_NONE; @@ -166,9 +168,9 @@ return ri->get_rotateDegree(); } - ImageData* getImageData () + FrameData* getImageData (unsigned int frameNum) { - return idata; + return idata->getFrameData (frameNum); } ImageMatrices* getImageMatrices () { @@ -185,11 +187,12 @@ } void getAutoExpHistogram (LUTu & histogram, int& histcompr); void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); - DCPProfile *getDCP(const ColorManagementParams &cmp, ColorTemp &wb, DCPProfile::ApplyState &as); + void getAutoMatchedToneCurve(const ColorManagementParams &cp, std::vector &outCurve); + DCPProfile *getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as); void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); - static void colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) + static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams& cmp, const ColorTemp &wb, double pre_mul[3], cmsHPROFILE embedded, cmsHPROFILE camprofile, double cam[3][3], const std::string &camName) { colorSpaceConversion_ (im, cmp, wb, pre_mul, embedded, camprofile, cam, camName); } @@ -245,9 +248,10 @@ void igv_interpolate(int winw, int winh); void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations); void amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue);//Emil's code for AMaZE - void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing + void fast_demosaic();//Emil's code for fast demosaicing void dcb_demosaic(int iterations, bool dcb_enhance); - void ahd_demosaic(int winx, int winy, int winw, int winh); + void ahd_demosaic(); + void rcd_demosaic(); void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0); void border_interpolate2(int winw, int winh, int lborders); void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border); @@ -268,7 +272,7 @@ void xtransborder_interpolate (int border); void xtrans_interpolate (const int passes, const bool useCieLab); void fast_xtrans_interpolate (); - void pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &model, float rawWpCorrection); + void pixelshift(int winx, int winy, int winw, int winh, const RAWParams::BayerSensor &bayerParams, unsigned int frame, const std::string &make, const std::string &model, float rawWpCorrection); void hflip (Imagefloat* im); void vflip (Imagefloat* im); void getRawValues(int x, int y, int rotate, int &R, int &G, int &B); diff -Nru rawtherapee-5.3/rtengine/rawmetadatalocation.h rawtherapee-5.4/rtengine/rawmetadatalocation.h --- rawtherapee-5.3/rtengine/rawmetadatalocation.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rawmetadatalocation.h 2018-03-20 11:04:15.000000000 +0000 @@ -22,11 +22,19 @@ namespace rtengine { -struct RawMetaDataLocation { +class RawMetaDataLocation { + +public: int exifBase; int ciffBase; int ciffLength; + + RawMetaDataLocation () : exifBase(-1), ciffBase(-1), ciffLength(-1) {} + RawMetaDataLocation (int exifBase) : exifBase(exifBase), ciffBase(-1), ciffLength(-1) {} + RawMetaDataLocation (int ciffBase, int ciffLength) : exifBase(-1), ciffBase(ciffBase), ciffLength(ciffLength) {} + RawMetaDataLocation (int exifBase, int ciffBase, int ciffLength) : exifBase(exifBase), ciffBase(ciffBase), ciffLength(ciffLength) {} }; + } #endif diff -Nru rawtherapee-5.3/rtengine/refreshmap.cc rawtherapee-5.4/rtengine/refreshmap.cc --- rawtherapee-5.3/rtengine/refreshmap.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/refreshmap.cc 2018-03-20 11:04:15.000000000 +0000 @@ -74,7 +74,7 @@ 0, // EvLDNEdgeTolerance: obsolete, 0, // EvCDNEnabled:obsolete, 0, // free entry - RGBCURVE, // EvDCPToneCurve, + RGBCURVE|M_AUTOEXP, // EvDCPToneCurve, ALLNORAW, // EvDCPIlluminant, RETINEX, // EvSHEnabled, RGBCURVE, // EvSHHighlights, @@ -419,8 +419,8 @@ DIRPYREQUALIZER, // EvWavgreenlow DIRPYREQUALIZER, // EvWavbluelow DIRPYREQUALIZER, // EvWavNeutral - RGBCURVE, // EvDCPApplyLookTable, - RGBCURVE, // EvDCPApplyBaselineExposureOffset, + RGBCURVE|M_AUTOEXP, // EvDCPApplyLookTable, + RGBCURVE|M_AUTOEXP, // EvDCPApplyBaselineExposureOffset, ALLNORAW, // EvDCPApplyHueSatMap DIRPYREQUALIZER, // EvWavenacont DIRPYREQUALIZER, // EvWavenachrom @@ -513,7 +513,55 @@ LUMINANCECURVE, // EvCATAutoyb DARKFRAME, // EvLensCorrMode DARKFRAME, // EvLensCorrLensfunCamera - DARKFRAME // EvLensCorrLensfunLens - + DARKFRAME, // EvLensCorrLensfunLens + ALLNORAW, // EvTMFattalEnabled + HDR, // EvTMFattalThreshold + HDR, // EvTMFattalAmount + ALLNORAW, // EvWBEnabled + RGBCURVE, // EvRGBEnabled + LUMINANCECURVE, // EvLEnabled + DEMOSAIC // EvPixelShiftOneGreen }; + +namespace rtengine { + +RefreshMapper::RefreshMapper(): + next_event_(rtengine::NUMOFEVENTS) +{ + for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) { + actions_[event] = refreshmap[event]; + } +} + + +ProcEvent RefreshMapper::newEvent() +{ + return ProcEvent(++next_event_); +} + + +void RefreshMapper::mapEvent(ProcEvent event, int action) +{ + actions_[event] = action; +} + + +int RefreshMapper::getAction(ProcEvent event) const +{ + auto it = actions_.find(event); + if (it == actions_.end()) { + return 0; + } else { + return it->second; + } +} + + +RefreshMapper *RefreshMapper::getInstance() +{ + static RefreshMapper instance; + return &instance; +} + +} // namespace rtengine diff -Nru rawtherapee-5.3/rtengine/refreshmap.h rawtherapee-5.4/rtengine/refreshmap.h --- rawtherapee-5.3/rtengine/refreshmap.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/refreshmap.h 2018-03-20 11:04:15.000000000 +0000 @@ -19,23 +19,27 @@ #ifndef __REFRESHMAP__ #define __REFRESHMAP__ +#include +#include "procevents.h" + // Use M_VOID if you wish to update the proc params without updating the preview at all ! -#define M_VOID (1<<16) +#define M_VOID (1<<17) // Use M_MINUPDATE if you wish to update the preview without modifying the image (think about it like a "refreshPreview") // Must NOT be used with other event (i.e. will be used for MINUPDATE only) -#define M_MINUPDATE (1<<15) +#define M_MINUPDATE (1<<16) // Force high quality -#define M_HIGHQUAL (1<<14) +#define M_HIGHQUAL (1<<15) // Elementary functions that can be done to // the preview image when an event occurs -#define M_MONITOR (1<<13) -#define M_RETINEX (1<<12) -#define M_CROP (1<<11) -#define M_PREPROC (1<<10) -#define M_RAW (1<<9) -#define M_INIT (1<<8) -#define M_LINDENOISE (1<<7) +#define M_MONITOR (1<<14) +#define M_RETINEX (1<<13) +#define M_CROP (1<<12) +#define M_PREPROC (1<<11) +#define M_RAW (1<<10) +#define M_INIT (1<<9) +#define M_LINDENOISE (1<<8) +#define M_HDR (1<<7) #define M_TRANSFORM (1<<6) #define M_BLURMAP (1<<5) #define M_AUTOEXP (1<<4) @@ -46,21 +50,22 @@ // Bitfield of functions to do to the preview image when an event occurs // Use those or create new ones for your new events -#define FIRST (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL -#define ALL (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL -#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define ALLNORAW (M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define AUTOEXP (M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define SHARPENING (M_LUMINANCE|M_COLOR) -#define IMPULSEDENOISE (M_LUMINANCE|M_COLOR) -#define DEFRINGE (M_LUMINANCE|M_COLOR) -#define DIRPYRDENOISE (M_LUMINANCE|M_COLOR) -#define DIRPYREQUALIZER (M_LUMINANCE|M_COLOR) +#define FIRST (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR|M_MONITOR) // without HIGHQUAL +#define ALL (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) // without HIGHQUAL +#define DARKFRAME (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define FLATFIELD (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define DEMOSAIC (M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define AUTOEXP (M_HDR|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define RGBCURVE (M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define LUMINANCECURVE (M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define SHARPENING (M_LUMINANCE|M_COLOR) +#define IMPULSEDENOISE (M_LUMINANCE|M_COLOR) +#define DEFRINGE (M_LUMINANCE|M_COLOR) +#define DIRPYRDENOISE (M_LUMINANCE|M_COLOR) +#define DIRPYREQUALIZER (M_LUMINANCE|M_COLOR) #define GAMMA M_MONITOR #define CROP M_CROP #define RESIZE M_VOID @@ -72,4 +77,23 @@ #define OUTPUTPROFILE M_MONITOR extern int refreshmap[]; + +namespace rtengine { + +class RefreshMapper { +public: + static RefreshMapper *getInstance(); + ProcEvent newEvent(); + void mapEvent(ProcEvent event, int action); + int getAction(ProcEvent event) const; + +private: + RefreshMapper(); + + int next_event_; + std::unordered_map actions_; +}; + +} // namespace rtengine + #endif diff -Nru rawtherapee-5.3/rtengine/rt_algo.cc rawtherapee-5.4/rtengine/rt_algo.cc --- rawtherapee-5.3/rtengine/rt_algo.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/rt_algo.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,167 @@ +/* + * This file is part of RawTherapee. + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + +#include "rt_algo.h" + +namespace rtengine +{ + +void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multithread) +{ + // Copyright (c) 2017 Ingo Weyrich + // We need to find the (minPrct*size) smallest value and the (maxPrct*size) smallest value in data. + // We use a histogram based search for speed and to reduce memory usage. + // Memory usage of this method is histoSize * sizeof(uint32_t) * (t + 1) byte, + // where t is the number of threads and histoSize is in [1;65536]. + // Processing time is O(n) where n is size of the input array. + // It scales well with multiple threads if the size of the input array is large. + // The current implementation is not guaranteed to work correctly if size > 2^32 (4294967296). + + assert(minPrct <= maxPrct); + + if (size == 0) { + return; + } + + size_t numThreads = 1; +#ifdef _OPENMP + // Because we have an overhead in the critical region of the main loop for each thread + // we make a rough calculation to reduce the number of threads for small data size. + // This also works fine for the minmax loop. + if (multithread) { + const size_t maxThreads = omp_get_max_threads(); + while (size > numThreads * numThreads * 16384 && numThreads < maxThreads) { + ++numThreads; + } + } +#endif + + // We need min and max value of data to calculate the scale factor for the histogram + float minVal = data[0]; + float maxVal = data[0]; +#ifdef _OPENMP + #pragma omp parallel for reduction(min:minVal) reduction(max:maxVal) num_threads(numThreads) +#endif + for (size_t i = 1; i < size; ++i) { + minVal = std::min(minVal, data[i]); + maxVal = std::max(maxVal, data[i]); + } + + if (std::fabs(maxVal - minVal) == 0.f) { // fast exit, also avoids division by zero in calculation of scale factor + minOut = maxOut = minVal; + return; + } + + // Caution: Currently this works correctly only for histoSize in range[1;65536]. + // For small data size (i.e. thumbnails) we reduce the size of the histogram to the size of data. + const unsigned int histoSize = std::min(65536, size); + + // calculate scale factor to use full range of histogram + const float scale = (histoSize - 1) / (maxVal - minVal); + + // We need one main histogram + std::vector histo(histoSize, 0); + + if (numThreads == 1) { + // just one thread => use main histogram + for (size_t i = 0; i < size; ++i) { + // we have to subtract minVal and multiply with scale to get the data in [0;histosize] range + histo[static_cast(scale * (data[i] - minVal))]++; + } + } else { +#ifdef _OPENMP + #pragma omp parallel num_threads(numThreads) +#endif + { + // We need one histogram per thread + std::vector histothr(histoSize, 0); + +#ifdef _OPENMP + #pragma omp for nowait +#endif + for (size_t i = 0; i < size; ++i) { + // we have to subtract minVal and multiply with scale to get the data in [0;histosize] range + histothr[static_cast(scale * (data[i] - minVal))]++; + } + +#ifdef _OPENMP + #pragma omp critical +#endif + { + // add per thread histogram to main histogram +#ifdef _OPENMP + #pragma omp simd +#endif + + for (size_t i = 0; i < histoSize; ++i) { + histo[i] += histothr[i]; + } + } + } + } + + size_t k = 0; + size_t count = 0; + + // find (minPrct*size) smallest value + const float threshmin = minPrct * size; + while (count < threshmin) { + count += histo[k++]; + } + + if (k > 0) { // interpolate + const size_t count_ = count - histo[k - 1]; + const float c0 = count - threshmin; + const float c1 = threshmin - count_; + minOut = (c1 * k + c0 * (k - 1)) / (c0 + c1); + } else { + minOut = k; + } + // go back to original range + minOut /= scale; + minOut += minVal; + + // find (maxPrct*size) smallest value + const float threshmax = maxPrct * size; + while (count < threshmax) { + count += histo[k++]; + } + + if (k > 0) { // interpolate + const size_t count_ = count - histo[k - 1]; + const float c0 = count - threshmax; + const float c1 = threshmax - count_; + maxOut = (c1 * k + c0 * (k - 1)) / (c0 + c1); + } else { + maxOut = k; + } + // go back to original range + maxOut /= scale; + maxOut += minVal; +} + +} diff -Nru rawtherapee-5.3/rtengine/rt_algo.h rawtherapee-5.4/rtengine/rt_algo.h --- rawtherapee-5.3/rtengine/rt_algo.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/rt_algo.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,29 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Ingo Weyrich + * + * 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 . + */ + +#pragma once + +#include + +namespace rtengine +{ + +void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); + +} diff -Nru rawtherapee-5.3/rtengine/rtengine.h rawtherapee-5.4/rtengine/rtengine.h --- rawtherapee-5.3/rtengine/rtengine.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rtengine.h 2018-03-20 11:04:15.000000000 +0000 @@ -19,6 +19,7 @@ #ifndef _RTENGINE_ #define _RTENGINE_ +#include "imageformat.h" #include "rt_math.h" #include "procparams.h" #include "procevents.h" @@ -47,60 +48,84 @@ class IImage8; class IImage16; class IImagefloat; - +class ImageSource; /** - * This class represents provides functions to obtain exif and IPTC metadata information - * from the image file + * This class provides functions to obtain exif and IPTC metadata information + * from any of the sub-frame of an image file */ -class ImageMetaData +class FramesMetaData { public: + /** @return Returns the number of root Metadata */ + virtual unsigned int getRootCount () const = 0; + /** @return Returns the number of frame contained in the file based on Metadata */ + virtual unsigned int getFrameCount () const = 0; + /** Checks the availability of exif metadata tags. * @return Returns true if image contains exif metadata tags */ - virtual bool hasExif () const = 0; + virtual bool hasExif (unsigned int frame = 0) const = 0; + /** Returns the directory of exif metadata tags. + * @param root root number in the metadata tree + * @return The directory of exif metadata tags */ + virtual rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const = 0; /** Returns the directory of exif metadata tags. + * @param frame frame number in the metadata tree * @return The directory of exif metadata tags */ - virtual const rtexif::TagDirectory* getExifData () const = 0; + virtual rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const = 0; + /** Returns the directory of exif metadata tags containing at least the 'Make' tag for the requested frame. + * If no usable metadata exist in the frame, send back the best TagDirectory describing the frame content. + * @param imgSource rawimage that we want the metadata from + * @param rawParams RawParams to select the frame number + * @return The directory of exif metadata tags containing at least the 'Make' tag */ + virtual rtexif::TagDirectory* getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const = 0; /** Checks the availability of IPTC tags. * @return Returns true if image contains IPTC tags */ - virtual bool hasIPTC () const = 0; + virtual bool hasIPTC (unsigned int frame = 0) const = 0; /** Returns the directory of IPTC tags. * @return The directory of IPTC tags */ - virtual const procparams::IPTCPairs getIPTCData () const = 0; + virtual procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const = 0; /** @return a struct containing the date and time of the image */ - virtual struct tm getDateTime () const = 0; + virtual tm getDateTime (unsigned int frame = 0) const = 0; /** @return a timestamp containing the date and time of the image */ - virtual time_t getDateTimeAsTS() const = 0; + virtual time_t getDateTimeAsTS(unsigned int frame = 0) const = 0; /** @return the ISO of the image */ - virtual int getISOSpeed () const = 0; + virtual int getISOSpeed (unsigned int frame = 0) const = 0; /** @return the F number of the image */ - virtual double getFNumber () const = 0; + virtual double getFNumber (unsigned int frame = 0) const = 0; /** @return the focal length used at the exposure */ - virtual double getFocalLen () const = 0; + virtual double getFocalLen (unsigned int frame = 0) const = 0; /** @return the focal length in 35mm used at the exposure */ - virtual double getFocalLen35mm () const = 0; + virtual double getFocalLen35mm (unsigned int frame = 0) const = 0; /** @return the focus distance in meters, 0=unknown, 10000=infinity */ - virtual float getFocusDist () const = 0; + virtual float getFocusDist (unsigned int frame = 0) const = 0; /** @return the shutter speed */ - virtual double getShutterSpeed () const = 0; + virtual double getShutterSpeed (unsigned int frame = 0) const = 0; /** @return the exposure compensation */ - virtual double getExpComp () const = 0; + virtual double getExpComp (unsigned int frame = 0) const = 0; /** @return the maker of the camera */ - virtual std::string getMake () const = 0; + virtual std::string getMake (unsigned int frame = 0) const = 0; /** @return the model of the camera */ - virtual std::string getModel () const = 0; + virtual std::string getModel (unsigned int frame = 0) const = 0; - std::string getCamera () const + std::string getCamera (unsigned int frame = 0) const { - return getMake() + " " + getModel(); + return getMake(frame) + " " + getModel(frame); } /** @return the lens on the camera */ - virtual std::string getLens () const = 0; + virtual std::string getLens (unsigned int frame = 0) const = 0; /** @return the orientation of the image */ - virtual std::string getOrientation () const = 0; + virtual std::string getOrientation (unsigned int frame = 0) const = 0; + + /** @return true if the file is a PixelShift shot (Pentax and Sony bodies) */ + virtual bool getPixelShift (unsigned int frame = 0) const = 0; + /** @return false: not an HDR file ; true: single or multi-frame HDR file (e.g. Pentax HDR raw file or 32 bit float DNG file or Log compressed) */ + virtual bool getHDR (unsigned int frame = 0) const = 0; + /** @return the sample format based on MetaData */ + virtual IIOSampleFormat getSampleFormat (unsigned int frame = 0) const = 0; + /** Functions to convert between floating point and string representation of shutter and aperture */ static std::string apertureToString (double aperture); /** Functions to convert between floating point and string representation of shutter and aperture */ @@ -112,14 +137,15 @@ /** Functions to convert between floating point and string representation of exposure compensation */ static std::string expcompToString (double expcomp, bool maskZeroexpcomp); - virtual ~ImageMetaData () {} + virtual ~FramesMetaData () = default; /** Reads metadata from file. * @param fname is the name of the file - * @param rml is a struct containing information about metadata location. Use it only for raw files. In case - * of jpgs and tiffs pass a NULL pointer. + * @param rml is a struct containing information about metadata location of the first frame. + * Use it only for raw files. In caseof jpgs and tiffs pass a NULL pointer. + * @param firstFrameOnly must be true to get the MetaData of the first frame only, e.g. for a PixelShift file. * @return The metadata */ - static ImageMetaData* fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml); + static FramesMetaData* fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly = false); }; /** This listener interface is used to indicate the progress of time consuming operations */ @@ -158,9 +184,9 @@ /** Returns the embedded icc profile of the image. * @return The handle of the embedded profile */ virtual cmsHPROFILE getEmbeddedProfile () = 0; - /** Returns a class providing access to the exif and iptc metadata tags of the image. - * @return An instance of the ImageMetaData class */ - virtual const ImageMetaData* getMetaData () = 0; + /** Returns a class providing access to the exif and iptc metadata tags of all frames of the image. + * @return An instance of the FramesMetaData class */ + virtual const FramesMetaData* getMetaData () = 0; /** This is a function used for internal purposes only. */ virtual ImageSource* getImageSource () = 0; /** This class has manual reference counting. You have to call this function each time to make a new reference to an instance. */ @@ -268,6 +294,8 @@ * @param hlcomprthresh is the new threshold for hlcompr * @param hlrecons set to true if HighLight Reconstruction is enabled */ virtual void autoExpChanged (double brightness, int bright, int contrast, int black, int hlcompr, int hlcomprthresh, bool hlrecons) {} + + virtual void autoMatchedToneCurveChanged(procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) {} }; class AutoCamListener @@ -371,8 +399,8 @@ { public: - /** Returns the inital image corresponding to the image processor. - * @return the inital image corresponding to the image processor */ + /** Returns the initial image corresponding to the image processor. + * @return the initial image corresponding to the image processor */ virtual InitialImage* getInitialImage () = 0; /** Returns the current processing parameters. * @param dst is the location where the image processing parameters are copied (it is assumed that the memory is allocated by the caller) */ @@ -387,6 +415,7 @@ * The image update starts immediately in the background. If it is ready, the result is passed to a PreviewImageListener * and to a DetailedCropListener (if enabled). */ virtual void endUpdateParams (ProcEvent change) = 0; + void endUpdateParams(ProcEventCode change) { endUpdateParams(ProcEvent(change)); } virtual void endUpdateParams (int changeFlags) = 0; // Starts a minimal update virtual void startProcessing (int changeCode) = 0; @@ -411,6 +440,9 @@ * @return the height of the preview image */ virtual int getPreviewHeight () = 0; + virtual bool getHighQualComputed() = 0; + virtual void setHighQualComputed() = 0; + virtual bool updateTryLock() = 0; virtual void updateUnLock() = 0; @@ -469,7 +501,7 @@ /** Cleanup the RT engine (static variables) */ void cleanup (); -/** This class holds all the necessary informations to accomplish the full processing of the image */ +/** This class holds all the necessary information to accomplish the full processing of the image */ class ProcessingJob { @@ -494,7 +526,7 @@ static ProcessingJob* create (InitialImage* initialImage, const procparams::ProcParams& pparams, bool fast = false); /** Cancels and destroys a processing job. The reference count of the corresponding initialImage (if any) is decreased. After the call of this function the ProcessingJob instance - * gets invalid, you must not use it any more. Dont call this function while the job is being processed. + * gets invalid, you must not use it any more. Don't call this function while the job is being processed. * @param job is the job to destroy */ static void destroy (ProcessingJob* job); @@ -504,11 +536,10 @@ /** This function performs all the image processinf steps corresponding to the given ProcessingJob. It returns when it is ready, so it can be slow. * The ProcessingJob passed becomes invalid, you can not use it any more. * @param job the ProcessingJob to cancel. - * @param errorCode is the error code if an error occured (e.g. the input image could not be loaded etc.) + * @param errorCode is the error code if an error occurred (e.g. the input image could not be loaded etc.) * @param pl is an optional ProgressListener if you want to keep track of the progress - * @param tunnelMetaData tunnels IPTC and XMP to output without change * @return the resulting image, with the output profile applied, exif and iptc data set. You have to save it or you can access the pixel data directly. */ -IImage16* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool tunnelMetaData = false, bool flush = false); +IImagefloat* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool flush = false); /** This class is used to control the batch processing. The class implementing this interface will be called when the full processing of an * image is ready and the next job to process is needed. */ @@ -519,7 +550,7 @@ * there is no jobs left. * @param img is the result of the last ProcessingJob * @return the next ProcessingJob to process */ - virtual ProcessingJob* imageReady (IImage16* img) = 0; + virtual ProcessingJob* imageReady (IImagefloat* img) = 0; virtual void error (Glib::ustring message) = 0; }; /** This function performs all the image processinf steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately, @@ -528,8 +559,8 @@ * The ProcessingJob passed becomes invalid, you can not use it any more. * @param job the ProcessingJob to cancel. * @param bpl is the BatchProcessingListener that is called when the image is ready or the next job is needed. It also acts as a ProgressListener. - * @param tunnelMetaData tunnels IPTC and XMP to output without change */ -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData); + **/ +void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl); extern MyMutex* lcmsMutex; diff -Nru rawtherapee-5.3/rtengine/rtlensfun.cc rawtherapee-5.4/rtengine/rtlensfun.cc --- rawtherapee-5.3/rtengine/rtlensfun.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rtlensfun.cc 2018-03-20 11:04:15.000000000 +0000 @@ -72,14 +72,43 @@ bool LFModifier::isCACorrectionAvailable() const { - return false; + return (flags_ & LF_MODIFY_TCA); } +#ifdef __GNUC__ // silence warning, can be removed when function is implemented +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif -void LFModifier::correctCA(double &x, double &y, int channel) const +void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) const { + assert(channel >= 0 && channel <= 2); + + // agriggio: RT currently applies the CA correction per channel, whereas + // lensfun applies it to all the three channels simultaneously. This means + // we do the work 3 times, because each time we discard 2 of the 3 + // channels. We could consider caching the info to speed this up + x += cx; + y += cy; + + float pos[6]; + if (swap_xy_) { + std::swap(x, y); + } + data_->ApplySubpixelDistortion(x, y, 1, 1, pos); + x = pos[2*channel]; + y = pos[2*channel+1]; + if (swap_xy_) { + std::swap(x, y); + } + x -= cx; + y -= cy; } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + void LFModifier::processVignetteLine(int width, int y, float *line) const { @@ -109,6 +138,11 @@ ret += "vignetting"; sep = ", "; } + if (flags_ & LF_MODIFY_TCA) { + ret += sep; + ret += "CA"; + sep = ", "; + } if (flags_ & LF_MODIFY_SCALE) { ret += sep; ret += "autoscaling"; @@ -172,6 +206,15 @@ } +bool LFCamera::isFixedLens() const +{ + // per lensfun's main developer Torsten Bronger: + // "Compact camera mounts can be identified by the fact that the mount + // starts with a lowercase letter" + return data_ && data_->Mount && std::islower(data_->Mount[0]); +} + + Glib::ustring LFCamera::getDisplayString() const { if (data_) { @@ -245,6 +288,15 @@ } } +bool LFLens::hasCACorrection() const +{ + if (data_) { + return data_->CalibTCA; + } else { + return false; + } +} + //----------------------------------------------------------------------------- // LFDatabase @@ -387,22 +439,28 @@ { LFLens ret; if (data_) { - Glib::ustring lname = name; - bool stdlens = camera && (name.empty() || name.find("Unknown") == 0); - if (stdlens) { - lname = camera.getModel(); // "Standard" - } - auto found = data_->FindLenses(camera.data_, nullptr, lname.c_str()); - if (!found) { - // try to split the maker from the model of the lens + auto found = data_->FindLenses(camera.data_, nullptr, name.c_str()); + for (size_t pos = 0; !found && pos < name.size(); ) { + // try to split the maker from the model of the lens -- we have to + // guess a bit here, since there are makers with a multi-word name + // (e.g. "Leica Camera AG") + if (name.find("f/", pos) == 0) { + break; // no need to search further + } Glib::ustring make, model; - auto i = name.find_first_of(' '); + auto i = name.find(' ', pos); if (i != Glib::ustring::npos) { make = name.substr(0, i); model = name.substr(i+1); found = data_->FindLenses(camera.data_, make.c_str(), model.c_str()); + pos = i+1; + } else { + break; } } + if (!found && camera && camera.isFixedLens()) { + found = data_->FindLenses(camera.data_, nullptr, ""); + } if (found) { ret.data_ = found[0]; lf_free(found); @@ -420,7 +478,7 @@ if (data_) { if (camera && lens) { lfModifier *mod = lfModifier::Create(lens.data_, camera.getCropFactor(), width, height); - int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE; + int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE | LF_MODIFY_TCA; if (aperture > 0) { flags |= LF_MODIFY_VIGNETTING; } @@ -432,7 +490,7 @@ } -std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) +std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg) { const LFDatabase *db = getInstance(); Glib::ustring make, model, lens; diff -Nru rawtherapee-5.3/rtengine/rtlensfun.h rawtherapee-5.4/rtengine/rtlensfun.h --- rawtherapee-5.3/rtengine/rtlensfun.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rtlensfun.h 2018-03-20 11:04:15.000000000 +0000 @@ -44,7 +44,7 @@ void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; bool isCACorrectionAvailable() const override; - void correctCA(double &x, double &y, int channel) const override; + void correctCA(double &x, double &y, int cx, int cy, int channel) const override; void processVignetteLine(int width, int y, float *line) const override; void processVignetteLine3Channels(int width, int y, float *line) const override; @@ -69,6 +69,7 @@ Glib::ustring getMake() const; Glib::ustring getModel() const; float getCropFactor() const; + bool isFixedLens() const; Glib::ustring getDisplayString() const; @@ -90,6 +91,7 @@ float getCropFactor() const; bool hasVignettingCorrection() const; bool hasDistortionCorrection() const; + bool hasCACorrection() const; private: friend class LFDatabase; @@ -110,7 +112,7 @@ LFCamera findCamera(const Glib::ustring &make, const Glib::ustring &model) const; LFLens findLens(const LFCamera &camera, const Glib::ustring &name) const; - static std::unique_ptr findModifier(const LensProfParams &lensProf, const ImageMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); + static std::unique_ptr findModifier(const LensProfParams &lensProf, const FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); private: std::unique_ptr getModifier(const LFCamera &camera, const LFLens &lens, diff -Nru rawtherapee-5.3/rtengine/rt_math.h rawtherapee-5.4/rtengine/rt_math.h --- rawtherapee-5.3/rtengine/rt_math.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rt_math.h 2018-03-20 11:04:15.000000000 +0000 @@ -14,6 +14,7 @@ constexpr double RT_PI = 3.14159265358979323846; // pi constexpr double RT_PI_2 = 1.57079632679489661923; // pi/2 +constexpr double RT_PI_180 = 0.017453292519943295769; // pi/180 constexpr double RT_1_PI = 0.31830988618379067154; // 1/pi constexpr double RT_2_PI = 0.63661977236758134308; // 2/pi constexpr double RT_SQRT1_2 = 0.70710678118654752440; // 1/sqrt(2) @@ -23,6 +24,9 @@ constexpr float RT_PI_F = RT_PI; constexpr float RT_PI_F_2 = RT_PI_2; +constexpr float RT_PI_F_180 = RT_PI_180; +constexpr float RT_1_PI_F = RT_1_PI; +constexpr float RT_2_PI_F = RT_2_PI; constexpr float RT_INFINITY_F = std::numeric_limits::infinity(); constexpr float RT_NAN_F = std::numeric_limits::quiet_NaN(); @@ -70,9 +74,9 @@ } template -constexpr const T& LIM(const T& a, const T& b, const T& c) +constexpr const T& LIM(const T& val, const T& low, const T& high) { - return max(b, min(a, c)); + return max(low, min(val, high)); } template diff -Nru rawtherapee-5.3/rtengine/rtthumbnail.cc rawtherapee-5.4/rtengine/rtthumbnail.cc --- rawtherapee-5.3/rtengine/rtthumbnail.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rtthumbnail.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,6 @@ #include "improccoordinator.h" #include - namespace { @@ -57,7 +56,7 @@ } -void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4]) +void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4], bool multiThread) { DCraw::dcrawImage_t image = ri->get_image(); @@ -65,6 +64,9 @@ const int height = ri->get_iheight(); const int width = ri->get_iwidth(); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int row = 0; row < height; ++row) { unsigned c0 = ri->FC (row, 0); unsigned c1 = ri->FC (row, 1); @@ -91,9 +93,12 @@ } else if (ri->isXtrans()) { const int height = ri->get_iheight(); const int width = ri->get_iwidth(); - unsigned c[6]; +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int row = 0; row < height; ++row) { + unsigned c[6]; for (int i = 0; i < 6; ++i) { c[i] = ri->XTRANSFC (row, i); } @@ -121,6 +126,9 @@ } else { const int size = ri->get_iheight() * ri->get_iwidth(); +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif for (int i = 0; i < size; ++i) { for (int j = 0; j < 4; ++j) { float val = image[i][j]; @@ -138,6 +146,7 @@ namespace rtengine { + using namespace procparams; Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode) @@ -151,6 +160,11 @@ ImageIO* img = imgSrc.getImageIO(); + // agriggio -- hotfix for #3794, to be revised once a proper solution is implemented + if (std::max(img->getWidth(), img->getHeight()) / std::min(img->getWidth(), img->getHeight()) >= 10) { + return nullptr; + } + Thumbnail* tpp = new Thumbnail (); unsigned char* data; @@ -247,7 +261,7 @@ return tpp; } -Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate, bool inspectorMode) +Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode) { RawImage *ri = new RawImage (fname); unsigned int imageNum = 0; @@ -255,9 +269,12 @@ if ( r ) { delete ri; + sensorType = ST_NONE; return nullptr; } + sensorType = ri->getSensorType(); + rml.exifBase = ri->get_exifBase(); rml.ciffBase = ri->get_ciffBase(); rml.ciffLength = ri->get_ciffLen(); @@ -378,7 +395,7 @@ return rml; } -Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum) +Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, bool forHistogramMatching) { RawImage *ri = new RawImage (fname); unsigned int tempImageNum = 0; @@ -387,9 +404,12 @@ if ( r ) { delete ri; + sensorType = ST_NONE; return nullptr; } + sensorType = ri->getSensorType(); + int width = ri->get_width(); int height = ri->get_height(); rtengine::Thumbnail* tpp = new rtengine::Thumbnail; @@ -407,10 +427,9 @@ tpp->greenMultiplier = ri->get_pre_mul (1); tpp->blueMultiplier = ri->get_pre_mul (2); - //ri->scale_colors(); float pre_mul[4], scale_mul[4], cblack[4]; ri->get_colorsCoeff (pre_mul, scale_mul, cblack, false); - scale_colors (ri, scale_mul, cblack); + scale_colors (ri, scale_mul, cblack, forHistogramMatching); // enable multithreading when forHistogramMatching is true ri->pre_interpolate(); @@ -455,8 +474,8 @@ skip--; } - if (skip < 1) { - skip = 1; + if (skip < 2) { + skip = 2; } int hskip = skip, vskip = skip; @@ -652,196 +671,154 @@ } else { tpp->scale = (double) height / (rotate_90 ? w : h); } + if(!forHistogramMatching) { // we don't need this for histogram matching - // generate histogram for auto exposure - tpp->aeHistCompression = 3; - tpp->aeHistogram (65536 >> tpp->aeHistCompression); - tpp->aeHistogram.clear(); - int radd = 4; - int gadd = 4; - int badd = 4; - - if (!filter) { - radd = gadd = badd = 1; - } - - for (int i = 8; i < height - 8; i++) { - int start, end; - - if (ri->get_FujiWidth() != 0) { - int fw = ri->get_FujiWidth(); - start = ABS (fw - i) + 8; - end = min (height + width - fw - i, fw + i) - 8; - } else { - start = 8; - end = width - 8; - } - - if (ri->get_colors() == 1) { - for (int j = start; j < end; j++) { - tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += radd; - tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += gadd; - tpp->aeHistogram[ ((int) (image[i * width + j][0])) >> tpp->aeHistCompression] += badd; - } - } else if (ri->getSensorType() == ST_BAYER) { - for (int j = start; j < end; j++) - if (FISGREEN (filter, i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbGreen * image[i * width + j][1])) >> tpp->aeHistCompression] += gadd; - } else if (FISRED (filter, i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbRed * image[i * width + j][0])) >> tpp->aeHistCompression] += radd; - } else if (FISBLUE (filter, i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbBlue * image[i * width + j][2])) >> tpp->aeHistCompression] += badd; - } - } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - for (int j = start; j < end; j++) - if (ri->ISXTRANSGREEN (i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbGreen * image[i * width + j][1])) >> tpp->aeHistCompression] += gadd; - } else if (ri->ISXTRANSRED (i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbRed * image[i * width + j][0])) >> tpp->aeHistCompression] += radd; - } else if (ri->ISXTRANSBLUE (i, j)) { - tpp->aeHistogram[ ((int) (tpp->camwbBlue * image[i * width + j][2])) >> tpp->aeHistCompression] += badd; - } - } else { /* if(ri->getSensorType()==ST_FOVEON) */ - for (int j = start; j < end; j++) { - tpp->aeHistogram[ ((int) (image[i * width + j][0] * 2.f)) >> tpp->aeHistCompression] += radd; - tpp->aeHistogram[ ((int) (image[i * width + j][1])) >> tpp->aeHistCompression] += gadd; - tpp->aeHistogram[ ((int) (image[i * width + j][2] * 0.5f)) >> tpp->aeHistCompression] += badd; - } - } - } - - // generate autoWB - double avg_r = 0; - double avg_g = 0; - double avg_b = 0; - - unsigned int rn = 0, gn = 0, bn = 0; - - for (int i = 32; i < height - 32; i++) { - int start, end; - - if (ri->get_FujiWidth() != 0) { - int fw = ri->get_FujiWidth(); - start = ABS (fw - i) + 32; - end = min (height + width - fw - i, fw + i) - 32; - } else { - start = 32; - end = width - 32; - } + // generate histogram for auto exposure, also calculate autoWB + tpp->aeHistCompression = 3; + tpp->aeHistogram(65536 >> tpp->aeHistCompression); + tpp->aeHistogram.clear(); - if (ri->getSensorType() == ST_BAYER) { - for (int j = start; j < end; j++) { - if (!filter) { - double d = tpp->defGain * image[i * width + j][0]; + const unsigned int add = filter ? 1 : 4 / ri->get_colors(); - if (d > 64000.) { - continue; + double pixSum[3] = {0.0}; + unsigned int n[3] = {0}; + const double compression = pow(2.0, tpp->aeHistCompression); + const double camWb[3] = {tpp->camwbRed / compression, tpp->camwbGreen / compression, tpp->camwbBlue / compression}; + const double clipval = 64000.0 / tpp->defGain; + + for (int i = 32; i < height - 32; i++) { + int start, end; + + if (ri->get_FujiWidth() != 0) { + int fw = ri->get_FujiWidth(); + start = ABS (fw - i) + 32; + end = min (height + width - fw - i, fw + i) - 32; + } else { + start = 32; + end = width - 32; + } + + if (ri->get_colors() == 1) { + for (int j = start; j < end; j++) { + tpp->aeHistogram[image[i * width + j][0] >> tpp->aeHistCompression]++; + } + } else if (ri->getSensorType() == ST_BAYER) { + int c0 = ri->FC(i, start); + int c1 = ri->FC(i, start + 1); + int j = start; + int n0 = 0; + int n1 = 0; + double pixSum0 = 0.0; + double pixSum1 = 0.0; + for (; j < end - 1; j+=2) { + double v0 = image[i * width + j][c0]; + tpp->aeHistogram[(int)(camWb[c0] * v0)]++; + if (v0 <= clipval) { + pixSum0 += v0; + n0++; } - - avg_g += d; - avg_r += d; - avg_b += d; - rn++; - gn++; - bn++; - } else if (FISGREEN (filter, i, j)) { - double d = tpp->defGain * image[i * width + j][1]; - - if (d > 64000.) { - continue; + double v1 = image[i * width + j + 1][c1]; + tpp->aeHistogram[(int)(camWb[c1] * v1)]++; + if (v1 <= clipval) { + pixSum1 += v1; + n1++; } - - avg_g += d; - gn++; - } else if (FISRED (filter, i, j)) { - double d = tpp->defGain * image[i * width + j][0]; - - if (d > 64000.) { - continue; + } + if (j < end) { + double v0 = image[i * width + j][c0]; + tpp->aeHistogram[(int)(camWb[c0] * v0)]++; + if (v0 <= clipval) { + pixSum0 += v0; + n0++; } - - avg_r += d; - rn++; - } else if (FISBLUE (filter, i, j)) { - double d = tpp->defGain * image[i * width + j][2]; - - if (d > 64000.) { - continue; + } + n[c0] += n0; + n[c1] += n1; + pixSum[c0] += pixSum0; + pixSum[c1] += pixSum1; + } else if (ri->getSensorType() == ST_FUJI_XTRANS) { + int c[6]; + for(int cc = 0; cc < 6; ++cc) { + c[cc] = ri->XTRANSFC(i, start + cc); + } + int j = start; + for (; j < end - 5; j += 6) { + for(int cc = 0; cc < 6; ++cc) { + double d = image[i * width + j + cc][c[cc]]; + tpp->aeHistogram[(int)(camWb[c[cc]] * d)]++; + if (d <= clipval) { + pixSum[c[cc]] += d; + n[c[cc]]++; + } } - - avg_b += d; - bn++; } - } - } else if (ri->getSensorType() == ST_FUJI_XTRANS) { - for (int j = start; j < end; j++) { - if (ri->ISXTRANSGREEN (i, j)) { - double d = tpp->defGain * image[i * width + j][1]; - - if (d > 64000.) { - continue; + for (; j < end; j++) { + if (ri->ISXTRANSGREEN (i, j)) { + double d = image[i * width + j][1]; + tpp->aeHistogram[(int)(camWb[1] * d)]++; + if (d <= clipval) { + pixSum[1] += d; + n[1]++; + } + } else if (ri->ISXTRANSRED (i, j)) { + double d = image[i * width + j][0]; + tpp->aeHistogram[(int)(camWb[0] * d)]++; + if (d <= clipval) { + pixSum[0] += d; + n[0]++; + } + } else if (ri->ISXTRANSBLUE (i, j)) { + double d = image[i * width + j][2]; + tpp->aeHistogram[(int)(camWb[2] * d)]++; + if (d <= clipval) { + pixSum[2] += d; + n[2]++; + } } - - avg_g += d; - gn++; - } else if (ri->ISXTRANSRED (i, j)) { - double d = tpp->defGain * image[i * width + j][0]; - - if (d > 64000.) { - continue; + } + } else { /* if(ri->getSensorType()==ST_FOVEON) */ + for (int j = start; j < end; j++) { + double r = image[i * width + j][0]; + if (r <= clipval) { + pixSum[0] += r; + n[0]++; } - - avg_r += d; - rn++; - } else if (ri->ISXTRANSBLUE (i, j)) { - double d = tpp->defGain * image[i * width + j][2]; - - if (d > 64000.) { - continue; + double g = image[i * width + j][1]; + if (g <= clipval) { + pixSum[1] += g; + n[1]++; } - - avg_b += d; - bn++; - } - } - } else { /* if(ri->getSensorType()==ST_FOVEON) */ - for (int j = start; j < end; j++) { - double d = tpp->defGain * image[i * width + j][0]; - - if (d <= 64000.) { - avg_r += d; - rn++; - } - - d = tpp->defGain * image[i * width + j][1]; - - if (d <= 64000.) { - avg_g += d; - gn++; - } - - d = tpp->defGain * image[i * width + j][2]; - - if (d <= 64000.) { - avg_b += d; - bn++; + tpp->aeHistogram[((int)g) >> tpp->aeHistCompression] += add; + double b = image[i * width + j][2]; + if (b <= clipval) { + pixSum[2] += b; + n[2]++; + } + tpp->aeHistogram[((int) (b * 0.5f)) >> tpp->aeHistCompression] += add; } } } - } - - double reds = avg_r / std::max(rn, 1u) * tpp->camwbRed; - double greens = avg_g / std::max(gn, 1u) * tpp->camwbGreen; - double blues = avg_b / std::max(bn, 1u) * tpp->camwbBlue; - - tpp->redAWBMul = ri->get_rgb_cam (0, 0) * reds + ri->get_rgb_cam (0, 1) * greens + ri->get_rgb_cam (0, 2) * blues; - tpp->greenAWBMul = ri->get_rgb_cam (1, 0) * reds + ri->get_rgb_cam (1, 1) * greens + ri->get_rgb_cam (1, 2) * blues; - tpp->blueAWBMul = ri->get_rgb_cam (2, 0) * reds + ri->get_rgb_cam (2, 1) * greens + ri->get_rgb_cam (2, 2) * blues; - tpp->wbEqual = wbEq; - tpp->wbTempBias = 0.0; + if (ri->get_colors() == 1) { + pixSum[0] = pixSum[1] = pixSum[2] = 1.; + n[0] = n[1] = n[2] = 1; + } + pixSum[0] *= tpp->defGain; + pixSum[1] *= tpp->defGain; + pixSum[2] *= tpp->defGain; + + double reds = pixSum[0] / std::max(n[0], 1u) * tpp->camwbRed; + double greens = pixSum[1] / std::max(n[1], 1u) * tpp->camwbGreen; + double blues = pixSum[2] / std::max(n[2], 1u) * tpp->camwbBlue; + + tpp->redAWBMul = ri->get_rgb_cam (0, 0) * reds + ri->get_rgb_cam (0, 1) * greens + ri->get_rgb_cam (0, 2) * blues; + tpp->greenAWBMul = ri->get_rgb_cam (1, 0) * reds + ri->get_rgb_cam (1, 1) * greens + ri->get_rgb_cam (1, 2) * blues; + tpp->blueAWBMul = ri->get_rgb_cam (2, 0) * reds + ri->get_rgb_cam (2, 1) * greens + ri->get_rgb_cam (2, 2) * blues; + tpp->wbEqual = wbEq; + tpp->wbTempBias = 0.0; - ColorTemp cTemp; - cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen); + ColorTemp cTemp; + cTemp.mul2temp (tpp->redAWBMul, tpp->greenAWBMul, tpp->blueAWBMul, tpp->wbEqual, tpp->autoWBTemp, tpp->autoWBGreen); + } if (rotate && ri->get_rotateDegree() > 0) { tpp->thumbImg->rotate (ri->get_rotateDegree()); @@ -923,7 +900,7 @@ } // Simple processing of RAW internal JPGs -IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int rheight, rtengine::TypeInterpolation interp, double& myscale) +IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int rheight, rtengine::TypeInterpolation interp) { int rwidth; @@ -953,13 +930,21 @@ } // Full thumbnail processing, second stage if complete profile exists -IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rheight, TypeInterpolation interp, const ImageMetaData *metadata, double& myscale) +IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale, bool forMonitor, bool forHistogramMatching) { - std::string camName = metadata->getCamera(); - float shutter = metadata->getShutterSpeed(); - float fnumber = metadata->getFNumber(); - float iso = metadata->getISOSpeed(); - float fcomp = metadata->getExpComp(); + unsigned int imgNum = 0; + if (isRaw) { + if (sensorType == ST_BAYER) { + imgNum = rtengine::LIM(params.raw.bayersensor.imageNum, 0, metadata->getFrameCount() - 1); + } else if (sensorType == ST_FUJI_XTRANS) { + //imgNum = rtengine::LIM(params.raw.xtranssensor.imageNum, 0, metadata->getFrameCount() - 1) + } + } + std::string camName = metadata->getCamera(imgNum); + float shutter = metadata->getShutterSpeed(imgNum); + float fnumber = metadata->getFNumber(imgNum); + float iso = metadata->getISOSpeed(imgNum); + float fcomp = metadata->getExpComp(imgNum); // check if the WB's equalizer value has changed if (wbEqual < (params.wb.equal - 5e-4) || wbEqual > (params.wb.equal + 5e-4) || wbTempBias < (params.wb.tempBias - 5e-4) || wbTempBias > (params.wb.tempBias + 5e-4)) { @@ -974,7 +959,9 @@ // compute WB multipliers ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { //recall colorMatrix is rgb_cam double cam_r = colorMatrix[0][0] * camwbRed + colorMatrix[0][1] * camwbGreen + colorMatrix[0][2] * camwbBlue; double cam_g = colorMatrix[1][0] * camwbRed + colorMatrix[1][1] * camwbGreen + colorMatrix[1][2] * camwbBlue; @@ -984,12 +971,19 @@ currWB = ColorTemp (autoWBTemp, autoWBGreen, wbEqual, "Custom"); } - double r, g, b; - currWB.getMultipliers (r, g, b); - //iColorMatrix is cam_rgb - double rm = iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b; - double gm = iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b; - double bm = iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b; + double rm, gm, bm; + if (currWB.getTemp() < 0) { + rm = redMultiplier; + gm = greenMultiplier; + bm = blueMultiplier; + } else { + double r, g, b; + currWB.getMultipliers (r, g, b); + //iColorMatrix is cam_rgb + rm = iColorMatrix[0][0] * r + iColorMatrix[0][1] * g + iColorMatrix[0][2] * b; + gm = iColorMatrix[1][0] * r + iColorMatrix[1][1] * g + iColorMatrix[1][2] * b; + bm = iColorMatrix[2][0] * r + iColorMatrix[2][1] * g + iColorMatrix[2][2] * b; + } rm = camwbRed / rm; gm = camwbGreen / gm; bm = camwbBlue / bm; @@ -1068,7 +1062,7 @@ int fh = baseImg->getHeight(); //ColorTemp::CAT02 (baseImg, ¶ms) ;//perhaps not good! - ImProcFunctions ipf (¶ms, false); + ImProcFunctions ipf (¶ms, forHistogramMatching); // enable multithreading when forHistogramMatching is true ipf.setScale (sqrt (double (fw * fw + fh * fh)) / sqrt (double (thumbImg->getWidth() * thumbImg->getWidth() + thumbImg->getHeight() * thumbImg->getHeight()))*scale); ipf.updateColorProfiles (ICCStore::getInstance()->getDefaultMonitorProfileName(), options.rtSettings.monitorIntent, false, false); @@ -1076,6 +1070,10 @@ ipf.firstAnalysis (baseImg, params, hist16); + if (params.fattal.enabled) { + ipf.ToneMapFattal02(baseImg); + } + // perform transform if (ipf.needsTransform()) { Imagefloat* trImg = new Imagefloat (fw, fh); @@ -1112,8 +1110,7 @@ int hlcomprthresh = params.toneCurve.hlcomprthresh; if (params.toneCurve.autoexp && aeHistogram) { - double logDefGain = 0.0; - ipf.getAutoExp (aeHistogram, aeHistCompression, logDefGain, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } LUTf curve1 (65536); @@ -1139,8 +1136,8 @@ ToneCurve customToneCurvebw2; CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, - params.toneCurve.curveMode, params.toneCurve.curve, - params.toneCurve.curveMode2, params.toneCurve.curve2, + params.toneCurve.curve, + params.toneCurve.curve2, hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2, 16); LUTf rCurve; @@ -1159,13 +1156,7 @@ {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; - params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili); + params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); clToningcurve (65536); CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, scale == 1 ? 1 : 16); @@ -1183,7 +1174,7 @@ float satLimit = float (params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; float satLimitOpacity = 1.f - (float (params.colorToning.saturatedOpacity) / 100.f); - if (params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation @@ -1276,7 +1267,7 @@ customColCurve2, customColCurve3, 16); - int begh = 0, endh = labView->H; + bool execsharp = false; float d, dj, yb; float fnum = fnumber;// F number @@ -1309,7 +1300,7 @@ CAMMean = NAN; CAMBrightCurveJ.dirty = true; CAMBrightCurveQ.dirty = true; - ipf.ciecam_02float (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, dj, yb, rtt); + ipf.ciecam_02float (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, sk, execsharp, d, dj, yb, rtt); delete cieView; } @@ -1317,8 +1308,13 @@ //ipf.colorCurve (labView, labView); // obtain final image - Image8* readyImg = new Image8 (fw, fh); - ipf.lab2monitorRgb (labView, readyImg); + Image8* readyImg = nullptr; + if (forMonitor) { + readyImg = new Image8 (fw, fh); + ipf.lab2monitorRgb (labView, readyImg); + } else { + readyImg = ipf.lab2rgb(labView, 0, 0, fw, fh, params.icm, false); + } delete labView; delete baseImg; @@ -1419,7 +1415,7 @@ if (params.toneCurve.autoexp && aeHistogram) { ImProcFunctions ipf (¶ms, false); - ipf.getAutoExp (aeHistogram, aeHistCompression, log (defGain) / log (2.0), params.toneCurve.clip, params.toneCurve.expcomp, + ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, params.toneCurve.expcomp, params.toneCurve.brightness, params.toneCurve.contrast, params.toneCurve.black, params.toneCurve.hlcompr, params.toneCurve.hlcomprthresh); } } @@ -1748,7 +1744,7 @@ return tmpdata; } -bool Thumbnail::writeImage (const Glib::ustring& fname, int format) +bool Thumbnail::writeImage (const Glib::ustring& fname) { if (!thumbImg) { diff -Nru rawtherapee-5.3/rtengine/rtthumbnail.h rawtherapee-5.4/rtengine/rtthumbnail.h --- rawtherapee-5.3/rtengine/rtthumbnail.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/rtthumbnail.h 2018-03-20 11:04:15.000000000 +0000 @@ -71,13 +71,13 @@ void init (); - IImage8* processImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, const ImageMetaData *metadata, double& scale); - IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale); + IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale, bool forMonitor=true, bool forHistogramMatching = false); + IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp); int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio); void getDimensions (int& w, int& h, double& scaleFac); - static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false); - static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum); + static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false); + static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate, bool forHistogramMatching = false); static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false); static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname); @@ -88,7 +88,7 @@ void applyAutoExp (procparams::ProcParams& pparams); unsigned char* getGrayscaleHistEQ (int trim_width); - bool writeImage (const Glib::ustring& fname, int format); + bool writeImage (const Glib::ustring& fname); bool readImage (const Glib::ustring& fname); bool readData (const Glib::ustring& fname); diff -Nru rawtherapee-5.3/rtengine/settings.h rawtherapee-5.4/rtengine/settings.h --- rawtherapee-5.3/rtengine/settings.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/settings.h 2018-03-20 11:04:15.000000000 +0000 @@ -83,16 +83,6 @@ double artifact_cbdl; double level0_cbdl; double level123_cbdl; - double bot_left; - double top_left; - double top_right; - double bot_right; - double ed_detec; - double ed_detecStr; - double ed_low; - double ed_lipinfl; - double ed_lipampl; - Glib::ustring lensfunDbDirectory; ///< The directory containing the lensfun database. If empty, the system defaults will be used (as described in http://lensfun.sourceforge.net/manual/dbsearch.html) /** Creates a new instance of Settings. diff -Nru rawtherapee-5.3/rtengine/shmap.cc rawtherapee-5.4/rtengine/shmap.cc --- rawtherapee-5.3/rtengine/shmap.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/shmap.cc 2018-03-20 11:04:15.000000000 +0000 @@ -358,7 +358,7 @@ avg = avg_; } -SSEFUNCTION void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale) +void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, int height, LUTf & rangefn, int level, int scale) { //scale is spacing of directional averaging weights @@ -375,7 +375,7 @@ #pragma omp parallel #endif { -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ vfloat dirwtv, valv, normv, dftemp1v, dftemp2v; #endif // __SSE2__ int j; @@ -402,7 +402,7 @@ data_coarse[i][j] = val / norm; // low pass filter } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ int inbrMin = max(i - scalewin, i % scale); for(; j < (width - scalewin) - 3; j += 4) { @@ -482,7 +482,7 @@ #pragma omp parallel #endif { -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ vfloat dirwtv, valv, normv, dftemp1v, dftemp2v; float domkerv[5][5][4] ALIGNED16 = {{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}, {{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 2, 2, 2}, {2, 2, 2, 2}, {1, 1, 1, 1}}, {{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 2, 2, 2}, {2, 2, 2, 2}, {1, 1, 1, 1}}, {{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 2, 2, 2}, {2, 2, 2, 2}, {1, 1, 1, 1}}, {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}}; @@ -510,7 +510,7 @@ data_coarse[i][j] = val / norm; // low pass filter } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ for(; j < width - scalewin - 3; j += 4) { valv = _mm_setzero_ps(); diff -Nru rawtherapee-5.3/rtengine/simpleprocess.cc rawtherapee-5.4/rtengine/simpleprocess.cc --- rawtherapee-5.3/rtengine/simpleprocess.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/simpleprocess.cc 2018-03-20 11:04:15.000000000 +0000 @@ -49,24 +49,52 @@ class ImageProcessor { public: - ImageProcessor (ProcessingJob* pjob, int& errorCode, - ProgressListener* pl, bool tunnelMetaData, bool flush): + ImageProcessor( + ProcessingJob* pjob, + int& errorCode, + ProgressListener* pl, + bool flush + ) : job (static_cast (pjob)), errorCode (errorCode), pl (pl), - tunnelMetaData (tunnelMetaData), flush (flush), // internal state - ipf_p (nullptr), - ii (nullptr), - imgsrc (nullptr), - fw (-1), - fh (-1), - pp (0, 0, 0, 0, 0) + ii(nullptr), + imgsrc(nullptr), + fw(0), + fh(0), + tr(0), + pp(0, 0, 0, 0, 0), + calclum(nullptr), + autoNR(0.f), + autoNRmax(0.f), + tilesize(0), + overlap(0), + ch_M(nullptr), + max_r(nullptr), + max_b(nullptr), + min_b(nullptr), + min_r(nullptr), + lumL(nullptr), + chromC(nullptr), + ry(nullptr), + sk(nullptr), + pcsk(nullptr), + expcomp(0.0), + bright(0), + contr(0), + black(0), + hlcompr(0), + hlcomprthresh(0), + baseImg(nullptr), + labView(nullptr), + autili(false), + butili(false) { } - Image16 *operator()() + Imagefloat *operator()() { if (!job->fast) { return normal_pipeline(); @@ -76,7 +104,7 @@ } private: - Image16 *normal_pipeline() + Imagefloat *normal_pipeline() { if (!stage_init()) { return nullptr; @@ -87,7 +115,7 @@ return stage_finish(); } - Image16 *fast_pipeline() + Imagefloat *fast_pipeline() { if (!job->pparams.resize.enabled) { return normal_pipeline(); @@ -172,16 +200,6 @@ imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); - if (params.toneCurve.autoexp) {// this enabled HLRecovery - LUTu histRedRaw (256), histGreenRaw (256), histBlueRaw (256); - imgsrc->getRAWHistogram (histRedRaw, histGreenRaw, histBlueRaw); - - if (ToneCurveParams::HLReconstructionNecessary (histRedRaw, histGreenRaw, histBlueRaw) && !params.toneCurve.hrenabled) { - params.toneCurve.hrenabled = true; - // WARNING: Highlight Reconstruction is being forced 'on', should we force a method here too? - } - } - if (pl) { pl->setProgress (0.20); } @@ -223,7 +241,9 @@ // set the color temperature currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); - if (params.wb.method == "Camera") { + if (!params.wb.enabled) { + currWB = ColorTemp(); + } else if (params.wb.method == "Camera") { currWB = imgsrc->getWB (); } else if (params.wb.method == "Auto") { double rm, gm, bm; @@ -318,7 +338,7 @@ int beg_tileW = wcr * tileWskip + tileWskip / 2.f - crW / 2.f; int beg_tileH = hcr * tileHskip + tileHskip / 2.f - crH / 2.f; PreviewProps ppP (beg_tileW, beg_tileH, crW, crH, skipP); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw ); + imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw ); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); // we only need image reduced to 1/4 here @@ -366,7 +386,7 @@ } if (!imgsrc->isRAW()) { - multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good fot gamma=1 + multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good for gamma=1 } float maxmax = max (maxredaut, maxblueaut); @@ -517,7 +537,7 @@ float gam, gamthresh, gamslope; ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); int Nb[9]; - int coordW[3];//coordonate of part of image to mesure noise + int coordW[3];//coordinate of part of image to measure noise int coordH[3]; int begW = 50; int begH = 50; @@ -538,7 +558,7 @@ for (int wcr = 0; wcr <= 2; wcr++) { for (int hcr = 0; hcr <= 2; hcr++) { PreviewProps ppP (coordW[wcr], coordH[hcr], crW, crH, 1); - imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.icm, params.raw); + imgsrc->getImage (currWB, tr, origCropPart, ppP, params.toneCurve, params.raw); //baseImg->getStdImage(currWB, tr, origCropPart, ppP, true, params.toneCurve); @@ -609,7 +629,7 @@ } if (!imgsrc->isRAW()) { - multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good fot gamma=1 + multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good for gamma=1 } float delta[9]; @@ -698,7 +718,7 @@ } baseImg = new Imagefloat (fw, fh); - imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.icm, params.raw); + imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.raw); if (pl) { pl->setProgress (0.50); @@ -718,8 +738,23 @@ LUTu aehist; int aehistcompr; imgsrc->getAutoExpHistogram (aehist, aehistcompr); - ipf.getAutoExp (aehist, aehistcompr, imgsrc->getDefGain(), params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } + if (params.toneCurve.histmatching) { + imgsrc->getAutoMatchedToneCurve(params.icm, params.toneCurve.curve); + + if (params.toneCurve.autoexp) { + params.toneCurve.expcomp = 0.0; + } + + params.toneCurve.autoexp = false; + params.toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; + params.toneCurve.curve2 = { 0 }; + params.toneCurve.brightness = 0; + params.toneCurve.contrast = 0; + params.toneCurve.black = 0; + + } // at this stage, we can flush the raw data to free up quite an important amount of memory // commented out because it makes the application crash when batch processing... @@ -778,9 +813,9 @@ // CurveFactory::denoiseLL(lldenoiseutili, denoiseParams.lcurve, Noisecurve,1); //denoiseParams.getCurves(noiseLCurve); // ipf.RGB_denoise(baseImg, baseImg, calclum, imgsrc->isRAW(), denoiseParams, params.defringe, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, lldenoiseutili); - float chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi; + float nresi, highresi; int kall = 2; - ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); + ipf.RGB_denoise (kall, baseImg, baseImg, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); } @@ -810,6 +845,10 @@ ipf.firstAnalysis (baseImg, params, hist16); + if (params.fattal.enabled) { + ipf.ToneMapFattal02(baseImg); + } + // perform transform (excepted resizing) if (ipf.needsTransform()) { Imagefloat* trImg = nullptr; @@ -817,7 +856,8 @@ trImg = baseImg; } else { trImg = new Imagefloat (fw, fh); - } ipf.transform (baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, + } + ipf.transform (baseImg, trImg, 0, 0, 0, 0, fw, fh, fw, fh, imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); if(trImg != baseImg) { delete baseImg; @@ -826,7 +866,7 @@ } } - Image16 *stage_finish() + Imagefloat *stage_finish() { procparams::ProcParams& params = job->pparams; //ImProcFunctions ipf (¶ms, true); @@ -870,7 +910,7 @@ //if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; CurveFactory::complexCurve (expcomp, black / 65535.0, hlcompr, hlcomprthresh, params.toneCurve.shcompr, bright, contr, - params.toneCurve.curveMode, params.toneCurve.curve, params.toneCurve.curveMode2, params.toneCurve.curve2, + params.toneCurve.curve, params.toneCurve.curve2, hist16, curve1, curve2, curve, dummy, customToneCurve1, customToneCurve2 ); CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); @@ -886,13 +926,7 @@ {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params.icm.working); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; - params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, wip, opautili); + params.colorToning.getCurves (ctColorCurve, ctOpacityCurve, wp, opautili); clToningcurve (65536, 0); CurveFactory::curveToning (params.colorToning.clcurve, clToningcurve, 1); cl2Toningcurve (65536, 0); @@ -910,7 +944,7 @@ float satLimit = float (params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; float satLimitOpacity = 1.f - (float (params.colorToning.saturatedOpacity) / 100.f); - if (params.colorToning.enabled && params.colorToning.autosat) { //for colortoning evaluation of saturation settings + if (params.colorToning.enabled && params.colorToning.autosat && params.colorToning.method != "LabGrid") { //for colortoning evaluation of saturation settings float moyS = 0.f; float eqty = 0.f; ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation @@ -931,7 +965,7 @@ autor = -9000.f; // This will ask to compute the "auto" values for the B&W tool (have to be inferior to -5000) DCPProfile::ApplyState as; - DCPProfile *dcpProf = imgsrc->getDCP (params.icm, currWB, as); + DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); LUTu histToneCurve; @@ -1078,7 +1112,7 @@ CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve,/* hist16C, dummy,*/ 1); if (params.wavelet.enabled) { - ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, wavcontlutili, 1); + ipf.ip_wavelet (labView, labView, 2, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, wavclCurve, 1); } wavCLVCurve.Reset(); @@ -1086,7 +1120,6 @@ //Colorappearance and tone-mapping associated int f_w = 1, f_h = 1; - int begh = 0, endh = fh; if (params.colorappearance.tonecie || params.colorappearance.enabled) { f_w = fw; @@ -1094,8 +1127,7 @@ } CieImage *cieView = new CieImage (f_w, (f_h)); - begh = 0; - endh = fh; + CurveFactory::curveLightBrightColor ( params.colorappearance.curve, params.colorappearance.curve2, @@ -1109,10 +1141,16 @@ if (params.colorappearance.enabled) { double adap; - float fnum = imgsrc->getMetaData()->getFNumber ();// F number - float fiso = imgsrc->getMetaData()->getISOSpeed () ;// ISO - float fspeed = imgsrc->getMetaData()->getShutterSpeed () ;//speed - float fcomp = imgsrc->getMetaData()->getExpComp ();//compensation + - + int imgNum = 0; + if (imgsrc->getSensorType() == ST_BAYER) { + imgNum = params.raw.bayersensor.imageNum; + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + //imgNum = params.raw.xtranssensor.imageNum; + } + float fnum = imgsrc->getMetaData()->getFNumber (imgNum); // F number + float fiso = imgsrc->getMetaData()->getISOSpeed (imgNum) ; // ISO + float fspeed = imgsrc->getMetaData()->getShutterSpeed (imgNum) ; //speed + float fcomp = imgsrc->getMetaData()->getExpComp (imgNum); //compensation + - if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { adap = 2000.; @@ -1131,18 +1169,18 @@ if (params.sharpening.enabled) { if (settings->ciecamfloat) { float d, dj, yb; - ipf.ciecam_02float (cieView, float (adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); + ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); } else { - double dd, dj, yb; - ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, yb, 1); + double dd, dj; + ipf.ciecam_02 (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, 1); } } else { if (settings->ciecamfloat) { float d, dj, yb; - ipf.ciecam_02float (cieView, float (adap), begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); + ipf.ciecam_02float (cieView, float (adap), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); } else { - double dd, dj, yb; - ipf.ciecam_02 (cieView, adap, begh, endh, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, yb, 1); + double dd, dj; + ipf.ciecam_02 (cieView, adap, 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, dd, dj, 1); } } } @@ -1224,7 +1262,7 @@ } } - Image16* readyImg = nullptr; + Imagefloat* readyImg = nullptr; cmsHPROFILE jprof = nullptr; bool customGamma = false; bool useLCMS = false; @@ -1234,7 +1272,7 @@ GammaValues ga; // if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; - readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, bwonly, &ga); + readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm, &ga); customGamma = true; //or selected Free gamma @@ -1248,7 +1286,7 @@ // if Default gamma mode: we use the profile selected in the "Output profile" combobox; // gamma come from the selected profile, otherwise it comes from "Free gamma" tool - readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm, bwonly); + readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); if (settings->verbose) { printf ("Output profile_: \"%s\"\n", params.icm.output.c_str()); @@ -1278,16 +1316,25 @@ } if (tmpScale != 1.0 && params.resize.method == "Nearest") { // resize rgb data (gamma applied) - Image16* tempImage = new Image16 (imw, imh); + Imagefloat* tempImage = new Imagefloat (imw, imh); ipf.resize (readyImg, tempImage, tmpScale); delete readyImg; readyImg = tempImage; } - if (tunnelMetaData) { - readyImg->setMetadata (ii->getMetaData()->getExifData ()); - } else { - readyImg->setMetadata (ii->getMetaData()->getExifData (), params.exif, params.iptc); + switch (params.metadata.mode) { + case MetaDataParams::TUNNEL: + // Sending back the whole first root, which won't necessarily be the selected frame number + // and may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata (ii->getMetaData()->getRootExifData ()); + break; + case MetaDataParams::EDIT: + // ask for the correct frame number, but may contain subframe depending on initial raw's hierarchy + readyImg->setMetadata (ii->getMetaData()->getBestExifData(imgsrc, ¶ms.raw), params.exif, params.iptc); + break; + default: // case MetaDataParams::STRIP + // nothing to do + break; } @@ -1413,8 +1460,7 @@ if (params.prsharpening.enabled) { params.sharpening = params.prsharpening; } else { - adjust_radius (defaultparams.sharpening.radius, scale_factor, - params.sharpening.radius); + params.sharpening.radius *= scale_factor; } params.impulseDenoise.thresh *= scale_factor; @@ -1424,12 +1470,12 @@ } params.wavelet.strength *= scale_factor; - params.dirpyrDenoise.luma *= scale_factor; + params.dirpyrDenoise.luma *= scale_factor * scale_factor; //params.dirpyrDenoise.Ldetail += (100 - params.dirpyrDenoise.Ldetail) * scale_factor; auto &lcurve = params.dirpyrDenoise.lcurve; for (size_t i = 2; i < lcurve.size(); i += 4) { - lcurve[i] *= min (scale_factor * 2, 1.0); + lcurve[i] *= min (scale_factor * scale_factor, 1.0); } noiseLCurve.Set (lcurve); @@ -1467,18 +1513,15 @@ adjust_radius (defaultparams.defringe.radius, scale_factor, params.defringe.radius); - adjust_radius (defaultparams.sh.radius, scale_factor, params.sh.radius); + params.sh.radius *= scale_factor; + params.localContrast.radius *= scale_factor; - if (params.raw.xtranssensor.method == - procparams::RAWParams::XTransSensor::methodstring[ - procparams::RAWParams::XTransSensor::threePass]) { - params.raw.xtranssensor.method = - procparams::RAWParams::XTransSensor::methodstring[ - procparams::RAWParams::XTransSensor::onePass]; + if (params.raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::THREE_PASS)) { + params.raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::ONE_PASS); } - if (params.raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::pixelshift]) { - params.raw.bayersensor.method = procparams::RAWParams::BayerSensor::methodstring[params.raw.bayersensor.pixelShiftLmmse ? procparams::RAWParams::BayerSensor::lmmse : procparams::RAWParams::BayerSensor::amaze]; + if (params.raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { + params.raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(params.raw.bayersensor.pixelShiftLmmse ? procparams::RAWParams::BayerSensor::Method::LMMSE : procparams::RAWParams::BayerSensor::Method::AMAZE); } } @@ -1486,7 +1529,6 @@ ProcessingJobImpl* job; int& errorCode; ProgressListener* pl; - bool tunnelMetaData; bool flush; // internal state @@ -1560,20 +1602,20 @@ } // namespace -IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool tunnelMetaData, bool flush) +IImagefloat* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool flush) { - ImageProcessor proc (pjob, errorCode, pl, tunnelMetaData, flush); + ImageProcessor proc (pjob, errorCode, pl, flush); return proc(); } -void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData) +void batchProcessingThread (ProcessingJob* job, BatchProcessingListener* bpl) { ProcessingJob* currentJob = job; while (currentJob) { int errorCode; - IImage16* img = processImage (currentJob, errorCode, bpl, tunnelMetaData, true); + IImagefloat* img = processImage (currentJob, errorCode, bpl, true); if (errorCode) { bpl->error (M ("MAIN_MSG_CANNOTLOAD")); @@ -1589,11 +1631,11 @@ } } -void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl, bool tunnelMetaData) +void startBatchProcessing (ProcessingJob* job, BatchProcessingListener* bpl) { if (bpl) { - Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl, tunnelMetaData), 0, true, true, Glib::THREAD_PRIORITY_LOW); + Glib::Thread::create (sigc::bind (sigc::ptr_fun (batchProcessingThread), job, bpl), 0, true, true, Glib::THREAD_PRIORITY_LOW); } } diff -Nru rawtherapee-5.3/rtengine/sleef.c rawtherapee-5.4/rtengine/sleef.c --- rawtherapee-5.3/rtengine/sleef.c 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/sleef.c 2018-03-20 11:04:15.000000000 +0000 @@ -12,10 +12,8 @@ #include #include -//#include #include "rt_math.h" -//#include -//#include +#include "opthelper.h" #define PI4_A .7853981554508209228515625 #define PI4_B .794662735614792836713604629039764404296875e-8 @@ -923,9 +921,8 @@ return intBitsToFloat(floatToRawIntBits(x) ^ (floatToRawIntBits(y) & (1 << 31))); } -__inline float signf(float d) { return mulsignf(1, d); } +__inline float signf(float d) { return copysign(1, d); } __inline float mlaf(float x, float y, float z) { return x * y + z; } -__inline float xrintf(float x) { return x < 0 ? (int)(x - 0.5f) : (int)(x + 0.5f); } __inline int xisnanf(float x) { return x != x; } __inline int xisinff(float x) { return x == rtengine::RT_INFINITY_F || x == -rtengine::RT_INFINITY_F; } @@ -984,7 +981,7 @@ int q; float u, s; - q = (int)xrintf(d * (float)rtengine::RT_1_PI); + q = rint(d * rtengine::RT_1_PI_F); d = mlaf(q, -PI4_Af*4, d); d = mlaf(q, -PI4_Bf*4, d); @@ -1006,10 +1003,14 @@ } __inline float xcosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + return xcosf(_mm_set_ss(d))[0]; +#else int q; float u, s; - q = 1 + 2*(int)xrintf(d * (float)rtengine::RT_1_PI - 0.5f); + q = 1 + 2*rint(d * rtengine::RT_1_PI_F - 0.5f); d = mlaf(q, -PI4_Af*2, d); d = mlaf(q, -PI4_Bf*2, d); @@ -1028,14 +1029,20 @@ u = mlaf(s, u * d, d); return u; +#endif } __inline float2 xsincosf(float d) { +#ifdef __SSE2__ + // faster than scalar version + vfloat2 res = xsincosf(_mm_set_ss(d)); + return {res.x[0], res.y[0]}; +#else int q; float u, s, t; float2 r; - q = (int)rint(d * ((float)(2 * rtengine::RT_1_PI))); + q = rint(d * rtengine::RT_2_PI_F); s = d; @@ -1070,13 +1077,14 @@ if (xisinff(d)) { r.x = r.y = rtengine::RT_NAN_F; } return r; +#endif } __inline float xtanf(float d) { int q; float u, s, x; - q = (int)xrintf(d * (float)(2 * rtengine::RT_1_PI)); + q = rint(d * (float)(2 * rtengine::RT_1_PI)); x = d; @@ -1202,7 +1210,7 @@ __inline float xexpf(float d) { if(d<=-104.0f) return 0.0f; - int q = (int)xrintf(d * R_LN2f); + int q = rint(d * R_LN2f); float s, u; s = mlaf(q, -L2Uf, d); diff -Nru rawtherapee-5.3/rtengine/sleefsseavx.c rawtherapee-5.4/rtengine/sleefsseavx.c --- rawtherapee-5.3/rtengine/sleefsseavx.c 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/sleefsseavx.c 2018-03-20 11:04:15.000000000 +0000 @@ -12,10 +12,6 @@ #define SLEEFSSEAVX #include -//#include -//#include -//#include -//#include "sleefsseavx.h" #include "rt_math.h" #ifdef __SSE2__ #include "helpersse2.h" @@ -30,8 +26,6 @@ #define INLINE inline #endif -// - #define PI4_A .7853981554508209228515625 #define PI4_B .794662735614792836713604629039764404296875e-8 #define PI4_C .306161699786838294306516483068750264552437361480769e-16 @@ -41,8 +35,6 @@ #define L2L .28235290563031577122588448175013436025525412068e-12 #define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 -// - #define PI4_Af 0.78515625f #define PI4_Bf 0.00024127960205078125f #define PI4_Cf 6.3329935073852539062e-07f @@ -55,8 +47,6 @@ #define INFINITYf ((float)rtengine::RT_INFINITY) #define NANf ((float)rtengine::RT_NAN) -// - static INLINE vdouble vadd3(vdouble v0, vdouble v1, vdouble v2) { return vadd(vadd(v0, v1), v2); } @@ -916,7 +906,7 @@ static INLINE vfloat vabsf(vfloat f) { return (vfloat)vandnotm((vmask)vcast_vf_f(-0.0f), (vmask)f); } static INLINE vfloat vnegf(vfloat f) { return (vfloat)vxorm((vmask)f, (vmask)vcast_vf_f(-0.0f)); } -#if defined( __SSE4_1__ ) && defined( __x86_64__ ) +#ifdef __SSE4_1__ // only one instruction when using SSE4.1 static INLINE vfloat vself(vmask mask, vfloat x, vfloat y) { return _mm_blendv_ps(y,x,(vfloat)mask); @@ -1323,10 +1313,8 @@ u = vldexpf(u, q); - u = vself(vmaskf_isminf(d), vcast_vf_f(0.0f), u); -// -104.0 - u = vself(vmaskf_gt(vcast_vf_f(-104), d), vcast_vf_f(0), u); - return u; + // -104.0 + return vselfnotzero(vmaskf_gt(vcast_vf_f(-104.f), d), u); } static INLINE vfloat xexpfNoCheck(vfloat d) { // this version does not check input values. Use it only when you know the input values are > -104.f e.g. when filling a lookup table @@ -1389,8 +1377,7 @@ static inline void vswap( vmask condition, vfloat &a, vfloat &b) { // conditional swap the elements of two vfloats vfloat temp = vself(condition, a, b); // the values which fit to condition - condition = vnotm(condition); // invert the condition - a = vself(condition, a, b); // the values which fit to inverted condition + a = vself(condition, b, a); // the values which fit to inverted condition b = temp; } diff -Nru rawtherapee-5.3/rtengine/stdimagesource.cc rawtherapee-5.4/rtengine/stdimagesource.cc --- rawtherapee-5.3/rtengine/stdimagesource.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/stdimagesource.cc 2018-03-20 11:04:15.000000000 +0000 @@ -102,7 +102,7 @@ * and RT's image data type (Image8, Image16 and Imagefloat), then it will * load the image into it */ -int StdImageSource::load (const Glib::ustring &fname, int imageNum, bool batch) +int StdImageSource::load (const Glib::ustring &fname) { fileName = fname; @@ -158,7 +158,7 @@ embProfile = img->getEmbeddedProfile (); - idata = new ImageData (fname); + idata = new FramesData (fname); if (idata->hasExif()) { int deg = 0; @@ -187,7 +187,7 @@ return 0; } -void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw) +void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) { // the code will use OpenMP as of now. diff -Nru rawtherapee-5.3/rtengine/stdimagesource.h rawtherapee-5.4/rtengine/stdimagesource.h --- rawtherapee-5.3/rtengine/stdimagesource.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/stdimagesource.h 2018-03-20 11:04:15.000000000 +0000 @@ -42,8 +42,8 @@ StdImageSource (); ~StdImageSource (); - int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false); - void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw); + int load (const Glib::ustring &fname); + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw); ColorTemp getWB () const { return wb; @@ -68,9 +68,9 @@ void getFullSize (int& w, int& h, int tr = TR_NONE); void getSize (const PreviewProps &pp, int& w, int& h); - ImageData* getImageData () + FrameData* getImageData (unsigned int frameNum) { - return idata; + return idata->getFrameData (frameNum); } ImageIO* getImageIO () { @@ -93,7 +93,7 @@ void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb);// RAWParams raw will not be used for non-raw files (see imagesource.h) static void colorSpaceConversion (Imagefloat* im, const ColorManagementParams &cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat); - bool IsrgbSourceModified() const + bool isRGBSourceModified() const { return rgbSourceModified; } diff -Nru rawtherapee-5.3/rtengine/tmo_fattal02.cc rawtherapee-5.4/rtengine/tmo_fattal02.cc --- rawtherapee-5.3/rtengine/tmo_fattal02.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtengine/tmo_fattal02.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,1176 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Ported from LuminanceHDR by Alberto Griggio + * + * 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 . + */ + +/** + * @file tmo_fattal02.cpp + * @brief TMO: Gradient Domain High Dynamic Range Compression + * + * Implementation of Gradient Domain High Dynamic Range Compression + * by Raanan Fattal, Dani Lischinski, Michael Werman. + * + * @author Grzegorz Krawczyk, + * + * + * This file is a part of LuminanceHDR package, based on pfstmo. + * ---------------------------------------------------------------------- + * Copyright (C) 2003,2004 Grzegorz Krawczyk + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * ---------------------------------------------------------------------- + * + * $Id: tmo_fattal02.cpp,v 1.3 2008/11/04 23:43:08 rafm Exp $ + */ + + +#ifdef _OPENMP +#include +#endif +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "array2D.h" +#include "improcfun.h" +#include "settings.h" +#include "iccstore.h" +#include "StopWatch.h" +#include "sleef.c" +#include "opthelper.h" +#include "rt_algo.h" + +namespace rtengine +{ + +/****************************************************************************** + * RT code + ******************************************************************************/ + +extern const Settings *settings; +extern MyMutex *fftwMutex; + +using namespace std; + +namespace +{ + +class Array2Df: public array2D +{ + typedef array2D Super; +public: + Array2Df(): Super() {} + Array2Df (int w, int h): Super (w, h) {} + + float &operator() (int w, int h) + { + return (*this)[h][w]; + } + + const float &operator() (int w, int h) const + { + return (*this)[h][w]; + } + + float &operator() (int i) + { + return static_cast (*this)[i]; + } + + const float &operator() (int i) const + { + return const_cast (*this).operator() (i); + } + + int getRows() const + { + return const_cast (*this).height(); + } + + int getCols() const + { + return const_cast (*this).width(); + } + + float *data() + { + return static_cast (*this); + } + + const float *data() const + { + return const_cast (*this).data(); + } +}; + +// upper bound on image dimension used in tmo_fattal02 -- see the comment there +const int RT_dimension_cap = 1920; + +void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread); + + +/****************************************************************************** + * Luminance HDR code (modifications are marked with an RT comment) + ******************************************************************************/ + +void downSample (const Array2Df& A, Array2Df& B) +{ + const int width = B.getCols(); + const int height = B.getRows(); + + // Note, I've uncommented all omp directives. They are all ok but are + // applied to too small problems and in total don't lead to noticeable + // speed improvements. The main issue is the pde solver and in case of the + // fft solver uses optimised threaded fftw routines. + //#pragma omp parallel for + for ( int y = 0 ; y < height ; y++ ) { + for ( int x = 0 ; x < width ; x++ ) { + float p = A (2 * x, 2 * y); + p += A (2 * x + 1, 2 * y); + p += A (2 * x, 2 * y + 1); + p += A (2 * x + 1, 2 * y + 1); + B (x, y) = p * 0.25f; // p / 4.0f; + } + } +} + +void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) +{ + const int width = I.getCols(); + const int height = I.getRows(); + + if (width < 3 || height < 3) { + if (&I != &L) { + for (int i = 0, n = width * height; i < n; ++i) { + L (i) = I (i); + } + } + + return; + } + + Array2Df T (width, height); + + //--- X blur + #pragma omp parallel for shared(I, T) if(multithread) + + for ( int y = 0 ; y < height ; y++ ) { + for ( int x = 1 ; x < width - 1 ; x++ ) { + float t = 2.f * I (x, y); + t += I (x - 1, y); + t += I (x + 1, y); + T (x, y) = t * 0.25f; // t / 4.f; + } + + T (0, y) = ( 3.f * I (0, y) + I (1, y) ) * 0.25f; // / 4.f; + T (width - 1, y) = ( 3.f * I (width - 1, y) + I (width - 2, y) ) * 0.25f; // / 4.f; + } + + //--- Y blur + #pragma omp parallel for if(multithread) + + for ( int x = 0 ; x < width - 7 ; x += 8 ) { + for ( int y = 1 ; y < height - 1 ; y++ ) { + for (int xx = 0; xx < 8; ++xx) { + float t = 2.f * T (x + xx, y); + t += T (x + xx, y - 1); + t += T (x + xx, y + 1); + L (x + xx, y) = t * 0.25f; // t/4.0f; + } + } + + for (int xx = 0; xx < 8; ++xx) { + L (x + xx, 0) = ( 3.f * T (x + xx, 0) + T (x + xx, 1) ) * 0.25f; // / 4.0f; + L (x + xx, height - 1) = ( 3.f * T (x + xx, height - 1) + T (x + xx, height - 2) ) * 0.25f; // / 4.0f; + } + } + + for ( int x = width - (width % 8) ; x < width ; x++ ) { + for ( int y = 1 ; y < height - 1 ; y++ ) { + float t = 2.f * T (x, y); + t += T (x, y - 1); + t += T (x, y + 1); + L (x, y) = t * 0.25f; // t/4.0f; + } + + L (x, 0) = ( 3.f * T (x, 0) + T (x, 1) ) * 0.25f; // / 4.0f; + L (x, height - 1) = ( 3.f * T (x, height - 1) + T (x, height - 2) ) * 0.25f; // / 4.0f; + } +} + +void createGaussianPyramids (Array2Df** pyramids, int nlevels, bool multithread) +{ + // pyramids[0] is already set + int width = pyramids[0]->getCols(); + int height = pyramids[0]->getRows(); + + + Array2Df* L = new Array2Df (width, height); + gaussianBlur ( *pyramids[0], *L, multithread ); + + for ( int k = 1 ; k < nlevels ; k++ ) { + if (width > 2 && height > 2) { + width /= 2; + height /= 2; + pyramids[k] = new Array2Df (width, height); + downSample (*L, *pyramids[k]); + } else { + // RT - now nlevels is fixed in tmo_fattal02 (see the comment in + // there), so it might happen that we have to add some padding to + // the gaussian pyramids + pyramids[k] = new Array2Df (width, height); + + for (int j = 0, n = width * height; j < n; ++j) { + (*pyramids[k]) (j) = (*L) (j); + } + } + + if (k < nlevels - 1) { + delete L; + L = new Array2Df (width, height); + gaussianBlur ( *pyramids[k], *L, multithread ); + } + } + + delete L; +} + +//-------------------------------------------------------------------- + +float calculateGradients (Array2Df* H, Array2Df* G, int k, bool multithread) +{ + const int width = H->getCols(); + const int height = H->getRows(); + const float divider = pow ( 2.0f, k + 1 ); + double avgGrad = 0.0; // use double precision for large summations + + #pragma omp parallel for reduction(+:avgGrad) if(multithread) + + for ( int y = 0 ; y < height ; y++ ) { + int n = (y == 0 ? 0 : y - 1); + int s = (y + 1 == height ? y : y + 1); + + for ( int x = 0 ; x < width ; x++ ) { + float gx, gy; + int w, e; + w = (x == 0 ? 0 : x - 1); + e = (x + 1 == width ? x : x + 1); + + gx = ((*H) (w, y) - (*H) (e, y)); + + gy = ((*H) (x, s) - (*H) (x, n)); + // note this implicitly assumes that H(-1)=H(0) + // for the fft-pde slover this would need adjustment as H(-1)=H(1) + // is assumed, which means gx=0.0, gy=0.0 at the boundaries + // however, the impact is not visible so we ignore this here + + (*G) (x, y) = sqrt (gx * gx + gy * gy) / divider; + avgGrad += (*G) (x, y); + } + } + + return avgGrad / (width * height); +} + +//-------------------------------------------------------------------- + +void upSample (const Array2Df& A, Array2Df& B) +{ + const int width = B.getCols(); + const int height = B.getRows(); + const int awidth = A.getCols(); + const int aheight = A.getRows(); + + //#pragma omp parallel for shared(A, B) + for ( int y = 0 ; y < height ; y++ ) { + for ( int x = 0 ; x < width ; x++ ) { + int ax = static_cast (x * 0.5f); //x / 2.f; + int ay = static_cast (y * 0.5f); //y / 2.f; + ax = (ax < awidth) ? ax : awidth - 1; + ay = (ay < aheight) ? ay : aheight - 1; + + B (x, y) = A (ax, ay); + } + } + +//--- this code below produces 'use of uninitialized value error' +// int width = A->getCols(); +// int height = A->getRows(); +// int x,y; + +// for( y=0 ; ygetCols(); + int height = gradients[nlevels - 1]->getRows(); + Array2Df** fi = new Array2Df*[nlevels]; + + fi[nlevels - 1] = new Array2Df (width, height); + + #pragma omp parallel for shared(fi) if(multithread) + for ( int k = 0 ; k < width * height ; k++ ) { + (*fi[nlevels - 1]) (k) = 1.0f; + } + + for ( int k = nlevels - 1; k >= 0 ; k-- ) { + width = gradients[k]->getCols(); + height = gradients[k]->getRows(); + + // only apply gradients to levels>=detail_level but at least to the coarsest + if ((k >= detail_level || k == nlevels - 1) && beta != 1.f) { + //DEBUG_STR << "calculateFiMatrix: apply gradient to level " << k << endl; + #pragma omp parallel for shared(fi,avgGrad) if(multithread) + for ( int y = 0; y < height; y++ ) { + for ( int x = 0; x < width; x++ ) { + float grad = ((*gradients[k]) (x, y) < 1e-4f) ? 1e-4 : (*gradients[k]) (x, y); + float a = alfa * avgGrad[k]; + float value = pow ((grad + noise) / a, beta - 1.0f); + + (*fi[k]) (x, y) *= value; + } + } + } + + // create next level + if ( k > 1 ) { + width = gradients[k - 1]->getCols(); + height = gradients[k - 1]->getRows(); + fi[k - 1] = new Array2Df (width, height); + } else { + fi[0] = FI; // highest level -> result + } + + if (k > 0) { + upSample (*fi[k], *fi[k - 1]); // upsample to next level + gaussianBlur (*fi[k - 1], *fi[k - 1], multithread); + } + } + + for ( int k = 1 ; k < nlevels ; k++ ) { + delete fi[k]; + } + + delete[] fi; +} + +void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread); + +void tmo_fattal02 (size_t width, + size_t height, + const Array2Df& Y, + Array2Df& L, + float alfa, + float beta, + float noise, + int detail_level, + bool multithread) +{ +// #ifdef TIMER_PROFILING +// msec_timer stop_watch; +// stop_watch.start(); +// #endif + // static const float black_point = 0.1f; + // static const float white_point = 0.5f; + static const float gamma = 1.0f; // 0.8f; + + // static const int detail_level = 3; + if ( detail_level < 0 ) { + detail_level = 0; + } + + if ( detail_level > 3 ) { + detail_level = 3; + } + + // ph.setValue(2); + // if (ph.canceled()) return; + + /* RT -- we use a hardcoded value for nlevels, to limit the + * dependency of the result on the image size. When using an auto computed + * nlevels value, you would get vastly different results with different + * image sizes, making it essentially impossible to preview the tool + * inside RT. With a hardcoded value, the results for the preview are much + * closer to those for the final image */ + // int MSIZE = 32; // minimum size of gaussian pyramid + // // I believe a smaller value than 32 results in slightly better overall + // // quality but I'm only applying this if the newly implemented fft solver + // // is used in order not to change behaviour of the old version + // // TODO: best let the user decide this value + // // if (fftsolver) + // { + // MSIZE = 8; + // } + + + int size = width * height; + + // find max value, normalize to range 0..100 and take logarithm + // float minLum = Y (0, 0); + float maxLum = Y (0, 0); + + #pragma omp parallel for reduction(max:maxLum) if(multithread) + + for ( int i = 0 ; i < size ; i++ ) { + maxLum = std::max (maxLum, Y (i)); + } + + Array2Df* H = new Array2Df (width, height); + float temp = 100.f / maxLum; + float eps = 1e-4f; + #pragma omp parallel if(multithread) + { +#ifdef __SSE2__ + vfloat epsv = F2V (eps); + vfloat tempv = F2V (temp); +#endif + #pragma omp for schedule(dynamic,16) + + for (size_t i = 0 ; i < height ; ++i) { + size_t j = 0; +#ifdef __SSE2__ + + for (; j < width - 3; j += 4) { + STVFU ((*H)[i][j], xlogf (tempv * LVFU (Y[i][j]) + epsv)); + } + +#endif + + for (; j < width; ++j) { + (*H)[i][j] = xlogf (temp * Y[i][j] + eps); + } + } + } + + /** RT - this is also here to reduce the dependency of the results on the + * input image size, with the primary aim of having a preview in RT that is + * reasonably close to the actual output image. Intuitively, what we do is + * to put a cap on the dimension of the image processed, so that it is close + * in size to the typical preview that you will see on a normal consumer + * monitor. (That's where the 1920 value for RT_dimension_cap comes from.) + * However, we can't simply downscale the input Y array and then upscale it + * on output, because that would cause a big loss of sharpness (confirmed by + * testing). + * So, we use a different method: we downscale the H array, so that we + * compute a downscaled gaussian pyramid and a downscaled FI matrix. Then, + * we upscale the FI matrix later on, before it gets combined with the + * original input luminance array H. This seems to preserve the input + * sharpness and at the same time significantly reduce the dependency of the + * result on the input size. Clearly this is a hack, and keep in mind that I + * do not really know how Fattal works (it comes from LuminanceHDR almost + * verbatim), so this should probably be revised/reviewed by someone who + * knows better... also, we use a quite naive bilinear interpolation + * algorithm (see rescale_bilinear below), which could definitely be + * improved */ + int fullwidth = width; + int fullheight = height; + int dim = std::max (width, height); + Array2Df *fullH = nullptr; + + if (dim > RT_dimension_cap) { + float s = float (RT_dimension_cap) / float (dim); + Array2Df *HH = new Array2Df (width * s, height * s); + rescale_bilinear (*H, *HH, multithread); + fullH = H; + H = HH; + width = H->getCols(); + height = H->getRows(); + } + + /** RT */ + + const int nlevels = 7; // RT -- see above + + Array2Df* pyramids[nlevels]; + pyramids[0] = H; + createGaussianPyramids (pyramids, nlevels, multithread); + + // calculate gradients and its average values on pyramid levels + Array2Df* gradients[nlevels]; + float avgGrad[nlevels]; + + for ( int k = 0 ; k < nlevels ; k++ ) { + gradients[k] = new Array2Df (pyramids[k]->getCols(), pyramids[k]->getRows()); + avgGrad[k] = calculateGradients (pyramids[k], gradients[k], k, multithread); + if(k != 0) // pyramids[0] is H. Will be deleted later + delete pyramids[k]; + } + + + // calculate fi matrix + Array2Df* FI = new Array2Df (width, height); + calculateFiMatrix (FI, gradients, avgGrad, nlevels, detail_level, alfa, beta, noise, multithread); + + for ( int i = 0 ; i < nlevels ; i++ ) { + delete gradients[i]; + } + + /** - RT - bring back the FI image to the input size if it was downscaled */ + if (fullH) { + delete H; + H = fullH; + Array2Df *FI2 = new Array2Df (fullwidth, fullheight); + rescale_bilinear (*FI, *FI2, multithread); + delete FI; + FI = FI2; + width = fullwidth; + height = fullheight; + } + + /** RT */ + + // attenuate gradients + Array2Df* Gx = new Array2Df (width, height); + Array2Df* Gy = &L; // use L as buffer for Gy + + // the fft solver solves the Poisson pde but with slightly different + // boundary conditions, so we need to adjust the assembly of the right hand + // side accordingly (basically fft solver assumes U(-1) = U(1), whereas zero + // Neumann conditions assume U(-1)=U(0)), see also divergence calculation + #pragma omp parallel for if(multithread) + + for ( size_t y = 0 ; y < height ; y++ ) { + // sets index+1 based on the boundary assumption H(N+1)=H(N-1) + unsigned int yp1 = (y + 1 >= height ? height - 2 : y + 1); + + for ( size_t x = 0 ; x < width ; x++ ) { + // sets index+1 based on the boundary assumption H(N+1)=H(N-1) + unsigned int xp1 = (x + 1 >= width ? width - 2 : x + 1); + // forward differences in H, so need to use between-points approx of FI + (*Gx) (x, y) = ((*H) (xp1, y) - (*H) (x, y)) * 0.5 * ((*FI) (xp1, y) + (*FI) (x, y)); + (*Gy) (x, y) = ((*H) (x, yp1) - (*H) (x, y)) * 0.5 * ((*FI) (x, yp1) + (*FI) (x, y)); + } + } + + delete H; + + // calculate divergence + #pragma omp parallel for if(multithread) + + for ( size_t y = 0; y < height; ++y ) { + for ( size_t x = 0; x < width; ++x ) { + (*FI) (x, y) = (*Gx) (x, y) + (*Gy) (x, y); + + if ( x > 0 ) { + (*FI) (x, y) -= (*Gx) (x - 1, y); + } + + if ( y > 0 ) { + (*FI) (x, y) -= (*Gy) (x, y - 1); + } + + if (x == 0) { + (*FI) (x, y) += (*Gx) (x, y); + } + + if (y == 0) { + (*FI) (x, y) += (*Gy) (x, y); + } + + } + } + + //delete Gx; // RT - reused as temp buffer in solve_pde_fft, deleted later + + // solve pde and exponentiate (ie recover compressed image) + { + MyMutex::MyLock lock (*fftwMutex); + solve_pde_fft (FI, &L, Gx, multithread); + } + delete Gx; + delete FI; + + #pragma omp parallel if(multithread) + { +#ifdef __SSE2__ + vfloat gammav = F2V (gamma); +#endif + #pragma omp for schedule(dynamic,16) + + for (size_t i = 0 ; i < height ; i++) { + size_t j = 0; +#ifdef __SSE2__ + + for (; j < width - 3; j += 4) { + STVFU (L[i][j], xexpf (gammav * LVFU (L[i][j]))); + } + +#endif + + for (; j < width; j++) { + L[i][j] = xexpf ( gamma * L[i][j]); + } + } + } +} + + +/** + * + * @file pde_fft.cpp + * @brief Direct Poisson solver using the discrete cosine transform + * + * @author Tino Kluge (tino.kluge@hrz.tu-chemnitz.de) + * + */ + +////////////////////////////////////////////////////////////////////// +// Direct Poisson solver using the discrete cosine transform +////////////////////////////////////////////////////////////////////// +// by Tino Kluge (tino.kluge@hrz.tu-chemnitz.de) +// +// let U and F be matrices of order (n1,n2), ie n1=height, n2=width +// and L_x of order (n2,n2) and L_y of order (n1,n1) and both +// representing the 1d Laplace operator with Neumann boundary conditions, +// ie L_x and L_y are tridiagonal matrices of the form +// +// ( -2 2 ) +// ( 1 -2 1 ) +// ( . . . ) +// ( 1 -2 1 ) +// ( 2 -2 ) +// +// then this solver computes U given F based on the equation +// +// ------------------------- +// L_y U + (L_x U^tr)^tr = F +// ------------------------- +// +// Note, if the first and last row of L_x and L_y contained one's instead of +// two's then this equation would be exactly the 2d Poisson equation with +// Neumann boundary conditions. As a simple rule: +// - Neumann: assume U(-1)=U(0) --> U(i-1) - 2 U(i) + U(i+1) becomes +// i=0: U(0) - 2 U(0) + U(1) = -U(0) + U(1) +// - our system: assume U(-1)=U(1) --> this becomes +// i=0: U(1) - 2(0) + U(1) = -2 U(0) + 2 U(1) +// +// The multi grid solver solve_pde_multigrid() solves the 2d Poisson pde +// with the right Neumann boundary conditions, U(-1)=U(0), see function +// atimes(). This means the assembly of the right hand side F is different +// for both solvers. + + +// returns T = EVy A EVx^tr +// note, modifies input data +void transform_ev2normal (Array2Df *A, Array2Df *T, bool multithread) +{ + int width = A->getCols(); + int height = A->getRows(); + assert ((int)T->getCols() == width && (int)T->getRows() == height); + + // the discrete cosine transform is not exactly the transform needed + // need to scale input values to get the right transformation + #pragma omp parallel for if(multithread) + + for (int y = 1 ; y < height - 1 ; y++ ) + for (int x = 1 ; x < width - 1 ; x++ ) { + (*A) (x, y) *= 0.25f; + } + + for (int x = 1 ; x < width - 1 ; x++ ) { + (*A) (x, 0) *= 0.5f; + (*A) (x, height - 1) *= 0.5f; + } + + for (int y = 1 ; y < height - 1 ; y++ ) { + (*A) (0, y) *= 0.5; + (*A) (width - 1, y) *= 0.5f; + } + + // note, fftw provides its own memory allocation routines which + // ensure that memory is properly 16/32 byte aligned so it can + // use SSE/AVX operations (2/4 double ops in parallel), if our + // data is not properly aligned fftw won't use SSE/AVX + // (I believe new() aligns memory to 16 byte so avoid overhead here) + // + // double* in = (double*) fftwf_malloc(sizeof(double) * width*height); + // fftwf_free(in); + + // executes 2d discrete cosine transform + fftwf_plan p; + p = fftwf_plan_r2r_2d (height, width, A->data(), T->data(), + FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); + fftwf_execute (p); + fftwf_destroy_plan (p); +} + + +// returns T = EVy^-1 * A * (EVx^-1)^tr +void transform_normal2ev (Array2Df *A, Array2Df *T, bool multithread) +{ + int width = A->getCols(); + int height = A->getRows(); + assert ((int)T->getCols() == width && (int)T->getRows() == height); + + // executes 2d discrete cosine transform + fftwf_plan p; + p = fftwf_plan_r2r_2d (height, width, A->data(), T->data(), + FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE); + fftwf_execute (p); + fftwf_destroy_plan (p); + + // need to scale the output matrix to get the right transform + float factor = (1.0f / ((height - 1) * (width - 1))); + #pragma omp parallel for if(multithread) + + for (int y = 0 ; y < height ; y++ ) + for (int x = 0 ; x < width ; x++ ) { + (*T) (x, y) *= factor; + } + + for (int x = 0 ; x < width ; x++ ) { + (*T) (x, 0) *= 0.5f; + (*T) (x, height - 1) *= 0.5f; + } + + for (int y = 0 ; y < height ; y++ ) { + (*T) (0, y) *= 0.5f; + (*T) (width - 1, y) *= 0.5f; + } +} + +// returns the eigenvalues of the 1d laplace operator +std::vector get_lambda (int n) +{ + assert (n > 1); + std::vector v (n); + + for (int i = 0; i < n; i++) { + v[i] = -4.0 * SQR (sin ((double)i / (2 * (n - 1)) * RT_PI)); + } + + return v; +} + +// // makes boundary conditions compatible so that a solution exists +// void make_compatible_boundary(Array2Df *F) +// { +// int width = F->getCols(); +// int height = F->getRows(); + +// double sum=0.0; +// for(int y=1 ; ygetCols(); + int height = F->getRows(); + assert ((int)U->getCols() == width && (int)U->getRows() == height); + assert (buf->getCols() == width && buf->getRows() == height); + + // activate parallel execution of fft routines +#ifdef RT_FFTW3F_OMP + + if (multithread) { + fftwf_init_threads(); + fftwf_plan_with_nthreads ( omp_get_max_threads() ); + } + +// #else +// fftwf_plan_with_nthreads( 2 ); +#endif + + // in general there might not be a solution to the Poisson pde + // with Neumann boundary conditions unless the boundary satisfies + // an integral condition, this function modifies the boundary so that + // the condition is exactly satisfied + // if(adjust_bound) + // { + // //DEBUG_STR << "solve_pde_fft: checking boundary conditions" << std::endl; + // make_compatible_boundary(F); + // } + + // transforms F into eigenvector space: Ftr = + //DEBUG_STR << "solve_pde_fft: transform F to ev space (fft)" << std::endl; + Array2Df* F_tr = buf; + transform_normal2ev (F, F_tr, multithread); + // TODO: F no longer needed so could release memory, but as it is an + // input parameter we won't do that + + + // in the eigenvector space the solution is very simple + std::vector l1 = get_lambda (height); + std::vector l2 = get_lambda (width); + + #pragma omp parallel for if(multithread) + + for (int y = 0 ; y < height ; y++ ) { + for (int x = 0 ; x < width ; x++ ) { + (*F_tr) (x, y) = (*F_tr) (x, y) / (l1[y] + l2[x]); + } + } + + (*F_tr) (0, 0) = 0.f; // any value ok, only adds a const to the solution + + // transforms F_tr back to the normal space + transform_ev2normal (F_tr, U, multithread); + + // the solution U as calculated will satisfy something like int U = 0 + // since for any constant c, U-c is also a solution and we are mainly + // working in the logspace of (0,1) data we prefer to have + // a solution which has no positive values: U_new(x,y)=U(x,y)-max + // (not really needed but good for numerics as we later take exp(U)) + //DEBUG_STR << "solve_pde_fft: removing constant from solution" << std::endl; + float max = 0.f; + #pragma omp parallel for reduction(max:max) if(multithread) + + for (int i = 0; i < width * height; i++) { + max = std::max (max, (*U) (i)); + } + + #pragma omp parallel for if(multithread) + + for (int i = 0; i < width * height; i++) { + (*U) (i) -= max; + } +} + + +// --------------------------------------------------------------------- +// the functions below are only for test purposes to check the accuracy +// of the pde solvers + + +// // returns the norm of (Laplace U - F) of all interior points +// // useful to compare solvers +// float residual_pde(Array2Df* U, Array2Df* F) +// { +// int width = U->getCols(); +// int height = U->getRows(); +// assert((int)F->getCols()==width && (int)F->getRows()==height); + +// double res=0.0; +// for(int y=1;y( sqrt(res) ); +// } + + +/***************************************************************************** + * RT code from here on + *****************************************************************************/ + +inline float get_bilinear_value (const Array2Df &src, float x, float y) +{ + // Get integer and fractional parts of numbers + int xi = x; + int yi = y; + float xf = x - xi; + float yf = y - yi; + int xi1 = std::min (xi + 1, src.getCols() - 1); + int yi1 = std::min (yi + 1, src.getRows() - 1); + + float bl = src (xi, yi); + float br = src (xi1, yi); + float tl = src (xi, yi1); + float tr = src (xi1, yi1); + + // interpolate + float b = xf * br + (1.f - xf) * bl; + float t = xf * tr + (1.f - xf) * tl; + float pxf = yf * t + (1.f - yf) * b; + return pxf; +} + + +void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread) +{ + float col_scale = float (src.getCols()) / float (dst.getCols()); + float row_scale = float (src.getRows()) / float (dst.getRows()); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + + for (int y = 0; y < dst.getRows(); ++y) { + float ymrs = y * row_scale; + + for (int x = 0; x < dst.getCols(); ++x) { + dst (x, y) = get_bilinear_value (src, x * col_scale, ymrs); + } + } +} + +void rescale_nearest (const Array2Df &src, Array2Df &dst, bool multithread) +{ + const int width = src.getCols(); + const int height = src.getRows(); + const int nw = dst.getCols(); + const int nh = dst.getRows(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + + for (int y = 0; y < nh; ++y) { + int sy = y * height / nh; + + for (int x = 0; x < nw; ++x) { + int sx = x * width / nw; + dst (x, y) = src (sx, sy); + } + } +} + + +inline float luminance (float r, float g, float b, TMatrix ws) +{ + return r * ws[1][0] + g * ws[1][1] + b * ws[1][2]; +} + + +inline int round_up_pow2 (int dim) +{ + // from https://graphics.stanford.edu/~seander/bithacks.html + assert (dim > 0); + unsigned int v = dim; + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +inline int find_fast_dim (int dim) +{ + // as per the FFTW docs: + // + // FFTW is generally best at handling sizes of the form + // 2^a 3^b 5^c 7^d 11^e 13^f, + // where e+f is either 0 or 1. + // + // Here, we try to round up to the nearest dim that can be expressed in + // the above form. This is not exhaustive, but should be ok for pictures + // up to 100MPix at least + + int d1 = round_up_pow2 (dim); + std::vector d = { + d1 / 128 * 65, + d1 / 64 * 33, + d1 / 512 * 273, + d1 / 16 * 9, + d1 / 8 * 5, + d1 / 16 * 11, + d1 / 128 * 91, + d1 / 4 * 3, + d1 / 64 * 49, + d1 / 16 * 13, + d1 / 8 * 7, + d1 + }; + + for (size_t i = 0; i < d.size(); ++i) { + if (d[i] >= dim) { + return d[i]; + } + } + + assert (false); + return dim; +} + +} // namespace + + +void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) +{ + BENCHFUN + const int detail_level = 3; + + float alpha = 1.f; + + if (params->fattal.threshold < 0) { + alpha += (params->fattal.threshold * 0.9f) / 100.f; + } else if (params->fattal.threshold > 0) { + alpha += params->fattal.threshold / 100.f; + } + + float beta = 1.f - (params->fattal.amount * 0.3f) / 100.f; + + // sanity check + if (alpha <= 0 || beta <= 0) { + return; + } + + int w = rgb->getWidth(); + int h = rgb->getHeight(); + + Array2Df Yr (w, h); + + constexpr float epsilon = 1e-4f; + constexpr float luminance_noise_floor = 65.535f; + constexpr float min_luminance = 1.f; + + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) { + Yr (x, y) = std::max (luminance (rgb->r (y, x), rgb->g (y, x), rgb->b (y, x), ws), min_luminance); // clip really black pixels + } + } + + float oldMedian; + const float percentile = float(LIM(1, params->fattal.anchor, 100)) / 100.f; + findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), percentile, oldMedian, percentile, oldMedian, multiThread); + // median filter on the deep shadows, to avoid boosting noise + // because w2 >= w and h2 >= h, we can use the L buffer as temporary buffer for Median_Denoise() + int w2 = find_fast_dim (w) + 1; + int h2 = find_fast_dim (h) + 1; + Array2Df L (w2, h2); + { +#ifdef _OPENMP + int num_threads = multiThread ? omp_get_max_threads() : 1; +#else + int num_threads = 1; +#endif + float r = float (std::max (w, h)) / float (RT_dimension_cap); + Median med; + + if (r >= 3) { + med = Median::TYPE_7X7; + } else if (r >= 2) { + med = Median::TYPE_5X5_STRONG; + } else if (r >= 1) { + med = Median::TYPE_5X5_SOFT; + } else { + med = Median::TYPE_3X3_STRONG; + } + + Median_Denoise (Yr, Yr, luminance_noise_floor, w, h, med, 1, num_threads, L); + } + + float noise = alpha * 0.01f; + + if (settings->verbose) { + std::cout << "ToneMapFattal02: alpha = " << alpha << ", beta = " << beta + << ", detail_level = " << detail_level << std::endl; + } + + rescale_nearest (Yr, L, multiThread); + tmo_fattal02 (w2, h2, L, L, alpha, beta, noise, detail_level, multiThread); + + const float hr = float(h2) / float(h); + const float wr = float(w2) / float(w); + + float newMedian; + findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), percentile, newMedian, percentile, newMedian, multiThread); + const float scale = (oldMedian == 0.f || newMedian == 0.f) ? 65535.f : (oldMedian / newMedian); // avoid Nan + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if(multiThread) +#endif + for (int y = 0; y < h; y++) { + int yy = y * hr + 1; + + for (int x = 0; x < w; x++) { + int xx = x * wr + 1; + + float Y = std::max(Yr (x, y), epsilon); + float l = std::max (L (xx, yy), epsilon) * (scale / Y); + rgb->r (y, x) = std::max (rgb->r (y, x), 0.f) * l; + rgb->g (y, x) = std::max (rgb->g (y, x), 0.f) * l; + rgb->b (y, x) = std::max (rgb->b (y, x), 0.f) * l; + + assert (std::isfinite (rgb->r (y, x))); + assert (std::isfinite (rgb->g (y, x))); + assert (std::isfinite (rgb->b (y, x))); + } + } +} + + +} // namespace rtengine diff -Nru rawtherapee-5.3/rtengine/utils.h rawtherapee-5.4/rtengine/utils.h --- rawtherapee-5.3/rtengine/utils.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtengine/utils.h 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,7 @@ void vflip(unsigned char* img, int w, int h); template -typename std::underlying_type::type toUnderlying(ENUM value) +constexpr typename std::underlying_type::type toUnderlying(ENUM value) { return static_cast::type>(value); } diff -Nru rawtherapee-5.3/rtexif/canonattribs.cc rawtherapee-5.4/rtexif/canonattribs.cc --- rawtherapee-5.3/rtexif/canonattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/canonattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -555,357 +555,367 @@ public: CALensInterpreter () { - choices.insert (p_t (1, "Canon EF 50mm f/1.8")); - choices.insert (p_t (2, "Canon EF 28mm f/2.8")); - choices.insert (p_t (3, "Canon EF 135mm f/2.8 Soft")); - choices.insert (p_t (4, "Canon EF 35-105mm f/3.5-4.5 or Sigma Lens")); - choices.insert (p_t (4, "Sigma UC Zoom 35-135mm f/4-5.6")); - choices.insert (p_t (5, "Canon EF 35-70mm f/3.5-4.5")); - choices.insert (p_t (6, "Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens")); - choices.insert (p_t (6, "Sigma 18-50mm f/3.5-5.6 DC")); - choices.insert (p_t (6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP")); - choices.insert (p_t (6, "Tokina AF 193-2 19-35mm f/3.5-4.5")); - choices.insert (p_t (6, "Sigma 28-80mm f/3.5-5.6 II Macro")); - choices.insert (p_t (7, "Canon EF 100-300mm f/5.6L")); - choices.insert (p_t (8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens")); - choices.insert (p_t (8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro")); - choices.insert (p_t (8, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6")); - choices.insert (p_t (9, "Canon EF 70-210mm f/4")); - choices.insert (p_t (9, "Sigma 55-200mm f/4-5.6 DC")); - choices.insert (p_t (10, "Canon EF 50mm f/2.5 Macro or Sigma Lens")); - choices.insert (p_t (10, "Sigma 50mm f/2.8 EX")); - choices.insert (p_t (10, "Sigma 28mm f/1.8")); - choices.insert (p_t (10, "Sigma 105mm f/2.8 Macro EX")); - choices.insert (p_t (10, "Sigma 70mm f/2.8 EX DG Macro EF")); - choices.insert (p_t (11, "Canon EF 35mm f/2")); - choices.insert (p_t (13, "Canon EF 15mm f/2.8 Fisheye")); - choices.insert (p_t (14, "Canon EF 50-200mm f/3.5-4.5L")); - choices.insert (p_t (15, "Canon EF 50-200mm f/3.5-4.5")); - choices.insert (p_t (16, "Canon EF 35-135mm f/3.5-4.5")); - choices.insert (p_t (17, "Canon EF 35-70mm f/3.5-4.5A")); - choices.insert (p_t (18, "Canon EF 28-70mm f/3.5-4.5")); - choices.insert (p_t (20, "Canon EF 100-200mm f/4.5A")); - choices.insert (p_t (21, "Canon EF 80-200mm f/2.8L")); - choices.insert (p_t (22, "Canon EF 20-35mm f/2.8L or Tokina Lens")); - choices.insert (p_t (22, "Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical")); - choices.insert (p_t (23, "Canon EF 35-105mm f/3.5-4.5")); - choices.insert (p_t (24, "Canon EF 35-80mm f/4-5.6 Power Zoom")); - choices.insert (p_t (25, "Canon EF 35-80mm f/4-5.6 Power Zoom")); - choices.insert (p_t (26, "Canon EF 100mm f/2.8 Macro or Other Lens")); - choices.insert (p_t (26, "Cosina 100mm f/3.5 Macro AF")); - choices.insert (p_t (26, "Tamron SP AF 90mm f/2.8 Di Macro")); - choices.insert (p_t (26, "Tamron SP AF 180mm f/3.5 Di Macro")); - choices.insert (p_t (26, "Carl Zeiss Planar T* 50mm f/1.4")); - choices.insert (p_t (27, "Canon EF 35-80mm f/4-5.6")); - choices.insert (p_t (28, "Canon EF 80-200mm f/4.5-5.6 or Tamron Lens")); - choices.insert (p_t (28, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF")); - choices.insert (p_t (28, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro")); - choices.insert (p_t (28, "Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro")); - choices.insert (p_t (28, "Tamron AF Aspherical 28-200mm f/3.8-5.6")); - choices.insert (p_t (29, "Canon EF 50mm f/1.8 II")); - choices.insert (p_t (30, "Canon EF 35-105mm f/4.5-5.6")); - choices.insert (p_t (31, "Canon EF 75-300mm f/4-5.6 or Tamron Lens")); - choices.insert (p_t (31, "Tamron SP AF 300mm f/2.8 LD IF")); - choices.insert (p_t (32, "Canon EF 24mm f/2.8 or Sigma Lens")); - choices.insert (p_t (32, "Sigma 15mm f/2.8 EX Fisheye")); - choices.insert (p_t (33, "Voigtlander or Carl Zeiss Lens")); - choices.insert (p_t (33, "Voigtlander Ultron 40mm f/2 SLII Aspherical")); - choices.insert (p_t (33, "Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical")); - choices.insert (p_t (33, "Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 15mm f/2.8 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 18mm f/3.5 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 21mm f/2.8 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 25mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 28mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 35mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Distagon T* 35mm f/1.4 ZE")); - choices.insert (p_t (33, "Carl Zeiss Planar T* 50mm f/1.4 ZE")); - choices.insert (p_t (33, "Carl Zeiss Makro-Planar T* 50mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Makro-Planar T* 100mm f/2 ZE")); - choices.insert (p_t (33, "Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE")); - choices.insert (p_t (35, "Canon EF 35-80mm f/4-5.6")); - choices.insert (p_t (36, "Canon EF 38-76mm f/4.5-5.6")); - choices.insert (p_t (37, "Canon EF 35-80mm f/4-5.6 or Tamron Lens")); - choices.insert (p_t (37, "Tamron 70-200mm f/2.8 Di LD IF Macro")); - choices.insert (p_t (37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20")); - choices.insert (p_t (37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]")); - choices.insert (p_t (37, "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro")); - choices.insert (p_t (38, "Canon EF 80-200mm f/4.5-5.6")); - choices.insert (p_t (39, "Canon EF 75-300mm f/4-5.6")); - choices.insert (p_t (40, "Canon EF 28-80mm f/3.5-5.6")); - choices.insert (p_t (41, "Canon EF 28-90mm f/4-5.6")); - choices.insert (p_t (42, "Canon EF 28-200mm f/3.5-5.6 or Tamron Lens")); - choices.insert (p_t (42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20")); - choices.insert (p_t (43, "Canon EF 28-105mm f/4-5.6")); - choices.insert (p_t (44, "Canon EF 90-300mm f/4.5-5.6")); - choices.insert (p_t (45, "Canon EF-S 18-55mm f/3.5-5.6 [II]")); - choices.insert (p_t (46, "Canon EF 28-90mm f/4-5.6")); - choices.insert (p_t (47, "Zeiss Milvus 35mm f/2 or 50mm f/2")); - choices.insert (p_t (47, "Zeiss Milvus 50mm f/2 Makro")); - choices.insert (p_t (48, "Canon EF-S 18-55mm f/3.5-5.6 IS")); - choices.insert (p_t (49, "Canon EF-S 55-250mm f/4-5.6 IS")); - choices.insert (p_t (50, "Canon EF-S 18-200mm f/3.5-5.6 IS")); - choices.insert (p_t (51, "Canon EF-S 18-135mm f/3.5-5.6 IS")); - choices.insert (p_t (52, "Canon EF-S 18-55mm f/3.5-5.6 IS II")); - choices.insert (p_t (53, "Canon EF-S 18-55mm f/3.5-5.6 III")); - choices.insert (p_t (54, "Canon EF-S 55-250mm f/4-5.6 IS II")); - choices.insert (p_t (60, "Irix 11mm f/4")); - choices.insert (p_t (94, "Canon TS-E 17mm f/4L")); - choices.insert (p_t (95, "Canon TS-E 24.0mm f/3.5 L II")); - choices.insert (p_t (124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo")); - choices.insert (p_t (125, "Canon TS-E 24mm f/3.5L")); - choices.insert (p_t (126, "Canon TS-E 45mm f/2.8")); - choices.insert (p_t (127, "Canon TS-E 90mm f/2.8")); - choices.insert (p_t (129, "Canon EF 300mm f/2.8L")); - choices.insert (p_t (130, "Canon EF 50mm f/1.0L")); - choices.insert (p_t (131, "Canon EF 28-80mm f/2.8-4L or Sigma Lens")); - choices.insert (p_t (131, "Sigma 8mm f/3.5 EX DG Circular Fisheye")); - choices.insert (p_t (131, "Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM")); - choices.insert (p_t (131, "Sigma 17-70mm f/2.8-4.5 DC Macro")); - choices.insert (p_t (131, "Sigma APO 50-150mm f/2.8 [II] EX DC HSM")); - choices.insert (p_t (131, "Sigma APO 120-300mm f/2.8 EX DG HSM")); - choices.insert (p_t (131, "Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye")); - choices.insert (p_t (131, "Sigma 70-200mm f/2.8 APO EX HSM")); - choices.insert (p_t (132, "Canon EF 1200mm f/5.6L")); - choices.insert (p_t (134, "Canon EF 600mm f/4L IS")); - choices.insert (p_t (135, "Canon EF 200mm f/1.8L")); - choices.insert (p_t (136, "Canon EF 300mm f/2.8L")); - choices.insert (p_t (137, "Canon EF 85mm f/1.2L or Sigma or Tamron Lens")); - choices.insert (p_t (137, "Sigma 18-50mm f/2.8-4.5 DC OS HSM")); - choices.insert (p_t (137, "Sigma 50-200mm f/4-5.6 DC OS HSM")); - choices.insert (p_t (137, "Sigma 18-250mm f/3.5-6.3 DC OS HSM")); - choices.insert (p_t (137, "Sigma 24-70mm f/2.8 IF EX DG HSM")); - choices.insert (p_t (137, "Sigma 18-125mm f/3.8-5.6 DC OS HSM")); - choices.insert (p_t (137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C")); - choices.insert (p_t (137, "Sigma 17-50mm f/2.8 OS HSM")); - choices.insert (p_t (137, "Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]")); - choices.insert (p_t (137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD")); - choices.insert (p_t (137, "Sigma 8-16mm f/4.5-5.6 DC HSM")); - choices.insert (p_t (137, "Tamron SP 17-50mm f/2.8 XR Di II VC")); - choices.insert (p_t (137, "Tamron SP 60mm f/2 Macro Di II")); - choices.insert (p_t (137, "Sigma 10-20mm f/3.5 EX DC HSM")); - choices.insert (p_t (137, "Tamron SP 24-70mm f/2.8 Di VC USD")); - choices.insert (p_t (137, "Sigma 18-35mm f/1.8 DC HSM")); - choices.insert (p_t (137, "Sigma 12-24mm f/4.5-5.6 DG HSM II")); - choices.insert (p_t (138, "Canon EF 28-80mm f/2.8-4L")); - choices.insert (p_t (139, "Canon EF 400mm f/2.8L")); - choices.insert (p_t (140, "Canon EF 500mm f/4.5L")); - choices.insert (p_t (141, "Canon EF 500mm f/4.5L")); - choices.insert (p_t (142, "Canon EF 300mm f/2.8L IS")); - choices.insert (p_t (143, "Canon EF 500mm f/4L IS or Sigma Lens")); - choices.insert (p_t (143, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM")); - choices.insert (p_t (144, "Canon EF 35-135mm f/4-5.6 USM")); - choices.insert (p_t (145, "Canon EF 100-300mm f/4.5-5.6 USM")); - choices.insert (p_t (146, "Canon EF 70-210mm f/3.5-4.5 USM")); - choices.insert (p_t (147, "Canon EF 35-135mm f/4-5.6 USM")); - choices.insert (p_t (148, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (149, "Canon EF 100mm f/2 USM")); - choices.insert (p_t (150, "Canon EF 14mm f/2.8L or Sigma Lens")); - choices.insert (p_t (150, "Sigma 20mm EX f/1.8")); - choices.insert (p_t (150, "Sigma 30mm f/1.4 DC HSM")); - choices.insert (p_t (150, "Sigma 24mm f/1.8 DG Macro EX")); - choices.insert (p_t (150, "Sigma 28mm f/1.8 DG Macro EX")); - choices.insert (p_t (151, "Canon EF 200mm f/2.8L")); - choices.insert (p_t (152, "Canon EF 300mm f/4L IS or Sigma Lens")); - choices.insert (p_t (152, "Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM")); - choices.insert (p_t (152, "Sigma 14mm f/2.8 EX Aspherical HSM")); - choices.insert (p_t (152, "Sigma 10-20mm f/4-5.6")); - choices.insert (p_t (152, "Sigma 100-300mm f/4")); - choices.insert (p_t (153, "Canon EF 35-350mm f/3.5-5.6L or Sigma or Tamron Lens")); - choices.insert (p_t (153, "Sigma 50-500mm f/4-6.3 APO HSM EX")); - choices.insert (p_t (153, "Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro")); - choices.insert (p_t (153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14")); - choices.insert (p_t (153, "Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro")); - choices.insert (p_t (154, "Canon EF 20mm f/2.8 USM or Zeiss Lens")); - choices.insert (p_t (154, "Zeiss Milvus 21mm f/2.8")); - choices.insert (p_t (155, "Canon EF 85mm f/1.8 USM")); - choices.insert (p_t (156, "Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens")); - choices.insert (p_t (156, "Tamron SP 70-300mm f/4.0-5.6 Di VC USD")); - choices.insert (p_t (156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF")); - choices.insert (p_t (160, "Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens")); - choices.insert (p_t (160, "Tamron AF 19-35mm f/3.5-4.5")); - choices.insert (p_t (160, "Tokina AT-X 124 AF Pro DX 12-24mm f/4")); - choices.insert (p_t (160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye")); - choices.insert (p_t (160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8")); - choices.insert (p_t (160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8")); - choices.insert (p_t (161, "Canon EF 28-70mm f/2.8L or Sigma or Tamron Lens")); - choices.insert (p_t (161, "Sigma 24-70mm f/2.8 EX")); - choices.insert (p_t (161, "Sigma 28-70mm f/2.8 EX")); - choices.insert (p_t (161, "Sigma 24-60mm f/2.8 EX DG")); - choices.insert (p_t (161, "Tamron AF 17-50mm f/2.8 Di-II LD Aspherical")); - choices.insert (p_t (161, "Tamron 90mm f/2.8")); - choices.insert (p_t (161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF")); - choices.insert (p_t (161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro")); - choices.insert (p_t (162, "Canon EF 200mm f/2.8L")); - choices.insert (p_t (163, "Canon EF 300mm f/4L")); - choices.insert (p_t (164, "Canon EF 400mm f/5.6L")); - choices.insert (p_t (165, "Canon EF 70-200mm f/2.8 L")); - choices.insert (p_t (166, "Canon EF 70-200mm f/2.8 L + 1.4x")); - choices.insert (p_t (167, "Canon EF 70-200mm f/2.8 L + 2x")); - choices.insert (p_t (168, "Canon EF 28mm f/1.8 USM or Sigma Lens")); - choices.insert (p_t (168, "Sigma 50-100mm f/1.8 DC HSM | A")); - choices.insert (p_t (169, "Canon EF 17-35mm f/2.8L or Sigma Lens")); - choices.insert (p_t (169, "Sigma 18-200mm f/3.5-6.3 DC OS")); - choices.insert (p_t (169, "Sigma 15-30mm f/3.5-4.5 EX DG Aspherical")); - choices.insert (p_t (169, "Sigma 18-50mm f/2.8 Macro")); - choices.insert (p_t (169, "Sigma 50mm f/1.4 EX DG HSM")); - choices.insert (p_t (169, "Sigma 85mm f/1.4 EX DG HSM")); - choices.insert (p_t (169, "Sigma 30mm f/1.4 EX DC HSM")); - choices.insert (p_t (169, "Sigma 35mm f/1.4 DG HSM")); - choices.insert (p_t (170, "Canon EF 200mm f/2.8L II")); - choices.insert (p_t (171, "Canon EF 300mm f/4L")); - choices.insert (p_t (172, "Canon EF 400mm f/5.6L or Sigma Lens")); - choices.insert (p_t (172, "Sigma 150-600mm f/5-6.3 DG OS HSM | S")); - choices.insert (p_t (173, "Canon EF 180mm Macro f/3.5L or Sigma Lens")); - choices.insert (p_t (173, "Sigma 180mm EX HSM Macro f/3.5")); - choices.insert (p_t (173, "Sigma APO Macro 150mm f/2.8 EX DG HSM")); - choices.insert (p_t (174, "Canon EF 135mm f/2L or Other Lens")); - choices.insert (p_t (174, "Sigma 70-200mm f/2.8 EX DG APO OS HSM")); - choices.insert (p_t (174, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM")); - choices.insert (p_t (174, "Sigma 150-500mm f/5-6.3 APO DG OS HSM")); - choices.insert (p_t (174, "Zeiss Milvus 100mm f/2 Makro")); - choices.insert (p_t (175, "Canon EF 400mm f/2.8L")); - choices.insert (p_t (176, "Canon EF 24-85mm f/3.5-4.5 USM")); - choices.insert (p_t (177, "Canon EF 300mm f/4L IS")); - choices.insert (p_t (178, "Canon EF 28-135mm f/3.5-5.6 IS")); - choices.insert (p_t (179, "Canon EF 24mm f/1.4L")); - choices.insert (p_t (180, "Canon EF 35mm f/1.4L or Other Lens")); - choices.insert (p_t (180, "Sigma 50mm f/1.4 DG HSM | A")); - choices.insert (p_t (180, "Sigma 24mm f/1.4 DG HSM | A")); - choices.insert (p_t (180, "Zeiss Milvus 50mm f/1.4")); - choices.insert (p_t (180, "Zeiss Milvus 85mm f/1.4")); - choices.insert (p_t (180, "Zeiss Otus 28mm f/1.4 ZE")); - choices.insert (p_t (181, "Canon EF 100-400mm f/4.5-5.6L IS + 1.4x or Sigma Lens")); - choices.insert (p_t (181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x")); - choices.insert (p_t (182, "Canon EF 100-400mm f/4.5-5.6L IS + 2x or Sigma Lens")); - choices.insert (p_t (182, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x")); - choices.insert (p_t (183, "Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens")); - choices.insert (p_t (183, "Sigma 150mm f/2.8 EX DG OS HSM APO Macro")); - choices.insert (p_t (183, "Sigma 105mm f/2.8 EX DG OS HSM Macro")); - choices.insert (p_t (183, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro")); - choices.insert (p_t (183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C")); - choices.insert (p_t (183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S")); - choices.insert (p_t (183, "Sigma 100-400mm f/5-6.3 DG OS HSM")); - choices.insert (p_t (184, "Canon EF 400mm f/2.8L + 2x")); - choices.insert (p_t (185, "Canon EF 600mm f/4L IS")); - choices.insert (p_t (186, "Canon EF 70-200mm f/4L")); - choices.insert (p_t (187, "Canon EF 70-200mm f/4L + 1.4x")); - choices.insert (p_t (188, "Canon EF 70-200mm f/4L + 2x")); - choices.insert (p_t (189, "Canon EF 70-200mm f/4L + 2.8x")); - choices.insert (p_t (190, "Canon EF 100mm f/2.8 Macro USM")); - choices.insert (p_t (191, "Canon EF 400mm f/4 DO IS")); - choices.insert (p_t (193, "Canon EF 35-80mm f/4-5.6 USM")); - choices.insert (p_t (194, "Canon EF 80-200mm f/4.5-5.6 USM")); - choices.insert (p_t (195, "Canon EF 35-105mm f/4.5-5.6 USM")); - choices.insert (p_t (196, "Canon EF 75-300mm f/4-5.6 USM")); - choices.insert (p_t (197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens")); - choices.insert (p_t (197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS")); - choices.insert (p_t (198, "Canon EF 50mm f/1.4 USM or Zeiss Lens")); - choices.insert (p_t (198, "Zeiss Otus 55mm f/1.4 ZE")); - choices.insert (p_t (198, "Zeiss Otus 85mm f/1.4 ZE")); - choices.insert (p_t (199, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (200, "Canon EF 75-300mm f/4-5.6 USM")); - choices.insert (p_t (201, "Canon EF 28-80mm f/3.5-5.6 USM")); - choices.insert (p_t (202, "Canon EF 28-80mm f/3.5-5.6 USM IV")); - choices.insert (p_t (208, "Canon EF 22-55mm f/4-5.6 USM")); - choices.insert (p_t (209, "Canon EF 55-200mm f/4.5-5.6")); - choices.insert (p_t (210, "Canon EF 28-90mm f/4-5.6 USM")); - choices.insert (p_t (211, "Canon EF 28-200mm f/3.5-5.6 USM")); - choices.insert (p_t (212, "Canon EF 28-105mm f/4-5.6 USM")); - choices.insert (p_t (213, "Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens")); - choices.insert (p_t (213, "Tamron SP 150-600mm f/5-6.3 Di VC USD")); - choices.insert (p_t (213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro")); - choices.insert (p_t (213, "Tamron SP 35mm f/1.8 Di VC USD")); - choices.insert (p_t (213, "Tamron SP 45mm f/1.8 Di VC USD")); - choices.insert (p_t (214, "Canon EF-S 18-55mm f/3.5-5.6 USM")); - choices.insert (p_t (215, "Canon EF 55-200mm f/4.5-5.6 II USM")); - choices.insert (p_t (217, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD")); - choices.insert (p_t (224, "Canon EF 70-200mm f/2.8L IS")); - choices.insert (p_t (225, "Canon EF 70-200mm f/2.8L IS + 1.4x")); - choices.insert (p_t (226, "Canon EF 70-200mm f/2.8L IS + 2x")); - choices.insert (p_t (227, "Canon EF 70-200mm f/2.8L IS + 2.8x")); - choices.insert (p_t (228, "Canon EF 28-105mm f/3.5-4.5 USM")); - choices.insert (p_t (229, "Canon EF 16-35mm f/2.8L")); - choices.insert (p_t (230, "Canon EF 24-70mm f/2.8L")); - choices.insert (p_t (231, "Canon EF 17-40mm f/4L")); - choices.insert (p_t (232, "Canon EF 70-300mm f/4.5-5.6 DO IS USM")); - choices.insert (p_t (233, "Canon EF 28-300mm f/3.5-5.6L IS")); - choices.insert (p_t (234, "Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens")); - choices.insert (p_t (234, "Tokina AT-X 12-28 PRO DX 12-28mm f/4")); - choices.insert (p_t (235, "Canon EF-S 10-22mm f/3.5-4.5 USM")); - choices.insert (p_t (236, "Canon EF-S 60mm f/2.8 Macro USM")); - choices.insert (p_t (237, "Canon EF 24-105mm f/4L IS")); - choices.insert (p_t (238, "Canon EF 70-300mm f/4-5.6 IS USM")); - choices.insert (p_t (239, "Canon EF 85mm f/1.2L II")); - choices.insert (p_t (240, "Canon EF-S 17-55mm f/2.8 IS USM")); - choices.insert (p_t (241, "Canon EF 50mm f/1.2L")); - choices.insert (p_t (242, "Canon EF 70-200mm f/4L IS")); - choices.insert (p_t (243, "Canon EF 70-200mm f/4L IS + 1.4x")); - choices.insert (p_t (244, "Canon EF 70-200mm f/4L IS + 2x")); - choices.insert (p_t (245, "Canon EF 70-200mm f/4L IS + 2.8x")); - choices.insert (p_t (246, "Canon EF 16-35mm f/2.8L II")); - choices.insert (p_t (247, "Canon EF 14mm f/2.8L II USM")); - choices.insert (p_t (248, "Canon EF 200mm f/2L IS or Sigma Lens")); - choices.insert (p_t (248, "Sigma 24-35mm f/2 DG HSM | A")); - choices.insert (p_t (249, "Canon EF 800mm f/5.6L IS")); - choices.insert (p_t (250, "Canon EF 24mm f/1.4L II or Sigma Lens")); - choices.insert (p_t (250, "Sigma 20mm f/1.4 DG HSM | A")); - choices.insert (p_t (251, "Canon EF 70-200mm f/2.8L IS II USM")); - choices.insert (p_t (252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x")); - choices.insert (p_t (253, "Canon EF 70-200mm f/2.8L IS II USM + 2x")); - choices.insert (p_t (254, "Canon EF 100mm f/2.8L Macro IS USM")); - choices.insert (p_t (255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens")); - choices.insert (p_t (255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro")); - choices.insert (p_t (488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM")); - choices.insert (p_t (489, "Canon EF 70-300mm f/4-5.6L IS USM")); - choices.insert (p_t (490, "Canon EF 8-15mm f/4L Fisheye USM")); - choices.insert (p_t (491, "Canon EF 300mm f/2.8L IS II USM or Tamron Lens")); - choices.insert (p_t (491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)")); - choices.insert (p_t (491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)")); - choices.insert (p_t (492, "Canon EF 400mm f/2.8L IS II USM")); - choices.insert (p_t (493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM")); - choices.insert (p_t (493, "Canon EF 24-105mm f/4L IS USM")); - choices.insert (p_t (494, "Canon EF 600mm f/4.0L IS II USM")); - choices.insert (p_t (495, "Canon EF 24-70mm f/2.8L II USM or Sigma Lens")); - choices.insert (p_t (495, "Sigma 24-70mm F2.8 DG OS HSM | A")); - choices.insert (p_t (496, "Canon EF 200-400mm f/4L IS USM")); - choices.insert (p_t (499, "Canon EF 200-400mm f/4L IS USM + 1.4x")); - choices.insert (p_t (502, "Canon EF 28mm f/2.8 IS USM")); - choices.insert (p_t (503, "Canon EF 24mm f/2.8 IS USM")); - choices.insert (p_t (504, "Canon EF 24-70mm f/4L IS USM")); - choices.insert (p_t (505, "Canon EF 35mm f/2 IS USM")); - choices.insert (p_t (506, "Canon EF 400mm f/4 DO IS II USM")); - choices.insert (p_t (507, "Canon EF 16-35mm f/4L IS USM")); - choices.insert (p_t (508, "Canon EF 11-24mm f/4L USM or Tamron Lens")); - choices.insert (p_t (508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD")); - choices.insert (p_t (747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens")); - choices.insert (p_t (747, "Tamron SP 150-600mm F5-6.3 Di VC USD G2")); - choices.insert (p_t (748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x")); - choices.insert (p_t (750, "Canon EF 35mm f/1.4L II USM")); - choices.insert (p_t (751, "Canon EF 16-35mm f/2.8L III USM")); - choices.insert (p_t (752, "Canon EF 24-105mm f/4L IS II USM")); - choices.insert (p_t (4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM")); - choices.insert (p_t (4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens")); - choices.insert (p_t (4143, "Tamron 18-200mm f/3.5-6.3 Di III VC")); - choices.insert (p_t (4144, "Canon EF 40mm f/2.8 STM")); - choices.insert (p_t (4145, "Canon EF-M 22mm f/2 STM")); - choices.insert (p_t (4146, "Canon EF-S 18-55mm f/3.5-5.6 IS STM")); - choices.insert (p_t (4147, "Canon EF-M 11-22mm f/4-5.6 IS STM")); - choices.insert (p_t (4148, "Canon EF-S 55-250mm f/4-5.6 IS STM")); - choices.insert (p_t (4149, "Canon EF-M 55-200mm f/4.5-6.3 IS STM")); - choices.insert (p_t (4150, "Canon EF-S 10-18mm f/4.5-5.6 IS STM")); - choices.insert (p_t (4152, "Canon EF 24-105mm f/3.5-5.6 IS STM")); - choices.insert (p_t (4153, "Canon EF-M 15-45mm f/3.5-6.3 IS STM")); - choices.insert (p_t (4154, "Canon EF-S 24mm f/2.8 STM")); - choices.insert (p_t (4155, "Canon EF-M 28mm f/3.5 Macro IS STM")); - choices.insert (p_t (4156, "Canon EF 50mm f/1.8 STM")); - choices.insert (p_t (4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM")); - choices.insert (p_t (4158, "Canon EF-S 18-55mm f/4-5.6 IS STM")); - choices.insert (p_t (4160, "Canon EF-S 35mm f/2.8 Macro IS STM")); - choices.insert (p_t (36910, "Canon EF 70-300mm f/4-5.6 IS II USM")); - choices.insert (p_t (36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM")); - choices.insert (p_t (61494, "Canon CN-E 85mm T1.3 L F")); - choices.insert (p_t (65535, "n/a")); + choices = { + {1, "Canon EF 50mm f/1.8"}, + {2, "Canon EF 28mm f/2.8"}, + {3, "Canon EF 135mm f/2.8 Soft"}, + {4, "Canon EF 35-105mm f/3.5-4.5 or Sigma Lens"}, + {4, "Sigma UC Zoom 35-135mm f/4-5.6"}, + {5, "Canon EF 35-70mm f/3.5-4.5"}, + {6, "Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens"}, + {6, "Sigma 18-50mm f/3.5-5.6 DC"}, + {6, "Sigma 18-125mm f/3.5-5.6 DC IF ASP"}, + {6, "Tokina AF 193-2 19-35mm f/3.5-4.5"}, + {6, "Sigma 28-80mm f/3.5-5.6 II Macro"}, + {7, "Canon EF 100-300mm f/5.6L"}, + {8, "Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens"}, + {8, "Sigma 70-300mm f/4-5.6 [APO] DG Macro"}, + {8, "Tokina AT-X 242 AF 24-200mm f/3.5-5.6"}, + {9, "Canon EF 70-210mm f/4"}, + {9, "Sigma 55-200mm f/4-5.6 DC"}, + {10, "Canon EF 50mm f/2.5 Macro or Sigma Lens"}, + {10, "Sigma 50mm f/2.8 EX"}, + {10, "Sigma 28mm f/1.8"}, + {10, "Sigma 105mm f/2.8 Macro EX"}, + {10, "Sigma 70mm f/2.8 EX DG Macro EF"}, + {11, "Canon EF 35mm f/2"}, + {13, "Canon EF 15mm f/2.8 Fisheye"}, + {14, "Canon EF 50-200mm f/3.5-4.5L"}, + {15, "Canon EF 50-200mm f/3.5-4.5"}, + {16, "Canon EF 35-135mm f/3.5-4.5"}, + {17, "Canon EF 35-70mm f/3.5-4.5A"}, + {18, "Canon EF 28-70mm f/3.5-4.5"}, + {20, "Canon EF 100-200mm f/4.5A"}, + {21, "Canon EF 80-200mm f/2.8L"}, + {22, "Canon EF 20-35mm f/2.8L or Tokina Lens"}, + {22, "Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical"}, + {23, "Canon EF 35-105mm f/3.5-4.5"}, + {24, "Canon EF 35-80mm f/4-5.6 Power Zoom"}, + {25, "Canon EF 35-80mm f/4-5.6 Power Zoom"}, + {26, "Canon EF 100mm f/2.8 Macro or Other Lens"}, + {26, "Cosina 100mm f/3.5 Macro AF"}, + {26, "Tamron SP AF 90mm f/2.8 Di Macro"}, + {26, "Tamron SP AF 180mm f/3.5 Di Macro"}, + {26, "Carl Zeiss Planar T* 50mm f/1.4"}, + {27, "Canon EF 35-80mm f/4-5.6"}, + {28, "Canon EF 80-200mm f/4.5-5.6 or Tamron Lens"}, + {28, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, + {28, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {28, "Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro"}, + {28, "Tamron AF Aspherical 28-200mm f/3.8-5.6"}, + {29, "Canon EF 50mm f/1.8 II"}, + {30, "Canon EF 35-105mm f/4.5-5.6"}, + {31, "Canon EF 75-300mm f/4-5.6 or Tamron Lens"}, + {31, "Tamron SP AF 300mm f/2.8 LD IF"}, + {32, "Canon EF 24mm f/2.8 or Sigma Lens"}, + {32, "Sigma 15mm f/2.8 EX Fisheye"}, + {33, "Voigtlander or Carl Zeiss Lens"}, + {33, "Voigtlander Ultron 40mm f/2 SLII Aspherical"}, + {33, "Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical"}, + {33, "Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus"}, + {33, "Carl Zeiss Distagon T* 15mm f/2.8 ZE"}, + {33, "Carl Zeiss Distagon T* 18mm f/3.5 ZE"}, + {33, "Carl Zeiss Distagon T* 21mm f/2.8 ZE"}, + {33, "Carl Zeiss Distagon T* 25mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 28mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 35mm f/2 ZE"}, + {33, "Carl Zeiss Distagon T* 35mm f/1.4 ZE"}, + {33, "Carl Zeiss Planar T* 50mm f/1.4 ZE"}, + {33, "Carl Zeiss Makro-Planar T* 50mm f/2 ZE"}, + {33, "Carl Zeiss Makro-Planar T* 100mm f/2 ZE"}, + {33, "Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE"}, + {35, "Canon EF 35-80mm f/4-5.6"}, + {36, "Canon EF 38-76mm f/4.5-5.6"}, + {37, "Canon EF 35-80mm f/4-5.6 or Tamron Lens"}, + {37, "Tamron 70-200mm f/2.8 Di LD IF Macro"}, + {37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]"}, + {37, "Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro"}, + {38, "Canon EF 80-200mm f/4.5-5.6"}, + {39, "Canon EF 75-300mm f/4-5.6"}, + {40, "Canon EF 28-80mm f/3.5-5.6"}, + {41, "Canon EF 28-90mm f/4-5.6"}, + {42, "Canon EF 28-200mm f/3.5-5.6 or Tamron Lens"}, + {42, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20"}, + {43, "Canon EF 28-105mm f/4-5.6"}, + {44, "Canon EF 90-300mm f/4.5-5.6"}, + {45, "Canon EF-S 18-55mm f/3.5-5.6 [II]"}, + {46, "Canon EF 28-90mm f/4-5.6"}, + {47, "Zeiss Milvus 35mm f/2 or 50mm f/2"}, + {47, "Zeiss Milvus 50mm f/2 Makro"}, + {48, "Canon EF-S 18-55mm f/3.5-5.6 IS"}, + {49, "Canon EF-S 55-250mm f/4-5.6 IS"}, + {50, "Canon EF-S 18-200mm f/3.5-5.6 IS"}, + {51, "Canon EF-S 18-135mm f/3.5-5.6 IS"}, + {52, "Canon EF-S 18-55mm f/3.5-5.6 IS II"}, + {53, "Canon EF-S 18-55mm f/3.5-5.6 III"}, + {54, "Canon EF-S 55-250mm f/4-5.6 IS II"}, + {60, "Irix 11mm f/4"}, + {80, "Canon TS-E 50mm f/2.8L Macro"}, + {81, "Canon TS-E 90mm f/2.8L Macro"}, + {82, "Canon TS-E 135mm f/4L Macro"}, + {94, "Canon TS-E 17mm f/4L"}, + {95, "Canon TS-E 24mm f/3.5L II"}, + {124, "Canon MP-E 65mm f/2.8 1-5x Macro Photo"}, + {125, "Canon TS-E 24mm f/3.5L"}, + {126, "Canon TS-E 45mm f/2.8"}, + {127, "Canon TS-E 90mm f/2.8"}, + {129, "Canon EF 300mm f/2.8L USM"}, + {130, "Canon EF 50mm f/1.0L USM"}, + {131, "Canon EF 28-80mm f/2.8-4L USM or Sigma Lens"}, + {131, "Sigma 8mm f/3.5 EX DG Circular Fisheye"}, + {131, "Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM"}, + {131, "Sigma 17-70mm f/2.8-4.5 DC Macro"}, + {131, "Sigma APO 50-150mm f/2.8 [II] EX DC HSM"}, + {131, "Sigma APO 120-300mm f/2.8 EX DG HSM"}, + {131, "Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye"}, + {131, "Sigma 70-200mm f/2.8 APO EX HSM"}, + {132, "Canon EF 1200mm f/5.6L USM"}, + {134, "Canon EF 600mm f/4L IS USM"}, + {135, "Canon EF 200mm f/1.8L USM"}, + {136, "Canon EF 300mm f/2.8L USM"}, + {137, "Canon EF 85mm f/1.2L USM or Sigma or Tamron Lens"}, + {137, "Sigma 18-50mm f/2.8-4.5 DC OS HSM"}, + {137, "Sigma 50-200mm f/4-5.6 DC OS HSM"}, + {137, "Sigma 18-250mm f/3.5-6.3 DC OS HSM"}, + {137, "Sigma 24-70mm f/2.8 IF EX DG HSM"}, + {137, "Sigma 18-125mm f/3.8-5.6 DC OS HSM"}, + {137, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, + {137, "Sigma 17-50mm f/2.8 OS HSM"}, + {137, "Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]"}, + {137, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD"}, + {137, "Sigma 8-16mm f/4.5-5.6 DC HSM"}, + {137, "Tamron SP 17-50mm f/2.8 XR Di II VC"}, + {137, "Tamron SP 60mm f/2 Macro Di II"}, + {137, "Sigma 10-20mm f/3.5 EX DC HSM"}, + {137, "Tamron SP 24-70mm f/2.8 Di VC USD"}, + {137, "Sigma 18-35mm f/1.8 DC HSM"}, + {137, "Sigma 12-24mm f/4.5-5.6 DG HSM II"}, + {138, "Canon EF 28-80mm f/2.8-4L"}, + {139, "Canon EF 400mm f/2.8L USM"}, + {140, "Canon EF 500mm f/4.5L USM"}, + {141, "Canon EF 500mm f/4.5L USM"}, + {142, "Canon EF 300mm f/2.8L IS USM"}, + {143, "Canon EF 500mm f/4L IS USM or Sigma Lens"}, + {143, "Sigma 17-70mm f/2.8-4 DC Macro OS HSM"}, + {144, "Canon EF 35-135mm f/4-5.6 USM"}, + {145, "Canon EF 100-300mm f/4.5-5.6 USM"}, + {146, "Canon EF 70-210mm f/3.5-4.5 USM"}, + {147, "Canon EF 35-135mm f/4-5.6 USM"}, + {148, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {149, "Canon EF 100mm f/2 USM"}, + {150, "Canon EF 14mm f/2.8L USM or Sigma Lens"}, + {150, "Sigma 20mm EX f/1.8"}, + {150, "Sigma 30mm f/1.4 DC HSM"}, + {150, "Sigma 24mm f/1.8 DG Macro EX"}, + {150, "Sigma 28mm f/1.8 DG Macro EX"}, + {151, "Canon EF 200mm f/2.8L USM"}, + {152, "Canon EF 300mm f/4L IS USM or Sigma Lens"}, + {152, "Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM"}, + {152, "Sigma 14mm f/2.8 EX Aspherical HSM"}, + {152, "Sigma 10-20mm f/4-5.6"}, + {152, "Sigma 100-300mm f/4"}, + {153, "Canon EF 35-350mm f/3.5-5.6L USM or Sigma or Tamron Lens"}, + {153, "Sigma 50-500mm f/4-6.3 APO HSM EX"}, + {153, "Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro"}, + {153, "Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14"}, + {153, "Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro"}, + {154, "Canon EF 20mm f/2.8 USM or Zeiss Lens"}, + {154, "Zeiss Milvus 21mm f/2.8"}, + {155, "Canon EF 85mm f/1.8 USM"}, + {156, "Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens"}, + {156, "Tamron SP 70-300mm f/4-5.6 Di VC USD"}, + {156, "Tamron SP AF 28-105mm f/2.8 LD Aspherical IF"}, + {160, "Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens"}, + {160, "Tamron AF 19-35mm f/3.5-4.5"}, + {160, "Tokina AT-X 124 AF Pro DX 12-24mm f/4"}, + {160, "Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye"}, + {160, "Tokina AT-X 116 AF Pro DX 11-16mm f/2.8"}, + {160, "Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8"}, + {161, "Canon EF 28-70mm f/2.8L USM or Sigma or Tamron Lens"}, + {161, "Sigma 24-70mm f/2.8 EX"}, + {161, "Sigma 28-70mm f/2.8 EX"}, + {161, "Sigma 24-60mm f/2.8 EX DG"}, + {161, "Tamron AF 17-50mm f/2.8 Di-II LD Aspherical"}, + {161, "Tamron 90mm f/2.8"}, + {161, "Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF"}, + {161, "Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro"}, + {162, "Canon EF 200mm f/2.8L USM"}, + {163, "Canon EF 300mm f/4L"}, + {164, "Canon EF 400mm f/5.6L"}, + {165, "Canon EF 70-200mm f/2.8L USM"}, + {166, "Canon EF 70-200mm f/2.8L USM + 1.4x"}, + {167, "Canon EF 70-200mm f/2.8L USM + 2x"}, + {168, "Canon EF 28mm f/1.8 USM or Sigma Lens"}, + {168, "Sigma 50-100mm f/1.8 DC HSM | A"}, + {169, "Canon EF 17-35mm f/2.8L USM or Sigma Lens"}, + {169, "Sigma 18-200mm f/3.5-6.3 DC OS"}, + {169, "Sigma 15-30mm f/3.5-4.5 EX DG Aspherical"}, + {169, "Sigma 18-50mm f/2.8 Macro"}, + {169, "Sigma 50mm f/1.4 EX DG HSM"}, + {169, "Sigma 85mm f/1.4 EX DG HSM"}, + {169, "Sigma 30mm f/1.4 EX DC HSM"}, + {169, "Sigma 35mm f/1.4 DG HSM"}, + {170, "Canon EF 200mm f/2.8L II USM"}, + {171, "Canon EF 300mm f/4L USM"}, + {172, "Canon EF 400mm f/5.6L USM or Sigma Lens"}, + {172, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, + {173, "Canon EF 180mm Macro f/3.5L USM or Sigma Lens"}, + {173, "Sigma 180mm EX HSM Macro f/3.5"}, + {173, "Sigma APO Macro 150mm f/2.8 EX DG HSM"}, + {174, "Canon EF 135mm f/2L USM or Other Lens"}, + {174, "Sigma 70-200mm f/2.8 EX DG APO OS HSM"}, + {174, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM"}, + {174, "Sigma 150-500mm f/5-6.3 APO DG OS HSM"}, + {174, "Zeiss Milvus 100mm f/2 Makro"}, + {175, "Canon EF 400mm f/2.8L USM"}, + {176, "Canon EF 24-85mm f/3.5-4.5 USM"}, + {177, "Canon EF 300mm f/4L IS USM"}, + {178, "Canon EF 28-135mm f/3.5-5.6 IS"}, + {179, "Canon EF 24mm f/1.4L USM"}, + {180, "Canon EF 35mm f/1.4L USM or Other Lens"}, + {180, "Sigma 50mm f/1.4 DG HSM | A"}, + {180, "Sigma 24mm f/1.4 DG HSM | A"}, + {180, "Zeiss Milvus 50mm f/1.4"}, + {180, "Zeiss Milvus 85mm f/1.4"}, + {180, "Zeiss Otus 28mm f/1.4 ZE"}, + {181, "Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens"}, + {181, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x"}, + {182, "Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens"}, + {182, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x"}, + {183, "Canon EF 100-400mm f/4.5-5.6L IS USM or Sigma Lens"}, + {183, "Sigma 150mm f/2.8 EX DG OS HSM APO Macro"}, + {183, "Sigma 105mm f/2.8 EX DG OS HSM Macro"}, + {183, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | C"}, + {183, "Sigma 150-600mm f/5-6.3 DG OS HSM | S"}, + {183, "Sigma 100-400mm f/5-6.3 DG OS HSM"}, + {184, "Canon EF 400mm f/2.8L USM + 2x"}, + {185, "Canon EF 600mm f/4L IS USM"}, + {186, "Canon EF 70-200mm f/4L USM"}, + {187, "Canon EF 70-200mm f/4L USM + 1.4x"}, + {188, "Canon EF 70-200mm f/4L USM + 2x"}, + {189, "Canon EF 70-200mm f/4L USM + 2.8x"}, + {190, "Canon EF 100mm f/2.8 Macro USM"}, + {191, "Canon EF 400mm f/4 DO IS"}, + {193, "Canon EF 35-80mm f/4-5.6 USM"}, + {194, "Canon EF 80-200mm f/4.5-5.6 USM"}, + {195, "Canon EF 35-105mm f/4.5-5.6 USM"}, + {196, "Canon EF 75-300mm f/4-5.6 USM"}, + {197, "Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens"}, + {197, "Sigma 18-300mm f/3.5-6.3 DC Macro OS HS"}, + {198, "Canon EF 50mm f/1.4 USM or Zeiss Lens"}, + {198, "Zeiss Otus 55mm f/1.4 ZE"}, + {198, "Zeiss Otus 85mm f/1.4 ZE"}, + {199, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {200, "Canon EF 75-300mm f/4-5.6 USM"}, + {201, "Canon EF 28-80mm f/3.5-5.6 USM"}, + {202, "Canon EF 28-80mm f/3.5-5.6 USM IV"}, + {208, "Canon EF 22-55mm f/4-5.6 USM"}, + {209, "Canon EF 55-200mm f/4.5-5.6"}, + {210, "Canon EF 28-90mm f/4-5.6 USM"}, + {211, "Canon EF 28-200mm f/3.5-5.6 USM"}, + {212, "Canon EF 28-105mm f/4-5.6 USM"}, + {213, "Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens"}, + {213, "Tamron SP 150-600mm f/5-6.3 Di VC USD"}, + {213, "Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro"}, + {213, "Tamron SP 35mm f/1.8 Di VC USD"}, + {213, "Tamron SP 45mm f/1.8 Di VC USD"}, + {214, "Canon EF-S 18-55mm f/3.5-5.6 USM"}, + {215, "Canon EF 55-200mm f/4.5-5.6 II USM"}, + {217, "Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD"}, + {224, "Canon EF 70-200mm f/2.8L IS USM"}, + {225, "Canon EF 70-200mm f/2.8L IS USM + 1.4x"}, + {226, "Canon EF 70-200mm f/2.8L IS USM + 2x"}, + {227, "Canon EF 70-200mm f/2.8L IS USM + 2.8x"}, + {228, "Canon EF 28-105mm f/3.5-4.5 USM"}, + {229, "Canon EF 16-35mm f/2.8L USM"}, + {230, "Canon EF 24-70mm f/2.8L USM"}, + {231, "Canon EF 17-40mm f/4L USM"}, + {232, "Canon EF 70-300mm f/4.5-5.6 DO IS USM"}, + {233, "Canon EF 28-300mm f/3.5-5.6L IS USM"}, + {234, "Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens"}, + {234, "Tokina AT-X 12-28 PRO DX 12-28mm f/4"}, + {235, "Canon EF-S 10-22mm f/3.5-4.5 USM"}, + {236, "Canon EF-S 60mm f/2.8 Macro USM"}, + {237, "Canon EF 24-105mm f/4L IS USM"}, + {238, "Canon EF 70-300mm f/4-5.6 IS USM"}, + {239, "Canon EF 85mm f/1.2L II USM"}, + {240, "Canon EF-S 17-55mm f/2.8 IS USM"}, + {241, "Canon EF 50mm f/1.2L USM"}, + {242, "Canon EF 70-200mm f/4L IS USM"}, + {243, "Canon EF 70-200mm f/4L IS USM + 1.4x"}, + {244, "Canon EF 70-200mm f/4L IS USM + 2x"}, + {245, "Canon EF 70-200mm f/4L IS USM + 2.8x"}, + {246, "Canon EF 16-35mm f/2.8L II USM"}, + {247, "Canon EF 14mm f/2.8L II USM"}, + {248, "Canon EF 200mm f/2L IS USM or Sigma Lens"}, + {248, "Sigma 24-35mm f/2 DG HSM | A"}, + {249, "Canon EF 800mm f/5.6L IS USM"}, + {250, "Canon EF 24mm f/1.4L II USM or Sigma Lens"}, + {250, "Sigma 20mm f/1.4 DG HSM | A"}, + {251, "Canon EF 70-200mm f/2.8L IS II USM"}, + {252, "Canon EF 70-200mm f/2.8L IS II USM + 1.4x"}, + {253, "Canon EF 70-200mm f/2.8L IS II USM + 2x"}, + {254, "Canon EF 100mm f/2.8L Macro IS USM"}, + {255, "Sigma 24-105mm f/4 DG OS HSM | A or Other Sigma Lens"}, + {255, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {488, "Canon EF-S 15-85mm f/3.5-5.6 IS USM"}, + {489, "Canon EF 70-300mm f/4-5.6L IS USM"}, + {490, "Canon EF 8-15mm f/4L Fisheye USM"}, + {491, "Canon EF 300mm f/2.8L IS II USM or Tamron Lens"}, + {491, "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, + {491, "Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, + {492, "Canon EF 400mm f/2.8L IS II USM"}, + {493, "Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM"}, + {493, "Canon EF 24-105mm f/4L IS USM"}, + {494, "Canon EF 600mm f/4L IS II USM"}, + {495, "Canon EF 24-70mm f/2.8L II USM or Sigma Lens"}, + {495, "Sigma 24-70mm F2.8 DG OS HSM | A"}, + {496, "Canon EF 200-400mm f/4L IS USM"}, + {499, "Canon EF 200-400mm f/4L IS USM + 1.4x"}, + {502, "Canon EF 28mm f/2.8 IS USM"}, + {503, "Canon EF 24mm f/2.8 IS USM"}, + {504, "Canon EF 24-70mm f/4L IS USM"}, + {505, "Canon EF 35mm f/2 IS USM"}, + {506, "Canon EF 400mm f/4 DO IS II USM"}, + {507, "Canon EF 16-35mm f/4L IS USM"}, + {508, "Canon EF 11-24mm f/4L USM or Tamron Lens"}, + {508, "Tamron 10-24mm f/3.5-4.5 Di II VC HLD"}, + {747, "Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens"}, + {747, "Tamron SP 150-600mm F5-6.3 Di VC USD G2"}, + {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x"}, + {750, "Canon EF 35mm f/1.4L II USM"}, + {751, "Canon EF 16-35mm f/2.8L III USM"}, + {752, "Canon EF 24-105mm f/4L IS II USM"}, + {753, "Canon EF 85mm f/1.4L IS USM"}, + {4142, "Canon EF-S 18-135mm f/3.5-5.6 IS STM"}, + {4143, "Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens"}, + {4143, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, + {4144, "Canon EF 40mm f/2.8 STM"}, + {4145, "Canon EF-M 22mm f/2 STM"}, + {4146, "Canon EF-S 18-55mm f/3.5-5.6 IS STM"}, + {4147, "Canon EF-M 11-22mm f/4-5.6 IS STM"}, + {4148, "Canon EF-S 55-250mm f/4-5.6 IS STM"}, + {4149, "Canon EF-M 55-200mm f/4.5-6.3 IS STM"}, + {4150, "Canon EF-S 10-18mm f/4.5-5.6 IS STM"}, + {4152, "Canon EF 24-105mm f/3.5-5.6 IS STM"}, + {4153, "Canon EF-M 15-45mm f/3.5-6.3 IS STM"}, + {4154, "Canon EF-S 24mm f/2.8 STM"}, + {4155, "Canon EF-M 28mm f/3.5 Macro IS STM"}, + {4156, "Canon EF 50mm f/1.8 STM"}, + {4157, "Canon EF-M 18-150mm 1:3.5-6.3 IS STM"}, + {4158, "Canon EF-S 18-55mm f/4-5.6 IS STM"}, + {4160, "Canon EF-S 35mm f/2.8 Macro IS STM"}, + {36910, "Canon EF 70-300mm f/4-5.6 IS II USM"}, + {36912, "Canon EF-S 18-135mm f/3.5-5.6 IS USM"}, + {61491, "Canon CN-E 14mm T3.1 L F"}, + {61492, "Canon CN-E 24mm T1.5 L F"}, + {61494, "Canon CN-E 85mm T1.3 L F"}, + {61495, "Canon CN-E 135mm T2.2 L F"}, + {61496, "Canon CN-E 35mm T1.5 L F"}, + {65535, "n/a"} + }; } virtual std::string toString (Tag* t) @@ -1109,7 +1119,7 @@ sprintf (buffer, "%d", a); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = Interpreter::toInt (t, ofs); @@ -1120,7 +1130,7 @@ return 0.; } } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { int a = Interpreter::toInt (t, ofs, astype); @@ -1679,6 +1689,7 @@ choices[60030976] = "EOS M5"; choices[60096512] = "PowerShot G5 X"; choices[60227584] = "PowerShot G7 X Mark II"; + choices[60293120] = "EOS M100"; choices[60358656] = "PowerShot ELPH 360 HS / IXUS 285 HS / IXY 650"; choices[67174400] = "PowerShot SX540 HS"; choices[67239936] = "PowerShot SX420 IS"; @@ -1692,6 +1703,7 @@ choices[68485120] = "PowerShot ELPH 185 / IXUS 185 / IXY 200"; choices[68550656] = "PowerShot SX430 IS"; choices[68616192] = "PowerShot SX730 HS"; + choices[68681728] = "PowerShot G1 X Mark III"; choices[100925440] = "PowerShot S100 / Digital IXUS / IXY Digital"; choices[1074255475] = "DC19/DC21/DC22"; choices[1074255476] = "XH A1"; @@ -1721,6 +1733,7 @@ choices[1074256527] = "HF M30/M31/M36/M300/M306"; choices[1074256528] = "HF S20/S21/S200"; choices[1074256530] = "FS31/FS36/FS37/FS300/FS305/FS306/FS307"; + choices[1074257056] = "EOS C300"; choices[1074257321] = "HF G25"; choices[1074257844] = "XC10"; choices[2147483649] = "EOS-1D"; diff -Nru rawtherapee-5.3/rtexif/nikonattribs.cc rawtherapee-5.4/rtexif/nikonattribs.cc --- rawtherapee-5.3/rtexif/nikonattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/nikonattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -55,7 +55,7 @@ sprintf (buffer, "%d", a); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->getValue()[ofs]; @@ -66,7 +66,7 @@ return 0.; } } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { int a = t->getValue()[ofs]; @@ -557,8 +557,10 @@ }; NALensDataInterpreter naLensDataInterpreter; const std::map NALensDataInterpreter::lenses = { - // The key is a composite string made of 8 HEX bytes - // LensIDNumber LensFStops MinFocalLength MaxFocalLength MaxApertureAtMinFocal MaxApertureAtMaxFocal MCUVersion and LensType + /* + * The Nikon LensID is constructed as a Composite tag from the raw hex values of 8 other tags: + * LensIDNumber, LensFStops, MinFocalLength, MaxFocalLength, MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MCUVersion and LensType, in that order. + */ {"00 00 00 00 00 00 00 01", "Manual Lens No CPU"}, {"00 00 00 00 00 00 E1 12", "TC-17E II"}, {"00 00 00 00 00 00 F1 0C", "TC-14E [II] or Sigma APO Tele Converter 1.4x EX DG or Kenko Teleplus PRO 300 DG 1.4x"}, @@ -953,6 +955,7 @@ {"92 48 24 37 24 24 94 06", "AF-S Zoom-Nikkor 14-24mm f/2.8G ED"}, {"93 48 37 5C 24 24 95 06", "AF-S Zoom-Nikkor 24-70mm f/2.8G ED"}, {"94 40 2D 53 2C 3C 96 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II"}, + {"94 48 7C 7C 24 24 4B 0E", "Sigma 180mm f/2.8 APO Macro EX DG OS"}, {"95 00 37 37 2C 2C 97 06", "PC-E Nikkor 24mm f/3.5D ED"}, {"95 4C 37 37 2C 2C 97 02", "PC-E Nikkor 24mm f/3.5D ED"}, {"96 38 1F 37 34 3C 4B 06", "Sigma 12-24mm f/4.5-5.6 II DG HSM"}, @@ -1029,9 +1032,11 @@ {"B4 40 37 62 2C 34 B6 0E", "AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, {"B5 4C 3C 3C 14 14 B7 06", "AF-S Nikkor 28mm f/1.8G"}, {"B6 3C B0 B0 3C 3C B8 0E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, + {"B6 3C B0 B0 3C 3C B8 4E", "AF-S VR Nikkor 800mm f/5.6E FL ED"}, {"B6 48 37 56 24 24 1C 02", "Sigma 24-60mm f/2.8 EX DG"}, {"B7 44 60 98 34 3C B9 0E", "AF-S Nikkor 80-400mm f/4.5-5.6G ED VR"}, {"B8 40 2D 44 2C 34 BA 06", "AF-S Nikkor 18-35mm f/3.5-4.5G ED"}, + {"BF 3C 1B 1B 30 30 01 04", "Irix 11mm f/4 Firefly"}, {"BF 4E 26 26 1E 1E 01 04", "Irix 15mm f/2.4 Firefly"}, {"C3 34 68 98 38 40 4B 4E", "Sigma 100-400mm f/5-6.3 DG OS HSM | C"}, {"CC 4C 50 68 14 14 4B 06", "Sigma 50-100mm f/1.8 DC HSM | A"}, @@ -1042,6 +1047,7 @@ {"DE 54 50 50 0C 0C 4B 06", "Sigma 50mm f/1.4 EX DG HSM"}, {"E0 3C 5C 8E 30 3C 4B 06", "Sigma 70-300mm f/4-5.6 APO DG Macro HSM"}, {"E1 58 37 37 14 14 1C 02", "Sigma 24mm f/1.8 EX DG Aspherical Macro"}, + {"E3 40 76 A6 38 40 DF 4E", "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, {"E3 54 50 50 24 24 35 02", "Sigma Macro 50mm f/2.8 EX DG"}, {"E4 54 64 64 24 24 DF 0E", "Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F017)"}, {"E5 54 6A 6A 24 24 35 02", "Sigma Macro 105mm f/2.8 EX DG"}, diff -Nru rawtherapee-5.3/rtexif/olympusattribs.cc rawtherapee-5.4/rtexif/olympusattribs.cc --- rawtherapee-5.3/rtexif/olympusattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/olympusattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -125,7 +125,9 @@ lenses["00 26 10"] = "Olympus M.Zuiko Digital ED 12-100mm f/4.0 IS Pro"; lenses["00 27 10"] = "Olympus M.Zuiko Digital ED 30mm f/3.5 Macro"; lenses["00 28 10"] = "Olympus M.Zuiko Digital ED 25mm f/1.2 Pro"; + lenses["00 29 10"] = "Olympus M.Zuiko Digital ED 17mm f/1.2 Pro"; lenses["00 30 00"] = "Olympus Zuiko Digital ED 50-200mm f/2.8-3.5 SWD"; + lenses["00 30 10"] = "Olympus M.Zuiko Digital ED 45mm f/1.2 Pro"; lenses["00 31 00"] = "Olympus Zuiko Digital ED 12-60mm f/2.8-4.0 SWD"; lenses["00 32 00"] = "Olympus Zuiko Digital ED 14-35mm f/2.0 SWD"; lenses["00 33 00"] = "Olympus Zuiko Digital 25mm f/2.8"; diff -Nru rawtherapee-5.3/rtexif/pentaxattribs.cc rawtherapee-5.4/rtexif/pentaxattribs.cc --- rawtherapee-5.3/rtexif/pentaxattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/pentaxattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -783,6 +783,7 @@ choices.insert (p_t (256 * 4 + 2, "smc PENTAX-FA 80-320mm f/4.5-5.6")); choices.insert (p_t (256 * 4 + 3, "smc PENTAX-FA 43mm f/1.9 Limited")); choices.insert (p_t (256 * 4 + 6, "smc PENTAX-FA 35-80mm f/4-5.6")); + choices.insert (p_t (256 * 4 + 9, "Irix 11mm f/4 Firefly")); choices.insert (p_t (256 * 4 + 10, "Irix 15mm f/2.4")); choices.insert (p_t (256 * 4 + 12, "smc PENTAX-FA 50mm f/1.4")); choices.insert (p_t (256 * 4 + 15, "smc PENTAX-FA 28-105mm f/4-5.6 [IF]")); @@ -928,7 +929,7 @@ choices.insert (p_t (256 * 8 + 30, "Sigma 17-70mm f/2.8-4 DC Macro HSM | C")); choices.insert (p_t (256 * 8 + 31, "Sigma 18-35mm f/1.8 DC HSM")); choices.insert (p_t (256 * 8 + 32, "Sigma 30mm f/1.4 DC HSM | A")); - choices.insert (p_t (256 * 8 + 33, "Sigma 18-200mm f/3.5-6.3 DC MACRO HSM")); + choices.insert (p_t (256 * 8 + 33, "Sigma 18-200mm f/3.5-6.3 DC Macro HSM")); choices.insert (p_t (256 * 8 + 34, "Sigma 18-300mm f/3.5-6.3 DC Macro HSM")); choices.insert (p_t (256 * 8 + 59, "HD PENTAX-D FA 150-450mm f/4.5-5.6 ED DC AW")); choices.insert (p_t (256 * 8 + 60, "HD PENTAX-D FA* 70-200mm f/2.8 ED DC AW")); @@ -1230,6 +1231,7 @@ choices[2] = "HDR 1"; choices[3] = "HDR 2"; choices[4] = "HDR 3"; + choices[5] = "Advanced"; choices1[0] = "Auto-align Off"; choices1[1] = "Auto-align On"; @@ -1336,7 +1338,7 @@ sprintf (buffer, "%d", a ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a; @@ -1367,7 +1369,7 @@ return "n/a"; } } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { double a = double (t->toInt (0, LONG)); @@ -1397,7 +1399,7 @@ return "n/a"; } } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (ofs, BYTE); float b = float (10 * int (a >> 2)) * pow (4.f, float (int (a & 0x03) - 2)); @@ -1423,7 +1425,7 @@ sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE); return 100.*exp (double (a - 32) * log (2.) / 8.); @@ -1454,7 +1456,7 @@ return "n/a"; } } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE); a &= 0x7F; @@ -1480,7 +1482,7 @@ sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE); return double (a - 64) / 8.; @@ -1500,7 +1502,7 @@ sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, SBYTE); return double (a) / 8.; @@ -1520,7 +1522,7 @@ sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE); return exp ((double (a) - 68.) * log (2.) / 16.); @@ -1540,7 +1542,7 @@ sprintf (buffer, "%.6f", v ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE); return 24.*exp (- (double (a) - 32.) * log (2.) / 8.); @@ -1560,7 +1562,7 @@ sprintf (buffer, "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = t->toInt (0, BYTE) & 0x0F; return double (int (pow (2.0, double (a + 10) / 4.0) + 0.2)); @@ -1580,7 +1582,7 @@ sprintf (buffer, "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { int a = ( t->toInt (0, BYTE) & 0xF0) >> 4; return double (int (pow (2.0, double (a) / 4.0) + 0.2)); diff -Nru rawtherapee-5.3/rtexif/rtexif.cc rawtherapee-5.4/rtexif/rtexif.cc --- rawtherapee-5.3/rtexif/rtexif.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/rtexif.cc 2018-03-20 11:04:15.000000000 +0000 @@ -19,13 +19,16 @@ * along with RawTherapee. If not, see . */ #include +#include #include #include #include #include #include +#include #include +#include #include "rtexif.h" @@ -33,6 +36,9 @@ #include "../rtgui/version.h" #include "../rtgui/ppversion.h" +// see end of ExifManager::parse(bool, bool) +#define PRINT_METADATA_TREE 0 + using namespace std; namespace rtexif @@ -44,8 +50,6 @@ // this class is a collection (an array) of tags //----------------------------------------------------------------------------- -#define TAG_SUBFILETYPE 0x00fe - TagDirectory::TagDirectory () : attribs (ifdAttribs), order (HOSTORDER), parent (nullptr) {} @@ -78,7 +82,7 @@ int id = newTag->getID(); // detect and possibly ignore tags of directories belonging to the embedded thumbnail image - if (attribs == ifdAttribs && id == TAG_SUBFILETYPE && newTag->toInt() != 0) { + if (attribs == ifdAttribs && id == TIFFTAG_SUBFILETYPE && newTag->toInt() != 0) { thumbdescr = true; } @@ -207,11 +211,14 @@ for (size_t i = 0; i < tags.size(); i++) { std::string name = tags[i]->nameToString (); + TagDirectory* currTagDir; if (tags[i]->isDirectory()) { - for (int j = 0; tags[i]->getDirectory (j); j++) { + for (int j = 0; (currTagDir = tags[i]->getDirectory (j)) != nullptr; j++) { printf ("%s+-- DIRECTORY %s[%d]:\n", prefixStr, name.c_str(), j); - tags[i]->getDirectory (j)->printAll (level + 1); + currTagDir->printAll (level + 1); } + } else { + printf ("%s- %s\n", prefixStr, name.c_str()); } } } @@ -285,6 +292,10 @@ kf->set_string ("RT General", "DefaultProcParams", defaultPParams); kf->set_boolean ("RT General", "FlaggingMode", flagMode); + kf->set_integer ("Common Data", "FrameCount", cfs->frameCount); + kf->set_integer ("Common Data", "SampleFormat", cfs->sampleFormat); + kf->set_boolean ("Common Data", "IsHDR", cfs->isHDR); + kf->set_boolean ("Common Data", "IsPixelShift", cfs->isPixelShift); kf->set_double ("Common Data", "FNumber", cfs->fnumber); kf->set_double ("Common Data", "Shutter", cfs->shutter); kf->set_double ("Common Data", "FocalLength", cfs->focalLen); @@ -445,34 +456,126 @@ return nullptr; } -Tag* TagDirectory::findTag (const char* name) const +Tag* TagDirectory::findTag (const char* name, bool lookUpward) const { - if (attribs) { - for (int i = 0; attribs[i].ignore != -1; i++) - if (!strcmp (attribs[i].name, name)) { - Tag* t = getTag (attribs[i].ID); + Tag* t = getTag(name); + if (t) { + return t; + } + + for (auto tag : tags) { + if (tag->isDirectory()) { + TagDirectory *dir; + int i = 0; + while ((dir = tag->getDirectory(i)) != nullptr) { + TagDirectory *dir = tag->getDirectory(); + Tag* t = dir->findTag (name); if (t) { return t; - } else { - break; } + ++i; } + } } - for (size_t i = 0; i < tags.size(); i++) - if (tags[i]->isDirectory()) { - TagDirectory *dir = tags[i]->getDirectory(); - Tag* t = dir->findTag (name); + if (lookUpward && parent) { + Tag* t = parent->findTagUpward(name); + + if (t) { + return t; + } + } + + return nullptr; +} + +std::vector TagDirectory::findTags (int ID) +{ + + std::vector tagList; + + //assuming that an entry can only exist once + Tag* t = getTag(ID); + if (t) { + tagList.push_back(t); + } + + for (auto tag : tags) { + if (tag->isDirectory()) { + TagDirectory *dir; + int i = 0; + while ((dir = tag->getDirectory(i)) != nullptr) { + std::vector subTagList = dir->findTags (ID); + + if (!subTagList.empty()) { + // concatenating the 2 vectors + // not really optimal in a memory efficiency pov + for (auto tag2 : subTagList) { + tagList.push_back(tag2); + } + } + ++i; + } + } + } + + return tagList; +} + +std::vector TagDirectory::findTags (const char* name) +{ + + std::vector tagList; - if (t) { - return t; + //assuming that an entry can only exist once + Tag* t = getTag(name); + if (t) { + tagList.push_back(t); + } + + for (auto tag : tags) { + if (tag->isDirectory()) { + TagDirectory *dir; + int i = 0; + while ((dir = tag->getDirectory(i)) != nullptr) { + std::vector subTagList = dir->findTags (name); + + if (!subTagList.empty()) { + // concatenating the 2 vectors + // not really optimal in a memory efficiency pov, but adding 10 items should be a maximum + for (auto tag2 : subTagList) { + tagList.push_back(tag2); + } + } + ++i; } } + } + + return tagList; +} + + +Tag* TagDirectory::findTagUpward (const char* name) const +{ + Tag* t = findTag(name); + if (t) { + return t; + } + + if (parent) { + Tag* t = parent->findTagUpward(name); + + if (t) { + return t; + } + } return nullptr; } + // Searches a simple value, as either attribute or element // only for simple values, not for entries with special chars or free text bool TagDirectory::getXMPTagValue (const char* name, char* value) const @@ -605,7 +708,7 @@ return maxPos; } -void TagDirectory::applyChange (std::string name, std::string value) +void TagDirectory::applyChange (std::string name, Glib::ustring value) { std::string::size_type dp = name.find_first_of ('.'); @@ -627,19 +730,30 @@ } else if (value == "#delete" && t) { t->setKeep (false); } else if (t && !t->isDirectory()) { - t->valueFromString (value); + if (name == "UserComment") { + // UserComment can be Unicode + t->userCommentFromString (value); + } else { + t->valueFromString (value); + } } else { const TagAttrib* attrib = nullptr; - for (int i = 0; attribs[i].ignore != -1; i++) + for (int i = 0; attribs[i].ignore != -1; i++) { if (!strcmp (attribs[i].name, fseg.c_str())) { attrib = &attribs[i]; break; } + } if (attrib) { Tag* nt = new Tag (this, attrib); - nt->initString (value.c_str()); + if (name == "UserComment") { + // UserComment can be Unicode + nt->initUserComment (value); + } else { + nt->initString (value.c_str()); + } addTag (nt); } } @@ -849,9 +963,11 @@ } if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras - TagDirectory* previewdir = ExifManager::parseJPEG (f, ftell (f)); // try to parse the exif data from the preview image + ExifManager eManager(f, nullptr, true); + eManager.parseJPEG(ftell(f)); // try to parse the exif data from the preview image - if (previewdir) { + if (eManager.roots.size()) { + const TagDirectory* const previewdir = eManager.roots.at(0); if (previewdir->getTag ("Exif")) { if (previewdir->getTag ("Make")) { if (previewdir->getTag ("Make")->valueToString() == "Panasonic") { // "make" is not yet available here, so get it from the preview tags to assure we're doing the right thing @@ -1351,7 +1467,7 @@ } } -int Tag::toInt (int ofs, TagType astype) +int Tag::toInt (int ofs, TagType astype) const { if (attrib) { return attrib->interpreter->toInt (this, ofs, astype); @@ -1402,7 +1518,7 @@ return 0; } -double Tag::toDouble (int ofs) +double Tag::toDouble (int ofs) const { if (attrib) { return attrib->interpreter->toDouble (this, ofs); @@ -1457,7 +1573,7 @@ /** * @brief Create an array of the elements */ -double *Tag::toDoubleArray (int ofs) +double* Tag::toDoubleArray (int ofs) const { double *values = new double[count]; @@ -1468,7 +1584,7 @@ return values; } -void Tag::toRational (int& num, int& denom, int ofs) +void Tag::toRational (int& num, int& denom, int ofs) const { switch (type) { @@ -1517,7 +1633,7 @@ } } -void Tag::toString (char* buffer, int ofs) +void Tag::toString (char* buffer, int ofs) const { if (type == UNDEFINED && !directory) { @@ -1548,15 +1664,11 @@ return; } - size_t maxcount = 4; - - if (count < 4) { - maxcount = count; - } + size_t maxcount = rtengine::min(count, 10); strcpy (buffer, ""); - for (size_t i = 0; i < maxcount; i++) { + for (ssize_t i = 0; i < rtengine::min(maxcount, valuesize - ofs); i++) { if (i > 0) { strcat (buffer, ", "); } @@ -1642,6 +1754,19 @@ } } +void Tag::userCommentFromString (const Glib::ustring& text) +{ + + if (!allocOwnMemory) { + return; + } + if (value) { + delete [] value; + value = nullptr; + } + initUserComment(text); +} + int Tag::calculateSize () { int size = 0; @@ -1803,6 +1928,52 @@ setInt (data, 0, t); } +void Tag::swapByteOrder2(unsigned char *buffer, int count) +{ + unsigned char* ptr = buffer; + for (int i = 0; i < count; i+=2) { + unsigned char c = ptr[0]; + ptr[0] = ptr[1]; + ptr[1] = c; + ptr += 2; + } +} +void Tag::initUserComment (const Glib::ustring &text) +{ + const bool useBOM = false; // set it to true if you want to output BOM in UCS-2/UTF-8 UserComments ; this could be turned to an options entry + type = UNDEFINED; + if (text.is_ascii()) { + valuesize = count = 8 + strlen (text.c_str()); + value = new unsigned char[valuesize]; + memcpy(value, "ASCII\0\0\0", 8); + memcpy(value + 8, text.c_str(), valuesize - 8); + } else { + glong wcStrSize = 0; + gunichar2 *commentStr = g_utf8_to_utf16 (text.c_str(), -1, nullptr, &wcStrSize, nullptr); + valuesize = count = wcStrSize * 2 + 8 + (useBOM ? 2 : 0); + value = new unsigned char[valuesize]; + memcpy(value, "UNICODE\0", 8); + + if (useBOM) { + if (getOrder() == INTEL) { //Little Endian + value[8] = 0xFF; + value[9] = 0xFE; + } else { + value[8] = 0xFE; + value[9] = 0xFF; + } + } + + // Swapping byte order to match the Exif's byte order + if (getOrder() != HOSTORDER) { + swapByteOrder2((unsigned char*)commentStr, wcStrSize * 2); + } + + memcpy(value + 8 + (useBOM ? 2 : 0), (char*)commentStr, wcStrSize * 2); + g_free(commentStr); + } +} + void Tag::initString (const char* text) { @@ -1893,8 +2064,12 @@ return nullptr; } +void ExifManager::setIFDOffset(unsigned int offset) +{ + IFDOffset = offset; +} -TagDirectory* ExifManager::parseCIFF (FILE* f, int base, int length) +void ExifManager::parseCIFF () { TagDirectory* root = new TagDirectory (nullptr, ifdAttribs, INTEL); @@ -1904,12 +2079,11 @@ mn->initMakerNote (IFD, canonAttribs); root->addTag (exif); exif->getDirectory()->addTag (mn); - parseCIFF (f, base, length, root); + parseCIFF (rml->ciffLength, root); root->sort (); - return root; } -Tag* ExifManager::saveCIFFMNTag (FILE* f, TagDirectory* root, int len, const char* name) +Tag* ExifManager::saveCIFFMNTag (TagDirectory* root, int len, const char* name) { int s = ftell (f); if(s >= 0) { @@ -1927,15 +2101,22 @@ } } -void ExifManager::parseCIFF (FILE* f, int base, int length, TagDirectory* root) +void ExifManager::parseCIFF (int length, TagDirectory* root) { + if (!f) { + #ifndef NDEBUG + std::cerr << "ERROR : no file opened !" << std::endl; + #endif + return; + } + char buffer[1024]; Tag* t; - fseek (f, base + length - 4, SEEK_SET); + fseek (f, rml->ciffBase + length - 4, SEEK_SET); - int dirStart = get4 (f, INTEL) + base; + int dirStart = get4 (f, INTEL) + rml->ciffBase; fseek (f, dirStart, SEEK_SET); int numOfTags = get2 (f, INTEL); @@ -1960,10 +2141,19 @@ int nextPos = ftell (f) + 4; // seek to the location of the value - fseek (f, base + get4 (f, INTEL), SEEK_SET); + fseek (f, rml->ciffBase + get4 (f, INTEL), SEEK_SET); if ((((type >> 8) + 8) | 8) == 0x38) { - parseCIFF (f, ftell (f), len, root); // Parse a sub-table + ExifManager( + f, + std::unique_ptr( + new rtengine::RawMetaDataLocation( + ftell(f), + len + ) + ), + true + ).parseCIFF(len, root); // Parse a sub-table } if (type == 0x0810) { @@ -1994,8 +2184,9 @@ } + ExifManager exifManager(f, nullptr, true); if (type == 0x102d) { - Tag* t = saveCIFFMNTag (f, root, len, "CanonCameraSettings"); + Tag* t = exifManager.saveCIFFMNTag (root, len, "CanonCameraSettings"); int mm = t->toInt (34, SHORT); Tag* nt = new Tag (exif, lookupAttrib (exifAttribs, "MeteringMode")); @@ -2074,31 +2265,31 @@ } if (type == 0x1029) { - saveCIFFMNTag (f, root, len, "CanonFocalLength"); + exifManager.saveCIFFMNTag (root, len, "CanonFocalLength"); } if (type == 0x1031) { - saveCIFFMNTag (f, root, len, "SensorInfo"); + exifManager.saveCIFFMNTag (root, len, "SensorInfo"); } if (type == 0x1033) { - saveCIFFMNTag (f, root, len, "CustomFunctions"); + exifManager.saveCIFFMNTag (root, len, "CustomFunctions"); } if (type == 0x1038) { - saveCIFFMNTag (f, root, len, "CanonAFInfo"); + exifManager.saveCIFFMNTag (root, len, "CanonAFInfo"); } if (type == 0x1093) { - saveCIFFMNTag (f, root, len, "CanonFileInfo"); + exifManager.saveCIFFMNTag (root, len, "CanonFileInfo"); } if (type == 0x10a9) { - saveCIFFMNTag (f, root, len, "ColorBalance"); + exifManager.saveCIFFMNTag (root, len, "ColorBalance"); } if (type == 0x102a) { - saveCIFFMNTag (f, root, len, "CanonShotInfo"); + exifManager.saveCIFFMNTag (root, len, "CanonShotInfo"); iso = pow (2, (get4 (f, INTEL), get2 (f, INTEL)) / 32.0 - 4) * 50; aperture = (get2 (f, INTEL), (short)get2 (f, INTEL)) / 32.0f; @@ -2193,6 +2384,9 @@ t->initString (buffer); root->addTag (t); } + + roots.push_back(root); + } static void @@ -2530,33 +2724,65 @@ } } -TagDirectory* ExifManager::parse (FILE* f, int base, bool skipIgnored) +void ExifManager::parseRaw (bool skipIgnored) { + parse(true, skipIgnored); +} + +void ExifManager::parseStd (bool skipIgnored) { + parse(false, skipIgnored); +} + +void ExifManager::parse (bool isRaw, bool skipIgnored) { - setlocale (LC_NUMERIC, "C"); // to set decimal point in sscanf - // read tiff header - fseek (f, base, SEEK_SET); - unsigned short bo; - fread (&bo, 1, 2, f); - ByteOrder order = (ByteOrder) ((int)bo); - get2 (f, order); - int firstifd = get4 (f, order); + int ifdOffset = IFDOffset; - // seek to IFD0 - fseek (f, base + firstifd, SEEK_SET); + if (!f) { + #ifndef NDEBUG + std::cerr << "ERROR : no file opened !" << std::endl; + #endif + return; + } + setlocale (LC_NUMERIC, "C"); // to set decimal point in sscanf - // first read the IFD directory - TagDirectory* root = new TagDirectory (nullptr, f, base, ifdAttribs, order, skipIgnored); + if (order == ByteOrder::UNKNOWN) { + // read tiff header + fseek (f, rml->exifBase, SEEK_SET); + unsigned short bo; + fread (&bo, 1, 2, f); + order = (ByteOrder) ((int)bo); + get2 (f, order); + if (!ifdOffset) { + ifdOffset = get4 (f, order); + } + } - // fix ISO issue with nikon and panasonic cameras - Tag* make = root->getTag ("Make"); - Tag* exif = root->getTag ("Exif"); + do { + // seek to IFD + fseek (f, rml->exifBase + ifdOffset, SEEK_SET); - if (exif && !exif->getDirectory()->getTag ("ISOSpeedRatings")) { - if (make && !strncmp ((char*)make->getValue(), "NIKON", 5)) { - Tag* mn = exif->getDirectory()->getTag ("MakerNote"); + // first read the IFD directory + TagDirectory* root = new TagDirectory (nullptr, f, rml->exifBase, ifdAttribs, order, skipIgnored); - if (mn) { - Tag* iso = mn->getDirectory()->getTag ("ISOSpeed"); + // fix ISO issue with nikon and panasonic cameras + Tag* make = root->getTag ("Make"); + Tag* exif = root->getTag ("Exif"); + + if (exif && !exif->getDirectory()->getTag ("ISOSpeedRatings")) { + if (make && !strncmp ((char*)make->getValue(), "NIKON", 5)) { + Tag* mn = exif->getDirectory()->getTag ("MakerNote"); + + if (mn) { + Tag* iso = mn->getDirectory()->getTag ("ISOSpeed"); + + if (iso) { + std::string isov = iso->valueToString (); + Tag* niso = new Tag (exif->getDirectory(), exif->getDirectory()->getAttrib ("ISOSpeedRatings")); + niso->initInt (atoi (isov.c_str()), SHORT); + exif->getDirectory()->addTagFront (niso); + } + } + } else if (make && (!strncmp ((char*)make->getValue(), "Panasonic", 9) || !strncmp ((char*)make->getValue(), "LEICA", 5))) { + Tag* iso = root->getTag ("PanaISO"); if (iso) { std::string isov = iso->valueToString (); @@ -2565,225 +2791,310 @@ exif->getDirectory()->addTagFront (niso); } } - } else if (make && (!strncmp ((char*)make->getValue(), "Panasonic", 9) || !strncmp ((char*)make->getValue(), "LEICA", 5))) { - Tag* iso = root->getTag ("PanaISO"); - - if (iso) { - std::string isov = iso->valueToString (); - Tag* niso = new Tag (exif->getDirectory(), exif->getDirectory()->getAttrib ("ISOSpeedRatings")); - niso->initInt (atoi (isov.c_str()), SHORT); - exif->getDirectory()->addTagFront (niso); - } } - } - if (make && !strncmp ((char*)make->getValue(), "Kodak", 5)) { - if (!exif) { - // old Kodak cameras may have exif tags in IFD0, reparse and create an exif subdir - fseek (f, base + firstifd, SEEK_SET); - TagDirectory* exifdir = new TagDirectory (nullptr, f, base, exifAttribs, order, true); + if (make && !strncmp ((char*)make->getValue(), "Kodak", 5)) { + if (!exif) { + // old Kodak cameras may have exif tags in IFD0, reparse and create an exif subdir + fseek (f, rml->exifBase + ifdOffset, SEEK_SET); + TagDirectory* exifdir = new TagDirectory (nullptr, f, rml->exifBase, exifAttribs, order, true); + + exif = new Tag (root, root->getAttrib ("Exif")); + exif->initSubDir (exifdir); + root->addTagFront (exif); - exif = new Tag (root, root->getAttrib ("Exif")); - exif->initSubDir (exifdir); - root->addTagFront (exif); + if (!exif->getDirectory()->getTag ("ISOSpeedRatings") && exif->getDirectory()->getTag ("ExposureIndex")) { + Tag* niso = new Tag (exif->getDirectory(), exif->getDirectory()->getAttrib ("ISOSpeedRatings")); + niso->initInt (exif->getDirectory()->getTag ("ExposureIndex")->toInt(), SHORT); + exif->getDirectory()->addTagFront (niso); + } + } - if (!exif->getDirectory()->getTag ("ISOSpeedRatings") && exif->getDirectory()->getTag ("ExposureIndex")) { - Tag* niso = new Tag (exif->getDirectory(), exif->getDirectory()->getAttrib ("ISOSpeedRatings")); - niso->initInt (exif->getDirectory()->getTag ("ExposureIndex")->toInt(), SHORT); - exif->getDirectory()->addTagFront (niso); + Tag *kodakIFD = root->getTag ("KodakIFD"); + + if (kodakIFD && kodakIFD->getDirectory()->getTag ("TextualInfo")) { + parseKodakIfdTextualInfo (kodakIFD->getDirectory()->getTag ("TextualInfo"), exif); } } - Tag *kodakIFD = root->getTag ("KodakIFD"); + parse_leafdata (root, order); - if (kodakIFD && kodakIFD->getDirectory()->getTag ("TextualInfo")) { - parseKodakIfdTextualInfo (kodakIFD->getDirectory()->getTag ("TextualInfo"), exif); - } - } + if (make && !strncmp ((char*)make->getValue(), "Hasselblad", 10)) { + /* + Figuring out the Hasselblad model is a mess. Hasselblad raw data comes in four slightly + different containers, 3FR (directly from CF card), FFF (same as 3FR but filtered through + Phocus, calibration data applied and a bit different tags), Adobe-generated DNGs and + Phocus-generated DNGs. + + FFF usually has a sane model name in Model (and is used as reference for what we shall + call the different Hasselblad models), but 3FR only says like "Hasselblad H3D" for + all H3D models, or "Flash Sync" if the back has been used on a mechanical camera body. + V-mount backs may have the model name of the V body instead of the back model. Etc... + as said it's a mess. + + This code is supposed to handle all raw containers and end up with the same model + regardless of container. + + We don't differ between single shot and multi-shot models, and probably there's no use + of doing so. You need Hasselblad's own software to shoot multi-shot and can only do that + tethered. In single-shot mode they should be exactly the same as the single-shot models. + */ + Tag *subd = root->getTag (0x14a); + Tag *iw = (subd) ? subd->getDirectory()->getTag ("ImageWidth") : nullptr; + int sensorWidth = (iw) ? iw->toInt() : 0; + Tag* tmodel = root->getTag ("Model"); + const char *model = (tmodel) ? (const char *)tmodel->getValue() : ""; - parse_leafdata (root, order); + if (strstr (model, "Hasselblad ") == model) { + model += 11; + } else { + // if HxD is used in flash sync mode for example, we need to fetch model from this tag + Tag* tmodel3 = root->getTag ("UniqueCameraModel"); + const char *model3 = (tmodel3) ? (const char *)tmodel3->getValue() : ""; - if (make && !strncmp ((char*)make->getValue(), "Hasselblad", 10)) { - /* - Figuring out the Hasselblad model is a mess. Hasselblad raw data comes in four slightly - different containers, 3FR (directly from CF card), FFF (same as 3FR but filtered through - Phocus, calibration data applied and a bit different tags), Adobe-generated DNGs and - Phocus-generated DNGs. + if (strstr (model3, "Hasselblad ") == model3) { + model = model3 + 11; + } + } - FFF usually has a sane model name in Model (and is used as reference for what we shall - call the different Hasselblad models), but 3FR only says like "Hasselblad H3D" for - all H3D models, or "Flash Sync" if the back has been used on a mechanical camera body. - V-mount backs may have the model name of the V body instead of the back model. Etc... - as said it's a mess. + // FIXME: due to lack of test files this Hasselblad model identification is not 100% complete + // This needs checking out: CFV-39/CFV-50 3FR, H3DII vs H3D, old CF/CFH models - This code is supposed to handle all raw containers and end up with the same model - regardless of container. + if (!strcmp (model, "H3D")) { + // We can't differ between H3D and H3DII for the 22, 31 and 39 models. There's was no H3D-50 so we know that is a + // H3DII-50. At the time of writing I have no test files for the H3D vs H3DII models, so there still may be a chance + // to differ between them. AFAIK Adobe's DNG converter don't differ between them, and actually call the H3DII-50 + // H3D-50 although Hasselblad never released such a model. + switch (sensorWidth) { + case 4096: + tmodel->initString ("H3D-22"); + break; - We don't differ between single shot and multi-shot models, and probably there's no use - of doing so. You need Hasselblad's own software to shoot multi-shot and can only do that - tethered. In single-shot mode they should be exactly the same as the single-shot models. - */ - Tag *subd = root->getTag (0x14a); - Tag *iw = (subd) ? subd->getDirectory()->getTag ("ImageWidth") : nullptr; - int sensorWidth = (iw) ? iw->toInt() : 0; - Tag* tmodel = root->getTag ("Model"); - const char *model = (tmodel) ? (const char *)tmodel->getValue() : ""; + case 6542: + tmodel->initString ("H3D-31"); + break; - if (strstr (model, "Hasselblad ") == model) { - model += 11; - } else { - // if HxD is used in flash sync mode for example, we need to fetch model from this tag - Tag* tmodel3 = root->getTag ("UniqueCameraModel"); - const char *model3 = (tmodel3) ? (const char *)tmodel3->getValue() : ""; + case 7262: + tmodel->initString ("H3D-39"); + break; - if (strstr (model3, "Hasselblad ") == model3) { - model = model3 + 11; - } - } + case 8282: + tmodel->initString ("H3DII-50"); + break; + } + } else if (!strcmp (model, "H4D")) { + switch (sensorWidth) { + case 6542: + tmodel->initString ("H4D-31"); + break; - // FIXME: due to lack of test files this Hasselblad model identification is not 100% complete - // This needs checking out: CFV-39/CFV-50 3FR, H3DII vs H3D, old CF/CFH models + case 7410: + tmodel->initString ("H4D-40"); + break; - if (!strcmp (model, "H3D")) { - // We can't differ between H3D and H3DII for the 22, 31 and 39 models. There's was no H3D-50 so we know that is a - // H3DII-50. At the time of writing I have no test files for the H3D vs H3DII models, so there still may be a chance - // to differ between them. AFAIK Adobe's DNG converter don't differ between them, and actually call the H3DII-50 - // H3D-50 although Hasselblad never released such a model. - switch (sensorWidth) { - case 4096: - tmodel->initString ("H3D-22"); - break; + case 8282: + tmodel->initString ("H4D-50"); + break; - case 6542: - tmodel->initString ("H3D-31"); - break; + case 9044: + tmodel->initString ("H4D-60"); + break; + } + } else if (!strcmp (model, "H5D")) { + switch (sensorWidth) { + case 7410: + tmodel->initString ("H5D-40"); + break; - case 7262: - tmodel->initString ("H3D-39"); - break; + case 8282: + tmodel->initString ("H5D-50"); + break; - case 8282: - tmodel->initString ("H3DII-50"); - break; - } - } else if (!strcmp (model, "H4D")) { - switch (sensorWidth) { - case 6542: - tmodel->initString ("H4D-31"); - break; + case 8374: + tmodel->initString ("H5D-50c"); + break; - case 7410: - tmodel->initString ("H4D-40"); - break; + case 9044: + tmodel->initString ("H5D-60"); + break; + } + } else if (!strcmp (model, "CFV")) { + switch (sensorWidth) { + case 7262: + tmodel->initString ("CFV-39"); + break; - case 8282: - tmodel->initString ("H4D-50"); - break; + case 8282: + tmodel->initString ("CFV-50"); + break; - case 9044: - tmodel->initString ("H4D-60"); - break; + case 8374: + tmodel->initString ("CFV-50c"); + break; + } } - } else if (!strcmp (model, "H5D")) { - switch (sensorWidth) { - case 7410: - tmodel->initString ("H5D-40"); - break; - case 8282: - tmodel->initString ("H5D-50"); - break; + // and a few special cases + Tag* tmodel3 = root->getTag ("UniqueCameraModel"); + const char *model3 = (tmodel3) ? (const char *)tmodel3->getValue() : ""; - case 8374: - tmodel->initString ("H5D-50c"); - break; + if (strstr (model3, "Hasselblad ") == model3) { + model3 = model3 + 11; + } - case 9044: - tmodel->initString ("H5D-60"); - break; + if (!strcmp (model3, "ixpressCF132")) { + tmodel->initString ("CF-22"); + } else if (!strcmp (model3, "Hasselblad96")) { + tmodel->initString ("CFV"); // popularly called CFV-16, but the official name is CFV + } else if (!strcmp (model3, "Hasselblad234")) { + tmodel->initString ("CFV-39"); + } else if (sensorWidth == 4090) { + tmodel->initString ("V96C"); } - } else if (!strcmp (model, "CFV")) { - switch (sensorWidth) { - case 7262: - tmodel->initString ("CFV-39"); - break; - case 8282: - tmodel->initString ("CFV-50"); - break; + // and yet some, this is for Adobe-generated DNG files + Tag* tmodel4 = root->getTag ("LocalizedCameraModel"); - case 8374: - tmodel->initString ("CFV-50c"); - break; + if (tmodel4) { + const char *model4 = (const char *)tmodel4->getValue(); + + if (strstr (model4, "Hasselblad ") == model4) { + model4 = model4 + 11; + } + + if (!strcmp (model4, "ixpressCF132-22")) { + tmodel->initString ("CF-22"); + } else if (!strcmp (model4, "Hasselblad96-16")) { + tmodel->initString ("CFV"); + } else if (!strcmp (model4, "Hasselblad234-39")) { + tmodel->initString ("CFV-39"); + } else if (!strcmp (model4, "H3D-50")) { + // Adobe names H3DII-50 incorrectly as H3D-50 + tmodel->initString ("H3DII-50"); + } else if (strstr (model4, "H3D-") == model4 || strstr (model4, "H4D-") == model4 || strstr (model4, "H5D-") == model4) { + tmodel->initString (model4); + } } } - // and a few special cases - Tag* tmodel3 = root->getTag ("UniqueCameraModel"); - const char *model3 = (tmodel3) ? (const char *)tmodel3->getValue() : ""; + if (!root->getTag ("Orientation")) { + if (make && !strncmp ((char*)make->getValue(), "Phase One", 9)) { + int orientation = 0; + Tag *iw = root->getTag ("ImageWidth"); + + if (iw) { + // from dcraw, derive orientation from image width + orientation = "0653"[iw->toInt() & 3] - '0'; + } - if (strstr (model3, "Hasselblad ") == model3) { - model3 = model3 + 11; + Tag *t = new Tag (root, root->getAttrib ("Orientation")); + t->initInt (orientation, SHORT); + root->addTagFront (t); + } } - if (!strcmp (model3, "ixpressCF132")) { - tmodel->initString ("CF-22"); - } else if (!strcmp (model3, "Hasselblad96")) { - tmodel->initString ("CFV"); // popularly called CFV-16, but the official name is CFV - } else if (!strcmp (model3, "Hasselblad234")) { - tmodel->initString ("CFV-39"); - } else if (sensorWidth == 4090) { - tmodel->initString ("V96C"); - } + // --- detecting image root IFD based on SubFileType, or if not provided, on PhotometricInterpretation - // and yet some, this is for Adobe-generated DNG files - Tag* tmodel4 = root->getTag ("LocalizedCameraModel"); + bool frameRootDetected = false; - if (tmodel4) { - const char *model4 = (const char *)tmodel4->getValue(); + if(!frameRootDetected) { + std::vector risTagList = root->findTags("RawImageSegmentation"); + if (!risTagList.empty()) { + for (auto ris : risTagList) { + frames.push_back(ris->getParent()); + frameRootDetected = true; - if (strstr (model4, "Hasselblad ") == model4) { - model4 = model4 + 11; + #if PRINT_METADATA_TREE + printf("\n--------------- FRAME (RAWIMAGESEGMENTATION) ---------------\n\n"); + ris->getParent()->printAll (); + #endif + } } + } - if (!strcmp (model4, "ixpressCF132-22")) { - tmodel->initString ("CF-22"); - } else if (!strcmp (model4, "Hasselblad96-16")) { - tmodel->initString ("CFV"); - } else if (!strcmp (model4, "Hasselblad234-39")) { - tmodel->initString ("CFV-39"); - } else if (!strcmp (model4, "H3D-50")) { - // Adobe names H3DII-50 incorrectly as H3D-50 - tmodel->initString ("H3DII-50"); - } else if (strstr (model4, "H3D-") == model4 || strstr (model4, "H4D-") == model4 || strstr (model4, "H5D-") == model4) { - tmodel->initString (model4); + if(!frameRootDetected) { + std::vector sftTagList = root->findTags(TIFFTAG_SUBFILETYPE); + if (!sftTagList.empty()) { + for (auto sft : sftTagList) { + int sftVal = sft->toInt(); + if (sftVal == (isRaw ? 0 : 2)) { + frames.push_back(sft->getParent()); + frameRootDetected = true; + +#if PRINT_METADATA_TREE + printf("\n--------------- FRAME (SUBFILETYPE) ---------------\n\n"); + sft->getParent()->printAll (); +#endif + } + } } } - } - if (!root->getTag ("Orientation")) { - if (make && !strncmp ((char*)make->getValue(), "Phase One", 9)) { - int orientation = 0; - Tag *iw = root->getTag ("ImageWidth"); - - if (iw) { - // from dcraw, derive orientation from image width - orientation = "0653"[iw->toInt() & 3] - '0'; + if(!frameRootDetected) { + std::vector sftTagList = root->findTags(TIFFTAG_OSUBFILETYPE); + if (!sftTagList.empty()) { + for (auto sft : sftTagList) { + int sftVal = sft->toInt(); + if (sftVal == OFILETYPE_IMAGE) { + frames.push_back(sft->getParent()); + frameRootDetected = true; + +#if PRINT_METADATA_TREE + printf("\n--------------- FRAME (OSUBFILETYPE) ---------------\n\n"); + sft->getParent()->printAll (); +#endif + } + } } + } - Tag *t = new Tag (root, root->getAttrib ("Orientation")); - t->initInt (orientation, SHORT); - root->addTagFront (t); + if(!frameRootDetected) { + std::vector piTagList = root->findTags("PhotometricInterpretation"); + if (!piTagList.empty()) { + for (auto pi : piTagList) { + int piVal = pi->toInt(); + if (piVal == (isRaw ? 32803 : 2)) { + frames.push_back(pi->getParent()); + //frameRootDetected = true; not used afterward + +#if PRINT_METADATA_TREE + printf("\n--------------- FRAME (PHOTOMETRIC) ---------------\n\n"); + pi->getParent()->printAll (); +#endif + } + } + } } - } -// root->printAll (); + // --- getting next sibling root + + ifdOffset = get4 (f, order); + + roots.push_back(root); - return root; +#if PRINT_METADATA_TREE + printf("\n~~~~~~~~~ ROOT ~~~~~~~~~~~~~~~~~~~~~~~~\n\n"); + root->printAll (); +#endif + + } while (ifdOffset > 0 && !onlyFirst); + + // Security check : if there's at least one root, there must be at least one image. + // If the following occurs, then image detection above has failed or it's an unsupported file type. + // Yet the result of this should be valid. + if (!roots.empty() && frames.empty()) { + frames.push_back(roots.at(0)); + } } -TagDirectory* ExifManager::parseJPEG (FILE* f, int offset) +void ExifManager::parseJPEG (int offset) { + if (!f) { + #ifndef NDEBUG + std::cerr << "ERROR : no file opened !" << std::endl; + #endif + return; + } if(!fseek (f, offset, SEEK_SET)) { unsigned char c; @@ -2800,25 +3111,39 @@ if (fread (&c, 1, 1, f) && c == 0xe1) { // APP1 marker found if (fread (idbuff, 1, 8, f) < 8) { - return nullptr; + return; } if (!memcmp (idbuff + 2, exifid, 6)) { // Exif info found tiffbase = ftell (f); - return parse (f, tiffbase); + + // We need a RawMetaDataLocation to put the 'tiffbase' value + const bool rmlCreated = !rml; + if (rmlCreated) { + rml.reset(new rtengine::RawMetaDataLocation(0)); + } + rml->exifBase = tiffbase; + parse (false); + if (rmlCreated) { + rml.reset(); + } + return; } } } } } - - return nullptr; } -TagDirectory* ExifManager::parseTIFF (FILE* f, bool skipIgnored) +void ExifManager::parseTIFF (bool skipIgnored) { - - return parse (f, 0, skipIgnored); + if (!rml) { + rml.reset(new rtengine::RawMetaDataLocation(0)); + parse(false, skipIgnored); + rml.reset(); + } else { + parse (false,skipIgnored); + } } std::vector ExifManager::getDefaultTIFFTags (TagDirectory* forthis) @@ -2895,9 +3220,8 @@ return size + 6; } -int ExifManager::createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize) +int ExifManager::createPNGMarker(const TagDirectory* root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize) { - // write tiff header int offs = 0; ByteOrder order = HOSTORDER; @@ -2926,35 +3250,6 @@ cl = new TagDirectory (nullptr, ifdAttribs, HOSTORDER); } -// add tiff strip data - int rps = 8; - int strips = ceil ((double)H / rps); - cl->replaceTag (new Tag (cl, lookupAttrib (ifdAttribs, "RowsPerStrip"), rps, LONG)); - Tag* stripBC = new Tag (cl, lookupAttrib (ifdAttribs, "StripByteCounts")); - stripBC->initInt (0, LONG, strips); - cl->replaceTag (stripBC); - Tag* stripOffs = new Tag (cl, lookupAttrib (ifdAttribs, "StripOffsets")); - stripOffs->initInt (0, LONG, strips); - cl->replaceTag (stripOffs); - - for (int i = 0; i < strips - 1; i++) { - stripBC->setInt (rps * W * 3 * bps / 8, i * 4); - } - - int remaining = (H - rps * floor ((double)H / rps)) * W * 3 * bps / 8; - - if (remaining) { - stripBC->setInt (remaining, (strips - 1) * 4); - } else { - stripBC->setInt (rps * W * 3 * bps / 8, (strips - 1) * 4); - } - - if (profiledata) { - Tag* icc = new Tag (cl, lookupAttrib (ifdAttribs, "ICCProfile")); - icc->initUndefArray (profiledata, profilelen); - cl->replaceTag (icc); - } - if (iptcdata) { Tag* iptc = new Tag (cl, lookupAttrib (ifdAttribs, "IPTCData")); iptc->initLongArray (iptcdata, iptclen); @@ -2983,14 +3278,6 @@ delete defTag; } -// calculate strip offsets - int size = cl->calculateSize (); - int byps = bps / 8; - - for (int i = 0; i < strips; i++) { - stripOffs->setInt (size + 8 + i * rps * W * 3 * byps, i * 4); - } - cl->sort (); bufferSize = cl->calculateSize() + 8; buffer = new unsigned char[bufferSize]; // this has to be deleted in caller @@ -3008,6 +3295,7 @@ return endOffs; } + //----------------------------------------------------------------------------- // global functions to read byteorder dependent data //----------------------------------------------------------------------------- diff -Nru rawtherapee-5.3/rtexif/rtexif.h rawtherapee-5.4/rtexif/rtexif.h --- rawtherapee-5.3/rtexif/rtexif.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/rtexif.h 2018-03-20 11:04:15.000000000 +0000 @@ -27,10 +27,13 @@ #include #include #include +#include + #include #include "../rtengine/procparams.h" #include "../rtengine/noncopyable.h" +#include "../rtengine/rawmetadatalocation.h" class CacheImageData; @@ -46,9 +49,9 @@ AC_INVALID = 100, // invalid state }; -enum ByteOrder {INTEL = 0x4949, MOTOROLA = 0x4D4D}; +enum ByteOrder {UNKNOWN = 0, INTEL = 0x4949, MOTOROLA = 0x4D4D}; #if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ -const enum ByteOrder HOSTORDER = INTEL; +const ByteOrder HOSTORDER = INTEL; #else const enum ByteOrder HOSTORDER = MOTOROLA; #endif @@ -58,11 +61,11 @@ unsigned short sget2 (unsigned char *s, ByteOrder order); int sget4 (unsigned char *s, ByteOrder order); -inline unsigned short get2 (FILE* f, ByteOrder order); -inline int get4 (FILE* f, ByteOrder order); -inline void sset2 (unsigned short v, unsigned char *s, ByteOrder order); -inline void sset4 (int v, unsigned char *s, ByteOrder order); -inline float int_to_float (int i); +unsigned short get2 (FILE* f, ByteOrder order); +int get4 (FILE* f, ByteOrder order); +void sset2 (unsigned short v, unsigned char *s, ByteOrder order); +void sset4 (int v, unsigned char *s, ByteOrder order); +float int_to_float (int i); short int int2_to_signed (short unsigned int i); struct TIFFHeader { @@ -75,7 +78,7 @@ class Tag; class Interpreter; -/// Structure of informations describing an Exif tag +/// Structure of information describing an Exif tag struct TagAttrib { int ignore; // =0: never ignore, =1: always ignore, =2: ignore if the subdir type is reduced image, =-1: end of table ActionCode action; @@ -99,10 +102,10 @@ { protected: - std::vector tags; // tags in the directory - const TagAttrib* attribs; // descriptor table to decode the tags - ByteOrder order; // byte order - TagDirectory* parent; // parent directory (NULL if root) + std::vector tags; // tags in the directory + const TagAttrib* attribs; // descriptor table to decode the tags + ByteOrder order; // byte order + TagDirectory* parent; // parent directory (NULL if root) static Glib::ustring getDumpKey (int tagID, const Glib::ustring &tagName); public: @@ -125,16 +128,31 @@ return tags.size (); } const TagAttrib* getAttrib (int id); - const TagAttrib* getAttrib (const char* name); // Find a Tag by scanning the whole tag tree and stopping at the first occurrence - const TagAttrib* getAttribP (const char* name); // Try to get the Tag at a given location. 'name' is a path relative to this directory (e.g. "LensInfo/FocalLength") + // Find a Tag by scanning the whole tag tree and stopping at the first occurrence + const TagAttrib* getAttrib (const char* name); + // Try to get the Tag at a given location. 'name' is a path relative to this directory (e.g. "LensInfo/FocalLength") + const TagAttrib* getAttribP (const char* name); const TagAttrib* getAttribTable() { return attribs; } - Tag* getTag (const char* name) const; // Find a Tag by scanning the whole tag tree and stopping at the first occurrence - Tag* getTagP (const char* name) const; // Try to get the Tag at a given location. 'name' is a path relative to this directory (e.g. "LensInfo/FocalLength") + // Find a Tag by scanning the whole tag tree and stopping at the first occurrence + Tag* getTag (const char* name) const; + // Try to get the Tag at a given location. 'name' is a path relative to this directory (e.g. "LensInfo/FocalLength") + Tag* getTagP (const char* name) const; Tag* getTag (int ID) const; - virtual Tag* findTag (const char* name) const; + + // Try to get the Tag in the current directory and in subdirectories + // if lookUpward = true, it will scan the parents TagDirectory up to the root one, + // but w/o looking into their subdirs + virtual Tag* findTag (const char* name, bool lookUpward = false) const; + // Find a all Tags with the given name by scanning the whole tag tree + std::vector findTags (const char* name); + // Find a all Tags with the given ID by scanning the whole tag tree + std::vector findTags (int ID); + // Try to get the Tag in the current directory and in parent directories + // (won't look into subdirs) + virtual Tag* findTagUpward (const char* name) const; bool getXMPTagValue (const char* name, char* value) const; void keepTag (int ID); @@ -153,7 +171,7 @@ virtual int calculateSize (); virtual int write (int start, unsigned char* buffer); virtual TagDirectory* clone (TagDirectory* parent); - virtual void applyChange (std::string field, std::string value); + virtual void applyChange (std::string field, Glib::ustring value); virtual void printAll (unsigned int level = 0) const; // reentrant debug function, keep level=0 on first call ! virtual bool CPBDump (const Glib::ustring &commFName, const Glib::ustring &imageFName, const Glib::ustring &profileFName, const Glib::ustring &defaultPParams, @@ -207,15 +225,18 @@ Tag (TagDirectory* parent, const TagAttrib* attr, const char* data); // create a new tag from array (used ~Tag (); - void initType (unsigned char *data, TagType type); - void initInt (int data, TagType t, int count = 1); - void initString (const char* text); - void initSubDir (); - void initSubDir (TagDirectory* dir); - void initMakerNote (MNKind mnk, const TagAttrib* ta); - void initUndefArray (const char* data, int len); - void initLongArray (const char* data, int len); - void initRational (int num, int den); + void initType (unsigned char *data, TagType type); + void initInt (int data, TagType t, int count = 1); + void initUserComment (const Glib::ustring &text); + void initString (const char* text); + void initSubDir (); + void initSubDir (TagDirectory* dir); + void initMakerNote (MNKind mnk, const TagAttrib* ta); + void initUndefArray (const char* data, int len); + void initLongArray (const char* data, int len); + void initRational (int num, int den); + + static void swapByteOrder2 (unsigned char *buffer, int count); // get basic tag properties int getID () const @@ -260,20 +281,21 @@ } // read/write value - int toInt (int ofs = 0, TagType astype = INVALID); + int toInt (int ofs = 0, TagType astype = INVALID) const; void fromInt (int v); - double toDouble (int ofs = 0); - double *toDoubleArray (int ofs = 0); - void toRational (int& num, int& denom, int ofs = 0); - void toString (char* buffer, int ofs = 0); + double toDouble (int ofs = 0) const; + double* toDoubleArray (int ofs = 0) const; + void toRational (int& num, int& denom, int ofs = 0) const; + void toString (char* buffer, int ofs = 0) const; void fromString (const char* v, int size = -1); void setInt (int v, int ofs = 0, TagType astype = LONG); // additional getter/setter for more comfortable use - std::string valueToString (); - std::string nameToString (int i = 0); - void valueFromString (const std::string& value); + std::string valueToString (); + std::string nameToString (int i = 0); + void valueFromString (const std::string& value); + void userCommentFromString (const Glib::ustring& text); // functions for writing int calculateSize (); @@ -309,13 +331,31 @@ class ExifManager { - static Tag* saveCIFFMNTag (FILE* f, TagDirectory* root, int len, const char* name); + Tag* saveCIFFMNTag (TagDirectory* root, int len, const char* name); + void parseCIFF (int length, TagDirectory* root); + void parse (bool isRaw, bool skipIgnored = true); + public: - static TagDirectory* parse (FILE*f, int base, bool skipIgnored = true); - static TagDirectory* parseJPEG (FILE*f, int offset = 0); // offset: to extract exif data from a embedded preview/thumbnail - static TagDirectory* parseTIFF (FILE*f, bool skipIgnored = true); - static TagDirectory* parseCIFF (FILE* f, int base, int length); - static void parseCIFF (FILE* f, int base, int length, TagDirectory* root); + FILE* f; + std::unique_ptr rml; + ByteOrder order; + bool onlyFirst; // Only first IFD + unsigned int IFDOffset; + std::vector roots; + std::vector frames; + + ExifManager (FILE* fHandle, std::unique_ptr _rml, bool onlyFirstIFD) + : f(fHandle), rml(std::move(_rml)), order(UNKNOWN), onlyFirst(onlyFirstIFD), + IFDOffset(0) {} + + void setIFDOffset(unsigned int offset); + + + void parseRaw (bool skipIgnored = true); + void parseStd (bool skipIgnored = true); + void parseJPEG (int offset = 0); // offset: to extract exif data from a embedded preview/thumbnail + void parseTIFF (bool skipIgnored = true); + void parseCIFF (); /// @brief Get default tag for TIFF /// @param forthis The byte order will be taken from the given directory. @@ -323,6 +363,7 @@ static std::vector getDefaultTIFFTags (TagDirectory* forthis); static int createJPEGMarker (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, unsigned char* buffer); static int createTIFFHeader (const TagDirectory* root, const rtengine::procparams::ExifPairs& changeList, int W, int H, int bps, const char* profiledata, int profilelen, const char* iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); + static int createPNGMarker(const TagDirectory *root, const rtengine::procparams::ExifPairs &changeList, int W, int H, int bps, const char *iptcdata, int iptclen, unsigned char *&buffer, unsigned &bufferSize); }; class Interpreter @@ -352,7 +393,7 @@ } } // Get the value as a double - virtual double toDouble (Tag* t, int ofs = 0) + virtual double toDouble (const Tag* t, int ofs = 0) { double ud, dd; @@ -393,7 +434,7 @@ } } // Get the value as an int - virtual int toInt (Tag* t, int ofs = 0, TagType astype = INVALID) + virtual int toInt (const Tag* t, int ofs = 0, TagType astype = INVALID) { int a; diff -Nru rawtherapee-5.3/rtexif/sonyminoltaattribs.cc rawtherapee-5.4/rtexif/sonyminoltaattribs.cc --- rawtherapee-5.3/rtexif/sonyminoltaattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/sonyminoltaattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -665,6 +665,12 @@ {128, "Sigma 18-35mm f/1.8 DC HSM"}, {128, "Sigma 50-500mm f/4.5-6.3 APO DG OS HSM"}, {128, "Sigma 24-105mm f/4 DG HSM | A"}, + {128, "Sigma 30mm f/1.4"}, + {128, "Sigma 35mm f/1.4 DG HSM | A"}, + {128, "Sigma 105mm f/2.8 EX DG OS HSM Macro"}, + {128, "Sigma 180mm f/2.8 EX DG OS HSM APO Macro"}, + {128, "Sigma 18-300mm f/3.5-6.3 DC Macro HSM | C"}, + {128, "Sigma 18-50mm f/2.8-4.5 DC HSM"}, {129, "Tamron Lens (129)"}, {129, "Tamron 200-400mm f/5.6 LD"}, {129, "Tamron 70-300mm f/4-5.6 LD"}, @@ -687,6 +693,7 @@ {216, "Tamron SP 45mm f/1.8 Di USD"}, {217, "Tamron SP 35mm f/1.8 Di USD"}, {218, "Tamron SP 90mm f/2.8 Di Macro 1:1 USD (F017)"}, + {220, "Tamron SP 150-600mm f/5-6.3 Di USD G2"}, {224, "Tamron SP 90mm f/2.8 Di Macro 1:1 USD (F004)"}, {255, "Tamron Lens (255)"}, {255, "Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical"}, @@ -739,6 +746,7 @@ {2561, "Tokina AF 730 II 75-300mm f/4.5-5.6"}, {2561, "Sigma 800mm f/5.6 APO"}, {2561, "Sigma AF 400mm f/5.6 APO Macro"}, + {2561, "Sigma 1000mm f/8 APO"}, {2562, "Minolta AF 50mm f/1.4 [New]"}, {2563, "Minolta AF 300mm f/2.8 APO or Sigma Lens"}, {2563, "Sigma AF 50-500mm f/4-6.3 EX DG APO"}, @@ -843,6 +851,7 @@ {6553, "Sony FE 12-24mm f/4 G"}, {6553, "Sony FE 90mm f/2.8 Macro G OSS"}, {6553, "Sony E 18-50mm f/4-5.6"}, + {6553, "Sony FE 24-105mm f/4 G OSS"}, {6553, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {6553, "Sony FE 55mm f/1.8 ZA"}, {6553, "Sony FE 70-200mm f/4 G OSS"}, @@ -865,6 +874,7 @@ {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS"}, {6553, "Sony FE 16-35mm f/2.8 GM"}, + {6553, "Sony E 18-135mm f/3.5-5.6 OSS"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {6553, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, @@ -876,6 +886,7 @@ {6553, "Sigma 30mm f/2.8 [EX] DN"}, {6553, "Sigma 60mm f/2.8 DN"}, {6553, "Sigma 30mm f/1.4 DC DN | C"}, + {6553, "Sigma 16mm f/1.4 DC DN | C"}, {6553, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {6553, "Tokina Firin 20mm f/2 FE MF"}, {6553, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III"}, @@ -942,6 +953,7 @@ {25611, "Tokina AF 730 II 75-300mm f/4.5-5.6"}, {25611, "Sigma 800mm f/5.6 APO"}, {25611, "Sigma AF 400mm f/5.6 APO Macro"}, + {25611, "Sigma 1000mm f/8 APO"}, {25621, "Minolta AF 50mm f/1.4 [New]"}, {25631, "Minolta AF 300mm f/2.8 APO or Sigma Lens"}, {25631, "Sigma AF 50-500mm f/4-6.3 EX DG APO"}, @@ -1046,6 +1058,7 @@ {65535, "Sony FE 12-24mm f/4 G"}, {65535, "Sony FE 90mm f/2.8 Macro G OSS"}, {65535, "Sony E 18-50mm f/4-5.6"}, + {65535, "Sony FE 24-105mm f/4 G OSS"}, {65535, "Sony E PZ 18-200mm f/3.5-6.3 OSS"}, {65535, "Sony FE 55mm f/1.8 ZA"}, {65535, "Sony FE 70-200mm f/4 G OSS"}, @@ -1068,6 +1081,7 @@ {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS"}, {65535, "Sony FE 16-35mm f/2.8 GM"}, + {65535, "Sony E 18-135mm f/3.5-5.6 OSS"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter"}, {65535, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter"}, @@ -1079,6 +1093,7 @@ {65535, "Sigma 30mm f/2.8 [EX] DN"}, {65535, "Sigma 60mm f/2.8 DN"}, {65535, "Sigma 30mm f/1.4 DC DN | C"}, + {65535, "Sigma 16mm f/1.4 DC DN | C"}, {65535, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, {65535, "Tokina Firin 20mm f/2 FE MF"}, {65535, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III"}, @@ -1177,6 +1192,7 @@ choices.insert (p_t (32801, "Sony FE 12-24mm f/4 G")); choices.insert (p_t (32802, "Sony FE 90mm f/2.8 Macro G OSS")); choices.insert (p_t (32803, "Sony E 18-50mm f/4-5.6")); + choices.insert (p_t (32805, "Sony FE 24-105mm f/4 G OSS")); choices.insert (p_t (32807, "Sony E PZ 18-200mm f/3.5-6.3 OSS")); choices.insert (p_t (32808, "Sony FE 55mm f/1.8 ZA")); choices.insert (p_t (32810, "Sony FE 70-200mm f/4 G OSS")); @@ -1199,7 +1215,7 @@ choices.insert (p_t (32829, "Sony FE 100-400mm f/4.5-5.6 GM OSS")); choices.insert (p_t (32830, "Sony FE 70-200mm f/2.8 GM OSS")); choices.insert (p_t (32831, "Sony FE 16-35mm f/2.8 GM")); - choices.insert (p_t (33002, "Sigma 85mm f/1.4 DG HSM | A (+ Metabones Ver.50)")); + choices.insert (p_t (32849, "Sony E 18-135mm f/3.5-5.6 OSS")); choices.insert (p_t (33072, "Sony FE 70-200mm f/2.8 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33073, "Sony FE 70-200mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (33076, "Sony FE 100mm f/2.8 STF GM OSS (macro mode)")); @@ -1229,6 +1245,7 @@ choices.insert (p_t (50492, "Sigma 24-105mm f/4 DG OS HSM | A + MC-11")); choices.insert (p_t (50493, "Sigma 17-70mm f/2.8-4 DC MACRO OS HSM | C + MC-11")); choices.insert (p_t (50495, "Sigma 50-100mm f/1.8 DC HSM | A + MC-11")); + choices.insert (p_t (50503, "Sigma 16mm f/1.4 DC DN | C")); choices.insert (p_t (50992, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III")); choices.insert (p_t (50993, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6")); choices.insert (p_t (50994, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III")); @@ -2044,7 +2061,7 @@ return "n/a"; } } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT TagType astype = t->getType(); @@ -2063,7 +2080,7 @@ return 0.; } } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2104,7 +2121,7 @@ return "n/a"; } } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT TagType astype = t->getType(); @@ -2123,7 +2140,7 @@ return 0.; } } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2164,7 +2181,7 @@ return "Auto"; } } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2200,7 +2217,7 @@ sprintf (buffer, "%.2f", a ); return buffer; } - virtual double toDouble (Tag* t, int ofs) + virtual double toDouble (const Tag* t, int ofs) { // Get the value int a = t->getValue()[ofs]; @@ -2220,7 +2237,7 @@ sprintf (buffer, "%d", t->getValue()[0] - 20); return buffer; } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { return t->getValue()[0] - 20; } @@ -2241,7 +2258,7 @@ return "Off"; } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { return (t->getValue()[0] & 0x80) == 0x80 ? 1 : 0; } @@ -2259,7 +2276,7 @@ sprintf (buffer, "%d", t->getValue()[0] & 0x7f); return buffer; } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { return t->getValue()[0] & 0x7f; } @@ -2315,7 +2332,7 @@ sprintf (buffer, "%d", t->toInt()); return buffer; } - virtual int toInt (Tag* t, int ofs, TagType astype) + virtual int toInt (const Tag* t, int ofs, TagType astype) { int a = 0; diff -Nru rawtherapee-5.3/rtexif/stdattribs.cc rawtherapee-5.4/rtexif/stdattribs.cc --- rawtherapee-5.3/rtexif/stdattribs.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtexif/stdattribs.cc 2018-03-20 11:04:15.000000000 +0000 @@ -452,26 +452,120 @@ } count = std::min (count, 65535); // limit to 65535 chars to avoid crashes in case of corrupted metadata - char *buffer = new char[count - 7]; + unsigned char *buffer = new unsigned char[count - 6]; // include 2 ending null chars for UCS-2 string (possibly) + unsigned char *value = t->getValue(); - if (!memcmp ((char*)t->getValue(), "ASCII\0\0\0", 8)) { - strncpy (buffer, (char*)t->getValue() + 8, count - 8); + if (!memcmp(value, "ASCII\0\0\0", 8)) { + memcpy(buffer, value + 8, count - 8); buffer[count - 8] = '\0'; + } else if (!memcmp(value, "UNICODE\0", 8)) { + memcpy(buffer, value + 8, count - 8); + buffer[count - 7] = buffer[count - 8] = '\0'; + Glib::ustring tmp1((char*)buffer); + + + bool hasBOM = false; + enum ByteOrder bo = UNKNOWN; + if (count % 2 || (count >= 11 && (buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF))) { + // odd string length can only be UTF-8, don't change anything + std::string retVal ((char*)buffer + 3); + delete [] buffer; + return retVal; + } else if (count >= 10) { + if (buffer[0] == 0xFF && buffer[1] == 0xFE) { + bo = INTEL; // little endian + hasBOM = true; + } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) { + bo = MOTOROLA; // big endian + hasBOM = true; + } + } + if (bo == UNKNOWN) { + // auto-detecting byte order; we still don't know if it's UCS-2 or UTF-8 + int a = 0, b = 0, c = 0, d = 0; + for (int j = 8; j < count; j++) { + unsigned char cc = value[j]; + if (!(j%2)) { + // counting zeros for first byte + if (!cc) { + ++a; + } + } else { + // counting zeros for second byte + if (!cc) { + ++b; + } + } + if (!(cc & 0x80) || ((cc & 0xC0) == 0xC0) || ((cc & 0xC0) == 0x80)) { + ++c; + } + if ((cc & 0xC0) == 0x80) { + ++d; + } + } + if (c == (count - 8) && d) { + // this is an UTF-8 string + std::string retVal ((char*)buffer); + delete [] buffer; + return retVal; + } + if ((a || b) && a != b) { + bo = a > b ? MOTOROLA : INTEL; + } + } + if (bo == UNKNOWN) { + // assuming platform's byte order +#if __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ + bo = INTEL; +#else + bo = MOTOROLA; +#endif + } + + // now swapping if necessary + if (!hasBOM && bo != HOSTORDER) { + if (t->getOrder() != HOSTORDER) { + Tag::swapByteOrder2(buffer, count - 8); + } + } + + glong written; + char* utf8Str = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, &written, nullptr); + delete [] buffer; + buffer = new unsigned char[written + 1]; + memcpy(buffer, utf8Str, written); + buffer[written] = 0; + } else if (!memcmp(value, "\0\0\0\0\0\0\0\0", 8)) { + // local charset string, whatever it is + memcpy(buffer, value + 8, count - 8); + buffer[count - 7] = buffer[count - 8] = '\0'; + + gsize written = 0; + char *utf8Str = g_locale_to_utf8((char*)buffer, count - 8, nullptr, &written, nullptr); + if (utf8Str && written) { + delete [] buffer; + size_t length = strlen(utf8Str); + buffer = new unsigned char[length + 1]; + strcpy((char*)buffer, utf8Str); + } else { + buffer[0] = 0; + } + if (utf8Str) { + g_free(utf8Str); + } } else { + // JIS: unsupported buffer[0] = 0; } - std::string retVal (buffer); + std::string retVal ((char*)buffer); delete [] buffer; return retVal; } virtual void fromString (Tag* t, const std::string& value) { - char *buffer = new char[t->getCount()]; - memcpy (buffer, "ASCII\0\0\0", 8); - strcpy (buffer + 8, value.c_str()); - t->fromString (buffer, value.size() + 9); - delete [] buffer; + Glib::ustring tmpStr(value); + t->userCommentFromString (tmpStr); } }; UserCommentInterpreter userCommentInterpreter; @@ -534,11 +628,28 @@ }; UTF8BinInterpreter utf8BinInterpreter; +class RawImageSegmentationInterpreter : public Interpreter +{ +public: + virtual std::string toString (Tag* t) + { + int segmentNumber = t->toInt(0, SHORT); + int segmentWidth = t->toInt(2, SHORT); + int lastSegmentWidth = t->toInt(4, SHORT); + + char buffer[32]; + sprintf (buffer, "%d %d %d", segmentNumber, segmentWidth, lastSegmentWidth); + return buffer; + } +}; +RawImageSegmentationInterpreter rawImageSegmentationInterpreter; + const TagAttrib exifAttribs[] = { {0, AC_SYSTEM, 0, nullptr, 0x0100, AUTO, "ImageWidth", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0101, AUTO, "ImageHeight", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0102, AUTO, "BitsPerSample", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0103, AUTO, "Compression", &compressionInterpreter}, + {0, AC_SYSTEM, 0, nullptr, 0x0153, AUTO, "SampleFormat", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x828d, AUTO, "CFAPatternDim", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x828e, AUTO, "CFAPattern", &cfaInterpreter}, {0, AC_WRITE, 0, nullptr, 0x829A, AUTO, "ExposureTime", &exposureTimeInterpreter}, @@ -643,9 +754,9 @@ {0, AC_WRITE, 0, nullptr, 0xC68B, AUTO, "OriginalRawFileName", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC68D, AUTO, "ActiveArea", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC68E, AUTO, "MaskedAreas", &stdInterpreter}, -// {0, AC_WRITE, 0, 0, 0xC68F, AUTO, "AsShotICCProfile", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC68F, AUTO, "AsShotICCProfile", & ???}, {0, AC_WRITE, 0, nullptr, 0xC690, AUTO, "AsShotPreProfileMatrix", &stdInterpreter}, -// {0, AC_WRITE, 0, 0, 0xC691, AUTO, "CurrentICCProfile", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC691, AUTO, "CurrentICCProfile", & ???}, {0, AC_WRITE, 0, nullptr, 0xC692, AUTO, "CurrentPreProfileMatrix", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC6BF, AUTO, "ColorimetricReference", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC6F3, AUTO, "CameraCalibrationSig", &stdInterpreter}, @@ -670,13 +781,13 @@ {0, AC_WRITE, 0, nullptr, 0xC71B, AUTO, "PreviewDateTime", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC71C, AUTO, "RawImageDigest", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC71D, AUTO, "OriginalRawFileDigest", &stdInterpreter}, -// {0, AC_WRITE, 0, 0, 0xC71E, AUTO, "SubTileBlockSize", & ???}, -// {0, AC_WRITE, 0, 0, 0xC71F, AUTO, "RowInterleaveFactor", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC71E, AUTO, "SubTileBlockSize", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC71F, AUTO, "RowInterleaveFactor", & ???}, {0, AC_WRITE, 0, nullptr, 0xC725, AUTO, "ProfileLookTableDims", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC726, AUTO, "ProfileLookTableData", &stdInterpreter}, -// {0, AC_WRITE, 0, 0, 0xC740, AUTO, "OpcodeList1", & ???}, -// {0, AC_WRITE, 0, 0, 0xC741, AUTO, "OpcodeList2", & ???}, -// {0, AC_WRITE, 0, 0, 0xC74E, AUTO, "OpcodeList3", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC740, AUTO, "OpcodeList1", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC741, AUTO, "OpcodeList2", & ???}, +// {0, AC_WRITE, 0, nullptr, 0xC74E, AUTO, "OpcodeList3", & ???}, {0, AC_WRITE, 0, nullptr, 0xC761, AUTO, "NoiseProfile", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC763, AUTO, "TimeCodes", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0xC764, AUTO, "FrameRate", &stdInterpreter}, @@ -753,6 +864,7 @@ const TagAttrib ifdAttribs[] = { {0, AC_SYSTEM, 0, nullptr, 0x0017, AUTO, "PanaISO", &stdInterpreter}, + {0, AC_SYSTEM, 0, nullptr, 0x00fe, AUTO, "NewSubFileType", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0100, AUTO, "ImageWidth", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0101, AUTO, "ImageHeight", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0102, AUTO, "BitsPerSample", &stdInterpreter}, @@ -777,6 +889,7 @@ {0, AC_SYSTEM, 0, nullptr, 0x013E, AUTO, "WhitePoint", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x013F, AUTO, "PriomaryChromaticities", &stdInterpreter}, {0, AC_WRITE, 0, ifdAttribs, 0x014A, AUTO, "SubIFD", &stdInterpreter}, + {0, AC_SYSTEM, 0, nullptr, 0x0153, AUTO, "SampleFormat", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0201, AUTO, "JPEGInterchangeFormat", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0202, AUTO, "JPEGInterchangeFormatLength", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x0211, AUTO, "YCbCrCoefficients", &stdInterpreter}, @@ -790,10 +903,10 @@ {0, AC_WRITE, 0, nullptr, 0x828e, AUTO, "CFAPattern", &cfaInterpreter}, {0, AC_WRITE, 0, kodakIfdAttribs, 0x8290, AUTO, "KodakIFD", &stdInterpreter}, {0, AC_WRITE, 1, nullptr, 0x8298, AUTO, "Copyright", &stdInterpreter}, + {0, AC_SYSTEM, 0, nullptr, 0x83BB, AUTO, "IPTCData", &stdInterpreter}, {0, AC_DONTWRITE, 0, nullptr, 0x8606, AUTO, "LeafData", &stdInterpreter}, // is actually a subdir, but a proprietary format {0, AC_WRITE, 0, exifAttribs, 0x8769, AUTO, "Exif", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0x8773, AUTO, "ICCProfile", &stdInterpreter}, - {0, AC_SYSTEM, 0, nullptr, 0x83BB, AUTO, "IPTCData", &stdInterpreter}, {0, AC_WRITE, 0, gpsAttribs, 0x8825, AUTO, "GPSInfo", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x9003, AUTO, "DateTimeOriginal", &stdInterpreter}, {0, AC_WRITE, 0, nullptr, 0x9004, AUTO, "DateTimeDigitized", &stdInterpreter}, @@ -807,9 +920,9 @@ {0, AC_WRITE, 0, nullptr, 0xc62f, AUTO, "CameraSerialNumber", &stdInterpreter}, {0, AC_SYSTEM, 0, nullptr, 0xc630, AUTO, "DNGLensInfo", &stdInterpreter}, {0, AC_DONTWRITE, 0, nullptr, 0xC634, AUTO, "MakerNote", &stdInterpreter}, //DNGPrivateData + {0, AC_SYSTEM, 0, nullptr, 0xC640, AUTO, "RawImageSegmentation", &rawImageSegmentationInterpreter}, {0, AC_WRITE, 0, nullptr, 0xc65d, AUTO, "RawDataUniqueID", &stdInterpreter}, {0, AC_DONTWRITE, 0, nullptr, 0xc761, AUTO, "NoiseProfile", &stdInterpreter}, - {0, AC_SYSTEM, 0, nullptr, 0x00fe, AUTO, "NewSubFileType", &stdInterpreter}, { -1, AC_DONTWRITE, 0, nullptr, 0, AUTO, "", nullptr} }; } diff -Nru rawtherapee-5.3/rtgui/addsetids.h rawtherapee-5.4/rtgui/addsetids.h --- rawtherapee-5.3/rtgui/addsetids.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/addsetids.h 2018-03-20 11:04:15.000000000 +0000 @@ -11,7 +11,7 @@ ADDSET_TC_CONTRAST, ADDSET_SH_HIGHLIGHTS, ADDSET_SH_SHADOWS, - ADDSET_SH_LOCALCONTRAST, + ADDSET_SH_LOCALCONTRAST, // not used anymore ADDSET_LC_BRIGHTNESS, ADDSET_LC_CONTRAST, ADDSET_SHARP_AMOUNT, @@ -122,6 +122,18 @@ ADDSET_SHARP_EDGETOL, ADDSET_SHARP_HALOCTRL, ADDSET_RESIZE_SCALE, + ADDSET_EPD_STRENGTH, + ADDSET_EPD_GAMMA, + ADDSET_EPD_EDGESTOPPING, + ADDSET_EPD_SCALE, + ADDSET_EPD_REWEIGHTINGITERATES, + ADDSET_FATTAL_THRESHOLD, + ADDSET_FATTAL_AMOUNT, + ADDSET_LOCALCONTRAST_RADIUS, + ADDSET_LOCALCONTRAST_AMOUNT, + ADDSET_LOCALCONTRAST_DARKNESS, + ADDSET_LOCALCONTRAST_LIGHTNESS, + ADDSET_FATTAL_ANCHOR, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff -Nru rawtherapee-5.3/rtgui/alignedmalloc.cc rawtherapee-5.4/rtgui/alignedmalloc.cc --- rawtherapee-5.3/rtgui/alignedmalloc.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/alignedmalloc.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (C) 2018 Flössie + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include "config.h" + +#ifdef HAVE_UNALIGNED_MALLOC + +#include + +void* malloc(size_t size) +{ + return memalign(16, size); +} + +#endif diff -Nru rawtherapee-5.3/rtgui/batchqueue.cc rawtherapee-5.4/rtgui/batchqueue.cc --- rawtherapee-5.3/rtgui/batchqueue.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueue.cc 2018-03-20 11:04:15.000000000 +0000 @@ -245,10 +245,10 @@ file << entry->filename << '|' << entry->savedParamsFile << '|' << entry->outFileName << '|' << saveFormat.format << '|' #endif << saveFormat.jpegQuality << '|' << saveFormat.jpegSubSamp << '|' - << saveFormat.pngBits << '|' << saveFormat.pngCompression << '|' + << saveFormat.pngBits << '|' << saveFormat.tiffBits << '|' << saveFormat.tiffUncompressed << '|' << saveFormat.saveParams << '|' << entry->forceFormatOpts << '|' - << entry->job->fastPipeline() << '|' + << entry->fast_pipeline << '|' << std::endl; } } @@ -310,7 +310,6 @@ const auto jpegQuality = nextIntOr (options.saveFormat.jpegQuality); const auto jpegSubSamp = nextIntOr (options.saveFormat.jpegSubSamp); const auto pngBits = nextIntOr (options.saveFormat.pngBits); - const auto pngCompression = nextIntOr (options.saveFormat.pngCompression); const auto tiffBits = nextIntOr (options.saveFormat.tiffBits); const auto tiffUncompressed = nextIntOr (options.saveFormat.tiffUncompressed); const auto saveParams = nextIntOr (options.saveFormat.saveParams); @@ -352,7 +351,6 @@ saveFormat.jpegQuality = jpegQuality; saveFormat.jpegSubSamp = jpegSubSamp; saveFormat.pngBits = pngBits; - saveFormat.pngCompression = pngCompression; saveFormat.tiffBits = tiffBits; saveFormat.tiffUncompressed = tiffUncompressed != 0; saveFormat.saveParams = saveParams != 0; @@ -375,7 +373,7 @@ { timeval tv; gettimeofday(&tv, nullptr); - char mseconds[4]; + char mseconds[11]; sprintf(mseconds, "%d", (int)(tv.tv_usec / 1000)); time_t rawtime; struct tm *timeinfo; @@ -574,13 +572,13 @@ next->removeButtonSet (); // start batch processing - rtengine::startBatchProcessing (next->job, this, options.tunnelMetaData); + rtengine::startBatchProcessing (next->job, this); queue_draw (); } } } -rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) +rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) { // save image img @@ -612,7 +610,7 @@ if (saveFormat.format == "tif") { err = img->saveAsTIFF (fname, saveFormat.tiffBits, saveFormat.tiffUncompressed); } else if (saveFormat.format == "png") { - err = img->saveAsPNG (fname, saveFormat.pngCompression, saveFormat.pngBits); + err = img->saveAsPNG (fname, saveFormat.pngBits); } else if (saveFormat.format == "jpg") { err = img->saveAsJPEG (fname, saveFormat.jpegQuality, saveFormat.jpegSubSamp); } diff -Nru rawtherapee-5.3/rtgui/batchqueueentry.cc rawtherapee-5.4/rtgui/batchqueueentry.cc --- rawtherapee-5.3/rtgui/batchqueueentry.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueueentry.cc 2018-03-20 11:04:15.000000000 +0000 @@ -29,10 +29,19 @@ bool BatchQueueEntry::iconsLoaded(false); Glib::RefPtr BatchQueueEntry::savedAsIcon; -BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm) - : ThumbBrowserEntryBase(fname), - opreview(nullptr), origpw(prevw), origph(prevh), opreviewDone(false), - job(pjob), params(pparams), progress(0), outFileName(""), sequence(0), forceFormatOpts(false) +BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm) : + ThumbBrowserEntryBase(fname), + opreview(nullptr), + origpw(prevw), + origph(prevh), + opreviewDone(false), + job(pjob), + params(pparams), + progress(0), + outFileName(""), + sequence(0), + forceFormatOpts(false), + fast_pipeline(job->fastPipeline()) { thumbnail = thm; @@ -177,8 +186,6 @@ saveFormat.jpegSubSamp == 1 ? M("SAVEDLG_SUBSAMP_1") : saveFormat.jpegSubSamp == 2 ? M("SAVEDLG_SUBSAMP_2") : M("SAVEDLG_SUBSAMP_3")); - } else if (saveFormat.format == "png") { - tooltip += Glib::ustring::compose("\n%1: %2", M("SAVEDLG_PNGCOMPR"), saveFormat.pngCompression); } else if (saveFormat.format == "tif") { if (saveFormat.tiffUncompressed) { tooltip += Glib::ustring::compose("\n%1", M("SAVEDLG_TIFFUNCOMPRESSED")); diff -Nru rawtherapee-5.3/rtgui/batchqueueentry.h rawtherapee-5.4/rtgui/batchqueueentry.h --- rawtherapee-5.3/rtgui/batchqueueentry.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueueentry.h 2018-03-20 11:04:15.000000000 +0000 @@ -53,6 +53,7 @@ int sequence; SaveFormat saveFormat; bool forceFormatOpts; + bool fast_pipeline; BatchQueueEntry (rtengine::ProcessingJob* job, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm = nullptr); ~BatchQueueEntry (); diff -Nru rawtherapee-5.3/rtgui/batchqueue.h rawtherapee-5.4/rtgui/batchqueue.h --- rawtherapee-5.3/rtgui/batchqueue.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueue.h 2018-03-20 11:04:15.000000000 +0000 @@ -62,7 +62,7 @@ return (!fd.empty()); } - rtengine::ProcessingJob* imageReady (rtengine::IImage16* img); + rtengine::ProcessingJob* imageReady (rtengine::IImagefloat* img); void error (Glib::ustring msg); void setProgress (double p); void rightClicked (ThumbBrowserEntryBase* entry); diff -Nru rawtherapee-5.3/rtgui/batchqueuepanel.cc rawtherapee-5.4/rtgui/batchqueuepanel.cc --- rawtherapee-5.3/rtgui/batchqueuepanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueuepanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -46,29 +46,21 @@ batchQueue = Gtk::manage( new BatchQueue(aFileCatalog) ); - // construct batch queue panel with the extra "start" and "stop" button Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox); batchQueueButtonBox->set_name("BatchQueueButtons"); - start = Gtk::manage (new Gtk::ToggleButton ()); - stop = Gtk::manage (new Gtk::ToggleButton ()); - autoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); - start->set_tooltip_markup (M("FILEBROWSER_STARTPROCESSINGHINT")); - stop->set_tooltip_markup (M("FILEBROWSER_STOPPROCESSINGHINT")); - autoStart->set_tooltip_text (M("FILEBROWSER_TOOLTIP_STOPPROCESSING")); - start->set_active (false); - stop->set_active (true); - autoStart->set_active (options.procQueueEnabled); - - start->set_image (*Gtk::manage (new RTImage ("gtk-media-play.png"))); - start->get_style_context()->add_class("BIG"); - startConnection = start->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::startBatchProc)); - stop->set_image (*Gtk::manage (new RTImage ("gtk-media-stop.png"))); - stop->get_style_context()->add_class("BIG"); - stopConnection = stop->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::stopBatchProc)); - batchQueueButtonBox->pack_start (*start, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*stop, Gtk::PACK_SHRINK, 4); - batchQueueButtonBox->pack_start (*autoStart, Gtk::PACK_SHRINK, 4); + qStartStop = Gtk::manage (new Gtk::Switch()); + qStartStop->set_tooltip_markup (M("BATCHQUEUE_STARTSTOPHINT")); + qStartStopConn = qStartStop->property_active().signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::startOrStopBatchProc)); + + qAutoStart = Gtk::manage (new Gtk::CheckButton (M("BATCHQUEUE_AUTOSTART"))); + qAutoStart->set_tooltip_text (M("BATCHQUEUE_AUTOSTARTHINT")); + qAutoStart->set_active (options.procQueueEnabled); + + batchQueueButtonBox->pack_start (*qStartStop, Gtk::PACK_SHRINK, 4); + batchQueueButtonBox->pack_start (*qAutoStart, Gtk::PACK_SHRINK, 4); + Gtk::Frame *bbox = Gtk::manage(new Gtk::Frame(M("MAIN_FRAME_BATCHQUEUE"))); + bbox->add(*batchQueueButtonBox); // Output directory selection fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR"))); @@ -141,7 +133,7 @@ pack_start (*topBox, Gtk::PACK_SHRINK); topBox->set_name("BatchQueueButtonsMainContainer"); - topBox->pack_start (*batchQueueButtonBox, Gtk::PACK_SHRINK, 4); + topBox->pack_start (*bbox, Gtk::PACK_SHRINK, 4); topBox->pack_start (*fdir, Gtk::PACK_EXPAND_WIDGET, 4); topBox->pack_start (*fformat, Gtk::PACK_EXPAND_WIDGET, 4); @@ -200,7 +192,7 @@ saveFormatPanel->init (options.saveFormatBatch); } -// it is expected to have a non null forceOrientation value on Preferences update only. In this case, qsize is ingored and computed automatically +// it is expected to have a non null forceOrientation value on Preferences update only. In this case, qsize is ignored and computed automatically void BatchQueuePanel::updateTab (int qsize, int forceOrientation) { Gtk::Notebook *nb = (Gtk::Notebook *)(this->get_parent()); @@ -216,7 +208,7 @@ if(!qsize ) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE")) ); - } else if( start->get_active () ) { + } else if (qStartStop->get_active()) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]")); } else { @@ -236,7 +228,7 @@ if (!qsize ) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") )), Gtk::POS_RIGHT, 1, 1); - } else if ( start->get_active () ) { + } else if (qStartStop->get_active()) { grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_RIGHT, 1, 1); grid->attach_next_to(*Gtk::manage (new Gtk::Label (M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )), Gtk::POS_RIGHT, 1, 1); } else { @@ -257,6 +249,12 @@ { updateTab ( qsize); + if (qsize == 0 || (qsize == 1 && !fdir->get_sensitive())) { + qStartStop->set_sensitive(false); + } else { + qStartStop->set_sensitive(true); + } + if (queueEmptied || queueError) { stopBatchProc (); fdir->set_sensitive (true); @@ -271,19 +269,29 @@ } } -void BatchQueuePanel::startBatchProc () +void BatchQueuePanel::startOrStopBatchProc() { + bool state = qStartStop->get_state(); + if (state) { + startBatchProc(); + } else { + stopBatchProc(); + } +} - stopConnection.block (true); - startConnection.block (true); - stop->set_active (false); - start->set_active (true); - stopConnection.block (false); - startConnection.block (false); +void BatchQueuePanel::startBatchProc () +{ + // Update switch when queue started programmatically + qStartStopConn.block (true); + qStartStop->set_active(true); + qStartStopConn.block (false); if (batchQueue->hasJobs()) { fdir->set_sensitive (false); fformat->set_sensitive (false); + if (batchQueue->getEntries().size() == 1) { + qStartStop->set_sensitive(false); + } saveOptions(); batchQueue->startProcessing (); } else { @@ -295,13 +303,11 @@ void BatchQueuePanel::stopBatchProc () { + // Update switch when queue started programmatically + qStartStopConn.block (true); + qStartStop->set_active(false); + qStartStopConn.block (false); - stopConnection.block (true); - startConnection.block (true); - stop->set_active (true); - start->set_active (false); - stopConnection.block (false); - startConnection.block (false); updateTab (batchQueue->getEntries().size()); } @@ -310,7 +316,7 @@ batchQueue->addEntries (entries, head); - if (stop->get_active () && autoStart->get_active ()) { + if (!qStartStop->get_active() && qAutoStart->get_active()) { startBatchProc (); } } @@ -318,7 +324,7 @@ bool BatchQueuePanel::canStartNext () { - if (start->get_active ()) { + if (qStartStop->get_active()) { return true; } else { fdir->set_sensitive (true); @@ -332,7 +338,7 @@ options.savePathTemplate = outdirTemplate->get_text(); options.saveUsePathTemplate = useTemplate->get_active(); - options.procQueueEnabled = autoStart->get_active (); + options.procQueueEnabled = qAutoStart->get_active(); } void BatchQueuePanel::pathFolderButtonPressed () @@ -375,7 +381,7 @@ if (ctrl) { switch(event->keyval) { case GDK_KEY_s: - if (start->get_active()) { + if (qStartStop->get_active()) { stopBatchProc(); } else { startBatchProc(); diff -Nru rawtherapee-5.3/rtgui/batchqueuepanel.h rawtherapee-5.4/rtgui/batchqueuepanel.h --- rawtherapee-5.3/rtgui/batchqueuepanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchqueuepanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -34,11 +34,9 @@ Gtk::Button* zoomInButton; Gtk::Button* zoomOutButton; - Gtk::ToggleButton* start; - Gtk::ToggleButton* stop; - Gtk::CheckButton* autoStart; - sigc::connection startConnection; - sigc::connection stopConnection; + Gtk::Switch* qStartStop; + sigc::connection qStartStopConn; + Gtk::CheckButton* qAutoStart; Gtk::Entry* outdirTemplate; MyFileChooserButton* outdirFolder; @@ -69,6 +67,7 @@ void startBatchProc (); void stopBatchProc (); + void startOrStopBatchProc(); void saveOptions (); void pathFolderChanged (); diff -Nru rawtherapee-5.3/rtgui/batchtoolpanelcoord.cc rawtherapee-5.4/rtgui/batchtoolpanelcoord.cc --- rawtherapee-5.3/rtgui/batchtoolpanelcoord.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/batchtoolpanelcoord.cc 2018-03-20 11:04:15.000000000 +0000 @@ -25,31 +25,14 @@ using namespace rtengine::procparams; -BatchToolPanelCoordinator::BatchToolPanelCoordinator (FilePanel* parent) : ToolPanelCoordinator(), somethingChanged(false), parent(parent) +BatchToolPanelCoordinator::BatchToolPanelCoordinator (FilePanel* parent) : ToolPanelCoordinator(true), somethingChanged(false), parent(parent) { blockedUpdate = false; - // remove exif panel and iptc panel - std::vector::iterator epi = std::find (toolPanels.begin(), toolPanels.end(), exifpanel); - - if (epi != toolPanels.end()) { - toolPanels.erase (epi); - } - - std::vector::iterator ipi = std::find (toolPanels.begin(), toolPanels.end(), iptcpanel); - - if (ipi != toolPanels.end()) { - toolPanels.erase (ipi); - } - if (toolBar) { toolBar->setBatchMode (); } - toolPanelNotebook->remove_page (*metadataPanel); - metadataPanel = nullptr; - toiM = nullptr; - for (size_t i = 0; i < toolPanels.size(); i++) { toolPanels[i]->setBatchMode (true); } @@ -168,6 +151,8 @@ sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false); icm->setAdjusterBehavior (false, false); + epd->setAdjusterBehavior (false, false, false, false, false); + fattal->setAdjusterBehavior (false, false, false); chmixer->setAdjusterBehavior (false); blackwhite->setAdjusterBehavior (false, false); @@ -175,7 +160,7 @@ filmSimulation->setAdjusterBehavior(false); retinex->setAdjusterBehavior (false, false, false, false, false, false, false); - shadowshighlights->setAdjusterBehavior (false, false, false); + shadowshighlights->setAdjusterBehavior (false, false); dirpyrequalizer->setAdjusterBehavior (false, false, false); wavelet->setAdjusterBehavior (false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false); dirpyrdenoise->setAdjusterBehavior (false, false, false, false, false, false, false); @@ -206,6 +191,9 @@ cacorrection->setAdjusterBehavior (options.baBehav[ADDSET_CA]); sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); prsharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_RADIUS], options.baBehav[ADDSET_SHARP_AMOUNT], options.baBehav[ADDSET_SHARP_DAMPING], options.baBehav[ADDSET_SHARP_ITER], options.baBehav[ADDSET_SHARP_EDGETOL], options.baBehav[ADDSET_SHARP_HALOCTRL]); + epd->setAdjusterBehavior (options.baBehav[ADDSET_EPD_STRENGTH], options.baBehav[ADDSET_EPD_GAMMA], options.baBehav[ADDSET_EPD_EDGESTOPPING], options.baBehav[ADDSET_EPD_SCALE], options.baBehav[ADDSET_EPD_REWEIGHTINGITERATES]); + fattal->setAdjusterBehavior (options.baBehav[ADDSET_FATTAL_AMOUNT], options.baBehav[ADDSET_FATTAL_THRESHOLD], options.baBehav[ADDSET_FATTAL_ANCHOR]); + localContrast->setAdjusterBehavior(options.baBehav[ADDSET_LOCALCONTRAST_RADIUS], options.baBehav[ADDSET_LOCALCONTRAST_AMOUNT], options.baBehav[ADDSET_LOCALCONTRAST_DARKNESS], options.baBehav[ADDSET_LOCALCONTRAST_LIGHTNESS]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT], options.baBehav[ADDSET_SHARPENEDGE_PASS]); sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT], options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); @@ -217,7 +205,7 @@ chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]); - shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS], options.baBehav[ADDSET_SH_LOCALCONTRAST]); + shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS]); dirpyrequalizer->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYREQ], options.baBehav[ADDSET_DIRPYREQ_THRESHOLD], options.baBehav[ADDSET_DIRPYREQ_SKINPROTECT]); wavelet->setAdjusterBehavior (options.baBehav[ADDSET_WA], options.baBehav[ADDSET_WA_THRESHOLD], options.baBehav[ADDSET_WA_THRESHOLD2], options.baBehav[ADDSET_WA_THRES], options.baBehav[ADDSET_WA_CHRO], options.baBehav[ADDSET_WA_CHROMA], options.baBehav[ADDSET_WA_CONTRAST], options.baBehav[ADDSET_WA_SKINPROTECT], options.baBehav[ADDSET_WA_RESCHRO], options.baBehav[ADDSET_WA_TMRS], options.baBehav[ADDSET_WA_RESCON], options.baBehav[ADDSET_WA_RESCONH], options.baBehav[ADDSET_WA_THRR], options.baBehav[ADDSET_WA_THRRH], options.baBehav[ADDSET_WA_SKYPROTECT], options.baBehav[ADDSET_WA_EDGRAD], options.baBehav[ADDSET_WA_EDGVAL], options.baBehav[ADDSET_WA_STRENGTH], options.baBehav[ADDSET_WA_GAMMA], options.baBehav[ADDSET_WA_EDGEDETECT], options.baBehav[ADDSET_WA_EDGEDETECTTHR], options.baBehav[ADDSET_WA_EDGEDETECTTHR2]); dirpyrdenoise->setAdjusterBehavior (options.baBehav[ADDSET_DIRPYRDN_LUMA], options.baBehav[ADDSET_DIRPYRDN_LUMDET], options.baBehav[ADDSET_DIRPYRDN_CHROMA], options.baBehav[ADDSET_DIRPYRDN_CHROMARED], options.baBehav[ADDSET_DIRPYRDN_CHROMABLUE], options.baBehav[ADDSET_DIRPYRDN_GAMMA], options.baBehav[ADDSET_DIRPYRDN_PASSES]); @@ -239,7 +227,6 @@ if (options.baBehav[ADDSET_TC_SATURATION]) { pparams.toneCurve.saturation = 0;} if (options.baBehav[ADDSET_SH_HIGHLIGHTS]) { pparams.sh.highlights = 0; } if (options.baBehav[ADDSET_SH_SHADOWS]) { pparams.sh.shadows = 0; } - if (options.baBehav[ADDSET_SH_LOCALCONTRAST]) { pparams.sh.localcontrast = 0; } if (options.baBehav[ADDSET_LC_BRIGHTNESS]) { pparams.labCurve.brightness = 0; } if (options.baBehav[ADDSET_LC_CONTRAST]) { pparams.labCurve.contrast = 0; } if (options.baBehav[ADDSET_LC_CHROMATICITY]) { pparams.labCurve.chromaticity = 0; } @@ -364,6 +351,9 @@ if (options.baBehav[ADDSET_RAWFFCLIPCONTROL]) { pparams.raw.ff_clipControl = 0; } if (options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]) { pparams.raw.bayersensor.greenthresh = 0; } if (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE]) { pparams.raw.bayersensor.linenoise = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_AMOUNT]) { pparams.localContrast.amount = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_DARKNESS]) { pparams.localContrast.darkness = 0; } + if (options.baBehav[ADDSET_LOCALCONTRAST_LIGHTNESS]) { pparams.localContrast.lightness = 0; } // *INDENT-ON* } @@ -400,7 +390,7 @@ } // If only a single item is selected, we emulate the behaviour of the editor tool panel coordinator, - // otherwise we adjust the inital parameters on a per-image basis. + // otherwise we adjust the initial parameters on a per-image basis. if (selected.size() == 1) { // Compensate rotation on flip if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { diff -Nru rawtherapee-5.3/rtgui/bayerprocess.cc rawtherapee-5.4/rtgui/bayerprocess.cc --- rawtherapee-5.3/rtgui/bayerprocess.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/bayerprocess.cc 2018-03-20 11:04:15.000000000 +0000 @@ -29,8 +29,8 @@ hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); - for( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++) { - method->append(M("TP_RAW_" + Glib::ustring(procparams::RAWParams::BayerSensor::methodstring[i]).uppercase())); + for(const auto method_string : procparams::RAWParams::BayerSensor::getMethodStrings()) { + method->append(M("TP_RAW_" + Glib::ustring(method_string).uppercase())); } method->set_active(0); @@ -112,7 +112,7 @@ pixelShiftMotionMethod->append(M("TP_RAW_PIXELSHIFTMM_OFF")); pixelShiftMotionMethod->append(M("TP_RAW_PIXELSHIFTMM_AUTO")); pixelShiftMotionMethod->append(M("TP_RAW_PIXELSHIFTMM_CUSTOM")); - pixelShiftMotionMethod->set_active(RAWParams::BayerSensor::ePSMotionCorrectionMethod::Automatic); + pixelShiftMotionMethod->set_active(toUnderlying(RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO)); pixelShiftMotionMethod->show(); hb3->pack_start(*pixelShiftMotionMethod); pixelShiftFrame->pack_start(*hb3); @@ -225,6 +225,11 @@ pixelShiftLmmse->set_tooltip_text (M("TP_RAW_PIXELSHIFTLMMSE_TOOLTIP")); pixelShiftOptions->pack_start(*pixelShiftLmmse); +// pixelShiftOneGreen = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTONEGREEN"), multiImage)); +// pixelShiftOneGreen->setCheckBoxListener (this); +// pixelShiftOneGreen->set_tooltip_text (M("TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP")); +// pixelShiftOptions->pack_start(*pixelShiftOneGreen); + #ifdef PIXELSHIFTDEV pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70)); pixelShiftMotion->setAdjusterListener (this); @@ -347,11 +352,11 @@ pixelShiftMotionCorrection->block (true); #endif - method->set_active(procparams::RAWParams::BayerSensor::numMethods); + method->set_active(std::numeric_limits::max()); imageNumber->set_active(pp->raw.bayersensor.imageNum); - for( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++) { - if( pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[i]) { + for (size_t i = 0; i < procparams::RAWParams::BayerSensor::getMethodStrings().size(); ++i) { + if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodStrings()[i]) { method->set_active(i); oldMethod = i; break; @@ -376,6 +381,7 @@ } pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor); pixelShiftLmmse->setValue (pp->raw.bayersensor.pixelShiftLmmse); +// pixelShiftOneGreen->setValue (pp->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setValue (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->set_sensitive (pp->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setValue (pp->raw.bayersensor.pixelShiftEqualBrightChannel); @@ -427,6 +433,7 @@ pixelShiftBlur->setEdited (pedited->raw.bayersensor.pixelShiftBlur); pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited); pixelShiftLmmse->setEdited (pedited->raw.bayersensor.pixelShiftLmmse); +// pixelShiftOneGreen->setEdited (pedited->raw.bayersensor.pixelShiftOneGreen); pixelShiftEqualBright->setEdited (pedited->raw.bayersensor.pixelShiftEqualBright); pixelShiftEqualBrightChannel->setEdited (pedited->raw.bayersensor.pixelShiftEqualBrightChannel); pixelShiftNonGreenCross->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenCross); @@ -452,7 +459,7 @@ #endif if(!pedited->raw.bayersensor.method) { - method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name + method->set_active(std::numeric_limits::max()); // No name } if(!pedited->raw.bayersensor.imageNum) { imageNumber->set_active_text(M("GENERAL_UNCHANGED")); @@ -468,21 +475,21 @@ } if (!batchMode) { - if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::dcb] || - method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) { + if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCB) || + method->get_active_row_number() == std::numeric_limits::max()) { dcbOptions->show(); } else { dcbOptions->hide(); } - if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::lmmse] || - method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) { + if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::LMMSE) || + method->get_active_row_number() == std::numeric_limits::max()) { lmmseOptions->show(); } else { lmmseOptions->hide(); } - if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::pixelshift] || - method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) { - if(pp->raw.bayersensor.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::Custom) { + if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT) || + method->get_active_row_number() == std::numeric_limits::max()) { + if(pp->raw.bayersensor.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::CUSTOM) { pixelShiftOptions->show(); } else { pixelShiftOptions->hide(); @@ -493,9 +500,9 @@ } // Flase color suppression is applied to all demozaicing method, so don't hide anything - /*if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::eahd] || - pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::hphd] || - pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::vng4]) + /*if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::EAHD) || + pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::HPHD) || + pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::VNG4)) ccSteps->show(); else ccSteps->hide();*/ @@ -520,7 +527,7 @@ pp->raw.bayersensor.dcb_enhance = dcbEnhance->getLastActive (); //pp->raw.bayersensor.all_enhance = allEnhance->getLastActive (); pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue(); - pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::ePSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number(); + pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number(); pp->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getValue(); pp->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getValue(); pp->raw.bayersensor.pixelShiftShowMotion = pixelShiftShowMotion->getLastActive (); @@ -531,6 +538,7 @@ pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->getLastActive (); pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue(); pp->raw.bayersensor.pixelShiftLmmse = pixelShiftLmmse->getLastActive (); +// pp->raw.bayersensor.pixelShiftOneGreen = pixelShiftOneGreen->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBright = pixelShiftEqualBright->getLastActive (); pp->raw.bayersensor.pixelShiftEqualBrightChannel = pixelShiftEqualBrightChannel->getLastActive (); pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->getLastActive (); @@ -554,8 +562,8 @@ #endif int currentRow = method->get_active_row_number(); - if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) { - pp->raw.bayersensor.method = procparams::RAWParams::BayerSensor::methodstring[currentRow]; + if( currentRow >= 0 && currentRow < std::numeric_limits::max()) { + pp->raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method(currentRow)); } currentRow = imageNumber->get_active_row_number(); @@ -566,7 +574,7 @@ if (pedited) { pedited->raw.bayersensor.ccSteps = ccSteps->getEditedState (); - pedited->raw.bayersensor.method = method->get_active_row_number() != procparams::RAWParams::BayerSensor::numMethods; + pedited->raw.bayersensor.method = method->get_active_row_number() != std::numeric_limits::max(); pedited->raw.bayersensor.imageNum = imageNumber->get_active_text() != M("GENERAL_UNCHANGED"); pedited->raw.bayersensor.dcbIterations = dcbIterations->getEditedState (); pedited->raw.bayersensor.dcbEnhance = !dcbEnhance->get_inconsistent(); @@ -583,6 +591,7 @@ pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent(); pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState(); pedited->raw.bayersensor.pixelShiftLmmse = !pixelShiftLmmse->get_inconsistent(); +// pedited->raw.bayersensor.pixelShiftOneGreen = !pixelShiftOneGreen->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBright = !pixelShiftEqualBright->get_inconsistent(); pedited->raw.bayersensor.pixelShiftEqualBrightChannel = !pixelShiftEqualBrightChannel->get_inconsistent(); pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent(); @@ -610,7 +619,7 @@ void BayerProcess::setBatchMode(bool batchMode) { method->append (M("GENERAL_UNCHANGED")); - method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name + method->set_active(std::numeric_limits::max()); // No name #ifdef PIXELSHIFTDEV pixelShiftMotionCorrection->append (M("GENERAL_UNCHANGED")); pixelShiftMotionCorrection->set_active_text (M("GENERAL_UNCHANGED")); @@ -750,22 +759,23 @@ void BayerProcess::methodChanged () { - int curSelection = method->get_active_row_number(); + const int curSelection = method->get_active_row_number(); + const RAWParams::BayerSensor::Method method = RAWParams::BayerSensor::Method(curSelection); if (!batchMode) { - if ( curSelection == procparams::RAWParams::BayerSensor::dcb) { + if (method == procparams::RAWParams::BayerSensor::Method::DCB) { dcbOptions->show(); } else { dcbOptions->hide(); } - if ( curSelection == procparams::RAWParams::BayerSensor::lmmse) { + if (method == procparams::RAWParams::BayerSensor::Method::LMMSE) { lmmseOptions->show(); } else { lmmseOptions->hide(); } - if ( curSelection == procparams::RAWParams::BayerSensor::pixelshift) { + if (method == procparams::RAWParams::BayerSensor::Method::PIXELSHIFT) { if(pixelShiftMotionMethod->get_active_row_number() == 2) { pixelShiftOptions->show(); } else { @@ -780,10 +790,10 @@ Glib::ustring methodName = ""; bool ppreq = false; - if( curSelection >= 0 && curSelection < procparams::RAWParams::BayerSensor::numMethods) { - methodName = procparams::RAWParams::BayerSensor::methodstring[curSelection]; + if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { + methodName = procparams::RAWParams::BayerSensor::getMethodString(method); - if (curSelection == procparams::RAWParams::BayerSensor::mono || oldMethod == procparams::RAWParams::BayerSensor::mono) { + if (method == procparams::RAWParams::BayerSensor::Method::MONO || RAWParams::BayerSensor::Method(oldMethod) == procparams::RAWParams::BayerSensor::Method::MONO) { ppreq = true; } } @@ -848,6 +858,10 @@ if (listener) { listener->panelChanged (EvPixelShiftLmmse, pixelShiftLmmse->getValueAsStr ()); } +// } else if (c == pixelShiftOneGreen) { +// if (listener) { +// listener->panelChanged (EvPixelShiftOneGreen, pixelShiftOneGreen->getValueAsStr ()); +// } } else if (c == pixelShiftEqualBright) { if (!batchMode) { pixelShiftEqualBrightChannel->set_sensitive(newval != CheckValue::off); diff -Nru rawtherapee-5.3/rtgui/bayerprocess.h rawtherapee-5.4/rtgui/bayerprocess.h --- rawtherapee-5.3/rtgui/bayerprocess.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/bayerprocess.h 2018-03-20 11:04:15.000000000 +0000 @@ -49,6 +49,7 @@ CheckBox* pixelShiftBlur; CheckBox* pixelShiftHoleFill; CheckBox* pixelShiftMedian; +// CheckBox* pixelShiftOneGreen; CheckBox* pixelShiftLmmse; CheckBox* pixelShiftEqualBright; CheckBox* pixelShiftEqualBrightChannel; diff -Nru rawtherapee-5.3/rtgui/blackwhite.cc rawtherapee-5.4/rtgui/blackwhite.cc --- rawtherapee-5.3/rtgui/blackwhite.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/blackwhite.cc 2018-03-20 11:04:15.000000000 +0000 @@ -500,7 +500,7 @@ mixerPurple->setValue (pp->blackwhite.mixerPurple); luminanceCurve->setCurve (pp->blackwhite.luminanceCurve); beforeCurve->setCurve (pp->blackwhite.beforeCurve); - beforeCurveMode->set_active(pp->blackwhite.beforeCurveMode); + beforeCurveMode->set_active(toUnderlying(pp->blackwhite.beforeCurveMode)); afterCurve->setCurve (pp->blackwhite.afterCurve); // afterCurveMode->set_active(pp->blackwhite.afterCurveMode); @@ -583,18 +583,18 @@ int tcMode = beforeCurveMode->get_active_row_number(); if (tcMode == 0) { - pp->blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_STD_BW; + pp->blackwhite.beforeCurveMode = BlackWhiteParams::TcMode::STD_BW; } else if (tcMode == 1) { - pp->blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_WEIGHTEDSTD_BW; + pp->blackwhite.beforeCurveMode = BlackWhiteParams::TcMode::WEIGHTEDSTD_BW; } else if (tcMode == 2) { - pp->blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_FILMLIKE_BW; + pp->blackwhite.beforeCurveMode = BlackWhiteParams::TcMode::FILMLIKE_BW; } else if (tcMode == 3) { - pp->blackwhite.beforeCurveMode = BlackWhiteParams::TC_MODE_SATANDVALBLENDING_BW; + pp->blackwhite.beforeCurveMode = BlackWhiteParams::TcMode::SATANDVALBLENDING_BW; } // tcMode = afterCurveMode->get_active_row_number(); -// if (tcMode == 0) pp->blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_STD_BW; - // else if (tcMode == 1) pp->blackwhite.afterCurveMode = BlackWhiteParams::TC_MODE_WEIGHTEDSTD; +// if (tcMode == 0) pp->blackwhite.afterCurveMode = BlackWhiteParams::TCMode::STD_BW; + // else if (tcMode == 1) pp->blackwhite.afterCurveMode = BlackWhiteParams::TCMode::WEIGHTEDSTD; if (pedited) { pedited->blackwhite.enabled = !get_inconsistent(); @@ -1003,7 +1003,7 @@ bool wasEnabled = disableListener(); if (mixerRed->getAddMode()) { - mixerRed->resetValue(false); + mixerRed->resetValue(true); } if (mixerGreen->getAddMode()) { @@ -1053,14 +1053,14 @@ } else { if (autoch->get_active()) { bool wasEnabled = disableListener(); - mixerRed->setValue(33); - mixerGreen->setValue(33); - mixerBlue->setValue(33); - mixerOrange->setValue(33); - mixerYellow->setValue(33); - mixerMagenta->setValue(33); - mixerPurple->setValue(33); - mixerCyan->setValue(33); + mixerRed->resetValue(false); + mixerGreen->resetValue(false); + mixerBlue->resetValue(false); + mixerOrange->resetValue(false); + mixerYellow->resetValue(false); + mixerMagenta->resetValue(false); + mixerPurple->resetValue(false); + mixerCyan->resetValue(false); setting->set_active (11); filter->set_active (0); diff -Nru rawtherapee-5.3/rtgui/bqentryupdater.cc rawtherapee-5.4/rtgui/bqentryupdater.cc --- rawtherapee-5.3/rtgui/bqentryupdater.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/bqentryupdater.cc 2018-03-20 11:04:15.000000000 +0000 @@ -73,14 +73,8 @@ stopped = false; tostop = false; -#if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && defined( WIN32 ) && defined(__x86_64__) -#undef THREAD_PRIORITY_NORMAL - // See Issue 2384 comment #3 - thread = Glib::Thread::create(sigc::mem_fun(*this, &BatchQueueEntryUpdater::processThread), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_NORMAL); -#else #undef THREAD_PRIORITY_LOW thread = Glib::Thread::create(sigc::mem_fun(*this, &BatchQueueEntryUpdater::processThread), (unsigned long int)0, true, true, Glib::THREAD_PRIORITY_LOW); -#endif } } diff -Nru rawtherapee-5.3/rtgui/cacheimagedata.cc rawtherapee-5.4/rtgui/cacheimagedata.cc --- rawtherapee-5.3/rtgui/cacheimagedata.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/cacheimagedata.cc 2018-03-20 11:04:15.000000000 +0000 @@ -24,8 +24,9 @@ CacheImageData::CacheImageData () : md5(""), supported(false), format(FT_Invalid), rankOld(-1), inTrashOld(false), recentlySaved(false), - timeValid(false), year(0), month(0), day(0), hour(0), min(0), sec(0), exifValid(false), - fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0), + timeValid(false), year(0), month(0), day(0), hour(0), min(0), sec(0), exifValid(false), frameCount(1), + fnumber(0.0), shutter(0.0), focalLen(0.0), focalLen35mm(0.0), focusDist(0.f), iso(0), isHDR (false), + isPixelShift (false), sensortype(rtengine::ST_NONE), sampleFormat(rtengine::IIOSF_UNKNOWN), redAWBMul(-1.0), greenAWBMul(-1.0), blueAWBMul(-1.0), rotate(0), thumbImgType(0) { } @@ -138,6 +139,14 @@ iso = keyFile.get_integer ("ExifInfo", "ISO"); } + if (keyFile.has_key ("ExifInfo", "IsHDR")) { + isHDR = keyFile.get_boolean ("ExifInfo", "IsHDR"); + } + + if (keyFile.has_key ("ExifInfo", "IsPixelShift")) { + isPixelShift = keyFile.get_boolean ("ExifInfo", "IsPixelShift"); + } + if (keyFile.has_key ("ExifInfo", "ExpComp")) { expcomp = keyFile.get_string ("ExifInfo", "ExpComp"); } @@ -160,12 +169,21 @@ if (keyFile.has_key ("FileInfo", "Filetype")) { filetype = keyFile.get_string ("FileInfo", "Filetype"); } + if (keyFile.has_key ("FileInfo", "FrameCount")) { + frameCount = static_cast(keyFile.get_integer ("FileInfo", "FrameCount")); + } + if (keyFile.has_key ("FileInfo", "SampleFormat")) { + sampleFormat = (rtengine::IIO_Sample_Format)keyFile.get_integer ("FileInfo", "SampleFormat"); + } } if (format == FT_Raw && keyFile.has_group ("ExtraRawInfo")) { if (keyFile.has_key ("ExtraRawInfo", "ThumbImageType")) { thumbImgType = keyFile.get_integer ("ExtraRawInfo", "ThumbImageType"); } + if (keyFile.has_key ("ExtraRawInfo", "SensorType")) { + sensortype = keyFile.get_integer ("ExtraRawInfo", "SensorType"); + } } else { rotate = 0; thumbImgType = 0; @@ -235,6 +253,8 @@ keyFile.set_double ("ExifInfo", "FocalLen35mm", focalLen35mm); keyFile.set_double ("ExifInfo", "FocusDist", focusDist); keyFile.set_integer ("ExifInfo", "ISO", iso); + keyFile.set_boolean ("ExifInfo", "IsHDR", isHDR); + keyFile.set_boolean ("ExifInfo", "IsPixelShift", isPixelShift); keyFile.set_string ("ExifInfo", "ExpComp", expcomp); } @@ -242,9 +262,12 @@ keyFile.set_string ("ExifInfo", "CameraMake", camMake); keyFile.set_string ("ExifInfo", "CameraModel", camModel); keyFile.set_string ("FileInfo", "Filetype", filetype); + keyFile.set_integer ("FileInfo", "FrameCount", frameCount); + keyFile.set_integer ("FileInfo", "SampleFormat", sampleFormat); if (format == FT_Raw) { keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType); + keyFile.set_integer ("ExtraRawInfo", "SensorType", sensortype); } keyData = keyFile.to_data (); diff -Nru rawtherapee-5.3/rtgui/cacheimagedata.h rawtherapee-5.4/rtgui/cacheimagedata.h --- rawtherapee-5.3/rtgui/cacheimagedata.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/cacheimagedata.h 2018-03-20 11:04:15.000000000 +0000 @@ -22,13 +22,14 @@ #include #include "options.h" #include "../rtengine/rtengine.h" +#include "../rtengine/imageformat.h" -class CacheImageData: public rtengine::ImageMetaData +class CacheImageData: public rtengine::FramesMetaData { public: - // basic informations + // basic information Glib::ustring md5; Glib::ustring version; bool supported; @@ -47,11 +48,16 @@ char sec; // exif info bool exifValid; + unsigned short frameCount; double fnumber; double shutter; double focalLen, focalLen35mm; float focusDist; unsigned iso; + bool isHDR; + bool isPixelShift; + int sensortype; + rtengine::IIO_Sample_Format sampleFormat; Glib::ustring lens; Glib::ustring camMake; Glib::ustring camModel; @@ -78,25 +84,32 @@ int save (const Glib::ustring& fname); //------------------------------------------------------------------------- - // ImageMetaData interface + // FramesMetaData interface //------------------------------------------------------------------------- - bool hasExif() const { return false; } - const rtexif::TagDirectory *getExifData() const { return NULL; } - bool hasIPTC() const { return false; } - const rtengine::procparams::IPTCPairs getIPTCData () const { return rtengine::procparams::IPTCPairs(); } - tm getDateTime () const { return tm{}; } - time_t getDateTimeAsTS() const { return time_t(-1); } - int getISOSpeed() const { return iso; } - double getFNumber() const { return fnumber; } - double getFocalLen() const { return focalLen; } - double getFocalLen35mm() const { return focalLen35mm; } - float getFocusDist() const { return focusDist; } - double getShutterSpeed() const { return shutter; } - double getExpComp() const { return atof(expcomp.c_str()); } - std::string getMake() const { return camMake; } - std::string getModel() const { return camModel; } - std::string getLens() const { return lens; } - std::string getOrientation() const { return ""; } // TODO + unsigned int getRootCount () const { return -1; } + unsigned int getFrameCount () const { return frameCount; } + bool hasExif (unsigned int frame = 0) const { return false; } + rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const { return nullptr; } + rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const { return nullptr; } + rtexif::TagDirectory* getBestExifData (rtengine::ImageSource *imgSource, rtengine::procparams::RAWParams *rawParams) const { return nullptr; } + bool hasIPTC (unsigned int frame = 0) const { return false; } + rtengine::procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const { return rtengine::procparams::IPTCPairs(); } + tm getDateTime (unsigned int frame = 0) const { return tm{}; } + time_t getDateTimeAsTS(unsigned int frame = 0) const { return time_t(-1); } + int getISOSpeed (unsigned int frame = 0) const { return iso; } + double getFNumber (unsigned int frame = 0) const { return fnumber; } + double getFocalLen (unsigned int frame = 0) const { return focalLen; } + double getFocalLen35mm (unsigned int frame = 0) const { return focalLen35mm; } + float getFocusDist (unsigned int frame = 0) const { return focusDist; } + double getShutterSpeed (unsigned int frame = 0) const { return shutter; } + double getExpComp (unsigned int frame = 0) const { return atof(expcomp.c_str()); } + std::string getMake (unsigned int frame = 0) const { return camMake; } + std::string getModel (unsigned int frame = 0) const { return camModel; } + std::string getLens (unsigned int frame = 0) const { return lens; } + std::string getOrientation (unsigned int frame = 0) const { return ""; } // TODO + bool getPixelShift (unsigned int frame = 0) const { return isPixelShift; } + bool getHDR (unsigned int frame = 0) const { return isHDR; } + rtengine::IIOSampleFormat getSampleFormat (unsigned int frame = 0) const { return sampleFormat; } }; #endif diff -Nru rawtherapee-5.3/rtgui/chmixer.cc rawtherapee-5.4/rtgui/chmixer.cc --- rawtherapee-5.3/rtgui/chmixer.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/chmixer.cc 2018-03-20 11:04:15.000000000 +0000 @@ -22,7 +22,7 @@ using namespace rtengine; using namespace rtengine::procparams; -ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL")) +ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true) { imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-RR.png")); @@ -99,12 +99,16 @@ disableListener (); - if (pedited) + setEnabled(pp->chmixer.enabled); + + if (pedited) { for (int i = 0; i < 3; i++) { red[i]->setEditedState (pedited->chmixer.red[i] ? Edited : UnEdited); green[i]->setEditedState (pedited->chmixer.green[i] ? Edited : UnEdited); blue[i]->setEditedState (pedited->chmixer.blue[i] ? Edited : UnEdited); } + set_inconsistent(multiImage && !pedited->chmixer.enabled); + } for (int i = 0; i < 3; i++) { red[i]->setValue (pp->chmixer.red[i]); @@ -123,13 +127,16 @@ pp->chmixer.green[i] = (int) green[i]->getValue (); pp->chmixer.blue[i] = (int) blue[i]->getValue (); } + pp->chmixer.enabled = getEnabled(); - if (pedited) + if (pedited) { for (int i = 0; i < 3; i++) { pedited->chmixer.red[i] = red[i]->getEditedState (); pedited->chmixer.green[i] = green[i]->getEditedState (); pedited->chmixer.blue[i] = blue[i]->getEditedState (); } + pedited->chmixer.enabled = !get_inconsistent(); + } } void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) @@ -158,7 +165,7 @@ void ChMixer::adjusterChanged (Adjuster* a, double newval) { - if (listener) { + if (listener && getEnabled()) { Glib::ustring descr = Glib::ustring::compose ("R=%1,%2,%3\nG=%4,%5,%6\nB=%7,%8,%9", (int)red[0]->getValue(), (int)red[1]->getValue(), (int)red[2]->getValue(), (int)green[0]->getValue(), (int)green[1]->getValue(), (int)green[2]->getValue(), @@ -167,6 +174,21 @@ } } + +void ChMixer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvChMixer, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvChMixer, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvChMixer, M("GENERAL_DISABLED")); + } + } +} + + void ChMixer::setBatchMode (bool batchMode) { diff -Nru rawtherapee-5.3/rtgui/chmixer.h rawtherapee-5.4/rtgui/chmixer.h --- rawtherapee-5.3/rtgui/chmixer.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/chmixer.h 2018-03-20 11:04:15.000000000 +0000 @@ -44,6 +44,7 @@ void adjusterChanged (Adjuster* a, double newval); void setAdjusterBehavior (bool rgbadd); void trimValues (rtengine::procparams::ProcParams* pp); + void enabledChanged(); }; #endif diff -Nru rawtherapee-5.3/rtgui/CMakeLists.txt rawtherapee-5.4/rtgui/CMakeLists.txt --- rawtherapee-5.3/rtgui/CMakeLists.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/CMakeLists.txt 2018-03-20 11:04:15.000000000 +0000 @@ -1,5 +1,6 @@ # Common source files for both CLI and non-CLI execautables set(CLISOURCEFILES + alignedmalloc.cc edit.cc main-cli.cc multilangmgr.cc @@ -11,6 +12,7 @@ set(NONCLISOURCEFILES adjuster.cc + alignedmalloc.cc batchqueue.cc batchqueuebuttonset.cc batchqueueentry.cc @@ -147,6 +149,11 @@ xtransprocess.cc xtransrawexposure.cc zoompanel.cc + fattaltonemap.cc + localcontrast.cc + eventmapper.cc + metadatapanel.cc + labgrid.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") diff -Nru rawtherapee-5.3/rtgui/colorappearance.cc rawtherapee-5.4/rtgui/colorappearance.cc --- rawtherapee-5.3/rtgui/colorappearance.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/colorappearance.cc 2018-03-20 11:04:15.000000000 +0000 @@ -21,7 +21,7 @@ #include "guiutils.h" #include "../rtengine/color.h" -#define MINTEMP0 1500 //1200 +#define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 #define CENTERTEMP0 5000 #define MINGREEN0 0.8 @@ -799,9 +799,9 @@ shape->setCurve (pp->colorappearance.curve); shape2->setCurve (pp->colorappearance.curve2); shape3->setCurve (pp->colorappearance.curve3); - toneCurveMode->set_active (pp->colorappearance.curveMode); - toneCurveMode2->set_active (pp->colorappearance.curveMode2); - toneCurveMode3->set_active (pp->colorappearance.curveMode3); + toneCurveMode->set_active (toUnderlying(pp->colorappearance.curveMode)); + toneCurveMode2->set_active (toUnderlying(pp->colorappearance.curveMode2)); + toneCurveMode3->set_active (toUnderlying(pp->colorappearance.curveMode3)); curveMode3Changed(); // This will set the correct sensitive state of depending Adjusters if (pedited) { @@ -1044,27 +1044,27 @@ int tcMode = toneCurveMode->get_active_row_number(); if (tcMode == 0) { - pp->colorappearance.curveMode = ColorAppearanceParams::TC_MODE_LIGHT; + pp->colorappearance.curveMode = ColorAppearanceParams::TcMode::LIGHT; } else if (tcMode == 1) { - pp->colorappearance.curveMode = ColorAppearanceParams::TC_MODE_BRIGHT; + pp->colorappearance.curveMode = ColorAppearanceParams::TcMode::BRIGHT; } tcMode = toneCurveMode2->get_active_row_number(); if (tcMode == 0) { - pp->colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_LIGHT; + pp->colorappearance.curveMode2 = ColorAppearanceParams::TcMode::LIGHT; } else if (tcMode == 1) { - pp->colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_BRIGHT; + pp->colorappearance.curveMode2 = ColorAppearanceParams::TcMode::BRIGHT; } int tcMode3 = toneCurveMode3->get_active_row_number(); if (tcMode3 == 0) { - pp->colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_CHROMA; + pp->colorappearance.curveMode3 = ColorAppearanceParams::CtcMode::CHROMA; } else if (tcMode3 == 1) { - pp->colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_SATUR; + pp->colorappearance.curveMode3 = ColorAppearanceParams::CtcMode::SATUR; } else if (tcMode3 == 2) { - pp->colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_COLORF; + pp->colorappearance.curveMode3 = ColorAppearanceParams::CtcMode::COLORF; } if (pedited) { @@ -1536,7 +1536,7 @@ float value = (1.f - 0.7f) * float (valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01 (float (valY), float (valX), value, R, G, B); + Color::hsv2rgb01 (float (valY*0.8), float (valX), value, R, G, B); } caller->ccRed = double (R); diff -Nru rawtherapee-5.3/rtgui/colortoning.cc rawtherapee-5.4/rtgui/colortoning.cc --- rawtherapee-5.3/rtgui/colortoning.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/colortoning.cc 2018-03-20 11:04:15.000000000 +0000 @@ -4,10 +4,13 @@ #include "colortoning.h" #include "mycurve.h" #include "rtimage.h" +#include "eventmapper.h" +#include "labgrid.h" using namespace rtengine; using namespace rtengine::procparams; + ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { nextbw = 0; @@ -21,6 +24,7 @@ method->append (M("TP_COLORTONING_RGBCURVES")); method->append (M("TP_COLORTONING_SPLITCOCO")); method->append (M("TP_COLORTONING_SPLITLR")); + method->append(M("TP_COLORTONING_LABGRID")); method->set_active (0); method->set_tooltip_text (M("TP_COLORTONING_METHOD_TOOLTIP")); @@ -41,7 +45,7 @@ colorCurveEditorG->setCurveListener (this); colorShape = static_cast(colorCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); - colorShape->setCurveColorProvider(this, 1); + colorShape->setCurveColorProvider(this, 4); std::vector milestones; // whole hue range @@ -54,14 +58,14 @@ colorShape->setLeftBarBgGradient(milestones); + const ColorToningParams default_params; + // luminance gradient milestones.clear(); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); colorShape->setBottomBarBgGradient(milestones); - std::vector defaultCurve; - rtengine::ColorToningParams::getDefaultColorCurve(defaultCurve); - colorShape->setResetCurve(FCT_MinMaxCPoints, defaultCurve); + colorShape->setResetCurve(FCT_MinMaxCPoints, default_params.colorCurve); // This will add the reset button at the end of the curveType buttons colorCurveEditorG->curveListComplete(); @@ -88,10 +92,9 @@ opacityCurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_OPACITY")); opacityCurveEditorG->setCurveListener (this); - rtengine::ColorToningParams::getDefaultOpacityCurve(defaultCurve); opacityShape = static_cast(opacityCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShape->setIdentityValue(0.); - opacityShape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + opacityShape->setResetCurve(FlatCurveType(default_params.opacityCurve.at(0)), default_params.opacityCurve); opacityShape->setBottomBarBgGradient(milestones); // This will add the reset button at the end of the curveType buttons @@ -107,9 +110,8 @@ clCurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_CHROMAC")); clCurveEditorG->setCurveListener (this); - rtengine::ColorToningParams::getDefaultCLCurve(defaultCurve); clshape = static_cast(clCurveEditorG->addCurve(CT_Diagonal, M("TP_COLORTONING_AB"), irg, false)); - clshape->setResetCurve(DiagonalCurveType(defaultCurve.at(0)), defaultCurve); + clshape->setResetCurve(DiagonalCurveType(default_params.clcurve.at(0)), default_params.clcurve); clshape->setTooltip(M("TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP")); clshape->setLeftBarColorProvider(this, 1); @@ -127,9 +129,8 @@ cl2CurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_CHROMAC")); cl2CurveEditorG->setCurveListener (this); - rtengine::ColorToningParams::getDefaultCL2Curve(defaultCurve); cl2shape = static_cast(cl2CurveEditorG->addCurve(CT_Diagonal, M("TP_COLORTONING_BY"), iby, false)); - cl2shape->setResetCurve(DiagonalCurveType(defaultCurve.at(0)), defaultCurve); + cl2shape->setResetCurve(DiagonalCurveType(default_params.cl2curve.at(0)), default_params.cl2curve); cl2shape->setTooltip(M("TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP")); cl2shape->setLeftBarColorProvider(this, 1); @@ -315,6 +316,26 @@ greenhigh->setAdjusterListener (this); bluehigh->setAdjusterListener (this); + //------------------------------------------------------------------------ + // LAB grid + auto m = ProcEventMapper::getInstance(); + EvColorToningLabGridValue = m->newEvent(RGBCURVE, "HISTORY_MSG_COLORTONING_LABGRID_VALUE"); + labgridBox = Gtk::manage(new Gtk::HBox()); + labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue)); + labgridBox->pack_start(*labgrid, true, true); + labgridReset = Gtk::manage(new Gtk::Button ()); + labgridReset->add (*Gtk::manage(new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); + setExpandAlignProperties(labgridReset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + labgridReset->set_relief(Gtk::RELIEF_NONE); + labgridReset->set_tooltip_text(M("ADJUSTER_RESET_TO_DEFAULT")); + labgridReset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + labgridReset->set_can_focus(false); + labgridReset->set_size_request(-1, 20); + labgridReset->signal_button_release_event().connect(sigc::mem_fun(*this, &ColorToning::resetPressed)); + labgridBox->pack_start(*labgridReset, false, false); + pack_start(*labgridBox, Gtk::PACK_EXPAND_WIDGET, 4); + //------------------------------------------------------------------------ + show_all(); disableListener(); @@ -332,6 +353,13 @@ delete cl2CurveEditorG; } + +void ColorToning::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + labgrid->setListener(tpl); +} + /* void ColorToning::neutralCurves_pressed () { disableListener(); @@ -403,6 +431,8 @@ clshape->setUnChanged (!pedited->colorToning.clcurve); cl2shape->setUnChanged (!pedited->colorToning.cl2curve); lumamode->set_inconsistent (!pedited->colorToning.lumamode); + + labgrid->setEdited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); } redlow->setValue (pp->colorToning.redlow); @@ -434,6 +464,8 @@ lastLumamode = pp->colorToning.lumamode; + labgrid->setParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); + if (pedited && !pedited->colorToning.method) { method->set_active (5); } else if (pp->colorToning.method == "Lab") { @@ -446,6 +478,8 @@ method->set_active (3); } else if (pp->colorToning.method == "Splitlr") { method->set_active (4); + } else if (pp->colorToning.method == "LabGrid") { + method->set_active(5); } methodChanged(); @@ -498,6 +532,8 @@ pp->colorToning.saturatedOpacity = saturatedOpacity->getIntValue(); pp->colorToning.strength = strength->getIntValue(); + labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + if (pedited) { pedited->colorToning.redlow = redlow->getEditedState (); pedited->colorToning.greenlow = greenlow->getEditedState (); @@ -522,6 +558,8 @@ pedited->colorToning.hlColSat = hlColSat->getEditedState (); pedited->colorToning.shadowsColSat = shadowsColSat->getEditedState (); + + pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = labgrid->getEdited(); } if (method->get_active_row_number() == 0) { @@ -534,6 +572,8 @@ pp->colorToning.method = "Splitco"; } else if (method->get_active_row_number() == 4) { pp->colorToning.method = "Splitlr"; + } else if (method->get_active_row_number() == 5) { + pp->colorToning.method = "LabGrid"; } if (twocolor->get_active_row_number() == 0) { @@ -590,6 +630,7 @@ hlColSat->setDefault (defParams->colorToning.hlColSat); shadowsColSat->setDefault (defParams->colorToning.shadowsColSat); strength->setDefault (defParams->colorToning.strength); + labgrid->setDefault(defParams->colorToning.labgridALow, defParams->colorToning.labgridBLow, defParams->colorToning.labgridAHigh, defParams->colorToning.labgridBHigh); if (pedited) { redlow->setDefaultEditedState (pedited->colorToning.redlow ? Edited : UnEdited); @@ -607,6 +648,7 @@ hlColSat->setDefaultEditedState (pedited->colorToning.hlColSat ? Edited : UnEdited); shadowsColSat->setDefaultEditedState (pedited->colorToning.shadowsColSat ? Edited : UnEdited); strength->setDefaultEditedState (pedited->colorToning.strength ? Edited : UnEdited); + labgrid->setEdited((pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh) ? Edited : UnEdited); } else { redlow->setDefaultEditedState (Irrelevant); greenlow->setDefaultEditedState (Irrelevant); @@ -623,6 +665,7 @@ hlColSat->setDefaultEditedState (Irrelevant); shadowsColSat->setDefaultEditedState (Irrelevant); strength->setDefaultEditedState (Irrelevant); + labgrid->setEdited(Edited); } } @@ -785,6 +828,8 @@ { if (!batchMode) { + labgridBox->hide(); + if (method->get_active_row_number() == 0) { // Lab colorSep->show(); colorCurveEditorG->show(); @@ -932,6 +977,26 @@ chanMixerBox->hide(); neutrHBox->hide(); lumamode->show(); + } else if (method->get_active_row_number() == 5) { // Lab Grid + colorSep->hide(); + colorCurveEditorG->hide(); + twocolor->hide(); + opacityCurveEditorG->hide(); + clCurveEditorG->hide(); + cl2CurveEditorG->hide(); + hlColSat->hide(); + shadowsColSat->hide(); + balance->hide(); + p1Frame->hide(); + autosat->hide(); + satProtectionThreshold->hide(); + saturatedOpacity->hide(); + strength->hide(); + chanMixerBox->hide(); + neutrHBox->hide(); + lumamode->hide(); + + labgridBox->show(); } } @@ -954,40 +1019,40 @@ float R = 0.f, G = 0.f, B = 0.f; - if (callerId == 1) { // ch - main curve - Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); + if (callerId == 1) { // opacity curve left bar(s) + Color::hsv2rgb01(float(valY*0.8), 1.0f, 0.5f, R, G, B); } else if (callerId == 2) { // Slider 1 background - if (valY > 0.5) + if (valY <= 0.5) // the hue range { Color::hsv2rgb01(float(valX), 1.0f, 0.5f, R, G, B); } else { // the strength applied to the current hue double strength, hue; - float r_, g_, b_; hlColSat->getValue(strength, hue); - Color::hsv2rgb01(valY * 2.f, 1.f, 1.f, r_, g_, b_); Color::hsv2rgb01(hue / 360.f, 1.f, 1.f, R, G, B); - R = r_ + (R - r_) * valX; - G = g_ + (G - g_) * valX; - B = b_ + (B - b_) * valX; + const double gray = 0.46; + R = (gray * (1.0 - valX)) + R * valX; + G = (gray * (1.0 - valX)) + G * valX; + B = (gray * (1.0 - valX)) + B * valX; } } else if (callerId == 3) { // Slider 2 background - if (valY > 0.5) + if (valY <= 0.5) // the hue range { Color::hsv2rgb01(float(valX), 1.0f, 0.5f, R, G, B); } else { // the strength applied to the current hue double strength, hue; - float r_, g_, b_; shadowsColSat->getValue(strength, hue); - Color::hsv2rgb01(valY * 2.f, 1.f, 1.f, r_, g_, b_); Color::hsv2rgb01(hue / 360.f, 1.f, 1.f, R, G, B); - R = r_ + (R - r_) * valX; - G = g_ + (G - g_) * valX; - B = b_ + (B - b_) * valX; + const double gray = 0.46; + R = (gray * (1.0 - valX)) + R * valX; + G = (gray * (1.0 - valX)) + G * valX; + B = (gray * (1.0 - valX)) + B * valX; } + } else if (callerId == 4) { // color curve vertical and horizontal crosshair + Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); } caller->ccRed = double(R); @@ -1100,3 +1165,9 @@ cl2CurveEditorG->setBatchMode (batchMode); } + +bool ColorToning::resetPressed(GdkEventButton* event) +{ + labgrid->reset(event->state & GDK_CONTROL_MASK); + return false; +} diff -Nru rawtherapee-5.3/rtgui/colortoning.h rawtherapee-5.4/rtgui/colortoning.h --- rawtherapee-5.3/rtgui/colortoning.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/colortoning.h 2018-03-20 11:04:15.000000000 +0000 @@ -12,6 +12,7 @@ #include "curveeditorgroup.h" #include "thresholdadjuster.h" #include "colorprovider.h" +#include "labgrid.h" class ColorToning final : public ToolParamBlock, @@ -49,7 +50,11 @@ void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void setListener(ToolPanelListener *tpl); + private: + bool resetPressed(GdkEventButton* event); + //Gtk::HSeparator* satLimiterSep; Gtk::HSeparator* colorSep; CurveEditorGroup* colorCurveEditorG; @@ -101,6 +106,11 @@ bool lastLumamode; sigc::connection lumamodeConn; + rtengine::ProcEvent EvColorToningLabGridValue; + Gtk::Button *labgridReset; + LabGrid *labgrid; + Gtk::HBox *labgridBox; + IdleRegister idle_register; }; diff -Nru rawtherapee-5.3/rtgui/config.h.in rawtherapee-5.4/rtgui/config.h.in --- rawtherapee-5.3/rtgui/config.h.in 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/config.h.in 2018-03-20 11:04:15.000000000 +0000 @@ -21,6 +21,7 @@ #define __CONFIG_H__ #cmakedefine BUILD_BUNDLE +#cmakedefine HAVE_UNALIGNED_MALLOC #define DATA_SEARCH_PATH "${DATADIR}" #define DOC_SEARCH_PATH "${DOCDIR}" #define CREDITS_SEARCH_PATH "${CREDITSDIR}" diff -Nru rawtherapee-5.3/rtgui/coordinateadjuster.cc rawtherapee-5.4/rtgui/coordinateadjuster.cc --- rawtherapee-5.3/rtgui/coordinateadjuster.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/coordinateadjuster.cc 2018-03-20 11:04:15.000000000 +0000 @@ -135,7 +135,11 @@ box->attach_next_to(*(currAdjuster->spinButton), Gtk::POS_LEFT, 1, 1); box->attach_next_to(*(currAdjuster->label), Gtk::POS_LEFT, 1, 1); - add(*box); + Gtk::FlowBoxChild *fbChild = Gtk::manage(new Gtk::FlowBoxChild()); + fbChild->set_can_focus(false); + fbChild->add(*box); + + add(*fbChild); } } diff -Nru rawtherapee-5.3/rtgui/crop.cc rawtherapee-5.4/rtgui/crop.cc --- rawtherapee-5.3/rtgui/crop.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/crop.cc 2018-03-20 11:04:15.000000000 +0000 @@ -57,6 +57,7 @@ Crop::Crop(): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true), crop_ratios{ + {M("GENERAL_ASIMAGE"), 0.0}, {"3:2", 3.0 / 2.0}, // L1.5, P0.666... {"4:3", 4.0 / 3.0}, // L1.333..., P0.75 {"16:9", 16.0 / 9.0}, // L1.777..., P0.5625 @@ -292,10 +293,14 @@ setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h); } - ratio->set_active_text (pp->crop.ratio); + if (pp->crop.ratio == "As Image") { + ratio->set_active(0); + } else { + ratio->set_active_text (pp->crop.ratio); + } fixr->set_active (pp->crop.fixratio); - const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = pp->crop.fixratio && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; if (pp->crop.orientation == "Landscape") { orientation->set_active (flip_orientation ? 1 : 0); @@ -390,7 +395,7 @@ pp->crop.ratio = ratio->get_active_text (); // for historical reasons we store orientation different if ratio is written as 2:3 instead of 3:2, but in GUI 'landscape' is always long side horizontal regardless of the ratio is written short or long side first. - const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value < 1.0; + const bool flip_orientation = fixr->get_active() && crop_ratios[ratio->get_active_row_number()].value > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; if (orientation->get_active_row_number() == 0) { pp->crop.orientation = flip_orientation ? "Portrait" : "Landscape"; @@ -1265,6 +1270,9 @@ } r = crop_ratios[ratio->get_active_row_number()].value; + if (!r) { + r = maxh <= maxw ? float(maxh)/float(maxw) : float(maxw)/float(maxh); + } if (r < 1.0) { r = 1.0 / r; // convert to long side first (eg 4:5 becomes 5:4) diff -Nru rawtherapee-5.3/rtgui/crophandler.cc rawtherapee-5.4/rtgui/crophandler.cc --- rawtherapee-5.3/rtgui/crophandler.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/crophandler.cc 2018-03-20 11:04:15.000000000 +0000 @@ -29,19 +29,35 @@ using namespace rtengine; -CropHandler::CropHandler () - : zoom(100), ww(0), wh(0), cax(-1), cay(-1), - cx(0), cy(0), cw(0), ch(0), cropX(0), cropY(0), cropW(0), cropH(0), enabled(false), - cropimg(nullptr), cropimgtrue(nullptr), cropimg_width(0), cropimg_height(0), - cix(0), ciy(0), ciw(0), cih(0), cis(1), - initial(false), isLowUpdatePriority(false), ipc(nullptr), crop(nullptr), - displayHandler(nullptr) +CropHandler::CropHandler() : + zoom(100), + ww(0), + wh(0), + cax(-1), + cay(-1), + cx(0), + cy(0), + cw(0), + ch(0), + cropX(0), + cropY(0), + cropW(0), + cropH(0), + enabled(false), + cropimg_width(0), + cropimg_height(0), + cix(0), + ciy(0), + ciw(0), + cih(0), + cis(1), + isLowUpdatePriority(false), + ipc(nullptr), + crop(nullptr), + displayHandler(nullptr), + redraw_needed(false), + initial(false) { - - idle_helper = new IdleHelper; - idle_helper->destroyed = false; - idle_helper->pending = 0; - idle_helper->cropHandler = this; } CropHandler::~CropHandler () @@ -59,16 +75,6 @@ delete crop; // will do the same than destroy, plus delete the object crop = nullptr; } - - cimg.lock (); - - if (idle_helper->pending) { - idle_helper->destroyed = true; - } else { - delete idle_helper; - } - - cimg.unlock (); } void CropHandler::setEditSubscriber (EditSubscriber* newSubscriber) @@ -192,9 +198,10 @@ compDim (); if (enabled && (oldZoom != zoom || oldcax != cax || oldcay != cay || oldCropX != cropX || oldCropY != cropY || oldCropW != cropW || oldCropH != cropH)) { - if (needsFullRefresh) { + if (needsFullRefresh && !ipc->getHighQualComputed()) { cropPixbuf.clear (); ipc->startProcessing(M_HIGHQUAL); + ipc->setHighQualComputed(); } else { update (); } @@ -308,110 +315,94 @@ cropPixbuf.clear (); - if (cropimg) { - delete [] cropimg; + if (!cropimg.empty()) { + cropimg.clear(); } - cropimg = nullptr; - - if (cropimgtrue) { - delete [] cropimgtrue; + if (!cropimgtrue.empty()) { + cropimgtrue.clear(); } - cropimgtrue = nullptr; - if (ax == cropX && ay == cropY && aw == cropW && ah == cropH && askip == (zoom >= 1000 ? 1 : zoom / 10)) { cropimg_width = im->getWidth (); cropimg_height = im->getHeight (); - cropimg = new unsigned char [3 * cropimg_width * cropimg_height]; - cropimgtrue = new unsigned char [3 * cropimg_width * cropimg_height]; - memcpy (cropimg, im->getData(), 3 * cropimg_width * cropimg_height); - memcpy (cropimgtrue, imtrue->getData(), 3 * cropimg_width * cropimg_height); + const std::size_t cropimg_size = 3 * cropimg_width * cropimg_height; + cropimg.assign(im->getData(), im->getData() + cropimg_size); + cropimgtrue.assign(imtrue->getData(), imtrue->getData() + cropimg_size); cix = ax; ciy = ay; ciw = aw; cih = ah; cis = askip; - idle_helper->pending++; - - const auto func = [](gpointer data) -> gboolean { - IdleHelper* const idle_helper = static_cast(data); - - if (idle_helper->destroyed) { - if (idle_helper->pending == 1) { - delete idle_helper; - } else { - idle_helper->pending--; - } - - return FALSE; - } - CropHandler* ch = idle_helper->cropHandler; + bool expected = false; - ch->cimg.lock (); - ch->cropPixbuf.clear (); - - if (!ch->enabled) { - delete [] ch->cropimg; - ch->cropimg = nullptr; - delete [] ch->cropimgtrue; - ch->cropimgtrue = nullptr; - ch->cimg.unlock (); - return FALSE; - } - - if (ch->cropimg) { - if (ch->cix == ch->cropX && ch->ciy == ch->cropY && ch->ciw == ch->cropW && ch->cih == ch->cropH && ch->cis == (ch->zoom >= 1000 ? 1 : ch->zoom / 10)) { - // calculate final image size - float czoom = ch->zoom >= 1000 ? - ch->zoom / 1000.f : - float((ch->zoom/10) * 10) / float(ch->zoom); - int imw = ch->cropimg_width * czoom; - int imh = ch->cropimg_height * czoom; - - if (imw > ch->ww) { - imw = ch->ww; + if (redraw_needed.compare_exchange_strong(expected, true)) { + const auto func = [](gpointer data) -> gboolean { + CropHandler* const self = static_cast(data); + + self->cimg.lock (); + + if (self->redraw_needed.exchange(false)) { + self->cropPixbuf.clear (); + + if (!self->enabled) { + self->cropimg.clear(); + self->cropimgtrue.clear(); + self->cimg.unlock (); + return FALSE; } - if (imh > ch->wh) { - imh = ch->wh; - } - - Glib::RefPtr tmpPixbuf = Gdk::Pixbuf::create_from_data (ch->cropimg, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, ch->cropimg_height, 3 * ch->cropimg_width); - ch->cropPixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); - tmpPixbuf->scale (ch->cropPixbuf, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); - tmpPixbuf.clear (); - - Glib::RefPtr tmpPixbuftrue = Gdk::Pixbuf::create_from_data (ch->cropimgtrue, Gdk::COLORSPACE_RGB, false, 8, ch->cropimg_width, ch->cropimg_height, 3 * ch->cropimg_width); - ch->cropPixbuftrue = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); - tmpPixbuftrue->scale (ch->cropPixbuftrue, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); - tmpPixbuftrue.clear (); - } + if (!self->cropimg.empty()) { + if (self->cix == self->cropX && self->ciy == self->cropY && self->ciw == self->cropW && self->cih == self->cropH && self->cis == (self->zoom >= 1000 ? 1 : self->zoom / 10)) { + // calculate final image size + float czoom = self->zoom >= 1000 ? + self->zoom / 1000.f : + float((self->zoom/10) * 10) / float(self->zoom); + int imw = self->cropimg_width * czoom; + int imh = self->cropimg_height * czoom; + + if (imw > self->ww) { + imw = self->ww; + } + + if (imh > self->wh) { + imh = self->wh; + } + + Glib::RefPtr tmpPixbuf = Gdk::Pixbuf::create_from_data (self->cropimg.data(), Gdk::COLORSPACE_RGB, false, 8, self->cropimg_width, self->cropimg_height, 3 * self->cropimg_width); + self->cropPixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); + tmpPixbuf->scale (self->cropPixbuf, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); + tmpPixbuf.clear (); + + Glib::RefPtr tmpPixbuftrue = Gdk::Pixbuf::create_from_data (self->cropimgtrue.data(), Gdk::COLORSPACE_RGB, false, 8, self->cropimg_width, self->cropimg_height, 3 * self->cropimg_width); + self->cropPixbuftrue = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); + tmpPixbuftrue->scale (self->cropPixbuftrue, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); + tmpPixbuftrue.clear (); + } - delete [] ch->cropimg; - ch->cropimg = nullptr; - delete [] ch->cropimgtrue; - ch->cropimgtrue = nullptr; - } + self->cropimg.clear(); + self->cropimgtrue.clear(); + } - ch->cimg.unlock (); + self->cimg.unlock (); - if (ch->displayHandler) { - ch->displayHandler->cropImageUpdated (); + if (self->displayHandler) { + self->displayHandler->cropImageUpdated (); - if (ch->initial) { - ch->displayHandler->initialImageArrived (); - ch->initial = false; + if (self->initial.exchange(false)) { + self->displayHandler->initialImageArrived (); + } + } + } else { + self->cimg.unlock(); } - } - idle_helper->pending--; - - return FALSE; - }; + return FALSE; + }; - idle_register.add(func, idle_helper); + idle_register.add(func, this/*, G_PRIORITY_HIGH_IDLE*/); + } } cimg.unlock (); @@ -426,11 +417,11 @@ cwh = cropH; // hack: if called before first size allocation the size will be 0 - if (cww < 10) { + if (cww == 0) { cww = 10; } - if (cwh < 32) { + if (cwh == 0) { cwh = 32; } @@ -468,13 +459,11 @@ crop->setListener (nullptr); } - cimg.lock (); - delete [] cropimg; - cropimg = nullptr; - delete [] cropimgtrue; - cropimgtrue = nullptr; - cropPixbuf.clear (); - cimg.unlock (); + cimg.lock(); + cropimg.clear(); + cropimgtrue.clear(); + cropPixbuf.clear(); + cimg.unlock(); } else { update (); } diff -Nru rawtherapee-5.3/rtgui/crophandler.h rawtherapee-5.4/rtgui/crophandler.h --- rawtherapee-5.3/rtgui/crophandler.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/crophandler.h 2018-03-20 11:04:15.000000000 +0000 @@ -19,11 +19,16 @@ #ifndef __CROPHANDLER__ #define __CROPHANDLER__ +#include +#include + +#include + #include "../rtengine/rtengine.h" -#include "threadutils.h" + #include "edit.h" #include "lockablecolorpicker.h" -#include +#include "threadutils.h" class CropDisplayHandler { @@ -98,12 +103,6 @@ MyMutex cimg; private: - struct IdleHelper { - CropHandler* cropHandler; - bool destroyed; - int pending; - }; - void compDim (); int zoom; // scale factor (e.g. 5 if 1:5 scale) ; if 1:1 scale and bigger, factor is multiplied by 1000 (i.e. 1000 for 1:1 scale, 2000 for 2:1, etc...) @@ -112,17 +111,18 @@ int cx, cy, cw, ch; // position and size of the requested crop ; position expressed in image coordinates, so cx and cy might be negative and cw and ch higher than the image's 1:1 size int cropX, cropY, cropW, cropH; // cropPixbuf's displayed area (position and size), i.e. coordinates in 1:1 scale, i.e. cx, cy, cw & ch trimmed to the image's bounds bool enabled; - unsigned char* cropimg; - unsigned char* cropimgtrue; + std::vector cropimg; + std::vector cropimgtrue; int cropimg_width, cropimg_height, cix, ciy, ciw, cih, cis; - bool initial; bool isLowUpdatePriority; rtengine::StagedImageProcessor* ipc; rtengine::DetailedCrop* crop; CropDisplayHandler* displayHandler; - IdleHelper* idle_helper; + + std::atomic redraw_needed; + std::atomic initial; IdleRegister idle_register; }; diff -Nru rawtherapee-5.3/rtgui/cropwindow.cc rawtherapee-5.4/rtgui/cropwindow.cc --- rawtherapee-5.3/rtgui/cropwindow.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/cropwindow.cc 2018-03-20 11:04:15.000000000 +0000 @@ -312,8 +312,10 @@ screenCoordToImage (x, y, action_x, action_y); changeZoom (zoom11index, true, action_x, action_y); fitZoom = false; + } else if (options.cropAutoFit) { + zoomFitCrop(); } else { - zoomFit (); + zoomFit(); } } else { zoom11 (); @@ -612,6 +614,10 @@ } needRedraw = true; + + if (fitZoom && options.cropAutoFit) { + zoomFitCrop(); + } } else if (state == SCropWinMove) { if (iarea->showColorPickers () && !colorPickers.empty()) { needRedraw = true; @@ -722,6 +728,10 @@ cropgl->cropManipReady (); iarea->setToolHand (); needRedraw = true; + + if (fitZoom && options.cropAutoFit) { + zoomFitCrop(); + } } if (decorated) { @@ -1047,7 +1057,7 @@ if(ipc) { procparams::ProcParams params; ipc->getParams(¶ms); - if(params.raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::none] || params.raw.xtranssensor.method == RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::none]) { + if(params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE)) { ImageSource *isrc = static_cast(ipc->getInitialImage()); isrc->getRawValues(mx, my, params.coarse.rotate, rval, gval, bval); } @@ -1356,6 +1366,21 @@ drawObservedFrame (cr); } } else { + CropParams cropParams = cropHandler.cropParams; + if (state == SNormal) { + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cropParams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cropParams.guide = "Frame"; + break; + default: + break; + } + } + bool useBgColor = (state == SNormal); + if (cropHandler.cropPixbuf) { imgW = cropHandler.cropPixbuf->get_width (); imgH = cropHandler.cropPixbuf->get_height (); @@ -1772,7 +1797,7 @@ if (cropHandler.cropParams.enabled) { int cropX, cropY; cropHandler.getPosition (cropX, cropY); - drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, imgW, imgH, cropX, cropY, zoomSteps[cropZoom].zoom, cropHandler.cropParams, (this == iarea->mainCropWindow), true, cropHandler.isFullDisplay ()); + drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, imgW, imgH, cropX, cropY, zoomSteps[cropZoom].zoom, cropParams, (this == iarea->mainCropWindow), useBgColor, cropHandler.isFullDisplay ()); } if (observedCropWin) { @@ -1853,7 +1878,7 @@ cr->fill(); if (cropHandler.cropParams.enabled) { - drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, rough->get_width(), rough->get_height(), cropX, cropY, zoomSteps[cropZoom].zoom, cropHandler.cropParams, (this == iarea->mainCropWindow), true, cropHandler.isFullDisplay ()); + drawCrop (cr, x + imgAreaX + imgX, y + imgAreaY + imgY, rough->get_width(), rough->get_height(), cropX, cropY, zoomSteps[cropZoom].zoom, cropParams, (this == iarea->mainCropWindow), useBgColor, cropHandler.isFullDisplay ()); } if (observedCropWin) { @@ -1980,7 +2005,7 @@ fitZoom = false; } -void CropWindow::zoom11 () +void CropWindow::zoom11 (bool notify) { int x = -1; @@ -2002,7 +2027,7 @@ screenCoordToImage(xpos + imgX + imgW / 2, ypos + imgY + imgH / 2, x, y); } - changeZoom (zoom11index, true, x, y); + changeZoom (zoom11index, notify, x, y, notify); fitZoom = false; } @@ -2097,7 +2122,7 @@ centerY = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; setCropAnchorPosition(centerX, centerY); changeZoom (cz, true, centerX, centerY); - fitZoom = false; + fitZoom = options.cropAutoFit; } else { zoomFit(); } @@ -2157,7 +2182,7 @@ } } } -void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery) +void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery, bool needsRedraw) { if (zoom < 0) { @@ -2176,7 +2201,8 @@ listener->cropZoomChanged (this); } - iarea->redraw (); + if (needsRedraw) + iarea->redraw (); } LockableColorPicker::Validity CropWindow::checkValidity (LockableColorPicker* picker, const rtengine::Coord &pos) @@ -2552,7 +2578,7 @@ { for (auto listener : listeners) { - listener->initialImageArrived (this); + listener->initialImageArrived(); } } diff -Nru rawtherapee-5.3/rtgui/cropwindow.h rawtherapee-5.4/rtgui/cropwindow.h --- rawtherapee-5.3/rtgui/cropwindow.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/cropwindow.h 2018-03-20 11:04:15.000000000 +0000 @@ -40,7 +40,7 @@ virtual void cropPositionChanged (CropWindow*) {} virtual void cropWindowSizeChanged (CropWindow*) {} virtual void cropZoomChanged (CropWindow*) {} - virtual void initialImageArrived (CropWindow*) {} + virtual void initialImageArrived () {} }; class ImageArea; @@ -106,7 +106,7 @@ void drawScaledSpotRectangle (Cairo::RefPtr cr, int rectSize); void drawUnscaledSpotRectangle (Cairo::RefPtr cr, int rectSize); void drawObservedFrame (Cairo::RefPtr cr, int rw = 0, int rh = 0); - void changeZoom (int zoom, bool notify = true, int centerx = -1, int centery = -1); + void changeZoom (int zoom, bool notify = true, int centerx = -1, int centery = -1, bool needsRedraw = true); void updateHoveredPicker (rtengine::Coord *imgPos = nullptr); void cycleRGB (); void cycleHSV (); @@ -176,7 +176,7 @@ // zoomlistener interface void zoomIn (bool toCursor = false, int cursorX = -1, int cursorY = -1); void zoomOut (bool toCursor = false, int cursorX = -1, int cursorY = -1); - void zoom11 (); + void zoom11 (bool notify = true); void zoomFit (); void zoomFitCrop (); double getZoom (); diff -Nru rawtherapee-5.3/rtgui/darkframe.cc rawtherapee-5.4/rtgui/darkframe.cc --- rawtherapee-5.3/rtgui/darkframe.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/darkframe.cc 2018-03-20 11:04:15.000000000 +0000 @@ -46,7 +46,7 @@ pack_start( *dfInfo, Gtk::PACK_SHRINK, 0); dfautoconn = dfAuto->signal_toggled().connect ( sigc::mem_fun(*this, &DarkFrame::dfAutoChanged), true); - dfFile = darkFrameFile->signal_file_set().connect ( sigc::mem_fun(*this, &DarkFrame::darkFrameChanged), true); + dfFile = darkFrameFile->signal_file_set().connect ( sigc::mem_fun(*this, &DarkFrame::darkFrameChanged)); //, true); btnReset->signal_clicked().connect( sigc::mem_fun(*this, &DarkFrame::darkFrameReset), true ); // Set filename filters @@ -77,7 +77,7 @@ dfAuto->set_active( pp->raw.df_autoselect ); if(pedited ) { - dfAuto->set_inconsistent(!pedited->raw.dfAuto ); + dfAuto->set_inconsistent(!pedited->raw.df_autoselect ); } if (Glib::file_test (pp->raw.dark_frame, Glib::FILE_TEST_EXISTS)) { @@ -152,7 +152,7 @@ if (pedited) { pedited->raw.darkFrame = dfChanged; - pedited->raw.dfAuto = !dfAuto->get_inconsistent(); + pedited->raw.df_autoselect = !dfAuto->get_inconsistent(); } } diff -Nru rawtherapee-5.3/rtgui/diagonalcurveeditorsubgroup.cc rawtherapee-5.4/rtgui/diagonalcurveeditorsubgroup.cc --- rawtherapee-5.3/rtgui/diagonalcurveeditorsubgroup.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/diagonalcurveeditorsubgroup.cc 2018-03-20 11:04:15.000000000 +0000 @@ -67,9 +67,9 @@ } editPointCustom = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointCustom, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, Glib::ustring(M("CURVEEDITOR_EDITPOINT_HINT"))); + initButton(*editPointCustom, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editCustom = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCustom, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, Glib::ustring(M("EDIT_PIPETTE_TOOLTIP"))); + initButton(*editCustom, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editCustom->hide(); copyCustom = Gtk::manage (new Gtk::Button ()); initButton(*copyCustom, Glib::ustring("edit-copy.png"), Gtk::ALIGN_END, true); @@ -144,9 +144,9 @@ } editPointNURBS = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointNURBS, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, Glib::ustring(M("CURVEEDITOR_EDITPOINT_HINT"))); + initButton(*editPointNURBS, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editNURBS = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editNURBS, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, Glib::ustring(M("EDIT_PIPETTE_TOOLTIP"))); + initButton(*editNURBS, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editNURBS->hide(); copyNURBS = Gtk::manage (new Gtk::Button ()); initButton(*copyNURBS, Glib::ustring("edit-copy.png"), Gtk::ALIGN_END, true); @@ -224,7 +224,7 @@ shcSelector->set_name("CurveSHCSelector"); // To handle the 4px gap between the SHCSelector and the curve through CSS editParam = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editParam, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, Glib::ustring(M("EDIT_PIPETTE_TOOLTIP"))); + initButton(*editParam, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editParam->hide(); copyParam = Gtk::manage (new Gtk::Button ()); initButton(*copyParam, Glib::ustring("edit-copy.png"), Gtk::ALIGN_END, true); diff -Nru rawtherapee-5.3/rtgui/dirpyrdenoise.cc rawtherapee-5.4/rtgui/dirpyrdenoise.cc --- rawtherapee-5.3/rtgui/dirpyrdenoise.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/dirpyrdenoise.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,7 @@ std::vector defaultCurve; - Gtk::Frame* lumaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_LUMAFR")) ); + Gtk::Frame* lumaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_LUMINANCE_FRAME")) ); lumaFrame->set_label_align(0.025, 0.5); Gtk::VBox * lumaVBox = Gtk::manage ( new Gtk::VBox()); @@ -47,26 +47,25 @@ ctboxL = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LTYPE") + ":")); + Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LUMINANCE_CONTROL") + ":")); ctboxL->pack_start (*labmL, Gtk::PACK_SHRINK, 1); Lmethod = Gtk::manage (new MyComboBoxText ()); - Lmethod->append (M("TP_DIRPYRDENOISE_CUR")); - Lmethod->append (M("TP_DIRPYRDENOISE_SLI")); + Lmethod->append (M("CURVEEDITOR_CURVE")); + Lmethod->append (M("GENERAL_SLIDER")); Lmethod->set_active(0); Lmethodconn = Lmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::LmethodChanged) ); - luma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMA"), 0, 100, 0.01, 0)); - Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LDETAIL"), 0, 100, 0.01, 50)); - NoiscurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_LCURVE")); + luma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING"), 0, 100, 0.01, 0)); + Ldetail = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_LUMINANCE_DETAIL"), 0, 100, 0.01, 50)); + NoiscurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_LUMINANCE_CURVE")); //curveEditorG = new CurveEditorGroup (options.lastLabCurvesDir); NoiscurveEditorG->setCurveListener (this); - rtengine::DirPyrDenoiseParams::getDefaultNoisCurve(defaultCurve); + defaultCurve = rtengine::DirPyrDenoiseParams().lcurve; lshape = static_cast(NoiscurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); lshape->setIdentityValue(0.); lshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); - lshape->setTooltip(M("TP_DIRPYRDENOISE_CURVEEDITOR_L_TOOLTIP")); //lshape->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); @@ -77,62 +76,58 @@ NoiscurveEditorG->curveListComplete(); NoiscurveEditorG->show(); - Gtk::Frame* chromaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_CHROMAFR")) ); + Gtk::Frame* chromaFrame = Gtk::manage (new Gtk::Frame (M("TP_DIRPYRDENOISE_CHROMINANCE_FRAME")) ); chromaFrame->set_label_align(0.025, 0.5); Gtk::VBox *chromaVBox = Gtk::manage ( new Gtk::VBox()); chromaVBox->set_spacing(2); ctboxC = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmC = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CTYPE") + ":")); + Gtk::Label* labmC = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC->pack_start (*labmC, Gtk::PACK_SHRINK, 1); - ctboxC->set_tooltip_markup (M("TP_DIRPYRDENOISE_CTYPE_TOOLTIP")); Cmethod = Gtk::manage (new MyComboBoxText ()); - Cmethod->append (M("TP_DIRPYRDENOISE_MAN")); - Cmethod->append (M("TP_DIRPYRDENOISE_AUT")); - Cmethod->append (M("TP_DIRPYRDENOISE_PON")); - Cmethod->append (M("TP_DIRPYRDENOISE_PRE")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_MANUAL")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AMZ")); + Cmethod->append (M("TP_DIRPYRDENOISE_CHROMINANCE_PMZ")); Cmethod->set_active(0); Cmethodconn = Cmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::CmethodChanged) ); + Cmethod->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP")); ctboxC2 = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmC2 = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CTYPE") + ":")); + Gtk::Label* labmC2 = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_CHROMINANCE_METHOD") + ":")); ctboxC2->pack_start (*labmC2, Gtk::PACK_SHRINK, 1); - ctboxC2->set_tooltip_markup (M("TP_DIRPYRDENOISE_C2TYPE_TOOLTIP")); + ctboxC2->set_tooltip_markup (M("TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP")); C2method = Gtk::manage (new MyComboBoxText ()); - C2method->append (M("TP_DIRPYRDENOISE_MANU")); - C2method->append (M("TP_DIRPYRDENOISE_AUTO")); - C2method->append (M("TP_DIRPYRDENOISE_PREV")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_MANUAL")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL")); + C2method->append (M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW")); C2method->set_active(0); C2methodconn = C2method->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::C2methodChanged) ); NoiseLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); - NoiseLabels->set_tooltip_text(M("TP_DIRPYRDENOISE_NRESID_TOOLTIP")); + NoiseLabels->set_tooltip_text(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP")); TileLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); PrevLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER)); - chroma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMA"), 0, 100, 0.01, 15)); - redchro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_RED"), -100, 100, 0.1, 0)); - bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_BLUE"), -100, 100, 0.1, 0)); - - gamma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_GAMMA"), 1.0, 3.0, 0.01, 1.7)); - gamma->set_tooltip_text (M("TP_DIRPYRDENOISE_GAMMA_TOOLTIP")); - + chroma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_MASTER"), 0, 100, 0.01, 15)); + redchro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN"), -100, 100, 0.1, 0)); + bluechro = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW"), -100, 100, 0.1, 0)); Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); - hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_METHOD") + ": ")), Gtk::PACK_SHRINK, 4); - hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_METHOD_TOOLTIP")); + hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK, 1); + hb1->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP")); dmethod = Gtk::manage (new MyComboBoxText ()); - dmethod->append (M("TP_DIRPYRDENOISE_LAB")); - dmethod->append (M("TP_DIRPYRDENOISE_RGB")); + dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB")); + dmethod->append (M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB")); dmethod->set_active(0); - hb1->pack_end (*dmethod, Gtk::PACK_EXPAND_WIDGET, 4); - pack_start( *hb1, Gtk::PACK_SHRINK, 4); + hb1->pack_end (*dmethod, Gtk::PACK_EXPAND_WIDGET, 1); + pack_start(*hb1, Gtk::PACK_SHRINK, 1); dmethodconn = dmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::dmethodChanged) ); @@ -143,14 +138,14 @@ redchro->setAdjusterListener (this); bluechro->setAdjusterListener (this); - CCcurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_CCCURVE")); + CCcurveEditorG = new CurveEditorGroup (options.lastDenoiseCurvesDir, M("TP_DIRPYRDENOISE_CHROMINANCE_CURVE")); CCcurveEditorG->setCurveListener (this); - rtengine::DirPyrDenoiseParams::getDefaultCCCurve(defaultCurve); + defaultCurve = rtengine::DirPyrDenoiseParams().cccurve; ccshape = static_cast(CCcurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); ccshape->setIdentityValue(0.); ccshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); - ccshape->setTooltip(M("TP_DIRPYRDENOISE_CURVEEDITOR_CC_TOOLTIP")); + ccshape->setTooltip(M("TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP")); ccshape->setBottomBarColorProvider(this, 2); CCcurveEditorG->curveListComplete(); @@ -158,8 +153,6 @@ //----------------------------------------- - gamma->setAdjusterListener (this); - luma->hide(); Ldetail->show(); @@ -170,7 +163,6 @@ redchro->show(); bluechro->show(); // perform->show(); - gamma->show(); // perform->set_active (true); // ---- Median FIltering ---- @@ -181,73 +173,75 @@ Gtk::VBox *medianVBox = Gtk::manage ( new Gtk::VBox()); medianVBox->set_spacing(2); - median = Gtk::manage (new Gtk::CheckButton (M("TP_DIRPYRDENOISE_MED") + ":")); + median = Gtk::manage (new Gtk::CheckButton (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL") + ":")); median->set_active (true); medianFrame->set_label_widget(*median); methodmed = Gtk::manage (new MyComboBoxText ()); - methodmed->append (M("TP_DIRPYRDENOISE_LM")); - methodmed->append (M("TP_DIRPYRDENOISE_ABM")); - methodmed->append (M("TP_DIRPYRDENOISE_LPLABM")); - methodmed->append (M("TP_DIRPYRDENOISE_LABM")); - methodmed->append (M("TP_DIRPYRDENOISE_RGBM")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB")); + methodmed->append (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB")); methodmed->set_active (0); - methodmed->set_tooltip_text (M("TP_DIRPYRDENOISE_METM_TOOLTIP")); + methodmed->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP")); methodmedconn = methodmed->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::methodmedChanged) ); rgbmethod = Gtk::manage (new MyComboBoxText ()); - rgbmethod->append (M("TP_DIRPYRDENOISE_3X3_SOFT")); - rgbmethod->append (M("TP_DIRPYRDENOISE_3X3")); - rgbmethod->append (M("TP_DIRPYRDENOISE_5X5_SOFT")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3SOFT")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3")); + rgbmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5SOFT")); rgbmethod->set_active (0); - rgbmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); + rgbmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP")); rgbmethodconn = rgbmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::rgbmethodChanged) ); medmethod = Gtk::manage (new MyComboBoxText ()); - medmethod->append (M("TP_DIRPYRDENOISE_3X3_SOFT")); - medmethod->append (M("TP_DIRPYRDENOISE_3X3")); - medmethod->append (M("TP_DIRPYRDENOISE_5X5_SOFT")); - medmethod->append (M("TP_DIRPYRDENOISE_5X5")); - medmethod->append (M("TP_DIRPYRDENOISE_7X7")); - medmethod->append (M("TP_DIRPYRDENOISE_9X9")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3SOFT")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_3X3")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5SOFT")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_5X5")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_7X7")); + medmethod->append (M("TP_DIRPYRDENOISE_TYPE_9X9")); medmethod->set_active (0); - medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MET_TOOLTIP")); + medmethod->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP")); medmethodconn = medmethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::medmethodChanged) ); ctboxm = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labmm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDMETHOD") + ":")); + Gtk::Label* labmm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_METHOD") + ":")); ctboxm->pack_start (*labmm, Gtk::PACK_SHRINK, 1); ctbox = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDTYPE") + ":")); + Gtk::Label* labm = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctbox->pack_start (*labm, Gtk::PACK_SHRINK, 1); ctboxrgb = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* labrgb = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDTYPE") + ":")); + Gtk::Label* labrgb = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_MEDIAN_TYPE") + ":")); ctboxrgb->pack_start (*labrgb, Gtk::PACK_SHRINK, 1); - - Gtk::HSeparator *hsep4 = Gtk::manage (new Gtk::HSeparator()); - hsep4->show (); - Gtk::HBox* hb11 = Gtk::manage (new Gtk::HBox ()); - hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_METHOD11") + ": ")), Gtk::PACK_SHRINK, 4); - hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_METHOD11_TOOLTIP")); + hb11->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_DIRPYRDENOISE_MAIN_MODE") + ": ")), Gtk::PACK_SHRINK, 1); + hb11->set_tooltip_markup (M("TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP")); smethod = Gtk::manage (new MyComboBoxText ()); - smethod->append (M("TP_DIRPYRDENOISE_SHAL")); -// smethod->append (M("TP_DIRPYRDENOISE_SHBI")); - smethod->append (M("TP_DIRPYRDENOISE_SHALBI")); -// smethod->append (M("TP_DIRPYRDENOISE_SHALAL")); -// smethod->append (M("TP_DIRPYRDENOISE_SHBIBI")); + smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHBI")); + smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHALAL")); +// smethod->append (M("TP_DIRPYRDENOISE_MAIN_MODE_SHBIBI")); smethod->set_active(1); - hb11->pack_start (*smethod, Gtk::PACK_EXPAND_WIDGET, 4); - pack_start( *hb11, Gtk::PACK_SHRINK, 4); + hb11->pack_start (*smethod, Gtk::PACK_EXPAND_WIDGET, 1); + pack_start( *hb11, Gtk::PACK_SHRINK, 1); smethodconn = smethod->signal_changed().connect ( sigc::mem_fun(*this, &DirPyrDenoise::smethodChanged) ); - passes = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_PASSES"), 1.0, 3.0, 1., 1.)); - passes->set_tooltip_text (M("TP_DIRPYRDENOISE_PASSES_TOOLTIP")); + gamma = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MAIN_GAMMA"), 1.0, 3.0, 0.01, 1.7)); + gamma->set_tooltip_text (M("TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP")); + gamma->setAdjusterListener (this); + gamma->show(); + pack_start (*gamma, Gtk::PACK_EXPAND_WIDGET, 1); + + passes = Gtk::manage (new Adjuster (M("TP_DIRPYRDENOISE_MEDIAN_PASSES"), 1.0, 3.0, 1., 1.)); + passes->set_tooltip_text (M("TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP")); passes->setAdjusterListener (this); passes->show(); ctboxL->pack_start (*Lmethod); @@ -278,10 +272,6 @@ chromaFrame->add(*chromaVBox); pack_start (*chromaFrame); - - pack_start (*gamma); - pack_start (*hsep4); - // pack_start( *hb11, Gtk::PACK_SHRINK, 4); // pack_start (*median); @@ -380,7 +370,7 @@ nY = nexttileY; { TileLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_TILELABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO"), Glib::ustring::format(std::fixed, std::setprecision(0), sT), Glib::ustring::format(std::fixed, std::setprecision(0), nX), Glib::ustring::format(std::fixed, std::setprecision(0), nY)) @@ -398,7 +388,7 @@ pY = nextprevY; { PrevLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_PREVLABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO"), Glib::ustring::format(std::fixed, std::setprecision(0), sP), Glib::ustring::format(std::fixed, std::setprecision(0), pX), Glib::ustring::format(std::fixed, std::setprecision(0), pY)) @@ -437,10 +427,10 @@ high = nexthighresid; if(nois == 0.f && high == 0.f) { - NoiseLabels->set_text(M("TP_DIRPYRDENOISE_NOISELABELEMPTY")); + NoiseLabels->set_text(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY")); } else { NoiseLabels->set_text( - Glib::ustring::compose(M("TP_DIRPYRDENOISE_NOISELABEL"), + Glib::ustring::compose(M("TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO"), Glib::ustring::format(std::fixed, std::setprecision(0), nois), Glib::ustring::format(std::fixed, std::setprecision(0), high)) ); diff -Nru rawtherapee-5.3/rtgui/dynamicprofilepanel.cc rawtherapee-5.4/rtgui/dynamicprofilepanel.cc --- rawtherapee-5.3/rtgui/dynamicprofilepanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/dynamicprofilepanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -405,7 +405,7 @@ RENDER_RANGE_ (double, fnumber, [] (double f) { return std::string ("f/") + - rtengine::ImageMetaData::apertureToString (f); + rtengine::FramesMetaData::apertureToString (f); }); } @@ -421,7 +421,7 @@ Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) { RENDER_RANGE_ (double, shutterspeed, - rtengine::ImageMetaData::shutterToString); + rtengine::FramesMetaData::shutterToString); } diff -Nru rawtherapee-5.3/rtgui/edit.h rawtherapee-5.4/rtgui/edit.h --- rawtherapee-5.3/rtgui/edit.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/edit.h 2018-03-20 11:04:15.000000000 +0000 @@ -148,7 +148,7 @@ * * When the Edit process stops, the Subscriber is removed from the DataProvider, so buffers can be freed up. * A new ToolPanelListener::panelChanged event is also thrown to update the preview again, without the tool's - * graphical objects. The Edit button is also toggled off (by the user or programatically). + * graphical objects. The Edit button is also toggled off (by the user or programmatically). * * It means that each Edit buttons toggled on will start an update of the preview which might or might not create * a new History entry, depending on the ProcEvent used. diff -Nru rawtherapee-5.3/rtgui/editorpanel.cc rawtherapee-5.4/rtgui/editorpanel.cc --- rawtherapee-5.3/rtgui/editorpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/editorpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -153,7 +153,6 @@ Gtk::ToggleButton softProof; Gtk::ToggleButton spGamutCheck; sigc::connection profileConn, intentConn, softproofConn; - bool canSProof; Glib::ustring defprof; rtengine::StagedImageProcessor* const& processor; @@ -205,24 +204,23 @@ void prepareSoftProofingBox () { - Gtk::Image *softProofImage = Gtk::manage (new RTImage ("softProof.png")); + Gtk::Image *softProofImage = Gtk::manage (new RTImage ("gamut-softproof.png")); softProofImage->set_padding (0, 0); softProof.add (*softProofImage); softProof.set_relief (Gtk::RELIEF_NONE); softProof.set_tooltip_markup (M ("SOFTPROOF_TOOLTIP")); softProof.set_active (false); - softProof.set_sensitive (canSProof); softProof.show (); - Gtk::Image *spGamutCheckImage = Gtk::manage (new RTImage ("spGamutCheck.png")); + Gtk::Image *spGamutCheckImage = Gtk::manage (new RTImage ("gamut-warning.png")); spGamutCheckImage->set_padding (0, 0); spGamutCheck.add (*spGamutCheckImage); spGamutCheck.set_relief (Gtk::RELIEF_NONE); spGamutCheck.set_tooltip_markup (M ("SOFTPROOF_GAMUTCHECK_TOOLTIP")); spGamutCheck.set_active (false); - spGamutCheck.set_sensitive (false); + spGamutCheck.set_sensitive (true); spGamutCheck.show (); } @@ -301,8 +299,8 @@ intentBox.setItemSensitivity (0, supportsPerceptual); intentBox.setItemSensitivity (1, supportsRelativeColorimetric); intentBox.setItemSensitivity (2, supportsAbsoluteColorimetric); - softProof.set_sensitive (canSProof); - spGamutCheck.set_sensitive (canSProof); + softProof.set_sensitive (true); + spGamutCheck.set_sensitive (true); } else { intentBox.setItemSensitivity (0, true); intentBox.setItemSensitivity (1, true); @@ -310,7 +308,7 @@ intentBox.set_sensitive (false); intentBox.setSelected (1); softProof.set_sensitive (false); - spGamutCheck.set_sensitive (false); + spGamutCheck.set_sensitive (true); } profileBox.set_tooltip_text (profileBox.get_active_text ()); @@ -352,17 +350,11 @@ void updateSoftProofParameters (bool noEvent = false) { - if (!canSProof) { - ConnectionBlocker profileBlocker (softproofConn); - softProof.set_active (false); - softProof.set_sensitive (false); #if !defined(__APPLE__) // monitor profile not supported on apple - } else { - softProof.set_sensitive (profileBox.get_active_row_number () > 0); + softProof.set_sensitive (profileBox.get_active_row_number () > 0); + spGamutCheck.set_sensitive(profileBox.get_active_row_number () > 0); #endif - } - spGamutCheck.set_sensitive (softProof.get_sensitive() && softProof.get_active()); #if !defined(__APPLE__) // monitor profile not supported on apple @@ -374,7 +366,7 @@ processor->beginUpdateParams (); } - processor->setSoftProofing (softProof.get_sensitive() && softProof.get_active(), spGamutCheck.get_sensitive() && spGamutCheck.get_active()); + processor->setSoftProofing (softProof.get_sensitive() && softProof.get_active(), spGamutCheck.get_active()); if (!noEvent) { processor->endUpdateParams (rtengine::EvMonitorTransform); @@ -390,7 +382,6 @@ public: explicit ColorManagementToolbar (rtengine::StagedImageProcessor* const& ipc) : intentBox (Glib::ustring (), true), - canSProof (!options.rtSettings.printerProfile.empty() && options.rtSettings.printerProfile != "None"), // assuming the printer profile exist! processor (ipc) { #if !defined(__APPLE__) // monitor profile not supported on apple @@ -419,12 +410,6 @@ grid->attach_next_to (spGamutCheck, Gtk::POS_RIGHT, 1, 1); } - void canSoftProof (bool canSP) - { - canSProof = canSP; - updateSoftProofParameters(); - } - void updateProcessor() { if (processor) { @@ -464,6 +449,12 @@ updateParameters (); } + void updateHistogram() + { + updateParameters(); + } + + void defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile) { ConnectionBlocker profileBlocker (profileConn); @@ -484,7 +475,12 @@ }; EditorPanel::EditorPanel (FilePanel* filePanel) - : catalogPane (nullptr), realized (false), tbBeforeLock (nullptr), iHistoryShow (nullptr), iHistoryHide (nullptr), iTopPanel_1_Show (nullptr), iTopPanel_1_Hide (nullptr), iRightPanel_1_Show (nullptr), iRightPanel_1_Hide (nullptr), iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), previewHandler (nullptr), beforePreviewHandler (nullptr), beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false) + : catalogPane (nullptr), realized (false), tbBeforeLock (nullptr), iHistoryShow (nullptr), iHistoryHide (nullptr), + iTopPanel_1_Show (nullptr), iTopPanel_1_Hide (nullptr), iRightPanel_1_Show (nullptr), iRightPanel_1_Hide (nullptr), + iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), previewHandler (nullptr), beforePreviewHandler (nullptr), + beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), + beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), + selectedFrame(0), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false) { epih = new EditorPanelIdleHelper; @@ -580,6 +576,16 @@ Gtk::VSeparator* vsep1 = Gtk::manage (new Gtk::VSeparator ()); Gtk::VSeparator* vsep2 = Gtk::manage (new Gtk::VSeparator ()); + // Histogram profile toggle controls + toggleHistogramProfile = Gtk::manage (new Gtk::ToggleButton ()); + Gtk::Image* histProfImg = Gtk::manage (new RTImage ("gamut-hist.png")); + toggleHistogramProfile->add (*histProfImg); + toggleHistogramProfile->set_relief (Gtk::RELIEF_NONE); + toggleHistogramProfile->set_active (options.rtSettings.HistogramWorking); + toggleHistogramProfile->set_tooltip_markup ( (M ("PREFERENCES_HISTOGRAM_TOOLTIP"))); + + Gtk::VSeparator* vsep3 = Gtk::manage (new Gtk::VSeparator ()); + iareapanel = new ImageAreaPanel (); tpc->setEditProvider (iareapanel->imageArea); tpc->getToolBar()->setLockablePickerToolListener (iareapanel->imageArea); @@ -602,6 +608,10 @@ toolBarPanel->pack_end (*tpc->coarse, Gtk::PACK_SHRINK, 2); toolBarPanel->pack_end (*vsepcl, Gtk::PACK_SHRINK, 2); + // Histogram profile toggle + toolBarPanel->pack_end (*toggleHistogramProfile, Gtk::PACK_SHRINK, 1); + toolBarPanel->pack_end (*vsep3, Gtk::PACK_SHRINK, 2); + toolBarPanel->pack_end (*iareapanel->imageArea->indClippedPanel, Gtk::PACK_SHRINK, 0); toolBarPanel->pack_end (*vsepz, Gtk::PACK_SHRINK, 2); toolBarPanel->pack_end (*iareapanel->imageArea->previewModePanel, Gtk::PACK_SHRINK, 0); @@ -814,6 +824,7 @@ saveimgas->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::saveAsPressed) ); queueimg->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::queueImgPressed) ); sendtogimp->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::sendToGimpPressed) ); + toggleHistogramProfile->signal_toggled().connect( sigc::mem_fun (*this, &EditorPanel::histogramProfile_toggled) ); if (navPrev) { navPrev->signal_pressed().connect ( sigc::mem_fun (*this, &EditorPanel::openPreviousEditorImage) ); @@ -1042,13 +1053,12 @@ // since there was no resize event if (iareapanel->imageArea->mainCropWindow) { iareapanel->imageArea->mainCropWindow->cropHandler.newImage (ipc, false); - iareapanel->imageArea->mainCropWindow->initialImageArrived(); // In single tab mode, the image is not always updated between switches // normal redraw don't work, so this is the hard way // Disabled this with Issue 2435 because it seems to work fine now // if (!options.tabbedUI && iareapanel->imageArea->mainCropWindow->getZoomFitVal() == 1.0) { -// iareapanel->imageArea->mainCropWindow->cropHandler.update(); + iareapanel->imageArea->mainCropWindow->cropHandler.update(); // } } else { Gtk::Allocation alloc; @@ -1056,6 +1066,7 @@ } history->resetSnapShotNumber(); + navigator->setInvalid(ipc->getFullWidth(),ipc->getFullHeight()); } void EditorPanel::close () @@ -1137,6 +1148,18 @@ // if (ev!=EvPhotoLoaded) // saveLabel->set_markup (Glib::ustring("") + M("MAIN_BUTTON_SAVE") + ""); + + rtengine::eSensorType sensorType = isrc->getImageSource()->getSensorType(); + + selectedFrame = 0; + if (sensorType == rtengine::ST_BAYER) { + selectedFrame = params->raw.bayersensor.imageNum; + //} else if (sensorType == rtengine::ST_FUJI_XTRANS) { + // selectedFrame = params->raw.xtranssensor.imageNum; + } + selectedFrame = rtengine::LIM(selectedFrame, 0, isrc->getImageSource()->getMetaData()->getFrameCount() - 1); + + info_toggled(); } void EditorPanel::setProgressState (bool inProcessing) @@ -1306,47 +1329,59 @@ { Glib::ustring infoString; - Glib::ustring infoString1; //1-st line - Glib::ustring infoString2; //2-nd line - Glib::ustring infoString3; //3-rd line - Glib::ustring infoString4; //4-th line Glib::ustring expcomp; if (!ipc || !openThm) { return; } - const rtengine::ImageMetaData* idata = ipc->getInitialImage()->getMetaData(); + const rtengine::FramesMetaData* idata = ipc->getInitialImage()->getMetaData(); - if (idata && idata->hasExif()) { - infoString1 = Glib::ustring::compose ("%1 + %2", + if (idata && idata->hasExif(selectedFrame)) { + infoString = Glib::ustring::compose ("%1 + %2\nf/%3 %4s %5%6 %7mm", Glib::ustring (idata->getMake() + " " + idata->getModel()), - Glib::ustring (idata->getLens())); - - infoString2 = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", - Glib::ustring (idata->apertureToString (idata->getFNumber())), - Glib::ustring (idata->shutterToString (idata->getShutterSpeed())), - M ("QINFO_ISO"), idata->getISOSpeed(), - Glib::ustring::format (std::setw (3), std::fixed, std::setprecision (2), idata->getFocalLen())); - - expcomp = Glib::ustring (idata->expcompToString (idata->getExpComp(), true)); // maskZeroexpcomp - - if (expcomp != "") { - infoString2 = Glib::ustring::compose ("%1 %2EV", - infoString2, + Glib::ustring (idata->getLens()), + Glib::ustring (idata->apertureToString (idata->getFNumber(selectedFrame))), + Glib::ustring (idata->shutterToString (idata->getShutterSpeed(selectedFrame))), + M ("QINFO_ISO"), idata->getISOSpeed(selectedFrame), + Glib::ustring::format (std::setw (3), std::fixed, std::setprecision (2), idata->getFocalLen(selectedFrame))); + + expcomp = Glib::ustring (idata->expcompToString (idata->getExpComp(selectedFrame), true)); // maskZeroexpcomp + + if (!expcomp.empty ()) { + infoString = Glib::ustring::compose ("%1 %2EV", + infoString, expcomp /*Glib::ustring(idata->expcompToString(idata->getExpComp()))*/); } - infoString3 = Glib::ustring::compose ("%1%2", + infoString = Glib::ustring::compose ("%1\n%2%3", + infoString, escapeHtmlChars (Glib::path_get_dirname (openThm->getFileName())) + G_DIR_SEPARATOR_S, escapeHtmlChars (Glib::path_get_basename (openThm->getFileName())) ); int ww = ipc->getFullWidth(); int hh = ipc->getFullHeight(); //megapixels - infoString4 = Glib::ustring::compose ("%1 MP (%2x%3)", Glib::ustring::format (std::setw (4), std::fixed, std::setprecision (1), (float)ww * hh / 1000000), ww, hh); - - infoString = Glib::ustring::compose ("%1\n%2\n%3\n%4", infoString1, infoString2, infoString3, infoString4); + infoString = Glib::ustring::compose ("%1\n%2 MP (%3x%4)", + infoString, + Glib::ustring::format (std::setw (4), std::fixed, std::setprecision (1), (float)ww * hh / 1000000), + ww, hh); + + //adding special characteristics + bool isHDR = idata->getHDR(); + bool isPixelShift = idata->getPixelShift(); + unsigned int numFrames = idata->getFrameCount(); + if (isHDR) { + infoString = Glib::ustring::compose ("%1\n" + M("QINFO_HDR"), infoString, numFrames); + if (numFrames == 1) { + int sampleFormat = idata->getSampleFormat(selectedFrame); + infoString = Glib::ustring::compose ("%1 / %2", infoString, M(Glib::ustring::compose("SAMPLEFORMAT_%1", sampleFormat))); + } + } else if (isPixelShift) { + infoString = Glib::ustring::compose ("%1\n" + M("QINFO_PIXELSHIFT"), infoString, numFrames); + } else if (numFrames > 1) { + infoString = Glib::ustring::compose ("%1\n" + M("QINFO_FRAMECOUNT"), infoString, numFrames); + } } else { infoString = M ("QINFO_NOEXIF"); } @@ -1593,7 +1628,7 @@ return true; case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitClicked(); + iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); return true; case GDK_KEY_F5: @@ -1668,7 +1703,7 @@ return true; case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); + iareapanel->imageArea->zoomPanel->zoomFitClicked(); return true; } } @@ -1722,9 +1757,9 @@ } } -bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) +bool EditorPanel::idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { - rtengine::IImage16* img = pc->returnValue(); + rtengine::IImagefloat* img = pc->returnValue(); delete pc; if ( img ) { @@ -1735,13 +1770,13 @@ img->setSaveProgressListener (parent->getProgressListener()); if (sf.format == "tif") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsTIFF), fname, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fname, sf.tiffBits, sf.tiffUncompressed), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else if (sf.format == "png") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsPNG), fname, sf.pngCompression, sf.pngBits), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsPNG), fname, sf.pngBits), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else if (sf.format == "jpg") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsJPEG), fname, sf.jpegQuality, sf.jpegSubSamp), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsJPEG), fname, sf.jpegQuality, sf.jpegSubSamp), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf, pparams)); else { delete ld; @@ -1762,7 +1797,7 @@ return false; } -bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) +bool EditorPanel::idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams) { img->free (); @@ -1887,8 +1922,8 @@ ipc->getParams (&pparams); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - ProgressConnector *ld = new ProgressConnector(); - ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), + ProgressConnector *ld = new ProgressConnector(); + ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_saveImage ), ld, fnameOut, sf, pparams)); saveimgas->set_sensitive (false); sendtogimp->set_sensitive (false); @@ -1931,8 +1966,8 @@ rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); rtengine::ProcessingJob* job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); - ProgressConnector *ld = new ProgressConnector(); - ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), options.tunnelMetaData, false ), + ProgressConnector *ld = new ProgressConnector(); + ld->startFunc (sigc::bind (sigc::ptr_fun (&rtengine::processImage), job, err, parent->getProgressListener(), false ), sigc::bind (sigc::mem_fun ( *this, &EditorPanel::idle_sendToGimp ), ld, openThm->getFileName() )); saveimgas->set_sensitive (false); sendtogimp->set_sensitive (false); @@ -1946,14 +1981,14 @@ rtengine::ProcessingJob *job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); // save immediately - rtengine::IImage16 *img = rtengine::processImage (job, err, nullptr, options.tunnelMetaData, false); + rtengine::IImagefloat *img = rtengine::processImage (job, err, nullptr, false); int err = 0; if (sf.format == "tif") { err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffUncompressed); } else if (sf.format == "png") { - err = img->saveAsPNG (filename, sf.pngCompression, sf.pngBits); + err = img->saveAsPNG (filename, sf.pngBits); } else if (sf.format == "jpg") { err = img->saveAsJPEG (filename, sf.jpegQuality, sf.jpegSubSamp); } else { @@ -1986,10 +2021,16 @@ } } -bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname) +void EditorPanel::histogramProfile_toggled() +{ + options.rtSettings.HistogramWorking = toggleHistogramProfile->get_active(); + colorMgmtToolBar->updateHistogram(); +} + +bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname) { - rtengine::IImage16* img = pc->returnValue(); + rtengine::IImagefloat* img = pc->returnValue(); delete pc; if (img) { @@ -2021,7 +2062,7 @@ ProgressConnector *ld = new ProgressConnector(); img->setSaveProgressListener (parent->getProgressListener()); - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_sentToGimp), ld, img, fileName)); } else { Glib::ustring msg_ = Glib::ustring (" Error during image processing\n"); @@ -2034,7 +2075,7 @@ return false; } -bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring filename) +bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename) { img->free (); int errore = pc->returnValue(); @@ -2157,6 +2198,11 @@ beforeIpc = rtengine::StagedImageProcessor::create (beforeImg); beforeIpc->setPreviewScale (10); beforeIpc->setPreviewImageListener (beforePreviewHandler); + Glib::ustring monitorProfile; + rtengine::RenderingIntent intent; + ipc->getMonitorProfile(monitorProfile, intent); + beforeIpc->setMonitorProfile(monitorProfile, intent); + beforeIarea->imageArea->setPreviewHandler (beforePreviewHandler); beforeIarea->imageArea->setImProcCoordinator (beforeIpc); @@ -2245,7 +2291,6 @@ void EditorPanel::updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) { - colorMgmtToolBar->canSoftProof (!printerProfile.empty() && printerProfile != "None"); } void EditorPanel::updateTPVScrollbar (bool hide) diff -Nru rawtherapee-5.3/rtgui/editorpanel.h rawtherapee-5.4/rtgui/editorpanel.h --- rawtherapee-5.3/rtgui/editorpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/editorpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -146,10 +146,12 @@ void close (); BatchQueueEntry* createBatchQueueEntry (); - bool idle_imageSaved (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); - bool idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); - bool idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname); - bool idle_sentToGimp (ProgressConnector *pc, rtengine::IImage16* img, Glib::ustring filename); + bool idle_imageSaved (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); + bool idle_saveImage (ProgressConnector *pc, Glib::ustring fname, SaveFormat sf, rtengine::procparams::ProcParams &pparams); + bool idle_sendToGimp ( ProgressConnector *pc, Glib::ustring fname); + bool idle_sentToGimp (ProgressConnector *pc, rtengine::IImagefloat* img, Glib::ustring filename); + void histogramProfile_toggled (); + Glib::ustring lastSaveAsFileName; bool realized; @@ -196,6 +198,7 @@ Gtk::HBox* beforeAfterBox; Gtk::HBox* beforeHeaderBox; Gtk::HBox* afterHeaderBox; + Gtk::ToggleButton* toggleHistogramProfile; Gtk::Frame* ppframe; ProfilePanel* profilep; @@ -212,6 +215,8 @@ Thumbnail* openThm; // may get invalid on external delete event Glib::ustring fname; // must be saved separately + int selectedFrame; + rtengine::InitialImage* isrc; rtengine::StagedImageProcessor* ipc; rtengine::StagedImageProcessor* beforeIpc; // for the before-after view diff -Nru rawtherapee-5.3/rtgui/epd.cc rawtherapee-5.4/rtgui/epd.cc --- rawtherapee-5.3/rtgui/epd.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/epd.cc 2018-03-20 11:04:15.000000000 +0000 @@ -182,3 +182,11 @@ reweightingIterates->showEditedCB(); } +void EdgePreservingDecompositionUI::setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd) +{ + strength->setAddMode(stAdd); + gamma->setAddMode(gAdd); + edgeStopping->setAddMode(esAdd); + scale->setAddMode(scAdd); + reweightingIterates->setAddMode(rAdd); +} diff -Nru rawtherapee-5.3/rtgui/epd.h rawtherapee-5.4/rtgui/epd.h --- rawtherapee-5.3/rtgui/epd.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/epd.h 2018-03-20 11:04:15.000000000 +0000 @@ -43,6 +43,7 @@ void adjusterChanged (Adjuster* a, double newval); void enabledChanged (); + void setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd); }; #endif diff -Nru rawtherapee-5.3/rtgui/eventmapper.cc rawtherapee-5.4/rtgui/eventmapper.cc --- rawtherapee-5.3/rtgui/eventmapper.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/eventmapper.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,63 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include "eventmapper.h" + + +ProcEventMapper::ProcEventMapper() +{ + for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) { + history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); + } +} + + +ProcEventMapper *ProcEventMapper::getInstance() +{ + static ProcEventMapper instance; + return &instance; +} + + +rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg) +{ + rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent(); + rtengine::RefreshMapper::getInstance()->mapEvent(event, action); + + if (history_msg.empty()) { + history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); + } else { + history_msgs_[event] = history_msg; + } + + return event; +} + + +const std::string &ProcEventMapper::getHistoryMsg(rtengine::ProcEvent event) const +{ + static std::string empty; + auto it = history_msgs_.find(event); + if (it == history_msgs_.end()) { + return empty; + } else { + return it->second; + } +} diff -Nru rawtherapee-5.3/rtgui/eventmapper.h rawtherapee-5.4/rtgui/eventmapper.h --- rawtherapee-5.3/rtgui/eventmapper.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/eventmapper.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,37 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ +#pragma once + +#include +#include +#include "../rtengine/refreshmap.h" + + +class ProcEventMapper { +public: + static ProcEventMapper *getInstance(); + rtengine::ProcEvent newEvent(int action, const std::string &history_msg=""); + const std::string &getHistoryMsg(rtengine::ProcEvent event) const; + +private: + ProcEventMapper(); + + std::unordered_map history_msgs_; +}; diff -Nru rawtherapee-5.3/rtgui/exifpanel.cc rawtherapee-5.4/rtgui/exifpanel.cc --- rawtherapee-5.3/rtgui/exifpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/exifpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -25,44 +25,46 @@ using namespace rtengine::procparams; using namespace rtexif; -ExifPanel::ExifPanel () : idata(nullptr) +ExifPanel::ExifPanel () : idata (nullptr) { recursiveOp = true; - exifTree = Gtk::manage(new Gtk::TreeView()); - scrolledWindow = Gtk::manage(new Gtk::ScrolledWindow()); + exifTree = Gtk::manage (new Gtk::TreeView()); + scrolledWindow = Gtk::manage (new Gtk::ScrolledWindow()); - exifTree->set_headers_visible(false); - exifTree->set_rules_hint(false); - exifTree->set_reorderable(false); - exifTree->set_enable_search(true); + exifTree->set_headers_visible (false); + exifTree->set_rules_hint (false); + exifTree->set_reorderable (false); + exifTree->set_enable_search (true); exifTree->get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); - scrolledWindow->set_shadow_type(Gtk::SHADOW_NONE); - scrolledWindow->set_policy(Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS); - scrolledWindow->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT); - scrolledWindow->add(*exifTree); + scrolledWindow->set_shadow_type (Gtk::SHADOW_NONE); + scrolledWindow->set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS); + scrolledWindow->property_window_placement().set_value (Gtk::CORNER_TOP_LEFT); + scrolledWindow->add (*exifTree); - exifTreeModel = Gtk::TreeStore::create(exifColumns); + exifTreeModel = Gtk::TreeStore::create (exifColumns); exifTree->set_model (exifTreeModel); + exifTree->set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_NONE); + exifTree->set_row_separator_func (sigc::mem_fun(*this, &ExifPanel::rowSeperatorFunc)); delicon = RTImage::createFromFile ("gtk-close.png"); keepicon = RTImage::createFromFile ("gtk-apply.png"); editicon = RTImage::createFromFile ("gtk-add.png"); - Gtk::TreeView::Column *viewcol = Gtk::manage(new Gtk::TreeView::Column ("Field Name")); - Gtk::CellRendererPixbuf* render_pb = Gtk::manage(new Gtk::CellRendererPixbuf ()); - Gtk::CellRendererText *render_txt = Gtk::manage(new Gtk::CellRendererText()); + Gtk::TreeView::Column *viewcol = Gtk::manage (new Gtk::TreeView::Column ("Field Name")); + Gtk::CellRendererPixbuf* render_pb = Gtk::manage (new Gtk::CellRendererPixbuf ()); + Gtk::CellRendererText *render_txt = Gtk::manage (new Gtk::CellRendererText()); render_txt->property_ellipsize() = Pango::ELLIPSIZE_END; viewcol->pack_start (*render_pb, false); viewcol->pack_start (*render_txt, true); viewcol->add_attribute (*render_pb, "pixbuf", exifColumns.icon); viewcol->add_attribute (*render_txt, "markup", exifColumns.field); - viewcol->set_expand(true); + viewcol->set_expand (true); viewcol->set_resizable (true); - viewcol->set_fixed_width(35); - viewcol->set_min_width(35); - viewcol->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE); + viewcol->set_fixed_width (35); + viewcol->set_min_width (35); + viewcol->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); render_pb->property_ypad() = 0; render_txt->property_ypad() = 0; @@ -71,16 +73,16 @@ exifTree->append_column (*viewcol); - Gtk::TreeView::Column *viewcolv = Gtk::manage(new Gtk::TreeView::Column ("Value")); - Gtk::CellRendererText *render_txtv = Gtk::manage(new Gtk::CellRendererText()); + Gtk::TreeView::Column *viewcolv = Gtk::manage (new Gtk::TreeView::Column ("Value")); + Gtk::CellRendererText *render_txtv = Gtk::manage (new Gtk::CellRendererText()); render_txtv->property_ellipsize() = Pango::ELLIPSIZE_END; viewcolv->pack_start (*render_txtv, true); viewcolv->add_attribute (*render_txtv, "markup", exifColumns.value); - viewcolv->set_expand(true); + viewcolv->set_expand (true); viewcolv->set_resizable (true); - viewcol->set_fixed_width(35); - viewcolv->set_min_width(35); - viewcolv->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE); + viewcol->set_fixed_width (35); + viewcolv->set_min_width (35); + viewcolv->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); render_txtv->property_ypad() = 0; @@ -88,61 +90,69 @@ pack_start (*scrolledWindow); - Gtk::Grid* buttons1 = Gtk::manage(new Gtk::Grid()); - buttons1->set_row_homogeneous(true); - buttons1->set_column_homogeneous(true); - setExpandAlignProperties(buttons1, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - Gtk::Grid* buttons2 = Gtk::manage(new Gtk::Grid()); - buttons2->set_row_homogeneous(true); - buttons2->set_column_homogeneous(true); - setExpandAlignProperties(buttons2, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - - remove = Gtk::manage(new Gtk::Button ()); // M("EXIFPANEL_REMOVE") - remove->set_image (*Gtk::manage(new Gtk::Image (delicon))); - remove->set_tooltip_text (M("EXIFPANEL_REMOVEHINT")); - remove->get_style_context()->add_class("Left"); - setExpandAlignProperties(remove, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - buttons1->attach_next_to(*remove, Gtk::POS_LEFT, 1, 1); - - keep = Gtk::manage(new Gtk::Button ()); // M("EXIFPANEL_KEEP") - keep->set_image (*Gtk::manage(new Gtk::Image (keepicon))); - keep->set_tooltip_text (M("EXIFPANEL_KEEPHINT")); - keep->get_style_context()->add_class("MiddleH"); - setExpandAlignProperties(keep, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - buttons1->attach_next_to(*keep, Gtk::POS_RIGHT, 1, 1); - - add = Gtk::manage(new Gtk::Button ()); // M("EXIFPANEL_ADDEDIT") - add->set_image (*Gtk::manage(new Gtk::Image (editicon))); - add->set_tooltip_text (M("EXIFPANEL_ADDEDITHINT")); - add->get_style_context()->add_class("Right"); - setExpandAlignProperties(add, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - buttons1->attach_next_to(*add, Gtk::POS_RIGHT, 1, 1); - - reset = Gtk::manage(new Gtk::Button ()); // M("EXIFPANEL_RESET") - reset->set_image (*Gtk::manage(new RTImage ("gtk-undo-ltr.png", "gtk-undo-rtl.png"))); - reset->set_tooltip_text (M("EXIFPANEL_RESETHINT")); - reset->get_style_context()->add_class("Left"); - setExpandAlignProperties(reset, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - buttons2->attach_next_to(*reset, Gtk::POS_LEFT, 1, 1); - - resetAll = Gtk::manage(new Gtk::Button ()); // M("EXIFPANEL_RESETALL") - resetAll->set_image (*Gtk::manage(new RTImage ("gtk-undoall-ltr.png", "gtk-undoall-rtl.png"))); - resetAll->set_tooltip_text (M("EXIFPANEL_RESETALLHINT")); - resetAll->get_style_context()->add_class("Right"); - setExpandAlignProperties(resetAll, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - buttons2->attach_next_to(*resetAll, Gtk::POS_RIGHT, 1, 1); + Gtk::Grid* buttons1 = Gtk::manage (new Gtk::Grid()); + buttons1->set_row_homogeneous (true); + buttons1->set_column_homogeneous (true); + setExpandAlignProperties (buttons1, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Grid* buttons2 = Gtk::manage (new Gtk::Grid()); + buttons2->set_row_homogeneous (true); + buttons2->set_column_homogeneous (true); + setExpandAlignProperties (buttons2, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + remove = Gtk::manage (new Gtk::Button ()); // M("EXIFPANEL_REMOVE") + remove->set_image (*Gtk::manage (new Gtk::Image (delicon))); + remove->set_tooltip_text (M ("EXIFPANEL_REMOVEHINT")); + remove->get_style_context()->add_class ("Left"); + setExpandAlignProperties (remove, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + buttons1->attach_next_to (*remove, Gtk::POS_LEFT, 1, 1); + + keep = Gtk::manage (new Gtk::Button ()); // M("EXIFPANEL_KEEP") + keep->set_image (*Gtk::manage (new Gtk::Image (keepicon))); + keep->set_tooltip_text (M ("EXIFPANEL_KEEPHINT")); + keep->get_style_context()->add_class ("MiddleH"); + setExpandAlignProperties (keep, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + buttons1->attach_next_to (*keep, Gtk::POS_RIGHT, 1, 1); + + add = Gtk::manage (new Gtk::Button ()); // M("EXIFPANEL_ADDEDIT") + add->set_image (*Gtk::manage (new Gtk::Image (editicon))); + add->set_tooltip_text (M ("EXIFPANEL_ADDEDITHINT")); + add->get_style_context()->add_class ("Right"); + setExpandAlignProperties (add, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + buttons1->attach_next_to (*add, Gtk::POS_RIGHT, 1, 1); + + showAll = Gtk::manage (new Gtk::ToggleButton (M ("EXIFPANEL_SHOWALL"))); + //add->set_tooltip_text (M("EXIFPANEL_SHOWALL")); + showAll->get_style_context()->add_class ("Left"); + setExpandAlignProperties (showAll, false, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + showAll->set_active (options.lastShowAllExif); + buttons2->attach_next_to (*showAll, Gtk::POS_LEFT, 1, 1); + + reset = Gtk::manage (new Gtk::Button ()); // M("EXIFPANEL_RESET") + reset->set_image (*Gtk::manage (new RTImage ("gtk-undo-ltr.png", "gtk-undo-rtl.png"))); + reset->set_tooltip_text (M ("EXIFPANEL_RESETHINT")); + reset->get_style_context()->add_class ("MiddleH"); + setExpandAlignProperties (reset, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + buttons2->attach_next_to (*reset, Gtk::POS_RIGHT, 1, 1); + + resetAll = Gtk::manage (new Gtk::Button ()); // M("EXIFPANEL_RESETALL") + resetAll->set_image (*Gtk::manage (new RTImage ("gtk-undoall-ltr.png", "gtk-undoall-rtl.png"))); + resetAll->set_tooltip_text (M ("EXIFPANEL_RESETALLHINT")); + resetAll->get_style_context()->add_class ("Right"); + setExpandAlignProperties (resetAll, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + buttons2->attach_next_to (*resetAll, Gtk::POS_RIGHT, 1, 1); pack_end (*buttons2, Gtk::PACK_SHRINK); pack_end (*buttons1, Gtk::PACK_SHRINK); - exifTree->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &ExifPanel::exifSelectionChanged)); - exifTree->signal_row_activated().connect(sigc::mem_fun(*this, &ExifPanel::row_activated)); + exifTree->get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ExifPanel::exifSelectionChanged)); + exifTree->signal_row_activated().connect (sigc::mem_fun (*this, &ExifPanel::row_activated)); - remove->signal_clicked().connect( sigc::mem_fun(*this, &ExifPanel::removePressed) ); - keep->signal_clicked().connect( sigc::mem_fun(*this, &ExifPanel::keepPressed) ); - reset->signal_clicked().connect( sigc::mem_fun(*this, &ExifPanel::resetPressed) ); - resetAll->signal_clicked().connect( sigc::mem_fun(*this, &ExifPanel::resetAllPressed) ); - add->signal_clicked().connect( sigc::mem_fun(*this, &ExifPanel::addPressed) ); + remove->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::removePressed) ); + keep->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::keepPressed) ); + reset->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::resetPressed) ); + resetAll->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::resetAllPressed) ); + add->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::addPressed) ); + showAll->signal_toggled().connect ( sigc::mem_fun (*this, &ExifPanel::showAlltoggled) ); show_all (); } @@ -177,22 +187,25 @@ defChangeList = defParams->exif; } -void ExifPanel::setImageData (const ImageMetaData* id) +void ExifPanel::setImageData (const FramesMetaData* id) { idata = id; exifTreeModel->clear (); - if (id && id->getExifData ()) { -// id->getExifData ()->printAll (); - addDirectory (id->getExifData (), exifTreeModel->children()); + if (idata) { + for (unsigned int rootNum = 0; rootNum < id->getRootCount (); ++rootNum) { + if ( id->getRootExifData (rootNum)) { + addDirectory (id->getRootExifData (rootNum), exifTreeModel->children(), rootNum > 0); + } + } } } Gtk::TreeModel::Children ExifPanel::addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable) { - Gtk::TreeModel::Row row = *(exifTreeModel->append(root)); + Gtk::TreeModel::Row row = * (exifTreeModel->append (root)); row[exifColumns.action] = action; row[exifColumns.editable] = editable; row[exifColumns.edited] = false; @@ -207,36 +220,74 @@ } if (editable) { - row[exifColumns.field] = Glib::ustring("") + escapeHtmlChars(field) + ""; - row[exifColumns.value] = Glib::ustring("") + escapeHtmlChars(value) + ""; + row[exifColumns.field] = Glib::ustring ("") + escapeHtmlChars (field) + ""; + row[exifColumns.value] = Glib::ustring ("") + escapeHtmlChars (value) + ""; } else if (action == AC_SYSTEM) { - row[exifColumns.field] = Glib::ustring("") + escapeHtmlChars(field) + ""; - row[exifColumns.value] = Glib::ustring("") + escapeHtmlChars(value) + ""; + row[exifColumns.field] = Glib::ustring ("") + escapeHtmlChars (field) + ""; + row[exifColumns.value] = Glib::ustring ("") + escapeHtmlChars (value) + ""; } else { - row[exifColumns.field] = escapeHtmlChars(field); - row[exifColumns.value] = escapeHtmlChars(value); + row[exifColumns.field] = escapeHtmlChars (field); + row[exifColumns.value] = escapeHtmlChars (value); } return row.children(); } -void ExifPanel::addDirectory (const TagDirectory* dir, Gtk::TreeModel::Children root) +Gtk::TreeModel::Children ExifPanel::addSeparator () +{ + + Gtk::TreeModel::Row row = * (exifTreeModel->append (exifTreeModel->children())); + row[exifColumns.action] = rtexif::ActionCode::AC_INVALID; + row[exifColumns.editable] = false; + row[exifColumns.edited] = false; + row[exifColumns.field_nopango] = ""; + row[exifColumns.value_nopango] = ""; + row[exifColumns.orig_value] = ""; + row[exifColumns.isSeparator] = true; + + return row.children(); +} + +void ExifPanel::addDirectory (const TagDirectory* dir, Gtk::TreeModel::Children root, bool checkForSeparator) { - for (int i = 0; i < dir->getCount(); i++) { - Tag* t = (const_cast(dir))->getTagByIndex (i); + for (int i = 0; i < dir->getCount(); ++i) { + Tag* t = (const_cast (dir))->getTagByIndex (i); - if (t->getAttrib() && t->getAttrib()->action == AC_SYSTEM) { + bool hasContent = false; + + if (checkForSeparator && i == 0) { + for (int j = 0; j < dir->getCount(); ++j) { + Tag* t2 = (const_cast (dir))->getTagByIndex (j); + const TagAttrib* currAttrib = t2->getAttrib(); + + if (currAttrib && ((options.lastShowAllExif) || (!options.lastShowAllExif && currAttrib->action != AC_SYSTEM))) { + addSeparator(); + hasContent = true; + break; + } + } + } else { + hasContent = true; + } + + if (!hasContent) { + return; + } + + const TagAttrib* currAttrib = t->getAttrib(); + + if (!options.lastShowAllExif && currAttrib && currAttrib->action == AC_SYSTEM) { continue; } - if (t->isDirectory()) - for (int j = 0; t->getDirectory(j); j++) { - Gtk::TreeModel::Children ch = addTag (root, t->nameToString (j), M("EXIFPANEL_SUBDIRECTORY"), t->getAttrib() ? t->getAttrib()->action : AC_DONTWRITE, t->getAttrib() && t->getAttrib()->editable); - addDirectory (t->getDirectory(j), ch); + if (t->isDirectory()) { + for (int j = 0; t->getDirectory (j); j++) { + Gtk::TreeModel::Children ch = addTag (root, t->nameToString (j), M ("EXIFPANEL_SUBDIRECTORY"), currAttrib ? currAttrib->action : AC_DONTWRITE, currAttrib && currAttrib->editable); + addDirectory (t->getDirectory (j), ch); } - else { - addTag (root, t->nameToString (), t->valueToString (), t->getAttrib() ? (t->getOwnMemory() ? t->getAttrib()->action : AC_SYSTEM) : AC_DONTWRITE, t->getAttrib() && t->getAttrib()->editable); + } else { + addTag (root, t->nameToString (), t->valueToString (), currAttrib ? (t->getOwnMemory() ? currAttrib->action : AC_SYSTEM) : AC_DONTWRITE, currAttrib && currAttrib->editable); } } } @@ -262,11 +313,11 @@ remove->set_sensitive (1); keep->set_sensitive (1); reset->set_sensitive (1); - } else if (iter->get_value(exifColumns.icon) == delicon) { + } else if (iter->get_value (exifColumns.icon) == delicon) { remove->set_sensitive (0); keep->set_sensitive (1); reset->set_sensitive (1); - } else if (iter->get_value(exifColumns.icon) == keepicon || iter->get_value(exifColumns.icon) == editicon) { + } else if (iter->get_value (exifColumns.icon) == keepicon || iter->get_value (exifColumns.icon) == editicon) { keep->set_sensitive (0); remove->set_sensitive (1); reset->set_sensitive (1); @@ -371,8 +422,8 @@ } if (iter->get_value (exifColumns.edited)) { - iter->set_value (exifColumns.value, Glib::ustring("") + iter->get_value(exifColumns.orig_value) + ""); - iter->set_value (exifColumns.value_nopango, iter->get_value(exifColumns.orig_value)); + iter->set_value (exifColumns.value, Glib::ustring ("") + iter->get_value (exifColumns.orig_value) + ""); + iter->set_value (exifColumns.value_nopango, iter->get_value (exifColumns.orig_value)); iter->set_value (exifColumns.edited, false); } @@ -415,14 +466,14 @@ void ExifPanel::addPressed () { - Gtk::Dialog* dialog = new Gtk::Dialog (M("EXIFPANEL_ADDTAGDLG_TITLE"), *((Gtk::Window*)get_toplevel()), true); + Gtk::Dialog* dialog = new Gtk::Dialog (M ("EXIFPANEL_ADDTAGDLG_TITLE"), * ((Gtk::Window*)get_toplevel()), true); dialog->add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); dialog->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); Gtk::HBox* hb1 = new Gtk::HBox (); Gtk::HBox* hb2 = new Gtk::HBox (); - Gtk::Label* tlabel = new Gtk::Label (M("EXIFPANEL_ADDTAGDLG_SELECTTAG") + ":"); + Gtk::Label* tlabel = new Gtk::Label (M ("EXIFPANEL_ADDTAGDLG_SELECTTAG") + ":"); MyComboBoxText* tcombo = new MyComboBoxText (); tcombo->append ("Artist"); @@ -433,7 +484,7 @@ hb1->pack_start (*tlabel, Gtk::PACK_SHRINK, 4); hb1->pack_start (*tcombo); - Gtk::Label* vlabel = new Gtk::Label (M("EXIFPANEL_ADDTAGDLG_ENTERVALUE") + ":"); + Gtk::Label* vlabel = new Gtk::Label (M ("EXIFPANEL_ADDTAGDLG_ENTERVALUE") + ":"); Gtk::Entry* ventry = new Gtk::Entry (); hb2->pack_start (*vlabel, Gtk::PACK_SHRINK, 4); hb2->pack_start (*ventry); @@ -479,6 +530,17 @@ delete hb2; } +void ExifPanel::showAlltoggled () +{ + options.lastShowAllExif = showAll->get_active(); + setImageData (idata); +} + +bool ExifPanel::rowSeperatorFunc(const Glib::RefPtr& model, const Gtk::TreeModel::iterator& iter) +{ + return iter->get_value(exifColumns.isSeparator); +} + void ExifPanel::editTag (Gtk::TreeModel::Children root, Glib::ustring name, Glib::ustring value) { @@ -493,29 +555,30 @@ } if (iter == root.end() && value != "#keep" && value != "#delete") { - iter = exifTreeModel->append(root); + iter = exifTreeModel->append (root); iter->set_value (exifColumns.field_nopango, fseg); iter->set_value (exifColumns.action, AC_INVALID); if (dp == Glib::ustring::npos) { - iter->set_value (exifColumns.value, Glib::ustring("") + value + ""); + iter->set_value (exifColumns.value, Glib::ustring ("") + value + ""); iter->set_value (exifColumns.value_nopango, value); iter->set_value (exifColumns.orig_value, value); - iter->set_value (exifColumns.field, Glib::ustring("") + fseg + ""); + iter->set_value (exifColumns.field, Glib::ustring ("") + fseg + ""); iter->set_value (exifColumns.edited, true); iter->set_value (exifColumns.editable, true); iter->set_value (exifColumns.icon, editicon); } else { - iter->set_value (exifColumns.value, Glib::ustring(M("EXIFPANEL_SUBDIRECTORY"))); - iter->set_value (exifColumns.value_nopango, Glib::ustring(M("EXIFPANEL_SUBDIRECTORY"))); + iter->set_value (exifColumns.value, Glib::ustring (M ("EXIFPANEL_SUBDIRECTORY"))); + iter->set_value (exifColumns.value_nopango, Glib::ustring (M ("EXIFPANEL_SUBDIRECTORY"))); iter->set_value (exifColumns.field, fseg); iter->set_value (exifColumns.icon, keepicon); - iter->set_value (exifColumns.orig_value, Glib::ustring(M("EXIFPANEL_SUBDIRECTORY"))); + iter->set_value (exifColumns.orig_value, Glib::ustring (M ("EXIFPANEL_SUBDIRECTORY"))); } } - if (iter == root.end()) + if (iter == root.end()) { return; + } if (dp == Glib::ustring::npos) { if (value == "#keep" && iter->get_value (exifColumns.action) != AC_SYSTEM) { @@ -523,7 +586,7 @@ } else if (value == "#delete" && iter->get_value (exifColumns.action) != AC_SYSTEM) { iter->set_value (exifColumns.icon, delicon); } else { - iter->set_value (exifColumns.value, Glib::ustring("") + value + ""); + iter->set_value (exifColumns.value, Glib::ustring ("") + value + ""); iter->set_value (exifColumns.value_nopango, value); iter->set_value (exifColumns.edited, true); iter->set_value (exifColumns.icon, editicon); @@ -571,11 +634,11 @@ while (iter) { if (first) { ret = iter->get_value (exifColumns.field_nopango); + editable = iter->get_value (exifColumns.editable); } else { ret = iter->get_value (exifColumns.field_nopango) + "." + ret; } - editable = iter->get_value (exifColumns.editable); iter = iter->parent (); first = false; } @@ -637,8 +700,7 @@ exifTree->collapse_row (path); } else { exifTree->expand_row (path, false); - } - else if (iter->get_value (exifColumns.editable)) { + } else if (iter->get_value (exifColumns.editable)) { addPressed (); } } @@ -649,6 +711,6 @@ { if (listener) { - listener->panelChanged (EvExif, M("HISTORY_CHANGED")); + listener->panelChanged (EvExif, M ("HISTORY_CHANGED")); } } diff -Nru rawtherapee-5.3/rtgui/exifpanel.h rawtherapee-5.4/rtgui/exifpanel.h --- rawtherapee-5.3/rtgui/exifpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/exifpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -26,7 +26,7 @@ { private: - const rtengine::ImageMetaData* idata; + const rtengine::FramesMetaData* idata; rtengine::procparams::ExifPairs changeList; rtengine::procparams::ExifPairs defChangeList; bool recursiveOp; @@ -43,18 +43,20 @@ Gtk::TreeModelColumn action; Gtk::TreeModelColumn editable; Gtk::TreeModelColumn edited; + Gtk::TreeModelColumn isSeparator; ExifColumns() { - add(field); - add(value); - add(icon); - add(action); - add(edited); - add(field_nopango); - add(value_nopango); - add(editable); - add(orig_value); + add (field); + add (value); + add (icon); + add (action); + add (edited); + add (field_nopango); + add (value_nopango); + add (editable); + add (orig_value); + add (isSeparator); } }; Glib::RefPtr delicon; @@ -71,37 +73,42 @@ Gtk::Button* add; Gtk::Button* reset; Gtk::Button* resetAll; + Gtk::ToggleButton* showAll; - Gtk::TreeModel::Children addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable); + Gtk::TreeModel::Children addTag (const Gtk::TreeModel::Children& root, Glib::ustring field, Glib::ustring value, rtexif::ActionCode action, bool editable); void editTag (Gtk::TreeModel::Children root, Glib::ustring name, Glib::ustring value); void updateChangeList (Gtk::TreeModel::Children root, std::string prefix); - void addDirectory (const rtexif::TagDirectory* dir, Gtk::TreeModel::Children root); + void addDirectory (const rtexif::TagDirectory* dir, Gtk::TreeModel::Children root, bool checkForSeparator = false); + Gtk::TreeModel::Children addSeparator(); Glib::ustring getSelection (bool onlyifeditable = false); - Glib::ustring getSelectedValue (); - void updateChangeList (); - void applyChangeList (); - void keepIt (Gtk::TreeModel::iterator iter); - void delIt (Gtk::TreeModel::iterator iter); + Glib::ustring getSelectedValue(); + void updateChangeList(); + void applyChangeList(); + void keepIt (Gtk::TreeModel::iterator iter); + void delIt (Gtk::TreeModel::iterator iter); Gtk::TreeModel::iterator resetIt (Gtk::TreeModel::iterator iter); + void removePressed(); + void keepPressed(); + void resetPressed(); + void resetAllPressed(); + void addPressed(); + void showAlltoggled(); + bool rowSeperatorFunc(const Glib::RefPtr& model, const Gtk::TreeModel::iterator& iter); + public: ExifPanel (); - virtual ~ExifPanel (); + virtual ~ExifPanel(); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + + void setImageData (const rtengine::FramesMetaData* id); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - - void setImageData (const rtengine::ImageMetaData* id); - - void exifSelectionChanged (); - void removePressed (); - void keepPressed (); - void resetPressed (); - void resetAllPressed (); - void addPressed (); + void exifSelectionChanged(); void row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); - void notifyListener (); + void notifyListener(); }; diff -Nru rawtherapee-5.3/rtgui/exportpanel.cc rawtherapee-5.4/rtgui/exportpanel.cc --- rawtherapee-5.3/rtgui/exportpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/exportpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -68,8 +68,8 @@ hb_raw_bayer_method->pack_start (*Gtk::manage (new Gtk::Label ( M ("EXPORT_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); raw_bayer_method = Gtk::manage (new MyComboBoxText ()); - for ( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++) { - raw_bayer_method->append (procparams::RAWParams::BayerSensor::methodstring[i]); + for (const auto method_string : RAWParams::BayerSensor::getMethodStrings()) { + raw_bayer_method->append(method_string); } raw_bayer_method->set_active (0); @@ -91,8 +91,8 @@ hb_raw_xtrans_method->pack_start (*Gtk::manage (new Gtk::Label ( M ("EXPORT_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); raw_xtrans_method = Gtk::manage (new MyComboBoxText ()); - for ( size_t i = 0; i < procparams::RAWParams::XTransSensor::numMethods; i++) { - raw_xtrans_method->append (procparams::RAWParams::XTransSensor::methodstring[i]); + for (const auto method_string : RAWParams::XTransSensor::getMethodStrings()) { + raw_xtrans_method->append(method_string); } raw_xtrans_method->set_active (0); @@ -275,15 +275,15 @@ //saving Bayer demosaic_method int currentRow = raw_bayer_method->get_active_row_number(); - if ( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) { - FE_OPT_STORE_ (options.fastexport_raw_bayer_method, procparams::RAWParams::BayerSensor::methodstring[currentRow]); + if (currentRow >= 0 && currentRow < std::numeric_limits::max()) { + FE_OPT_STORE_ (options.fastexport_raw_bayer_method, procparams::RAWParams::BayerSensor::getMethodStrings()[currentRow]); } //saving X-Trans demosaic_method currentRow = raw_xtrans_method->get_active_row_number(); - if ( currentRow >= 0 && currentRow < procparams::RAWParams::XTransSensor::numMethods) { - FE_OPT_STORE_ (options.fastexport_raw_xtrans_method, procparams::RAWParams::XTransSensor::methodstring[currentRow]); + if (currentRow >= 0 && currentRow < std::numeric_limits::max()) { + FE_OPT_STORE_ (options.fastexport_raw_xtrans_method, procparams::RAWParams::XTransSensor::getMethodStrings()[currentRow]); } // options.fastexport_icm_input = icm_input ; @@ -337,20 +337,20 @@ bypass_raw_ff->set_active (options.fastexport_bypass_raw_ff ); // Bayer demosaic method - raw_bayer_method->set_active (procparams::RAWParams::BayerSensor::numMethods); + raw_bayer_method->set_active(std::numeric_limits::max()); - for ( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++) - if ( options.fastexport_raw_bayer_method == procparams::RAWParams::BayerSensor::methodstring[i]) { - raw_bayer_method->set_active (i); + for (size_t i = 0; i < RAWParams::BayerSensor::getMethodStrings().size(); ++i) + if (options.fastexport_raw_bayer_method == procparams::RAWParams::BayerSensor::getMethodStrings()[i]) { + raw_bayer_method->set_active(i); break; } // X-Trans demosaic method - raw_xtrans_method->set_active (procparams::RAWParams::XTransSensor::numMethods); + raw_xtrans_method->set_active(std::numeric_limits::max()); - for ( size_t i = 0; i < procparams::RAWParams::XTransSensor::numMethods; i++) - if ( options.fastexport_raw_xtrans_method == procparams::RAWParams::XTransSensor::methodstring[i]) { - raw_xtrans_method->set_active (i); + for (size_t i = 0; i < procparams::RAWParams::XTransSensor::getMethodStrings().size(); ++i) + if (options.fastexport_raw_xtrans_method == procparams::RAWParams::XTransSensor::getMethodStrings()[i]) { + raw_xtrans_method->set_active(i); break; } diff -Nru rawtherapee-5.3/rtgui/fattaltonemap.cc rawtherapee-5.4/rtgui/fattaltonemap.cc --- rawtherapee-5.3/rtgui/fattaltonemap.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/fattaltonemap.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,144 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include "fattaltonemap.h" +#include "eventmapper.h" +#include +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +FattalToneMapping::FattalToneMapping(): FoldableToolPanel(this, "fattal", M("TP_TM_FATTAL_LABEL"), true, true) +{ + auto m = ProcEventMapper::getInstance(); + EvTMFattalAnchor = m->newEvent(HDR, "HISTORY_MSG_TM_FATTAL_ANCHOR"); + + amount = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_AMOUNT"), 1., 100., 1., 30.)); + threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 100., 1., 0.0)); + Gtk::Image *al = Gtk::manage(new RTImage("adj-black.png")); + Gtk::Image *ar = Gtk::manage(new RTImage("adj-white.png")); + anchor = Gtk::manage(new Adjuster(M("TP_TM_FATTAL_ANCHOR"), 1, 100, 1, 50, al, ar)); + + amount->setAdjusterListener(this); + threshold->setAdjusterListener(this); + anchor->setAdjusterListener(this); + + amount->show(); + threshold->show(); + anchor->show(); + + pack_start(*amount); + pack_start(*threshold); + pack_start(*anchor); +} + +void FattalToneMapping::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + threshold->setEditedState(pedited->fattal.threshold ? Edited : UnEdited); + amount->setEditedState(pedited->fattal.amount ? Edited : UnEdited); + anchor->setEditedState(pedited->fattal.anchor ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->fattal.enabled); + } + + setEnabled(pp->fattal.enabled); + threshold->setValue(pp->fattal.threshold); + amount->setValue(pp->fattal.amount); + anchor->setValue(pp->fattal.anchor); + + enableListener(); +} + +void FattalToneMapping::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->fattal.threshold = threshold->getValue(); + pp->fattal.amount = amount->getValue(); + pp->fattal.anchor = anchor->getValue(); + pp->fattal.enabled = getEnabled(); + + if(pedited) { + pedited->fattal.threshold = threshold->getEditedState(); + pedited->fattal.amount = amount->getEditedState(); + pedited->fattal.anchor = anchor->getEditedState(); + pedited->fattal.enabled = !get_inconsistent(); + } +} + +void FattalToneMapping::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + threshold->setDefault(defParams->fattal.threshold); + amount->setDefault(defParams->fattal.amount); + anchor->setDefault(defParams->fattal.anchor); + + if(pedited) { + threshold->setDefaultEditedState(pedited->fattal.threshold ? Edited : UnEdited); + amount->setDefaultEditedState(pedited->fattal.amount ? Edited : UnEdited); + anchor->setDefaultEditedState(pedited->fattal.anchor ? Edited : UnEdited); + } else { + threshold->setDefaultEditedState(Irrelevant); + amount->setDefaultEditedState(Irrelevant); + anchor->setDefaultEditedState(Irrelevant); + } +} + +void FattalToneMapping::adjusterChanged(Adjuster* a, double newval) +{ + if(listener && getEnabled()) { + if(a == threshold) { + listener->panelChanged(EvTMFattalThreshold, a->getTextValue()); + } else if(a == amount) { + listener->panelChanged(EvTMFattalAmount, a->getTextValue()); + } else if(a == anchor) { + listener->panelChanged(EvTMFattalAnchor, a->getTextValue()); + } + } +} + +void FattalToneMapping::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvTMFattalEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvTMFattalEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvTMFattalEnabled, M("GENERAL_DISABLED")); + } + } +} + +void FattalToneMapping::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + threshold->showEditedCB(); + amount->showEditedCB(); + anchor->showEditedCB(); +} + +void FattalToneMapping::setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd) +{ + amount->setAddMode(amountAdd); + threshold->setAddMode(thresholdAdd); + anchor->setAddMode(anchorAdd); +} + diff -Nru rawtherapee-5.3/rtgui/fattaltonemap.h rawtherapee-5.4/rtgui/fattaltonemap.h --- rawtherapee-5.3/rtgui/fattaltonemap.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/fattaltonemap.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,48 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class FattalToneMapping: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +protected: + Adjuster *threshold; + Adjuster *amount; + Adjuster *anchor; + + rtengine::ProcEvent EvTMFattalAnchor; + +public: + + FattalToneMapping(); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void setBatchMode (bool batchMode); + + void adjusterChanged (Adjuster* a, double newval); + void enabledChanged (); + void setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd); +}; + diff -Nru rawtherapee-5.3/rtgui/filebrowser.cc rawtherapee-5.4/rtgui/filebrowser.cc --- rawtherapee-5.3/rtgui/filebrowser.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filebrowser.cc 2018-03-20 11:04:15.000000000 +0000 @@ -401,6 +401,8 @@ copyprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_C, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); pasteprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_V, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); partpasteprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_V, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); + copyTo->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_C, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); + moveTo->add_accelerator ("activate", pmenu->get_accel_group(), GDK_KEY_M, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); // Bind to event handlers open->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), open)); @@ -440,8 +442,6 @@ clearprof->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), clearprof)); cachemenu->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), cachemenu)); - - // A separate pop-up menu for Color Labels int c = 0; pmenuColorLabels = new Gtk::Menu (); @@ -497,6 +497,8 @@ partpasteprof->set_sensitive (clipboard.hasProcParams()); copyprof->set_sensitive (selected.size() == 1); clearprof->set_sensitive (!selected.empty()); + copyTo->set_sensitive (!selected.empty()); + moveTo->set_sensitive (!selected.empty()); } // submenuDF @@ -1019,7 +1021,7 @@ for (unsigned int i = 0; i < mselected.size(); i++) { // copying read only clipboard PartialProfile to a temporary one - rtengine::procparams::PartialProfile cbPartProf = clipboard.getPartialProfile(); + const rtengine::procparams::PartialProfile& cbPartProf = clipboard.getPartialProfile(); rtengine::procparams::PartialProfile pastedPartProf(cbPartProf.pparams, cbPartProf.pedited, true); // applying the PartialProfile to the thumb's ProcParams @@ -1067,7 +1069,7 @@ for (unsigned int i = 0; i < mselected.size(); i++) { // copying read only clipboard PartialProfile to a temporary one, initialized to the thumb's ProcParams mselected[i]->thumbnail->createProcParamsForUpdate(false, false); // this can execute customprofilebuilder to generate param file - rtengine::procparams::PartialProfile cbPartProf = clipboard.getPartialProfile(); + const rtengine::procparams::PartialProfile& cbPartProf = clipboard.getPartialProfile(); rtengine::procparams::PartialProfile pastedPartProf(&mselected[i]->thumbnail->getProcParams (), nullptr); // pushing the selected values of the clipboard PartialProfile to the temporary PartialProfile @@ -1115,7 +1117,14 @@ #ifdef __WIN32__ bool altgr = event->state & GDK_MOD2_MASK; #endif - if ((event->keyval == GDK_KEY_C || event->keyval == GDK_KEY_c || event->keyval == GDK_KEY_Insert) && ctrl) { + + if ((event->keyval == GDK_KEY_C || event->keyval == GDK_KEY_c) && ctrl && shift) { + menuItemActivated (copyTo); + return true; + } else if ((event->keyval == GDK_KEY_M || event->keyval == GDK_KEY_m) && ctrl && shift) { + menuItemActivated (moveTo); + return true; + } else if ((event->keyval == GDK_KEY_C || event->keyval == GDK_KEY_c || event->keyval == GDK_KEY_Insert) && ctrl) { copyProfile (); return true; } else if ((event->keyval == GDK_KEY_V || event->keyval == GDK_KEY_v) && ctrl && !shift) { @@ -1535,8 +1544,8 @@ && (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp) > 0); return - (!filter.exifFilter.filterShutter || (rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) >= filter.exifFilter.shutterFrom - tol2 && rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) <= filter.exifFilter.shutterTo + tol2)) - && (!filter.exifFilter.filterFNumber || (rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) >= filter.exifFilter.fnumberFrom - tol2 && rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) <= filter.exifFilter.fnumberTo + tol2)) + (!filter.exifFilter.filterShutter || (rtengine::FramesMetaData::shutterFromString(rtengine::FramesMetaData::shutterToString(cfs->shutter)) >= filter.exifFilter.shutterFrom - tol2 && rtengine::FramesMetaData::shutterFromString(rtengine::FramesMetaData::shutterToString(cfs->shutter)) <= filter.exifFilter.shutterTo + tol2)) + && (!filter.exifFilter.filterFNumber || (rtengine::FramesMetaData::apertureFromString(rtengine::FramesMetaData::apertureToString(cfs->fnumber)) >= filter.exifFilter.fnumberFrom - tol2 && rtengine::FramesMetaData::apertureFromString(rtengine::FramesMetaData::apertureToString(cfs->fnumber)) <= filter.exifFilter.fnumberTo + tol2)) && (!filter.exifFilter.filterFocalLen || (cfs->focalLen >= filter.exifFilter.focalFrom - tol && cfs->focalLen <= filter.exifFilter.focalTo + tol)) && (!filter.exifFilter.filterISO || (cfs->iso >= filter.exifFilter.isoFrom && cfs->iso <= filter.exifFilter.isoTo)) && (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp) > 0) diff -Nru rawtherapee-5.3/rtgui/filebrowserentry.cc rawtherapee-5.4/rtgui/filebrowserentry.cc --- rawtherapee-5.3/rtgui/filebrowserentry.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filebrowserentry.cc 2018-03-20 11:04:15.000000000 +0000 @@ -36,6 +36,8 @@ Glib::RefPtr FileBrowserEntry::editedIcon; Glib::RefPtr FileBrowserEntry::recentlySavedIcon; Glib::RefPtr FileBrowserEntry::enqueuedIcon; +Glib::RefPtr FileBrowserEntry::hdr; +Glib::RefPtr FileBrowserEntry::ps; FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname) : ThumbBrowserEntryBase (fname), wasInside(false), iatlistener(nullptr), press_x(0), press_y(0), action_x(0), action_y(0), rot_deg(0.0), landscape(true), cropgl(nullptr), state(SNormal), crop_custom_ratio(0.f) @@ -57,6 +59,8 @@ editedIcon = RTImage::createFromFile ("edited.png"); recentlySavedIcon = RTImage::createFromFile ("recent-save.png"); enqueuedIcon = RTImage::createFromFile ("processing.png"); + hdr = RTImage::createFromFile ("HDR-thumbnail.png"); + ps = RTImage::createFromFile ("PixelShift-thumbnail.png"); iconsLoaded = true; } @@ -137,6 +141,26 @@ return ret; } +std::vector > FileBrowserEntry::getSpecificityIconsOnImageArea () +{ + + std::vector > ret; + + if (!thumbnail) { + return ret; + } + + if (thumbnail->isHDR() && hdr) { + ret.push_back (hdr); + } + + if (thumbnail->isPixelShift() && ps) { + ret.push_back (ps); + } + + return ret; +} + void FileBrowserEntry::customBackBufferUpdate (Cairo::RefPtr c) { if(scale != 1.0 && cropParams.enabled) { // somewhere in pipeline customBackBufferUpdate is called when scale == 1.0, which is nonsense for a thumb @@ -144,6 +168,16 @@ drawCrop (c, prex, prey, prew, preh, 0, 0, scale, cropParams, true, false); } else { rtengine::procparams::CropParams cparams = thumbnail->getProcParams().crop; + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cparams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cparams.guide = "Frame"; + break; + default: + break; + } if (cparams.enabled && !thumbnail->isQuick()) { // Quick thumb have arbitrary sizes, so don't apply the crop drawCrop (c, prex, prey, prew, preh, 0, 0, scale, cparams, true, false); diff -Nru rawtherapee-5.3/rtgui/filebrowserentry.h rawtherapee-5.4/rtgui/filebrowserentry.h --- rawtherapee-5.3/rtgui/filebrowserentry.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filebrowserentry.h 2018-03-20 11:04:15.000000000 +0000 @@ -70,6 +70,8 @@ static Glib::RefPtr editedIcon; static Glib::RefPtr recentlySavedIcon; static Glib::RefPtr enqueuedIcon; + static Glib::RefPtr hdr; + static Glib::RefPtr ps; FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname); ~FileBrowserEntry (); @@ -87,6 +89,7 @@ void calcThumbnailSize (); virtual std::vector > getIconsOnImageArea (); + virtual std::vector > getSpecificityIconsOnImageArea (); virtual void getIconSize (int& w, int& h); // thumbnaillistener interface diff -Nru rawtherapee-5.3/rtgui/filecatalog.cc rawtherapee-5.4/rtgui/filecatalog.cc --- rawtherapee-5.3/rtgui/filecatalog.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filecatalog.cc 2018-03-20 11:04:15.000000000 +0000 @@ -674,7 +674,7 @@ // Also mention that this progress bar only measures the FIRST pass (quick thumbnails) // The second, usually longer pass is done multithreaded down in the single entries and is NOT measured by this if (!inTabMode) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected Gtk::Notebook *nb = (Gtk::Notebook *)(filepanel->get_parent()); Gtk::Grid* grid = Gtk::manage (new Gtk::Grid ()); @@ -770,6 +770,8 @@ if (cfs->focalLen > dirEFS.focalTo) { dirEFS.focalTo = cfs->focalLen; } + + //TODO: ass filters for HDR and PixelShift files } dirEFS.filetypes.insert (cfs->filetype); @@ -788,7 +790,7 @@ { { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected redrawAll (); previewsToLoad = 0; @@ -870,7 +872,7 @@ { int newHeight = fileBrowser->getEffectiveHeight(); - if (newHeight < 5) { // This may occure if there's no thumbnail. + if (newHeight < 5) { // This may occur if there's no thumbnail. int w, h; get_size_request(w, h); newHeight = h; diff -Nru rawtherapee-5.3/rtgui/filepanel.cc rawtherapee-5.4/rtgui/filepanel.cc --- rawtherapee-5.3/rtgui/filepanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filepanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -411,7 +411,7 @@ void FilePanel::loadingThumbs(Glib::ustring str, double rate) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected if( !str.empty()) { parent->setProgressStr(str); diff -Nru rawtherapee-5.3/rtgui/filepanel.h rawtherapee-5.4/rtgui/filepanel.h --- rawtherapee-5.3/rtgui/filepanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filepanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -58,7 +58,7 @@ { parent = p; } - void init (); // dont call it directly, the constructor calls it as idle source + void init (); // don't call it directly, the constructor calls it as idle source void on_realize (); void setAspect(); void open (const Glib::ustring& d); // open a file or a directory diff -Nru rawtherapee-5.3/rtgui/filmsimulation.cc rawtherapee-5.4/rtgui/filmsimulation.cc --- rawtherapee-5.3/rtgui/filmsimulation.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filmsimulation.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1,3 +1,6 @@ +#include +#include + #include "filmsimulation.h" #include @@ -56,13 +59,11 @@ } -typedef std::vector Strings; - FilmSimulation::FilmSimulation() : FoldableToolPanel( this, "filmsimulation", M("TP_FILMSIMULATION_LABEL"), false, true ) { - m_clutComboBox = Gtk::manage( new ClutComboBox() ); - int foundClutsCount = m_clutComboBox->fillFromDir( options.clutsDir ); + m_clutComboBox = Gtk::manage( new ClutComboBox(options.clutsDir) ); + int foundClutsCount = m_clutComboBox->foundClutsCount(); if ( foundClutsCount == 0 ) { pack_start( *Gtk::manage( new Gtk::Label( M("TP_FILMSIMULATION_ZEROCLUTSFOUND") ) ) ); @@ -116,7 +117,7 @@ void FilmSimulation::setBatchMode( bool batchMode ) { ToolPanel::setBatchMode( batchMode ); - m_clutComboBox->addUnchangedEntry(); + m_clutComboBox->setBatchMode(batchMode); } void FilmSimulation::read( const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited ) @@ -196,33 +197,121 @@ //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -ClutComboBox::ClutColumns::ClutColumns() + +std::unique_ptr ClutComboBox::cm; +std::unique_ptr ClutComboBox::cm2; + +ClutComboBox::ClutComboBox(const Glib::ustring &path): + MyComboBox(), + batchMode(false) { - add( label ); - add( clutFilename ); + if (!cm) { + cm.reset(new ClutModel(path)); + } + if (!cm2 && options.multiDisplayMode) { + cm2.reset(new ClutModel(path)); + } + + set_model(m_model()); + + if (cm->count > 0) { + pack_start(m_columns().label, false); + } + + if (!options.multiDisplayMode) { + signal_map().connect(sigc::mem_fun(*this, &ClutComboBox::updateUnchangedEntry)); + } } -int ClutComboBox::fillFromDir (const Glib::ustring& path) + +inline Glib::RefPtr &ClutComboBox::m_model() { - m_model = Gtk::TreeStore::create (m_columns); - set_model (m_model); + if (!batchMode || !options.multiDisplayMode) { + return cm->m_model; + } else { + return cm2->m_model; + } +} - const auto result = parseDir (path); - if (result > 0) { - pack_start (m_columns.label, false); +inline ClutComboBox::ClutColumns &ClutComboBox::m_columns() +{ + if (!batchMode || !options.multiDisplayMode) { + return cm->m_columns; + } else { + return cm2->m_columns; } +} - return result; + +void ClutComboBox::setBatchMode(bool yes) +{ + if (batchMode != yes) { + batchMode = yes; + set_model(m_model()); + if (batchMode && options.multiDisplayMode) { + updateUnchangedEntry(); + } + } +} + + +void ClutComboBox::updateUnchangedEntry() +{ + auto c = m_model()->children(); + + if (batchMode) { + if (c.empty() || c[c.size()-1][m_columns().clutFilename] != "NULL") { + Gtk::TreeModel::Row row = *(m_model()->append()); + row[m_columns().label] = M("GENERAL_UNCHANGED"); + row[m_columns().clutFilename] = "NULL"; + } + } else { + if (c.size() > 0) { + Gtk::TreeModel::Row row = c[c.size()-1]; + if (row[m_columns().clutFilename] == "NULL") { + std::cout << " removing " << ((void *)this) << std::endl; + m_model()->erase(row); + } + } + } } -int ClutComboBox::parseDir (const Glib::ustring& path) +ClutComboBox::ClutColumns::ClutColumns() { - if (path.empty () || !Glib::file_test (path, Glib::FILE_TEST_IS_DIR)) { + add( label ); + add( clutFilename ); +} + +ClutComboBox::ClutModel::ClutModel(const Glib::ustring &path) +{ + m_model = Gtk::TreeStore::create (m_columns); + //set_model (m_model); + count = parseDir(path); +} + +int ClutComboBox::ClutModel::parseDir(const Glib::ustring& path) +{ + if (path.empty() || !Glib::file_test(path, Glib::FILE_TEST_IS_DIR)) { return 0; } - const auto startedAt = std::chrono::system_clock::now (); + const auto sorted_dir_dirs = [](const Glib::ustring& path) -> std::map + { + std::map res; + + for (const auto& dir : Glib::Dir(path)) { + const std::string full_path = Glib::build_filename(path, dir); + + if (Glib::file_test(full_path, Glib::FILE_TEST_IS_DIR)) { + res.emplace(dir, full_path); + } + } + + return res; + }; + + const auto startedAt = std::chrono::system_clock::now(); // Build menu of limited directory structure using breadth-first search using Dirs = std::vector>; @@ -232,89 +321,77 @@ Dirs currDirs; Dirs nextDirs; - currDirs.emplace_back (path, Gtk::TreeModel::Row ()); - - while (!currDirs.empty ()) { + currDirs.emplace_back(path, Gtk::TreeModel::Row()); + while (!currDirs.empty()) { for (auto& dir : currDirs) { - const auto& path = dir.first; const auto& row = dir.second; try { - for (const auto& entry : Glib::Dir (path)) { - - const auto entryPath = Glib::build_filename (path, entry); - - if (!Glib::file_test (entryPath, Glib::FILE_TEST_IS_DIR)) { - continue; - } + for (const auto& entry : sorted_dir_dirs(path)) { + auto newRow = row ? *m_model->append(row.children()) : *m_model->append(); + newRow[m_columns.label] = entry.first; - auto newRow = row ? *m_model->append (row.children ()) : *m_model->append (); - newRow[m_columns.label] = entry; - - nextDirs.emplace_back (entryPath, newRow); + nextDirs.emplace_back(entry.second, newRow); } } catch (Glib::Exception&) {} - dirs.push_back (std::move (dir)); + dirs.push_back(std::move(dir)); - if (!notifySlowParseDir (startedAt)) { - m_model->clear (); + if (!notifySlowParseDir(startedAt)) { + m_model->clear(); return 0; } } - currDirs.clear (); - currDirs.swap (nextDirs); + currDirs.clear(); + currDirs.swap(nextDirs); } } // Fill menu structure with CLUT files - Strings entries; + std::set entries; - auto fileCount = 0; + unsigned long fileCount = 0; for (const auto& dir : dirs) { - const auto& path = dir.first; const auto& row = dir.second; - entries.clear (); + entries.clear(); try { - for (const auto& entry : Glib::Dir (path)) { + for (const auto& entry : Glib::Dir(path)) { + const auto entryPath = Glib::build_filename(path, entry); - const auto entryPath = Glib::build_filename (path, entry); - - if (!Glib::file_test (entryPath, Glib::FILE_TEST_IS_REGULAR)) { + if (!Glib::file_test(entryPath, Glib::FILE_TEST_IS_REGULAR)) { continue; } - entries.push_back (entryPath); + entries.insert(entryPath); } } catch (Glib::Exception&) {} - std::sort (entries.begin (), entries.end ()); - for (const auto& entry : entries) { - - Glib::ustring name, extension, profileName; + Glib::ustring name; + Glib::ustring extension; + Glib::ustring profileName; HaldCLUT::splitClutFilename (entry, name, extension, profileName); - extension = extension.casefold (); - if (extension.compare ("tif") != 0 && extension.compare ("png") != 0) { + extension = extension.casefold(); + if (extension.compare("tif") != 0 && extension.compare("png") != 0) { continue; } - auto newRow = row ? *m_model->append (row.children ()) : *m_model->append (); + auto newRow = row ? *m_model->append(row.children()) : *m_model->append(); newRow[m_columns.label] = name; newRow[m_columns.clutFilename] = entry; ++fileCount; - if (!notifySlowParseDir (startedAt)) { - m_model->clear (); + if (!notifySlowParseDir(startedAt)) { + m_model->clear(); return 0; } } @@ -323,6 +400,11 @@ return fileCount; } +int ClutComboBox::foundClutsCount() const +{ + return cm->count; +} + Glib::ustring ClutComboBox::getSelectedClut() { Glib::ustring result; @@ -330,7 +412,7 @@ Gtk::TreeModel::Row row = *current; if ( row ) { - result = row[ m_columns.clutFilename ]; + result = row[ m_columns().clutFilename ]; } return result; @@ -339,10 +421,12 @@ void ClutComboBox::setSelectedClut( Glib::ustring filename ) { if ( !filename.empty() ) { - Gtk::TreeIter found = findRowByClutFilename( m_model->children(), filename ); + Gtk::TreeIter found = findRowByClutFilename( m_model()->children(), filename ); if ( found ) { set_active( found ); + } else { + set_active(-1); } } } @@ -354,7 +438,7 @@ for( Gtk::TreeModel::Children::iterator it = childs.begin(); !result && it != childs.end(); ++it ) { Gtk::TreeModel::Row row = *it; - if ( row[ m_columns.clutFilename ] == filename ) { + if ( row[ m_columns().clutFilename ] == filename ) { result = it; } else { result = findRowByClutFilename( it->children(), filename ); @@ -363,10 +447,3 @@ return result; } - -void ClutComboBox::addUnchangedEntry() -{ - Gtk::TreeModel::Row row = *(m_model->append()); - row[m_columns.label] = M("GENERAL_UNCHANGED"); - row[m_columns.clutFilename] = "NULL"; -} diff -Nru rawtherapee-5.3/rtgui/filmsimulation.h rawtherapee-5.4/rtgui/filmsimulation.h --- rawtherapee-5.3/rtgui/filmsimulation.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filmsimulation.h 2018-03-20 11:04:15.000000000 +0000 @@ -11,12 +11,16 @@ class ClutComboBox : public MyComboBox { public: - int fillFromDir (const Glib::ustring& path); + ClutComboBox(const Glib::ustring &path); + //int fillFromDir (const Glib::ustring& path); + int foundClutsCount() const; Glib::ustring getSelectedClut(); void setSelectedClut( Glib::ustring filename ); - void addUnchangedEntry(); + void setBatchMode(bool yes); private: + void updateUnchangedEntry(); // in batchMode we need to add an extra entry "(Unchanged)". We do this whenever the widget is mapped (connecting to signal_map()), unless options.multiDisplayMode (see the comment below about cm2 in this case) + class ClutColumns : public Gtk::TreeModel::ColumnRecord { public: @@ -25,11 +29,23 @@ ClutColumns(); }; - int parseDir (const Glib::ustring& path); + class ClutModel { + public: + Glib::RefPtr m_model; + ClutColumns m_columns; + int count; + ClutModel(const Glib::ustring &path); + int parseDir (const Glib::ustring& path); + }; + + Glib::RefPtr &m_model(); + ClutColumns &m_columns(); + Gtk::TreeIter findRowByClutFilename( Gtk::TreeModel::Children childs, Glib::ustring filename ); - Glib::RefPtr m_model; - ClutColumns m_columns; + static std::unique_ptr cm; // we use a shared TreeModel for all the combo boxes, to save time (no need to reparse the clut dir multiple times)... + static std::unique_ptr cm2; // ... except when options.multiDisplayMode (i.e. editors in their own window), where we need two. This is because we might have two combo boxes displayed at the same time in this case + bool batchMode; }; class FilmSimulation : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel diff -Nru rawtherapee-5.3/rtgui/filterpanel.cc rawtherapee-5.4/rtgui/filterpanel.cc --- rawtherapee-5.3/rtgui/filterpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/filterpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -171,15 +171,15 @@ } // enaFNumber->set_active (curefs.filterFNumber); - fnumberFrom->set_text (ImageMetaData::apertureToString (defefs.fnumberFrom)); + fnumberFrom->set_text (FramesMetaData::apertureToString (defefs.fnumberFrom)); curefs.fnumberFrom = defefs.fnumberFrom; - fnumberTo->set_text (ImageMetaData::apertureToString (defefs.fnumberTo)); + fnumberTo->set_text (FramesMetaData::apertureToString (defefs.fnumberTo)); curefs.fnumberTo = defefs.fnumberTo; // enaShutter->set_active (curefs.filterShutter); - shutterFrom->set_text (ImageMetaData::shutterToString (defefs.shutterFrom)); + shutterFrom->set_text (FramesMetaData::shutterToString (defefs.shutterFrom)); curefs.shutterFrom = defefs.shutterFrom; - shutterTo->set_text (ImageMetaData::shutterToString (defefs.shutterTo)); + shutterTo->set_text (FramesMetaData::shutterToString (defefs.shutterTo)); curefs.shutterTo = defefs.shutterTo; // enaISO->set_active (curefs.filterISO); @@ -315,8 +315,8 @@ efs.focalTo = atof (focalTo->get_text().c_str()); efs.isoFrom = atoi (isoFrom->get_text().c_str()); efs.isoTo = atoi (isoTo->get_text().c_str()); - efs.shutterFrom = ImageMetaData::shutterFromString (shutterFrom->get_text()); - efs.shutterTo = ImageMetaData::shutterFromString (shutterTo->get_text()); + efs.shutterFrom = FramesMetaData::shutterFromString (shutterFrom->get_text()); + efs.shutterTo = FramesMetaData::shutterFromString (shutterTo->get_text()); efs.filterFNumber = enaFNumber->get_active (); efs.filterShutter = enaShutter->get_active (); diff -Nru rawtherapee-5.3/rtgui/flatcurveeditorsubgroup.cc rawtherapee-5.4/rtgui/flatcurveeditorsubgroup.cc --- rawtherapee-5.3/rtgui/flatcurveeditorsubgroup.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/flatcurveeditorsubgroup.cc 2018-03-20 11:04:15.000000000 +0000 @@ -63,9 +63,9 @@ } editCPoints = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCPoints, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, Glib::ustring(M("EDIT_PIPETTE_TOOLTIP"))); + initButton(*editCPoints, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); editPointCPoints = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointCPoints, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, Glib::ustring(M("CURVEEDITOR_EDITPOINT_HINT"))); + initButton(*editPointCPoints, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); copyCPoints = Gtk::manage (new Gtk::Button ()); initButton(*copyCPoints, Glib::ustring("edit-copy.png"), Gtk::ALIGN_END, true); pasteCPoints = Gtk::manage (new Gtk::Button ()); diff -Nru rawtherapee-5.3/rtgui/flatfield.cc rawtherapee-5.4/rtgui/flatfield.cc --- rawtherapee-5.3/rtgui/flatfield.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/flatfield.cc 2018-03-20 11:04:15.000000000 +0000 @@ -78,7 +78,7 @@ pack_start( *flatFieldBlurRadius, Gtk::PACK_SHRINK, 0); pack_start( *flatFieldClipControl, Gtk::PACK_SHRINK, 0); - flatFieldFileconn = flatFieldFile->signal_file_set().connect ( sigc::mem_fun(*this, &FlatField::flatFieldFileChanged), true); + flatFieldFileconn = flatFieldFile->signal_file_set().connect ( sigc::mem_fun(*this, &FlatField::flatFieldFileChanged)); //, true); flatFieldFileReset->signal_clicked().connect( sigc::mem_fun(*this, &FlatField::flatFieldFile_Reset), true ); flatFieldAutoSelectconn = flatFieldAutoSelect->signal_toggled().connect ( sigc::mem_fun(*this, &FlatField::flatFieldAutoSelectChanged), true); flatFieldBlurTypeconn = flatFieldBlurType->signal_changed().connect( sigc::mem_fun(*this, &FlatField::flatFieldBlurTypeChanged) ); @@ -111,13 +111,14 @@ flatFieldBlurTypeconn.block (true); //flatFieldBlurType - for( size_t i = 0; i < procparams::RAWParams::numFlatFileBlurTypes; i++) - if( pp->raw.ff_BlurType == procparams::RAWParams::ff_BlurTypestring[i]) { + for (size_t i = 0; i < procparams::RAWParams::getFlatFieldBlurTypeStrings().size(); ++i) { + if (pp->raw.ff_BlurType == procparams::RAWParams::getFlatFieldBlurTypeStrings()[i]) { flatFieldBlurType->set_active(i); break; } + } - if (multiImage || pp->raw.ff_BlurType == procparams::RAWParams::ff_BlurTypestring[procparams::RAWParams::area_ff]) { + if (multiImage || pp->raw.ff_BlurType == procparams::RAWParams::getFlatFieldBlurTypeString(procparams::RAWParams::FlatFieldBlurType::AREA)) { flatFieldClipControl->show(); } else { flatFieldClipControl->hide(); @@ -135,7 +136,7 @@ flatFieldClipControl->setAutoInconsistent(multiImage && !pedited->raw.ff_AutoClipControl); if( !pedited->raw.ff_BlurType ) { - flatFieldBlurType->set_active(procparams::RAWParams::numFlatFileBlurTypes); // No name + flatFieldBlurType->set_active(std::numeric_limits::max()); // No name } } @@ -216,8 +217,8 @@ int currentRow = flatFieldBlurType->get_active_row_number(); - if( currentRow >= 0 && currentRow < procparams::RAWParams::numFlatFileBlurTypes) { - pp->raw.ff_BlurType = procparams::RAWParams::ff_BlurTypestring[currentRow]; + if( currentRow >= 0 && currentRow < std::numeric_limits::max()) { + pp->raw.ff_BlurType = procparams::RAWParams::getFlatFieldBlurTypeStrings()[currentRow]; } if (pedited) { @@ -226,7 +227,7 @@ pedited->raw.ff_BlurRadius = flatFieldBlurRadius->getEditedState (); pedited->raw.ff_clipControl = flatFieldClipControl->getEditedState (); pedited->raw.ff_AutoClipControl = !flatFieldClipControl->getAutoInconsistent(); - pedited->raw.ff_BlurType = flatFieldBlurType->get_active_row_number() != procparams::RAWParams::numFlatFileBlurTypes; + pedited->raw.ff_BlurType = flatFieldBlurType->get_active_row_number() != std::numeric_limits::max(); } } @@ -336,15 +337,16 @@ void FlatField::flatFieldBlurTypeChanged () { - int curSelection = flatFieldBlurType->get_active_row_number(); + const int curSelection = flatFieldBlurType->get_active_row_number(); + const RAWParams::FlatFieldBlurType blur_type = RAWParams::FlatFieldBlurType(curSelection); - Glib::ustring s = ""; + Glib::ustring s; - if( curSelection >= 0 && curSelection < procparams::RAWParams::numFlatFileBlurTypes) { + if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { s = flatFieldBlurType->get_active_text(); } - if (multiImage || curSelection == procparams::RAWParams::area_ff) { + if (multiImage || blur_type == procparams::RAWParams::FlatFieldBlurType::AREA) { flatFieldClipControl->show(); } else { flatFieldClipControl->hide(); diff -Nru rawtherapee-5.3/rtgui/guiutils.cc rawtherapee-5.4/rtgui/guiutils.cc --- rawtherapee-5.3/rtgui/guiutils.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/guiutils.cc 2018-03-20 11:04:15.000000000 +0000 @@ -336,7 +336,7 @@ } } else if (cparams.guide == "ePassport") { /* Official measurements do not specify exact ratios, just min/max measurements within which the eyes and chin-crown distance must lie. I averaged those measurements to produce these guides. - * The first horizontal guide is for the crown, the second is rougly for the nostrils, the third is for the chin. + * The first horizontal guide is for the crown, the second is roughly for the nostrils, the third is for the chin. * http://www.homeoffice.gov.uk/agencies-public-bodies/ips/passports/information-photographers/ * "(...) the measurement of the face from the bottom of the chin to the crown (ie the top of the head, not the top of the hair) is between 29mm and 34mm." */ @@ -1168,9 +1168,174 @@ } } -MyFileChooserButton::MyFileChooserButton (const Glib::ustring& title, Gtk::FileChooserAction action) : Gtk::FileChooserButton(title, action) +MyFileChooserButton::MyFileChooserButton(const Glib::ustring &title, Gtk::FileChooserAction action): + title_(title), + action_(action), + lbl_("", Gtk::ALIGN_START), + show_hidden_(false) { - //set_size_request(35, -1); + lbl_.set_ellipsize(Pango::ELLIPSIZE_MIDDLE); + lbl_.set_justify(Gtk::JUSTIFY_LEFT); + set_none(); + box_.pack_start(lbl_, true, true); + Gtk::Image *img = Gtk::manage(new Gtk::Image()); + img->set_from_icon_name("document-open", Gtk::ICON_SIZE_BUTTON); + box_.pack_start(*Gtk::manage(new Gtk::VSeparator()), false, false, 5); + box_.pack_start(*img, false, false); + box_.show_all_children(); + add(box_); + signal_clicked().connect(sigc::mem_fun(*this, &MyFileChooserButton::show_chooser)); + + if (GTK_MINOR_VERSION < 20) { + set_border_width(2); // margin doesn't work on GTK < 3.20 + } + + set_name("MyFileChooserButton"); +} + + +void MyFileChooserButton::show_chooser() +{ + Gtk::FileChooserDialog dlg(getToplevelWindow(this), title_, action_); + dlg.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); + dlg.add_button(M(action_ == Gtk::FILE_CHOOSER_ACTION_SAVE ? "GENERAL_SAVE" : "GENERAL_OPEN"), Gtk::RESPONSE_OK); + dlg.set_filename(filename_); + for (auto &f : file_filters_) { + dlg.add_filter(f); + } + if (cur_filter_) { + dlg.set_filter(cur_filter_); + } + for (auto &f : shortcut_folders_) { + dlg.add_shortcut_folder(f); + } + if (!current_folder_.empty()) { + dlg.set_current_folder(current_folder_); + } + dlg.set_show_hidden(show_hidden_); + int res = dlg.run(); + if (res == Gtk::RESPONSE_OK) { + filename_ = dlg.get_filename(); + current_folder_ = dlg.get_current_folder(); + lbl_.set_label(Glib::path_get_basename(filename_)); + selection_changed_.emit(); + } +} + + +sigc::signal &MyFileChooserButton::signal_selection_changed() +{ + return selection_changed_; +} + + +sigc::signal &MyFileChooserButton::signal_file_set() +{ + return selection_changed_; +} + + +std::string MyFileChooserButton::get_filename() const +{ + return filename_; +} + + +bool MyFileChooserButton::set_filename(const std::string &filename) +{ + filename_ = filename; + if (Glib::file_test(filename_, Glib::FILE_TEST_EXISTS)) { + lbl_.set_label(Glib::path_get_basename(filename_)); + } else { + set_none(); + } + return true; +} + + +void MyFileChooserButton::add_filter(const Glib::RefPtr &filter) +{ + file_filters_.push_back(filter); +} + + +void MyFileChooserButton::remove_filter(const Glib::RefPtr &filter) +{ + auto it = std::find(file_filters_.begin(), file_filters_.end(), filter); + if (it != file_filters_.end()) { + file_filters_.erase(it); + } +} + + +void MyFileChooserButton::set_filter(const Glib::RefPtr &filter) +{ + cur_filter_ = filter; +} + + +std::vector> MyFileChooserButton::list_filters() +{ + return file_filters_; +} + + +bool MyFileChooserButton::set_current_folder(const std::string &filename) +{ + current_folder_ = filename; + if (action_ == Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) { + set_filename(filename); + } + return true; +} + +std::string MyFileChooserButton::get_current_folder() const +{ + return current_folder_; +} + + +bool MyFileChooserButton::add_shortcut_folder(const std::string &folder) +{ + shortcut_folders_.push_back(folder); + return true; +} + + +bool MyFileChooserButton::remove_shortcut_folder(const std::string &folder) +{ + auto it = std::find(shortcut_folders_.begin(), shortcut_folders_.end(), folder); + if (it != shortcut_folders_.end()) { + shortcut_folders_.erase(it); + } + return true; +} + + +void MyFileChooserButton::unselect_all() +{ + filename_ = ""; + set_none(); +} + + +void MyFileChooserButton::unselect_filename(const std::string &filename) +{ + if (filename_ == filename) { + unselect_all(); + } +} + + +void MyFileChooserButton::set_show_hidden(bool yes) +{ + show_hidden_ = yes; +} + + +void MyFileChooserButton::set_none() +{ + lbl_.set_label(Glib::ustring("(") + M("GENERAL_NONE") + ")"); } // For an unknown reason (a bug ?), it doesn't work when action = FILE_CHOOSER_ACTION_SELECT_FOLDER ! @@ -1179,7 +1344,7 @@ // If Shift is pressed, the widget is modified if (event->state & GDK_SHIFT_MASK) { - Gtk::FileChooserButton::on_scroll_event(event); + Gtk::Button::on_scroll_event(event); return true; } @@ -1197,19 +1362,6 @@ } -void bindCurrentFolder (Gtk::FileChooser& chooser, Glib::ustring& variable) -{ - chooser.signal_selection_changed ().connect ([&]() - { - const auto current_folder = chooser.get_current_folder (); - - if (!current_folder.empty ()) - variable = current_folder; - }); - - if (!variable.empty ()) - chooser.set_current_folder (variable); -} TextOrIcon::TextOrIcon (Glib::ustring fname, Glib::ustring labelTx, Glib::ustring tooltipTx, TOITypes type) { diff -Nru rawtherapee-5.3/rtgui/guiutils.h rawtherapee-5.4/rtgui/guiutils.h --- rawtherapee-5.3/rtgui/guiutils.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/guiutils.h 2018-03-20 11:04:15.000000000 +0000 @@ -358,22 +358,72 @@ /** * @brief subclass of Gtk::FileChooserButton in order to handle the scrollwheel */ -class MyFileChooserButton : public Gtk::FileChooserButton -{ +class MyFileChooserButton: public Gtk::Button { +private: + void show_chooser(); + + Glib::ustring title_; + Gtk::FileChooserAction action_; + Gtk::HBox box_; + Gtk::Label lbl_; + std::string filename_; + std::string current_folder_; + std::vector> file_filters_; + Glib::RefPtr cur_filter_; + std::vector shortcut_folders_; + bool show_hidden_; + sigc::signal selection_changed_; protected: bool on_scroll_event (GdkEventScroll* event); void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const; void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const; + void set_none(); + public: - MyFileChooserButton (const Glib::ustring& title, Gtk::FileChooserAction action = Gtk::FILE_CHOOSER_ACTION_OPEN); + MyFileChooserButton(const Glib::ustring &title, Gtk::FileChooserAction action=Gtk::FILE_CHOOSER_ACTION_OPEN); + + sigc::signal &signal_selection_changed(); + sigc::signal &signal_file_set(); + + std::string get_filename() const; + bool set_filename(const std::string &filename); + + void add_filter(const Glib::RefPtr &filter); + void remove_filter(const Glib::RefPtr &filter); + void set_filter(const Glib::RefPtr &filter); + std::vector> list_filters(); + + bool set_current_folder(const std::string &filename); + std::string get_current_folder() const; + + bool add_shortcut_folder(const std::string &folder); + bool remove_shortcut_folder(const std::string &folder); + + void unselect_all(); + void unselect_filename(const std::string &filename); + + void set_show_hidden(bool yes); }; /** * @brief A helper method to connect the current folder property of a file chooser to an arbitrary variable. */ -void bindCurrentFolder (Gtk::FileChooser& chooser, Glib::ustring& variable); +template +void bindCurrentFolder (FileChooser& chooser, Glib::ustring& variable) +{ + chooser.signal_selection_changed ().connect ([&]() + { + const auto current_folder = chooser.get_current_folder (); + + if (!current_folder.empty ()) + variable = current_folder; + }); + + if (!variable.empty ()) + chooser.set_current_folder (variable); +} typedef enum RTUpdatePolicy { RTUP_STATIC, diff -Nru rawtherapee-5.3/rtgui/histogrampanel.cc rawtherapee-5.4/rtgui/histogrampanel.cc --- rawtherapee-5.3/rtgui/histogrampanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/histogrampanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -476,14 +476,14 @@ return; } -void HistogramRGBArea::updateBackBuffer (int r, int g, int b, Glib::ustring profile, Glib::ustring profileW) +void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { if (!get_realized () || frozen || !showMode) { return; } // Mostly not necessary, but should be in some case - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected Glib::RefPtr window = get_window(); int winx, winy, winw, winh; @@ -531,7 +531,7 @@ if(needLuma || needChroma) { float Lab_L, Lab_a, Lab_b; - rgb2lab( profile, profileW, r, g, b, Lab_L, Lab_a, Lab_b); + rtengine::Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, Lab_L, Lab_a, Lab_b, options.rtSettings.HistogramWorking); if (needLuma) { // Luma @@ -557,153 +557,6 @@ setDirty(false); } -void HistogramRGBArea::rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b) -{ - double xyz_rgb[3][3]; - const double ep = 216.0 / 24389.0; - const double ka = 24389.0 / 27.0; - - double var_R = r / 255.0; - double var_G = g / 255.0; - double var_B = b / 255.0; - - Glib::ustring profileCalc; - profileCalc = "sRGB"; //default - - if(options.rtSettings.HistogramWorking) { - profileCalc = profileW; //display working - } - - else {// if you want display = output space - if (profile == "RT_sRGB" || profile == "RT_sRGB_gBT709" || profile == "RT_sRGB_g10") { - profileCalc = "sRGB"; - } - - if (profile == "ProPhoto" || profile == "RT_Large_gBT709" || profile == "RT_Large_g10" || profile == "RT_Large_gsRGB") { - profileCalc = "ProPhoto"; - } - - if (profile == "AdobeRGB1998" || profile == "RT_Medium_gsRGB") { - profileCalc = "Adobe RGB"; - } - - if (profile == "WideGamutRGB") { - profileCalc = "WideGamut"; - } - } - - if(options.rtSettings.HistogramWorking) {//display working - if (profileW == "sRGB") { //apply sRGB inverse gamma - - if ( var_R > 0.04045 ) { - var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_R = var_R / 12.92; - } - - if ( var_G > 0.04045 ) { - var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_G = var_G / 12.92; - } - - if ( var_B > 0.04045 ) { - var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_B = var_B / 12.92; - } - } else if (profileW == "ProPhoto") { // apply inverse gamma 1.8 - var_R = pow ( var_R, 1.8); - var_G = pow ( var_G, 1.8); - var_B = pow ( var_B, 1.8); - } else { // apply inverse gamma 2.2 - var_R = pow ( var_R, 2.2); - var_G = pow ( var_G, 2.2); - var_B = pow ( var_B, 2.2); - } - } else { //display outout profile - - if (profile == "RT_sRGB" || profile == "RT_Large_gsRGB" || profile == "RT_Medium_gsRGB") { //apply sRGB inverse gamma - if ( var_R > 0.04045 ) { - var_R = pow ( ( ( var_R + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_R = var_R / 12.92; - } - - if ( var_G > 0.04045 ) { - var_G = pow ( ( ( var_G + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_G = var_G / 12.92; - } - - if ( var_B > 0.04045 ) { - var_B = pow ( ( ( var_B + 0.055 ) / 1.055 ), rtengine::Color::sRGBGammaCurve); - } else { - var_B = var_B / 12.92; - } - } - - else if (profile == "RT_sRGB_gBT709" || profile == "RT_Large_gBT709") { // - if ( var_R > 0.0795 ) { - var_R = pow ( ( ( var_R + 0.0954 ) / 1.0954 ), 2.2); - } else { - var_R = var_R / 4.5; - } - - if ( var_G > 0.0795 ) { - var_G = pow ( ( ( var_G + 0.0954 ) / 1.0954 ), 2.2); - } else { - var_G = var_G / 4.5; - } - - if ( var_B > 0.0795 ) { - var_B = pow ( ( ( var_B + 0.0954 ) / 1.0954 ), 2.2); - } else { - var_B = var_B / 4.5; - } - - } else if (profile == "ProPhoto") { // apply inverse gamma 1.8 - - var_R = pow ( var_R, 1.8); - var_G = pow ( var_G, 1.8); - var_B = pow ( var_B, 1.8); - } else if (profile == "RT_sRGB_g10" || profile == "RT_Large_g10") { // apply inverse gamma 1.8 - - var_R = pow ( var_R, 1.); - var_G = pow ( var_G, 1.); - var_B = pow ( var_B, 1.); - } - - else {// apply inverse gamma 2.2 - var_R = pow ( var_R, 2.2); - var_G = pow ( var_G, 2.2); - var_B = pow ( var_B, 2.2); - } - } - - // TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileW); - - TMatrix wprof = rtengine::ICCStore::getInstance()->workingSpaceMatrix (profileCalc); - - for (int m = 0; m < 3; m++) - for (int n = 0; n < 3; n++) { - xyz_rgb[m][n] = wprof[m][n]; - } - - double varxx, varyy, varzz; - double var_X = ( xyz_rgb[0][0] * var_R + xyz_rgb[0][1] * var_G + xyz_rgb[0][2] * var_B ) / Color::D50x; - double var_Y = ( xyz_rgb[1][0] * var_R + xyz_rgb[1][1] * var_G + xyz_rgb[1][2] * var_B ) ; - double var_Z = ( xyz_rgb[2][0] * var_R + xyz_rgb[2][1] * var_G + xyz_rgb[2][2] * var_B ) / Color::D50z; - - varxx = var_X > ep ? cbrt(var_X) : ( ka * var_X + 16.0) / 116.0 ; - varyy = var_Y > ep ? cbrt(var_Y) : ( ka * var_Y + 16.0) / 116.0 ; - varzz = var_Z > ep ? cbrt(var_Z) : ( ka * var_Z + 16.0) / 116.0 ; - LAB_l = ( 116 * varyy ) - 16; - LAB_a = 500 * ( varxx - varyy ); - LAB_b = 200 * ( varyy - varzz ); - -} - void HistogramRGBArea::update (int valh, int rh, int gh, int bh) { @@ -944,7 +797,7 @@ idle_register.add(func, haih); } -SSEFUNCTION void HistogramArea::updateBackBuffer () +void HistogramArea::updateBackBuffer () { if (!get_realized ()) { diff -Nru rawtherapee-5.3/rtgui/histogrampanel.h rawtherapee-5.4/rtgui/histogrampanel.h --- rawtherapee-5.3/rtgui/histogrampanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/histogrampanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -76,7 +76,7 @@ HistogramRGBArea(); ~HistogramRGBArea(); - void updateBackBuffer (int r, int g, int b, Glib::ustring profile = "", Glib::ustring profileW = ""); + void updateBackBuffer (int r, int g, int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = ""); void updateFreeze (bool f); bool getFreeze (); bool getShow (); @@ -92,7 +92,6 @@ bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); bool on_button_press_event (GdkEventButton* event); private: - void rgb2lab (Glib::ustring profile, Glib::ustring profileW, int r, int g, int b, float &LAB_l, float &LAB_a, float &LAB_b); Gtk::SizeRequestMode get_request_mode_vfunc () const; void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const; void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const; diff -Nru rawtherapee-5.3/rtgui/history.cc rawtherapee-5.4/rtgui/history.cc --- rawtherapee-5.3/rtgui/history.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/history.cc 2018-03-20 11:04:15.000000000 +0000 @@ -20,22 +20,16 @@ #include "multilangmgr.h" #include "rtimage.h" #include "guiutils.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; -Glib::ustring eventDescrArray[NUMOFEVENTS]; History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(nullptr), tpc (nullptr), bmnum (1) { blistenerLock = false; // sets default that the Before preview will not be locked - - // fill history event message array - for (int i = 0; i < NUMOFEVENTS; i++) { - eventDescrArray[i] = M(Glib::ustring::compose("HISTORY_MSG_%1", i + 1)); - } - // History List // ~~~~~~~~~~~~ Gtk::ScrolledWindow* hscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); @@ -238,7 +232,7 @@ } // construct formatted list content - Glib::ustring text = Glib::ustring::compose ("%1", eventDescrArray[ev]); + Glib::ustring text = M(ProcEventMapper::getInstance()->getHistoryMsg(ev)); Glib::RefPtr selection = hTreeView->get_selection(); Gtk::TreeModel::iterator iter = selection->get_selected(); @@ -263,7 +257,6 @@ // if there is no last item or its chev!=ev, create a new one if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) { Gtk::TreeModel::Row newrow = *(historyModel->append()); - newrow[historyColumns.realText] = eventDescrArray[ev]; newrow[historyColumns.text] = text; newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1); newrow[historyColumns.chev] = ev; @@ -282,7 +275,6 @@ } // else just update it else { - row[historyColumns.realText] = eventDescrArray[ev]; row[historyColumns.text] = text; row[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1); row[historyColumns.chev] = ev; @@ -428,9 +420,9 @@ if (path && !path.empty()) { Gtk::TreeModel::iterator iter = historyModel->get_iter(path); if (iter) { - Glib::ustring param, val; - iter->get_value(1, param); - iter->get_value(2, val); + Glib::ustring text, val; + iter->get_value(0, text); + iter->get_value(1, val); /* * @@ -449,7 +441,7 @@ tooltip->set_custom(*hbox); */ - tooltip->set_text(param+" : "+val); + tooltip->set_text(text + " : " + val); displayTooltip = true; } } diff -Nru rawtherapee-5.3/rtgui/history.h rawtherapee-5.4/rtgui/history.h --- rawtherapee-5.3/rtgui/history.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/history.h 2018-03-20 11:04:15.000000000 +0000 @@ -40,7 +40,6 @@ class HistoryColumns : public Gtk::TreeModel::ColumnRecord { public: - Gtk::TreeModelColumn realText; Gtk::TreeModelColumn text; Gtk::TreeModelColumn value; Gtk::TreeModelColumn params; @@ -49,7 +48,6 @@ HistoryColumns() { add(text); - add(realText); add(value); add(chev); add(params); diff -Nru rawtherapee-5.3/rtgui/hsvequalizer.cc rawtherapee-5.4/rtgui/hsvequalizer.cc --- rawtherapee-5.3/rtgui/hsvequalizer.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/hsvequalizer.cc 2018-03-20 11:04:15.000000000 +0000 @@ -25,7 +25,7 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL")) +HSVEqualizer::HSVEqualizer () : FoldableToolPanel(this, "hsvequalizer", M("TP_HSVEQUALIZER_LABEL"), false, true) { std::vector bottomMilestones; @@ -84,11 +84,13 @@ hshape->setUnChanged (!pedited->hsvequalizer.hcurve); sshape->setUnChanged (!pedited->hsvequalizer.scurve); vshape->setUnChanged (!pedited->hsvequalizer.vcurve); + set_inconsistent(multiImage && !pedited->hsvequalizer.enabled); } hshape->setCurve (pp->hsvequalizer.hcurve); sshape->setCurve (pp->hsvequalizer.scurve); vshape->setCurve (pp->hsvequalizer.vcurve); + setEnabled(pp->hsvequalizer.enabled); enableListener (); } @@ -116,7 +118,7 @@ void HSVEqualizer::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->hsvequalizer.enabled = getEnabled(); pp->hsvequalizer.hcurve = hshape->getCurve (); pp->hsvequalizer.scurve = sshape->getCurve (); pp->hsvequalizer.vcurve = vshape->getCurve (); @@ -126,6 +128,7 @@ pedited->hsvequalizer.hcurve = !hshape->isUnChanged (); pedited->hsvequalizer.scurve = !sshape->isUnChanged (); pedited->hsvequalizer.vcurve = !vshape->isUnChanged (); + pedited->hsvequalizer.enabled = !get_inconsistent(); } } @@ -138,7 +141,7 @@ void HSVEqualizer::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == hshape) { listener->panelChanged (EvHSVEqualizerH, M("HISTORY_CUSTOMCURVE")); } @@ -199,3 +202,17 @@ curveEditorG->setBatchMode (batchMode); } + + +void HSVEqualizer::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvHSVEqEnabled, M("GENERAL_DISABLED")); + } + } +} diff -Nru rawtherapee-5.3/rtgui/hsvequalizer.h rawtherapee-5.4/rtgui/hsvequalizer.h --- rawtherapee-5.3/rtgui/hsvequalizer.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/hsvequalizer.h 2018-03-20 11:04:15.000000000 +0000 @@ -54,6 +54,7 @@ virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); //void adjusterChanged (Adjuster* a, double newval); + void enabledChanged(); }; #endif diff -Nru rawtherapee-5.3/rtgui/icmpanel.cc rawtherapee-5.4/rtgui/icmpanel.cc --- rawtherapee-5.3/rtgui/icmpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/icmpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -958,7 +958,7 @@ } } -void ICMPanel::setRawMeta (bool raw, const rtengine::ImageData* pMeta) +void ICMPanel::setRawMeta (bool raw, const rtengine::FramesData* pMeta) { disableListener (); diff -Nru rawtherapee-5.3/rtgui/icmpanel.h rawtherapee-5.4/rtgui/icmpanel.h --- rawtherapee-5.3/rtgui/icmpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/icmpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -122,7 +122,7 @@ void applyBaselineExposureOffsetChanged(); void applyHueSatMapChanged(); - void setRawMeta (bool raw, const rtengine::ImageData* pMeta); + void setRawMeta (bool raw, const rtengine::FramesData* pMeta); void saveReferencePressed (); void setICMPanelListener (ICMPanelListener* ipl) diff -Nru rawtherapee-5.3/rtgui/imagearea.cc rawtherapee-5.4/rtgui/imagearea.cc --- rawtherapee-5.3/rtgui/imagearea.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/imagearea.cc 2018-03-20 11:04:15.000000000 +0000 @@ -25,7 +25,7 @@ #include "../rtengine/refreshmap.h" #include "options.h" -ImageArea::ImageArea (ImageAreaPanel* p) : parent(p), firstOpen(true), fullImageWidth(0), fullImageHeight(0) +ImageArea::ImageArea (ImageAreaPanel* p) : parent(p), fullImageWidth(0), fullImageHeight(0) { infotext = ""; @@ -426,7 +426,7 @@ } CropWindow* cw = new CropWindow (this, true, true); - cw->zoom11(); + cw->zoom11(false); cw->setCropGUIListener (cropgl); cw->setPointerMotionListener (pmlistener); cw->setPointerMotionHListener (pmhlistener); @@ -505,8 +505,9 @@ mainCropWindow->setObservedCropWin (cropWins.front()); - if(cropWins.size() == 1) { // after first detail window we already have high quality + if(!ipc->getHighQualComputed()) { ipc->startProcessing(M_HIGHQUAL); + ipc->setHighQualComputed(); } } @@ -633,25 +634,23 @@ zoomPanel->refreshZoomLabel (); } -void ImageArea::initialImageArrived (CropWindow* cw) +void ImageArea::initialImageArrived () { if (mainCropWindow) { - if(firstOpen || options.prevdemo != PD_Sidecar || (!options.rememberZoomAndPan) ) { - mainCropWindow->zoomFit (); - firstOpen = false; - mainCropWindow->cropHandler.getFullImageSize(fullImageWidth, fullImageHeight); - } else { - int w, h; - mainCropWindow->cropHandler.getFullImageSize(w, h); - - if(w != fullImageWidth || h != fullImageHeight) { - mainCropWindow->zoomFit (); + int w, h; + mainCropWindow->cropHandler.getFullImageSize(w, h); + if(options.prevdemo != PD_Sidecar || !options.rememberZoomAndPan || w != fullImageWidth || h != fullImageHeight) { + if (options.cropAutoFit || options.bgcolor != 0) { + mainCropWindow->zoomFitCrop(); + } else { + mainCropWindow->zoomFit(); } - - fullImageWidth = w; - fullImageHeight = h; + } else if ((options.cropAutoFit || options.bgcolor != 0) && mainCropWindow->cropHandler.cropParams.enabled) { + mainCropWindow->zoomFitCrop(); } + fullImageWidth = w; + fullImageHeight = h; } } diff -Nru rawtherapee-5.3/rtgui/imagearea.h rawtherapee-5.4/rtgui/imagearea.h --- rawtherapee-5.3/rtgui/imagearea.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/imagearea.h 2018-03-20 11:04:15.000000000 +0000 @@ -65,7 +65,6 @@ void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const; - bool firstOpen; int fullImageWidth, fullImageHeight; public: CropWindow* mainCropWindow; @@ -148,7 +147,7 @@ void cropPositionChanged (CropWindow* cw); void cropWindowSizeChanged (CropWindow* cw); void cropZoomChanged (CropWindow* cw); - void initialImageArrived (CropWindow* cw) ; + void initialImageArrived (); // LockablePickerToolListener interface void switchPickerVisibility (bool isVisible); diff -Nru rawtherapee-5.3/rtgui/inspector.cc rawtherapee-5.4/rtgui/inspector.cc --- rawtherapee-5.3/rtgui/inspector.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/inspector.cc 2018-03-20 11:04:15.000000000 +0000 @@ -59,7 +59,7 @@ //int InspectorBuffer::infoFromImage (const Glib::ustring& fname) //{ // -// rtengine::ImageMetaData* idata = rtengine::ImageMetaData::fromFile (fname, nullptr); +// rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, nullptr, true); // // if (!idata) { // return 0; diff -Nru rawtherapee-5.3/rtgui/iptcpanel.cc rawtherapee-5.4/rtgui/iptcpanel.cc --- rawtherapee-5.3/rtgui/iptcpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/iptcpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -434,7 +434,7 @@ defChangeList = defParams->iptc; } -void IPTCPanel::setImageData (const ImageMetaData* id) +void IPTCPanel::setImageData (const FramesMetaData* id) { if (id) { diff -Nru rawtherapee-5.3/rtgui/iptcpanel.h rawtherapee-5.4/rtgui/iptcpanel.h --- rawtherapee-5.3/rtgui/iptcpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/iptcpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -75,7 +75,7 @@ void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void setImageData (const rtengine::ImageMetaData* id); + void setImageData (const rtengine::FramesMetaData* id); void notifyListener (); diff -Nru rawtherapee-5.3/rtgui/labcurve.cc rawtherapee-5.4/rtgui/labcurve.cc --- rawtherapee-5.3/rtgui/labcurve.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/labcurve.cc 2018-03-20 11:04:15.000000000 +0000 @@ -24,7 +24,7 @@ using namespace rtengine; using namespace rtengine::procparams; -LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL")) +LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), false, true) { std::vector milestones; @@ -143,7 +143,7 @@ ); ccshape->setBottomBarColorProvider(this, 2); - ccshape->setLeftBarColorProvider(this, 2); + ccshape->setLeftBarColorProvider(this, 7); ccshape->setRangeDefaultMilestones(0.05, 0.2, 0.58); lcshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_LC"))); @@ -162,7 +162,7 @@ clshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP")); clshape->setEditID(EUID_Lab_CLCurve, BT_SINGLEPLANE_FLOAT); - clshape->setLeftBarColorProvider(this, 2); + clshape->setLeftBarColorProvider(this, 7); clshape->setRangeDefaultMilestones(0.25, 0.5, 0.75); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); @@ -244,6 +244,8 @@ hhshape->setUnChanged (!pedited->labCurve.hhcurve); lcshape->setUnChanged (!pedited->labCurve.lccurve); clshape->setUnChanged (!pedited->labCurve.clcurve); + + set_inconsistent(multiImage && !pedited->labCurve.enabled); } brightness->setValue (pp->labCurve.brightness); @@ -277,6 +279,8 @@ lcshape->setCurve (pp->labCurve.lccurve); clshape->setCurve (pp->labCurve.clcurve); + setEnabled(pp->labCurve.enabled); + queue_draw(); enableListener (); @@ -338,7 +342,8 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->labCurve.enabled = getEnabled(); + pp->labCurve.brightness = brightness->getValue (); pp->labCurve.contrast = (int)contrast->getValue (); pp->labCurve.chromaticity = (int)chromaticity->getValue (); @@ -380,7 +385,7 @@ pedited->labCurve.lccurve = !lcshape->isUnChanged (); pedited->labCurve.clcurve = !clshape->isUnChanged (); - + pedited->labCurve.enabled = !get_inconsistent(); } } @@ -424,7 +429,7 @@ lastACVal = avoidcolorshift->get_active (); } - if (listener) { + if (listener && getEnabled()) { if (avoidcolorshift->get_active ()) { listener->panelChanged (EvLAvoidColorShift, M("GENERAL_ENABLED")); } else { @@ -451,7 +456,7 @@ lcshape->refresh(); } - if (listener) { + if (listener && getEnabled()) { if (lcredsk->get_active ()) { listener->panelChanged (EvLLCredsk, M("GENERAL_ENABLED")); } else { @@ -471,7 +476,7 @@ void LCurve::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == lshape) { listener->panelChanged (EvLLCurve, M("HISTORY_CUSTOMCURVE")); } @@ -526,15 +531,15 @@ } if (a == brightness) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLBrightness, costr); } } else if (a == contrast) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLContrast, costr); } } else if (a == rstprotection) { - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLRSTProtection, costr); } } else if (a == chromaticity) { @@ -550,7 +555,7 @@ lcredsk->set_sensitive( int(newval) > -100 ); } - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvLSaturation, costr); } } @@ -566,62 +571,52 @@ } if (callerId == 1) { // ch - main curve - Color::hsv2rgb01(float(valX), float(valY), 0.5f, R, G, B); } else if (callerId == 2) { // cc - bottom bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } else if (callerId == 6) { // cc - left bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; - float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; - - if (hue > 1.0f) { - hue -= 1.0f; - } - - // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(hue, float(valX), value, R, G, B); - - // whole hue range + float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; + if (hue > 1.0f) { + hue -= 1.0f; + } // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - // Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else if (callerId == 3) { // lc - bottom bar - float value = (1.f - 0.7f) * float(valX) + 0.7f; - if (lcredsk->get_active()) { // skin range // -0.1 rad < Hue < 1.6 rad // Y axis / from 0.92 up to 0.14056 float hue = (1.14056f - 0.92f) * float(valY) + 0.92f; - if (hue > 1.0f) { hue -= 1.0f; } - // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) Color::hsv2rgb01(hue, float(valX), value, R, G, B); } else { // whole hue range // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) - Color::hsv2rgb01(float(valY), float(valX), value, R, G, B); + Color::hsv2rgb01(float(valY*0.8), float(valX), value, R, G, B); } } else if (callerId == 4) { // LH - bottom bar Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B); } else if (callerId == 5) { // HH - bottom bar float h = float((valY - 0.5) * 0.3 + valX); - if (h > 1.0f) { h -= 1.0f; } else if (h < 0.0f) { h += 1.0f; } - Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B); + } else if (callerId == 7) { // cc and cl - left bar + float value = (1.f - 0.7f) * float(valX) + 0.7f; + // whole hue range + // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before) + Color::hsv2rgb01(float(valY*0.8), 1.f - float(valX), value, R, G, B); } caller->ccRed = double(R); @@ -668,3 +663,16 @@ contrast->trimValue(pp->labCurve.contrast); chromaticity->trimValue(pp->labCurve.chromaticity); } + +void LCurve::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvLEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvLEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvLEnabled, M("GENERAL_DISABLED")); + } + } +} diff -Nru rawtherapee-5.3/rtgui/labcurve.h rawtherapee-5.4/rtgui/labcurve.h --- rawtherapee-5.3/rtgui/labcurve.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/labcurve.h 2018-03-20 11:04:15.000000000 +0000 @@ -82,10 +82,7 @@ virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); -private: - - - + void enabledChanged(); }; #endif diff -Nru rawtherapee-5.3/rtgui/labgrid.cc rawtherapee-5.4/rtgui/labgrid.cc --- rawtherapee-5.3/rtgui/labgrid.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/labgrid.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,328 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ + +#include "labgrid.h" + +using rtengine::Color; + + +bool LabGrid::notifyListener() +{ + if (listener) { + listener->panelChanged(evt, Glib::ustring::compose(M("TP_COLORTONING_LABGRID_VALUES"), int(low_a), int(low_b), int(high_a), int(high_b))); + } + return false; +} + + +LabGrid::LabGrid(rtengine::ProcEvent evt): + Gtk::DrawingArea(), + evt(evt), litPoint(NONE), + low_a(0.f), high_a(0.f), low_b(0.f), high_b(0.f), + defaultLow_a(0.f), defaultHigh_a(0.f), defaultLow_b(0.f), defaultHigh_b(0.f), + listener(nullptr), + edited(false), + isDragged(false) +{ + set_can_focus(true); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK); +} + +void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const +{ + la = low_a; + ha = high_a; + lb = low_b; + hb = high_b; +} + + +void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) +{ + low_a = la; + low_b = lb; + high_a = ha; + high_b = hb; + queue_draw(); + if (notify) { + notifyListener(); + } +} + +void LabGrid::setDefault (double la, double lb, double ha, double hb) +{ + defaultLow_a = la; + defaultLow_b = lb; + defaultHigh_a = ha; + defaultHigh_b = hb; +} + + +void LabGrid::reset(bool toInitial) +{ + if (toInitial) { + setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, true); + } else { + setParams(0., 0., 0., 0., true); + } +} + + +void LabGrid::setEdited(bool yes) +{ + edited = yes; +} + + +bool LabGrid::getEdited() const +{ + return edited; +} + + +void LabGrid::setListener(ToolPanelListener *l) +{ + listener = l; +} + + +void LabGrid::on_style_updated () +{ + setDirty(true); + queue_draw (); +} + + +bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) +{ + Gtk::Allocation allocation = get_allocation(); + allocation.set_x(0); + allocation.set_y(0); + + // setDrawRectangle will allocate the backbuffer Surface + if (setDrawRectangle(Cairo::FORMAT_ARGB32, allocation)) { + setDirty(true); + } + + if (!isDirty() || !surfaceCreated()) { + return true; + } + + Glib::RefPtr style = get_style_context(); + Cairo::RefPtr cr = getContext(); + + if (isDirty()) { + int width = allocation.get_width(); + int height = allocation.get_height(); + + cr->set_line_cap(Cairo::LINE_CAP_SQUARE); + + // clear background + cr->set_source_rgba (0., 0., 0., 0.); + cr->set_operator (Cairo::OPERATOR_CLEAR); + cr->paint (); + cr->set_operator (Cairo::OPERATOR_OVER); + style->render_background(cr, 0, 0, width, height); + + // drawing the cells + cr->translate(inset, inset); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + width -= 2 * inset; + height -= 2 * inset; + // flip y: + cr->translate(0, height); + cr->scale(1., -1.); + const int cells = 8; + float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + for (int j = 0; j < cells; j++) { + for (int i = 0; i < cells; i++) { + float R, G, B; + float x, y, z; + int ii = i - cells/2; + int jj = j - cells/2; + float a = step * (ii + 0.5); + float b = step * (jj + 0.5); + Color::Lab2XYZ(25000.f, a, b, x, y, z); + Color::xyz2srgb(x, y, z, R, G, B); + cr->set_source_rgb(R / 65535.f, G / 65535.f, B / 65535.f); + cr->rectangle(width * i / float(cells), height * j / float(cells), width / float(cells) - 1, height / float(cells) - 1); + cr->fill(); + } + } + + // drawing the connection line + cr->set_antialias(Cairo::ANTIALIAS_DEFAULT); + float loa, hia, lob, hib; + loa = .5f * (width + width * low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hia = .5f * (width + width * high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX); + lob = .5f * (height + height * low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); + hib = .5f * (height + height * high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX); + cr->set_line_width(2.); + cr->set_source_rgb(0.6, 0.6, 0.6); + cr->move_to(loa, lob); + cr->line_to(hia, hib); + cr->stroke(); + + // drawing points + cr->set_source_rgb(0.1, 0.1, 0.1); + if (litPoint == LOW) { + cr->arc(loa, lob, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(loa, lob, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + + cr->set_source_rgb(0.9, 0.9, 0.9); + if (litPoint == HIGH) { + cr->arc(hia, hib, 5, 0, 2. * rtengine::RT_PI); + } else { + cr->arc(hia, hib, 3, 0, 2. * rtengine::RT_PI); + } + cr->fill(); + } + + copySurface(crf); + return false; +} + + +bool LabGrid::on_button_press_event(GdkEventButton *event) +{ + if (event->button == 1) { + if (event->type == GDK_2BUTTON_PRESS) { + switch (litPoint) { + case NONE: + low_a = low_b = high_a = high_b = 0.f; + break; + case LOW: + low_a = low_b = 0.f; + break; + case HIGH: + high_a = high_b = 0.f; + break; + } + edited = true; + notifyListener(); + queue_draw(); + } else if (event->type == GDK_BUTTON_PRESS && litPoint != NONE) { + isDragged = true; + } + return false; + } + return true; +} + + +bool LabGrid::on_button_release_event(GdkEventButton *event) +{ + if (event->button == 1) { + isDragged = false; + return false; + } + return true; +} + + +bool LabGrid::on_motion_notify_event(GdkEventMotion *event) +{ + if (isDragged && delayconn.connected()) { + delayconn.disconnect(); + } + + State oldLitPoint = litPoint; + + int width = get_allocated_width() - 2 * inset, height = get_allocated_height() - 2 * inset; + const float mouse_x = std::min(std::max(event->x - inset, 0.), double(width)); + const float mouse_y = std::min(std::max(height - 1 - event->y + inset, 0.), double(height)); + const float ma = (2.0 * mouse_x - width) / (float)width; + const float mb = (2.0 * mouse_y - height) / (float)height; + if (isDragged) { + if (litPoint == LOW) { + low_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + low_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } else if (litPoint == HIGH) { + high_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + } + edited = true; + grab_focus(); + if (options.adjusterMinDelay == 0) { + notifyListener(); + } else { + delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notifyListener), options.adjusterMinDelay); + } + queue_draw(); + } else { + litPoint = NONE; + float la = low_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float lb = low_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float ha = high_a / rtengine::ColorToningParams::LABGRID_CORR_MAX; + float hb = high_b / rtengine::ColorToningParams::LABGRID_CORR_MAX; + const float thrs = 0.05f; + const float distlo = (la - ma) * (la - ma) + (lb - mb) * (lb - mb); + const float disthi = (ha - ma) * (ha - ma) + (hb - mb) * (hb - mb); + if (distlo < thrs * thrs && distlo < disthi) { + litPoint = LOW; + } else if (disthi < thrs * thrs && disthi <= distlo) { + litPoint = HIGH; + } + if ((oldLitPoint == NONE && litPoint != NONE) || (oldLitPoint != NONE && litPoint == NONE)) { + queue_draw(); + } + } + return true; +} + + +Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const +{ + return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; +} + + +void LabGrid::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const +{ + minimum_width = 50; + natural_width = 150; // same as GRAPH_SIZE from mycurve.h +} + + +void LabGrid::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const +{ + minimum_height = natural_height = width; +} diff -Nru rawtherapee-5.3/rtgui/labgrid.h rawtherapee-5.4/rtgui/labgrid.h --- rawtherapee-5.3/rtgui/labgrid.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/labgrid.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,90 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ + +// adapted from the "color correction" module of Darktable. Original copyright follows +/* + copyright (c) 2009--2010 johannes hanika. + + darktable 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. + + darktable 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 darktable. If not, see . +*/ + +#pragma once + +#include +#include "eventmapper.h" +#include "toolpanel.h" + + +class LabGrid: public Gtk::DrawingArea, public BackBuffer { +private: + rtengine::ProcEvent evt; + enum State { NONE, HIGH, LOW }; + State litPoint; + float low_a; + float high_a; + float low_b; + float high_b; + + float defaultLow_a; + float defaultHigh_a; + float defaultLow_b; + float defaultHigh_b; + + ToolPanelListener *listener; + bool edited; + bool isDragged; + sigc::connection delayconn; + static const int inset = 2; + + bool notifyListener(); + void getLitPoint(); + +public: + LabGrid(rtengine::ProcEvent evt); + + void getParams(double &la, double &lb, double &ha, double &hb) const; + void setParams(double la, double lb, double ha, double hb, bool notify); + void setDefault (double la, double lb, double ha, double hb); + void setEdited(bool yes); + bool getEdited() const; + void reset(bool toInitial); + void setListener(ToolPanelListener *l); + + bool on_draw(const ::Cairo::RefPtr &crf); + void on_style_updated (); + bool on_button_press_event(GdkEventButton *event); + bool on_button_release_event(GdkEventButton *event); + bool on_motion_notify_event(GdkEventMotion *event); + Gtk::SizeRequestMode get_request_mode_vfunc() const; + void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; +}; + diff -Nru rawtherapee-5.3/rtgui/lensprofile.cc rawtherapee-5.4/rtgui/lensprofile.cc --- rawtherapee-5.3/rtgui/lensprofile.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/lensprofile.cc 2018-03-20 11:04:15.000000000 +0000 @@ -132,7 +132,7 @@ ckbUseCA = Gtk::manage (new Gtk::CheckButton (M("TP_LENSPROFILE_USECA"))); pack_start (*ckbUseCA, Gtk::PACK_SHRINK, 4); - conLCPFile = fcbLCPFile->signal_file_set().connect( sigc::mem_fun(*this, &LensProfilePanel::onLCPFileChanged), true); + conLCPFile = fcbLCPFile->signal_file_set().connect( sigc::mem_fun(*this, &LensProfilePanel::onLCPFileChanged)); //, true); conUseDist = ckbUseDist->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseDistChanged) ); ckbUseVign->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseVignChanged) ); ckbUseCA->signal_toggled().connect( sigc::mem_fun(*this, &LensProfilePanel::onUseCAChanged) ); @@ -177,7 +177,7 @@ if (pp->lensProf.lcpFile.empty()) { Glib::ustring lastFolder = fcbLCPFile->get_current_folder(); fcbLCPFile->set_current_folder(lastFolder); - fcbLCPFile->set_filename(lastFolder + "/."); + fcbLCPFile->unselect_all(); bindCurrentFolder(*fcbLCPFile, options.lastLensProfileDir); updateDisabled(false); } else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { @@ -190,10 +190,6 @@ updateDisabled(false); } - ckbUseDist->set_active (pp->lensProf.useDist); - ckbUseVign->set_active (pp->lensProf.useVign && isRaw); - ckbUseCA->set_active (pp->lensProf.useCA && isRaw); - const LFDatabase *db = LFDatabase::getInstance(); LFCamera c; @@ -226,6 +222,10 @@ updateLensfunWarning(); + ckbUseDist->set_active (pp->lensProf.useDist); + ckbUseVign->set_active (pp->lensProf.useVign && isRaw); + ckbUseCA->set_active(pp->lensProf.useCA && isRaw && ckbUseCA->get_sensitive()); + enableListener (); conUseDist.block(false); } @@ -254,15 +254,25 @@ } ckbUseVign->set_sensitive(l.hasVignettingCorrection()); ckbUseDist->set_sensitive(l.hasDistortionCorrection()); + ckbUseCA->set_sensitive(l.hasCACorrection()); + if (!isRaw || !l.hasVignettingCorrection()) { + ckbUseVign->set_active(false); + } + if (!l.hasDistortionCorrection()) { + ckbUseDist->set_active(false); + } + if (!l.hasCACorrection()) { + ckbUseCA->set_active(false); + } } } -void LensProfilePanel::setRawMeta(bool raw, const rtengine::ImageMetaData* pMeta) +void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMeta) { if (!raw || pMeta->getFocusDist() <= 0) { disableListener(); - // CA is very focus layer dependend, otherwise it might even worsen things + // CA is very focus layer dependent, otherwise it might even worsen things allowFocusDep = false; ckbUseCA->set_active(false); ckbUseCA->set_sensitive(false); @@ -420,7 +430,8 @@ if (it && (*it)[lf->lensfunModelLens.lens] == lens) { return true; } - + + bool first_maker_found = false; for (auto row : lf->lensfunLensModel->children()) { if (lens.find(row[lf->lensfunModelLens.lens]) == 0) { auto &c = row.children(); @@ -431,6 +442,11 @@ return true; } } + // we do not break immediately here, because there might be multiple makers + // sharing the same prefix (e.g. "Leica" and "Leica Camera AG"). + // therefore, we break below when the lens doesn't match any of them + first_maker_found = true; + } else if (first_maker_found) { break; } } @@ -583,12 +599,26 @@ LensProfilePanel::LFDbHelper::LFDbHelper() { +#ifdef _OPENMP +#pragma omp parallel sections +#endif +{ +#ifdef _OPENMP +#pragma omp section +#endif +{ lensfunCameraModel = Gtk::TreeStore::create(lensfunModelCam); - lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); - fillLensfunCameras(); +} +#ifdef _OPENMP +#pragma omp section +#endif +{ + lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); fillLensfunLenses(); } +} +} void LensProfilePanel::LFDbHelper::fillLensfunCameras() { diff -Nru rawtherapee-5.3/rtgui/lensprofile.h rawtherapee-5.4/rtgui/lensprofile.h --- rawtherapee-5.3/rtgui/lensprofile.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/lensprofile.h 2018-03-20 11:04:15.000000000 +0000 @@ -38,7 +38,7 @@ void updateDisabled(bool enable); bool allowFocusDep; bool isRaw; - const rtengine::ImageMetaData* metadata; + const rtengine::FramesMetaData* metadata; Gtk::RadioButton::Group corrGroup; Gtk::RadioButton *corrOff; @@ -94,7 +94,7 @@ void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setRawMeta (bool raw, const rtengine::ImageMetaData* pMeta); + void setRawMeta (bool raw, const rtengine::FramesMetaData* pMeta); void onLCPFileChanged (); void onUseDistChanged(); diff -Nru rawtherapee-5.3/rtgui/localcontrast.cc rawtherapee-5.4/rtgui/localcontrast.cc --- rawtherapee-5.3/rtgui/localcontrast.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/localcontrast.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,167 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include "localcontrast.h" +#include "eventmapper.h" +#include +#include + +using namespace rtengine; +using namespace rtengine::procparams; + +LocalContrast::LocalContrast(): FoldableToolPanel(this, "localcontrast", M("TP_LOCALCONTRAST_LABEL"), false, true) +{ + auto m = ProcEventMapper::getInstance(); + EvLocalContrastEnabled = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_ENABLED"); + EvLocalContrastRadius = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_RADIUS"); + EvLocalContrastAmount = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_AMOUNT"); + EvLocalContrastDarkness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_DARKNESS"); + EvLocalContrastLightness = m->newEvent(RGBCURVE, "HISTORY_MSG_LOCALCONTRAST_LIGHTNESS"); + + radius = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_RADIUS"), 20., 200., 1., 80.)); + amount = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_AMOUNT"), 0., 1., 0.01, 0.2)); + darkness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_DARKNESS"), 0., 3., 0.01, 1.)); + lightness = Gtk::manage(new Adjuster(M("TP_LOCALCONTRAST_LIGHTNESS"), 0., 3., 0.01, 1.)); + + radius->setAdjusterListener(this); + amount->setAdjusterListener(this); + darkness->setAdjusterListener(this); + lightness->setAdjusterListener(this); + + radius->show(); + amount->show(); + darkness->show(); + lightness->show(); + + pack_start(*radius); + pack_start(*amount); + pack_start(*darkness); + pack_start(*lightness); +} + + +void LocalContrast::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + radius->setEditedState(pedited->localContrast.radius ? Edited : UnEdited); + amount->setEditedState(pedited->localContrast.amount ? Edited : UnEdited); + darkness->setEditedState(pedited->localContrast.darkness ? Edited : UnEdited); + lightness->setEditedState(pedited->localContrast.lightness ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->localContrast.enabled); + } + + setEnabled(pp->localContrast.enabled); + radius->setValue(pp->localContrast.radius); + amount->setValue(pp->localContrast.amount); + darkness->setValue(pp->localContrast.darkness); + lightness->setValue(pp->localContrast.lightness); + + enableListener(); +} + + +void LocalContrast::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->localContrast.radius = radius->getValue(); + pp->localContrast.amount = amount->getValue(); + pp->localContrast.darkness = darkness->getValue(); + pp->localContrast.lightness = lightness->getValue(); + pp->localContrast.enabled = getEnabled(); + + if (pedited) { + pedited->localContrast.radius = radius->getEditedState(); + pedited->localContrast.amount = amount->getEditedState(); + pedited->localContrast.darkness = darkness->getEditedState(); + pedited->localContrast.lightness = lightness->getEditedState(); + pedited->localContrast.enabled = !get_inconsistent(); + } +} + +void LocalContrast::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + radius->setDefault(defParams->localContrast.radius); + amount->setDefault(defParams->localContrast.amount); + darkness->setDefault(defParams->localContrast.darkness); + lightness->setDefault(defParams->localContrast.lightness); + + if (pedited) { + radius->setDefaultEditedState(pedited->localContrast.radius ? Edited : UnEdited); + amount->setDefaultEditedState(pedited->localContrast.amount ? Edited : UnEdited); + darkness->setDefaultEditedState(pedited->localContrast.darkness ? Edited : UnEdited); + lightness->setDefaultEditedState(pedited->localContrast.lightness ? Edited : UnEdited); + } else { + radius->setDefaultEditedState(Irrelevant); + amount->setDefaultEditedState(Irrelevant); + darkness->setDefaultEditedState(Irrelevant); + lightness->setDefaultEditedState(Irrelevant); + } +} + + +void LocalContrast::adjusterChanged(Adjuster* a, double newval) +{ + if (listener && getEnabled()) { + if (a == radius) { + listener->panelChanged(EvLocalContrastRadius, a->getTextValue()); + } else if (a == amount) { + listener->panelChanged(EvLocalContrastAmount, a->getTextValue()); + } else if (a == darkness) { + listener->panelChanged(EvLocalContrastDarkness, a->getTextValue()); + } else if (a == lightness) { + listener->panelChanged(EvLocalContrastLightness, a->getTextValue()); + } + } +} + + +void LocalContrast::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvLocalContrastEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void LocalContrast::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + radius->showEditedCB(); + amount->showEditedCB(); + darkness->showEditedCB(); + lightness->showEditedCB(); +} + + +void LocalContrast::setAdjusterBehavior(bool radiusAdd, bool amountAdd, bool darknessAdd, bool lightnessAdd) +{ + radius->setAddMode(radiusAdd); + amount->setAddMode(amountAdd); + darkness->setAddMode(darknessAdd); + lightness->setAddMode(lightnessAdd); +} + diff -Nru rawtherapee-5.3/rtgui/localcontrast.h rawtherapee-5.4/rtgui/localcontrast.h --- rawtherapee-5.3/rtgui/localcontrast.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/localcontrast.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,53 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class LocalContrast: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +private: + Adjuster *radius; + Adjuster *amount; + Adjuster *darkness; + Adjuster *lightness; + + rtengine::ProcEvent EvLocalContrastEnabled; + rtengine::ProcEvent EvLocalContrastRadius; + rtengine::ProcEvent EvLocalContrastAmount; + rtengine::ProcEvent EvLocalContrastDarkness; + rtengine::ProcEvent EvLocalContrastLightness; + +public: + + LocalContrast(); + + void read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr); + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr); + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr); + void setBatchMode(bool batchMode); + + void adjusterChanged(Adjuster *a, double newval); + void enabledChanged(); + void setAdjusterBehavior(bool radiusAdd, bool amountAdd, bool darknessAdd, bool lightnessAdd); +}; + diff -Nru rawtherapee-5.3/rtgui/lockablecolorpicker.cc rawtherapee-5.4/rtgui/lockablecolorpicker.cc --- rawtherapee-5.3/rtgui/lockablecolorpicker.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/lockablecolorpicker.cc 2018-03-20 11:04:15.000000000 +0000 @@ -277,8 +277,8 @@ gpreview = previewG; bpreview = previewB; - rtengine::Color::rgb2hsv(r*65535.f, g*65535.f, b*65535.f, hue, sat, val); - rtengine::Color::rgb2lab (*outputProfile, *workingProfile, r * 65535.f, g * 65535.f, b * 65535.f, L, a, bb, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? + rtengine::Color::rgb2hsv01(r, g, b, hue, sat, val); + rtengine::Color::rgb2lab01(*outputProfile, *workingProfile, r, g, b, L, a, bb, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? if (validity != Validity::OUTSIDE) { setDirty(true); diff -Nru rawtherapee-5.3/rtgui/lwbutton.cc rawtherapee-5.4/rtgui/lwbutton.cc --- rawtherapee-5.3/rtgui/lwbutton.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/lwbutton.cc 2018-03-20 11:04:15.000000000 +0000 @@ -178,7 +178,7 @@ void LWButton::redraw (Cairo::RefPtr context) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected context->set_line_width (1.0); context->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); context->rectangle (xpos + 0.5, ypos + 0.5, w - 1.0, h - 1.0); diff -Nru rawtherapee-5.3/rtgui/main.cc rawtherapee-5.4/rtgui/main.cc --- rawtherapee-5.3/rtgui/main.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/main.cc 2018-03-20 11:04:15.000000000 +0000 @@ -218,13 +218,6 @@ bool init_rt() { - try { - Options::load(); - } catch (Options::Error &e) { - std::cout << "ERROR: " << e.get_msg() << std::endl; - return false; - } - extProgStore->init(); SoundManager::init(); @@ -257,7 +250,7 @@ Glib::RefPtr defaultIconTheme = Gtk::IconTheme::get_default(); defaultIconTheme->append_search_path (icon_path); - rtengine::setPaths (options); + rtengine::setPaths(); MyExpander::init(); // has to stay AFTER rtengine::setPaths // ------- loading theme files @@ -354,17 +347,6 @@ //gdk_threads_enter (); RTWindow *rtWindow = new RTWindow(); - // alerting users if the default raw and image profiles are missing - if (options.is_defProfRawMissing()) { - Gtk::MessageDialog msgd (Glib::ustring::compose (M ("OPTIONS_DEFRAW_MISSING"), options.defProfRaw), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.run (); - } - - if (options.is_defProfImgMissing()) { - Gtk::MessageDialog msgd (Glib::ustring::compose (M ("OPTIONS_DEFIMG_MISSING"), options.defProfImg), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.run (); - } - return rtWindow; } @@ -487,9 +469,6 @@ argv2 = ""; Glib::init(); // called by Gtk::Main, but this may be important for thread handling, so we call it ourselves now - gdk_threads_set_lock_functions (G_CALLBACK (myGdkLockEnter), (G_CALLBACK (myGdkLockLeave))); - gdk_threads_init(); - gtk_init (&argc, &argv); // use the "--g-fatal-warnings" command line flag to make warnings fatal Gio::init (); @@ -530,7 +509,7 @@ } options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; - + #else argv0 = DATA_SEARCH_PATH; creditsPath = CREDITS_SEARCH_PATH; @@ -649,7 +628,19 @@ int ret = 0; - if (remote) { + Glib::ustring fatalError; + + try { + Options::load(); + } catch (Options::Error &e) { + fatalError = e.get_msg(); + } + + gdk_threads_set_lock_functions (G_CALLBACK (myGdkLockEnter), (G_CALLBACK (myGdkLockLeave))); + gdk_threads_init(); + gtk_init (&argc, &argv); // use the "--g-fatal-warnings" command line flag to make warnings fatal + + if (fatalError.empty() && remote) { char *app_argv[2] = { const_cast (argv0.c_str()) }; int app_argc = 1; @@ -661,7 +652,7 @@ RTApplication app; ret = app.run (app_argc, app_argv); } else { - if (init_rt()) { + if (fatalError.empty() && init_rt()) { Gtk::Main m (&argc, &argv); gdk_threads_enter(); const std::unique_ptr rtWindow (create_rt_window()); @@ -687,7 +678,7 @@ cleanup_rt(); } else { Gtk::Main m (&argc, &argv); - Gtk::MessageDialog msgd ("Fatal error!\nThe RT_SETTINGS and/or RT_PATH environment variables are set, but use a relative path. The path must be absolute!", true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + Gtk::MessageDialog msgd (Glib::ustring::compose("FATAL ERROR!\n\n%1", fatalError), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); ret = -2; } diff -Nru rawtherapee-5.3/rtgui/main-cli.cc rawtherapee-5.4/rtgui/main-cli.cc --- rawtherapee-5.3/rtgui/main-cli.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/main-cli.cc 2018-03-20 11:04:15.000000000 +0000 @@ -158,12 +158,44 @@ try { Options::load (quickstart); - } catch (Options::Error &) { - printf ("Fatal error!\nThe RT_SETTINGS and/or RT_PATH environment variables are set, but use a relative path. The path must be absolute!\n"); + } catch (Options::Error &e) { + std::cerr << std::endl + << "FATAL ERROR:" << std::endl + << e.get_msg() << std::endl; return -2; } - rtengine::setPaths (options); + if (options.is_defProfRawMissing()) { + options.defProfRaw = DEFPROFILE_RAW; + std::cerr << std::endl + << "The default profile for raw photos could not be found or is not set." << std::endl + << "Please check your profiles' directory, it may be missing or damaged." << std::endl + << "\"" << DEFPROFILE_RAW << "\" will be used instead." << std::endl << std::endl; + } + if (options.is_bundledDefProfRawMissing()) { + std::cerr << std::endl + << "The bundled profile \"" << options.defProfRaw << "\" could not be found!" << std::endl + << "Your installation could be damaged." << std::endl + << "Default internal values will be used instead." << std::endl << std::endl; + options.defProfRaw = DEFPROFILE_INTERNAL; + } + + if (options.is_defProfImgMissing()) { + options.defProfImg = DEFPROFILE_IMG; + std::cerr << std::endl + << "The default profile for non-raw photos could not be found or is not set." << std::endl + << "Please check your profiles' directory, it may be missing or damaged." << std::endl + << "\"" << DEFPROFILE_IMG << "\" will be used instead." << std::endl << std::endl; + } + if (options.is_bundledDefProfImgMissing()) { + std::cerr << std::endl + << "The bundled profile " << options.defProfImg << " could not be found!" << std::endl + << "Your installation could be damaged." << std::endl + << "Default internal values will be used instead." << std::endl << std::endl; + options.defProfImg = DEFPROFILE_INTERNAL; + } + + rtengine::setPaths(); TIFFSetWarningHandler (nullptr); // avoid annoying message boxes @@ -611,7 +643,7 @@ std::cout << " -t[z] Specify output to be TIFF." << std::endl; std::cout << " Uncompressed by default, or deflate compression with 'z'." << std::endl; std::cout << " -n Specify output to be compressed PNG." << std::endl; - std::cout << " Compression is hard-coded to 6." << std::endl; + std::cout << " Compression is hard-coded to PNG_FILTER_PAETH, Z_RLE" << std::endl; std::cout << " -Y Overwrite output if present." << std::endl; std::cout << " -f Use the custom fast-export processing pipeline." << std::endl; std::cout << std::endl; @@ -822,7 +854,7 @@ } // Process image - rtengine::IImage16* resultImage = rtengine::processImage (job, errorCode, nullptr, options.tunnelMetaData); + rtengine::IImagefloat* resultImage = rtengine::processImage (job, errorCode, nullptr); if ( !resultImage ) { errors++; @@ -837,7 +869,7 @@ } else if ( outputType == "tif" ) { errorCode = resultImage->saveAsTIFF ( outputFile, bits, compression == 0 ); } else if ( outputType == "png" ) { - errorCode = resultImage->saveAsPNG ( outputFile, compression, bits ); + errorCode = resultImage->saveAsPNG ( outputFile, bits ); } else { errorCode = resultImage->saveToFile (outputFile); } diff -Nru rawtherapee-5.3/rtgui/metadatapanel.cc rawtherapee-5.4/rtgui/metadatapanel.cc --- rawtherapee-5.3/rtgui/metadatapanel.cc 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/metadatapanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,129 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +#include "metadatapanel.h" +#include "eventmapper.h" +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace rtengine::procparams; + + +MetaDataPanel::MetaDataPanel() +{ + EvMetaDataMode = ProcEventMapper::getInstance()->newEvent(M_VOID, "HISTORY_MSG_METADATA_MODE"); + + Gtk::HBox *box = Gtk::manage(new Gtk::HBox()); + box->pack_start(*Gtk::manage(new Gtk::Label(M("TP_METADATA_MODE") + ": ")), Gtk::PACK_SHRINK, 4); + metadataMode = Gtk::manage(new MyComboBoxText()); + metadataMode->append(M("TP_METADATA_TUNNEL")); + metadataMode->append(M("TP_METADATA_EDIT")); + metadataMode->append(M("TP_METADATA_STRIP")); + metadataMode->set_active(0); + box->pack_end(*metadataMode, Gtk::PACK_EXPAND_WIDGET, 4); + pack_start(*box, Gtk::PACK_SHRINK, 4); + + metadataMode->signal_changed().connect(sigc::mem_fun(*this, &MetaDataPanel::metaDataModeChanged)); + + tagsNotebook = Gtk::manage(new Gtk::Notebook()); + exifpanel = new ExifPanel(); + iptcpanel = new IPTCPanel(); + tagsNotebook->set_name("MetaPanelNotebook"); + tagsNotebook->append_page(*exifpanel, M("MAIN_TAB_EXIF")); + tagsNotebook->append_page(*iptcpanel, M("MAIN_TAB_IPTC")); + + pack_end(*tagsNotebook); +} + + +MetaDataPanel::~MetaDataPanel() +{ + delete iptcpanel; + delete exifpanel; +} + + +void MetaDataPanel::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + metadataMode->append(M("GENERAL_UNCHANGED")); + tagsNotebook->remove_page(-1); + tagsNotebook->remove_page(-1); +} + + +void MetaDataPanel::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener(); + metadataMode->set_active(int(pp->metadata.mode)); + if (pedited) { + if (!pedited->metadata.mode) { + metadataMode->set_active(3); + } + } + + exifpanel->read(pp, pedited); + iptcpanel->read(pp, pedited); + + enableListener(); +} + + +void MetaDataPanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + pp->metadata.mode = static_cast(min(metadataMode->get_active_row_number(), 2)); + + if (pedited) { + pedited->metadata.mode = metadataMode->get_active_row_number() != 3; + } + + exifpanel->write(pp, pedited); + iptcpanel->write(pp, pedited); +} + + +void MetaDataPanel::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) +{ + exifpanel->setDefaults(defParams, pedited); + iptcpanel->setDefaults(defParams, pedited); +} + + +void MetaDataPanel::setImageData(const rtengine::FramesMetaData* id) +{ + exifpanel->setImageData(id); + iptcpanel->setImageData(id); +} + + +void MetaDataPanel::setListener(ToolPanelListener *tpl) +{ + ToolPanel::setListener(tpl); + exifpanel->setListener(tpl); + iptcpanel->setListener(tpl); +} + + +void MetaDataPanel::metaDataModeChanged() +{ + if (listener) { + listener->panelChanged(EvMetaDataMode, M("HISTORY_CHANGED")); + } +} diff -Nru rawtherapee-5.3/rtgui/metadatapanel.h rawtherapee-5.4/rtgui/metadatapanel.h --- rawtherapee-5.3/rtgui/metadatapanel.h 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/rtgui/metadatapanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,49 @@ +/** -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright (c) 2017 Alberto Griggio + * + * 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 . + */ +#pragma once + +#include +#include "toolpanel.h" +#include "exifpanel.h" +#include "iptcpanel.h" + +class MetaDataPanel: public Gtk::VBox, public ToolPanel { +private: + rtengine::ProcEvent EvMetaDataMode; + MyComboBoxText *metadataMode; + Gtk::Notebook *tagsNotebook; + ExifPanel *exifpanel; + IPTCPanel *iptcpanel; + + void metaDataModeChanged(); + +public: + MetaDataPanel(); + ~MetaDataPanel(); + + void setBatchMode(bool batchMode); + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + + void setImageData(const rtengine::FramesMetaData* id); + void setListener(ToolPanelListener *tpl); +}; + diff -Nru rawtherapee-5.3/rtgui/multilangmgr.cc rawtherapee-5.4/rtgui/multilangmgr.cc --- rawtherapee-5.3/rtgui/multilangmgr.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/multilangmgr.cc 2018-03-20 11:04:15.000000000 +0000 @@ -19,8 +19,7 @@ #include "multilangmgr.h" #include -#include - +#include #ifdef WIN32 #include #include @@ -39,30 +38,36 @@ LocaleToLang () { - emplace (key ("ca"), "Catala"); - emplace (key ("cs"), "Czech"); - emplace (key ("da"), "Dansk"); - emplace (key ("de"), "Deutsch"); - emplace (key ("es"), "Espanol"); - emplace (key ("eu"), "Euskara"); - emplace (key ("fr"), "Francais"); - emplace (key ("el"), "Greek"); - emplace (key ("he"), "Hebrew"); - emplace (key ("it"), "Italiano"); - emplace (key ("ja"), "Japanese"); - emplace (key ("lv"), "Latvian"); - emplace (key ("hu"), "Magyar"); - emplace (key ("nl"), "Nederlands"); - emplace (key ("nn"), "Norsk BM"); - emplace (key ("nb"), "Norsk BM"); - emplace (key ("pl"), "Polish"); - emplace (key ("pt"), "Portugues (Brasil)"); - emplace (key ("ru"), "Russian"); - emplace (key ("sr"), "Serbian (Cyrilic Characters)"); - emplace (key ("sk"), "Slovak"); - emplace (key ("fi"), "Suomi"); - emplace (key ("sv"), "Swedish"); - emplace (key ("tr"), "Turkish"); + emplace (key ("ca", "ES"), "Catala"); + emplace (key ("cs", "CZ"), "Czech"); + emplace (key ("da", "DK"), "Dansk"); + emplace (key ("de", "DE"), "Deutsch"); +#ifdef __APPLE__ + emplace (key ("en", "UK"), "English (UK)"); +#else + emplace (key ("en", "GB"), "English (UK)"); +#endif + emplace (key ("en", "US"), "English (US)"); + emplace (key ("es", "ES"), "Espanol"); + emplace (key ("eu", "ES"), "Euskara"); + emplace (key ("fr", "FR"), "Francais"); + emplace (key ("el", "GR"), "Greek"); + emplace (key ("he", "IL"), "Hebrew"); + emplace (key ("it", "IT"), "Italiano"); + emplace (key ("ja", "JP"), "Japanese"); + emplace (key ("lv", "LV"), "Latvian"); + emplace (key ("hu", "HU"), "Magyar"); + emplace (key ("nl", "NL"), "Nederlands"); + emplace (key ("nn", "NO"), "Norsk BM"); + emplace (key ("nb", "NO"), "Norsk BM"); + emplace (key ("pl", "PL"), "Polish"); + emplace (key ("pt", "PT"), "Portugues (Brasil)"); + emplace (key ("ru", "RU"), "Russian"); + emplace (key ("sr", "RS"), "Serbian (Cyrilic Characters)"); + emplace (key ("sk", "SK"), "Slovak"); + emplace (key ("fi", "FI"), "Suomi"); + emplace (key ("sv", "SE"), "Swedish"); + emplace (key ("tr", "TR"), "Turkish"); emplace (key ("zh", "CN"), "Chinese (Simplified)"); emplace (key ("zh", "SG"), "Chinese (Traditional)"); } @@ -87,7 +92,7 @@ } // Look for matching language only. - iterator = find (key (major)); + iterator = find (key (major, major.uppercase())); if (iterator != end ()) { return iterator->second; @@ -95,10 +100,43 @@ return "default"; } + + std::string getLocale(const Glib::ustring &language) const + { + for (auto &p : *this) { + if (p.second == language) { + std::string ret = p.first.first; + if (!p.first.second.empty()) { + ret += "_" + p.first.second; + } + return ret; + } + } + return "C"; + } }; const LocaleToLang localeToLang; +void setGtkLanguage(const Glib::ustring &language) +{ + if(language != "default") { // nothing to change when using default + std::string lang = localeToLang.getLocale(language); + const gchar *env_langc = g_getenv("LANG"); + if(env_langc) { + const std::string env_lang(env_langc); + if (!env_lang.empty()) { + const std::string::size_type suffix_pos = env_lang.find_first_of("."); + if (suffix_pos != std::string::npos) { + lang += env_lang.substr(suffix_pos); + } + } + } + + g_setenv("LANG", lang.c_str(), true); + } +} + } MultiLangMgr langMgr; @@ -107,57 +145,54 @@ { } -MultiLangMgr::MultiLangMgr (const Glib::ustring& fname, MultiLangMgr* fallbackMgr) +void MultiLangMgr::load(const Glib::ustring &language, const std::vector &fnames) { - load (fname, fallbackMgr); -} - -bool MultiLangMgr::load (const Glib::ustring& fname, MultiLangMgr* fallbackMgr) -{ - this->fallbackMgr.reset (fallbackMgr); - - std::ifstream file (fname.c_str ()); - if (!file.is_open ()) { - return false; - } - - std::map translations; - std::string entry, key, value; + setGtkLanguage(language); - while (std::getline (file, entry)) { + translations.clear(); - if (entry.empty () || entry.front () == '#') { + for (const auto& fname : fnames) { + if(fname.empty()) { continue; } - std::istringstream line (entry); - - if (!std::getline (line, key, ';') || !std::getline (line, value)) { + std::ifstream file(fname.c_str()); + if (!file.is_open()) { continue; } - static const std::regex newline ("\\\\n"); - value = std::regex_replace (value, newline, "\n"); - - translations.emplace (key, value); + std::string entry; + auto hint = translations.begin(); + while (std::getline(file, entry)) { + + if (entry.empty() || entry.front() == '#' || entry.front() == '!') { + continue; + } + + std::string key, value; + + std::istringstream line(entry); + + if(std::getline(line, key, ';') && translations.find(key) == translations.end() && std::getline(line, value)) { + size_t pos = 0; + while((pos = value.find("\\n", pos)) != std::string::npos) { + value.replace(pos, 2, "\n"); + pos++; + } + hint = translations.emplace_hint(hint, key, value); + } + } } - - this->translations.swap (translations); - return true; } Glib::ustring MultiLangMgr::getStr (const std::string& key) const { - const auto iterator = translations.find (key); + const auto iterator = translations.find(key); - if (iterator != translations.end ()) { + if (iterator != translations.end()) { return iterator->second; } - if (fallbackMgr) { - return fallbackMgr->getStr (key); - } - return key; } diff -Nru rawtherapee-5.3/rtgui/multilangmgr.h rawtherapee-5.4/rtgui/multilangmgr.h --- rawtherapee-5.3/rtgui/multilangmgr.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/multilangmgr.h 2018-03-20 11:04:15.000000000 +0000 @@ -20,8 +20,8 @@ #define _MULTILANGMGR_ #include -#include #include +#include #include @@ -29,22 +29,14 @@ { public: MultiLangMgr (); - MultiLangMgr (const Glib::ustring& fname, MultiLangMgr* fallbackMgr = nullptr); -public: - bool load (const Glib::ustring& fname, MultiLangMgr* fallbackMgr = nullptr); - -public: - Glib::ustring getStr (const std::string& key) const; - -public: - static bool isOSLanguageDetectSupported (); - static Glib::ustring getOSUserLanguage (); + void load(const Glib::ustring &language, const std::vector &fnames); + Glib::ustring getStr(const std::string& key) const; + static bool isOSLanguageDetectSupported(); + static Glib::ustring getOSUserLanguage(); private: std::map translations; - std::unique_ptr fallbackMgr; - }; extern MultiLangMgr langMgr; diff -Nru rawtherapee-5.3/rtgui/mydiagonalcurve.cc rawtherapee-5.4/rtgui/mydiagonalcurve.cc --- rawtherapee-5.3/rtgui/mydiagonalcurve.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/mydiagonalcurve.cc 2018-03-20 11:04:15.000000000 +0000 @@ -1280,7 +1280,7 @@ void MyDiagonalCurve::getCursorPositionFromCurve(float x) { - // the graph is refreshed only if a new point is created (snaped to a pixel) + // the graph is refreshed only if a new point is created (snapped to a pixel) clampedX = x; clampedY = point.getVal01(x); @@ -1292,7 +1292,7 @@ void MyDiagonalCurve::getCursorPositionFromCurve(int x) { - // the graph is refreshed only if a new point is created (snaped to a pixel) + // the graph is refreshed only if a new point is created (snapped to a pixel) cursorX = x - graphX; clampedX = (float(cursorX) - 1.5) / float(graphW - 3); clampedY = point.getVal01(clampedX); diff -Nru rawtherapee-5.3/rtgui/navigator.cc rawtherapee-5.4/rtgui/navigator.cc --- rawtherapee-5.3/rtgui/navigator.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/navigator.cc 2018-03-20 11:04:15.000000000 +0000 @@ -38,6 +38,8 @@ mbox->set_name("Navigator"); previewWindow = Gtk::manage (new PreviewWindow ()); mbox->pack_start (*previewWindow, Gtk::PACK_SHRINK, 2); + dimension = Gtk::manage (new Gtk::Label ()); + mbox->pack_start (*dimension, Gtk::PACK_SHRINK, 2); position = Gtk::manage (new Gtk::Label ()); mbox->pack_start (*position, Gtk::PACK_SHRINK, 2); @@ -207,10 +209,9 @@ void Navigator::setInvalid (int fullWidth, int fullHeight) { if (fullWidth > 0 && fullHeight > 0) { - position->set_text (Glib::ustring::compose (M("NAVIGATOR_XY_FULL"), fullWidth, fullHeight)); - } else { - position->set_text (M("NAVIGATOR_XY_NA")); + dimension->set_text (Glib::ustring::compose (M("NAVIGATOR_XY_FULL"), fullWidth, fullHeight)); } + position->set_text (M("NAVIGATOR_XY_NA")); R->set_text (M("NAVIGATOR_NA")); G->set_text (M("NAVIGATOR_NA")); @@ -290,13 +291,13 @@ G->set_text (s2); B->set_text (s3); - Color::rgb2hsv (r * 0xffff / 0xff, g * 0xffff / 0xff, b * 0xffff / 0xff, h, s, v); + Color::rgb2hsv01(r / 255.f, g / 255.f, b / 255.f, h, s, v); getHSVText (h, s, v, s1, s2, s3); H->set_text (s1); S->set_text (s2); V->set_text (s3); - Color::rgb2lab (profile, profileW, r * 0xffff / 0xff, g * 0xffff / 0xff, b * 0xffff / 0xff, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? + Color::rgb2lab01(profile, profileW, r / 255.f, g / 255.f, b / 255.f, LAB_l, LAB_a, LAB_b, options.rtSettings.HistogramWorking); // TODO: Really sure this function works? getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); LAB_L->set_text (s1); LAB_A->set_text (s2); diff -Nru rawtherapee-5.3/rtgui/navigator.h rawtherapee-5.4/rtgui/navigator.h --- rawtherapee-5.3/rtgui/navigator.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/navigator.h 2018-03-20 11:04:15.000000000 +0000 @@ -37,6 +37,7 @@ void cycleUnitsHSV (GdkEventButton *event); protected: + Gtk::Label* dimension; Gtk::Label* position; Gtk::Label *R, *G, *B; Gtk::Label *H, *S, *V; @@ -46,7 +47,6 @@ Gtk::Label *lH, *lS, *lV; Gtk::Label *lLAB_A, *lLAB_B, *lLAB_L; - void setInvalid (int fullWidth = -1, int fullHeight = -1); public: PreviewWindow* previewWindow; @@ -56,6 +56,7 @@ // pointermotionlistener interface // void pointerMoved (bool validPos, int x, int y, int r, int g, int b); void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b); + void setInvalid (int fullWidth = -1, int fullHeight = -1); void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB); void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV); diff -Nru rawtherapee-5.3/rtgui/options.cc rawtherapee-5.4/rtgui/options.cc --- rawtherapee-5.3/rtgui/options.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/options.cc 2018-03-20 11:04:15.000000000 +0000 @@ -52,8 +52,7 @@ Options::Options () { - defProfRawMissing = false; - defProfImgMissing = false; + defProfError = 0; setDefaults (); } @@ -82,7 +81,7 @@ return true; } else { if (!errString.empty()) { - printf ("%s\n", errString.c_str()); + std::cerr << errString << std::endl; } return false; @@ -103,60 +102,48 @@ g_mkdir_with_parents (profilePath.c_str (), 511); if (!checkDirPath (profilePath, "")) { // had problems with mkdir_with_parents return value on OS X, just check dir again - printf ("Error: user's profiles' directory \"%s\" creation failed\n", profilePath.c_str()); + Glib::ustring msg = Glib::ustring::compose ("Creation of the user's processing profile directory \"%1\" failed!\n", profilePath); + throw Error (msg); } } - if (checkDirPath (profilePath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { - if (multiUser) { - userProfilePath = profilePath; - tmpPath = Glib::build_filename (argv0, "profiles"); + if (checkDirPath (profilePath, "Error: the user's processing profile path doesn't point to a directory or doesn't exist!\n")) { + userProfilePath = profilePath; + tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { - if (userProfilePath != tmpPath) { - globalProfilePath = tmpPath; - } + if (checkDirPath (tmpPath, "Error: the global's processing profile path doesn't point to a directory or doesn't exist!\n")) { + if (userProfilePath != tmpPath) { + globalProfilePath = tmpPath; } - } else { - globalProfilePath = profilePath; } } else { tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (checkDirPath (tmpPath, "Error: the global's processing profile path doesn't point to a directory or doesn't exist!\n")) { globalProfilePath = tmpPath; } } } else { // relative paths - if (multiUser) { - tmpPath = Glib::build_filename (rtdir, profilePath); + tmpPath = Glib::build_filename (rtdir, profilePath); - if (!checkDirPath (tmpPath, "")) { - g_mkdir_with_parents (tmpPath.c_str (), 511); - - if (!checkDirPath (tmpPath, "")) { - printf ("Error: user's profiles' directory \"%s\" creation failed\n", tmpPath.c_str()); - } - } + if (!checkDirPath (tmpPath, "")) { + g_mkdir_with_parents (tmpPath.c_str (), 511); - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory!\n")) { - userProfilePath = tmpPath; + if (!checkDirPath (tmpPath, "")) { + Glib::ustring msg = Glib::ustring::compose ("Creation of the user's processing profile directory \"%1\" failed!\n", tmpPath.c_str()); + throw Error (msg); } + } - tmpPath = Glib::build_filename (argv0, "profiles"); + if (checkDirPath (tmpPath, "Error: the user's processing profile path doesn't point to a directory!\n")) { + userProfilePath = tmpPath; + } - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { - globalProfilePath = tmpPath; - } - } else { - // common directory - // directory name set in options is ignored, we use the default directory name - tmpPath = Glib::build_filename (argv0, "profiles"); + tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: no global profiles' directory found!\n")) { - globalProfilePath = tmpPath; - } + if (checkDirPath (tmpPath, "Error: the user's processing profile path doesn't point to a directory or doesn't exist!\n")) { + globalProfilePath = tmpPath; } } @@ -309,7 +296,6 @@ saveFormat.format = "jpg"; saveFormat.jpegQuality = 92; saveFormat.jpegSubSamp = 2; - saveFormat.pngCompression = 6; saveFormat.pngBits = 8; saveFormat.tiffBits = 16; saveFormat.tiffUncompressed = true; @@ -318,7 +304,6 @@ saveFormatBatch.format = "jpg"; saveFormatBatch.jpegQuality = 92; saveFormatBatch.jpegSubSamp = 2; - saveFormatBatch.pngCompression = 6; saveFormatBatch.pngBits = 8; saveFormatBatch.tiffBits = 16; saveFormatBatch.tiffUncompressed = true; @@ -354,6 +339,7 @@ CPFontFamily = "default"; CPFontSize = 8; lastScale = 5; + lastShowAllExif = false; panAccelFactor = 5; rememberZoomAndPan = true; lastCropSize = 1; @@ -427,7 +413,6 @@ tabbedUI = false; mainNBVertical = true; multiDisplayMode = 0; - tunnelMetaData = true; histogramPosition = 1; histogramBar = true; histogramFullMode = false; @@ -558,20 +543,10 @@ rtSettings.verbose = false; rtSettings.gamutICC = true; rtSettings.gamutLch = true; - rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artefacts, high values reduces + rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artifacts, high values reduces rtSettings.artifact_cbdl = 4.; rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; - rtSettings.bot_left = 0; - rtSettings.top_left = 10; - rtSettings.top_right = 40; - rtSettings.bot_right = 75; - rtSettings.ed_detec = 3; //between 2 and 10 - rtSettings.ed_detecStr = 1.3; //not use - rtSettings.ed_low = 15.; //between 5 to 40 - rtSettings.ed_lipinfl = 0.8; //between 0.5 to 0.9 - rtSettings.ed_lipampl = 1.1; //between 1 and 2 - rtSettings.ciecamfloat = true; rtSettings.protectred = 60; @@ -616,6 +591,8 @@ gimpPluginShowInfoDialog = true; maxRecentFolders = 15; rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc + cropGuides = CROP_GUIDE_FULL; + cropAutoFit = false; } Options* Options::copyFrom (Options* other) @@ -718,44 +695,6 @@ if ( keyFile.has_key ("General", "Verbose")) { rtSettings.verbose = keyFile.get_boolean ( "General", "Verbose"); } - - if (keyFile.has_key ("General", "BotLeft")) { - rtSettings.bot_left = keyFile.get_double ("General", "BotLeft"); - } - - if (keyFile.has_key ("General", "TopLeft")) { - rtSettings.top_left = keyFile.get_double ("General", "TopLeft"); - } - - if (keyFile.has_key ("General", "TopRight")) { - rtSettings.top_right = keyFile.get_double ("General", "TopRight"); - } - - if (keyFile.has_key ("General", "BotRight")) { - rtSettings.bot_right = keyFile.get_double ("General", "BotRight"); - } - - if (keyFile.has_key ("General", "EDdetec")) { - rtSettings.ed_detec = keyFile.get_double ("General", "EDdetec"); - } - - if (keyFile.has_key ("General", "EDdetecStr")) { - rtSettings.ed_detecStr = keyFile.get_double ("General", "EDdetecStr"); - } - - if (keyFile.has_key ("General", "EDLow")) { - rtSettings.ed_low = keyFile.get_double ("General", "EDLow"); - } - - if (keyFile.has_key ("General", "EDLipinfl")) { - rtSettings.ed_lipinfl = keyFile.get_double ("General", "EDLipinfl"); - } - - if (keyFile.has_key ("General", "EDLipampl")) { - rtSettings.ed_lipampl = keyFile.get_double ("General", "EDLipampl"); - } - - } if (keyFile.has_group ("External Editor")) { @@ -789,10 +728,6 @@ saveFormat.jpegSubSamp = keyFile.get_integer ("Output", "JpegSubSamp"); } - if (keyFile.has_key ("Output", "PngCompression")) { - saveFormat.pngCompression = keyFile.get_integer ("Output", "PngCompression"); - } - if (keyFile.has_key ("Output", "PngBps")) { saveFormat.pngBits = keyFile.get_integer ("Output", "PngBps"); } @@ -822,10 +757,6 @@ saveFormatBatch.jpegSubSamp = keyFile.get_integer ("Output", "JpegSubSampBatch"); } - if (keyFile.has_key ("Output", "PngCompressionBatch")) { - saveFormatBatch.pngCompression = keyFile.get_integer ("Output", "PngCompressionBatch"); - } - if (keyFile.has_key ("Output", "PngBpsBatch")) { saveFormatBatch.pngBits = keyFile.get_integer ("Output", "PngBpsBatch"); } @@ -877,10 +808,6 @@ if (keyFile.has_key ("Output", "OverwriteOutputFile")) { overwriteOutputFile = keyFile.get_boolean ("Output", "OverwriteOutputFile"); } - - if (keyFile.has_key ("Output", "TunnelMetaData")) { - tunnelMetaData = keyFile.get_boolean ("Output", "TunnelMetaData"); - } } if (keyFile.has_group ("Profiles")) { @@ -1278,6 +1205,10 @@ lastScale = keyFile.get_integer ("GUI", "LastPreviewScale"); } + if (keyFile.has_key ("GUI", "LastShowAllExif")) { + lastShowAllExif = keyFile.get_boolean ("GUI", "LastShowAllExif"); + } + if (keyFile.has_key ("GUI", "PanAccelFactor")) { panAccelFactor = keyFile.get_integer ("GUI", "PanAccelFactor"); } @@ -1371,10 +1302,14 @@ FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } +#if defined(__linux__) && ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION > 18) || GTK_MAJOR_VERSION > 3) + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + hideTPVScrollbar = false; +#else if (keyFile.has_key ("GUI", "HideTPVScrollbar")) { hideTPVScrollbar = keyFile.get_boolean ("GUI", "HideTPVScrollbar"); } - +#endif if (keyFile.has_key ("GUI", "UseIconNoText")) { UseIconNoText = keyFile.get_boolean ("GUI", "UseIconNoText"); } @@ -1392,6 +1327,12 @@ if (keyFile.has_key ("Crop Settings", "PPI")) { cropPPI = keyFile.get_integer ("Crop Settings", "PPI"); } + if (keyFile.has_key("Crop Settings", "GuidesMode")) { + cropGuides = CropGuidesMode(std::max(int(CROP_GUIDE_NONE), std::min(keyFile.get_integer("Crop Settings", "GuidesMode"), int(CROP_GUIDE_FULL)))); + } + if (keyFile.has_key("Crop Settings", "AutoFit")) { + cropAutoFit = keyFile.get_boolean("Crop Settings", "AutoFit"); + } } if (keyFile.has_group ("Color Management")) { @@ -1838,17 +1779,6 @@ keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath); keyFile.set_string ("General", "FlatFieldsPath", rtSettings.flatFieldsPath); keyFile.set_boolean ("General", "Verbose", rtSettings.verbose); - keyFile.set_double ("General", "BotLeft", rtSettings.bot_left); - keyFile.set_double ("General", "TopLeft", rtSettings.top_left); - keyFile.set_double ("General", "TopRight", rtSettings.top_right); - keyFile.set_double ("General", "BotRight", rtSettings.bot_right); - keyFile.set_double ("General", "EDdetec", rtSettings.ed_detec); - keyFile.set_double ("General", "EDdetecStr", rtSettings.ed_detecStr); - keyFile.set_double ("General", "EDLow", rtSettings.ed_low); - keyFile.set_double ("General", "EDLipinfl", rtSettings.ed_lipinfl); - keyFile.set_double ("General", "EDLipampl", rtSettings.ed_lipampl); - - keyFile.set_integer ("External Editor", "EditorKind", editorToSendTo); keyFile.set_string ("External Editor", "GimpDir", gimpDir); keyFile.set_string ("External Editor", "PhotoshopDir", psDir); @@ -1922,7 +1852,6 @@ keyFile.set_string ("Output", "Format", saveFormat.format); keyFile.set_integer ("Output", "JpegQuality", saveFormat.jpegQuality); keyFile.set_integer ("Output", "JpegSubSamp", saveFormat.jpegSubSamp); - keyFile.set_integer ("Output", "PngCompression", saveFormat.pngCompression); keyFile.set_integer ("Output", "PngBps", saveFormat.pngBits); keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits); keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed); @@ -1931,7 +1860,6 @@ keyFile.set_string ("Output", "FormatBatch", saveFormatBatch.format); keyFile.set_integer ("Output", "JpegQualityBatch", saveFormatBatch.jpegQuality); keyFile.set_integer ("Output", "JpegSubSampBatch", saveFormatBatch.jpegSubSamp); - keyFile.set_integer ("Output", "PngCompressionBatch", saveFormatBatch.pngCompression); keyFile.set_integer ("Output", "PngBpsBatch", saveFormatBatch.pngBits); keyFile.set_integer ("Output", "TiffBpsBatch", saveFormatBatch.tiffBits); keyFile.set_boolean ("Output", "TiffUncompressedBatch", saveFormatBatch.tiffUncompressed); @@ -1945,7 +1873,6 @@ keyFile.set_boolean ("Output", "UsePathTemplate", saveUsePathTemplate); keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); keyFile.set_boolean ("Output", "OverwriteOutputFile", overwriteOutputFile); - keyFile.set_boolean ("Output", "TunnelMetaData", tunnelMetaData); keyFile.set_string ("Profiles", "Directory", profilePath); keyFile.set_boolean ("Profiles", "UseBundledProfiles", useBundledProfiles); @@ -1993,6 +1920,7 @@ keyFile.set_string ("GUI", "CPFontFamily", CPFontFamily); keyFile.set_integer ("GUI", "CPFontSize", CPFontSize); keyFile.set_integer ("GUI", "LastPreviewScale", lastScale); + keyFile.set_boolean ("GUI", "LastShowAllExif", lastShowAllExif); keyFile.set_integer ("GUI", "PanAccelFactor", panAccelFactor); keyFile.set_boolean ("GUI", "RememberZoomAndPan", rememberZoomAndPan); keyFile.set_integer ("GUI", "LastCropSize", lastCropSize); @@ -2026,6 +1954,8 @@ //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); keyFile.set_integer ("Crop Settings", "PPI", cropPPI); + keyFile.set_integer("Crop Settings", "GuidesMode", cropGuides); + keyFile.set_boolean("Crop Settings", "AutoFit", cropAutoFit); keyFile.set_string ("Color Management", "PrinterProfile", rtSettings.printerProfile); keyFile.set_integer ("Color Management", "PrinterIntent", rtSettings.printerIntent); @@ -2191,7 +2121,7 @@ } // Set the cache folder in RT's base folder - cacheBaseDir = Glib::build_filename (argv0, "cache"); + cacheBaseDir = Glib::build_filename (argv0, "mycache"); // Read the global option file (the one located in the application's base folder) try { @@ -2200,6 +2130,10 @@ // ignore errors here } + if (!options.multiUser && path == nullptr) { + rtdir = Glib::build_filename (argv0, "mysettings"); + } + // Modify the path of the cache folder to the one provided in RT_CACHE environment variable path = g_getenv ("RT_CACHE"); @@ -2211,7 +2145,7 @@ throw Error (msg); } } - // No environment variable provided, so falling back to the multi user mode, is enabled + // No environment variable provided, so falling back to the multi user mode, if enabled else if (options.multiUser) { #ifdef WIN32 cacheBaseDir = Glib::build_filename (rtdir, "cache"); @@ -2220,25 +2154,24 @@ #endif } - // Check if RT is installed in Multi-User mode - if (options.multiUser) { - // Read the user option file (the one located somewhere in the user's home folder) - // Those values supersets those of the global option file - try { - options.readFromFile (Glib::build_filename (rtdir, "options")); - } catch (Options::Error &) { - // If the local option file does not exist or is broken, and the local cache folder does not exist, recreate it - if (!g_mkdir_with_parents (rtdir.c_str (), 511)) { - // Save the option file - options.saveToFile (Glib::build_filename (rtdir, "options")); - } + // Read the user option file (the one located somewhere in the user's home folder) + // Those values supersets those of the global option file + try { + options.readFromFile (Glib::build_filename (rtdir, "options")); + } catch (Options::Error &) { + // If the local option file does not exist or is broken, and the local cache folder does not exist, recreate it + if (!g_mkdir_with_parents (rtdir.c_str (), 511)) { + // Save the option file + options.saveToFile (Glib::build_filename (rtdir, "options")); } + } #ifdef __APPLE__ + if (options.multiUser) { // make sure .local/share exists on OS X so we don't get problems with recently-used.xbel g_mkdir_with_parents (g_get_user_data_dir(), 511); -#endif } +#endif if (options.rtSettings.verbose) { printf ("Cache directory (cacheBaseDir) = %s\n", cacheBaseDir.c_str()); @@ -2249,48 +2182,52 @@ // Check default Raw and Img procparams existence if (options.defProfRaw.empty()) { - options.defProfRaw = DEFPROFILE_INTERNAL; + options.defProfRaw = DEFPROFILE_RAW; } else { - Glib::ustring tmpFName = options.findProfilePath (options.defProfRaw); - - if (!tmpFName.empty()) { + if (!options.findProfilePath (options.defProfRaw).empty()) { if (options.rtSettings.verbose) { - printf ("Raws' default profile \"%s\" found\n", options.defProfRaw.c_str()); + std::cout << "Default profile for raw images \"" << options.defProfRaw << "\" found" << std::endl; } } else { - if (options.rtSettings.verbose) { - printf ("Raws' default profile \"%s\" not found or not set -> using Internal values\n", options.defProfRaw.c_str()); - } + if (options.defProfRaw != DEFPROFILE_RAW) { + options.setDefProfRawMissing(true); - options.defProfRaw = DEFPROFILE_INTERNAL; - options.defProfRawMissing = true; + Glib::ustring dpr(DEFPROFILE_RAW); + if (options.findProfilePath (dpr).empty()) { + options.setBundledDefProfRawMissing(true); + } + } else { + options.setBundledDefProfRawMissing(true); + } } } if (options.defProfImg.empty()) { - options.defProfImg = DEFPROFILE_INTERNAL; + options.defProfImg = DEFPROFILE_IMG; } else { - Glib::ustring tmpFName = options.findProfilePath (options.defProfImg); - - if (!tmpFName.empty()) { + if (!options.findProfilePath (options.defProfImg).empty()) { if (options.rtSettings.verbose) { - printf ("Images' default profile \"%s\" found\n", options.defProfImg.c_str()); + std::cout << "Default profile for non-raw images \"" << options.defProfImg << "\" found" << std::endl; } } else { - if (options.rtSettings.verbose) { - printf ("Images' default profile \"%s\" not found or not set -> using Internal values\n", options.defProfImg.c_str()); - } + if (options.defProfImg != DEFPROFILE_IMG) { + options.setDefProfImgMissing(true); - options.defProfImg = DEFPROFILE_INTERNAL; - options.defProfImgMissing = true; + Glib::ustring dpi(DEFPROFILE_IMG); + if (options.findProfilePath (dpi).empty()) { + options.setBundledDefProfImgMissing(true); + } + } else { + options.setBundledDefProfImgMissing(true); + } } } - //We handle languages using a hierarchy of translations. The top of the hierarchy is default. This includes a default translation for all items + // We handle languages using a hierarchy of translations. The top of the hierarchy is default. This includes a default translation for all items // (most likely using simple English). The next level is the language: for instance, English, French, Chinese, etc. This file should contain a // generic translation for all items which differ from default. Finally there is the locale. This is region-specific items which differ from the // language file. These files must be name in the format (), where Language is the name of the language which it inherits from, - // and LC is the local code. Some examples of this would be English (US) (American English), French (FR) (Franch French), French (CA) (Canadian + // and LC is the local code. Some examples of this would be English (US) (American English), French (FR) (France French), French (CA) (Canadian // French), etc. // // Each level will only contain the differences between itself and its parent translation. For instance, English (UK) or English (CA) may @@ -2321,7 +2258,7 @@ } } - langMgr.load (localeTranslation, new MultiLangMgr (languageTranslation, new MultiLangMgr (defaultTranslation))); + langMgr.load (options.language, {localeTranslation, languageTranslation, defaultTranslation}); rtengine::init (&options.rtSettings, argv0, rtdir, !lightweight); } @@ -2329,11 +2266,7 @@ void Options::save () { - if (!options.multiUser) { - options.saveToFile (Glib::build_filename (argv0, "options")); - } else { - options.saveToFile (Glib::build_filename (rtdir, "options")); - } + options.saveToFile (Glib::build_filename (rtdir, "options")); } /* @@ -2391,3 +2324,63 @@ return false; } + +Glib::ustring Options::getUserProfilePath() +{ + return userProfilePath; +} + +Glib::ustring Options::getGlobalProfilePath() +{ + return globalProfilePath; +} + +bool Options::is_defProfRawMissing() +{ + return defProfError & rtengine::toUnderlying(DefProfError::defProfRawMissing); +} +bool Options::is_defProfImgMissing() +{ + return defProfError & rtengine::toUnderlying(DefProfError::defProfImgMissing); +} +void Options::setDefProfRawMissing (bool value) +{ + if (value) { + defProfError |= rtengine::toUnderlying(DefProfError::defProfRawMissing); + } else { + defProfError &= ~rtengine::toUnderlying(DefProfError::defProfRawMissing); + } +} +void Options::setDefProfImgMissing (bool value) +{ + if (value) { + defProfError |= rtengine::toUnderlying(DefProfError::defProfImgMissing); + } else { + defProfError &= ~rtengine::toUnderlying(DefProfError::defProfImgMissing); + } +} +bool Options::is_bundledDefProfRawMissing() +{ + return defProfError & rtengine::toUnderlying(DefProfError::bundledDefProfRawMissing); +} +bool Options::is_bundledDefProfImgMissing() +{ + return defProfError & rtengine::toUnderlying(DefProfError::bundledDefProfImgMissing); +} +void Options::setBundledDefProfRawMissing (bool value) +{ + if (value) { + defProfError |= rtengine::toUnderlying(DefProfError::bundledDefProfRawMissing); + } else { + defProfError &= ~rtengine::toUnderlying(DefProfError::bundledDefProfRawMissing); + } +} +void Options::setBundledDefProfImgMissing (bool value) +{ + if (value) { + defProfError |= rtengine::toUnderlying(DefProfError::bundledDefProfImgMissing); + } else { + defProfError &= ~rtengine::toUnderlying(DefProfError::bundledDefProfImgMissing); + } +} + diff -Nru rawtherapee-5.3/rtgui/options.h rawtherapee-5.4/rtgui/options.h --- rawtherapee-5.3/rtgui/options.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/options.h 2018-03-20 11:04:15.000000000 +0000 @@ -32,9 +32,9 @@ // Default bundled profile name to use for Raw images #ifdef WIN32 -#define DEFPROFILE_RAW "${G}\\Default" +#define DEFPROFILE_RAW "${G}\\Auto-Matched Curve - ISO Low" #else -#define DEFPROFILE_RAW "${G}/Default" +#define DEFPROFILE_RAW "${G}/Auto-Matched Curve - ISO Low" #endif // Default bundled profile name to use for Standard images #define DEFPROFILE_IMG "Neutral" @@ -47,7 +47,6 @@ SaveFormat() : format ("jpg"), pngBits (8), - pngCompression (6), jpegQuality (90), jpegSubSamp (2), tiffBits (8), @@ -58,7 +57,6 @@ Glib::ustring format; int pngBits; - int pngCompression; int jpegQuality; int jpegSubSamp; // 1=best compression, 3=best quality int tiffBits; @@ -92,8 +90,13 @@ }; private: - bool defProfRawMissing; - bool defProfImgMissing; + enum class DefProfError : short { + defProfRawMissing = 1 << 0, + bundledDefProfRawMissing = 1 << 1, + defProfImgMissing = 1 << 2, + bundledDefProfImgMissing = 1 << 3 + }; + short defProfError; Glib::ustring userProfilePath; Glib::ustring globalProfilePath; bool checkProfilePath (Glib::ustring &path); @@ -168,6 +171,7 @@ int dirBrowserHeight; int preferencesWidth; int preferencesHeight; + bool lastShowAllExif; int lastScale; int panAccelFactor; int lastCropSize; @@ -192,7 +196,6 @@ int showFilePanelState; // 0: normal, 1: maximized, 2: normal, 3: hidden bool showInfo; bool mainNBVertical; // main notebook vertical tabs? - int cropPPI; bool showClippedHighlights; bool showClippedShadows; int highlightThreshold; @@ -250,7 +253,6 @@ double sndLngEditProcDoneSecs; // Minimum processing time seconds till the sound is played bool sndEnable; - bool tunnelMetaData; // Pass through IPTC and XMP unchanged int histogramPosition; // 0=disabled, 1=left pane, 2=right pane //int histogramWorking; // 0=disabled, 1=left pane, 2=right pane bool histogramBar; @@ -263,6 +265,12 @@ bool showFilmStripToolBar; + // cropping options + int cropPPI; + enum CropGuidesMode { CROP_GUIDE_NONE, CROP_GUIDE_FRAME, CROP_GUIDE_FULL }; + CropGuidesMode cropGuides; + bool cropAutoFit; + // Performance options Glib::ustring clutsDir; int rgbDenoiseThreadLimit; // maximum number of threads for the denoising tool ; 0 = use the maximum available @@ -341,9 +349,9 @@ Options (); - Options* copyFrom (Options* other); - void filterOutParsedExtensions (); - void setDefaults (); + Options* copyFrom (Options* other); + void filterOutParsedExtensions (); + void setDefaults (); void readFromFile (Glib::ustring fname); void saveToFile (Glib::ustring fname); static void load (bool lightweight = false); @@ -351,34 +359,20 @@ // if multiUser=false, send back the global profile path Glib::ustring getPreferredProfilePath(); - Glib::ustring getUserProfilePath() - { - return userProfilePath; - } - Glib::ustring getGlobalProfilePath() - { - return globalProfilePath; - } + Glib::ustring getUserProfilePath(); + Glib::ustring getGlobalProfilePath(); Glib::ustring findProfilePath (Glib::ustring &profName); - bool is_parse_extention (Glib::ustring fname); - bool has_retained_extention (Glib::ustring fname); - bool is_extention_enabled (Glib::ustring ext); - bool is_defProfRawMissing() - { - return defProfRawMissing; - } - bool is_defProfImgMissing() - { - return defProfImgMissing; - } - void setDefProfRawMissing (bool value) - { - defProfRawMissing = value; - } - void setDefProfImgMissing (bool value) - { - defProfImgMissing = value; - } + bool is_parse_extention (Glib::ustring fname); + bool has_retained_extention (Glib::ustring fname); + bool is_extention_enabled (Glib::ustring ext); + bool is_defProfRawMissing(); + bool is_bundledDefProfRawMissing(); + bool is_defProfImgMissing(); + bool is_bundledDefProfImgMissing(); + void setDefProfRawMissing (bool value); + void setBundledDefProfRawMissing (bool value); + void setDefProfImgMissing (bool value); + void setBundledDefProfImgMissing (bool value); }; extern Options options; diff -Nru rawtherapee-5.3/rtgui/paramsedited.cc rawtherapee-5.4/rtgui/paramsedited.cc --- rawtherapee-5.3/rtgui/paramsedited.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/paramsedited.cc 2018-03-20 11:04:15.000000000 +0000 @@ -49,6 +49,7 @@ toneCurve.expcomp = v; toneCurve.hrenabled = v; toneCurve.method = v; + toneCurve.histmatching = v; retinex.cdcurve = v; retinex.mapcurve = v; retinex.cdHcurve = v; @@ -82,6 +83,7 @@ retinex.radius = v; retinex.retinex = v; + labCurve.enabled = v; labCurve.lcurve = v; labCurve.acurve = v; labCurve.bcurve = v; @@ -97,6 +99,12 @@ labCurve.avoidcolorshift = v; labCurve.rstprotection = v; labCurve.lcredsk = v; + localContrast.enabled = v; + localContrast.radius = v; + localContrast.amount = v; + localContrast.darkness = v; + localContrast.lightness = v; + rgbCurves.enabled = v; rgbCurves.lumamode = v; rgbCurves.rcurve = v; rgbCurves.gcurve = v; @@ -127,6 +135,10 @@ colorToning.greenhigh = v; colorToning.bluehigh = v; colorToning.lumamode = v; + colorToning.labgridALow = v; + colorToning.labgridBLow = v; + colorToning.labgridAHigh = v; + colorToning.labgridBHigh = v; sharpening.enabled = v; sharpening.radius = v; @@ -219,6 +231,7 @@ //colorBoost.avoidclip = v; //colorBoost.enable_saturationlimiter = v; //colorBoost.saturationlimit = v; + wb.enabled = v; wb.method = v; wb.green = v; wb.temperature = v; @@ -264,13 +277,16 @@ epd.edgeStopping = v; epd.scale = v; epd.reweightingIterates = v; + fattal.enabled = v; + fattal.threshold = v; + fattal.amount = v; + fattal.anchor = v; sh.enabled = v; sh.hq = v; sh.highlights = v; sh.htonalwidth = v; sh.shadows = v; sh.stonalwidth = v; - sh.localcontrast = v; sh.radius = v; crop.enabled = v; crop.x = v; @@ -316,6 +332,7 @@ vignetting.strength = v; vignetting.centerX = v; vignetting.centerY = v; + chmixer.enabled = v; chmixer.red[0] = v; chmixer.red[1] = v; chmixer.red[2] = v; @@ -408,6 +425,7 @@ raw.bayersensor.pixelShiftSmooth = v; raw.bayersensor.pixelShiftExp0 = v; raw.bayersensor.pixelShiftLmmse = v; + raw.bayersensor.pixelShiftOneGreen = v; raw.bayersensor.pixelShiftEqualBright = v; raw.bayersensor.pixelShiftEqualBrightChannel = v; raw.bayersensor.pixelShiftNonGreenCross = v; @@ -420,14 +438,14 @@ raw.xtranssensor.exBlackRed = v; raw.xtranssensor.exBlackGreen = v; raw.xtranssensor.exBlackBlue = v; - raw.caCorrection = v; - raw.caBlue = v; - raw.caRed = v; + raw.ca_autocorrect = v; + raw.cablue = v; + raw.cared = v; raw.hotPixelFilter = v; raw.deadPixelFilter = v; - raw.hotDeadPixelThresh = v; + raw.hotdeadpix_thresh = v; raw.darkFrame = v; - raw.dfAuto = v; + raw.df_autoselect = v; raw.ff_file = v; raw.ff_AutoSelect = v; raw.ff_BlurRadius = v; @@ -544,12 +562,14 @@ dirpyrequalizer.skinprotect = v; dirpyrequalizer.hueskin = v; //dirpyrequalizer.algo = v; + hsvequalizer.enabled = v; hsvequalizer.hcurve = v; hsvequalizer.scurve = v; hsvequalizer.vcurve = v; filmSimulation.enabled = v; filmSimulation.clutFilename = v; filmSimulation.strength = v; + metadata.mode = v; exif = v; iptc = v; @@ -587,6 +607,7 @@ toneCurve.expcomp = toneCurve.expcomp && p.toneCurve.expcomp == other.toneCurve.expcomp; toneCurve.hrenabled = toneCurve.hrenabled && p.toneCurve.hrenabled == other.toneCurve.hrenabled; toneCurve.method = toneCurve.method && p.toneCurve.method == other.toneCurve.method; + toneCurve.histmatching = toneCurve.histmatching && p.toneCurve.histmatching == other.toneCurve.histmatching; retinex.cdcurve = retinex.cdcurve && p.retinex.cdcurve == other.retinex.cdcurve; retinex.mapcurve = retinex.mapcurve && p.retinex.mapcurve == other.retinex.mapcurve; retinex.cdHcurve = retinex.cdHcurve && p.retinex.cdHcurve == other.retinex.cdHcurve; @@ -619,6 +640,7 @@ retinex.radius = retinex.radius && p.retinex.radius == other.retinex.radius; retinex.enabled = retinex.enabled && p.retinex.enabled == other.retinex.enabled; + labCurve.enabled = labCurve.enabled && p.labCurve.enabled == other.labCurve.enabled; labCurve.lcurve = labCurve.lcurve && p.labCurve.lcurve == other.labCurve.lcurve; labCurve.acurve = labCurve.acurve && p.labCurve.acurve == other.labCurve.acurve; labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve; @@ -634,6 +656,14 @@ labCurve.avoidcolorshift = labCurve.avoidcolorshift && p.labCurve.avoidcolorshift == other.labCurve.avoidcolorshift; labCurve.rstprotection = labCurve.rstprotection && p.labCurve.rstprotection == other.labCurve.rstprotection; labCurve.lcredsk = labCurve.lcredsk && p.labCurve.lcredsk == other.labCurve.lcredsk; + + localContrast.enabled = localContrast.enabled && p.localContrast.enabled == other.localContrast.enabled; + localContrast.radius = localContrast.radius && p.localContrast.radius == other.localContrast.radius; + localContrast.amount = localContrast.amount && p.localContrast.amount == other.localContrast.amount; + localContrast.darkness = localContrast.darkness && p.localContrast.darkness == other.localContrast.darkness; + localContrast.lightness = localContrast.lightness && p.localContrast.lightness == other.localContrast.lightness; + + rgbCurves.enabled = rgbCurves.enabled && p.rgbCurves.enabled == other.rgbCurves.enabled; rgbCurves.lumamode = rgbCurves.lumamode && p.rgbCurves.lumamode == other.rgbCurves.lumamode; rgbCurves.rcurve = rgbCurves.rcurve && p.rgbCurves.rcurve == other.rgbCurves.rcurve; rgbCurves.gcurve = rgbCurves.gcurve && p.rgbCurves.gcurve == other.rgbCurves.gcurve; @@ -664,6 +694,10 @@ colorToning.greenhigh = colorToning.greenhigh && p.colorToning.greenhigh == other.colorToning.greenhigh; colorToning.bluehigh = colorToning.bluehigh && p.colorToning.bluehigh == other.colorToning.bluehigh; colorToning.lumamode = colorToning.lumamode && p.colorToning.lumamode == other.colorToning.lumamode; + colorToning.labgridALow = colorToning.labgridALow && p.colorToning.labgridALow == other.colorToning.labgridALow; + colorToning.labgridBLow = colorToning.labgridBLow && p.colorToning.labgridBLow == other.colorToning.labgridBLow; + colorToning.labgridAHigh = colorToning.labgridAHigh && p.colorToning.labgridAHigh == other.colorToning.labgridAHigh; + colorToning.labgridBHigh = colorToning.labgridBHigh && p.colorToning.labgridBHigh == other.colorToning.labgridBHigh; sharpenEdge.enabled = sharpenEdge.enabled && p.sharpenEdge.enabled == other.sharpenEdge.enabled; sharpenEdge.passes = sharpenEdge.passes && p.sharpenEdge.passes == other.sharpenEdge.passes; sharpenEdge.amount = sharpenEdge.amount && p.sharpenEdge.amount == other.sharpenEdge.amount; @@ -755,6 +789,7 @@ //colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip; //colorBoost.enable_saturationlimiter = colorBoost.enable_saturationlimiter && p.colorBoost.enable_saturationlimiter == other.colorBoost.enable_saturationlimiter; //colorBoost.saturationlimit = colorBoost.saturationlimit && p.colorBoost.saturationlimit == other.colorBoost.saturationlimit; + wb.enabled = wb.enabled && p.wb.enabled == other.wb.enabled; wb.method = wb.method && p.wb.method == other.wb.method; wb.green = wb.green && p.wb.green == other.wb.green; wb.equal = wb.equal && p.wb.equal == other.wb.equal; @@ -804,13 +839,17 @@ epd.scale = epd.scale && p.epd.scale == other.epd.scale; epd.reweightingIterates = epd.reweightingIterates && p.epd.reweightingIterates == other.epd.reweightingIterates; + fattal.enabled = fattal.enabled && p.fattal.enabled == other.fattal.enabled; + fattal.threshold = fattal.threshold && p.fattal.threshold == other.fattal.threshold; + fattal.amount = fattal.amount && p.fattal.amount == other.fattal.amount; + fattal.anchor = fattal.anchor && p.fattal.anchor == other.fattal.anchor; + sh.enabled = sh.enabled && p.sh.enabled == other.sh.enabled; sh.hq = sh.hq && p.sh.hq == other.sh.hq; sh.highlights = sh.highlights && p.sh.highlights == other.sh.highlights; sh.htonalwidth = sh.htonalwidth && p.sh.htonalwidth == other.sh.htonalwidth; sh.shadows = sh.shadows && p.sh.shadows == other.sh.shadows; sh.stonalwidth = sh.stonalwidth && p.sh.stonalwidth == other.sh.stonalwidth; - sh.localcontrast = sh.localcontrast && p.sh.localcontrast == other.sh.localcontrast; sh.radius = sh.radius && p.sh.radius == other.sh.radius; crop.enabled = crop.enabled && p.crop.enabled == other.crop.enabled; crop.x = crop.x && p.crop.x == other.crop.x; @@ -856,6 +895,7 @@ vignetting.strength = vignetting.strength && p.vignetting.strength == other.vignetting.strength; vignetting.centerX = vignetting.centerX && p.vignetting.centerX == other.vignetting.centerX; vignetting.centerY = vignetting.centerY && p.vignetting.centerY == other.vignetting.centerY; + chmixer.enabled = chmixer.enabled && p.chmixer.enabled == other.chmixer.enabled; chmixer.red[0] = chmixer.red[0] && p.chmixer.red[0] == other.chmixer.red[0]; chmixer.red[1] = chmixer.red[1] && p.chmixer.red[1] == other.chmixer.red[1]; chmixer.red[2] = chmixer.red[2] && p.chmixer.red[2] == other.chmixer.red[2]; @@ -946,6 +986,7 @@ raw.bayersensor.pixelShiftSmooth = raw.bayersensor.pixelShiftSmooth && p.raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor; raw.bayersensor.pixelShiftExp0 = raw.bayersensor.pixelShiftExp0 && p.raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0; raw.bayersensor.pixelShiftLmmse = raw.bayersensor.pixelShiftLmmse && p.raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse; + raw.bayersensor.pixelShiftOneGreen = raw.bayersensor.pixelShiftOneGreen && p.raw.bayersensor.pixelShiftOneGreen == other.raw.bayersensor.pixelShiftOneGreen; raw.bayersensor.pixelShiftEqualBright = raw.bayersensor.pixelShiftEqualBright && p.raw.bayersensor.pixelShiftEqualBright == other.raw.bayersensor.pixelShiftEqualBright; raw.bayersensor.pixelShiftEqualBrightChannel = raw.bayersensor.pixelShiftEqualBrightChannel && p.raw.bayersensor.pixelShiftEqualBrightChannel == other.raw.bayersensor.pixelShiftEqualBrightChannel; raw.bayersensor.pixelShiftNonGreenCross = raw.bayersensor.pixelShiftNonGreenCross && p.raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross; @@ -958,14 +999,14 @@ raw.xtranssensor.exBlackRed = raw.xtranssensor.exBlackRed && p.raw.xtranssensor.blackred == other.raw.xtranssensor.blackred; raw.xtranssensor.exBlackGreen = raw.xtranssensor.exBlackGreen && p.raw.xtranssensor.blackgreen == other.raw.xtranssensor.blackgreen; raw.xtranssensor.exBlackBlue = raw.xtranssensor.exBlackBlue && p.raw.xtranssensor.blackblue == other.raw.xtranssensor.blackblue; - raw.caCorrection = raw.caCorrection && p.raw.ca_autocorrect == other.raw.ca_autocorrect; - raw.caRed = raw.caRed && p.raw.cared == other.raw.cared; - raw.caBlue = raw.caBlue && p.raw.cablue == other.raw.cablue; + raw.ca_autocorrect = raw.ca_autocorrect && p.raw.ca_autocorrect == other.raw.ca_autocorrect; + raw.cared = raw.cared && p.raw.cared == other.raw.cared; + raw.cablue = raw.cablue && p.raw.cablue == other.raw.cablue; raw.hotPixelFilter = raw.hotPixelFilter && p.raw.hotPixelFilter == other.raw.hotPixelFilter; raw.deadPixelFilter = raw.deadPixelFilter && p.raw.deadPixelFilter == other.raw.deadPixelFilter; - raw.hotDeadPixelThresh = raw.hotDeadPixelThresh && p.raw.hotdeadpix_thresh == other.raw.hotdeadpix_thresh; + raw.hotdeadpix_thresh = raw.hotdeadpix_thresh && p.raw.hotdeadpix_thresh == other.raw.hotdeadpix_thresh; raw.darkFrame = raw.darkFrame && p.raw.dark_frame == other.raw.dark_frame; - raw.dfAuto = raw.dfAuto && p.raw.df_autoselect == other.raw.df_autoselect; + raw.df_autoselect = raw.df_autoselect && p.raw.df_autoselect == other.raw.df_autoselect; raw.ff_file = raw.ff_file && p.raw.ff_file == other.raw.ff_file; raw.ff_AutoSelect = raw.ff_AutoSelect && p.raw.ff_AutoSelect == other.raw.ff_AutoSelect; raw.ff_BlurRadius = raw.ff_BlurRadius && p.raw.ff_BlurRadius == other.raw.ff_BlurRadius; @@ -1077,12 +1118,14 @@ dirpyrequalizer.skinprotect = dirpyrequalizer.skinprotect && p.dirpyrequalizer.skinprotect == other.dirpyrequalizer.skinprotect; // dirpyrequalizer.algo = dirpyrequalizer.algo && p.dirpyrequalizer.algo == other.dirpyrequalizer.algo; dirpyrequalizer.hueskin = dirpyrequalizer.hueskin && p.dirpyrequalizer.hueskin == other.dirpyrequalizer.hueskin; + hsvequalizer.enabled = hsvequalizer.enabled && p.hsvequalizer.enabled == other.hsvequalizer.enabled; hsvequalizer.hcurve = hsvequalizer.hcurve && p.hsvequalizer.hcurve == other.hsvequalizer.hcurve; hsvequalizer.scurve = hsvequalizer.scurve && p.hsvequalizer.scurve == other.hsvequalizer.scurve; hsvequalizer.vcurve = hsvequalizer.vcurve && p.hsvequalizer.vcurve == other.hsvequalizer.vcurve; filmSimulation.enabled = filmSimulation.enabled && p.filmSimulation.enabled == other.filmSimulation.enabled; filmSimulation.clutFilename = filmSimulation.clutFilename && p.filmSimulation.clutFilename == other.filmSimulation.clutFilename; filmSimulation.strength = filmSimulation.strength && p.filmSimulation.strength == other.filmSimulation.strength; + metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? // exif = exif && p.exif==other.exif @@ -1159,6 +1202,10 @@ toEdit.toneCurve.method = mods.toneCurve.method; } + if (toneCurve.histmatching) { + toEdit.toneCurve.histmatching = mods.toneCurve.histmatching; + } + if (retinex.enabled) { toEdit.retinex.enabled = mods.retinex.enabled; } @@ -1289,6 +1336,10 @@ } + if (labCurve.enabled) { + toEdit.labCurve.enabled = mods.labCurve.enabled; + } + if (labCurve.lcurve) { toEdit.labCurve.lcurve = mods.labCurve.lcurve; } @@ -1349,6 +1400,27 @@ toEdit.labCurve.lcredsk = mods.labCurve.lcredsk; } + if (localContrast.enabled) { + toEdit.localContrast.enabled = mods.localContrast.enabled; + } + +#define ADDSETVAL_(v, i) \ + do { \ + if ( v ) { \ + toEdit. v = dontforceSet && options.baBehav[ i ] ? toEdit. v + mods. v : mods. v ; \ + } \ + } while (false) + + ADDSETVAL_(localContrast.radius, ADDSET_LOCALCONTRAST_RADIUS); + ADDSETVAL_(localContrast.amount, ADDSET_LOCALCONTRAST_AMOUNT); + ADDSETVAL_(localContrast.darkness, ADDSET_LOCALCONTRAST_DARKNESS); + ADDSETVAL_(localContrast.lightness, ADDSET_LOCALCONTRAST_LIGHTNESS); +#undef ADDSETVAL_ + + if (rgbCurves.enabled) { + toEdit.rgbCurves.enabled = mods.rgbCurves.enabled; + } + if (rgbCurves.lumamode) { toEdit.rgbCurves.lumamode = mods.rgbCurves.lumamode; } @@ -1477,6 +1549,19 @@ toEdit.colorToning.bluehigh = dontforceSet && options.baBehav[ADDSET_COLORTONING_SPLIT] ? toEdit.colorToning.bluehigh + mods.colorToning.bluehigh : mods.colorToning.bluehigh; } + if (colorToning.labgridALow) { + toEdit.colorToning.labgridALow = mods.colorToning.labgridALow; + } + if (colorToning.labgridBLow) { + toEdit.colorToning.labgridBLow = mods.colorToning.labgridBLow; + } + if (colorToning.labgridAHigh) { + toEdit.colorToning.labgridAHigh = mods.colorToning.labgridAHigh; + } + if (colorToning.labgridBHigh) { + toEdit.colorToning.labgridBHigh = mods.colorToning.labgridBHigh; + } + if (sharpenEdge.enabled) { toEdit.sharpenEdge.enabled = mods.sharpenEdge.enabled; } @@ -1657,6 +1742,10 @@ //if (colorBoost.avoidclip) toEdit.colorBoost.avoidclip = mods.colorBoost.avoidclip; //if (colorBoost.enable_saturationlimiter)toEdit.colorBoost.enable_saturationlimiter = mods.colorBoost.enable_saturationlimiter; //if (colorBoost.saturationlimit) toEdit.colorBoost.saturationlimit = mods.colorBoost.saturationlimit; + if (wb.enabled) { + toEdit.wb.enabled = mods.wb.enabled; + } + if (wb.method) { toEdit.wb.method = mods.wb.method; } @@ -1972,6 +2061,19 @@ toEdit.epd.reweightingIterates = mods.epd.reweightingIterates; } + if (fattal.enabled) { + toEdit.fattal.enabled = mods.fattal.enabled; + } + if (fattal.threshold) { + toEdit.fattal.threshold = mods.fattal.threshold; + } + if (fattal.amount) { + toEdit.fattal.amount = mods.fattal.amount; + } + if (fattal.anchor) { + toEdit.fattal.anchor = mods.fattal.anchor; + } + if (sh.enabled) { toEdit.sh.enabled = mods.sh.enabled; } @@ -1996,10 +2098,6 @@ toEdit.sh.stonalwidth = mods.sh.stonalwidth; } - if (sh.localcontrast) { - toEdit.sh.localcontrast = dontforceSet && options.baBehav[ADDSET_SH_LOCALCONTRAST] ? toEdit.sh.localcontrast + mods.sh.localcontrast : mods.sh.localcontrast; - } - if (sh.radius) { toEdit.sh.radius = mods.sh.radius; } @@ -2172,6 +2270,10 @@ toEdit.vignetting.centerY = dontforceSet && options.baBehav[ADDSET_VIGN_CENTER] ? toEdit.vignetting.centerY + mods.vignetting.centerY : mods.vignetting.centerY; } + if (chmixer.enabled) { + toEdit.chmixer.enabled = mods.chmixer.enabled; + } + for (int i = 0; i < 3; i++) { if (chmixer.red[i]) { toEdit.chmixer.red[i] = dontforceSet && options.baBehav[ADDSET_CHMIXER] ? toEdit.chmixer.red[i] + mods.chmixer.red[i] : mods.chmixer.red[i]; @@ -2506,6 +2608,10 @@ toEdit.raw.bayersensor.pixelShiftLmmse = mods.raw.bayersensor.pixelShiftLmmse; } + if (raw.bayersensor.pixelShiftOneGreen) { + toEdit.raw.bayersensor.pixelShiftOneGreen = mods.raw.bayersensor.pixelShiftOneGreen; + } + if (raw.bayersensor.pixelShiftEqualBright) { toEdit.raw.bayersensor.pixelShiftEqualBright = mods.raw.bayersensor.pixelShiftEqualBright; } @@ -2554,15 +2660,15 @@ toEdit.raw.xtranssensor.blackblue = dontforceSet && options.baBehav[ADDSET_RAWEXPOS_BLACKS] ? toEdit.raw.xtranssensor.blackblue + mods.raw.xtranssensor.blackblue : mods.raw.xtranssensor.blackblue; } - if (raw.caCorrection) { + if (raw.ca_autocorrect) { toEdit.raw.ca_autocorrect = mods.raw.ca_autocorrect; } - if (raw.caRed) { + if (raw.cared) { toEdit.raw.cared = dontforceSet && options.baBehav[ADDSET_RAWCACORR] ? toEdit.raw.cared + mods.raw.cared : mods.raw.cared; } - if (raw.caBlue) { + if (raw.cablue) { toEdit.raw.cablue = dontforceSet && options.baBehav[ADDSET_RAWCACORR] ? toEdit.raw.cablue + mods.raw.cablue : mods.raw.cablue; } @@ -2582,7 +2688,7 @@ toEdit.raw.deadPixelFilter = mods.raw.deadPixelFilter; } - if (raw.hotDeadPixelThresh) { + if (raw.hotdeadpix_thresh) { toEdit.raw.hotdeadpix_thresh = mods.raw.hotdeadpix_thresh; } @@ -2590,7 +2696,7 @@ toEdit.raw.dark_frame = mods.raw.dark_frame; } - if (raw.dfAuto) { + if (raw.df_autoselect) { toEdit.raw.df_autoselect = mods.raw.df_autoselect; } @@ -2991,6 +3097,10 @@ } // if (dirpyrequalizer.algo) toEdit.dirpyrequalizer.algo = mods.dirpyrequalizer.algo; + if (hsvequalizer.enabled) { + toEdit.hsvequalizer.enabled = mods.hsvequalizer.enabled; + } + if (hsvequalizer.hcurve) { toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve; } @@ -3015,6 +3125,9 @@ toEdit.filmSimulation.strength = dontforceSet && options.baBehav[ADDSET_FILMSIMULATION_STRENGTH] ? toEdit.filmSimulation.strength + mods.filmSimulation.strength : mods.filmSimulation.strength; } + if (metadata.mode) { + toEdit.metadata.mode = mods.metadata.mode; + } // Exif changes are added to the existing ones if (exif) @@ -3034,7 +3147,7 @@ return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq && pixelShiftMotion && pixelShiftMotionCorrection && pixelShiftMotionCorrectionMethod && pixelShiftStddevFactorGreen && pixelShiftStddevFactorRed && pixelShiftStddevFactorBlue && pixelShiftEperIso && pixelShiftNreadIso && pixelShiftPrnu && pixelShiftSigma && pixelShiftSum && pixelShiftRedBlueWeight && pixelShiftShowMotion && pixelShiftShowMotionMaskOnly - && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse && pixelShiftEqualBright && pixelShiftEqualBrightChannel + && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse && pixelShiftOneGreen && pixelShiftEqualBright && pixelShiftEqualBrightChannel && linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; } @@ -3045,8 +3158,8 @@ bool RAWParamsEdited::isUnchanged() const { - return bayersensor.isUnchanged() && xtranssensor.isUnchanged() && caCorrection && caRed && caBlue && hotPixelFilter && deadPixelFilter && hotDeadPixelThresh && darkFrame - && dfAuto && ff_file && ff_AutoSelect && ff_BlurRadius && ff_BlurType && exPos && exPreser && ff_AutoClipControl && ff_clipControl; + return bayersensor.isUnchanged() && xtranssensor.isUnchanged() && ca_autocorrect && cared && cablue && hotPixelFilter && deadPixelFilter && hotdeadpix_thresh && darkFrame + && df_autoselect && ff_file && ff_AutoSelect && ff_BlurRadius && ff_BlurType && exPos && exPreser && ff_AutoClipControl && ff_clipControl; } bool LensProfParamsEdited::isUnchanged() const diff -Nru rawtherapee-5.3/rtgui/paramsedited.h rawtherapee-5.4/rtgui/paramsedited.h --- rawtherapee-5.3/rtgui/paramsedited.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/paramsedited.h 2018-03-20 11:04:15.000000000 +0000 @@ -53,6 +53,7 @@ bool expcomp; bool hrenabled; bool method; + bool histmatching; }; class RetinexParamsEdited @@ -100,6 +101,7 @@ class LCurveParamsEdited { public: + bool enabled; bool brightness; bool contrast; bool chromaticity; @@ -115,14 +117,24 @@ bool hhcurve; bool lccurve; bool clcurve; +}; + + +class LocalContrastParamsEdited { +public: bool enabled; - bool method; + bool radius; + bool amount; + bool darkness; + bool lightness; }; + class RGBCurvesParamsEdited { public: + bool enabled; bool lumamode; bool rcurve; bool gcurve; @@ -159,6 +171,10 @@ bool satlow; bool sathigh; bool lumamode; + bool labgridALow; + bool labgridBLow; + bool labgridAHigh; + bool labgridBHigh; }; class SharpenEdgeParamsEdited @@ -229,6 +245,7 @@ { public: + bool enabled; bool method; bool temperature; bool green; @@ -365,6 +382,15 @@ }; +class FattalToneMappingParamsEdited { +public: + bool enabled; + bool threshold; + bool amount; + bool anchor; +}; + + class SHParamsEdited { @@ -375,7 +401,6 @@ bool htonalwidth; bool shadows; bool stonalwidth; - bool localcontrast; bool radius; }; @@ -479,6 +504,7 @@ { public: + bool enabled; bool red[3]; bool green[3]; bool blue[3]; @@ -559,7 +585,6 @@ bool gamma; bool gampos; bool slpos; - bool gamfree; bool freegamma; }; class WaveletParamsEdited @@ -670,6 +695,7 @@ { public: + bool enabled; bool hcurve; bool scurve; bool vcurve; @@ -727,6 +753,7 @@ bool pixelShiftSmooth; bool pixelShiftExp0; bool pixelShiftLmmse; + bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; @@ -756,14 +783,14 @@ BayerSensor bayersensor; XTransSensor xtranssensor; - bool caCorrection; - bool caRed; - bool caBlue; + bool ca_autocorrect; + bool cared; + bool cablue; bool hotPixelFilter; bool deadPixelFilter; - bool hotDeadPixelThresh; + bool hotdeadpix_thresh; bool darkFrame; - bool dfAuto; + bool df_autoselect; bool ff_file; bool ff_AutoSelect; bool ff_BlurRadius; @@ -776,6 +803,13 @@ bool isUnchanged() const; }; + +class MetaDataParamsEdited { +public: + bool mode; +}; + + class ParamsEdited { @@ -783,6 +817,7 @@ GeneralParamsEdited general; ToneCurveParamsEdited toneCurve; LCurveParamsEdited labCurve; + LocalContrastParamsEdited localContrast; RGBCurvesParamsEdited rgbCurves; ColorToningEdited colorToning; RetinexParamsEdited retinex; @@ -800,6 +835,7 @@ DefringeParamsEdited defringe; DirPyrDenoiseParamsEdited dirpyrDenoise; EPDParamsEdited epd; + FattalToneMappingParamsEdited fattal; ImpulseDenoiseParamsEdited impulseDenoise; SHParamsEdited sh; CropParamsEdited crop; @@ -822,6 +858,7 @@ WaveletParamsEdited wavelet; HSVEqualizerParamsEdited hsvequalizer; FilmSimulationParamsEdited filmSimulation; + MetaDataParamsEdited metadata; bool exif; bool iptc; @@ -830,8 +867,5 @@ void set (bool v); void initFrom (const std::vector& src); void combine (rtengine::procparams::ProcParams& toEdit, const rtengine::procparams::ProcParams& mods, bool forceSet); - - bool operator== (const ParamsEdited& other); - bool operator!= (const ParamsEdited& other); }; #endif diff -Nru rawtherapee-5.3/rtgui/partialpastedlg.cc rawtherapee-5.4/rtgui/partialpastedlg.cc --- rawtherapee-5.3/rtgui/partialpastedlg.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/partialpastedlg.cc 2018-03-20 11:04:15.000000000 +0000 @@ -43,50 +43,51 @@ meta ->set_name("PartialPasteHeader"); raw = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWGROUP"))); raw ->set_name("PartialPasteHeader"); - wav = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WAVELETGROUP"))); - wav ->set_name("PartialPasteHeader"); + advanced = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP"))); + advanced ->set_name("PartialPasteHeader"); - // options in basic: + // Basic Settings: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); - retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); + fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); pcvignette = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PCVIGNETTE"))); gradient = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_GRADIENT"))); labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE"))); - colorappearance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORAPP"))); - // options in detail: + // Detail Settings: sharpen = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENING"))); + localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sharpenedge = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENEDGE"))); sharpenmicro = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENMICRO"))); impden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE"))); - dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); + dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); defringe = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE"))); + dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER"))); - // options in wavelet: - wavelet = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EQUALIZER"))); //TODO - rename to wavelet + // Advanced Settings: + retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); + colorappearance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORAPP"))); + wavelet = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EQUALIZER"))); - // options in color: + // Color-Related Settings icm = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMSETTINGS"))); - //gam = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMGAMMA"))); vibrance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIBRANCE"))); chmixer = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXER"))); blackwhite = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXERBW"))); - dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); hsveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HSVEQUALIZER"))); filmSimulation = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMSIMULATION")) ); rgbcurves = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RGBCURVES"))); colortoning = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORTONING"))); - // options in lens: + // Lens-Related Settings distortion = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DISTORTION"))); cacorr = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CACORRECTION"))); vignetting = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIGNETTING"))); lcp = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LENSPROFILE"))); - // options in composition: + // Composition Settings: coarserot = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COARSETRANS"))); finerot = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ROTATION"))); crop = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CROP"))); @@ -95,36 +96,40 @@ perspective = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PERSPECTIVE"))); commonTrans = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COMMONTRANSFORMPARAMS"))); - // options in meta: + // Metadata: + metadata = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_METADATA"))); exifch = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES"))); iptc = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO"))); - // options in raw: - raw_expos = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR"))); - raw_preser = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_PRESER"))); - raw_black = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_BLACK"))); - raw_ca_autocorrect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO"))); - raw_caredblue = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE"))); - raw_hotpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_HOTPIXFILT"))); - raw_deadpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_DEADPIXFILT"))); - raw_linenoise = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE"))); - raw_greenthresh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL"))); + // Raw Settings: raw_method = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD"))); raw_imagenum = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM"))); raw_pixelshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_PIXELSHIFT"))); raw_ccSteps = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_FALSECOLOR"))); raw_dcb_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBITERATIONS"))); raw_dcb_enhance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBENHANCE"))); - //raw_all_enhance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_ALLENHANCE"))); raw_lmmse_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_LMMSEITERATIONS"))); - + //--- + raw_linenoise = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE"))); + raw_greenthresh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL"))); + raw_hotpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_HOTPIXFILT"))); + raw_deadpix_filt = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_DEADPIXFILT"))); + //--- + raw_expos = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR"))); + raw_preser = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_PRESER"))); + raw_black = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_BLACK"))); + //--- df_file = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEFILE"))); df_AutoSelect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEAUTOSELECT"))); + //--- ff_file = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDFILE"))); ff_AutoSelect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDAUTOSELECT"))); - ff_BlurRadius = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS"))); ff_BlurType = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURTYPE"))); + ff_BlurRadius = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS"))); ff_ClipControl = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDCLIPCONTROL"))); + //--- + raw_ca_autocorrect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO"))); + raw_caredblue = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE"))); Gtk::VBox* vboxes[8]; Gtk::HSeparator* hseps[8]; @@ -143,16 +148,16 @@ vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); + vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*pcvignette, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*gradient, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); //DETAIL vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*hseps[1], Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpen, Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*localcontrast, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpenedge, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*sharpenmicro, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2); @@ -164,7 +169,6 @@ vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*hseps[2], Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*icm, Gtk::PACK_SHRINK, 2); - //vboxes[2]->pack_start (*gam, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*vibrance, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2); @@ -192,49 +196,51 @@ vboxes[4]->pack_start (*perspective, Gtk::PACK_SHRINK, 2); vboxes[4]->pack_start (*commonTrans, Gtk::PACK_SHRINK, 2); - //WAVELET - vboxes[5]->pack_start (*wav, Gtk::PACK_SHRINK, 2); + //ADVANCED + vboxes[5]->pack_start (*advanced, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*hseps[5], Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*retinex, Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2); - //RAW - vboxes[6]->pack_start (*raw, Gtk::PACK_SHRINK, 2); + //META + vboxes[6]->pack_start (*meta, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); - //vboxes[6]->pack_start (*raw_all_enhance, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_preser, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); - vboxes[6]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); - vboxes[6]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start(*metadata, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); + vboxes[6]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); - //META - vboxes[7]->pack_start (*meta, Gtk::PACK_SHRINK, 2); + //RAW + vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*hseps[7], Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); - vboxes[7]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_preser, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*df_file, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0); + vboxes[7]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2); Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ()); Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ()); @@ -244,18 +250,18 @@ vbCol1->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 3; i < 6; i++) { + for (int i = 3; i < 7; i++) { vbCol2->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } - for (int i = 6; i < 8; i++) { + for (int i = 7; i < 8; i++) { vbCol3->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2); } Gtk::VBox* vbtop = Gtk::manage (new Gtk::VBox ()); vbtop->pack_start (*everything, Gtk::PACK_SHRINK, 2); - Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2); // TODO replace with get_content_area() with GTK upgrade + Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2); Gtk::HBox* hbmain = Gtk::manage (new Gtk::HBox ()); hbmain->pack_start (*vbCol1); @@ -277,7 +283,7 @@ scrolledwindow->add(*hbmain); - Gtk::Dialog::get_content_area()->pack_start (*scrolledwindow, Gtk::PACK_EXPAND_WIDGET, 2);// TODO replace with get_content_area() with GTK upgrade + Gtk::Dialog::get_content_area()->pack_start (*scrolledwindow, Gtk::PACK_EXPAND_WIDGET, 2); hbmain->show(); scrolledwindow->show (); @@ -292,30 +298,35 @@ compositionConn = composition->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::compositionToggled)); metaConn = meta->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::metaToggled)); rawConn = raw->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::rawToggled)); - wavConn = wav->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::wavToggled)); + advancedConn = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled)); + // Basic Settings wbConn = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); - retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); + fattalConn = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); pcvignetteConn = pcvignette->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); gradientConn = gradient->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); - colorappearanceConn = colorappearance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); + // Detail Settings: sharpenConn = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); gradsharpenConn = sharpenedge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); microcontrastConn = sharpenmicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); impdenConn = impden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); dirpyrdenConn = dirpyrden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); - dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); defringeConn = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); + dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); - waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*wav, &Gtk::CheckButton::set_inconsistent), true)); + // Advanced Settings: + retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); + colorappearanceConn = colorappearance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); + waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); + // Color-related Settings: icmConn = icm->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); - //gamcsconn = gam->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); vibranceConn = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerConn = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerbwConn = blackwhite->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); @@ -324,11 +335,13 @@ rgbcurvesConn = rgbcurves->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); colortoningConn = colortoning->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); + // Lens-Related Settings: distortionConn = distortion->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); cacorrConn = cacorr->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); vignettingConn = vignetting->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); lcpConn = lcp->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); + // Composition Settings: coarserotConn = coarserot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); finerotConn = finerot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); cropConn = crop->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); @@ -337,34 +350,40 @@ perspectiveConn = perspective->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); commonTransConn = commonTrans->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true)); + // Metadata: + metadataConn = metadata->signal_toggled().connect(sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); exifchConn = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); iptcConn = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true)); + // Raw Settings: raw_methodConn = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_imagenumConn = raw_imagenum->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_pixelshiftConn = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_ccStepsConn = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_dcb_iterationsConn = raw_dcb_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_dcb_enhanceConn = raw_dcb_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - //raw_all_enhanceConn = raw_all_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_lmmse_iterationsConn = raw_lmmse_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_pixelshiftConn = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - + //--- + raw_linenoiseConn = raw_linenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_greenthreshConn = raw_greenthresh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_hotpix_filtConn = raw_hotpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_deadpix_filtConn = raw_deadpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- raw_exposConn = raw_expos->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_preserConn = raw_preser->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_blackConn = raw_black->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_ca_autocorrectConn = raw_ca_autocorrect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_caredblueConn = raw_caredblue->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_hotpix_filtConn = raw_hotpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_deadpix_filtConn = raw_deadpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_linenoiseConn = raw_linenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - raw_greenthreshConn = raw_greenthresh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- df_fileConn = df_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); df_AutoSelectConn = df_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- ff_fileConn = ff_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_AutoSelectConn = ff_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); - ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_BlurTypeConn = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + ff_BlurRadiusConn = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); ff_ClipControlConn = ff_ClipControl->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + //--- + raw_ca_autocorrectConn = raw_ca_autocorrect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_caredblueConn = raw_caredblue->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); add_button (M("GENERAL_OK"), Gtk::RESPONSE_OK); add_button (M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); @@ -376,14 +395,14 @@ void PartialPasteDlg::everythingToggled () { - basicConn.block (true); - detailConn.block (true); - colorConn.block (true); - lensConn.block (true); - compositionConn.block (true); - metaConn.block (true); - rawConn.block (true); - wavConn.block (true); + ConnectionBlocker basicBlocker(basicConn); + ConnectionBlocker detailBlocker(detailConn); + ConnectionBlocker colorBlocker(colorConn); + ConnectionBlocker lensBlocker(lensConn); + ConnectionBlocker compositionBlocker(compositionConn); + ConnectionBlocker metaBlocker(metaConn); + ConnectionBlocker rawBlocker(rawConn); + ConnectionBlocker advancedBlocker(advancedConn); everything->set_inconsistent (false); @@ -395,7 +414,7 @@ composition->set_active(everything->get_active()); meta->set_active(everything->get_active()); raw->set_active(everything->get_active()); - wav->set_active(everything->get_active()); + advanced->set_active(everything->get_active()); //toggle group children PartialPasteDlg::basicToggled (); @@ -405,111 +424,74 @@ PartialPasteDlg::compositionToggled (); PartialPasteDlg::metaToggled (); PartialPasteDlg::rawToggled (); - PartialPasteDlg::wavToggled (); - - basicConn.block (false); - detailConn.block (false); - colorConn.block (false); - lensConn.block (false); - compositionConn.block (false); - metaConn.block (false); - rawConn.block (false); - wavConn.block (false); + PartialPasteDlg::advancedToggled (); } void PartialPasteDlg::rawToggled () { - raw_methodConn.block (true); - raw_imagenumConn.block (true); - raw_ccStepsConn.block (true); - raw_dcb_iterationsConn.block (true); - raw_dcb_enhanceConn.block (true); - //raw_all_enhanceConn.block (true); - raw_lmmse_iterationsConn.block (true); - raw_pixelshiftConn.block (true); - raw_exposConn.block (true); - raw_preserConn.block (true); - raw_blackConn.block (true); - raw_ca_autocorrectConn.block (true); - raw_caredblueConn.block (true); - raw_hotpix_filtConn.block (true); - raw_deadpix_filtConn.block (true); - raw_linenoiseConn.block (true); - raw_greenthreshConn.block (true); - df_fileConn.block (true); - df_AutoSelectConn.block (true); - ff_fileConn.block (true); - ff_AutoSelectConn.block (true); - ff_BlurRadiusConn.block (true); - ff_BlurTypeConn.block (true); - ff_ClipControlConn.block (true); + ConnectionBlocker raw_methodBlocker(raw_methodConn); + ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn); + ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); + ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn); + ConnectionBlocker raw_dcb_iterationsBlocker(raw_dcb_iterationsConn); + ConnectionBlocker raw_dcb_enhanceBlocker(raw_dcb_enhanceConn); + ConnectionBlocker raw_lmmse_iterationsBlocker(raw_lmmse_iterationsConn); + ConnectionBlocker raw_linenoiseBlocker(raw_linenoiseConn); + ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn); + ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn); + ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn); + ConnectionBlocker raw_exposBlocker(raw_exposConn); + ConnectionBlocker raw_preserBlocker(raw_preserConn); + ConnectionBlocker raw_blackBlocker(raw_blackConn); + ConnectionBlocker df_fileBlocker(df_fileConn); + ConnectionBlocker df_AutoSelectBlocker(df_AutoSelectConn); + ConnectionBlocker ff_fileBlocker(ff_fileConn); + ConnectionBlocker ff_AutoSelectBlocker(ff_AutoSelectConn); + ConnectionBlocker ff_BlurTypeBlocker(ff_BlurTypeConn); + ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn); + ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn); + ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); + ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); raw->set_inconsistent (false); raw_method->set_active (raw->get_active ()); raw_imagenum->set_active (raw->get_active ()); + raw_pixelshift->set_active (raw->get_active ()); raw_ccSteps->set_active (raw->get_active ()); raw_dcb_iterations->set_active (raw->get_active ()); raw_dcb_enhance->set_active (raw->get_active ()); raw_lmmse_iterations->set_active (raw->get_active ()); - raw_pixelshift->set_active (raw->get_active ()); - //raw_all_enhance->set_active (raw->get_active ()); + raw_linenoise->set_active (raw->get_active ()); + raw_greenthresh->set_active (raw->get_active ()); + raw_hotpix_filt->set_active (raw->get_active ()); + raw_deadpix_filt->set_active (raw->get_active ()); raw_expos->set_active (raw->get_active ()); raw_preser->set_active (raw->get_active ()); raw_black->set_active (raw->get_active ()); - raw_ca_autocorrect->set_active (raw->get_active ()); - raw_caredblue->set_active (raw->get_active ()); - raw_hotpix_filt->set_active (raw->get_active ()); - raw_deadpix_filt->set_active (raw->get_active ()); - raw_linenoise->set_active (raw->get_active ()); - raw_greenthresh->set_active (raw->get_active ()); df_file->set_active (raw->get_active ()); df_AutoSelect->set_active (raw->get_active ()); ff_file->set_active (raw->get_active ()); ff_AutoSelect->set_active (raw->get_active ()); - ff_BlurRadius->set_active (raw->get_active ()); ff_BlurType->set_active (raw->get_active ()); + ff_BlurRadius->set_active (raw->get_active ()); ff_ClipControl->set_active (raw->get_active ()); - - raw_methodConn.block (false); - raw_imagenumConn.block (false); - raw_ccStepsConn.block (false); - raw_dcb_iterationsConn.block (false); - raw_dcb_enhanceConn.block (false); - //raw_all_enhanceConn.block (false); - raw_pixelshiftConn.block (false); - raw_lmmse_iterationsConn.block (false); - raw_exposConn.block (false); - raw_preserConn.block (false); - raw_blackConn.block (false); - raw_ca_autocorrectConn.block (false); - raw_caredblueConn.block (false); - raw_hotpix_filtConn.block (false); - raw_deadpix_filtConn.block (false); - raw_linenoiseConn.block (false); - raw_greenthreshConn.block (false); - df_fileConn.block (false); - df_AutoSelectConn.block (false); - ff_fileConn.block (false); - ff_AutoSelectConn.block (false); - ff_BlurRadiusConn.block (false); - ff_BlurTypeConn.block (false); - ff_ClipControlConn.block (false); + raw_ca_autocorrect->set_active (raw->get_active ()); + raw_caredblue->set_active (raw->get_active ()); } void PartialPasteDlg::basicToggled () { - wbConn.block (true); - exposureConn.block (true); - shConn.block (true); - epdConn.block(true); - pcvignetteConn.block (true); - gradientConn.block (true); - labcurveConn.block (true); - colorappearanceConn.block (true); - retinexConn.block (true); + ConnectionBlocker wbBlocker(wbConn); + ConnectionBlocker exposureBlocker(exposureConn); + ConnectionBlocker shBlocker(shConn); + ConnectionBlocker epdBlocker(epdConn); + ConnectionBlocker fattalBlocker(fattalConn); + ConnectionBlocker pcvignetteBlocker(pcvignetteConn); + ConnectionBlocker gradientBlocker(gradientConn); + ConnectionBlocker labcurveBlocker(labcurveConn); basic->set_inconsistent (false); @@ -517,81 +499,65 @@ exposure->set_active (basic->get_active ()); sh->set_active (basic->get_active ()); epd->set_active (basic->get_active ()); + fattal->set_active (basic->get_active ()); pcvignette->set_active (basic->get_active ()); gradient->set_active (basic->get_active ()); - retinex->set_active (basic->get_active ()); labcurve->set_active (basic->get_active ()); - colorappearance->set_active (basic->get_active ()); - - wbConn.block (false); - exposureConn.block (false); - shConn.block (false); - epdConn.block (false); - pcvignetteConn.block (false); - gradientConn.block (false); - retinexConn.block (false); - - labcurveConn.block (false); - colorappearanceConn.block (false); } void PartialPasteDlg::detailToggled () { - sharpenConn.block (true); - gradsharpenConn.block(true); - microcontrastConn.block(true); - impdenConn.block (true); - dirpyrdenConn.block (true); - defringeConn.block (true); - dirpyreqConn.block (true); + ConnectionBlocker sharpenBlocker(sharpenConn); + ConnectionBlocker localcontrastBlocker(localcontrastConn); + ConnectionBlocker gradsharpenBlocker(gradsharpenConn); + ConnectionBlocker microcontrastBlocker(microcontrastConn); + ConnectionBlocker impdenBlocker(impdenConn); + ConnectionBlocker dirpyrdenBlocker(dirpyrdenConn); + ConnectionBlocker defringeBlocker(defringeConn); + ConnectionBlocker dirpyreqBlocker(dirpyreqConn); detail->set_inconsistent (false); sharpen->set_active (detail->get_active ()); + localcontrast->set_active(detail->get_active()); sharpenedge->set_active (detail->get_active ()); sharpenmicro->set_active (detail->get_active ()); impden->set_active (detail->get_active ()); dirpyrden->set_active (detail->get_active ()); defringe->set_active (detail->get_active ()); dirpyreq->set_active (detail->get_active ()); - - sharpenConn.block (false); - gradsharpenConn.block(false); - microcontrastConn.block(false); - impdenConn.block (false); - dirpyrdenConn.block (false); - defringeConn.block (false); - dirpyreqConn.block (false); } -void PartialPasteDlg::wavToggled () +void PartialPasteDlg::advancedToggled () { - waveletConn.block (true); - - wav->set_inconsistent (false); - wavelet->set_active (wav->get_active ()); - - waveletConn.block (false); + ConnectionBlocker retinexBlocker(retinexConn); + ConnectionBlocker colorappearanceBlocker(colorappearanceConn); + ConnectionBlocker waveletBlocker(waveletConn); + + advanced->set_inconsistent (false); + + retinex->set_active (advanced->get_active ()); + colorappearance->set_active (advanced->get_active ()); + wavelet->set_active (advanced->get_active ()); } void PartialPasteDlg::colorToggled () { - icmConn.block (true); - //gamcsconn.block (true); - vibranceConn.block (true); - chmixerConn.block (true); - chmixerbwConn.block (true); - hsveqConn.block (true); - filmSimulationConn.block (true); - rgbcurvesConn.block (true); - colortoningConn.block (true); + ConnectionBlocker icmBlocker(icmConn); + ConnectionBlocker vibranceBlocker(vibranceConn); + ConnectionBlocker chmixerBlocker(chmixerConn); + ConnectionBlocker chmixerbwBlocker(chmixerbwConn); + ConnectionBlocker hsveqBlocker(hsveqConn); + ConnectionBlocker filmSimulationBlocker(filmSimulationConn); + ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn); + ConnectionBlocker colortoningBlocker(colortoningConn); color->set_inconsistent (false); + icm->set_active (color->get_active ()); - //gam->set_active (color->get_active ()); vibrance->set_active (color->get_active ()); chmixer->set_active (color->get_active ()); blackwhite->set_active (color->get_active ()); @@ -599,25 +565,15 @@ filmSimulation->set_active (color->get_active ()); rgbcurves->set_active (color->get_active ()); colortoning->set_active(color->get_active ()); - - icmConn.block (false); - //gamcsconn.block (false); - vibranceConn.block (false); - chmixerbwConn.block (false); - chmixerConn.block (false); - hsveqConn.block (false); - filmSimulationConn.block (false); - rgbcurvesConn.block (false); - colortoningConn.block (false); } void PartialPasteDlg::lensToggled () { - distortionConn.block (true); - cacorrConn.block (true); - vignettingConn.block (true); - lcpConn.block (true); + ConnectionBlocker distortionBlocker(distortionConn); + ConnectionBlocker cacorrBlocker(cacorrConn); + ConnectionBlocker vignettingBlocker(vignettingConn); + ConnectionBlocker lcpBlocker(lcpConn); lens->set_inconsistent (false); @@ -625,23 +581,18 @@ cacorr->set_active (lens->get_active ()); vignetting->set_active (lens->get_active ()); lcp->set_active (lens->get_active ()); - - distortionConn.block (false); - cacorrConn.block (false); - vignettingConn.block (false); - lcpConn.block (false); } void PartialPasteDlg::compositionToggled () { - coarserotConn.block (true); - finerotConn.block (true); - cropConn.block (true); - resizeConn.block (true); - prsharpeningConn.block (true); - perspectiveConn.block (true); - commonTransConn.block (true); + ConnectionBlocker coarserotBlocker(coarserotConn); + ConnectionBlocker finerotBlocker(finerotConn); + ConnectionBlocker cropBlocker(cropConn); + ConnectionBlocker resizeBlocker(resizeConn); + ConnectionBlocker prsharpeningBlocker(prsharpeningConn); + ConnectionBlocker perspectiveBlocker(perspectiveConn); + ConnectionBlocker commonTransBlocker(commonTransConn); composition->set_inconsistent (false); @@ -652,28 +603,20 @@ prsharpening->set_active (composition->get_active ()); perspective->set_active (composition->get_active ()); commonTrans->set_active (composition->get_active ()); - - coarserotConn.block (false); - finerotConn.block (false); - cropConn.block (false); - resizeConn.block (false); - prsharpeningConn.block (false); - perspectiveConn.block (false); - commonTransConn.block (false); } void PartialPasteDlg::metaToggled () { - exifchConn.block (true); - iptcConn.block (true); + ConnectionBlocker metadataBlocker(metadataConn); + ConnectionBlocker exifchBlocker(exifchConn); + ConnectionBlocker iptcBlocker(iptcConn); + meta->set_inconsistent (false); + metadata->set_active(meta->get_active()); exifch->set_active (meta->get_active ()); iptc->set_active (meta->get_active ()); - - exifchConn.block (false); - iptcConn.block (false); } @@ -703,6 +646,10 @@ filterPE.toneCurve = falsePE.toneCurve; } + if (!localcontrast->get_active()) { + filterPE.localContrast = falsePE.localContrast; + } + if (!sh->get_active ()) { filterPE.sh = falsePE.sh; } @@ -711,6 +658,10 @@ filterPE.epd = falsePE.epd; } + if (!fattal->get_active ()) { + filterPE.fattal = falsePE.fattal; + } + if (!retinex->get_active ()) { filterPE.retinex = falsePE.retinex; } @@ -839,6 +790,10 @@ filterPE.commonTrans = falsePE.commonTrans; } + if (!metadata->get_active()) { + filterPE.metadata = falsePE.metadata; + } + if (!exifch->get_active ()) { filterPE.exif = falsePE.exif; } @@ -935,12 +890,12 @@ } if (!raw_ca_autocorrect->get_active ()) { - filterPE.raw.caCorrection = falsePE.raw.caCorrection; + filterPE.raw.ca_autocorrect = falsePE.raw.ca_autocorrect; } if (!raw_caredblue->get_active ()) { - filterPE.raw.caRed = falsePE.raw.caRed; - filterPE.raw.caBlue = falsePE.raw.caBlue; + filterPE.raw.cared = falsePE.raw.cared; + filterPE.raw.cablue = falsePE.raw.cablue; } if (!raw_hotpix_filt->get_active ()) { @@ -952,7 +907,7 @@ } if (!raw_deadpix_filt->get_active () && !raw_hotpix_filt->get_active ()) { - filterPE.raw.hotDeadPixelThresh = falsePE.raw.hotDeadPixelThresh; + filterPE.raw.hotdeadpix_thresh = falsePE.raw.hotdeadpix_thresh; } if (!df_file->get_active ()) { @@ -960,7 +915,7 @@ } if (!df_AutoSelect->get_active ()) { - filterPE.raw.dfAuto = falsePE.raw.dfAuto; + filterPE.raw.df_autoselect = falsePE.raw.df_autoselect; } if (!ff_file->get_active ()) { diff -Nru rawtherapee-5.3/rtgui/partialpastedlg.h rawtherapee-5.4/rtgui/partialpastedlg.h --- rawtherapee-5.3/rtgui/partialpastedlg.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/partialpastedlg.h 2018-03-20 11:04:15.000000000 +0000 @@ -39,13 +39,15 @@ Gtk::CheckButton* composition; Gtk::CheckButton* meta; Gtk::CheckButton* raw; - Gtk::CheckButton* wav; + Gtk::CheckButton* advanced; // options in basic: Gtk::CheckButton* wb; Gtk::CheckButton* exposure; + Gtk::CheckButton* localcontrast; Gtk::CheckButton* sh; Gtk::CheckButton* epd; + Gtk::CheckButton* fattal; Gtk::CheckButton* retinex; Gtk::CheckButton* pcvignette; Gtk::CheckButton* gradient; @@ -91,6 +93,7 @@ Gtk::CheckButton* commonTrans; // options in meta: + Gtk::CheckButton *metadata; Gtk::CheckButton* exifch; Gtk::CheckButton* iptc; @@ -121,14 +124,14 @@ Gtk::CheckButton* ff_BlurType; Gtk::CheckButton* ff_ClipControl; - sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, wavConn; + sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; - sigc::connection wbConn, exposureConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; - sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, dirpyreqConn, waveletConn, retinexConn; + sigc::connection wbConn, exposureConn, localcontrastConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn; + sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn; sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn; sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn; - sigc::connection exifchConn, iptcConn, icmConn; + sigc::connection metadataConn, exifchConn, iptcConn, icmConn; sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn; sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; @@ -145,7 +148,7 @@ void compositionToggled (); void metaToggled (); void rawToggled (); - void wavToggled (); + void advancedToggled (); }; #endif diff -Nru rawtherapee-5.3/rtgui/ppversion.h rawtherapee-5.4/rtgui/ppversion.h --- rawtherapee-5.3/rtgui/ppversion.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/ppversion.h 2018-03-20 11:04:15.000000000 +0000 @@ -1,14 +1,21 @@ -#ifndef _PPVERSION_ -#define _PPVERSION_ +#pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 327 +#define PPVERSION 331 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes + 331 2018-14-02 + changed wavelet.Lmethod to int + 330 2018-20-01 + Added 'Auto-matched Tone Curve' button, performing histogram matching + 329 2017-12-09 + Added 'Enabled' flag for Channel Mixer, RGB Curves, HSV Equalizer and L*a*b* Adjustments + 328 2017-11-22 + Fix wrong type of ff_clipControl 327 2017-09-15 - [Profiles Lens Correction] Added Lensfun + [Profiled Lens Correction] Added Lensfun 326 2015-07-26 [Exposure] Added 'Perceptual' tone curve mode 325 2015-07-23 @@ -20,7 +27,7 @@ 321 2014-08-17 [Film Simulation] new tool using HALDCLUT files 320 2014-07-02 (yes, same version number... this is an error due to a wrong version number set in comment of previous change) - New [RAW Bayer] and [RAW X-Trans] sections, with some parameters transfered from [RAW] to [RAW Bayer] + New [RAW Bayer] and [RAW X-Trans] sections, with some parameters transferred from [RAW] to [RAW Bayer] 320 2014-03-29 [ColorToning] new tool for color toning 319 2014-02-11 @@ -45,5 +52,3 @@ added [Directional Pyramid Denoising] Method, Redchro, Bluechro added [RGB Curves] LumaMode */ - -#endif diff -Nru rawtherapee-5.3/rtgui/preferences.cc rawtherapee-5.4/rtgui/preferences.cc --- rawtherapee-5.3/rtgui/preferences.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/preferences.cc 2018-03-20 11:04:15.000000000 +0000 @@ -188,6 +188,20 @@ appendBehavList (mi, M ("TP_EXPOSURE_SATURATION"), ADDSET_TC_SATURATION, false); mi = behModel->append (); + mi->set_value (behavColumns.label, M ("TP_EPD_LABEL")); + appendBehavList (mi, M ("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); + appendBehavList (mi, M ("TP_EPD_GAMMA"), ADDSET_EPD_GAMMA, false); + appendBehavList (mi, M ("TP_EPD_EDGESTOPPING"), ADDSET_EPD_EDGESTOPPING, false); + appendBehavList (mi, M ("TP_EPD_SCALE"), ADDSET_EPD_SCALE, false); + appendBehavList (mi, M ("TP_EPD_REWEIGHTINGITERATES"), ADDSET_EPD_REWEIGHTINGITERATES, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M ("TP_TM_FATTAL_LABEL")); + appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_AMOUNT, false); + appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_THRESHOLD, false); + appendBehavList (mi, M ("TP_TM_FATTAL_ANCHOR"), ADDSET_FATTAL_ANCHOR, false); + + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_RETINEX_LABEL")); appendBehavList (mi, M ("TP_RETINEX_STRENGTH"), ADDSET_RETI_STR, false); appendBehavList (mi, M ("TP_RETINEX_NEIGHBOR"), ADDSET_RETI_NEIGH, false); @@ -202,7 +216,6 @@ mi->set_value (behavColumns.label, M ("TP_SHADOWSHLIGHTS_LABEL")); appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false); appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_SHADOWS"), ADDSET_SH_SHADOWS, false); - appendBehavList (mi, M ("TP_SHADOWSHLIGHTS_LOCALCONTR"), ADDSET_SH_LOCALCONTRAST, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_LABCURVE_LABEL")); @@ -219,6 +232,14 @@ appendBehavList (mi, M ("TP_SHARPENING_EDTOLERANCE"), ADDSET_SHARP_EDGETOL, false); appendBehavList (mi, M ("TP_SHARPENING_HALOCONTROL"), ADDSET_SHARP_HALOCTRL, false); + mi = behModel->append(); + mi->set_value(behavColumns.label, M("TP_LOCALCONTRAST_LABEL")); + appendBehavList(mi, M("TP_LOCALCONTRAST_RADIUS"), ADDSET_LOCALCONTRAST_RADIUS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_AMOUNT"), ADDSET_LOCALCONTRAST_AMOUNT, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_DARKNESS"), ADDSET_LOCALCONTRAST_DARKNESS, false); + appendBehavList(mi, M("TP_LOCALCONTRAST_LIGHTNESS"), ADDSET_LOCALCONTRAST_LIGHTNESS, false); + + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_SHARPENEDGE_LABEL")); appendBehavList (mi, M ("TP_SHARPENEDGE_PASSES"), ADDSET_SHARPENEDGE_PASS, false); @@ -232,13 +253,13 @@ mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_DIRPYRDENOISE_LABEL")); //appendBehavList (mi, M("TP_DIRPYRDENOISE_LUMA")+", "+M("TP_DIRPYRDENOISE_CHROMA"), ADDSET_DIRPYRDN_CHLUM, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_LUMA"), ADDSET_DIRPYRDN_LUMA, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_LDETAIL"), ADDSET_DIRPYRDN_LUMDET, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_CHROMA"), ADDSET_DIRPYRDN_CHROMA, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_RED"), ADDSET_DIRPYRDN_CHROMARED, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_BLUE"), ADDSET_DIRPYRDN_CHROMABLUE, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_GAMMA"), ADDSET_DIRPYRDN_GAMMA, true); - appendBehavList (mi, M ("TP_DIRPYRDENOISE_PASSES"), ADDSET_DIRPYRDN_PASSES, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING"), ADDSET_DIRPYRDN_LUMA, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_LUMINANCE_DETAIL"), ADDSET_DIRPYRDN_LUMDET, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_CHROMINANCE_MASTER"), ADDSET_DIRPYRDN_CHROMA, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN"), ADDSET_DIRPYRDN_CHROMARED, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW"), ADDSET_DIRPYRDN_CHROMABLUE, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_MAIN_GAMMA"), ADDSET_DIRPYRDN_GAMMA, true); + appendBehavList (mi, M ("TP_DIRPYRDENOISE_MEDIAN_PASSES"), ADDSET_DIRPYRDN_PASSES, true); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_WBALANCE_LABEL")); @@ -513,57 +534,70 @@ fdp->add (*vbdp); mvbpp->pack_start (*fdp, Gtk::PACK_SHRINK, 4); - Gtk::Frame* fdf = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_DARKFRAME")) ); - Gtk::HBox* hb42 = Gtk::manage (new Gtk::HBox ()); - darkFrameDir = Gtk::manage (new Gtk::FileChooserButton (M ("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + // Directories + Gtk::Frame* cdf = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_DIRECTORIES")) ); + Gtk::Grid* dirgrid = Gtk::manage (new Gtk::Grid ()); + setExpandAlignProperties(dirgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + Gtk::Label *dfLab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_DIRDARKFRAMES") + ":")); - hb42->pack_start (*dfLab, Gtk::PACK_SHRINK, 4 ); - hb42->pack_start (*darkFrameDir, Gtk::PACK_EXPAND_WIDGET, 4); + setExpandAlignProperties(dfLab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + darkFrameDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_DIRDARKFRAMES"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(darkFrameDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); dfLabel = Gtk::manage (new Gtk::Label ("Found:")); - Gtk::VBox* vbdf = Gtk::manage (new Gtk::VBox ()); - vbdf->pack_start (*hb42, Gtk::PACK_SHRINK, 4); - vbdf->pack_start (*dfLabel, Gtk::PACK_SHRINK, 4 ); - fdf->add (*vbdf ); - mvbpp->pack_start (*fdf, Gtk::PACK_SHRINK, 4); + setExpandAlignProperties(dfLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + + dirgrid->attach_next_to(*dfLab, Gtk::POS_TOP, 1, 1); + dirgrid->attach_next_to(*darkFrameDir, *dfLab, Gtk::POS_RIGHT, 1, 1); + dirgrid->attach_next_to(*dfLabel, *darkFrameDir, Gtk::POS_RIGHT, 1, 1); //dfconn = darkFrameDir->signal_file_set().connect ( sigc::mem_fun(*this, &Preferences::darkFrameChanged), true); - dfconn = darkFrameDir->signal_selection_changed().connect ( sigc::mem_fun (*this, &Preferences::darkFrameChanged), true); + dfconn = darkFrameDir->signal_selection_changed().connect ( sigc::mem_fun (*this, &Preferences::darkFrameChanged)); //, true); // FLATFIELD - Gtk::Frame* fff = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_FLATFIELD")) ); - Gtk::HBox* hb43 = Gtk::manage (new Gtk::HBox ()); - flatFieldDir = Gtk::manage (new Gtk::FileChooserButton (M ("PREFERENCES_FLATFIELDSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); Gtk::Label *ffLab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_FLATFIELDSDIR") + ":")); - hb43->pack_start (*ffLab, Gtk::PACK_SHRINK, 4 ); - hb43->pack_start (*flatFieldDir); + setExpandAlignProperties(ffLab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + flatFieldDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_FLATFIELDSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(flatFieldDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); ffLabel = Gtk::manage (new Gtk::Label ("Found:")); - Gtk::VBox* vbff = Gtk::manage (new Gtk::VBox ()); - vbff->pack_start (*hb43, Gtk::PACK_SHRINK, 4); - vbff->pack_start (*ffLabel, Gtk::PACK_SHRINK, 4 ); - fff->add (*vbff ); - mvbpp->pack_start (*fff, Gtk::PACK_SHRINK, 4); + setExpandAlignProperties(ffLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + + dirgrid->attach_next_to(*ffLab, *dfLab, Gtk::POS_BOTTOM, 1, 1); + dirgrid->attach_next_to(*flatFieldDir, *ffLab, Gtk::POS_RIGHT, 1, 1); + dirgrid->attach_next_to(*ffLabel, *flatFieldDir, Gtk::POS_RIGHT, 1, 1); //ffconn = flatFieldDir->signal_file_set().connect ( sigc::mem_fun(*this, &Preferences::flatFieldChanged), true); - ffconn = flatFieldDir->signal_selection_changed().connect ( sigc::mem_fun (*this, &Preferences::flatFieldChanged), true); + ffconn = flatFieldDir->signal_selection_changed().connect ( sigc::mem_fun (*this, &Preferences::flatFieldChanged)); //, true); //Cluts Dir - Gtk::Frame* clutsDirFrame = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_FILMSIMULATION")) ); - Gtk::HBox* clutsDirBox = Gtk::manage (new Gtk::HBox ()); - clutsDir = Gtk::manage (new Gtk::FileChooserButton (M ("PREFERENCES_CLUTSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); Gtk::Label *clutsDirLabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_CLUTSDIR") + ":")); + setExpandAlignProperties(clutsDirLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + clutsDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_CLUTSDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + setExpandAlignProperties(clutsDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); Gtk::Label* clutsRestartNeeded = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); - clutsDirBox->pack_start (*clutsDirLabel, Gtk::PACK_SHRINK, 4 ); - clutsDirBox->pack_start (*clutsDir ); - clutsDirBox->pack_start (*clutsRestartNeeded, Gtk::PACK_SHRINK, 4 ); - clutsDirFrame->add (*clutsDirBox ); - mvbpp->pack_start (*clutsDirFrame, Gtk::PACK_SHRINK, 4 ); - - Gtk::Frame* fmd = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_METADATA"))); - Gtk::VBox* vbmd = Gtk::manage (new Gtk::VBox ()); - ckbTunnelMetaData = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_TUNNELMETADATA"))); - vbmd->pack_start (*ckbTunnelMetaData, Gtk::PACK_SHRINK, 4); - fmd->add (*vbmd); - mvbpp->pack_start (*fmd, Gtk::PACK_SHRINK, 4); + setExpandAlignProperties(clutsRestartNeeded, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + + dirgrid->attach_next_to(*clutsDirLabel, *ffLab, Gtk::POS_BOTTOM, 1, 1); + dirgrid->attach_next_to(*clutsDir, *clutsDirLabel, Gtk::POS_RIGHT, 1, 1); + dirgrid->attach_next_to(*clutsRestartNeeded, *clutsDir, Gtk::POS_RIGHT, 1, 1); + + cdf->add(*dirgrid); + mvbpp->pack_start (*cdf, Gtk::PACK_SHRINK, 4 ); + + // Crop + Gtk::Frame *cropframe = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CROP"))); + Gtk::VBox *cropvb = Gtk::manage(new Gtk::VBox()); + Gtk::HBox *crophb = Gtk::manage(new Gtk::HBox()); + cropGuides = Gtk::manage(new Gtk::ComboBoxText()); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_NONE")); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_FRAME")); + cropGuides->append(M("PREFERENCES_CROP_GUIDES_FULL")); + crophb->pack_start(*Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ")), Gtk::PACK_SHRINK, 4); + crophb->pack_start(*cropGuides); + cropvb->pack_start(*crophb); + cropAutoFit = Gtk::manage(new Gtk::CheckButton(M("PREFERENCES_CROP_AUTO_FIT"))); + cropvb->pack_start(*cropAutoFit); + cropframe->add(*cropvb); + mvbpp->pack_start(*cropframe, Gtk::PACK_SHRINK, 4); return mvbpp; } @@ -715,7 +749,7 @@ Gtk::VBox* mvbcm = Gtk::manage (new Gtk::VBox ()); mvbcm->set_spacing (4); - iccDir = Gtk::manage (new Gtk::FileChooserButton (M ("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); + iccDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); setExpandAlignProperties (iccDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); Gtk::Label* pdlabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_ICCDIR") + ":", Gtk::ALIGN_START)); setExpandAlignProperties (pdlabel, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -724,8 +758,12 @@ setExpandAlignProperties (iccdgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); iccdgrid->set_column_spacing (4); + Gtk::Label* monProfileRestartNeeded = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); + setExpandAlignProperties(monProfileRestartNeeded, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + iccdgrid->attach (*pdlabel, 0, 0, 1, 1); iccdgrid->attach (*iccDir, 1, 0, 1, 1); + iccdgrid->attach (*monProfileRestartNeeded, 2, 0, 1, 1); iccDir->signal_selection_changed ().connect (sigc::mem_fun (this, &Preferences::iccDirChanged)); @@ -972,23 +1010,24 @@ ckbHistogramPositionLeft = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_HISTOGRAMPOSITIONLEFT")) ); setExpandAlignProperties (ckbHistogramPositionLeft, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - ckbHistogramWorking = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_HISTOGRAMWORKING")) ); - setExpandAlignProperties (ckbHistogramWorking, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - ckbHistogramWorking->set_tooltip_markup (M ("PREFERENCES_HISTOGRAM_TOOLTIP")); workflowGrid->attach_next_to (*ckbHistogramPositionLeft, *curveBBoxPosL, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*ckbHistogramWorking, *curveBBoxPosC, Gtk::POS_BOTTOM, 2, 1); ckbFileBrowserToolbarSingleRow = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_FILEBROWSERTOOLBARSINGLEROW")) ); setExpandAlignProperties (ckbFileBrowserToolbarSingleRow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); ckbShowFilmStripToolBar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_SHOWFILMSTRIPTOOLBAR")) ); setExpandAlignProperties (ckbShowFilmStripToolBar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); workflowGrid->attach_next_to (*ckbFileBrowserToolbarSingleRow, *ckbHistogramPositionLeft, Gtk::POS_BOTTOM, 1, 1); - workflowGrid->attach_next_to (*ckbShowFilmStripToolBar, *ckbHistogramWorking, Gtk::POS_BOTTOM, 2, 1); + workflowGrid->attach_next_to (*ckbShowFilmStripToolBar, *curveBBoxPosC, Gtk::POS_BOTTOM, 2, 1); Gtk::Label* hb4label = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_TP_LABEL")) ); setExpandAlignProperties (hb4label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); ckbHideTPVScrollbar = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_VSCROLLBAR")) ); setExpandAlignProperties (ckbHideTPVScrollbar, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); +#if defined(__linux__) && ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION > 18) || GTK_MAJOR_VERSION > 3) + // Cannot scroll toolbox with mousewheel when HideTPVScrollbar=true #3413 + ckbHideTPVScrollbar->set_active(false); + ckbHideTPVScrollbar->set_sensitive(false); +#endif ckbUseIconNoText = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_TP_USEICONORTEXT")) ); setExpandAlignProperties (ckbUseIconNoText, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); workflowGrid->attach_next_to (*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); @@ -1202,7 +1241,7 @@ edPS = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_PSPATH") + ":")); setExpandAlignProperties (edPS, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - psDir = Gtk::manage ( new Gtk::FileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); + psDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); setExpandAlignProperties (psDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); externaleditorGrid->attach_next_to (*edPS, *edGimp, Gtk::POS_BOTTOM, 1, 1); externaleditorGrid->attach_next_to (*psDir, *edPS, Gtk::POS_RIGHT, 1, 1); @@ -1213,7 +1252,7 @@ #elif defined WIN32 edGimp = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_GIMPPATH") + ":") ); setExpandAlignProperties (edGimp, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - gimpDir = Gtk::manage ( new Gtk::FileChooserButton (M ("PREFERENCES_GIMPPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); + gimpDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_GIMPPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); setExpandAlignProperties (gimpDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); externaleditorGrid->attach_next_to (*edGimp, Gtk::POS_TOP, 1, 1); externaleditorGrid->attach_next_to (*gimpDir, *edGimp, Gtk::POS_RIGHT, 1, 1); @@ -1221,7 +1260,7 @@ edPS = Gtk::manage ( new Gtk::RadioButton (M ("PREFERENCES_PSPATH") + ":") ); setExpandAlignProperties (edPS, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - psDir = Gtk::manage ( new Gtk::FileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); + psDir = Gtk::manage ( new MyFileChooserButton (M ("PREFERENCES_PSPATH"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER) ); setExpandAlignProperties (psDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); externaleditorGrid->attach_next_to (*edPS, *edGimp, Gtk::POS_BOTTOM, 1, 1); externaleditorGrid->attach_next_to (*psDir, *edPS, Gtk::POS_RIGHT, 1, 1); @@ -1739,7 +1778,6 @@ // moptions.rtSettings.viewinggreySc = greySc->get_active_row_number (); // moptions.rtSettings.autocielab = cbAutocielab->get_active (); moptions.rtSettings.ciecamfloat = cbciecamfloat->get_active (); - moptions.rtSettings.HistogramWorking = ckbHistogramWorking->get_active (); moptions.rtSettings.leveldnv = dnv->get_active_row_number (); moptions.rtSettings.leveldnti = dnti->get_active_row_number (); moptions.rtSettings.leveldnliss = dnliss->get_active_row_number (); @@ -1785,8 +1823,6 @@ moptions.paramsLoadLocation = (PPLoadLocation)loadParamsPreference->get_active_row_number (); moptions.useBundledProfiles = useBundledProfiles->get_active (); - moptions.tunnelMetaData = ckbTunnelMetaData->get_active (); - moptions.rtSettings.darkFramesPath = darkFrameDir->get_filename(); moptions.rtSettings.flatFieldsPath = flatFieldDir->get_filename(); @@ -1825,6 +1861,9 @@ moptions.sndLngEditProcDone = txtSndLngEditProcDone->get_text (); moptions.sndLngEditProcDoneSecs = spbSndLngEditProcDoneSecs->get_value (); #endif + + moptions.cropGuides = Options::CropGuidesMode(cropGuides->get_active_row_number()); + moptions.cropAutoFit = cropAutoFit->get_active(); } void Preferences::fillPreferences () @@ -1910,7 +1949,6 @@ // cbAutocielab->set_active (moptions.rtSettings.autocielab); cbciecamfloat->set_active (moptions.rtSettings.ciecamfloat); - ckbHistogramWorking->set_active (moptions.rtSettings.HistogramWorking); languages->set_active_text (moptions.language); ckbLangAutoDetect->set_active (moptions.languageAutoDetect); int themeNbr = getThemeRowNumber (moptions.theme); @@ -2015,8 +2053,6 @@ loadParamsPreference->set_active (moptions.paramsLoadLocation); useBundledProfiles->set_active (moptions.useBundledProfiles); - ckbTunnelMetaData->set_active (moptions.tunnelMetaData); - if (!moptions.tabbedUI) { editorLayout->set_active (moptions.mainNBVertical ? 1 : 0); } else { @@ -2058,6 +2094,9 @@ } } + cropGuides->set_active(moptions.cropGuides); + cropAutoFit->set_active(moptions.cropAutoFit); + addc.block (false); setc.block (false); cpfconn.block (false); @@ -2142,7 +2181,7 @@ { // set the initial theme back if (themeFNames.at (theme->get_active_row_number ()).longFName != options.theme) { - rtengine::setPaths (options); + rtengine::setPaths(); RTImage::updateImages(); switchThemeTo (options.theme); } @@ -2200,7 +2239,7 @@ { moptions.theme = themeFNames.at (theme->get_active_row_number ()).longFName; - rtengine::setPaths (moptions); + rtengine::setPaths(); RTImage::updateImages(); switchThemeTo (moptions.theme); } diff -Nru rawtherapee-5.3/rtgui/preferences.h rawtherapee-5.4/rtgui/preferences.h --- rawtherapee-5.3/rtgui/preferences.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/preferences.h 2018-03-20 11:04:15.000000000 +0000 @@ -89,15 +89,15 @@ Gtk::RadioButton* sdlast; Gtk::RadioButton* sdhome; Gtk::RadioButton* sdother; - Gtk::FileChooserButton* gimpDir; - Gtk::FileChooserButton* psDir; + MyFileChooserButton* gimpDir; + MyFileChooserButton* psDir; Gtk::Entry* editorToSendTo; Gtk::RadioButton* edGimp; Gtk::RadioButton* edPS; Gtk::RadioButton* edOther; - Gtk::FileChooserButton* darkFrameDir; - Gtk::FileChooserButton* flatFieldDir; - Gtk::FileChooserButton* clutsDir; + MyFileChooserButton* darkFrameDir; + MyFileChooserButton* flatFieldDir; + MyFileChooserButton* clutsDir; Gtk::Label *dfLabel; Gtk::Label *ffLabel; @@ -105,7 +105,7 @@ Gtk::CheckButton* showBasicExif; Gtk::CheckButton* showExpComp; - Gtk::FileChooserButton* iccDir; + MyFileChooserButton* iccDir; Gtk::ComboBoxText* prtProfile; Gtk::ComboBoxText* prtIntent; Gtk::CheckButton* prtBPC; @@ -188,14 +188,12 @@ Gtk::Entry* txtSndLngEditProcDone; Gtk::SpinButton* spbSndLngEditProcDoneSecs; - Gtk::CheckButton* ckbTunnelMetaData; Gtk::CheckButton* ckbInternalThumbIfUntouched; Gtk::Entry* txtCustProfBuilderPath; Gtk::ComboBoxText* custProfBuilderLabelType; Gtk::CheckButton* ckbHistogramPositionLeft; - Gtk::CheckButton* ckbHistogramWorking; Gtk::CheckButton* ckbFileBrowserToolbarSingleRow; Gtk::CheckButton* ckbShowFilmStripToolBar; Gtk::CheckButton* ckbHideTPVScrollbar; @@ -206,6 +204,9 @@ DynamicProfilePanel *dynProfilePanel; + Gtk::ComboBoxText *cropGuides; + Gtk::CheckButton *cropAutoFit; + Glib::ustring storedValueRaw; Glib::ustring storedValueImg; diff -Nru rawtherapee-5.3/rtgui/preprocess.cc rawtherapee-5.4/rtgui/preprocess.cc --- rawtherapee-5.3/rtgui/preprocess.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/preprocess.cc 2018-03-20 11:04:15.000000000 +0000 @@ -81,7 +81,7 @@ pp->raw.hotdeadpix_thresh = hdThreshold->getIntValue(); if (pedited) { - pedited->raw.hotDeadPixelThresh = hdThreshold->getEditedState (); + pedited->raw.hotdeadpix_thresh = hdThreshold->getEditedState (); pedited->raw.hotPixelFilter = !hotPixel->get_inconsistent(); pedited->raw.deadPixelFilter = !deadPixel->get_inconsistent(); } diff -Nru rawtherapee-5.3/rtgui/previewwindow.cc rawtherapee-5.4/rtgui/previewwindow.cc --- rawtherapee-5.3/rtgui/previewwindow.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/previewwindow.cc 2018-03-20 11:04:15.000000000 +0000 @@ -86,7 +86,18 @@ cc->fill(); if (previewHandler->getCropParams().enabled) { - drawCrop (cc, imgX, imgY, imgW, imgH, 0, 0, zoom, previewHandler->getCropParams(), true, false); + rtengine::CropParams cparams = previewHandler->getCropParams(); + switch (options.cropGuides) { + case Options::CROP_GUIDE_NONE: + cparams.guide = "None"; + break; + case Options::CROP_GUIDE_FRAME: + cparams.guide = "Frame"; + break; + default: + break; + } + drawCrop (cc, imgX, imgY, imgW, imgH, 0, 0, zoom, cparams, true, false); } } } diff -Nru rawtherapee-5.3/rtgui/profilepanel.cc rawtherapee-5.4/rtgui/profilepanel.cc --- rawtherapee-5.3/rtgui/profilepanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/profilepanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -26,12 +26,12 @@ using namespace rtengine; using namespace rtengine::procparams; -PartialPasteDlg* ProfilePanel::partialProfileDlg; +PartialPasteDlg* ProfilePanel::partialProfileDlg = nullptr; +Gtk::Window* ProfilePanel::parent; - -void ProfilePanel::init (Gtk::Window* parent) +void ProfilePanel::init (Gtk::Window* parentWindow) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + parent = parentWindow; } void ProfilePanel::cleanup () @@ -336,6 +336,9 @@ if (toSave) { if (event->state & Gdk::CONTROL_MASK) { // opening the partial paste dialog window + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); int i = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -407,6 +410,9 @@ if (toSave) { if (event->state & Gdk::CONTROL_MASK) { // opening the partial paste dialog window + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->set_title(M("PROFILEPANEL_COPYPPASTE")); int i = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -475,6 +481,9 @@ if (event->state & Gdk::CONTROL_MASK) { // opening the partial paste dialog window + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->set_title(M("PROFILEPANEL_LOADPPASTE")); int i = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -514,6 +523,9 @@ if (event->state & Gdk::CONTROL_MASK) // custom.pparams = loadedFile.pparams filtered by ( loadedFile.pedited & partialPaste.pedited ) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->applyPaste (custom->pparams, !fillMode->get_active() ? custom->pedited : nullptr, &pp, &pe); } else { // custom.pparams = loadedFile.pparams filtered by ( loadedFile.pedited ) @@ -551,6 +563,9 @@ } if (event->state & Gdk::CONTROL_MASK) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->set_title(M("PROFILEPANEL_PASTEPPASTE")); int i = partialProfileDlg->run(); partialProfileDlg->hide(); @@ -613,6 +628,9 @@ if (event->state & Gdk::CONTROL_MASK) // custom.pparams = clipboard.pparams filtered by ( clipboard.pedited & partialPaste.pedited ) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->applyPaste (custom->pparams, !fillMode->get_active() ? custom->pedited : nullptr, &pp, &pe); } else { // custom.pparams = clipboard.pparams filtered by ( clipboard.pedited ) @@ -626,6 +644,9 @@ if (event->state & Gdk::CONTROL_MASK) // custom.pparams = clipboard.pparams filtered by ( partialPaste.pedited ) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } partialProfileDlg->applyPaste (custom->pparams, nullptr, &pp, nullptr); } else { // custom.pparams = clipboard.pparams non filtered diff -Nru rawtherapee-5.3/rtgui/profilepanel.h rawtherapee-5.4/rtgui/profilepanel.h --- rawtherapee-5.3/rtgui/profilepanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/profilepanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -66,7 +66,7 @@ ProfileChangeListener* tpc; bool dontupdate; sigc::connection changeconn; - + static Gtk::Window* parent; void changeTo (const rtengine::procparams::PartialProfile* newpp, Glib::ustring profname); public: @@ -79,7 +79,7 @@ tpc = ppl; } - static void init (Gtk::Window* parent); + static void init (Gtk::Window* parentWindow); static void cleanup (); void storeCurrentValue(); void updateProfileList (); diff -Nru rawtherapee-5.3/rtgui/rawcacorrection.cc rawtherapee-5.4/rtgui/rawcacorrection.cc --- rawtherapee-5.3/rtgui/rawcacorrection.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rawcacorrection.cc 2018-03-20 11:04:15.000000000 +0000 @@ -61,9 +61,9 @@ disableListener (); if(pedited ) { - caAutocorrect->setEdited(pedited->raw.caCorrection); - caRed->setEditedState( pedited->raw.caRed ? Edited : UnEdited ); - caBlue->setEditedState( pedited->raw.caBlue ? Edited : UnEdited ); + caAutocorrect->setEdited(pedited->raw.ca_autocorrect); + caRed->setEditedState( pedited->raw.cared ? Edited : UnEdited ); + caBlue->setEditedState( pedited->raw.cablue ? Edited : UnEdited ); } // disable Red and Blue sliders when caAutocorrect is enabled @@ -84,9 +84,9 @@ pp->raw.cablue = caBlue->getValue(); if (pedited) { - pedited->raw.caCorrection = !caAutocorrect->get_inconsistent(); - pedited->raw.caRed = caRed->getEditedState (); - pedited->raw.caBlue = caBlue->getEditedState (); + pedited->raw.ca_autocorrect = !caAutocorrect->get_inconsistent(); + pedited->raw.cared = caRed->getEditedState (); + pedited->raw.cablue = caBlue->getEditedState (); } } @@ -132,8 +132,8 @@ caBlue->setDefault( defParams->raw.cablue); if (pedited) { - caRed->setDefaultEditedState( pedited->raw.caRed ? Edited : UnEdited); - caBlue->setDefaultEditedState( pedited->raw.caBlue ? Edited : UnEdited); + caRed->setDefaultEditedState( pedited->raw.cared ? Edited : UnEdited); + caBlue->setDefaultEditedState( pedited->raw.cablue ? Edited : UnEdited); } else { caRed->setDefaultEditedState( Irrelevant ); caBlue->setDefaultEditedState( Irrelevant ); diff -Nru rawtherapee-5.3/rtgui/retinex.cc rawtherapee-5.4/rtgui/retinex.cc --- rawtherapee-5.3/rtgui/retinex.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/retinex.cc 2018-03-20 11:04:15.000000000 +0000 @@ -380,14 +380,15 @@ Gtk::Grid *tranGrid = Gtk::manage (new Gtk::Grid()); setExpandAlignProperties (tranGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + const RetinexParams default_params; + // Transmission map curve transmissionCurveEditorG = new CurveEditorGroup (options.lastRetinexDir, M ("TP_RETINEX_TRANSMISSION")); setExpandAlignProperties (transmissionCurveEditorG, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); transmissionCurveEditorG->setCurveListener (this); - rtengine::RetinexParams::getDefaulttransmissionCurve (defaultCurve); transmissionShape = static_cast (transmissionCurveEditorG->addCurve (CT_Flat, "", nullptr, false, false)); transmissionShape->setIdentityValue (0.); - transmissionShape->setResetCurve (FlatCurveType (defaultCurve.at (0)), defaultCurve); + transmissionShape->setResetCurve (FlatCurveType (default_params.transmissionCurve.at (0)), default_params.transmissionCurve); // transmissionShape->setBottomBarBgGradient(milestones); transmissionCurveEditorG->curveListComplete(); transmissionCurveEditorG->set_tooltip_markup (M ("TP_RETINEX_TRANSMISSION_TOOLTIP")); @@ -439,10 +440,9 @@ gaintransmissionCurve = new CurveEditorGroup (options.lastRetinexDir, M ("TP_RETINEX_GAINTRANSMISSION")); setExpandAlignProperties (gaintransmissionCurve, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); gaintransmissionCurve->setCurveListener (this); - rtengine::RetinexParams::getDefaultgaintransmissionCurve (defaultCurve); gaintransmissionShape = static_cast (gaintransmissionCurve->addCurve (CT_Flat, "", nullptr, false, false)); gaintransmissionShape->setIdentityValue (0.); - gaintransmissionShape->setResetCurve (FlatCurveType (defaultCurve.at (0)), defaultCurve); + gaintransmissionShape->setResetCurve (FlatCurveType (default_params.gaintransmissionCurve.at (0)), default_params.gaintransmissionCurve); //gaintransmissionShape->setBottomBarBgGradient(milestones); gaintransmissionCurve->set_tooltip_markup (M ("TP_RETINEX_GAINTRANSMISSION_TOOLTIP")); gaintransmissionCurve->curveListComplete(); diff -Nru rawtherapee-5.3/rtgui/rgbcurves.cc rawtherapee-5.4/rtgui/rgbcurves.cc --- rawtherapee-5.3/rtgui/rgbcurves.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rgbcurves.cc 2018-03-20 11:04:15.000000000 +0000 @@ -21,7 +21,7 @@ using namespace rtengine; using namespace rtengine::procparams; -RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL")) +RGBCurves::RGBCurves () : FoldableToolPanel(this, "rgbcurves", M("TP_RGBCURVES_LABEL"), false, true) { lumamode = Gtk::manage (new Gtk::CheckButton (M("TP_RGBCURVES_LUMAMODE"))); @@ -84,6 +84,7 @@ Gshape->setUnChanged (!pedited->rgbCurves.gcurve); Bshape->setUnChanged (!pedited->rgbCurves.bcurve); lumamode->set_inconsistent (!pedited->rgbCurves.lumamode); + set_inconsistent(multiImage && !pedited->rgbCurves.enabled); } lumamodeConn.block (true); @@ -96,6 +97,8 @@ Gshape->setCurve (pp->rgbCurves.gcurve); Bshape->setCurve (pp->rgbCurves.bcurve); + setEnabled(pp->rgbCurves.enabled); + enableListener (); } @@ -122,13 +125,14 @@ void RGBCurves::write (ProcParams* pp, ParamsEdited* pedited) { - + pp->rgbCurves.enabled = getEnabled(); pp->rgbCurves.rcurve = Rshape->getCurve (); pp->rgbCurves.gcurve = Gshape->getCurve (); pp->rgbCurves.bcurve = Bshape->getCurve (); pp->rgbCurves.lumamode = lumamode->get_active(); if (pedited) { + pedited->rgbCurves.enabled = !get_inconsistent(); pedited->rgbCurves.rcurve = !Rshape->isUnChanged (); pedited->rgbCurves.gcurve = !Gshape->isUnChanged (); pedited->rgbCurves.bcurve = !Bshape->isUnChanged (); @@ -146,7 +150,7 @@ void RGBCurves::curveChanged (CurveEditor* ce) { - if (listener) { + if (listener && getEnabled()) { if (ce == Rshape) { listener->panelChanged (EvRGBrCurve, M("HISTORY_CUSTOMCURVE")); } @@ -177,7 +181,7 @@ lastLumamode = lumamode->get_active (); } - if (listener) { + if (listener && getEnabled()) { if (lumamode->get_active ()) { listener->panelChanged (EvRGBrCurveLumamode, M("GENERAL_ENABLED")); } else { @@ -202,3 +206,16 @@ // Bshape->updateBackgroundHistogram (histBlue); } + +void RGBCurves::enabledChanged() +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvRGBEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvRGBEnabled, M("GENERAL_DISABLED")); + } + } +} diff -Nru rawtherapee-5.3/rtgui/rgbcurves.h rawtherapee-5.4/rtgui/rgbcurves.h --- rawtherapee-5.3/rtgui/rgbcurves.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rgbcurves.h 2018-03-20 11:04:15.000000000 +0000 @@ -53,6 +53,7 @@ void curveChanged (CurveEditor* ce); void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI); void lumamodeChanged (); + void enabledChanged(); }; #endif diff -Nru rawtherapee-5.3/rtgui/rtimage.cc rawtherapee-5.4/rtgui/rtimage.cc --- rawtherapee-5.3/rtgui/rtimage.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rtimage.cc 2018-03-20 11:04:15.000000000 +0000 @@ -28,7 +28,7 @@ namespace { -std::map> pixbufCache; +std::map> pixbufCache; } diff -Nru rawtherapee-5.3/rtgui/rtwindow.cc rawtherapee-5.4/rtgui/rtwindow.cc --- rawtherapee-5.3/rtgui/rtwindow.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rtwindow.cc 2018-03-20 11:04:15.000000000 +0000 @@ -93,14 +93,19 @@ WhiteBalance::init(); ProfilePanel::init (this); - Glib::ustring fName = "rt-logo-small.png"; - Glib::ustring fullPath = rtengine::findIconAbsolutePath (fName); - +#ifndef WIN32 + const std::vector> appIcons = { + RTImage::createFromFile("rt-logo-tiny.png"), + RTImage::createFromFile("rt-logo-small.png"), + RTImage::createFromFile("rt-logo-medium.png"), + RTImage::createFromFile("rt-logo-large.png") + }; try { - set_default_icon_from_file (fullPath); + set_default_icon_list(appIcons); } catch (Glib::Exception& ex) { printf ("%s\n", ex.what().c_str()); } +#endif #if defined(__APPLE__) { @@ -321,6 +326,7 @@ vMajor.emplace_back(v, 0, v.find_first_not_of("0123456789.")); } + bool waitForSplash = false; if (vMajor.size() == 2 && vMajor[0] != vMajor[1]) { // Update the version parameter with the right value options.version = versionString; @@ -330,6 +336,7 @@ splash->signal_delete_event().connect ( sigc::mem_fun (*this, &RTWindow::splashClosed) ); if (splash->hasReleaseNotes()) { + waitForSplash = true; splash->showReleaseNotes(); splash->show (); } else { @@ -337,6 +344,36 @@ splash = nullptr; } } + + if (!waitForSplash) { + showErrors(); + } +} + +void RTWindow::showErrors() +{ + // alerting users if the default raw and image profiles are missing + if (options.is_defProfRawMissing()) { + options.defProfRaw = DEFPROFILE_RAW; + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_DEFRAW_MISSING"), options.defProfRaw), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + } + if (options.is_bundledDefProfRawMissing()) { + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_BUNDLED_MISSING"), options.defProfRaw), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + options.defProfRaw = DEFPROFILE_INTERNAL; + } + + if (options.is_defProfImgMissing()) { + options.defProfImg = DEFPROFILE_IMG; + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_DEFIMG_MISSING"), options.defProfImg), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + } + if (options.is_bundledDefProfImgMissing()) { + Gtk::MessageDialog msgd (*this, Glib::ustring::compose (M ("OPTIONS_BUNDLED_MISSING"), options.defProfImg), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + options.defProfImg = DEFPROFILE_INTERNAL; + } } bool RTWindow::on_configure_event (GdkEventConfigure* event) @@ -875,6 +912,7 @@ { delete splash; splash = nullptr; + showErrors(); return true; } diff -Nru rawtherapee-5.3/rtgui/rtwindow.h rawtherapee-5.4/rtgui/rtwindow.h --- rawtherapee-5.3/rtgui/rtwindow.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/rtwindow.h 2018-03-20 11:04:15.000000000 +0000 @@ -59,6 +59,7 @@ bool splashClosed (GdkEventAny* event); bool isEditorPanel (Widget* panel); bool isEditorPanel (guint pageNum); + void showErrors (); Glib::ustring versionStr; #if defined(__APPLE__) diff -Nru rawtherapee-5.3/rtgui/saveasdlg.cc rawtherapee-5.4/rtgui/saveasdlg.cc --- rawtherapee-5.3/rtgui/saveasdlg.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/saveasdlg.cc 2018-03-20 11:04:15.000000000 +0000 @@ -280,8 +280,6 @@ void SaveAsDialog::cancelPressed () { - - fname = fchooser->get_filename(); response (Gtk::RESPONSE_CANCEL); } @@ -297,9 +295,9 @@ } } -void SaveAsDialog::setInitialFileName (Glib::ustring fname) +void SaveAsDialog::setInitialFileName (const Glib::ustring& fname) { - + this->fname = fname; fchooser->set_current_name(fname); } diff -Nru rawtherapee-5.3/rtgui/saveasdlg.h rawtherapee-5.4/rtgui/saveasdlg.h --- rawtherapee-5.3/rtgui/saveasdlg.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/saveasdlg.h 2018-03-20 11:04:15.000000000 +0000 @@ -57,7 +57,7 @@ bool getToTailOfQueue (); int getSaveMethodNum (); - void setInitialFileName (Glib::ustring iname); + void setInitialFileName (const Glib::ustring& iname); void setImagePath (const Glib::ustring& imagePath); void okPressed (); diff -Nru rawtherapee-5.3/rtgui/saveformatpanel.cc rawtherapee-5.4/rtgui/saveformatpanel.cc --- rawtherapee-5.3/rtgui/saveformatpanel.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/saveformatpanel.cc 2018-03-20 11:04:15.000000000 +0000 @@ -40,14 +40,16 @@ format->append ("JPEG (8 bit)"); format->append ("TIFF (8 bit)"); format->append ("TIFF (16 bit)"); + format->append ("TIFF (32 bit float)"); format->append ("PNG (8 bit)"); format->append ("PNG (16 bit)"); fstr[0] = "jpg"; fstr[1] = "tif"; fstr[2] = "tif"; - fstr[3] = "png"; + fstr[3] = "tif"; fstr[4] = "png"; + fstr[5] = "png"; hb1->attach (*flab, 0, 0, 1, 1); hb1->attach (*format, 1, 0, 1, 1); @@ -82,15 +84,6 @@ jpegOpts->attach(*jpegSubSamp, 1, 1, 1, 1); jpegOpts->show_all (); - // --------------------- PNG OPTIONS - - - pngCompr = new Adjuster (M("SAVEDLG_PNGCOMPR"), 0, 6, 1, 6); - setExpandAlignProperties(pngCompr, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - pngCompr->setAdjusterListener (this); - pngCompr->show_all (); - - // --------------------- TIFF OPTIONS @@ -113,13 +106,11 @@ attach (*hb1, 0, 0, 1, 1); attach (*jpegOpts, 0, 1, 1, 1); attach (*tiffUncompressed, 0, 2, 1, 1); - attach (*pngCompr, 0, 3, 1, 1); attach (*savesPP, 0, 4, 1, 2); } SaveFormatPanel::~SaveFormatPanel () { delete jpegQual; - delete pngCompr; delete tiffUncompressed; } @@ -132,8 +123,10 @@ if (sf.format == "jpg") { format->set_active (0); } else if (sf.format == "png" && sf.pngBits == 16) { - format->set_active (4); + format->set_active (5); } else if (sf.format == "png" && sf.pngBits == 8) { + format->set_active (4); + } else if (sf.format == "tif" && sf.tiffBits == 32) { format->set_active (3); } else if (sf.format == "tif" && sf.tiffBits == 16) { format->set_active (2); @@ -143,7 +136,6 @@ jpegSubSamp->set_active (sf.jpegSubSamp - 1); - pngCompr->setValue (sf.pngCompression); jpegQual->setValue (sf.jpegQuality); savesPP->set_active (sf.saveParams); tiffUncompressed->set_active (sf.tiffUncompressed); @@ -158,7 +150,7 @@ int sel = format->get_active_row_number(); sf.format = fstr[sel]; - if (sel == 4) { + if (sel == 5) { sf.pngBits = 16; } else { sf.pngBits = 8; @@ -166,11 +158,12 @@ if (sel == 2) { sf.tiffBits = 16; + } else if (sel == 3) { + sf.tiffBits = 32; } else { sf.tiffBits = 8; } - sf.pngCompression = (int) pngCompr->getValue (); sf.jpegQuality = (int) jpegQual->getValue (); sf.jpegSubSamp = jpegSubSamp->get_active_row_number() + 1; sf.tiffUncompressed = tiffUncompressed->get_active(); @@ -192,15 +185,12 @@ if (fr == "jpg") { jpegOpts->show_all(); tiffUncompressed->hide(); - pngCompr->hide(); } else if (fr == "png") { jpegOpts->hide(); tiffUncompressed->hide(); - pngCompr->show_all(); } else if (fr == "tif") { jpegOpts->hide(); tiffUncompressed->show_all(); - pngCompr->hide(); } if (listener) { diff -Nru rawtherapee-5.3/rtgui/saveformatpanel.h rawtherapee-5.4/rtgui/saveformatpanel.h --- rawtherapee-5.3/rtgui/saveformatpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/saveformatpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -37,7 +37,6 @@ protected: Adjuster* jpegQual; - Adjuster* pngCompr; Gtk::CheckButton* tiffUncompressed; MyComboBoxText* format; MyComboBoxText* jpegSubSamp; @@ -45,7 +44,7 @@ Gtk::Grid* jpegOpts; Gtk::Label* jpegSubSampLabel; FormatChangeListener* listener; - Glib::ustring fstr[5]; + Glib::ustring fstr[6]; Gtk::CheckButton* savesPP; diff -Nru rawtherapee-5.3/rtgui/shadowshighlights.cc rawtherapee-5.4/rtgui/shadowshighlights.cc --- rawtherapee-5.3/rtgui/shadowshighlights.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/shadowshighlights.cc 2018-03-20 11:04:15.000000000 +0000 @@ -44,11 +44,6 @@ pack_start (*Gtk::manage (new Gtk::HSeparator())); - lcontrast = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_LOCALCONTR"), 0, 100, 1, 0)); - pack_start (*lcontrast); - - pack_start (*Gtk::manage (new Gtk::HSeparator())); - radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 5, 100, 1, 30)); pack_start (*radius); @@ -57,7 +52,6 @@ h_tonalwidth->setAdjusterListener (this); shadows->setAdjusterListener (this); s_tonalwidth->setAdjusterListener (this); - lcontrast->setAdjusterListener (this); show_all_children (); } @@ -69,7 +63,6 @@ if (pedited) { radius->setEditedState (pedited->sh.radius ? Edited : UnEdited); - lcontrast->setEditedState (pedited->sh.localcontrast ? Edited : UnEdited); highlights->setEditedState (pedited->sh.highlights ? Edited : UnEdited); h_tonalwidth->setEditedState (pedited->sh.htonalwidth ? Edited : UnEdited); shadows->setEditedState (pedited->sh.shadows ? Edited : UnEdited); @@ -87,7 +80,6 @@ lastHQ = pp->sh.hq; radius->setValue (pp->sh.radius); - lcontrast->setValue (pp->sh.localcontrast); highlights->setValue (pp->sh.highlights); h_tonalwidth->setValue (pp->sh.htonalwidth); shadows->setValue (pp->sh.shadows); @@ -100,7 +92,6 @@ { pp->sh.radius = (int)radius->getValue (); - pp->sh.localcontrast = (int)lcontrast->getValue (); pp->sh.highlights = (int)highlights->getValue (); pp->sh.htonalwidth = (int)h_tonalwidth->getValue (); pp->sh.shadows = (int)shadows->getValue (); @@ -110,7 +101,6 @@ if (pedited) { pedited->sh.radius = radius->getEditedState (); - pedited->sh.localcontrast = lcontrast->getEditedState (); pedited->sh.highlights = highlights->getEditedState (); pedited->sh.htonalwidth = h_tonalwidth->getEditedState (); pedited->sh.shadows = shadows->getEditedState (); @@ -124,7 +114,6 @@ { radius->setDefault (defParams->sh.radius); - lcontrast->setDefault (defParams->sh.localcontrast); highlights->setDefault (defParams->sh.highlights); h_tonalwidth->setDefault (defParams->sh.htonalwidth); shadows->setDefault (defParams->sh.shadows); @@ -132,14 +121,12 @@ if (pedited) { radius->setDefaultEditedState (pedited->sh.radius ? Edited : UnEdited); - lcontrast->setDefaultEditedState (pedited->sh.localcontrast ? Edited : UnEdited); highlights->setDefaultEditedState (pedited->sh.highlights ? Edited : UnEdited); h_tonalwidth->setDefaultEditedState (pedited->sh.htonalwidth ? Edited : UnEdited); shadows->setDefaultEditedState (pedited->sh.shadows ? Edited : UnEdited); s_tonalwidth->setDefaultEditedState (pedited->sh.stonalwidth ? Edited : UnEdited); } else { radius->setDefaultEditedState (Irrelevant); - lcontrast->setDefaultEditedState (Irrelevant); highlights->setDefaultEditedState (Irrelevant); h_tonalwidth->setDefaultEditedState (Irrelevant); shadows->setDefaultEditedState (Irrelevant); @@ -164,8 +151,6 @@ listener->panelChanged (EvSHSHTonalW, costr); } else if (a == radius) { listener->panelChanged (EvSHRadius, costr); - } else if (a == lcontrast) { - listener->panelChanged (EvSHLContrast, costr); } } } @@ -214,19 +199,17 @@ ToolPanel::setBatchMode (batchMode); radius->showEditedCB (); - lcontrast->showEditedCB (); highlights->showEditedCB (); h_tonalwidth->showEditedCB (); shadows->showEditedCB (); s_tonalwidth->showEditedCB (); } -void ShadowsHighlights::setAdjusterBehavior (bool hadd, bool sadd, bool lcadd) +void ShadowsHighlights::setAdjusterBehavior (bool hadd, bool sadd) { highlights->setAddMode(hadd); shadows->setAddMode(sadd); - lcontrast->setAddMode(lcadd); } void ShadowsHighlights::trimValues (rtengine::procparams::ProcParams* pp) @@ -234,5 +217,4 @@ highlights->trimValue(pp->sh.highlights); shadows->trimValue(pp->sh.shadows); - lcontrast->trimValue(pp->sh.localcontrast); } diff -Nru rawtherapee-5.3/rtgui/shadowshighlights.h rawtherapee-5.4/rtgui/shadowshighlights.h --- rawtherapee-5.3/rtgui/shadowshighlights.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/shadowshighlights.h 2018-03-20 11:04:15.000000000 +0000 @@ -31,7 +31,6 @@ Adjuster* h_tonalwidth; Adjuster* shadows; Adjuster* s_tonalwidth; - Adjuster* lcontrast; Adjuster* radius; Gtk::CheckButton* hq; bool lastHQ; @@ -50,7 +49,7 @@ void enabledChanged (); void hqChanged (); - void setAdjusterBehavior (bool hadd, bool sadd, bool lcadd); + void setAdjusterBehavior (bool hadd, bool sadd); void trimValues (rtengine::procparams::ProcParams* pp); }; diff -Nru rawtherapee-5.3/rtgui/soundman.cc rawtherapee-5.4/rtgui/soundman.cc --- rawtherapee-5.3/rtgui/soundman.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/soundman.cc 2018-03-20 11:04:15.000000000 +0000 @@ -40,7 +40,7 @@ // Unfortunately MinGW does not support this yet. If audioclient.h is available, add an Init // called once on program start. // - // This mitigation plays an empty file on start, so RT is immidiately avaible in the Windows mixer at least + // This mitigation plays an empty file on start, so RT is immediately available in the Windows mixer at least playSoundAsync(Glib::ustring("sounds\\Empty.wav")); #endif } diff -Nru rawtherapee-5.3/rtgui/splash.cc rawtherapee-5.4/rtgui/splash.cc --- rawtherapee-5.3/rtgui/splash.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/splash.cc 2018-03-20 11:04:15.000000000 +0000 @@ -116,7 +116,7 @@ nb->append_page (*splashImage, M("ABOUT_TAB_SPLASH")); splashImage->show (); - // Tab 2: the informations about the current version + // Tab 2: the information about the current version std::string buildFileName = Glib::build_filename (creditsPath, "AboutThisBuild.txt"); if ( Glib::file_test(buildFileName, (Glib::FILE_TEST_EXISTS)) ) { @@ -281,4 +281,5 @@ void Splash::closePressed() { hide(); + close(); } diff -Nru rawtherapee-5.3/rtgui/thresholdadjuster.cc rawtherapee-5.4/rtgui/thresholdadjuster.cc --- rawtherapee-5.3/rtgui/thresholdadjuster.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thresholdadjuster.cc 2018-03-20 11:04:15.000000000 +0000 @@ -341,20 +341,20 @@ rtengine::procparams::Threshold t = tSelector.getPositions(); if (tSelector.isDouble()) { - adjusterListener->adjusterChanged (this, t.value[0], t.value[1], t.value[2], t.value[3]); - adjusterListener->adjusterChanged2 (this, t.value[0], t.value[1], t.value[2], t.value[3]); + adjusterListener->adjusterChanged (this, t.getBottomLeft(), t.getTopLeft(), t.getBottomRight(), t.getTopRight()); + adjusterListener->adjusterChanged2 (this, t.getBottomLeft(), t.getTopLeft(), t.getBottomRight(), t.getTopRight()); } else { - adjusterListener->adjusterChanged (this, t.value[0], t.value[1]); + adjusterListener->adjusterChanged (this, t.getBottomLeft(), t.getTopLeft()); } } else { // if precision is equal to 0, then we assume that the listener is waiting for integers rtengine::procparams::Threshold t = tSelector.getPositions(); if (tSelector.isDouble()) { - adjusterListener->adjusterChanged (this, t.value[0], t.value[1], t.value[2], t.value[3]); - adjusterListener->adjusterChanged2 (this, t.value[0], t.value[1], t.value[2], t.value[3]); + adjusterListener->adjusterChanged (this, t.getBottomLeft(), t.getTopLeft(), t.getBottomRight(), t.getTopRight()); + adjusterListener->adjusterChanged2 (this, t.getBottomLeft(), t.getTopLeft(), t.getBottomRight(), t.getTopRight()); } else { - adjusterListener->adjusterChanged (this, t.value[0], t.value[1]); + adjusterListener->adjusterChanged (this, t.getBottomLeft(), t.getTopLeft()); } } } diff -Nru rawtherapee-5.3/rtgui/thresholdselector.cc rawtherapee-5.4/rtgui/thresholdselector.cc --- rawtherapee-5.3/rtgui/thresholdselector.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thresholdselector.cc 2018-03-20 11:04:15.000000000 +0000 @@ -284,6 +284,9 @@ cr->set_line_cap(Cairo::LINE_CAP_BUTT); if (is_sensitive() && coloredBar.canGetColors()) { + if (updatePolicy == RTUP_DYNAMIC) { + coloredBar.setDirty(true); + } // this will eventually create/update the off-screen Surface for the gradient area only ! coloredBar.setDrawRectangle(hb + hwslider, int(float(h) * 1.5f / 7.f + 0.5f), iw + 1, int(float(h) * 4.f / 7.f + 0.5f)); // that we're displaying here diff -Nru rawtherapee-5.3/rtgui/thresholdselector.h rawtherapee-5.4/rtgui/thresholdselector.h --- rawtherapee-5.3/rtgui/thresholdselector.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thresholdselector.h 2018-03-20 11:04:15.000000000 +0000 @@ -138,12 +138,12 @@ template void setDefaults (const rtengine::procparams::Threshold &t) { - defPos[TS_BOTTOMLEFT] = double(t.value[0]); // should we use shapeValue() ? - defPos[TS_TOPLEFT] = double(t.value[1]); + defPos[TS_BOTTOMLEFT] = double(t.getBottomLeft()); // should we use shapeValue() ? + defPos[TS_TOPLEFT] = double(t.getTopLeft()); if (doubleThresh) { - defPos[TS_BOTTOMRIGHT] = double(t.value[2]); - defPos[TS_TOPRIGHT] = double(t.value[3]); + defPos[TS_BOTTOMRIGHT] = double(t.getBottomRight()); + defPos[TS_TOPRIGHT] = double(t.getTopRight()); } } void setDefaults (double bottom, double top); @@ -151,12 +151,12 @@ template void setPositions (const rtengine::procparams::Threshold &tValues) { - positions[TS_BOTTOMLEFT] = static_cast(tValues.value[TS_BOTTOMLEFT]); - positions[TS_TOPLEFT] = static_cast(tValues.value[TS_TOPLEFT]); + positions[TS_BOTTOMLEFT] = static_cast(tValues.getBottomLeft()); + positions[TS_TOPLEFT] = static_cast(tValues.getTopLeft()); if (tValues.isDouble()) { - positions[TS_BOTTOMRIGHT] = static_cast(tValues.value[TS_BOTTOMRIGHT]); - positions[TS_TOPRIGHT] = static_cast(tValues.value[TS_TOPRIGHT]); + positions[TS_BOTTOMRIGHT] = static_cast(tValues.getBottomRight()); + positions[TS_TOPRIGHT] = static_cast(tValues.getTopRight()); } updateTooltip(); diff -Nru rawtherapee-5.3/rtgui/thumbbrowserentrybase.cc rawtherapee-5.4/rtgui/thumbbrowserentrybase.cc --- rawtherapee-5.3/rtgui/thumbbrowserentrybase.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thumbbrowserentrybase.cc 2018-03-20 11:04:15.000000000 +0000 @@ -160,6 +160,7 @@ // draw icons onto the thumbnail area bbIcons = getIconsOnImageArea (); + bbSpecificityIcons = getSpecificityIconsOnImageArea (); int infow, infoh; getTextSizes (infow, infoh); @@ -224,6 +225,19 @@ } } + if (!bbSpecificityIcons.empty()) { + int igap = 2; + int istartx2 = prex + prew - 1 + igap; + int istarty2 = prey + preh - igap - 1; + + for (size_t i = 0; i < bbSpecificityIcons.size(); ++i) { + istartx2 -= bbSpecificityIcons[i]->get_width() - igap; + Gdk::Cairo::set_source_pixbuf(cc, bbSpecificityIcons[i], istartx2, istarty2 - bbSpecificityIcons[i]->get_height()); + cc->rectangle(istartx2, istarty2 - bbSpecificityIcons[i]->get_height(), bbSpecificityIcons[i]->get_width(), bbSpecificityIcons[i]->get_height()); + cc->fill(); + } + } + if ( ( (parent->getLocation() != ThumbBrowserBase::THLOC_EDITOR && options.showFileNames) || (parent->getLocation() == ThumbBrowserBase::THLOC_EDITOR && options.filmStripShowFileNames)) && withFilename > WFNAME_NONE) { @@ -386,7 +400,7 @@ MYWRITERLOCK(l, lockRW); height = h; - int old_preh = preh, old_width = width; + int old_preh = preh; // dimensions of the button set int bsw = 0, bsh = 0; @@ -448,7 +462,7 @@ width = bsw + 2 * sideMargin + 2 * borderWidth; } - if ( preh != old_preh || width != old_width ) { + if (preh != old_preh) { delete [] preview; preview = nullptr; refreshThumbnailImage (); @@ -512,7 +526,9 @@ } if (!backBuffer || selected != bbSelected || framed != bbFramed || preview != bbPreview - || exp_width != bbWidth || exp_height != bbHeight || getIconsOnImageArea () != bbIcons || backBuffer->isDirty()) { + || exp_width != bbWidth || exp_height != bbHeight || getIconsOnImageArea () != bbIcons + || getSpecificityIconsOnImageArea() != bbSpecificityIcons || backBuffer->isDirty()) + { updateBackBuffer (); } @@ -591,6 +607,11 @@ { return std::vector >(); } + +std::vector > ThumbBrowserEntryBase::getSpecificityIconsOnImageArea() +{ + return std::vector >(); +} void ThumbBrowserEntryBase::getIconSize(int& w, int& h) { diff -Nru rawtherapee-5.3/rtgui/thumbbrowserentrybase.h rawtherapee-5.4/rtgui/thumbbrowserentrybase.h --- rawtherapee-5.3/rtgui/thumbbrowserentrybase.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thumbbrowserentrybase.h 2018-03-20 11:04:15.000000000 +0000 @@ -80,6 +80,7 @@ bool bbSelected, bbFramed; guint8* bbPreview; std::vector > bbIcons; + std::vector > bbSpecificityIcons; CursorShape cursor_type; void drawFrame (Cairo::RefPtr cr, const Gdk::RGBA& bg, const Gdk::RGBA& fg); @@ -185,6 +186,7 @@ virtual void drawProgressBar (Glib::RefPtr win, const Gdk::RGBA& foregr, const Gdk::RGBA& backgr, int x, int w, int y, int h) {} virtual std::vector > getIconsOnImageArea (); + virtual std::vector > getSpecificityIconsOnImageArea (); virtual void getIconSize (int& w, int& h); virtual bool motionNotify (int x, int y); diff -Nru rawtherapee-5.3/rtgui/thumbimageupdater.cc rawtherapee-5.4/rtgui/thumbimageupdater.cc --- rawtherapee-5.3/rtgui/thumbimageupdater.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thumbimageupdater.cc 2018-03-20 11:04:15.000000000 +0000 @@ -208,7 +208,7 @@ } // create a new job and append to queue - DEBUG("queing job %s", tbe->shortname.c_str()); + DEBUG("queueing job %s", tbe->shortname.c_str()); impl_->jobs_.push_back(Impl::Job(tbe, priority, upgrade, l)); DEBUG("adding run request %s", tbe->shortname.c_str()); diff -Nru rawtherapee-5.3/rtgui/thumbnail.cc rawtherapee-5.4/rtgui/thumbnail.cc --- rawtherapee-5.3/rtgui/thumbnail.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thumbnail.cc 2018-03-20 11:04:15.000000000 +0000 @@ -132,20 +132,22 @@ bool quick = false; rtengine::RawMetaDataLocation ri; + rtengine::eSensorType sensorType = rtengine::ST_NONE; if ( initial_ && options.internalThumbIfUntouched) { quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, tw, th, 1, TRUE); + tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, ri, sensorType, tw, th, 1, TRUE); } if ( tpp == nullptr ) { quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, pparams.wb.equal, TRUE, pparams.raw.bayersensor.imageNum); + tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams.wb.equal, TRUE); } + cfs.sensortype = sensorType; if (tpp) { cfs.format = FT_Raw; cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname, &ri); + infoFromImage (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(ri))); } } @@ -227,14 +229,16 @@ if (!run_cpb) { if (defProf == DEFPROFILE_DYNAMIC && create && cfs && cfs->exifValid) { - rtengine::ImageMetaData* imageMetaData; + rtengine::FramesMetaData* imageMetaData; if (getType() == FT_Raw) { - rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname); - imageMetaData = rtengine::ImageMetaData::fromFile (fname, &metaData); + // Should we ask all frame's MetaData ? + imageMetaData = rtengine::FramesMetaData::fromFile (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(rtengine::Thumbnail::loadMetaDataFromRaw(fname))), true); } else { - imageMetaData = rtengine::ImageMetaData::fromFile (fname, nullptr); + // Should we ask all frame's MetaData ? + imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true); } PartialProfile *pp = ProfileStore::getInstance()->loadDynamicProfile(imageMetaData); + delete imageMetaData; int err = pp->pparams->save(outFName); pp->deleteInstance(); delete pp; @@ -249,25 +253,27 @@ } } else { // First generate the communication file, with general values and EXIF metadata - rtengine::ImageMetaData* imageMetaData; + rtengine::FramesMetaData* imageMetaData; if (getType() == FT_Raw) { - rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname); - imageMetaData = rtengine::ImageMetaData::fromFile (fname, &metaData); + // Should we ask all frame's MetaData ? + imageMetaData = rtengine::FramesMetaData::fromFile (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(rtengine::Thumbnail::loadMetaDataFromRaw(fname))), true); } else { - imageMetaData = rtengine::ImageMetaData::fromFile (fname, nullptr); + // Should we ask all frame's MetaData ? + imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true); } Glib::ustring tmpFileName( Glib::build_filename(options.cacheBaseDir, Glib::ustring::compose("CPB_temp_%1.txt", index++)) ); const rtexif::TagDirectory* exifDir = nullptr; - if (imageMetaData && (exifDir = imageMetaData->getExifData())) { + if (imageMetaData && (exifDir = imageMetaData->getRootExifData())) { exifDir->CPBDump(tmpFileName, fname, outFName, defaultPparamsPath == DEFPROFILE_INTERNAL ? DEFPROFILE_INTERNAL : Glib::build_filename(defaultPparamsPath, Glib::path_get_basename(defProf) + paramFileExtension), cfs, flaggingMode); } + delete imageMetaData; // For the filename etc. do NOT use streams, since they are not UTF8 safe Glib::ustring cmdLine = options.CPBPath + Glib::ustring(" \"") + tmpFileName + Glib::ustring("\""); @@ -284,8 +290,6 @@ } g_remove (tmpFileName.c_str ()); - - delete imageMetaData; } if (returnParams && hasProcParams()) { @@ -497,6 +501,15 @@ return enqueueNumber > 0; } +bool Thumbnail::isPixelShift () +{ + return cfs.isPixelShift; +} +bool Thumbnail::isHDR () +{ + return cfs.isHDR; +} + void Thumbnail::increaseRef () { MyMutex::MyLock lock(mutex); @@ -599,11 +612,11 @@ if ( cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL ) { // RAW internal thumbnail, no profile yet: just do some rotation etc. - image = tpp->quickProcessImage (pparams, h, rtengine::TI_Nearest, scale); + image = tpp->quickProcessImage (pparams, h, rtengine::TI_Nearest); } else { // Full thumbnail: apply profile // image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale ); - image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, &cfs, scale ); + image = tpp->processImage (pparams, static_cast(cfs.sensortype), h, rtengine::TI_Bilinear, &cfs, scale ); } tpp->getDimensions(lastW, lastH, lastScale); @@ -629,7 +642,7 @@ } // rtengine::IImage8* image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, cfs.getCamera(), cfs.focalLen, cfs.focalLen35mm, cfs.focusDist, cfs.shutter, cfs.fnumber, cfs.iso, cfs.expcomp, scale ); - rtengine::IImage8* image = tpp->processImage (pparams, h, rtengine::TI_Bilinear, &cfs, scale ); + rtengine::IImage8* image = tpp->processImage (pparams, static_cast(cfs.sensortype), h, rtengine::TI_Bilinear, &cfs, scale ); tpp->getDimensions(lastW, lastH, lastScale); delete tpp; @@ -647,7 +660,7 @@ return; } - exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::ImageData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::ImageData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), cfs.focalLen)); + exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::FramesData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::FramesData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), cfs.focalLen)); if (options.fbShowExpComp && cfs.expcomp != "0.00" && cfs.expcomp != "") { // don't show exposure compensation if it is 0.00EV;old cache iles do not have ExpComp, so value will not be displayed. exifString = Glib::ustring::compose ("%1 %2EV", exifString, cfs.expcomp); // append exposure compensation to exifString @@ -711,10 +724,9 @@ return (ThFileType) cfs.format; } -int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml) +int Thumbnail::infoFromImage (const Glib::ustring& fname, std::unique_ptr rml) { - - rtengine::ImageMetaData* idata = rtengine::ImageMetaData::fromFile (fname, rml); + rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, std::move(rml)); if (!idata) { return 0; @@ -725,24 +737,28 @@ cfs.exifValid = false; if (idata->hasExif()) { - cfs.shutter = idata->getShutterSpeed (); - cfs.fnumber = idata->getFNumber (); - cfs.focalLen = idata->getFocalLen (); + cfs.shutter = idata->getShutterSpeed (); + cfs.fnumber = idata->getFNumber (); + cfs.focalLen = idata->getFocalLen (); cfs.focalLen35mm = idata->getFocalLen35mm (); - cfs.focusDist = idata->getFocusDist (); - cfs.iso = idata->getISOSpeed (); - cfs.expcomp = idata->expcompToString (idata->getExpComp(), false); // do not mask Zero expcomp - cfs.year = 1900 + idata->getDateTime().tm_year; - cfs.month = idata->getDateTime().tm_mon + 1; - cfs.day = idata->getDateTime().tm_mday; - cfs.hour = idata->getDateTime().tm_hour; - cfs.min = idata->getDateTime().tm_min; - cfs.sec = idata->getDateTime().tm_sec; - cfs.timeValid = true; - cfs.exifValid = true; - cfs.lens = idata->getLens(); - cfs.camMake = idata->getMake(); - cfs.camModel = idata->getModel(); + cfs.focusDist = idata->getFocusDist (); + cfs.iso = idata->getISOSpeed (); + cfs.expcomp = idata->expcompToString (idata->getExpComp(), false); // do not mask Zero expcomp + cfs.isHDR = idata->getHDR (); + cfs.isPixelShift = idata->getPixelShift (); + cfs.frameCount = idata->getFrameCount (); + cfs.sampleFormat = idata->getSampleFormat (); + cfs.year = 1900 + idata->getDateTime().tm_year; + cfs.month = idata->getDateTime().tm_mon + 1; + cfs.day = idata->getDateTime().tm_mday; + cfs.hour = idata->getDateTime().tm_hour; + cfs.min = idata->getDateTime().tm_min; + cfs.sec = idata->getDateTime().tm_sec; + cfs.timeValid = true; + cfs.exifValid = true; + cfs.lens = idata->getLens(); + cfs.camMake = idata->getMake(); + cfs.camModel = idata->getModel(); if (idata->getOrientation() == "Rotate 90 CW") { deg = 90; @@ -867,7 +883,7 @@ } // save thumbnail image - tpp->writeImage (getCacheFileName ("images", ""), 1); + tpp->writeImage (getCacheFileName ("images", "")); // save aehistogram tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); diff -Nru rawtherapee-5.3/rtgui/thumbnail.h rawtherapee-5.4/rtgui/thumbnail.h --- rawtherapee-5.3/rtgui/thumbnail.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/thumbnail.h 2018-03-20 11:04:15.000000000 +0000 @@ -70,7 +70,7 @@ void _loadThumbnail (bool firstTrial = true); void _saveThumbnail (); void _generateThumbnailImage (); - int infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml = nullptr); + int infoFromImage (const Glib::ustring& fname, std::unique_ptr rml = nullptr); void loadThumbnail (bool firstTrial = true); void generateExifDateTimeStrings (); @@ -107,6 +107,8 @@ void imageEnqueued (); void imageRemovedFromQueue (); bool isEnqueued (); + bool isPixelShift (); + bool isHDR (); // unsigned char* getThumbnailImage (int &w, int &h, int fixwh=1); // fixwh = 0: fix w and calculate h, =1: fix h and calculate w rtengine::IImage8* processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); diff -Nru rawtherapee-5.3/rtgui/tonecurve.cc rawtherapee-5.4/rtgui/tonecurve.cc --- rawtherapee-5.3/rtgui/tonecurve.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/tonecurve.cc 2018-03-20 11:04:15.000000000 +0000 @@ -22,12 +22,16 @@ #include #include "ppversion.h" #include "edit.h" +#include "eventmapper.h" using namespace rtengine; using namespace rtengine::procparams; ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LABEL")) { + auto m = ProcEventMapper::getInstance(); + EvHistMatching = m->newEvent(AUTOEXP, "HISTORY_MSG_HISTMATCHING"); + EvHistMatchingBatch = m->newEvent(M_VOID, "HISTORY_MSG_HISTMATCHING"); CurveListener::setMulti(true); @@ -122,6 +126,11 @@ //----------- Curve 1 ------------------------------ pack_start (*Gtk::manage (new Gtk::HSeparator())); + histmatching = Gtk::manage(new Gtk::ToggleButton(M("TP_EXPOSURE_HISTMATCHING"))); + histmatching->set_tooltip_markup(M("TP_EXPOSURE_HISTMATCHING_TOOLTIP")); + histmatchconn = histmatching->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::histmatchingToggled)); + pack_start(*histmatching, true, true, 2); + toneCurveMode = Gtk::manage (new MyComboBoxText ()); toneCurveMode->append (M("TP_EXPOSURE_TCMODE_STANDARD")); toneCurveMode->append (M("TP_EXPOSURE_TCMODE_WEIGHTEDSTD")); @@ -223,8 +232,10 @@ shape->setCurve (pp->toneCurve.curve); shape2->setCurve (pp->toneCurve.curve2); - toneCurveMode->set_active(pp->toneCurve.curveMode); - toneCurveMode2->set_active(pp->toneCurve.curveMode2); + toneCurveMode->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode)); + toneCurveMode2->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode2)); + + histmatching->set_active(pp->toneCurve.histmatching); if (pedited) { expcomp->setEditedState (pedited->toneCurve.expcomp ? Edited : UnEdited); @@ -248,6 +259,8 @@ if (!pedited->toneCurve.curveMode2) { toneCurveMode2->set_active(6); } + + histmatching->set_inconsistent(!pedited->toneCurve.histmatching); } enaconn.block (true); @@ -314,35 +327,37 @@ int tcMode = toneCurveMode->get_active_row_number(); if (tcMode == 0) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_STD; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::STD; } else if (tcMode == 1) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_WEIGHTEDSTD; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::WEIGHTEDSTD; } else if (tcMode == 2) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_FILMLIKE; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; } else if (tcMode == 3) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_SATANDVALBLENDING; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::SATANDVALBLENDING; } else if (tcMode == 4) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_LUMINANCE; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::LUMINANCE; } else if (tcMode == 5) { - pp->toneCurve.curveMode = ToneCurveParams::TC_MODE_PERCEPTUAL; + pp->toneCurve.curveMode = ToneCurveParams::TcMode::PERCEPTUAL; } tcMode = toneCurveMode2->get_active_row_number(); if (tcMode == 0) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_STD; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::STD; } else if (tcMode == 1) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_WEIGHTEDSTD; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::WEIGHTEDSTD; } else if (tcMode == 2) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_FILMLIKE; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::FILMLIKE; } else if (tcMode == 3) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_SATANDVALBLENDING; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::SATANDVALBLENDING; } else if (tcMode == 4) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_LUMINANCE; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::LUMINANCE; } else if (tcMode == 5) { - pp->toneCurve.curveMode2 = ToneCurveParams::TC_MODE_PERCEPTUAL; + pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::PERCEPTUAL; } + pp->toneCurve.histmatching = histmatching->get_active(); + if (pedited) { pedited->toneCurve.expcomp = expcomp->getEditedState (); pedited->toneCurve.black = black->getEditedState (); @@ -360,6 +375,7 @@ pedited->toneCurve.curveMode2 = toneCurveMode2->get_active_row_number() != 6; pedited->toneCurve.method = method->get_active_row_number() != 4; pedited->toneCurve.hrenabled = !hrenabled->get_inconsistent(); + pedited->toneCurve.histmatching = !histmatching->get_inconsistent(); } pp->toneCurve.hrenabled = hrenabled->get_active(); @@ -408,6 +424,8 @@ autolevels->set_inconsistent (false); } + setHistmatching(false); + if (hrenabled->get_active ()) { listener->panelChanged (EvHREnabled, M("GENERAL_ENABLED")); } else { @@ -419,6 +437,7 @@ { if (listener) { + setHistmatching(false); if (hrenabled->get_active ()) { listener->panelChanged (EvHRMethod, method->get_active_text ()); } @@ -430,6 +449,7 @@ disableListener (); method->set_sensitive (raw); hrenabled->set_sensitive (raw); + histmatching->set_sensitive(raw); enableListener (); } @@ -471,6 +491,7 @@ { if (listener) { + setHistmatching(false); if (ce == shape) { listener->panelChanged (EvToneCurve1, M("HISTORY_CUSTOMCURVE")); } else if (ce == shape2) { @@ -483,6 +504,7 @@ { //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { + setHistmatching(false); Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode1Changed_)); } } @@ -500,6 +522,7 @@ { //if (listener) listener->panelChanged (EvToneCurveMode, toneCurveMode->get_active_text()); if (listener) { + setHistmatching(false); Glib::signal_idle().connect (sigc::mem_fun(*this, &ToneCurve::curveMode2Changed_)); } } @@ -544,6 +567,10 @@ return; } + if (a != expcomp && a != hlcompr && a != hlcomprthresh) { + setHistmatching(false); + } + Glib::ustring costr; if (a == expcomp) { @@ -580,6 +607,8 @@ // This method deselects auto levels and HL reconstruction auto // and sets neutral values to params in exposure panel + setHistmatching(false); + if (batchMode) { autolevels->set_inconsistent (false); autoconn.block (true); @@ -617,6 +646,7 @@ } void ToneCurve::autolevels_toggled () { + setHistmatching(false); if (batchMode) { if (autolevels->get_inconsistent()) { @@ -727,6 +757,7 @@ toneCurveMode2->set_sensitive (false); hrenabled->set_sensitive(false); method->set_sensitive(false); + histmatching->set_sensitive(false); } void ToneCurve::autoExpChanged (double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons) @@ -766,12 +797,13 @@ toneCurveMode2->set_sensitive (true); hrenabled->set_sensitive(true); method->set_sensitive(true); + histmatching->set_sensitive(true); } bool ToneCurve::autoExpComputed_ () { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected disableListener (); enableAll (); expcomp->setValue (nextExpcomp); @@ -858,3 +890,78 @@ shape->updateBackgroundHistogram (histToneCurve); } + + +void ToneCurve::setHistmatching(bool enabled) +{ + if (histmatching->get_active()) { + histmatchconn.block(true); + histmatching->set_active(enabled); + histmatchconn.block(false); + histmatching->set_inconsistent(false); + } +} + + +void ToneCurve::histmatchingToggled() +{ + if (listener) { + if (!batchMode) { + if (histmatching->get_active()) { + listener->panelChanged(EvHistMatching, M("GENERAL_ENABLED")); + waitForAutoExp(); + } else { + listener->panelChanged(EvHistMatching, M("GENERAL_DISABLED")); + } + } else { + listener->panelChanged(EvHistMatchingBatch, histmatching->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } + } +} + + +void ToneCurve::autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) +{ + nextToneCurveMode = curveMode; + nextToneCurve = curve; + + const auto func = [](gpointer data) -> gboolean { + static_cast(data)->histmatchingComputed(); + + return FALSE; + }; + + idle_register.add(func, this); +} + + +bool ToneCurve::histmatchingComputed() +{ + GThreadLock lock; + disableListener(); + enableAll(); + brightness->setValue(0); + contrast->setValue(0); + black->setValue(0); + + if (!black->getAddMode()) { + shcompr->set_sensitive(!((int)black->getValue() == 0)); + } + + if (autolevels->get_active() ) { + expcomp->setValue(0); + autoconn.block(true); + autolevels->set_active(false); + autoconn.block(false); + autolevels->set_inconsistent(false); + } + + toneCurveMode->set_active(rtengine::toUnderlying(nextToneCurveMode)); + shape->setCurve(nextToneCurve); + shape2->setCurve({ DCT_Linear }); + shape->openIfNonlinear(); + + enableListener(); + + return false; +} diff -Nru rawtherapee-5.3/rtgui/tonecurve.h rawtherapee-5.4/rtgui/tonecurve.h --- rawtherapee-5.3/rtgui/tonecurve.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/tonecurve.h 2018-03-20 11:04:15.000000000 +0000 @@ -57,14 +57,19 @@ Adjuster* saturation; MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; + Gtk::ToggleButton *histmatching; bool clipDirty, lastAuto; sigc::connection autoconn, neutralconn, tcmodeconn, tcmode2conn; + sigc::connection histmatchconn; CurveEditorGroup* curveEditorG; CurveEditorGroup* curveEditorG2; DiagonalCurveEditor* shape; DiagonalCurveEditor* shape2; + rtengine::ProcEvent EvHistMatching; + rtengine::ProcEvent EvHistMatchingBatch; + // used temporarily in eventing double nextExpcomp; int nextBrightness; @@ -73,6 +78,10 @@ int nextHlcompr; int nextHlcomprthresh; bool nextHLRecons; + rtengine::procparams::ToneCurveParams::TcMode nextToneCurveMode; + std::vector nextToneCurve; + + void setHistmatching(bool enabled); public: ToneCurve (); @@ -107,6 +116,10 @@ bool isCurveExpanded (); void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI); + void histmatchingToggled(); + void autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve); + bool histmatchingComputed(); + void setRaw (bool raw); void hrenabledChanged (); diff -Nru rawtherapee-5.3/rtgui/toolpanelcoord.cc rawtherapee-5.4/rtgui/toolpanelcoord.cc --- rawtherapee-5.3/rtgui/toolpanelcoord.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/toolpanelcoord.cc 2018-03-20 11:04:15.000000000 +0000 @@ -28,7 +28,7 @@ using namespace rtengine::procparams; -ToolPanelCoordinator::ToolPanelCoordinator () : ipc (nullptr), hasChanged (false), editDataProvider (nullptr) +ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChanged (false), editDataProvider (nullptr) { exposurePanel = Gtk::manage (new ToolVBox ()); @@ -36,7 +36,7 @@ colorPanel = Gtk::manage (new ToolVBox ()); transformPanel = Gtk::manage (new ToolVBox ()); rawPanel = Gtk::manage (new ToolVBox ()); - waveletPanel = Gtk::manage (new ToolVBox ()); + advancedPanel = Gtk::manage (new ToolVBox ()); coarse = Gtk::manage (new CoarsePanel ()); toneCurve = Gtk::manage (new ToneCurve ()); @@ -46,6 +46,7 @@ dirpyrdenoise = Gtk::manage (new DirPyrDenoise ()); epd = Gtk::manage (new EdgePreservingDecompositionUI ()); sharpening = Gtk::manage (new Sharpening ()); + localContrast = Gtk::manage(new LocalContrast()); sharpenEdge = Gtk::manage (new SharpenEdge ()); sharpenMicro = Gtk::manage (new SharpenMicro ()); lcurve = Gtk::manage (new LCurve ()); @@ -70,8 +71,7 @@ prsharpening = Gtk::manage (new PrSharpening()); crop = Gtk::manage (new Crop ()); icm = Gtk::manage (new ICMPanel ()); - exifpanel = Gtk::manage (new ExifPanel ()); - iptcpanel = Gtk::manage (new IPTCPanel ()); + metadata = Gtk::manage(new MetaDataPanel()); wavelet = Gtk::manage (new Wavelet ()); dirpyrequalizer = Gtk::manage (new DirPyrEqualizer ()); hsvequalizer = Gtk::manage (new HSVEqualizer ()); @@ -88,6 +88,7 @@ rawexposure = Gtk::manage (new RAWExposure ()); bayerrawexposure = Gtk::manage (new BayerRAWExposure ()); xtransrawexposure = Gtk::manage (new XTransRAWExposure ()); + fattal = Gtk::manage (new FattalToneMapping ()); // So Demosaic, Line noise filter, Green Equilibration, Ca-Correction (garder le nom de section identique!) and Black-Level will be moved in a "Bayer sensor" tool, // and a separate Demosaic and Black Level tool will be created in an "X-Trans sensor" tool @@ -99,118 +100,68 @@ // Medium -> High ISO addPanel (colorPanel, whitebalance); - toolPanels.push_back (whitebalance); addPanel (exposurePanel, toneCurve); - toolPanels.push_back (toneCurve); addPanel (colorPanel, vibrance); - toolPanels.push_back (vibrance); addPanel (colorPanel, chmixer); - toolPanels.push_back (chmixer); // << TODO: Add "Enabled" addPanel (colorPanel, blackwhite); - toolPanels.push_back (blackwhite); addPanel (exposurePanel, shadowshighlights); - toolPanels.push_back (shadowshighlights); addPanel (detailsPanel, sharpening); - toolPanels.push_back (sharpening); + addPanel (detailsPanel, localContrast); addPanel (detailsPanel, sharpenEdge); - toolPanels.push_back (sharpenEdge); addPanel (detailsPanel, sharpenMicro); - toolPanels.push_back (sharpenMicro); addPanel (colorPanel, hsvequalizer); - toolPanels.push_back (hsvequalizer); // << TODO: Add "Enabled" addPanel (colorPanel, filmSimulation); - toolPanels.push_back (filmSimulation); addPanel (colorPanel, rgbcurves); - toolPanels.push_back (rgbcurves); // << TODO: Add "Enabled" addPanel (colorPanel, colortoning); - toolPanels.push_back (colortoning); addPanel (exposurePanel, epd); - toolPanels.push_back (epd); - addPanel (exposurePanel, retinex); - toolPanels.push_back (retinex); + addPanel (exposurePanel, fattal); + addPanel (advancedPanel, retinex); addPanel (exposurePanel, pcvignette); - toolPanels.push_back (pcvignette); addPanel (exposurePanel, gradient); - toolPanels.push_back (gradient); addPanel (exposurePanel, lcurve); - toolPanels.push_back (lcurve); // << TODO: Add "Enabled" ??? - addPanel (exposurePanel, colorappearance); - toolPanels.push_back (colorappearance); + addPanel (advancedPanel, colorappearance); addPanel (detailsPanel, impulsedenoise); - toolPanels.push_back (impulsedenoise); addPanel (detailsPanel, dirpyrdenoise); - toolPanels.push_back (dirpyrdenoise); addPanel (detailsPanel, defringe); - toolPanels.push_back (defringe); addPanel (detailsPanel, dirpyrequalizer); - toolPanels.push_back (dirpyrequalizer); - addPanel (waveletPanel, wavelet); - toolPanels.push_back (wavelet); + addPanel (advancedPanel, wavelet); addPanel (transformPanel, crop); - toolPanels.push_back (crop); addPanel (transformPanel, resize); - toolPanels.push_back (resize); addPanel (resize->getPackBox(), prsharpening, 2); - toolPanels.push_back (prsharpening); addPanel (transformPanel, lensgeom); - toolPanels.push_back (lensgeom); addPanel (lensgeom->getPackBox(), rotate, 2); - toolPanels.push_back (rotate); addPanel (lensgeom->getPackBox(), perspective, 2); - toolPanels.push_back (perspective); addPanel (lensgeom->getPackBox(), lensProf, 2); - toolPanels.push_back (lensProf); addPanel (lensgeom->getPackBox(), distortion, 2); - toolPanels.push_back (distortion); addPanel (lensgeom->getPackBox(), cacorrection, 2); - toolPanels.push_back (cacorrection); addPanel (lensgeom->getPackBox(), vignetting, 2); - toolPanels.push_back (vignetting); addPanel (colorPanel, icm); - toolPanels.push_back (icm); addPanel (rawPanel, sensorbayer); - toolPanels.push_back (sensorbayer); addPanel (sensorbayer->getPackBox(), bayerprocess, 2); - toolPanels.push_back (bayerprocess); addPanel (sensorbayer->getPackBox(), bayerrawexposure, 2); - toolPanels.push_back (bayerrawexposure); addPanel (sensorbayer->getPackBox(), bayerpreprocess, 2); - toolPanels.push_back (bayerpreprocess); addPanel (sensorbayer->getPackBox(), rawcacorrection, 2); - toolPanels.push_back (rawcacorrection); addPanel (rawPanel, sensorxtrans); - toolPanels.push_back (sensorxtrans); addPanel (sensorxtrans->getPackBox(), xtransprocess, 2); - toolPanels.push_back (xtransprocess); addPanel (sensorxtrans->getPackBox(), xtransrawexposure, 2); - toolPanels.push_back (xtransrawexposure); addPanel (rawPanel, rawexposure); - toolPanels.push_back (rawexposure); addPanel (rawPanel, preprocess); - toolPanels.push_back (preprocess); addPanel (rawPanel, darkframe); - toolPanels.push_back (darkframe); addPanel (rawPanel, flatfield); - toolPanels.push_back (flatfield); toolPanels.push_back (coarse); - toolPanels.push_back (exifpanel); - toolPanels.push_back (iptcpanel); + toolPanels.push_back(metadata); - metadataPanel = Gtk::manage (new Gtk::Notebook ()); - metadataPanel->set_name ("MetaPanelNotebook"); toolPanelNotebook = new Gtk::Notebook (); toolPanelNotebook->set_name ("ToolPanelNotebook"); - metadataPanel->append_page (*exifpanel, M ("MAIN_TAB_EXIF")); - metadataPanel->append_page (*iptcpanel, M ("MAIN_TAB_IPTC")); exposurePanelSW = Gtk::manage (new MyScrolledWindow ()); detailsPanelSW = Gtk::manage (new MyScrolledWindow ()); colorPanelSW = Gtk::manage (new MyScrolledWindow ()); transformPanelSW = Gtk::manage (new MyScrolledWindow ()); rawPanelSW = Gtk::manage (new MyScrolledWindow ()); - waveletPanelSW = Gtk::manage (new MyScrolledWindow ()); + advancedPanelSW = Gtk::manage (new MyScrolledWindow ()); updateVScrollbars (options.hideTPVScrollbar); // load panel endings @@ -234,9 +185,9 @@ colorPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); colorPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); - waveletPanelSW->add (*waveletPanel); - waveletPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - waveletPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); + advancedPanelSW->add (*advancedPanel); + advancedPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + advancedPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); transformPanelSW->add (*transformPanel); transformPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); @@ -253,7 +204,7 @@ toiE = Gtk::manage (new TextOrIcon ("exposure.png", M ("MAIN_TAB_EXPOSURE"), M ("MAIN_TAB_EXPOSURE_TOOLTIP"), type)); toiD = Gtk::manage (new TextOrIcon ("detail.png", M ("MAIN_TAB_DETAIL"), M ("MAIN_TAB_DETAIL_TOOLTIP"), type)); toiC = Gtk::manage (new TextOrIcon ("colour.png", M ("MAIN_TAB_COLOR"), M ("MAIN_TAB_COLOR_TOOLTIP"), type)); - toiW = Gtk::manage (new TextOrIcon ("wavelet.png", M ("MAIN_TAB_WAVELET"), M ("MAIN_TAB_WAVELET_TOOLTIP"), type)); + toiW = Gtk::manage (new TextOrIcon ("atom.png", M ("MAIN_TAB_ADVANCED"), M ("MAIN_TAB_ADVANCED_TOOLTIP"), type)); toiT = Gtk::manage (new TextOrIcon ("transform.png", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"), type)); toiR = Gtk::manage (new TextOrIcon ("raw.png", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"), type)); toiM = Gtk::manage (new TextOrIcon ("meta.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"), type)); @@ -261,10 +212,10 @@ toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); toolPanelNotebook->append_page (*colorPanelSW, *toiC); - toolPanelNotebook->append_page (*waveletPanelSW, *toiW); + toolPanelNotebook->append_page (*advancedPanelSW, *toiW); toolPanelNotebook->append_page (*transformPanelSW, *toiT); toolPanelNotebook->append_page (*rawPanelSW, *toiR); - toolPanelNotebook->append_page (*metadataPanel, *toiM); + toolPanelNotebook->append_page (*metadata, *toiM); toolPanelNotebook->set_current_page (0); @@ -297,10 +248,12 @@ expList.push_back (panel->getExpander()); where->pack_start (*panel->getExpander(), false, false); + toolPanels.push_back (panel); } ToolPanelCoordinator::~ToolPanelCoordinator () { + idle_register.destroy(); closeImage (); @@ -310,29 +263,58 @@ void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans) { - GThreadLock lock; - if (isRaw) { - rawPanelSW->set_sensitive (true); - if (isBayer) { - sensorxtrans->FoldableToolPanel::hide(); - sensorbayer->FoldableToolPanel::show(); - preprocess->FoldableToolPanel::show(); - flatfield->FoldableToolPanel::show(); - } else if (isXtrans) { - sensorxtrans->FoldableToolPanel::show(); - sensorbayer->FoldableToolPanel::hide(); - preprocess->FoldableToolPanel::show(); - flatfield->FoldableToolPanel::show(); - } else { - sensorbayer->FoldableToolPanel::hide(); - sensorxtrans->FoldableToolPanel::hide(); - preprocess->FoldableToolPanel::hide(); - flatfield->FoldableToolPanel::hide(); + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorxtrans->FoldableToolPanel::hide(); + self->sensorbayer->FoldableToolPanel::show(); + self->preprocess->FoldableToolPanel::show(); + self->flatfield->FoldableToolPanel::show(); + + return FALSE; + }; + idle_register.add(func, this); + } + else if (isXtrans) { + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorxtrans->FoldableToolPanel::show(); + self->sensorbayer->FoldableToolPanel::hide(); + self->preprocess->FoldableToolPanel::show(); + self->flatfield->FoldableToolPanel::show(); + + return FALSE; + }; + idle_register.add(func, this); + } + else { + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (true); + self->sensorbayer->FoldableToolPanel::hide(); + self->sensorxtrans->FoldableToolPanel::hide(); + self->preprocess->FoldableToolPanel::hide(); + self->flatfield->FoldableToolPanel::hide(); + + return FALSE; + }; + idle_register.add(func, this); } } else { - rawPanelSW->set_sensitive (false); + const auto func = [](gpointer data) -> gboolean { + ToolPanelCoordinator* const self = static_cast(data); + + self->rawPanelSW->set_sensitive (false); + + return FALSE; + }; + idle_register.add(func, this); } } @@ -345,7 +327,7 @@ return; } - int changeFlags = refreshmap[ (int)event]; + int changeFlags = rtengine::RefreshMapper::getInstance()->getAction(event); ProcParams* params = ipc->beginUpdateParams (); @@ -357,7 +339,7 @@ if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { if (fabs (params->rotate.degree) > 0.001) { params->rotate.degree *= -1; - changeFlags |= refreshmap[ (int)rtengine::EvROTDegree]; + changeFlags |= rtengine::RefreshMapper::getInstance()->getAction(rtengine::EvROTDegree); rotate->read (params); } } @@ -476,7 +458,7 @@ // start the IPC processing if (filterRawRefresh) { - ipc->endUpdateParams ( refreshmap[ (int)event] & ALLNORAW ); + ipc->endUpdateParams ( rtengine::RefreshMapper::getInstance()->getAction(event) & ALLNORAW ); } else { ipc->endUpdateParams (event); } @@ -512,9 +494,8 @@ toneCurve->enableListener (); if (ipc) { - const rtengine::ImageMetaData* pMetaData = ipc->getInitialImage()->getMetaData(); - exifpanel->setImageData (pMetaData); - iptcpanel->setImageData (pMetaData); + const rtengine::FramesMetaData* pMetaData = ipc->getInitialImage()->getMetaData(); + metadata->setImageData(pMetaData); ipc->setAutoExpListener (toneCurve); ipc->setAutoCamListener (colorappearance); @@ -530,7 +511,7 @@ ipc->setImageTypeListener (this); flatfield->setShortcutPath (Glib::path_get_dirname (ipc->getInitialImage()->getFileName())); - icm->setRawMeta (raw, (const rtengine::ImageData*)pMetaData); + icm->setRawMeta (raw, (const rtengine::FramesData*)pMetaData); lensProf->setRawMeta (raw, pMetaData); } @@ -688,7 +669,7 @@ return nullptr; } - const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData(); + const rtengine::FramesMetaData *imd = ipc->getInitialImage()->getMetaData(); if (imd) { int iso = imd->getISOSpeed(); @@ -709,7 +690,7 @@ return nullptr; } - const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData(); + const rtengine::FramesMetaData *imd = ipc->getInitialImage()->getMetaData(); if (imd) { // int iso = imd->getISOSpeed(); temporarilly removed because unused @@ -850,14 +831,12 @@ return true; case GDK_KEY_w: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*waveletPanelSW)); + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*advancedPanelSW)); return true; case GDK_KEY_m: - if (metadataPanel) { - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadataPanel)); - return true; - } + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadata)); + return true; } } @@ -866,14 +845,14 @@ void ToolPanelCoordinator::updateVScrollbars (bool hide) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected Gtk::PolicyType policy = hide ? Gtk::POLICY_NEVER : Gtk::POLICY_AUTOMATIC; exposurePanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); detailsPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); colorPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); transformPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); rawPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); - waveletPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); + advancedPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); for (auto currExp : expList) { currExp->updateVScrollbars (hide); @@ -882,7 +861,7 @@ void ToolPanelCoordinator::updateTabsHeader (bool useIcons) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected TOITypes type = useIcons ? TOI_ICON : TOI_TEXT; toiE->switchTo (type); @@ -908,7 +887,7 @@ void ToolPanelCoordinator::toolSelected (ToolMode tool) { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected switch (tool) { case TMCropSelect: diff -Nru rawtherapee-5.3/rtgui/toolpanelcoord.h rawtherapee-5.4/rtgui/toolpanelcoord.h --- rawtherapee-5.3/rtgui/toolpanelcoord.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/toolpanelcoord.h 2018-03-20 11:04:15.000000000 +0000 @@ -38,8 +38,7 @@ #include "epd.h" #include "sharpening.h" #include "labcurve.h" -#include "exifpanel.h" -#include "iptcpanel.h" +#include "metadatapanel.h" #include "crop.h" #include "icmpanel.h" #include "resize.h" @@ -78,6 +77,8 @@ #include "colortoning.h" #include "filmsimulation.h" #include "prsharpening.h" +#include "fattaltonemap.h" +#include "localcontrast.h" #include "guiutils.h" class ImageEditorCoordinator; @@ -119,6 +120,7 @@ Crop* crop; ToneCurve* toneCurve; ShadowsHighlights* shadowshighlights; + LocalContrast *localContrast; Defringe* defringe; ImpulseDenoise* impulsedenoise; DirPyrDenoise* dirpyrdenoise; @@ -145,6 +147,8 @@ RAWExposure* rawexposure; BayerRAWExposure* bayerrawexposure; XTransRAWExposure* xtransrawexposure; + FattalToneMapping *fattal; + MetaDataPanel* metadata; std::vector paramcListeners; @@ -156,10 +160,7 @@ ToolVBox* colorPanel; ToolVBox* transformPanel; ToolVBox* rawPanel; - ToolVBox* waveletPanel; - Gtk::Notebook* metadataPanel; - ExifPanel* exifpanel; - IPTCPanel* iptcpanel; + ToolVBox* advancedPanel; ToolBar* toolBar; TextOrIcon* toiE; @@ -178,7 +179,7 @@ Gtk::ScrolledWindow* colorPanelSW; Gtk::ScrolledWindow* transformPanelSW; Gtk::ScrolledWindow* rawPanelSW; - Gtk::ScrolledWindow* waveletPanelSW; + Gtk::ScrolledWindow* advancedPanelSW; std::vector expList; @@ -198,7 +199,7 @@ CoarsePanel* coarse; Gtk::Notebook* toolPanelNotebook; - ToolPanelCoordinator (); + ToolPanelCoordinator (bool batch = false); virtual ~ToolPanelCoordinator (); bool getChangedState () @@ -300,6 +301,9 @@ void editModeSwitchedOff (); void setEditProvider (EditDataProvider *provider); + +private: + IdleRegister idle_register; }; #endif diff -Nru rawtherapee-5.3/rtgui/toolpanel.h rawtherapee-5.4/rtgui/toolpanel.h --- rawtherapee-5.3/rtgui/toolpanel.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/toolpanel.h 2018-03-20 11:04:15.000000000 +0000 @@ -88,7 +88,7 @@ { multiImage = m; } - void setListener (ToolPanelListener* tpl) + virtual void setListener (ToolPanelListener* tpl) { listener = tpl; } diff -Nru rawtherapee-5.3/rtgui/wavelet.cc rawtherapee-5.4/rtgui/wavelet.cc --- rawtherapee-5.3/rtgui/wavelet.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/wavelet.cc 2018-03-20 11:04:15.000000000 +0000 @@ -100,7 +100,7 @@ bllev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LOWLIGHT"), 0., 100., 0., 2., 50., 25., 0, false))), pastlev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_PASTEL"), 0., 70., 0., 2., 30., 20., 0, false))), satlev(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_SAT"), 0., 130., 30., 45., 130., 100., 0, false))), - edgcont(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_EDGCONT"), 0., 100., options.rtSettings.bot_left, options.rtSettings.top_left, options.rtSettings.bot_right, options.rtSettings.top_right, 0., false))), + edgcont(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_EDGCONT"), 0., 100., 0, 10, 75, 40, 0., false))), level0noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVZERO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level1noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVONE"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), level2noise(Gtk::manage(new ThresholdAdjuster(M("TP_WAVELET_LEVTWO"), -30., 100., 0., M("TP_WAVELET_STREN"), 1., 0., 100., 0., M("TP_WAVELET_NOIS"), 1., nullptr, false))), @@ -408,12 +408,11 @@ opaCurveEditorG->setCurveListener (this); - std::vector defaultCurve; + const WaveletParams default_params; - rtengine::WaveletParams::getDefaultOpacityCurveRG(defaultCurve); opacityShapeRG = static_cast(opaCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeRG->setIdentityValue(0.); - opacityShapeRG->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + opacityShapeRG->setResetCurve(FlatCurveType(default_params.opacityCurveRG.at(0)), default_params.opacityCurveRG); opaCurveEditorG->curveListComplete(); opaCurveEditorG->show(); @@ -422,10 +421,9 @@ opacityCurveEditorG->setCurveListener (this); - rtengine::WaveletParams::getDefaultOpacityCurveBY(defaultCurve); opacityShapeBY = static_cast(opacityCurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeBY->setIdentityValue(0.); - opacityShapeBY->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + opacityShapeBY->setResetCurve(FlatCurveType(default_params.opacityCurveBY.at(0)), default_params.opacityCurveBY); opacityCurveEditorG->curveListComplete(); opacityCurveEditorG->show(); @@ -502,11 +500,10 @@ // <-- Edge Sharpness Local Contrast curve CCWcurveEditorG->setCurveListener (this); - rtengine::WaveletParams::getDefaultCCWCurve(defaultCurve); ccshape = static_cast(CCWcurveEditorG->addCurve(CT_Flat, "", nullptr, false, false)); ccshape->setIdentityValue(0.); - ccshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + ccshape->setResetCurve(FlatCurveType(default_params.ccwcurve.at(0)), default_params.ccwcurve); ccshape->setTooltip(M("TP_WAVELET_CURVEEDITOR_CC_TOOLTIP")); CCWcurveEditorG->curveListComplete(); @@ -781,10 +778,9 @@ opacityCurveEditorW->setCurveListener (this); - rtengine::WaveletParams::getDefaultOpacityCurveW(defaultCurve); opacityShape = static_cast(opacityCurveEditorW->addCurve(CT_Flat, "", nullptr, false, false)); opacityShape->setIdentityValue(0.); - opacityShape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + opacityShape->setResetCurve(FlatCurveType(default_params.opacityCurveW.at(0)), default_params.opacityCurveW); opacityShape->setBottomBarBgGradient(milestones2); // This will add the reset button at the end of the curveType buttons @@ -798,10 +794,9 @@ opacityCurveEditorWL->setCurveListener (this); - rtengine::WaveletParams::getDefaultOpacityCurveWL(defaultCurve); opacityShapeWL = static_cast(opacityCurveEditorWL->addCurve(CT_Flat, "", nullptr, false, false)); opacityShapeWL->setIdentityValue(0.); - opacityShapeWL->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + opacityShapeWL->setResetCurve(FlatCurveType(default_params.opacityCurveWL.at(0)), default_params.opacityCurveWL); opacityShapeWL->setTooltip(M("TP_WAVELET_OPACITYWL_TOOLTIP")); // This will add the reset button at the end of the curveType buttons @@ -895,7 +890,7 @@ nextnlevel = nlevel; const auto func = [](gpointer data) -> gboolean { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected static_cast(data)->wavComputed_(); return FALSE; @@ -1101,7 +1096,7 @@ Dirmethod->set_active (3); } - int selectedLevel = atoi(pp->wavelet.Lmethod.data()) - 1; + int selectedLevel = pp->wavelet.Lmethod - 1; Lmethod->set_active (selectedLevel == -1 ? 4 : selectedLevel); ccshape->setCurve (pp->wavelet.ccwcurve); @@ -1740,9 +1735,7 @@ pp->wavelet.Dirmethod = "all"; } - char lMethod[3]; // one additional char to avoid buffer overrun if someone increases number of levels > 9 - sprintf(lMethod, "%d", Lmethod->get_active_row_number() + 1); - pp->wavelet.Lmethod = lMethod; + pp->wavelet.Lmethod = Lmethod->get_active_row_number() + 1; } void Wavelet::curveChanged (CurveEditor* ce) diff -Nru rawtherapee-5.3/rtgui/whitebalance.cc rawtherapee-5.4/rtgui/whitebalance.cc --- rawtherapee-5.3/rtgui/whitebalance.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/whitebalance.cc 2018-03-20 11:04:15.000000000 +0000 @@ -34,7 +34,7 @@ using namespace rtengine; using namespace rtengine::procparams; -Glib::RefPtr WhiteBalance::wbPixbufs[rtengine::procparams::WBT_CUSTOM + 1]; +Glib::RefPtr WhiteBalance::wbPixbufs[toUnderlying(WBEntry::Type::CUSTOM) + 1]; /* Glib::RefPtr WhiteBalance::wbCameraPB, WhiteBalance::wbAutoPB, WhiteBalance::wbSunPB, WhiteBalance::wbTungstenPB, WhiteBalance::wbCloudyPB, WhiteBalance::wbShadePB, WhiteBalance::wbFluorescentPB, WhiteBalance::wbLampPB, @@ -43,24 +43,24 @@ void WhiteBalance::init () { - wbPixbufs[WBT_CAMERA] = RTImage::createFromFile ("wb-camera.png"); - wbPixbufs[WBT_AUTO] = RTImage::createFromFile ("wb-auto.png"); - wbPixbufs[WBT_DAYLIGHT] = RTImage::createFromFile ("wb-sun.png"); - wbPixbufs[WBT_CLOUDY] = RTImage::createFromFile ("wb-cloudy.png"); - wbPixbufs[WBT_SHADE] = RTImage::createFromFile ("wb-shade.png"); - wbPixbufs[WBT_WATER] = RTImage::createFromFile ("wb-water.png"); -// wbPixbufs[WBT_WATER2] = RTImage::createFromFile ("wb-water.png"); - wbPixbufs[WBT_TUNGSTEN] = RTImage::createFromFile ("wb-tungsten.png"); - wbPixbufs[WBT_FLUORESCENT] = RTImage::createFromFile ("wb-fluorescent.png"); - wbPixbufs[WBT_LAMP] = RTImage::createFromFile ("wb-lamp.png"); - wbPixbufs[WBT_FLASH] = RTImage::createFromFile ("wb-flash.png"); - wbPixbufs[WBT_LED] = RTImage::createFromFile ("wb-led.png"); - wbPixbufs[WBT_CUSTOM] = RTImage::createFromFile ("wb-custom.png"); + wbPixbufs[toUnderlying(WBEntry::Type::CAMERA)] = RTImage::createFromFile ("wb-camera.png"); + wbPixbufs[toUnderlying(WBEntry::Type::AUTO)] = RTImage::createFromFile ("wb-auto.png"); + wbPixbufs[toUnderlying(WBEntry::Type::DAYLIGHT)] = RTImage::createFromFile ("wb-sun.png"); + wbPixbufs[toUnderlying(WBEntry::Type::CLOUDY)] = RTImage::createFromFile ("wb-cloudy.png"); + wbPixbufs[toUnderlying(WBEntry::Type::SHADE)] = RTImage::createFromFile ("wb-shade.png"); + wbPixbufs[toUnderlying(WBEntry::Type::WATER)] = RTImage::createFromFile ("wb-water.png"); +// wbPixbufs[WBEntry::Type::WATER2] = RTImage::createFromFile ("wb-water.png"); + wbPixbufs[toUnderlying(WBEntry::Type::TUNGSTEN)] = RTImage::createFromFile ("wb-tungsten.png"); + wbPixbufs[toUnderlying(WBEntry::Type::FLUORESCENT)] = RTImage::createFromFile ("wb-fluorescent.png"); + wbPixbufs[toUnderlying(WBEntry::Type::LAMP)] = RTImage::createFromFile ("wb-lamp.png"); + wbPixbufs[toUnderlying(WBEntry::Type::FLASH)] = RTImage::createFromFile ("wb-flash.png"); + wbPixbufs[toUnderlying(WBEntry::Type::LED)] = RTImage::createFromFile ("wb-led.png"); + wbPixbufs[toUnderlying(WBEntry::Type::CUSTOM)] = RTImage::createFromFile ("wb-custom.png"); } void WhiteBalance::cleanup () { - for (unsigned int i = 0; i < WBT_CUSTOM + 1; i++) { + for (unsigned int i = 0; i < toUnderlying(WBEntry::Type::CUSTOM) + 1; i++) { wbPixbufs[i].reset(); } } @@ -147,7 +147,7 @@ return sval; } -WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL")), wbp(nullptr), wblistener(nullptr) +WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), false, true), wbp(nullptr), wblistener(nullptr) { Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); @@ -163,68 +163,68 @@ // Assign the model to the Combobox method->set_model(refTreeModel); - enum WBTypes oldType = WBParams::wbEntries[0]->type; - enum WBTypes currType; + WBEntry::Type oldType = WBParams::getWbEntries()[0].type; + WBEntry::Type currType; Gtk::TreeModel::Row row, childrow; - for (unsigned int i = 0; i < WBParams::wbEntries.size(); i++) { - if (oldType != (currType = WBParams::wbEntries[i]->type)) { + for (unsigned int i = 0; i < WBParams::getWbEntries().size(); i++) { + if (oldType != (currType = WBParams::getWbEntries()[i].type)) { // New entry type - if (currType == WBT_FLUORESCENT) { + if (currType == WBEntry::Type::FLUORESCENT) { // Creating the Fluorescent subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_FLUO_HEADER"); row[methodColumns.colId] = i + 100; } - if (currType == WBT_WATER) { + if (currType == WBEntry::Type::WATER) { // Creating the under water subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_WATER_HEADER"); row[methodColumns.colId] = i + 100; } - if (currType == WBT_LAMP) { + if (currType == WBEntry::Type::LAMP) { // Creating the Lamp subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_LAMP_HEADER"); row[methodColumns.colId] = i + 100; } - if (currType == WBT_LED) { + if (currType == WBEntry::Type::LED) { // Creating the LED subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_LED_HEADER"); row[methodColumns.colId] = i + 100; } - if (currType == WBT_FLASH) { + if (currType == WBEntry::Type::FLASH) { // Creating the Flash subcategory header row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; row[methodColumns.colLabel] = M("TP_WBALANCE_FLASH_HEADER"); row[methodColumns.colId] = i + 100; } } - if (currType == WBT_FLUORESCENT - || currType == WBT_LAMP - || currType == WBT_WATER - || currType == WBT_FLASH - || currType == WBT_LED + if (currType == WBEntry::Type::FLUORESCENT + || currType == WBEntry::Type::LAMP + || currType == WBEntry::Type::WATER + || currType == WBEntry::Type::FLASH + || currType == WBEntry::Type::LED ) { childrow = *(refTreeModel->append(row.children())); - childrow[methodColumns.colIcon] = wbPixbufs[currType]; - childrow[methodColumns.colLabel] = WBParams::wbEntries[i]->GUILabel; + childrow[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + childrow[methodColumns.colLabel] = WBParams::getWbEntries()[i].GUILabel; childrow[methodColumns.colId] = i; } else { row = *(refTreeModel->append()); - row[methodColumns.colIcon] = wbPixbufs[currType]; - row[methodColumns.colLabel] = WBParams::wbEntries[i]->GUILabel; + row[methodColumns.colIcon] = wbPixbufs[toUnderlying(currType)]; + row[methodColumns.colLabel] = WBParams::getWbEntries()[i].GUILabel; row[methodColumns.colId] = i; } @@ -349,9 +349,23 @@ spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); } -void WhiteBalance::adjusterChanged (Adjuster* a, double newval) + +void WhiteBalance::enabledChanged() { + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvWBEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvWBEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvWBEnabled, M("GENERAL_DISABLED")); + } + } +} + +void WhiteBalance::adjusterChanged (Adjuster* a, double newval) +{ int tVal = (int)temp->getValue(); double gVal = green->getValue(); double eVal = equal->getValue(); @@ -362,12 +376,24 @@ } Glib::ustring colLabel = row[methodColumns.colLabel]; - WBEntry* ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI); - WBEntry* wbCustom = findWBEntry ("Custom", WBLT_PP); + const std::pair ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI); + const std::pair wbCustom = findWBEntry ("Custom", WBLT_PP); - if (!ppMethod || (ppMethod->ppLabel != wbCustom->ppLabel && !((a == equal || a == tempBias) && ppMethod->type == WBT_AUTO)) ) { + if ( + !ppMethod.first + || ( + ppMethod.second.ppLabel != wbCustom.second.ppLabel + && !( + ( + a == equal + || a == tempBias + ) + && ppMethod.second.type == WBEntry::Type::AUTO + ) + ) + ) { methconn.block(true); - opt = setActiveMethod(wbCustom->GUILabel); + opt = setActiveMethod(wbCustom.second.GUILabel); tempBias->set_sensitive(false); cache_customWB (tVal, gVal); @@ -388,7 +414,7 @@ // Recomputing AutoWB if it's the current method will happen in improccoordinator.cc - if (listener) { + if (listener && getEnabled()) { if (a == temp) { listener->panelChanged (EvWBTemp, Glib::ustring::format ((int)a->getValue())); } else if (a == green) { @@ -403,7 +429,6 @@ void WhiteBalance::optChanged () { - Gtk::TreeModel::Row row = getActiveMethod(); if (row == refTreeModel->children().end()) { @@ -429,12 +454,12 @@ tempBias->setEditedState (UnEdited); } else { unsigned int methodId = findWBEntryId (row[methodColumns.colLabel], WBLT_GUI); - WBEntry* currMethod = WBParams::wbEntries[methodId]; + const WBEntry& currMethod = WBParams::getWbEntries()[methodId]; - tempBias->set_sensitive(currMethod->type == WBT_AUTO); + tempBias->set_sensitive(currMethod.type == WBEntry::Type::AUTO); - switch (currMethod->type) { - case WBT_CAMERA: + switch (currMethod.type) { + case WBEntry::Type::CAMERA: if (wbp) { double ctemp, cgreen; wbp->getCamWB (ctemp, cgreen); @@ -451,7 +476,7 @@ break; - case WBT_AUTO: + case WBEntry::Type::AUTO: if (wbp) { if (batchMode) { temp->setEditedState (UnEdited); @@ -464,7 +489,7 @@ break; - case WBT_CUSTOM: + case WBEntry::Type::CUSTOM: if (custom_temp > 0) { temp->setValue (temp->getAddMode() ? 0.0 : custom_temp); green->setValue (green->getAddMode() ? 0.0 : custom_green); @@ -484,19 +509,19 @@ break; /* All other solution are the default cases - case WBT_DAYLIGHT: - case WBT_CLOUDY: - case WBT_SHADE: - case WBT_TUNGSTEN: - case WBT_FLUORESCENT: - case WBT_LAMP: - case WBT_FLASH: - case WBT_LED:*/ + case WBEntry::Type::DAYLIGHT: + case WBEntry::Type::CLOUDY: + case WBEntry::Type::SHADE: + case WBEntry::Type::TUNGSTEN: + case WBEntry::Type::FLUORESCENT: + case WBEntry::Type::LAMP: + case WBEntry::Type::FLASH: + case WBEntry::Type::LED:*/ default: // recall custom WB settings if it exists, set to 1.0 otherwise - temp->setValue ( temp->getAddMode() ? 0.0 : (double)(currMethod->temperature)); - green->setValue (green->getAddMode() ? 0.0 : (double)(currMethod->green)); - equal->setValue (equal->getAddMode() ? 0.0 : (double)(currMethod->equal)); + temp->setValue ( temp->getAddMode() ? 0.0 : (double)(currMethod.temperature)); + green->setValue (green->getAddMode() ? 0.0 : (double)(currMethod.green)); + equal->setValue (equal->getAddMode() ? 0.0 : (double)(currMethod.equal)); if (batchMode) { temp->setEditedState (Edited); @@ -508,7 +533,7 @@ } } - if (listener) { + if (listener && getEnabled()) { listener->panelChanged (EvWBMethod, row[methodColumns.colLabel]); } } @@ -516,7 +541,6 @@ void WhiteBalance::spotPressed () { - if (wblistener) { wblistener->spotWBRequested (getSize()); } @@ -551,17 +575,21 @@ if (pedited && !pedited->wb.method) { opt = setActiveMethod(M("GENERAL_UNCHANGED")); } else { - WBEntry* wbValues = findWBEntry(pp->wb.method, WBLT_PP); - - if (!wbValues) { - wbValues = findWBEntry("Camera", WBLT_PP); - } + const WBEntry& wbValues = + [this, pp]() -> const WBEntry& + { + const std::pair res = findWBEntry(pp->wb.method, WBLT_PP); + return + !res.first + ? findWBEntry("Camera", WBLT_PP).second + : res.second; + }(); - opt = setActiveMethod(wbValues->GUILabel); + opt = setActiveMethod(wbValues.GUILabel); // temperature is reset to the associated temperature, or 0.0 if addMode is set. - switch (wbValues->type) { - case WBT_CUSTOM: + switch (wbValues.type) { + case WBEntry::Type::CUSTOM: temp->setValue (temp->getAddMode() ? 0.0 : pp->wb.temperature); green->setValue (green->getAddMode() ? 0.0 : pp->wb.green); equal->setValue (equal->getAddMode() ? 0.0 : pp->wb.equal); @@ -578,7 +606,7 @@ break; - case WBT_CAMERA: + case WBEntry::Type::CAMERA: if (wbp) { double ctemp = -1.0; double cgreen = -1.0; @@ -600,7 +628,7 @@ break; - case WBT_AUTO: + case WBEntry::Type::AUTO: // the equalizer's value is restored for the AutoWB equal->setValue (equal->getAddMode() ? 0.0 : pp->wb.equal); tempBias->setValue (tempBias->getAddMode() ? 0.0 : pp->wb.tempBias); @@ -620,18 +648,18 @@ /* All those types are the "default" case: - case WBT_DAYLIGHT: - case WBT_CLOUDY: - case WBT_SHADE: - case WBT_TUNGSTEN: - case WBT_FLUORESCENT: - case WBT_LAMP: - case WBT_FLASH: - case WBT_LED: + case WBEntry::Type::DAYLIGHT: + case WBEntry::Type::CLOUDY: + case WBEntry::Type::SHADE: + case WBEntry::Type::TUNGSTEN: + case WBEntry::Type::FLUORESCENT: + case WBEntry::Type::LAMP: + case WBEntry::Type::FLASH: + case WBEntry::Type::LED: */ default: // Set the associated temperature, or 0.0 if in ADD mode - temp->setValue(temp->getAddMode() ? 0.0 : (double)wbValues->temperature); + temp->setValue(temp->getAddMode() ? 0.0 : (double)wbValues.temperature); // Set the stored temperature, or 0.0 if in ADD mode green->setValue(green->getAddMode() ? 0.0 : pp->wb.green); equal->setValue(equal->getAddMode() ? 0.0 : pp->wb.equal); @@ -648,7 +676,12 @@ break; } - tempBias->set_sensitive(wbValues->type == WBT_AUTO); + tempBias->set_sensitive(wbValues.type == WBEntry::Type::AUTO); + } + + setEnabled(pp->wb.enabled); + if (pedited) { + set_inconsistent(multiImage && !pedited->wb.enabled); } methconn.block (false); @@ -666,12 +699,15 @@ pedited->wb.equal = equal->getEditedState (); pedited->wb.tempBias = tempBias->getEditedState (); pedited->wb.method = row[methodColumns.colLabel] != M("GENERAL_UNCHANGED"); + pedited->wb.enabled = !get_inconsistent(); } - WBEntry* ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI); + pp->wb.enabled = getEnabled(); + + const std::pair ppMethod = findWBEntry (row[methodColumns.colLabel], WBLT_GUI); - if (ppMethod) { - pp->wb.method = ppMethod->ppLabel; + if (ppMethod.first) { + pp->wb.method = ppMethod.second.ppLabel; } pp->wb.temperature = temp->getIntValue (); @@ -724,7 +760,7 @@ equal->showEditedCB (); tempBias->showEditedCB (); Gtk::TreeModel::Row row = *(refTreeModel->append()); - row[methodColumns.colId] = WBParams::wbEntries.size(); + row[methodColumns.colId] = WBParams::getWbEntries().size(); row[methodColumns.colLabel] = M("GENERAL_UNCHANGED"); } @@ -739,10 +775,11 @@ { methconn.block(true); - WBEntry *wbValues = findWBEntry("Custom", WBLT_PP); + const std::pair wbValues = findWBEntry("Custom", WBLT_PP); + setEnabled(true); temp->setValue (vtemp); green->setValue (vgreen); - opt = setActiveMethod(wbValues->GUILabel); + opt = setActiveMethod(wbValues.second.GUILabel); cache_customWB (vtemp, vgreen); // sequence in which this call is made is important; must be before "method->set_active (2);" cache_customEqual(equal->getValue()); temp->setEditedState (Edited); @@ -792,10 +829,10 @@ cache_customGreen (green); } -unsigned int WhiteBalance::findWBEntryId (const Glib::ustring &label, enum WB_LabelType lblType) +unsigned int WhiteBalance::findWBEntryId (const Glib::ustring& label, enum WB_LabelType lblType) { - for (unsigned int i = 0; i < WBParams::wbEntries.size(); i++) { - if (label == (lblType == WBLT_GUI ? WBParams::wbEntries[i]->GUILabel : WBParams::wbEntries[i]->ppLabel)) { + for (unsigned int i = 0; i < WBParams::getWbEntries().size(); i++) { + if (label == (lblType == WBLT_GUI ? WBParams::getWbEntries()[i].GUILabel : WBParams::getWbEntries()[i].ppLabel)) { return i; } } @@ -803,15 +840,15 @@ return 0; // default to camera wb } -WBEntry* WhiteBalance::findWBEntry (Glib::ustring label, enum WB_LabelType lblType) +std::pair WhiteBalance::findWBEntry(const Glib::ustring& label, enum WB_LabelType lblType) { - for (unsigned int i = 0; i < WBParams::wbEntries.size(); i++) { - if (label == (lblType == WBLT_GUI ? WBParams::wbEntries[i]->GUILabel : WBParams::wbEntries[i]->ppLabel)) { - return WBParams::wbEntries[i]; + for (unsigned int i = 0; i < WBParams::getWbEntries().size(); ++i) { + if (label == (lblType == WBLT_GUI ? WBParams::getWbEntries()[i].GUILabel : WBParams::getWbEntries()[i].ppLabel)) { + return {true, WBParams::getWbEntries()[i]}; } } - return nullptr; + return {false, WBParams::getWbEntries()[0]}; } int WhiteBalance::_setActiveMethod(Glib::ustring &label, Gtk::TreeModel::Children &children) @@ -860,6 +897,7 @@ { GThreadLock lock; disableListener(); + setEnabled(true); temp->setValue(temperature); green->setValue(greenVal); temp->setDefault(temperature); diff -Nru rawtherapee-5.3/rtgui/whitebalance.h rawtherapee-5.4/rtgui/whitebalance.h --- rawtherapee-5.3/rtgui/whitebalance.h 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/whitebalance.h 2018-03-20 11:04:15.000000000 +0000 @@ -57,7 +57,7 @@ } }; - static Glib::RefPtr wbPixbufs[rtengine::procparams::WBT_CUSTOM + 1]; + static Glib::RefPtr wbPixbufs[rtengine::toUnderlying(rtengine::procparams::WBEntry::Type::CUSTOM) + 1]; Glib::RefPtr refTreeModel; MethodColumns methodColumns; MyComboBox* method; @@ -85,9 +85,9 @@ int setActiveMethod (Glib::ustring label); int _setActiveMethod (Glib::ustring &label, Gtk::TreeModel::Children &children); - Gtk::TreeModel::Row getActiveMethod (); - unsigned int findWBEntryId (const Glib::ustring &label, enum WB_LabelType lblType = WBLT_GUI); - rtengine::procparams::WBEntry* findWBEntry (Glib::ustring label, enum WB_LabelType lblType = WBLT_GUI); + Gtk::TreeModel::Row getActiveMethod(); + unsigned int findWBEntryId (const Glib::ustring& label, enum WB_LabelType lblType = WBLT_GUI); + std::pair findWBEntry (const Glib::ustring& label, enum WB_LabelType lblType = WBLT_GUI); public: @@ -119,6 +119,7 @@ void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd); void trimValues (rtengine::procparams::ProcParams* pp); + void enabledChanged(); }; #endif diff -Nru rawtherapee-5.3/rtgui/xtransprocess.cc rawtherapee-5.4/rtgui/xtransprocess.cc --- rawtherapee-5.3/rtgui/xtransprocess.cc 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/rtgui/xtransprocess.cc 2018-03-20 11:04:15.000000000 +0000 @@ -29,11 +29,11 @@ hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); - for( size_t i = 0; i < procparams::RAWParams::XTransSensor::numMethods; i++) { + for (const auto method_string : RAWParams::XTransSensor::getMethodStrings()) { const std::string langKey = - [i]() -> std::string + [method_string]() -> std::string { - const std::string str(procparams::RAWParams::XTransSensor::methodstring[i]); + const std::string str(method_string); std::string res; for (const auto& c : str) { @@ -83,10 +83,10 @@ disableListener (); methodconn.block (true); - method->set_active(procparams::RAWParams::XTransSensor::numMethods); + method->set_active(std::numeric_limits::max()); - for( size_t i = 0; i < procparams::RAWParams::XTransSensor::numMethods; i++) - if( pp->raw.xtranssensor.method == procparams::RAWParams::XTransSensor::methodstring[i]) { + for (size_t i = 0; i < RAWParams::XTransSensor::getMethodStrings().size(); ++i) + if( pp->raw.xtranssensor.method == RAWParams::XTransSensor::getMethodStrings()[i]) { method->set_active(i); oldSelection = i; break; @@ -96,7 +96,7 @@ ccSteps->setEditedState (pedited->raw.xtranssensor.ccSteps ? Edited : UnEdited); if( !pedited->raw.xtranssensor.method ) { - method->set_active(procparams::RAWParams::XTransSensor::numMethods); // No name + method->set_active(std::numeric_limits::max()); // No name } } @@ -113,12 +113,12 @@ int currentRow = method->get_active_row_number(); - if( currentRow >= 0 && currentRow < procparams::RAWParams::XTransSensor::numMethods) { - pp->raw.xtranssensor.method = procparams::RAWParams::XTransSensor::methodstring[currentRow]; + if (currentRow >= 0 && currentRow < std::numeric_limits::max()) { + pp->raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodStrings()[currentRow]; } if (pedited) { - pedited->raw.xtranssensor.method = method->get_active_row_number() != procparams::RAWParams::XTransSensor::numMethods; + pedited->raw.xtranssensor.method = method->get_active_row_number() != std::numeric_limits::max(); pedited->raw.xtranssensor.ccSteps = ccSteps->getEditedState (); } } @@ -126,7 +126,7 @@ void XTransProcess::setBatchMode(bool batchMode) { method->append (M("GENERAL_UNCHANGED")); - method->set_active(procparams::RAWParams::XTransSensor::numMethods); // No name + method->set_active(std::numeric_limits::max()); // No name ToolPanel::setBatchMode (batchMode); ccSteps->showEditedCB (); } @@ -153,15 +153,16 @@ void XTransProcess::methodChanged () { - int curSelection = method->get_active_row_number(); + const int curSelection = method->get_active_row_number(); + const RAWParams::XTransSensor::Method method = RAWParams::XTransSensor::Method(curSelection); - Glib::ustring methodName = ""; + Glib::ustring methodName; bool ppreq = false; - if( curSelection >= 0 && curSelection < procparams::RAWParams::XTransSensor::numMethods) { - methodName = procparams::RAWParams::XTransSensor::methodstring[curSelection]; + if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { + methodName = RAWParams::XTransSensor::getMethodStrings()[curSelection]; - if (curSelection == procparams::RAWParams::XTransSensor::mono || oldSelection == procparams::RAWParams::XTransSensor::mono) { + if (method == RAWParams::XTransSensor::Method::MONO || RAWParams::XTransSensor::Method(oldSelection) == RAWParams::XTransSensor::Method::MONO) { ppreq = true; } } diff -Nru rawtherapee-5.3/tools/benchmarkRT rawtherapee-5.4/tools/benchmarkRT --- rawtherapee-5.3/tools/benchmarkRT 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/benchmarkRT 2018-03-20 11:04:15.000000000 +0000 @@ -31,7 +31,7 @@ wget --progress=dot:binary --continue --trust-server-names --tries=1 --timestamping "$1" 2>&1 | sed "s/^/\t/" return=${PIPESTATUS[0]} ((retries--)) - if [[ $return -eq 0 ]]; then # I don't trust wget to only exit with 0 if it downloaded the file succesfully, so I check. + if [[ $return -eq 0 ]]; then # I don't trust wget to only exit with 0 if it downloaded the file successfully, so I check. if [[ -f "$(basename "$1")" ]]; then break fi @@ -145,7 +145,7 @@ echo } else # otherwise if inFile is not a url, check if it exists - [[ ! -e "${inFile}" ]] && { # if it doesnt exist, choke + [[ ! -e "${inFile}" ]] && { # if it doesn't exist, choke printf "%s\n" "You specified" "-i ${inFile}" "but that file does not exist." exit 1 } @@ -242,7 +242,7 @@ ## t="$(( $RANDOM %20 )).$(( $RANDOM %999 ))" # benchmark stores time array of each run, gets reset after each PP3 benchmark+=("$t") - # total stores time array of each run, doesnt get reset, adds up total afterwards + # total stores time array of each run, doesn't get reset, adds up total afterwards total+=("$t") i="$(printf "%02d\n" "$i")" if [[ $testAllTools -eq 1 ]]; then diff -Nru rawtherapee-5.3/tools/build-rawtherapee rawtherapee-5.4/tools/build-rawtherapee --- rawtherapee-5.3/tools/build-rawtherapee 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/build-rawtherapee 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,148 @@ +#!/usr/bin/env bash +# By Morgan Hardwood +# Version 2018-01-06 +# This script gets the latest source code for the given program and compiles it. + +# The name of the program, used for the folder names: +prog="rawtherapee" + +# The name of the compiled executable: +exe="${prog}" + +# The name of the sub-folder, if any, relative to the folder into which the +# compiled executable is placed. +# e.g. If the executable ends up in: +# ~/programs/someProgram/foo/bar/someExecutable +# then set it to: +# exeRelativePath="foo/bar" +# or if the executable ends up in +# ~/programs/someProgram/someExecutable +# then leave it empty: +# exeRelativePath="" +exeRelativePath="" + +# The path to the repository: +repo="https://github.com/Beep6581/RawTherapee.git" + +# No touching below this line, with the exception of the "Compile" section +# ----------------------------------------------------------------------------- + +# The name of the project's standard branch, typically "master": +master="dev" + +buildOnly="false" +buildType="release" + +# Removes the trailing forward-slash if one is present +exeRelativePath="${exeRelativePath/%\/}" +# Append forward-slash to exeRelativePath only if it is not empty. +exePath="${exeRelativePath:+${exeRelativePath}/}${exe}" + +# Command-line arguments +OPTIND=1 +while getopts "bdh?-" opt; do + case "${opt}" in + b) buildOnly="true" + ;; + d) buildType="debug" + ;; + h|\?|-) printf '%s\n' "This script gets the latest source code for ${prog} and compiles it." \ + "" \ + " -b" \ + " Optional. If specified, the script only compiles the source, it does not try to update the source. If not specified, the source will be updated first." \ + " -d" \ + " Optional. Compile a \"debug\" build. If not specified, a \"release\" build will be made." \ + "" + exit 0 + ;; + esac +done +shift $((OPTIND-1)) +[ "$1" = "--" ] && shift + +printf '%s\n' "" "Program name: ${prog}" "Build type: ${buildType}" "Build without updating: ${buildOnly}" "" + +# Clone if needed +cloned="false" +updates="false" +if [[ ! -d "$HOME/programs/code-${prog}" ]]; then + mkdir -p "$HOME/programs" || exit 1 + git clone "$repo" "$HOME/programs/code-${prog}" || exit 1 + pushd "$HOME/programs/code-${prog}" 1>/dev/null || exit 1 + cloned="true" +else + pushd "$HOME/programs/code-${prog}" 1>/dev/null || exit 1 + git fetch + if [[ $(git rev-parse HEAD) != $(git rev-parse '@{u}') ]]; then + updates="true" + fi +fi + +# Pull updates if necessary +if [[ "$updates" = "true" && "$buildOnly" = "false" ]]; then + git pull || exit 1 +fi + +# Find out which branch git is on +branch="$(git rev-parse --abbrev-ref HEAD)" + +# Set build and install folder names +if [[ $branch = $master && $buildType = release ]]; then + buildDir="$HOME/programs/code-${prog}/build" + installDir="$HOME/programs/${prog}" +else + buildDir="$HOME/programs/code-${prog}/build-${branch}-${buildType}" + installDir="$HOME/programs/${prog}-${branch}-${buildType}" +fi + +existsExe="false" +if [[ -e "${installDir}/${exePath}" ]]; then + existsExe="true" +fi + +# Quit if no updates and build-only flag not set +if [[ "$cloned" = "false" && "$buildOnly" = "false" && "$updates" = "false" && "$existsExe" = "true" ]]; then + printf '%s\n' "No updates, nothing to do." + exit 0 +fi + +# Determine CPU count +cpuCount="fail" +if command -v nproc >/dev/null 2>&1; then + cpuCount="$(nproc --all)" +fi +if [[ ! ( $cpuCount -ge 1 && $cpuCount -le 64 ) ]]; then + cpuCount=1 +fi + +# Prepare folders +rm -rf "${installDir}" +mkdir -p "${buildDir}" "${installDir}" || exit 1 +cd "${buildDir}" || exit 1 + +# ----------------------------------------------------------------------------- +# Compile + +# See: +# http://rawpedia.rawtherapee.com/Linux#Compile_RawTherapee + +cmake \ + -DCMAKE_BUILD_TYPE="$buildType" \ + -DCACHE_NAME_SUFFIX="5-dev" \ + -DPROC_TARGET_NUMBER="2" \ + -DBUILD_BUNDLE="ON" \ + -DBUNDLE_BASE_INSTALL_DIR="${installDir}" \ + -DOPTION_OMP="ON" \ + -DWITH_LTO="OFF" \ + -DWITH_PROF="OFF" \ + -DWITH_SAN="OFF" \ + -DWITH_SYSTEM_KLT="OFF" \ + -DWITH_BENCHMARK="OFF" \ + "$HOME/programs/code-${prog}" || exit 1 + +make --jobs="$cpuCount" install || exit 1 + +# Finished +printf '%s\n' "" "To run ${prog} type:" "${installDir}/${exePath}" "" + +popd 1>/dev/null diff -Nru rawtherapee-5.3/tools/buildRT rawtherapee-5.4/tools/buildRT --- rawtherapee-5.3/tools/buildRT 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/buildRT 1970-01-01 00:00:00.000000000 +0000 @@ -1,450 +0,0 @@ -#!/usr/bin/env bash -# Written by DrSlony -# buildRT version 4.4, 2016-03-03 -# Please report bugs or enhancements to https://github.com/Beep6581/RawTherapee/issues -# www.rawtherapee.com -# www.londonlight.org - -head -n 4 $0 | tail -n 2 | sed $'1s/.\+/\E[1m&\E[0m/' -echo - -if [[ $UID -eq 0 ]]; then - printf "%s\n" "Do not run this script as root!" "Aborting" - exit 1 -fi - -alert () { - case "$alert_type" in - notify-send) notify-send "RawTherapee" "$1" ;; - kdialog) kdialog --title "RawTherapee" --passivepopup "$(printf "%b\n" "$1")" ;; - zenity) zenity --notification --text="$(printf "%b\n" "$1")" ;; - xmessage) xmessage -nearmouse "$(printf "%b\n" "$1")" ;; - none) printf "%b\n" "" "Compilation complete:" "$1" ;; -esac -} - -#--- Set some variables -unset choiceNumber choiceNumbers buildType buildTypes list branch branches repo -version="4.3" -movetoPatched="" -repo="${HOME}/rawtherapee" -procTarget=2 - -while getopts "bc:fnp:s:t:uvh?-" opt; do - case "${opt}" in - b) patched="yes" - movetoPatched="_patched" - printf "%s\n" "Buildonly flag detected, will not git pull or checkout" ;; - c) dCacheNameSuffix="$OPTARG" - dCacheNameSuffix=${dCacheNameSuffix//[^\.\-_a-zA-Z0-9]/}; - forceCmake="yes" - printf "%s\n" "Cache and config name suffix: $dCacheNameSuffix" ;; - f) forceCmake="yes" - printf "%s\n" "Will forcefully re-run CMake" ;; - n) noomp="-DOPTION_OMP=OFF" - forceCmake="yes" - printf "%s\n" "OpenMP disabled" ;; - p) procTarget="$OPTARG" - if [[ $procTarget -lt 1 || $procTarget -gt 9 ]]; then - printf "%s\n" "Invalid processor target value." "Use a value from 1 to 9, e.g." "./buildRT -p 1" "See ProcessorTargets.cmake" "Aborting" - exit 1 - forceCmake="yes" - fi ;; - s) movetoPatched="_${OPTARG//[^\.\-_a-zA-Z0-9]/}" - printf "%s\n" "Suffix of destination build dir: ${movetoPatched}" ;; - t) titleSuffix="${OPTARG//[^\.\-\:\ \+_a-zA-Z0-9]/}" - forceCmake="yes" - printf "%s\n" "Titlebar version suffix: ${titleSuffix}" ;; - u) gcVer="$(curl "https://raw.githubusercontent.com/Beep6581/RawTherapee/master/tools/buildRT" 2>/dev/null | grep "^#.*[vV]ersion.*")" || { echo "\"curl\" program not found, please install it first."; exit 1; } - gcVer="${gcVer##*[[:alpha:]] }" - gcVer="${gcVer%%,*}" - latestVer="$(printf "%s\n" "$version" "$gcVer" | sort -rV | head -n 1)" - if [[ $version = $latestVer ]]; then - printf "%s\n" "You are using the latest version of buildRT, $version" - exit 0 - else - printf "%s\n" "You are using version $version but version $gcVer is available on GitHub." "You can download the GitHub version from this URL:" " https://raw.githubusercontent.com/Beep6581/RawTherapee/master/tools/buildRT" "Replace it with this script, and remember to run \"chmod +x buildRT\"" - exit 0 - fi ;; - v) verbose=yes - printf "%s\n" "Verbose mode, I will spam your screen with warnings" ;; - h|\?|-) printf "%s\n" "Usage:" "" " $0 [-b] [-c ] [-f] [-n] [-p <1-9>] [-s ] [-t \"\"] [-v]" "" - printf "%s\n" \ - " -b" \ - "Build-only mode. buildRT uses \"git checkout master\" to update your source code repository to the newest revision, however doing so might destroy any uncommitted or unpushed changes you made or any patches you applied. With the -b flag the script will not update the source code, so that you can easily compile RawTherapee with whatever patches you manually applied. buildRT should automatically detect if you modified the source code, but you can use this flag to force build-only mode." "Generally when compiling patched RT versions you want to keep the cache and config folders separate, so consider using \"-b -c _testing\"" "" \ - " -c " \ - "Specify a suffix to the cache and config directory names. Only alphanumerics, periods, dashes and underscores are valid. The default value is \"4\", which will result in your build of RawTherapee storing the cache in \"${HOME}/.cache/RawTherapee4\" and config in \"${HOME}/.config/RawTherapee4\". For example, use \"-c _testing\" if you want to test older or patched versions of RawTherapee without potentially damaging your \"real\" cache and config files." "" \ - " -f" \ - "Force CMake to re-run." "" \ - " -n" \ - "Disable OpenMP." "" \ - " -p <1-9>" \ - "Set which processor target to use. Takes a single digit from 1 to 9. The default is 2. See ProcessorTargets.cmake" "" \ - " -s " \ - "Suffix of destination build directory, so that if you have applied a patch, say \"dustremoval-1.patch\", and want to have RawTherapee compiled to a folder whose name ends with \"_dustremoval1\", you would set \"-s dustremoval1\" (the underscore is automated)." "" \ - " -t \"\"" \ - "Suffix displayed next to the RawTherapee version in the window titlebar. It is recommended that you include the commit of the newest public commit (the one you would see if you cloned the repository anew) so it is clear which commit you applied the patches to. E.g.:" "-t \": ee72ddbcfd4e + dustremoval-1.patch + mustafa ibrahim\"" "" \ - " -u" \ - "Check for an update of buildRT on GitHub." "" \ - " -v" \ - "Make compilation verbose, so you see all compiler warnings." | fold -s - exit 0 ;; -esac -done -shift $((OPTIND-1)) -[ "$1" = "--" ] && shift - -printf "%s\n" "Repository: ${repo}" -printf "%s\n" "Processor target: ${procTarget}" - -if [[ -z $verbose ]]; then - Wcflags="-Wno-unused-result -Wno-aggressive-loop-optimizations" -fi - -cpuCount="$(grep -c 'processor' /proc/cpuinfo)" -# We can assume that if grep returns more than 32 lines (CPUs), or nothing at all, something's wrong -if (( cpuCount < 1 || cpuCount > 32 )); then - cpuCount="1" -fi -printf "%s\n" "CPU count: ${cpuCount}" - -# Zenity --notification is broken in <=3.8.0, removed Zenity support for now. -# elif hash zenity 2>/dev/null; then alert_type="zenity" -if hash notify-send 2>/dev/null; then alert_type="notify-send" -elif hash kdialog 2>/dev/null; then alert_type="kdialog" -elif hash xmessage 2>/dev/null; then alert_type="xmessage" -else alert_type="none" -fi - -# list from http://linuxmafia.com/faq/Admin/release-files.html -distributions=( -"Annvix /etc/annvix-release" -"Arch /etc/arch-release" -"Arklinux /etc/arklinux-release" -"Aurox /etc/aurox-release" -"BlackCat /etc/blackcat-release" -"Cobalt /etc/cobalt-release" -"Conectiva /etc/conectiva-release" -"Debian /etc/debian_version" -"Fedora /etc/fedora-release" -"Gentoo /etc/gentoo-release" -"Immunix /etc/immunix-release" -"Knoppix knoppix_version" -"Linux-From-Scratch /etc/lfs-release" -"Linux-PPC /etc/linuxppc-release" -"Mandrake /etc/mandrake-release" -"Mandriva_Mandrake /etc/mandriva-release /etc/mandrake-release /etc/mandrakelinux-release" -"Mint /etc/linuxmint/info" -"MkLinux /etc/mklinux-release" -"Novell /etc/nld-release" -"PLD /etc/pld-release" -"RedHat /etc/redhat-release" -"CentOS /etc/centos-release" -"Slackware /etc/slackware-version" -"SME /etc/e-smith-release" -"Solaris /etc/release" -"SunJDS /etc/sun-release" -"SUSE /etc/SuSE-release" -"TinySofa /etc/tinysofa-release" -"TurboLinux /etc/turbolinux-release" -"Ubuntu /etc/lsb-release" -"UltraPenguin /etc/ultrapenguin-release" -"United /etc/UnitedLinux-release" -"VA-Linux /etc/va-release" -"YellowDog /etc/yellowdog-release" -) -for element in "${distributions[@]}"; do - read distro loc1 loc2 loc3 <<< "$element" - for loc in $loc1 $loc2 $loc3 - do - # distribution=${distro} because if none of the elements match, distro will =YellowDog (last item in the list) - # add "break 2;" to the end if we really want to, but Ubuntu gets detected as Debian first, then as Ubuntu, - # so we might want to not break the loop. - [[ -e "$loc" ]] && distribution=${distro} - [[ "$distribution" = Gentoo ]] && break 2 - done -done -if [[ -z ${distribution} ]]; then - printf "%s\n" "" "Could not automatically detect your distribution. Please enter your distribution's name below followed immediately by the version, without any spaces or punctuation marks, and hit enter to confirm, e.g. \"Ubuntu1310\", \"Mint15\" or \"OpenSUSE123\"" | fold -s - read distribution - #sanitize - distribution=${distribution//[^a-zA-Z0-9]/} -fi -printf "%s\n" "Distribution: ${distribution}"; - -bits="$(uname -m)" || { printf "%s\n" "Is your system a 32-bit or 64-bit one?" "Enter 32 or 64 and hit enter: "; read bits; bits=${bits//[^0-9]/}; } -if [[ $bits = *64* ]]; then - bits=64 -else - bits=32 -fi -printf "%s\n" "System: ${bits}-bit" "" - -#--- Check script dependencies -hash git 2>/dev/null || { echo >&2 "Git not found, install Git first and then re-run this script."; exit 1; } - -#--- Clone and/or pull -if [[ ! -d "${repo}" ]]; then - printf "%s\n" "${repo} not found, cloning from GitHub..." - git clone https://github.com/Beep6581/RawTherapee.git "${repo}" - cd "${repo}" || exit 1 - verLatesttag="$(git describe --tags --abbrev=0)" - verLatesttagdistance="$(git describe --tags | sed -e 's/.*-\([0-9]\+\)-.*/\1/')" - currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')" - rev="$(git rev-list --all --count)" - node="$(git rev-parse --short HEAD)" - printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n" - alert "Repository cloned succesfully. What would you like to do next?" - printf "%b" "Repository cloned succesfully.\n" "Press 'q' to quit or any other key to continue... " - read -r -n 1 - echo - [[ $REPLY = q || $REPLY = Q ]] && { printf "%s\n" "Quitting." ""; exit 0; } -fi -cd "${repo}" || exit 1 - -#--- Update or decide what to do if user edited the source code (e.g. by applying a patch) -if [[ -z $patched ]]; then - uncommitted="$(git status -s | sed "s/^/\t/")" - unpushed="$(git log origin..HEAD | sed "s/^/\t/" || echo "Could not check for unpushed changes (check your internet connection), but continuing anyway.")" -fi -if [[ -z $uncommitted && -z $unpushed && -z $patched ]]; then - git pull || echo "Could not \"git pull\" (check your internet connection), but continuing anyway." - git checkout master - echo -elif [[ -z $patched ]]; then - printf "%s\n" "" "Warning! There are uncommitted or unpushed changes in the repository!" "Uncommitted:" "$uncommitted" "Unpushed:" "$unpushed" "" "This means that you edited the source code (e.g. applied a patch). If the script proceeds to update the repository, those changes you made to the source code might be lost. Your choices are to force the update and possibly lose the changes, not to update and to compile RT as-is, or to abort the script." | fold -s - read -r -p "[f]orce update, [c]ompile as-is, or [a]bort? " fca - case $fca in - f|F) git pull || echo "Could not \"git pull\" (check your internet connection), but continuing anyway." - git checkout master - echo ;; - c|C) printf "%s\n" "Retaining edited source code and compiling RT as-is." "" - patched="yes" - if [[ -z $movetoPatched ]]; then - movetoPatched="_patched" - fi ;; - *) printf "%s\n" "User aborted" "" - exit 0 ;; - esac -else - printf "%s\n" "Retaining edited source code and compiling RT as-is." "" - if [[ -z $movetoPatched ]]; then - movetoPatched="_patched" - fi -fi - -cd "${repo}" || exit 1 -verLatesttag="$(git describe --tags --abbrev=0)" -verLatesttagdistance="$(git describe --tags | sed -e 's/.*-\([0-9]\+\)-.*/\1/')" -currentBranch="$(git branch | grep "*" | sed -e 's/.* \+//')" -rev="$(git rev-list --all --count)" -node="$(git rev-parse --short HEAD)" -printf "\nRepository state:\n Branch: ${currentBranch}\n RawTherapee-${verLatesttag}.${verLatesttagdistance}\n Commit: ${rev}:${node}\n Latest tag: ${verLatesttag}\n\n" - -#--- Print the menu -branches=() -if [[ -z $patched ]]; then - while read -r branch; do - branches+=("$branch") - done < <(git branch -a | grep origin | sed -e 's/.*\///'| sort -uf) -else - branches="$(git branch | grep "*" | sed -e 's/.* \+//')" -fi - -# Make the menu list -list=("0" "[abort]" "[exit]") -num="1" -buildTypes=("release" "debug") -for branch in "${branches[@]}"; do - for buildType in "${buildTypes[@]}"; do - list+=("$num" "${branch}" "${buildType}") - ((num++)) - done -done - -printf "%s\n" "---------------------------------------------" -printf "%s\t%s\t%s\n" "#" "Branch" "Build Type" "${list[@]}" | column -t -s $'\t' -c 3 | sed $'1s/.\+/\E[1m&\E[0m/' -printf "%s\n" "---------------------------------------------" "" "Enter your choices, each number separated by a single space, e.g. 3 4" "If you don't know which option to choose, then choose the \"default\" branch, \"release\" build type." "" | fold -s - -# make sure choices are valid -checkChoices () { - choiceNumbers="${choiceNumbers//[^0-9 ]/}" - # all choiceNumbers must exist in listNums, else ask again - for choiceNumber in "${choiceNumbers[@]}"; do - if [[ "${choiceNumber}" = 0 ]]; then - exit 0; - fi - found=0 - # for each num in list[@] - for (( o=3 ; o<${#list[@]} ; ((o+=3)) )); do - if [[ "${list[$o]}" = ${choiceNumber} ]]; then - found=1; - fi - done - # if one of the numbers the user typed arent in the list, break the loop and ask for input again - if [[ $found = 0 ]]; then - [[ -n ${choiceNumbers[@]} ]] && printf '%s\n' "Invalid choices, try again." - return 1; - fi - done -} - -# keep repeating read until choices are valid -until checkChoices; do - read -r -p "Your choices: " -a choiceNumbers -done -printf "%s\n" "" "---------------------------------------------" "" - -#--- Compile the chosen builds -for choiceNumber in "${choiceNumbers[@]}"; do - if [[ $choiceNumber = 0 ]]; then - printf "%s\n" "User exited." - exit 0; - fi - # ${array[@]:offset:length} - # choiceNumber*3 to get the human menu choice to match the correct array index, and then +1 so we offset to branch and buildType, not #. - IFS=$'\t' read -r branch buildType < <(printf "%s\t%s\n" "${list[@]:$(($((choiceNumber*3))+1)):2}") - # extra safety check - if [[ -z "$branch" ]] || [[ -z "$buildType" ]]; then - print '%s\n' "Something went wrong with the selection, \"branch\" or \"buildType\" empty." "Aborting" - exit 1 - fi - # This seems useless "$branch != default" - # if [[ -z $patched && $branch != default ]]; then - if [[ -z $patched ]]; then - printf "%s\n" "Updating to branch $branch" - git checkout "$branch" || exit 1 - fi - echo - printf "%-15b %b\n" "\E[1mWill compile\E[0m:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" "" - - [[ -d "${HOME}/rt_${branch}_${buildType}${movetoPatched}" ]] && { - printf "%s\n" "Found old build directory ${HOME}/rt_${branch}_${buildType}${movetoPatched}" "To proceed you must either delete it, or choose a suffix for the destination folder for this build." - read -r -p "[d]elete old build, [r]ename this build destination folder, or [a]bort " - echo - case $REPLY in - d|D) rm -rf "${HOME}/rt_${branch}_${buildType}${movetoPatched}" || exit 1 ;; - r|R) printf "%s\n" "The build will be saved to \"${HOME}/rt_${branch}_${buildType}_X\" where \"X\" will be replaced with whatever suffix you choose next. Only alphanumerics, dashes, underscores and periods are valid." | fold -s - read -r -p "Suffix: " - movetoPatched="_${REPLY//[^\.\-_a-zA-Z0-9]/}" - printf "%s\n" "Build will be compiled to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\"" ;; - a|A) printf "%s\n" "Cannot proceed if old build directory exists." "Remove it or rename it, then re-run this script." "Aborting" - exit 0 ;; - *) printf "%s\n" "Unknown response \"$REPLY\"" - exit 1 ;; - esac - } - - cd "${repo}" || exit 1 - - [[ -z $dCacheNameSuffix ]] && dCacheNameSuffix="${verLatesttag%%.*}" - - # need to rerun cmake if buildtype changed - if [[ -e build/CMakeCache.txt ]]; then - previousBuildType="$(grep 'CMAKE_BUILD_TYPE:STRING=' build/CMakeCache.txt)" - previousBuildType="${previousBuildType##*=}" - fi - if [[ ! -e build/CMakeCache.txt || $previousBuildType != "$buildType" ]]; then - forceCmake="yes" - fi - - if [[ ! -d "${repo}/build" || $forceCmake = yes ]]; then - # Clean up leftovers from previous successful or failed builds - [[ -d "${repo}/${buildType}" ]] && { printf "%s\n" "Found old build directory \"${repo}/$buildType\". Removing it."; rm -rf "${repo}/${buildType}"; } - [[ -d "${repo}/rawtherapee" ]] && { printf "%s\n" "Found old build directory \"${repo}/rawtherapee\". Removing it."; rm -rf "${repo}/rawtherapee"; } - [[ -d "${repo}/build" ]] && { printf "%s\n" "Found old build directory \"${repo}/build\". Removing it."; rm -rf "${repo}/build"; } - printf "%s\n" "" "Cleaning out old CMake files" - make clean || { printf "%s\n" "Error while running \"make clean\", aborting." "Easiest solution: delete ${repo} and re-run buildRT."; exit 1; } - ./clean.sh || { printf "%s\n" "Error while running \"./clean.sh\", aborting." "Easiest solution: delete ${repo} and re-run buildRT."; exit 1; } - mkdir "${repo}/build" || exit 1 - - # As of changeset 1930:067e362c6f28 on Mon Jun 25 2012, revision number 1930, RT supports and encourages out-of-source builds. - if (( rev < 1930 )); then - cmake \ - -DCMAKE_BUILD_TYPE="$buildType" \ - -DPROC_TARGET_NUMBER="$procTarget" \ - -DCMAKE_C_FLAGS="-pipe" \ - -DCMAKE_CXX_FLAGS="$CMAKE_C_FLAGS $Wcflags" \ - "$noomp" \ - -DCMAKE_INSTALL_PREFIX="build" \ - -DBUILD_BUNDLE="ON" \ - -DBINDIR="." \ - -DDATADIR="." \ - -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" \ - || { echo "Error during cmake, exiting."; exit 1; } - else - cd "${repo}/build" - cmake \ - -DCMAKE_BUILD_TYPE="$buildType" \ - -DPROC_TARGET_NUMBER="$procTarget" \ - -DCMAKE_C_FLAGS="-pipe" \ - -DCMAKE_CXX_FLAGS="$CMAKE_C_FLAGS $Wcflags" \ - "$noomp" \ - -DCMAKE_INSTALL_PREFIX="build" \ - -DBUILD_BUNDLE="ON" \ - -DBINDIR="." \ - -DDATADIR="." \ - -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" \ - -DVERSION_SUFFIX="$titleSuffix" \ - ../ \ - || { echo "Error during cmake, exiting."; exit 1; } - fi - fi - echo - - if (( rev >= 1930 )); then - cd "${repo}/build" || exit 1 - fi - - printf "%s\n" "" "Starting compilation:" - time { make -j${cpuCount} install; } || { printf "%s\n" "" "Error during make, exiting."; exit 1; } - printf "%-15b %b\n" "" "" "RawTherapee compiled:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" "\tCache:" "${HOME}/.cache/RawTherapee${dCacheNameSuffix}" "\tConfig:" "${HOME}/.config/RawTherapee${dCacheNameSuffix}" "" "" - - # RT used to build into various places over the years. - # We want to end up with the build in a folder called "/build/rawtherapee" regardless of which old version you compile, and then to zip it, so we move dirs around: - if (( rev < 1930 )); then - if [[ -d "${repo}/${buildType}" ]]; then - printf "%s\n" "Moving \"${repo}/${buildType}\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/${buildType}" "${repo}/build/rawtherapee" - elif [[ -d "${repo}/rawtherapee" ]]; then - printf "%s\n" "Moving \"${repo}/rawtherapee\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/rawtherapee" "${repo}/build/rawtherapee" - elif [[ ! -d "${repo}/build" ]]; then - { printf "%s\n" "Could not find the \"build\" directory containing the compiled RawTherapee in ${repo}" "Please notify DrSlony in the forum:" "http://rawtherapee.com/forum/viewtopic.php?f=10&t=3001#p22213" "" "Exiting"; exit 1; } - fi - elif [[ -d "${repo}/build/${buildType}" ]]; then - printf "%s\n" "Moving \"${repo}/build/${buildType}\" to \"${repo}/build/rawtherapee\"" - mv "${repo}/build/${buildType}" "${repo}/build/rawtherapee" - fi - - echo - cd "${repo}/build" - # ${repo}/build/AboutThisBuild.txt doesn't exist with older versions - # Put "AboutThisBuild.txt" alongside the "rawtherapee" dir for the zip so that the website can extract the needed info when uploading the build (no other reason) - if [[ ! -e AboutThisBuild.txt ]]; then - cp "rawtherapee/AboutThisBuild.txt" AboutThisBuild.txt || { printf "%s\n" "Could not copy ${repo}/build/rawtherapee/AboutThisBuild.txt to ${repo}/build/AboutThisBuild.txt, exiting."; exit 1; } - fi - - cat AboutThisBuild.txt || { printf "%s\n" "${repo}/build/AboutThisBuild.txt not found, exiting."; exit 1; } - - if [[ -z $patched ]]; then - printf "%s\n" "Zipping the compiled RawTherapee dir \"${repo}/build/rawtherapee\" and putting it in \"/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip\"" - [[ -e "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" ]] && { rm "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" || exit 1; } - zip -Xrq "/tmp/RawTherapee_${branch}_${distribution}_${bits}_${verLatesttag}.${verLatesttagdistance}_${buildType}.zip" AboutThisBuild.txt rawtherapee - fi - - # Now that the zip is ready, the build can be moved to ~/rt__<_patched> - printf "%s\n" "" "Moving \"${repo}/build/rawtherapee\" to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\"" - mv "${repo}/build/rawtherapee" "${HOME}/rt_${branch}_${buildType}${movetoPatched}" || { printf "%s\n" "" "Could not move \"${repo}/build/rawtherapee\" to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\", exiting."; exit 1; } - - printf "%-15b %b\n" "" "" "Build ready:" "" "\tChoice number:" "$choiceNumber" "\tBranch:" "$branch" "\tBuild type:" "$buildType" "\tTarget:" "$procTarget" - printf "%b\n" "" "\E[1mTo run RawTherapee\E[0m, fire up a terminal and type:" "~/rt_${branch}_${buildType}${movetoPatched}/rawtherapee" "" "------------------------------------------" - alert "RawTherapee-${verLatesttag}.${verLatesttagdistance} ready.\nChoice number ${choiceNumber}, branch: ${branch}, type: ${buildType}, target: ${procTarget}" -done - -# builds=( /tmp/RawTherapee* ); for f in ${builds[@]}; do echo ${f#/tmp/}; done -if [[ -z $patched ]]; then - printf "%s\n" "RawTherapee zipped builds ready in /tmp" - ls -lh /tmp/RawTherapee* -fi -printf "%s\n" "" "Finished building all chosen versions of RawTherapee" diff -Nru rawtherapee-5.3/tools/generateRtexifUpdates rawtherapee-5.4/tools/generateRtexifUpdates --- rawtherapee-5.3/tools/generateRtexifUpdates 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/generateRtexifUpdates 2018-03-20 11:04:15.000000000 +0000 @@ -11,7 +11,7 @@ # Blame DrSlony # Please report bugs or enhancements to https://github.com/Beep6581/RawTherapee -et="$HOME/programs/Image-ExifTool-10.61/exiftool" +et="$HOME/programs/code-exiftool/exiftool" hash "$et" 2>/dev/null || { echo >&2 "ExifTool not found, install it first."; exit 1; } hash xmlstarlet 2>/dev/null || { echo >&2 "XMLStarlet not found, install it first."; exit 1; } @@ -29,30 +29,58 @@ mkdir -p "$tmpdir" || { printf '%s\n' "Error creating $tmpdir" ""; exit 1; } echo +#------------------------------------------------------------------------------ # Canon printf '%s\n' "Saving ${tmpdir}/canon_lenses" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensType']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -canon:all) | sort -fuV > "${tmpdir}/canon_lenses" -sed -r -i -e '/-1\tn\/a/d' -e 's/([0-9]+)[0-9.]*\t/\1, "/' -e 's/^/ choices.insert (p_t (/' -e 's/$/"));/' -e 's| F/([0-9]+)| f/\1|' "${tmpdir}/canon_lenses" -# xmlstarlet sel -T -t -m "taginfo/table/tag[@name='EasyMode']/values/key" -v "concat(@id,' ',val)" -n < <(exiftool -listx -canon:all) | sed -r -e '/-1\tn\/a/d' -e 's/([0-9]+)[0-9.]*\t/\1] = "/' -e 's/^/ choices[/' -e 's/$/";/' + +#In :10.1 Sigma 50mm f/2.8 EX +#Out: {10, "Sigma 50mm f/2.8 EX"}, +# delete lines matching '-1n/a' +# replace '10.1Sigma' with '10, "Sigma' +# prepend whitespace +# append closing braces +# replace ' F/11' with ' f/11' +sed -r -i \ + -e '/-1\tn\/a/d' \ + -e 's/([0-9]+)[0-9.]*\t/\1, "/' \ + -e 's/^/ {/' \ + -e 's/$/"},/' \ + -e 's| F/([0-9]+)| f/\1|' \ + "${tmpdir}/canon_lenses" + +#In :16842752 PowerShot A30 +#Out: choices[16842752] = "PowerShot A30"; +# prepend whitespace and 'choices[' +# replace with '] = "' +# append '";' printf '%s\n' "Saving ${tmpdir}/canon_cameras" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='CanonModelID']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -canon:all) | sort -fuV > "${tmpdir}/canon_cameras" -sed -r -i -e 's/^/ choices[/' -e 's/\t/] = "/' -e 's/$/";/' "${tmpdir}/canon_cameras" +sed -r -i \ + -e 's/^/ choices[/' \ + -e 's/\t/] = "/' \ + -e 's/$/";/' \ + "${tmpdir}/canon_cameras" +#------------------------------------------------------------------------------ # Nikon LensIDs are composite tags printf '%s\n' "Saving ${tmpdir}/nikon" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensID']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -composite:all) > "${tmpdir}/nikon" sed -r -i -e '/^... /d' -e 's/^/ {"/' -e 's/([A-F0-9]+)[A-F0-9.]*\t/\1", "/' -e 's/$/"},/' -e 's|(.* ")(.*) F([0-9]+)|\1\2 f/\3|' -e 's| F/([0-9]+)| f/\1|' "${tmpdir}/nikon" +#------------------------------------------------------------------------------ # Olympus printf '%s\n' "Saving ${tmpdir}/olympus" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensType']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -olympus:all) | sort -fuV > "${tmpdir}/olympus" sed -r -i -e '/0 00 00\tNone/d' -e 's/^/ lenses["0/' -e 's/\t/"] = "/' -e 's/$/";/' -e 's| F([0-9]+)| f/\1|g' "${tmpdir}/olympus" +#------------------------------------------------------------------------------ # Pentax printf '%s\n' "Saving ${tmpdir}/pentax" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensType']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -pentax:all) | sort -fuV > "${tmpdir}/pentax" sed -r -i -e 's/^/ choices.insert (p_t (256 * /' -e 's/([0-9]+) ([0-9]+)([0-9.]*)/\1 + \2/' -e 's/\t/, "/' -e 's/$/"));/' -e 's| F([0-9]+)| f/\1|' "${tmpdir}/pentax" +#------------------------------------------------------------------------------ # Sony printf '%s\n' "Saving ${tmpdir}/sony" xmlstarlet sel -T -t -m "taginfo/table/tag[@name='LensType']/values/key" -v "concat(@id,' ',val)" -n < <("$et" -listx -sony:all) | sort -fuV > "${tmpdir}/sony" diff -Nru rawtherapee-5.3/tools/osx/executable_loader.in rawtherapee-5.4/tools/osx/executable_loader.in --- rawtherapee-5.3/tools/osx/executable_loader.in 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/osx/executable_loader.in 2018-03-20 11:04:15.000000000 +0000 @@ -48,4 +48,8 @@ #fi #ln -sf "${app}" /tmp +# Prevent crash when directory name contains special characters +AppleLocale=`defaults read -g AppleLocale` +export LANG=${AppleLocale%@*}.UTF-8 + exec "${cwd}/rawtherapee-bin" "$@" diff -Nru rawtherapee-5.3/tools/osx/macosx_bundle.sh rawtherapee-5.4/tools/osx/macosx_bundle.sh --- rawtherapee-5.3/tools/osx/macosx_bundle.sh 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/osx/macosx_bundle.sh 2018-03-20 11:04:15.000000000 +0000 @@ -156,7 +156,16 @@ # Copy the Lensfun database into the app bundle mkdir -p "${RESOURCES}/share/lensfun" -cp /opt/local/share/lensfun/version_1/* "${RESOURCES}/share/lensfun" +cp /opt/local/share/lensfun/version_2/* "${RESOURCES}/share/lensfun" + +# Copy liblensfun to Frameworks +cp /opt/local/lib/liblensfun.1.dylib "${RESOURCES}/../Frameworks" + +# Copy libiomp5 to Frameworks +cp /opt/local/lib/libomp/libiomp5.dylib "${RESOURCES}/../Frameworks" + +# Copy the libiomp5 license into the app bundle +cp "${PROJECT_SOURCE_DIR}/licenses/osx_libiomp5_LICENSE.txt" "${RESOURCES}" # Install names find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do diff -Nru rawtherapee-5.3/tools/RTProfileBuilderSample.cs rawtherapee-5.4/tools/RTProfileBuilderSample.cs --- rawtherapee-5.3/tools/RTProfileBuilderSample.cs 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/RTProfileBuilderSample.cs 2018-03-20 11:04:15.000000000 +0000 @@ -115,7 +115,7 @@ } // end if camera=xxx - // This is for camera independend settings + // This is for camera independent settings switch (sectionEntry) { // These are parsed from EXIFTOOL and XMP in DNG (see http://en.wikipedia.org/wiki/Extensible_Metadata_Platform) case "IPTC/City": @@ -262,7 +262,7 @@ /// Correction factors public DistortionCorrectProf(double[] focLen, double[] correct) { if (focLen == null || correct == null || focLen.Length != correct.Length || focLen.Length < 2) - throw new Exception("DistortionCorrectProf inputs must be valid and of the same lenghts, at least 2 points"); + throw new Exception("DistortionCorrectProf inputs must be valid and of the same lengths, at least 2 points"); adFocLen = focLen; adCorrect = correct; diff -Nru rawtherapee-5.3/tools/source_icons/README rawtherapee-5.4/tools/source_icons/README --- rawtherapee-5.3/tools/source_icons/README 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/README 2018-03-20 11:04:15.000000000 +0000 @@ -29,4 +29,4 @@ 2- Creates a .file for each .svg (change "w22" and "actions" as needed, explained above): for f in *.svg; do printf "%s\n" "${f%%.*}.png,w22,actions" > "${f%%.*}.file"; done 3- Makes the PNG icons (you need to run the script from it's containing dir): - cd ~/rawtherapee/tools/source_icons/script && ./make_all_icon_theme.bash /path/to/new/svg/icons/ /tmp/png + cd ~/programs/code-rawtherapee/tools/source_icons/script && ./make_all_icon_theme.bash /path/to/new/svg/icons/ /tmp/png diff -Nru rawtherapee-5.3/tools/source_icons/scalable/adj-black.svg rawtherapee-5.4/tools/source_icons/scalable/adj-black.svg --- rawtherapee-5.3/tools/source_icons/scalable/adj-black.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/adj-black.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,102 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/adj-white.svg rawtherapee-5.4/tools/source_icons/scalable/adj-white.svg --- rawtherapee-5.3/tools/source_icons/scalable/adj-white.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/adj-white.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,103 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/atom.file rawtherapee-5.4/tools/source_icons/scalable/atom.file --- rawtherapee-5.3/tools/source_icons/scalable/atom.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/atom.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +atom.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/atom.svg rawtherapee-5.4/tools/source_icons/scalable/atom.svg --- rawtherapee-5.3/tools/source_icons/scalable/atom.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/atom.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,121 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/equalizer-narrow.file rawtherapee-5.4/tools/source_icons/scalable/equalizer-narrow.file --- rawtherapee-5.3/tools/source_icons/scalable/equalizer-narrow.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/equalizer-narrow.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +equalizer-narrow.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/equalizer-narrow.svg rawtherapee-5.4/tools/source_icons/scalable/equalizer-narrow.svg --- rawtherapee-5.3/tools/source_icons/scalable/equalizer-narrow.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/equalizer-narrow.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,201 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/equalizer-wide.file rawtherapee-5.4/tools/source_icons/scalable/equalizer-wide.file --- rawtherapee-5.3/tools/source_icons/scalable/equalizer-wide.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/equalizer-wide.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +equalizer-wide.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/equalizer-wide.svg rawtherapee-5.4/tools/source_icons/scalable/equalizer-wide.svg --- rawtherapee-5.3/tools/source_icons/scalable/equalizer-wide.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/equalizer-wide.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,256 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-hist.file rawtherapee-5.4/tools/source_icons/scalable/gamut-hist.file --- rawtherapee-5.3/tools/source_icons/scalable/gamut-hist.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-hist.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +gamut-hist.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-hist.svg rawtherapee-5.4/tools/source_icons/scalable/gamut-hist.svg --- rawtherapee-5.3/tools/source_icons/scalable/gamut-hist.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-hist.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + Morgan Hardwood + + + RawTherapee www.rawtherapee.com + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-softproof.file rawtherapee-5.4/tools/source_icons/scalable/gamut-softproof.file --- rawtherapee-5.3/tools/source_icons/scalable/gamut-softproof.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-softproof.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +gamut-softproof.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-softproof.svg rawtherapee-5.4/tools/source_icons/scalable/gamut-softproof.svg --- rawtherapee-5.3/tools/source_icons/scalable/gamut-softproof.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-softproof.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,303 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg rawtherapee-5.4/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg --- rawtherapee-5.3/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,656 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + Morgan Hardwood + + + RawTherapee www.rawtherapee.com + + + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-warning.file rawtherapee-5.4/tools/source_icons/scalable/gamut-warning.file --- rawtherapee-5.3/tools/source_icons/scalable/gamut-warning.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-warning.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +gamut-warning.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/gamut-warning.svg rawtherapee-5.4/tools/source_icons/scalable/gamut-warning.svg --- rawtherapee-5.3/tools/source_icons/scalable/gamut-warning.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/gamut-warning.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,123 @@ + + + + + Icons for the "Expert" tab in RawTherapee + + + + + + + + image/svg+xml + + Icons for the "Expert" tab in RawTherapee + + + Morgan Hardwood + + + + + + + + + + + + + + + + + + ! + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/HDR-thumbnail.file rawtherapee-5.4/tools/source_icons/scalable/HDR-thumbnail.file --- rawtherapee-5.3/tools/source_icons/scalable/HDR-thumbnail.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/HDR-thumbnail.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +HDR-thumbnail.png,w29,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/HDR-thumbnail.svg rawtherapee-5.4/tools/source_icons/scalable/HDR-thumbnail.svg --- rawtherapee-5.3/tools/source_icons/scalable/HDR-thumbnail.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/HDR-thumbnail.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/PixelShift-thumbnail.file rawtherapee-5.4/tools/source_icons/scalable/PixelShift-thumbnail.file --- rawtherapee-5.3/tools/source_icons/scalable/PixelShift-thumbnail.file 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/PixelShift-thumbnail.file 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1 @@ +PixelShift-thumbnail.png,w18,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/PixelShift-thumbnail.svg rawtherapee-5.4/tools/source_icons/scalable/PixelShift-thumbnail.svg --- rawtherapee-5.3/tools/source_icons/scalable/PixelShift-thumbnail.svg 1970-01-01 00:00:00.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/PixelShift-thumbnail.svg 2018-03-20 11:04:15.000000000 +0000 @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff -Nru rawtherapee-5.3/tools/source_icons/scalable/softProof.file rawtherapee-5.4/tools/source_icons/scalable/softProof.file --- rawtherapee-5.3/tools/source_icons/scalable/softProof.file 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/softProof.file 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -softProof.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/softProof.svg rawtherapee-5.4/tools/source_icons/scalable/softProof.svg --- rawtherapee-5.3/tools/source_icons/scalable/softProof.svg 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/softProof.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,1389 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff -Nru rawtherapee-5.3/tools/source_icons/scalable/spGamutCheck.file rawtherapee-5.4/tools/source_icons/scalable/spGamutCheck.file --- rawtherapee-5.3/tools/source_icons/scalable/spGamutCheck.file 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/spGamutCheck.file 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -spGamutCheck.png,w22,actions diff -Nru rawtherapee-5.3/tools/source_icons/scalable/spGamutCheck.svg rawtherapee-5.4/tools/source_icons/scalable/spGamutCheck.svg --- rawtherapee-5.3/tools/source_icons/scalable/spGamutCheck.svg 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/source_icons/scalable/spGamutCheck.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,1344 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - ! - diff -Nru rawtherapee-5.3/tools/win/InnoSetup/WindowsInnoSetup.iss.in rawtherapee-5.4/tools/win/InnoSetup/WindowsInnoSetup.iss.in --- rawtherapee-5.3/tools/win/InnoSetup/WindowsInnoSetup.iss.in 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/win/InnoSetup/WindowsInnoSetup.iss.in 2018-03-20 11:04:15.000000000 +0000 @@ -89,6 +89,8 @@ ;Name: "desktopicon\common"; Description: "For all users"; GroupDescription: "Additional icons:"; Flags: exclusive ;Name: "desktopicon\user"; Description: "For the current user only"; GroupDescription: "Additional icons:"; Flags: exclusive unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 +Name: regBrowseFolder; Description: "Add ""Browse with RawTherapee"" option to context menu when right-clicking on a folder."; GroupDescription: File extensions: +Name: regOpenFile; Description: "Add ""Open with RawTherapee"" option to context menu when right-clicking on a file."; GroupDescription: File extensions: [Files] Source: "{#MyBuildBasePath}\rawtherapee*.exe"; DestDir: "{app}"; Flags: ignoreversion @@ -100,6 +102,7 @@ Source: "{#MyBuildBasePath}\languages\*"; DestDir: "{app}\languages\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\licenses\*"; DestDir: "{app}\licenses\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\lib\*"; DestDir: "{app}\lib\"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#MyBuildBasePath}\share\*"; DestDir: "{app}\share\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\profiles\*"; DestDir: "{app}\profiles\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\sounds\*"; DestDir: "{app}\sounds\"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "{#MyBuildBasePath}\themes\*"; DestDir: "{app}\themes\"; Flags: ignoreversion recursesubdirs createallsubdirs @@ -111,17 +114,22 @@ Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion -;Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: skipifsourcedoesntexist ignoreversion Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}" Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" -Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName} {#MyAppVersion}}"; Filename: "{uninstallexe}" Name: "{commondesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +[Registry] +Root: HKCU; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee"; ValueType: string; ValueData: "Browse with RawTherapee"; Flags: uninsdeletekey; Tasks: regBrowseFolder +Root: HKCU; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -w ""%1"""; Flags: uninsdeletekey; Tasks: regBrowseFolder +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee"; ValueType: string; ValueData: "Open with RawTherapee"; Flags: uninsdeletekey; Tasks: regOpenFile +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -R ""%1"""; Flags: uninsdeletekey; Tasks: regOpenFile diff -Nru rawtherapee-5.3/tools/win/readme.txt rawtherapee-5.4/tools/win/readme.txt --- rawtherapee-5.3/tools/win/readme.txt 2017-09-30 19:31:22.000000000 +0000 +++ rawtherapee-5.4/tools/win/readme.txt 2018-03-20 11:04:15.000000000 +0000 @@ -8,7 +8,7 @@ the preferred choice of setup mechanism is Wix widgets. However an InnoSetup script has been created before the definitive choice and has been added to the source tree, for convenience. -Once the Wix setup mechanism will be operational, the InnoSetup can be supressed from the source +Once the Wix setup mechanism will be operational, the InnoSetup can be suppressed from the source tree. All discussion about the present document and the setup scripts has to be done in issue 1904. \ No newline at end of file